ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vYWNwaS1ob3RrZXkudHh0IGIvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDQwZmEuLjAwMDAwMDAKLS0tIGEvRG9jdW1lbnRhdGlvbi9hY3BpLWhvdGtleS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi1kcml2ZXIvYWNwaS9ob3RrZXkuYyBpbXBsZW1lbnQ6Ci0xLiAvcHJvYy9hY3BpL2hvdGtleS9ldmVudF9jb25maWcgCi0oZXZlbnQgYmFzZWQgaG90a2V5IG9yIGV2ZW50IGNvbmZpZyBpbnRlcmZhY2UpOgotYS4gYWRkIGEgIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCkgOiAKLWVjaG8gIjA6YnVzOjphY3Rpb246bWV0aG9kOm51bTpudW0iID4gZXZlbnRfY29uZmlnCi0KLWIuIGRlbGV0ZSBhIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCk6IAotZWNobyAiMTo6Ojo6bnVtOm51bSIgPiBldmVudF9jb25maWcKLQotYy4gIG1vZGlmeSBhIGV2ZW50IGJhc2VkIGhvdGtleShldmVudCk6ICAgIAotZWNobyAiMjpidXM6OmFjdGlvbjptZXRob2Q6bnVtOm51bSIgPiBldmVudF9jb25maWcKLQotMi4gL3Byb2MvYWNwaS9ob3RrZXkvcG9sbF9jb25maWcgCi0ocG9sbGluZyBiYXNlZCBob3RrZXkgb3IgZXZlbnQgY29uZmlnIGludGVyZmFjZSk6Ci1hLmFkZCBhIHBvbGxpbmcgYmFzZWQgaG90a2V5KGV2ZW50KSA6IAkKLWVjaG8gIjA6YnVzOm1ldGhvZDphY3Rpb246bWV0aG9kOm51bSIgPiBwb2xsX2NvbmZpZwotdGhpcyBhZGRpbmcgY29tbWFuZCB3aWxsIGNyZWF0ZSBhIHByb2MgZmlsZSAKLS9wcm9jL2FjcGkvaG90a2V5L21ldGhvZCwgd2hpY2ggaXMgdXNlZCB0byBnZXQgCi1yZXN1bHQgb2YgcG9sbGluZy4KLQotYi5kZWxldGUgYSBwb2xsaW5nIGJhc2VkIGhvdGtleShldmVudCk6IAkKLWVjaG8gIjE6Ojo6Om51bSIgPiBldmVudF9jb25maWcKLQotYy5tb2RpZnkgYSBwb2xsaW5nIGJhc2VkIGhvdGtleShldmVudCk6ICAgIAotZWNobyAiMjpidXM6bWV0aG9kOmFjdGlvbjptZXRob2Q6bnVtIiA+IHBvbGxfY29uZmlnCi0KLTMuL3Byb2MvYWNwaS9ob3RrZXkvYWN0aW9uIAotKGludGVyZmFjZSB0byBjYWxsIGFtbCBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIGEgCi1zcGVjaWZpYyBob3RrZXkoZXZlbnQpKQotZWNobyAiZXZlbnRfbnVtOmV2ZW50X3R5cGU6ZXZlbnRfYXJndW1lbnQiID4gCi0JL3Byb2MvYWNwaS9ob3RrZXkvYWN0aW9uLgotVGhlIHJlc3VsdCBvZiB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgYW1sIG1ldGhvZCBpcyAKLWF0dGFjaGVkIHRvIC9wcm9jL2FjcGkvaG90a2V5L3BvbGxfbWV0aG9kLCB3aGljaCBpcyBkeW5hbWljYWxseQotY3JlYXRlZC4gIFBsZWFzZSB1c2UgY29tbWFuZCAiY2F0IC9wcm9jL2FjcGkvaG90a2V5L3BvbGxpbmdfbWV0aG9kIiAKLXRvIHJldHJpZXZlIGl0LgotCi1Ob3RlOiBVc2UgY21kbGluZSAiYWNwaV9nZW5lcmljX2hvdGtleSIgdG8gb3Zlci1yaWRlCi1wbGF0Zm9ybS1zcGVjaWZpYyB3aXRoIGdlbmVyaWMgZHJpdmVyLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0IGIvRG9jdW1lbnRhdGlvbi9mZWF0dXJlLXJlbW92YWwtc2NoZWR1bGUudHh0CmluZGV4IGM1ODVhYTguLjI4Zjg5N2YgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vZmVhdHVyZS1yZW1vdmFsLXNjaGVkdWxlLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKQEAgLTI1MywyOSArMjUzLDYgQEAKIAogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLTw8PDw8PDwgdGVzdDpEb2N1bWVudGF0aW9uL2ZlYXR1cmUtcmVtb3ZhbC1zY2hlZHVsZS50eHQKLVdoYXQ6CUFDUEkgaG90a2V5IGRyaXZlciAoQ09ORklHX0FDUElfSE9US0VZKQotV2hlbjoJMi42LjIxCi1XaHk6CWhvdGtleS5jIHdhcyBhbiBhdHRlbXB0IHRvIGNvbnNvbGlkYXRlIG11bHRpcGxlIGRyaXZlcnMgdGhhdCB1c2UKLQlBQ1BJIHRvIGltcGxlbWVudCBob3RrZXlzLiAgSG93ZXZlciwgaG90a2V5cyBhcmUgbm90IGRvY3VtZW50ZWQKLQlpbiB0aGUgQUNQSSBzcGVjaWZpY2F0aW9uLCBzbyB0aGUgZHJpdmVycyB1c2VkIHVuZG9jdW1lbnRlZAotCXZlbmRvci1zcGVjaWZpYyBob29rcyBhbmQgdHVybmVkIG91dCB0byBiZSBtb3JlIGRpZmZlcmVudCB0aGFuCi0JdGhlIHNhbWUuCi0KLQlGdXJ0aGVyLCB0aGUga2V5cyBhbmQgdGhlIGZlYXR1cmVzIHN1cHBsaWVkIGJ5IGVhY2ggcGxhdGZvcm0KLQlhcmUgZGlmZmVyZW50LCBzbyB0aGVyZSB3aWxsIGFsd2F5cyBiZSBhIG5lZWQgZm9yCi0JcGxhdGZvcm0tc3BlY2lmaWMgZHJpdmVycy4KLQotCVNvIHRoZSBuZXcgcGxhbiBpcyB0byBkZWxldGUgaG90a2V5LmMgYW5kIGluc3RlYWQsIHdvcmsgb24gdGhlCi0JcGxhdGZvcm0gc3BlY2lmaWMgZHJpdmVycyB0byB0cnkgdG8gbWFrZSB0aGVtIGxvb2sgdGhlIHNhbWUKLQl0byB0aGUgdXNlciB3aGVuIHRoZXkgc3VwcGx5IHRoZSBzYW1lIGZlYXR1cmVzLgotCi0JaG90a2V5LmMgaGFzIGFsd2F5cyBkZXBlbmRlZCBvbiBDT05GSUdfRVhQRVJJTUVOVEFMCi0KLVdobzoJTGVuIEJyb3duIDxsZW4uYnJvd25AaW50ZWwuY29tPgotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQogV2hhdDoJL3N5cy9maXJtd2FyZS9hY3BpL25hbWVzcGFjZQogV2hlbjoJMi42LjIxCiBXaHk6CVRoZSBBQ1BJIG5hbWVzcGFjZSBpcyBlZmZlY3RpdmVseSB0aGUgc3ltYm9sIGxpc3QgZm9yCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL2dwaW8udHh0IGIvRG9jdW1lbnRhdGlvbi9ncGlvLnR4dAppbmRleCAwOWRkNTEwLi41NzZjZTQ2IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2dwaW8udHh0CisrKyBiL0RvY3VtZW50YXRpb24vZ3Bpby50eHQKQEAgLTc4LDcgKzc4LDggQEAKIC0tLS0tLS0tLS0tLS0tLS0tCiBHUElPcyBhcmUgaWRlbnRpZmllZCBieSB1bnNpZ25lZCBpbnRlZ2VycyBpbiB0aGUgcmFuZ2UgMC4uTUFYX0lOVC4gIFRoYXQKIHJlc2VydmVzICJuZWdhdGl2ZSIgbnVtYmVycyBmb3Igb3RoZXIgcHVycG9zZXMgbGlrZSBtYXJraW5nIHNpZ25hbHMgYXMKLSJub3QgYXZhaWxhYmxlIG9uIHRoaXMgYm9hcmQiLCBvciBpbmRpY2F0aW5nIGZhdWx0cy4KKyJub3QgYXZhaWxhYmxlIG9uIHRoaXMgYm9hcmQiLCBvciBpbmRpY2F0aW5nIGZhdWx0cy4gIENvZGUgdGhhdCBkb2Vzbid0Cit0b3VjaCB0aGUgdW5kZXJseWluZyBoYXJkd2FyZSB0cmVhdHMgdGhlc2UgaW50ZWdlcnMgYXMgb3BhcXVlIGNvb2tpZXMuCiAKIFBsYXRmb3JtcyBkZWZpbmUgaG93IHRoZXkgdXNlIHRob3NlIGludGVnZXJzLCBhbmQgdXN1YWxseSAjZGVmaW5lIHN5bWJvbHMKIGZvciB0aGUgR1BJTyBsaW5lcyBzbyB0aGF0IGJvYXJkLXNwZWNpZmljIHNldHVwIGNvZGUgZGlyZWN0bHkgY29ycmVzcG9uZHMKQEAgLTEzOSwxMCArMTQwLDEwIEBACiBUaGUgZ2V0L3NldCBjYWxscyBoYXZlIG5vIGVycm9yIHJldHVybnMgYmVjYXVzZSAiaW52YWxpZCBHUElPIiBzaG91bGQgaGF2ZQogYmVlbiByZXBvcnRlZCBlYXJsaWVyIGluIGdwaW9fc2V0X2RpcmVjdGlvbigpLiAgSG93ZXZlciwgbm90ZSB0aGF0IG5vdCBhbGwKIHBsYXRmb3JtcyBjYW4gcmVhZCB0aGUgdmFsdWUgb2Ygb3V0cHV0IHBpbnM7IHRob3NlIHRoYXQgY2FuJ3Qgc2hvdWxkIGFsd2F5cwotcmV0dXJuIHplcm8uICBBbHNvLCB0aGVzZSBjYWxscyB3aWxsIGJlIGlnbm9yZWQgZm9yIEdQSU9zIHRoYXQgY2FuJ3Qgc2FmZWx5Ci1iZSBhY2Nlc3NlZCB3aWh0b3V0IHNsZWVwaW5nIChzZWUgYmVsb3cpLgorcmV0dXJuIHplcm8uICBBbHNvLCB1c2luZyB0aGVzZSBjYWxscyBmb3IgR1BJT3MgdGhhdCBjYW4ndCBzYWZlbHkgYmUgYWNjZXNzZWQKK3dpdGhvdXQgc2xlZXBpbmcgKHNlZSBiZWxvdykgaXMgYW4gZXJyb3IuCiAKLVBsYXRmb3JtLXNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBhcmUgZW5jb3VyYWdlZCB0byBvcHRpbWlzZSB0aGUgdHdvCitQbGF0Zm9ybS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgYXJlIGVuY291cmFnZWQgdG8gb3B0aW1pemUgdGhlIHR3bwogY2FsbHMgdG8gYWNjZXNzIHRoZSBHUElPIHZhbHVlIGluIGNhc2VzIHdoZXJlIHRoZSBHUElPIG51bWJlciAoYW5kIGZvcgogb3V0cHV0LCB2YWx1ZSkgYXJlIGNvbnN0YW50LiAgSXQncyBub3JtYWwgZm9yIHRoZW0gdG8gbmVlZCBvbmx5IGEgY291cGxlCiBvZiBpbnN0cnVjdGlvbnMgaW4gc3VjaCBjYXNlcyAocmVhZGluZyBvciB3cml0aW5nIGEgaGFyZHdhcmUgcmVnaXN0ZXIpLApAQCAtMjM5LDcgKzI0MCw4IEBACiBzeXN0ZW0gd2FrZXVwIGNhcGFiaWxpdGllcy4KIAogTm9uLWVycm9yIHZhbHVlcyByZXR1cm5lZCBmcm9tIGlycV90b19ncGlvKCkgd291bGQgbW9zdCBjb21tb25seSBiZSB1c2VkCi13aXRoIGdwaW9fZ2V0X3ZhbHVlKCkuCit3aXRoIGdwaW9fZ2V0X3ZhbHVlKCksIGZvciBleGFtcGxlIHRvIGluaXRpYWxpemUgb3IgdXBkYXRlIGRyaXZlciBzdGF0ZQord2hlbiB0aGUgSVJRIGlzIGVkZ2UtdHJpZ2dlcmVkLgogCiAKIApAQCAtMjYwLDkgKzI2MiwxMCBAQAogVGhlcmUgYXJlIG90aGVyIHN5c3RlbS1zcGVjaWZpYyBtZWNoYW5pc21zIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQgaGVyZSwKIGxpa2UgdGhlIGFmb3JlbWVudGlvbmVkIG9wdGlvbnMgZm9yIGlucHV0IGRlLWdsaXRjaGluZyBhbmQgd2lyZS1PUiBvdXRwdXQuCiBIYXJkd2FyZSBtYXkgc3VwcG9ydCByZWFkaW5nIG9yIHdyaXRpbmcgR1BJT3MgaW4gZ2FuZ3MsIGJ1dCB0aGF0J3MgdXN1YWxseQotY29uZmlndXJhdGlvbiBkZXBlbmRlZG50OiAgZm9yIEdQSU9zIHNoYXJpbmcgdGhlIHNhbWUgYmFuay4gIChHUElPcyBhcmUKK2NvbmZpZ3VyYXRpb24gZGVwZW5kZW50OiAgZm9yIEdQSU9zIHNoYXJpbmcgdGhlIHNhbWUgYmFuay4gIChHUElPcyBhcmUKIGNvbW1vbmx5IGdyb3VwZWQgaW4gYmFua3Mgb2YgMTYgb3IgMzIsIHdpdGggYSBnaXZlbiBTT0MgaGF2aW5nIHNldmVyYWwgc3VjaAotYmFua3MuKSAgQ29kZSByZWx5aW5nIG9uIHN1Y2ggbWVjaGFuaXNtcyB3aWxsIG5lY2Vzc2FyaWx5IGJlIG5vbnBvcnRhYmxlLgorYmFua3MuKSAgU29tZSBzeXN0ZW1zIGNhbiB0cmlnZ2VyIElSUXMgZnJvbSBvdXRwdXQgR1BJT3MuICBDb2RlIHJlbHlpbmcgb24KK3N1Y2ggbWVjaGFuaXNtcyB3aWxsIG5lY2Vzc2FyaWx5IGJlIG5vbnBvcnRhYmxlLgogCiBEeW5hbWljIGRlZmluaXRpb24gb2YgR1BJT3MgaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQ7IGZvciBleGFtcGxlLCBhcwogYSBzaWRlIGVmZmVjdCBvZiBjb25maWd1cmluZyBhbiBhZGQtb24gYm9hcmQgd2l0aCBzb21lIEdQSU8gZXhwYW5kZXJzLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9ocnRpbWVyL3RpbWVyX3N0YXRzLnR4dCBiL0RvY3VtZW50YXRpb24vaHJ0aW1lci90aW1lcl9zdGF0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjdmNzgyZQotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vaHJ0aW1lci90aW1lcl9zdGF0cy50eHQKQEAgLTAsMCArMSw2OCBAQAordGltZXJfc3RhdHMgLSB0aW1lciB1c2FnZSBzdGF0aXN0aWNzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordGltZXJfc3RhdHMgaXMgYSBkZWJ1Z2dpbmcgZmFjaWxpdHkgdG8gbWFrZSB0aGUgdGltZXIgKGFiKXVzYWdlIGluIGEgTGludXgKK3N5c3RlbSB2aXNpYmxlIHRvIGtlcm5lbCBhbmQgdXNlcnNwYWNlIGRldmVsb3BlcnMuIEl0IGlzIG5vdCBpbnRlbmRlZCBmb3IKK3Byb2R1Y3Rpb24gdXNhZ2UgYXMgaXQgYWRkcyBzaWduaWZpY2FudCBvdmVyaGVhZCB0byB0aGUgKGhyKXRpbWVyIGNvZGUgYW5kIHRoZQorKGhyKXRpbWVyIGRhdGEgc3RydWN0dXJlcy4KKwordGltZXJfc3RhdHMgc2hvdWxkIGJlIHVzZWQgYnkga2VybmVsIGFuZCB1c2Vyc3BhY2UgZGV2ZWxvcGVycyB0byB2ZXJpZnkgdGhhdAordGhlaXIgY29kZSBkb2VzIG5vdCBtYWtlIHVuZHVseSB1c2Ugb2YgdGltZXJzLiBUaGlzIGhlbHBzIHRvIGF2b2lkIHVubmVjZXNzYXJ5Cit3YWtldXBzLCB3aGljaCBzaG91bGQgYmUgYXZvaWRlZCB0byBvcHRpbWl6ZSBwb3dlciBjb25zdW1wdGlvbi4KKworSXQgY2FuIGJlIGVuYWJsZWQgYnkgQ09ORklHX1RJTUVSX1NUQVRTIGluIHRoZSAiS2VybmVsIGhhY2tpbmciIGNvbmZpZ3VyYXRpb24KK3NlY3Rpb24uCisKK3RpbWVyX3N0YXRzIGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0aW1lciBldmVudHMgd2hpY2ggYXJlIGZpcmVkIGluIGEKK0xpbnV4IHN5c3RlbSBvdmVyIGEgc2FtcGxlIHBlcmlvZDoKKworLSB0aGUgcGlkIG9mIHRoZSB0YXNrKHByb2Nlc3MpIHdoaWNoIGluaXRpYWxpemVkIHRoZSB0aW1lcgorLSB0aGUgbmFtZSBvZiB0aGUgcHJvY2VzcyB3aGljaCBpbml0aWFsaXplZCB0aGUgdGltZXIKKy0gdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSB0aW1lciB3YXMgaW50aWFsaXplZAorLSB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggaXMgYXNzb2NpYXRlZCB0byB0aGUgdGltZXIKKy0gdGhlIG51bWJlciBvZiBldmVudHMgKGNhbGxiYWNrcykKKwordGltZXJfc3RhdHMgYWRkcyBhbiBlbnRyeSB0byAvcHJvYzogL3Byb2MvdGltZXJfc3RhdHMKKworVGhpcyBlbnRyeSBpcyB1c2VkIHRvIGNvbnRyb2wgdGhlIHN0YXRpc3RpY3MgZnVuY3Rpb25hbGl0eSBhbmQgdG8gcmVhZCBvdXQgdGhlCitzYW1wbGVkIGluZm9ybWF0aW9uLgorCitUaGUgdGltZXJfc3RhdHMgZnVuY3Rpb25hbGl0eSBpcyBpbmFjdGl2ZSBvbiBib290dXAuCisKK1RvIGFjdGl2YXRlIGEgc2FtcGxlIHBlcmlvZCBpc3N1ZToKKyMgZWNobyAxID4vcHJvYy90aW1lcl9zdGF0cworCitUbyBzdG9wIGEgc2FtcGxlIHBlcmlvZCBpc3N1ZToKKyMgZWNobyAwID4vcHJvYy90aW1lcl9zdGF0cworCitUaGUgc3RhdGlzdGljcyBjYW4gYmUgcmV0cmlldmVkIGJ5OgorIyBjYXQgL3Byb2MvdGltZXJfc3RhdHMKKworVGhlIHJlYWRvdXQgb2YgL3Byb2MvdGltZXJfc3RhdHMgYXV0b21hdGljYWxseSBkaXNhYmxlcyBzYW1wbGluZy4gVGhlIHNhbXBsZWQKK2luZm9ybWF0aW9uIGlzIGtlcHQgdW50aWwgYSBuZXcgc2FtcGxlIHBlcmlvZCBpcyBzdGFydGVkLiBUaGlzIGFsbG93cyBtdWx0aXBsZQorcmVhZG91dHMuCisKK1NhbXBsZSBvdXRwdXQgb2YgL3Byb2MvdGltZXJfc3RhdHM6CisKK1RpbWVyc3RhdHMgc2FtcGxlIHBlcmlvZDogMy44ODg3NzAgcworICAxMiwgICAgIDAgc3dhcHBlciAgICAgICAgICBocnRpbWVyX3N0b3Bfc2NoZWRfdGljayAoaHJ0aW1lcl9zY2hlZF90aWNrKQorICAxNSwgICAgIDEgc3dhcHBlciAgICAgICAgICBoY2Rfc3VibWl0X3VyYiAocmhfdGltZXJfZnVuYykKKyAgIDQsICAgOTU5IGtlZGFjICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCAocHJvY2Vzc190aW1lb3V0KQorICAgMSwgICAgIDAgc3dhcHBlciAgICAgICAgICBwYWdlX3dyaXRlYmFja19pbml0ICh3Yl90aW1lcl9mbikKKyAgMjgsICAgICAwIHN3YXBwZXIgICAgICAgICAgaHJ0aW1lcl9zdG9wX3NjaGVkX3RpY2sgKGhydGltZXJfc2NoZWRfdGljaykKKyAgMjIsICAyOTQ4IElSUSA0ICAgICAgICAgICAgdHR5X2ZsaXBfYnVmZmVyX3B1c2ggKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKyAgIDMsICAzMTAwIGJhc2ggICAgICAgICAgICAgc2NoZWR1bGVfdGltZW91dCAocHJvY2Vzc190aW1lb3V0KQorICAgMSwgICAgIDEgc3dhcHBlciAgICAgICAgICBxdWV1ZV9kZWxheWVkX3dvcmtfb24gKGRlbGF5ZWRfd29ya190aW1lcl9mbikKKyAgIDEsICAgICAxIHN3YXBwZXIgICAgICAgICAgcXVldWVfZGVsYXllZF93b3JrX29uIChkZWxheWVkX3dvcmtfdGltZXJfZm4pCisgICAxLCAgICAgMSBzd2FwcGVyICAgICAgICAgIG5laWdoX3RhYmxlX2luaXRfbm9fbmV0bGluayAobmVpZ2hfcGVyaW9kaWNfdGltZXIpCisgICAxLCAgMjI5MiBpcCAgICAgICAgICAgICAgIF9fbmV0ZGV2X3dhdGNoZG9nX3VwIChkZXZfd2F0Y2hkb2cpCisgICAxLCAgICAyMyBldmVudHMvMSAgICAgICAgIGRvX2NhY2hlX2NsZWFuIChkZWxheWVkX3dvcmtfdGltZXJfZm4pCis5MCB0b3RhbCBldmVudHMsIDMwLjAgZXZlbnRzL3NlYworCitUaGUgZmlyc3QgY29sdW1uIGlzIHRoZSBudW1iZXIgb2YgZXZlbnRzLCB0aGUgc2Vjb25kIGNvbHVtbiB0aGUgcGlkLCB0aGUgdGhpcmQKK2NvbHVtbiBpcyB0aGUgbmFtZSBvZiB0aGUgcHJvY2Vzcy4gVGhlIGZvcnRoIGNvbHVtbiBzaG93cyB0aGUgZnVuY3Rpb24gd2hpY2gKK2luaXRpYWxpemVkIHRoZSB0aW1lciBhbmQgaW4gcGFyYW50aGVzZXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdoaWNoIHdhcworZXhlY3V0ZWQgb24gZXhwaXJ5LgorCisgICAgVGhvbWFzLCBJbmdvCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHJ0aW1lcnMvaGlnaHJlcy50eHQgYi9Eb2N1bWVudGF0aW9uL2hydGltZXJzL2hpZ2hyZXMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMGU5YTkKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2hydGltZXJzL2hpZ2hyZXMudHh0CkBAIC0wLDAgKzEsMjQ5IEBACitIaWdoIHJlc29sdXRpb24gdGltZXJzIGFuZCBkeW5hbWljIHRpY2tzIGRlc2lnbiBub3RlcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIHBhcGVyIG9mIHRoZSBPTFMgMjAwNiB0YWxrICJocnRpbWVycworYW5kIGJleW9uZCIuIFRoZSBwYXBlciBpcyBwYXJ0IG9mIHRoZSBPTFMgMjAwNiBQcm9jZWVkaW5ncyBWb2x1bWUgMSwgd2hpY2ggY2FuCitiZSBmb3VuZCBvbiB0aGUgT0xTIHdlYnNpdGU6CitodHRwOi8vd3d3LmxpbnV4c3ltcG9zaXVtLm9yZy8yMDA2L2xpbnV4c3ltcG9zaXVtX3Byb2N2MS5wZGYKKworVGhlIHNsaWRlcyB0byB0aGlzIHRhbGsgYXJlIGF2YWlsYWJsZSBmcm9tOgoraHR0cDovL3RnbHguZGUvcHJvamVjdHMvaHJ0aW1lcnMvb2xzMjAwNi1ocnRpbWVycy5wZGYKKworVGhlIHNsaWRlcyBjb250YWluIGZpdmUgZmlndXJlcyAocGFnZXMgMiwgMTUsIDE4LCAyMCwgMjIpLCB3aGljaCBpbGx1c3RyYXRlIHRoZQorY2hhbmdlcyBpbiB0aGUgdGltZShyKSByZWxhdGVkIExpbnV4IHN1YnN5c3RlbXMuIEZpZ3VyZSAjMSAocC4gMikgc2hvd3MgdGhlCitkZXNpZ24gb2YgdGhlIExpbnV4IHRpbWUocikgc3lzdGVtIGJlZm9yZSBocnRpbWVycyBhbmQgb3RoZXIgYnVpbGRpbmcgYmxvY2tzCitnb3QgbWVyZ2VkIGludG8gbWFpbmxpbmUuCisKK05vdGU6IHRoZSBwYXBlciBhbmQgdGhlIHNsaWRlcyBhcmUgdGFsa2luZyBhYm91dCAiY2xvY2sgZXZlbnQgc291cmNlIiwgd2hpbGUgd2UKK3N3aXRjaGVkIHRvIHRoZSBuYW1lICJjbG9jayBldmVudCBkZXZpY2VzIiBpbiBtZWFudGltZS4KKworVGhlIGRlc2lnbiBjb250YWlucyB0aGUgZm9sbG93aW5nIGJhc2ljIGJ1aWxkaW5nIGJsb2NrczoKKworLSBocnRpbWVyIGJhc2UgaW5mcmFzdHJ1Y3R1cmUKKy0gdGltZW9mZGF5IGFuZCBjbG9jayBzb3VyY2UgbWFuYWdlbWVudAorLSBjbG9jayBldmVudCBtYW5hZ2VtZW50CistIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBmdW5jdGlvbmFsaXR5CistIGR5bmFtaWMgdGlja3MKKworCitocnRpbWVyIGJhc2UgaW5mcmFzdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgaHJ0aW1lciBiYXNlIGluZnJhc3RydWN0dXJlIHdhcyBtZXJnZWQgaW50byB0aGUgMi42LjE2IGtlcm5lbC4gRGV0YWlscyBvZgordGhlIGJhc2UgaW1wbGVtZW50YXRpb24gYXJlIGNvdmVyZWQgaW4gRG9jdW1lbnRhdGlvbi9ocnRpbWVycy9ocnRpbWVyLnR4dC4gU2VlCithbHNvIGZpZ3VyZSAjMiAoT0xTIHNsaWRlcyBwLiAxNSkKKworVGhlIG1haW4gZGlmZmVyZW5jZXMgdG8gdGhlIHRpbWVyIHdoZWVsLCB3aGljaCBob2xkcyB0aGUgYXJtZWQgdGltZXJfbGlzdCB0eXBlCit0aW1lcnMgYXJlOgorICAgICAgIC0gdGltZSBvcmRlcmVkIGVucXVldWVpbmcgaW50byBhIHJiLXRyZWUKKyAgICAgICAtIGluZGVwZW5kZW50IG9mIHRpY2tzICh0aGUgcHJvY2Vzc2luZyBpcyBiYXNlZCBvbiBuYW5vc2Vjb25kcykKKworCit0aW1lb2ZkYXkgYW5kIGNsb2NrIHNvdXJjZSBtYW5hZ2VtZW50CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0pvaG4gU3R1bHR6J3MgR2VuZXJpYyBUaW1lIE9mIERheSAoR1RPRCkgZnJhbWV3b3JrIG1vdmVzIGEgbGFyZ2UgcG9ydGlvbiBvZgorY29kZSBvdXQgb2YgdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBhcmVhcyBpbnRvIGEgZ2VuZXJpYyBtYW5hZ2VtZW50CitmcmFtZXdvcmssIGFzIGlsbHVzdHJhdGVkIGluIGZpZ3VyZSAjMyAoT0xTIHNsaWRlcyBwLiAxOCkuIFRoZSBhcmNoaXRlY3R1cmUKK3NwZWNpZmljIHBvcnRpb24gaXMgcmVkdWNlZCB0byB0aGUgbG93IGxldmVsIGhhcmR3YXJlIGRldGFpbHMgb2YgdGhlIGNsb2NrCitzb3VyY2VzLCB3aGljaCBhcmUgcmVnaXN0ZXJlZCBpbiB0aGUgZnJhbWV3b3JrIGFuZCBzZWxlY3RlZCBvbiBhIHF1YWxpdHkgYmFzZWQKK2RlY2lzaW9uLiBUaGUgbG93IGxldmVsIGNvZGUgcHJvdmlkZXMgaGFyZHdhcmUgc2V0dXAgYW5kIHJlYWRvdXQgcm91dGluZXMgYW5kCitpbml0aWFsaXplcyBkYXRhIHN0cnVjdHVyZXMsIHdoaWNoIGFyZSB1c2VkIGJ5IHRoZSBnZW5lcmljIHRpbWUga2VlcGluZyBjb2RlIHRvCitjb252ZXJ0IHRoZSBjbG9jayB0aWNrcyB0byBuYW5vc2Vjb25kIGJhc2VkIHRpbWUgdmFsdWVzLiBBbGwgb3RoZXIgdGltZSBrZWVwaW5nCityZWxhdGVkIGZ1bmN0aW9uYWxpdHkgaXMgbW92ZWQgaW50byB0aGUgZ2VuZXJpYyBjb2RlLiBUaGUgR1RPRCBiYXNlIHBhdGNoIGdvdAorbWVyZ2VkIGludG8gdGhlIDIuNi4xOCBrZXJuZWwuCisKK0Z1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEdlbmVyaWMgVGltZSBPZiBEYXkgZnJhbWV3b3JrIGlzIGF2YWlsYWJsZSBpbiB0aGUKK09MUyAyMDA1IFByb2NlZWRpbmdzIFZvbHVtZSAxOgoraHR0cDovL3d3dy5saW51eHN5bXBvc2l1bS5vcmcvMjAwNS9saW51eHN5bXBvc2l1bV9wcm9jdjEucGRmCisKK1RoZSBwYXBlciAiV2UgQXJlIE5vdCBHZXR0aW5nIEFueSBZb3VuZ2VyOiBBIE5ldyBBcHByb2FjaCB0byBUaW1lIGFuZAorVGltZXJzIiB3YXMgd3JpdHRlbiBieSBKLiBTdHVsdHosIEQuVi4gSGFydCwgJiBOLiBBcmF2YW11ZGFuLgorCitGaWd1cmUgIzMgKE9MUyBzbGlkZXMgcC4xOCkgaWxsdXN0cmF0ZXMgdGhlIHRyYW5zZm9ybWF0aW9uLgorCisKK2Nsb2NrIGV2ZW50IG1hbmFnZW1lbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworV2hpbGUgY2xvY2sgc291cmNlcyBwcm92aWRlIHJlYWQgYWNjZXNzIHRvIHRoZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdGltZQordmFsdWUsIGNsb2NrIGV2ZW50IGRldmljZXMgYXJlIHVzZWQgdG8gc2NoZWR1bGUgdGhlIG5leHQgZXZlbnQKK2ludGVycnVwdChzKS4gVGhlIG5leHQgZXZlbnQgaXMgY3VycmVudGx5IGRlZmluZWQgdG8gYmUgcGVyaW9kaWMsIHdpdGggaXRzCitwZXJpb2QgZGVmaW5lZCBhdCBjb21waWxlIHRpbWUuIFRoZSBzZXR1cCBhbmQgc2VsZWN0aW9uIG9mIHRoZSBldmVudCBkZXZpY2UKK2ZvciB2YXJpb3VzIGV2ZW50IGRyaXZlbiBmdW5jdGlvbmFsaXRpZXMgaXMgaGFyZHdpcmVkIGludG8gdGhlIGFyY2hpdGVjdHVyZQorZGVwZW5kZW50IGNvZGUuIFRoaXMgcmVzdWx0cyBpbiBkdXBsaWNhdGVkIGNvZGUgYWNyb3NzIGFsbCBhcmNoaXRlY3R1cmVzIGFuZAorbWFrZXMgaXQgZXh0cmVtZWx5IGRpZmZpY3VsdCB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHN5c3RlbSB0byB1c2UKK2V2ZW50IGludGVycnVwdCBkZXZpY2VzIG90aGVyIHRoYW4gdGhvc2UgYWxyZWFkeSBidWlsdCBpbnRvIHRoZQorYXJjaGl0ZWN0dXJlLiBBbm90aGVyIGltcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50IGRlc2lnbiBpcyB0aGF0IGl0IGlzIG5lY2Vzc2FyeQordG8gdG91Y2ggYWxsIHRoZSBhcmNoaXRlY3R1cmUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIGluIG9yZGVyIHRvIHByb3ZpZGUgbmV3CitmdW5jdGlvbmFsaXR5IGxpa2UgaGlnaCByZXNvbHV0aW9uIHRpbWVycyBvciBkeW5hbWljIHRpY2tzLgorCitUaGUgY2xvY2sgZXZlbnRzIHN1YnN5c3RlbSB0cmllcyB0byBhZGRyZXNzIHRoaXMgcHJvYmxlbSBieSBwcm92aWRpbmcgYSBnZW5lcmljCitzb2x1dGlvbiB0byBtYW5hZ2UgY2xvY2sgZXZlbnQgZGV2aWNlcyBhbmQgdGhlaXIgdXNhZ2UgZm9yIHRoZSB2YXJpb3VzIGNsb2NrCitldmVudCBkcml2ZW4ga2VybmVsIGZ1bmN0aW9uYWxpdGllcy4gVGhlIGdvYWwgb2YgdGhlIGNsb2NrIGV2ZW50IHN1YnN5c3RlbSBpcwordG8gbWluaW1pemUgdGhlIGNsb2NrIGV2ZW50IHJlbGF0ZWQgYXJjaGl0ZWN0dXJlIGRlcGVuZGVudCBjb2RlIHRvIHRoZSBwdXJlCitoYXJkd2FyZSByZWxhdGVkIGhhbmRsaW5nIGFuZCB0byBhbGxvdyBlYXN5IGFkZGl0aW9uIGFuZCB1dGlsaXphdGlvbiBvZiBuZXcKK2Nsb2NrIGV2ZW50IGRldmljZXMuIEl0IGFsc28gbWluaW1pemVzIHRoZSBkdXBsaWNhdGVkIGNvZGUgYWNyb3NzIHRoZQorYXJjaGl0ZWN0dXJlcyBhcyBpdCBwcm92aWRlcyBnZW5lcmljIGZ1bmN0aW9uYWxpdHkgZG93biB0byB0aGUgaW50ZXJydXB0CitzZXJ2aWNlIGhhbmRsZXIsIHdoaWNoIGlzIGFsbW9zdCBpbmhlcmVudGx5IGhhcmR3YXJlIGRlcGVuZGVudC4KKworQ2xvY2sgZXZlbnQgZGV2aWNlcyBhcmUgcmVnaXN0ZXJlZCBlaXRoZXIgYnkgdGhlIGFyY2hpdGVjdHVyZSBkZXBlbmRlbnQgYm9vdAorY29kZSBvciBhdCBtb2R1bGUgaW5zZXJ0aW9uIHRpbWUuIEVhY2ggY2xvY2sgZXZlbnQgZGV2aWNlIGZpbGxzIGEgZGF0YQorc3RydWN0dXJlIHdpdGggY2xvY2stc3BlY2lmaWMgcHJvcGVydHkgcGFyYW1ldGVycyBhbmQgY2FsbGJhY2sgZnVuY3Rpb25zLiBUaGUKK2Nsb2NrIGV2ZW50IG1hbmFnZW1lbnQgZGVjaWRlcywgYnkgdXNpbmcgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBwYXJhbWV0ZXJzLCB0aGUKK3NldCBvZiBzeXN0ZW0gZnVuY3Rpb25zIGEgY2xvY2sgZXZlbnQgZGV2aWNlIHdpbGwgYmUgdXNlZCB0byBzdXBwb3J0LiBUaGlzCitpbmNsdWRlcyB0aGUgZGlzdGluY3Rpb24gb2YgcGVyLUNQVSBhbmQgcGVyLXN5c3RlbSBnbG9iYWwgZXZlbnQgZGV2aWNlcy4KKworU3lzdGVtLWxldmVsIGdsb2JhbCBldmVudCBkZXZpY2VzIGFyZSB1c2VkIGZvciB0aGUgTGludXggcGVyaW9kaWMgdGljay4gUGVyLUNQVQorZXZlbnQgZGV2aWNlcyBhcmUgdXNlZCB0byBwcm92aWRlIGxvY2FsIENQVSBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgcHJvY2VzcworYWNjb3VudGluZywgcHJvZmlsaW5nLCBhbmQgaGlnaCByZXNvbHV0aW9uIHRpbWVycy4KKworVGhlIG1hbmFnZW1lbnQgbGF5ZXIgYXNzaWduZXMgb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxpd2luZyBmdW5jdGlvbnMgdG8gYSBjbG9jaworZXZlbnQgZGV2aWNlOgorICAgICAgLSBzeXN0ZW0gZ2xvYmFsIHBlcmlvZGljIHRpY2sgKGppZmZpZXMgdXBkYXRlKQorICAgICAgLSBjcHUgbG9jYWwgdXBkYXRlX3Byb2Nlc3NfdGltZXMKKyAgICAgIC0gY3B1IGxvY2FsIHByb2ZpbGluZworICAgICAgLSBjcHUgbG9jYWwgbmV4dCBldmVudCBpbnRlcnJ1cHQgKG5vbiBwZXJpb2RpYyBtb2RlKQorCitUaGUgY2xvY2sgZXZlbnQgZGV2aWNlIGRlbGVnYXRlcyB0aGUgc2VsZWN0aW9uIG9mIHRob3NlIHRpbWVyIGludGVycnVwdCByZWxhdGVkCitmdW5jdGlvbnMgY29tcGxldGVseSB0byB0aGUgbWFuYWdlbWVudCBsYXllci4gVGhlIGNsb2NrIG1hbmFnZW1lbnQgbGF5ZXIgc3RvcmVzCithIGZ1bmN0aW9uIHBvaW50ZXIgaW4gdGhlIGRldmljZSBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUsIHdoaWNoIGhhcyB0byBiZSBjYWxsZWQKK2Zyb20gdGhlIGhhcmR3YXJlIGxldmVsIGhhbmRsZXIuIFRoaXMgcmVtb3ZlcyBhIGxvdCBvZiBkdXBsaWNhdGVkIGNvZGUgZnJvbSB0aGUKK2FyY2hpdGVjdHVyZSBzcGVjaWZpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlcnMgYW5kIGhhbmRzIHRoZSBjb250cm9sIG92ZXIgdGhlCitjbG9jayBldmVudCBkZXZpY2VzIGFuZCB0aGUgYXNzaWdubWVudCBvZiB0aW1lciBpbnRlcnJ1cHQgcmVsYXRlZCBmdW5jdGlvbmFsaXR5Cit0byB0aGUgY29yZSBjb2RlLgorCitUaGUgY2xvY2sgZXZlbnQgbGF5ZXIgQVBJIGlzIHJhdGhlciBzbWFsbC4gQXNpZGUgZnJvbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlCityZWdpc3RyYXRpb24gaW50ZXJmYWNlIGl0IHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBzY2hlZHVsZSB0aGUgbmV4dCBldmVudAoraW50ZXJydXB0LCBjbG9jayBldmVudCBkZXZpY2Ugbm90aWZpY2F0aW9uIHNlcnZpY2UgYW5kIHN1cHBvcnQgZm9yIHN1c3BlbmQgYW5kCityZXN1bWUuCisKK1RoZSBmcmFtZXdvcmsgYWRkcyBhYm91dCA3MDAgbGluZXMgb2YgY29kZSB3aGljaCByZXN1bHRzIGluIGEgMktCIGluY3JlYXNlIG9mCit0aGUga2VybmVsIGJpbmFyeSBzaXplLiBUaGUgY29udmVyc2lvbiBvZiBpMzg2IHJlbW92ZXMgYWJvdXQgMTAwIGxpbmVzIG9mCitjb2RlLiBUaGUgYmluYXJ5IHNpemUgZGVjcmVhc2UgaXMgaW4gdGhlIHJhbmdlIG9mIDQwMCBieXRlLiBXZSBiZWxpZXZlIHRoYXQgdGhlCitpbmNyZWFzZSBvZiBmbGV4aWJpbGl0eSBhbmQgdGhlIGF2b2lkYW5jZSBvZiBkdXBsaWNhdGVkIGNvZGUgYWNyb3NzCithcmNoaXRlY3R1cmVzIGp1c3RpZmllcyB0aGUgc2xpZ2h0IGluY3JlYXNlIG9mIHRoZSBiaW5hcnkgc2l6ZS4KKworVGhlIGNvbnZlcnNpb24gb2YgYW4gYXJjaGl0ZWN0dXJlIGhhcyBubyBmdW5jdGlvbmFsIGltcGFjdCwgYnV0IGFsbG93cyB0bwordXRpbGl6ZSB0aGUgaGlnaCByZXNvbHV0aW9uIGFuZCBkeW5hbWljIHRpY2sgZnVuY3Rpb25hbGl0ZXMgd2l0aG91dCBhbnkgY2hhbmdlCit0byB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlIGFuZCB0aW1lciBpbnRlcnJ1cHQgY29kZS4gQWZ0ZXIgdGhlIGNvbnZlcnNpb24gdGhlCitlbmFibGluZyBvZiBoaWdoIHJlc29sdXRpb24gdGltZXJzIGFuZCBkeW5hbWljIHRpY2tzIGlzIHNpbXBseSBwcm92aWRlZCBieQorYWRkaW5nIHRoZSBrZXJuZWwvdGltZS9LY29uZmlnIGZpbGUgdG8gdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBLY29uZmlnIGFuZAorYWRkaW5nIHRoZSBkeW5hbWljIHRpY2sgc3BlY2lmaWMgY2FsbHMgdG8gdGhlIGlkbGUgcm91dGluZSAoYSB0b3RhbCBvZiAzIGxpbmVzCithZGRlZCB0byB0aGUgaWRsZSBmdW5jdGlvbiBhbmQgdGhlIEtjb25maWcgZmlsZSkKKworRmlndXJlICM0IChPTFMgc2xpZGVzIHAuMjApIGlsbHVzdHJhdGVzIHRoZSB0cmFuc2Zvcm1hdGlvbi4KKworCitoaWdoIHJlc29sdXRpb24gdGltZXIgZnVuY3Rpb25hbGl0eQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworRHVyaW5nIHN5c3RlbSBib290IGl0IGlzIG5vdCBwb3NzaWJsZSB0byB1c2UgdGhlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lcgorZnVuY3Rpb25hbGl0eSwgd2hpbGUgbWFraW5nIGl0IHBvc3NpYmxlIHdvdWxkIGJlIGRpZmZpY3VsdCBhbmQgd291bGQgc2VydmUgbm8KK3VzZWZ1bCBmdW5jdGlvbi4gVGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBjbG9jayBldmVudCBkZXZpY2UgZnJhbWV3b3JrLCB0aGUKK2Nsb2NrIHNvdXJjZSBmcmFtZXdvcmsgKEdUT0QpIGFuZCBocnRpbWVycyBpdHNlbGYgaGFzIHRvIGJlIGRvbmUgYW5kCithcHByb3ByaWF0ZSBjbG9jayBzb3VyY2VzIGFuZCBjbG9jayBldmVudCBkZXZpY2VzIGhhdmUgdG8gYmUgcmVnaXN0ZXJlZCBiZWZvcmUKK3RoZSBoaWdoIHJlc29sdXRpb24gZnVuY3Rpb25hbGl0eSBjYW4gd29yay4gVXAgdG8gdGhlIHBvaW50IHdoZXJlIGhydGltZXJzIGFyZQoraW5pdGlhbGl6ZWQsIHRoZSBzeXN0ZW0gd29ya3MgaW4gdGhlIHVzdWFsIGxvdyByZXNvbHV0aW9uIHBlcmlvZGljIG1vZGUuIFRoZQorY2xvY2sgc291cmNlIGFuZCB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlIGxheWVycyBwcm92aWRlIG5vdGlmaWNhdGlvbiBmdW5jdGlvbnMKK3doaWNoIGluZm9ybSBocnRpbWVycyBhYm91dCBhdmFpbGFiaWxpdHkgb2YgbmV3IGhhcmR3YXJlLiBocnRpbWVycyB2YWxpZGF0ZXMKK3RoZSB1c2FiaWxpdHkgb2YgdGhlIHJlZ2lzdGVyZWQgY2xvY2sgc291cmNlcyBhbmQgY2xvY2sgZXZlbnQgZGV2aWNlcyBiZWZvcmUKK3N3aXRjaGluZyB0byBoaWdoIHJlc29sdXRpb24gbW9kZS4gVGhpcyBlbnN1cmVzIGFsc28gdGhhdCBhIGtlcm5lbCB3aGljaCBpcworY29uZmlndXJlZCBmb3IgaGlnaCByZXNvbHV0aW9uIHRpbWVycyBjYW4gcnVuIG9uIGEgc3lzdGVtIHdoaWNoIGxhY2tzIHRoZQorbmVjZXNzYXJ5IGhhcmR3YXJlIHN1cHBvcnQuCisKK1RoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgY29kZSBkb2VzIG5vdCBzdXBwb3J0IFNNUCBtYWNoaW5lcyB3aGljaCBoYXZlIG9ubHkKK2dsb2JhbCBjbG9jayBldmVudCBkZXZpY2VzLiBUaGUgc3VwcG9ydCBvZiBzdWNoIGhhcmR3YXJlIHdvdWxkIGludm9sdmUgSVBJCitjYWxscyB3aGVuIGFuIGludGVycnVwdCBoYXBwZW5zLiBUaGUgb3ZlcmhlYWQgd291bGQgYmUgbXVjaCBsYXJnZXIgdGhhbiB0aGUKK2JlbmVmaXQuIFRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgd2UgY3VycmVudGx5IGRpc2FibGUgaGlnaCByZXNvbHV0aW9uIGFuZAorZHluYW1pYyB0aWNrcyBvbiBpMzg2IFNNUCBzeXN0ZW1zIHdoaWNoIHN0b3AgdGhlIGxvY2FsIEFQSUMgaW4gQzMgcG93ZXIKK3N0YXRlLiBBIHdvcmthcm91bmQgaXMgYXZhaWxhYmxlIGFzIGFuIGlkZWEsIGJ1dCB0aGUgcHJvYmxlbSBoYXMgbm90IGJlZW4KK3RhY2tsZWQgeWV0LgorCitUaGUgdGltZSBvcmRlcmVkIGluc2VydGlvbiBvZiB0aW1lcnMgcHJvdmlkZXMgYWxsIHRoZSBpbmZyYXN0cnVjdHVyZSB0byBkZWNpZGUKK3doZXRoZXIgdGhlIGV2ZW50IGRldmljZSBoYXMgdG8gYmUgcmVwcm9ncmFtbWVkIHdoZW4gYSB0aW1lciBpcyBhZGRlZC4gVGhlCitkZWNpc2lvbiBpcyBtYWRlIHBlciB0aW1lciBiYXNlIGFuZCBzeW5jaHJvbml6ZWQgYWNyb3NzIHBlci1jcHUgdGltZXIgYmFzZXMgaW4KK2Egc3VwcG9ydCBmdW5jdGlvbi4gVGhlIGRlc2lnbiBhbGxvd3MgdGhlIHN5c3RlbSB0byB1dGlsaXplIHNlcGFyYXRlIHBlci1DUFUKK2Nsb2NrIGV2ZW50IGRldmljZXMgZm9yIHRoZSBwZXItQ1BVIHRpbWVyIGJhc2VzLCBidXQgY3VycmVudGx5IG9ubHkgb25lCityZXByb2dyYW1tYWJsZSBjbG9jayBldmVudCBkZXZpY2UgcGVyLUNQVSBpcyB1dGlsaXplZC4KKworV2hlbiB0aGUgdGltZXIgaW50ZXJydXB0IGhhcHBlbnMsIHRoZSBuZXh0IGV2ZW50IGludGVycnVwdCBoYW5kbGVyIGlzIGNhbGxlZAorZnJvbSB0aGUgY2xvY2sgZXZlbnQgZGlzdHJpYnV0aW9uIGNvZGUgYW5kIG1vdmVzIGV4cGlyZWQgdGltZXJzIGZyb20gdGhlCityZWQtYmxhY2sgdHJlZSB0byBhIHNlcGFyYXRlIGRvdWJsZSBsaW5rZWQgbGlzdCBhbmQgaW52b2tlcyB0aGUgc29mdGlycQoraGFuZGxlci4gQW4gYWRkaXRpb25hbCBtb2RlIGZpZWxkIGluIHRoZSBocnRpbWVyIHN0cnVjdHVyZSBhbGxvd3MgdGhlIHN5c3RlbSB0bworZXhlY3V0ZSBjYWxsYmFjayBmdW5jdGlvbnMgZGlyZWN0bHkgZnJvbSB0aGUgbmV4dCBldmVudCBpbnRlcnJ1cHQgaGFuZGxlci4gVGhpcworaXMgcmVzdHJpY3RlZCB0byBjb2RlIHdoaWNoIGNhbiBzYWZlbHkgYmUgZXhlY3V0ZWQgaW4gdGhlIGhhcmQgaW50ZXJydXB0Citjb250ZXh0LiBUaGlzIGFwcGxpZXMsIGZvciBleGFtcGxlLCB0byB0aGUgY29tbW9uIGNhc2Ugb2YgYSB3YWtldXAgZnVuY3Rpb24gYXMKK3VzZWQgYnkgbmFub3NsZWVwLiBUaGUgYWR2YW50YWdlIG9mIGV4ZWN1dGluZyB0aGUgaGFuZGxlciBpbiB0aGUgaW50ZXJydXB0Citjb250ZXh0IGlzIHRoZSBhdm9pZGFuY2Ugb2YgdXAgdG8gdHdvIGNvbnRleHQgc3dpdGNoZXMgLSBmcm9tIHRoZSBpbnRlcnJ1cHRlZAorY29udGV4dCB0byB0aGUgc29mdGlycSBhbmQgdG8gdGhlIHRhc2sgd2hpY2ggaXMgd29rZW4gdXAgYnkgdGhlIGV4cGlyZWQKK3RpbWVyLgorCitPbmNlIGEgc3lzdGVtIGhhcyBzd2l0Y2hlZCB0byBoaWdoIHJlc29sdXRpb24gbW9kZSwgdGhlIHBlcmlvZGljIHRpY2sgaXMKK3N3aXRjaGVkIG9mZi4gVGhpcyBkaXNhYmxlcyB0aGUgcGVyIHN5c3RlbSBnbG9iYWwgcGVyaW9kaWMgY2xvY2sgZXZlbnQgZGV2aWNlIC0KK2UuZy4gdGhlIFBJVCBvbiBpMzg2IFNNUCBzeXN0ZW1zLgorCitUaGUgcGVyaW9kaWMgdGljayBmdW5jdGlvbmFsaXR5IGlzIHByb3ZpZGVkIGJ5IGFuIHBlci1jcHUgaHJ0aW1lci4gVGhlIGNhbGxiYWNrCitmdW5jdGlvbiBpcyBleGVjdXRlZCBpbiB0aGUgbmV4dCBldmVudCBpbnRlcnJ1cHQgY29udGV4dCBhbmQgdXBkYXRlcyBqaWZmaWVzCithbmQgY2FsbHMgdXBkYXRlX3Byb2Nlc3NfdGltZXMgYW5kIHByb2ZpbGluZy4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBocnRpbWVyCitiYXNlZCBwZXJpb2RpYyB0aWNrIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIHdpdGggZHluYW1pYyB0aWNrIGZ1bmN0aW9uYWxpdHkuCitUaGlzIGFsbG93cyB0byB1c2UgYSBzaW5nbGUgY2xvY2sgZXZlbnQgZGV2aWNlIHRvIHNjaGVkdWxlIGhpZ2ggcmVzb2x1dGlvbgordGltZXIgYW5kIHBlcmlvZGljIGV2ZW50cyAoamlmZmllcyB0aWNrLCBwcm9maWxpbmcsIHByb2Nlc3MgYWNjb3VudGluZykgb24gVVAKK3N5c3RlbXMuIFRoaXMgaGFzIGJlZW4gcHJvdmVkIHRvIHdvcmsgd2l0aCB0aGUgUElUIG9uIGkzODYgYW5kIHRoZSBJbmNyZW1lbnRlcgorb24gUFBDLgorCitUaGUgc29mdGlycSBmb3IgcnVubmluZyB0aGUgaHJ0aW1lciBxdWV1ZXMgYW5kIGV4ZWN1dGluZyB0aGUgY2FsbGJhY2tzIGhhcyBiZWVuCitzZXBhcmF0ZWQgZnJvbSB0aGUgdGljayBib3VuZCB0aW1lciBzb2Z0aXJxIHRvIGFsbG93IGFjY3VyYXRlIGRlbGl2ZXJ5IG9mIGhpZ2gKK3Jlc29sdXRpb24gdGltZXIgc2lnbmFscyB3aGljaCBhcmUgdXNlZCBieSBpdGltZXIgYW5kIFBPU0lYIGludGVydmFsCit0aW1lcnMuIFRoZSBleGVjdXRpb24gb2YgdGhpcyBzb2Z0aXJxIGNhbiBzdGlsbCBiZSBkZWxheWVkIGJ5IG90aGVyIHNvZnRpcnFzLAorYnV0IHRoZSBvdmVyYWxsIGxhdGVuY2llcyBoYXZlIGJlZW4gc2lnbmlmaWNhbnRseSBpbXByb3ZlZCBieSB0aGlzIHNlcGFyYXRpb24uCisKK0ZpZ3VyZSAjNSAoT0xTIHNsaWRlcyBwLjIyKSBpbGx1c3RyYXRlcyB0aGUgdHJhbnNmb3JtYXRpb24uCisKKworZHluYW1pYyB0aWNrcworLS0tLS0tLS0tLS0tLQorCitEeW5hbWljIHRpY2tzIGFyZSB0aGUgbG9naWNhbCBjb25zZXF1ZW5jZSBvZiB0aGUgaHJ0aW1lciBiYXNlZCBwZXJpb2RpYyB0aWNrCityZXBsYWNlbWVudCAoc2NoZWRfdGljaykuIFRoZSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBzY2hlZF90aWNrIGhydGltZXIgaXMKK2V4dGVuZGVkIGJ5IHRocmVlIGZ1bmN0aW9uczoKKworLSBocnRpbWVyX3N0b3Bfc2NoZWRfdGljaworLSBocnRpbWVyX3Jlc3RhcnRfc2NoZWRfdGljaworLSBocnRpbWVyX3VwZGF0ZV9qaWZmaWVzCisKK2hydGltZXJfc3RvcF9zY2hlZF90aWNrKCkgaXMgY2FsbGVkIHdoZW4gYSBDUFUgZ29lcyBpbnRvIGlkbGUgc3RhdGUuIFRoZSBjb2RlCitldmFsdWF0ZXMgdGhlIG5leHQgc2NoZWR1bGVkIHRpbWVyIGV2ZW50IChmcm9tIGJvdGggaHJ0aW1lcnMgYW5kIHRoZSB0aW1lcgord2hlZWwpIGFuZCBpbiBjYXNlIHRoYXQgdGhlIG5leHQgZXZlbnQgaXMgZnVydGhlciBhd2F5IHRoYW4gdGhlIG5leHQgdGljayBpdAorcmVwcm9ncmFtcyB0aGUgc2NoZWRfdGljayB0byB0aGlzIGZ1dHVyZSBldmVudCwgdG8gYWxsb3cgbG9uZ2VyIGlkbGUgc2xlZXBzCit3aXRob3V0IHdvcnRobGVzcyBpbnRlcnJ1cHRpb24gYnkgdGhlIHBlcmlvZGljIHRpY2suIFRoZSBmdW5jdGlvbiBpcyBhbHNvCitjYWxsZWQgd2hlbiBhbiBpbnRlcnJ1cHQgaGFwcGVucyBkdXJpbmcgdGhlIGlkbGUgcGVyaW9kLCB3aGljaCBkb2VzIG5vdCBjYXVzZSBhCityZXNjaGVkdWxlLiBUaGUgY2FsbCBpcyBuZWNlc3NhcnkgYXMgdGhlIGludGVycnVwdCBoYW5kbGVyIG1pZ2h0IGhhdmUgYXJtZWQgYQorbmV3IHRpbWVyIHdob3NlIGV4cGlyeSB0aW1lIGlzIGJlZm9yZSB0aGUgdGltZSB3aGljaCB3YXMgaWRlbnRpZmllZCBhcyB0aGUKK25lYXJlc3QgZXZlbnQgaW4gdGhlIHByZXZpb3VzIGNhbGwgdG8gaHJ0aW1lcl9zdG9wX3NjaGVkX3RpY2suCisKK2hydGltZXJfcmVzdGFydF9zY2hlZF90aWNrKCkgaXMgY2FsbGVkIHdoZW4gdGhlIENQVSBsZWF2ZXMgdGhlIGlkbGUgc3RhdGUgYmVmb3JlCitpdCBjYWxscyBzY2hlZHVsZSgpLiBocnRpbWVyX3Jlc3RhcnRfc2NoZWRfdGljaygpIHJlc3VtZXMgdGhlIHBlcmlvZGljIHRpY2ssCit3aGljaCBpcyBrZXB0IGFjdGl2ZSB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGhydGltZXJfc3RvcF9zY2hlZF90aWNrKCkuCisKK2hydGltZXJfdXBkYXRlX2ppZmZpZXMoKSBpcyBjYWxsZWQgZnJvbSBpcnFfZW50ZXIoKSB3aGVuIGFuIGludGVycnVwdCBoYXBwZW5zCitpbiB0aGUgaWRsZSBwZXJpb2QgdG8gbWFrZSBzdXJlIHRoYXQgamlmZmllcyBhcmUgdXAgdG8gZGF0ZSBhbmQgdGhlIGludGVycnVwdAoraGFuZGxlciBoYXMgbm90IHRvIGRlYWwgd2l0aCBhbiBldmVudHVhbGx5IHN0YWxlIGppZmZ5IHZhbHVlLgorCitUaGUgZHluYW1pYyB0aWNrIGZlYXR1cmUgcHJvdmlkZXMgc3RhdGlzdGljYWwgdmFsdWVzIHdoaWNoIGFyZSBleHBvcnRlZCB0bwordXNlcnNwYWNlIHZpYSAvcHJvYy9zdGF0cyBhbmQgY2FuIGJlIG1hZGUgYXZhaWxhYmxlIGZvciBlbmhhbmNlZCBwb3dlcgorbWFuYWdlbWVudCBjb250cm9sLgorCitUaGUgaW1wbGVtZW50YXRpb24gbGVhdmVzIHJvb20gZm9yIGZ1cnRoZXIgZGV2ZWxvcG1lbnQgbGlrZSBmdWxsIHRpY2tsZXNzCitzeXN0ZW1zLCB3aGVyZSB0aGUgdGltZSBzbGljZSBpcyBjb250cm9sbGVkIGJ5IHRoZSBzY2hlZHVsZXIsIHZhcmlhYmxlCitmcmVxdWVuY3kgcHJvZmlsaW5nLCBhbmQgYSBjb21wbGV0ZSByZW1vdmFsIG9mIGppZmZpZXMgaW4gdGhlIGZ1dHVyZS4KKworCitBc2lkZSB0aGUgY3VycmVudCBpbml0aWFsIHN1Ym1pc3Npb24gb2YgaTM4NiBzdXBwb3J0LCB0aGUgcGF0Y2hzZXQgaGFzIGJlZW4KK2V4dGVuZGVkIHRvIHg4Nl82NCBhbmQgQVJNIGFscmVhZHkuIEluaXRpYWwgKHdvcmsgaW4gcHJvZ3Jlc3MpIHN1cHBvcnQgaXMgYWxzbworYXZhaWxhYmxlIGZvciBNSVBTIGFuZCBQb3dlclBDLgorCisJICBUaG9tYXMsIEluZ28KKworCisKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vaHJ0aW1lcnMudHh0IGIvRG9jdW1lbnRhdGlvbi9ocnRpbWVycy9ocnRpbWVycy50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIERvY3VtZW50YXRpb24vaHJ0aW1lcnMudHh0CnJlbmFtZSB0byBEb2N1bWVudGF0aW9uL2hydGltZXJzL2hydGltZXJzLnR4dApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCAyMmIxOTk2Li5hYmQ1NzVjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNjA5LDYgKzYwOSwxMCBAQAogCQkJaGlnaG1lbSBvdGhlcndpc2UuIFRoaXMgYWxzbyB3b3JrcyB0byByZWR1Y2UgaGlnaG1lbQogCQkJc2l6ZSBvbiBiaWdnZXIgYm94ZXMuCiAKKwloaWdocmVzPQlbS05MXSBFbmFibGUvZGlzYWJsZSBoaWdoIHJlc29sdXRpb24gdGltZXIgbW9kZS4KKwkJCVZhbGlkIHBhcmFtZXRlcnM6ICJvbiIsICJvZmYiCisJCQlEZWZhdWx0OiAib24iCisKIAloaXNheD0JCVtIVyxJU0ROXQogCQkJU2VlIERvY3VtZW50YXRpb24vaXNkbi9SRUFETUUuSGlTYXguCiAKQEAgLTEwNzgsNiArMTA4MiwxMCBAQAogCQkJaW4gY2VydGFpbiBlbnZpcm9ubWVudHMgc3VjaCBhcyBuZXR3b3JrZWQgc2VydmVycyBvcgogCQkJcmVhbC10aW1lIHN5c3RlbXMuCiAKKwlub2h6PQkJW0tOTF0gQm9vdHRpbWUgZW5hYmxlL2Rpc2FibGUgZHluYW1pYyB0aWNrcworCQkJVmFsaWQgYXJndW1lbnRzOiBvbiwgb2ZmCisJCQlEZWZhdWx0OiBvbgorCiAJbm9pcnFiYWxhbmNlCVtJQS0zMixTTVAsS05MXSBEaXNhYmxlIGtlcm5lbCBpcnEgYmFsYW5jaW5nCiAKIAlub2lycWRlYnVnCVtJQS0zMl0gRGlzYWJsZXMgdGhlIGNvZGUgd2hpY2ggYXR0ZW1wdHMgdG8gZGV0ZWN0IGFuZApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zb255LWxhcHRvcC50eHQgYi9Eb2N1bWVudGF0aW9uL3NvbnktbGFwdG9wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmQyNmRmCi0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi9zb255LWxhcHRvcC50eHQKQEAgLTAsMCArMSwxMDYgQEAKK1NvbnkgTm90ZWJvb2sgQ29udHJvbCBEcml2ZXIgKFNOQykgUmVhZG1lCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCUNvcHlyaWdodCAoQykgMjAwNC0gMjAwNSBTdGVsaWFuIFBvcCA8c3RlbGlhbkBwb3BpZXMubmV0PgorCUNvcHlyaWdodCAoQykgMjAwNyBNYXR0aWEgRG9uZ2lsaSA8bWFsYXR0aWFAbGludXguaXQ+CisKK1RoaXMgbWluaS1kcml2ZXIgZHJpdmVzIHRoZSBTTkMgZGV2aWNlIHByZXNlbnQgaW4gdGhlIEFDUEkgQklPUyBvZgordGhlIFNvbnkgVmFpbyBsYXB0b3BzLgorCitJdCBnaXZlcyBhY2Nlc3MgdG8gc29tZSBleHRyYSBsYXB0b3AgZnVuY3Rpb25hbGl0aWVzLiBJbiBpdHMgY3VycmVudAorZm9ybSwgdGhpcyBkcml2ZXIgbGV0IHRoZSB1c2VyIHNldCBvciBxdWVyeSB0aGUgc2NyZWVuIGJyaWdodG5lc3MKK3Rocm91Z2ggdGhlIGJhY2tsaWdodCBzdWJzeXN0ZW0gYW5kIHJlbW92ZS9hcHBseSBwb3dlciB0byBzb21lIGRldmljZXMuCisKK0JhY2tsaWdodCBjb250cm9sOgorLS0tLS0tLS0tLS0tLS0tLS0tCitJZiB5b3VyIGxhcHRvcCBtb2RlbCBzdXBwb3J0cyBpdCwgeW91IHdpbGwgZmluZCBzeXNmcyBmaWxlcyBpbiB0aGUKKy9zeXMvY2xhc3MvYmFja2xpZ2h0L3NvbnkvCitkaXJlY3RvcnkuIFlvdSB3aWxsIGJlIGFibGUgdG8gcXVlcnkgYW5kIHNldCB0aGUgY3VycmVudCBzY3JlZW4KK2JyaWdodG5lc3M6CisJYnJpZ2h0bmVzcwkJZ2V0L3NldCBzY3JlZW4gYnJpZ2h0bmVzcyAoYW4gaXRlZ2VyCisJCQkJYmV0d2VlbiAwIGFuZCA3KQorCWFjdHVhbF9icmlnaHRuZXNzCXJlYWRpbmcgZnJvbSB0aGlzIGZpbGUgd2lsbCBxdWVyeSB0aGUgSFcKKwkJCQl0byBnZXQgcmVhbCBicmlnaHRuZXNzIHZhbHVlCisJbWF4X2JyaWdodG5lc3MJCXRoZSBtYXhpbXVtIGJyaWdodG5lc3MgdmFsdWUKKworCitQbGF0Zm9ybSBzcGVjaWZpYzoKKy0tLS0tLS0tLS0tLS0tLS0tLQorTG9hZGluZyB0aGUgc29ueS1sYXB0b3AgbW9kdWxlIHdpbGwgY3JlYXRlIGEKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9zb255LWxhcHRvcC8KK2RpcmVjdG9yeSBwb3B1bGF0ZWQgd2l0aCBzb21lIGZpbGVzLgorCitZb3UgdGhlbiByZWFkL3dyaXRlIGludGVnZXIgdmFsdWVzIGZyb20vdG8gdGhvc2UgZmlsZXMgYnkgdXNpbmcKK3N0YW5kYXJkIFVOSVggdG9vbHMuCisKK1RoZSBmaWxlcyBhcmU6CisJYnJpZ2h0bmVzc19kZWZhdWx0CXNjcmVlbiBicmlnaHRuZXNzIHdoaWNoIHdpbGwgYmUgc2V0CisJCQkJd2hlbiB0aGUgbGFwdG9wIHdpbGwgYmUgcmVib290ZWQKKwljZHBvd2VyCQkJcG93ZXIgb24vb2ZmIHRoZSBpbnRlcm5hbCBDRCBkcml2ZQorCWF1ZGlvcG93ZXIJCXBvd2VyIG9uL29mZiB0aGUgaW50ZXJuYWwgc291bmQgY2FyZAorCWxhbnBvd2VyCQlwb3dlciBvbi9vZmYgdGhlIGludGVybmFsIGV0aGVybmV0IGNhcmQKKwkJCQkob25seSBpbiBkZWJ1ZyBtb2RlKQorCitOb3RlIHRoYXQgc29tZSBmaWxlcyBtYXkgYmUgbWlzc2luZyBpZiB0aGV5IGFyZSBub3Qgc3VwcG9ydGVkCitieSB5b3VyIHBhcnRpY3VsYXIgbGFwdG9wIG1vZGVsLgorCitFeGFtcGxlIHVzYWdlOgorCSMgZWNobyAiMSIgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AvYnJpZ2h0bmVzc19kZWZhdWx0CitzZXRzIHRoZSBsb3dlc3Qgc2NyZWVuIGJyaWdodG5lc3MgZm9yIHRoZSBuZXh0IGFuZCBsYXRlciByZWJvb3RzLAorCSMgZWNobyAiOCIgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AvYnJpZ2h0bmVzc19kZWZhdWx0CitzZXRzIHRoZSBoaWdoZXN0IHNjcmVlbiBicmlnaHRuZXNzIGZvciB0aGUgbmV4dCBhbmQgbGF0ZXIgcmVib290cywKKwkjIGNhdCAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AvYnJpZ2h0bmVzc19kZWZhdWx0CityZXRyaWV2ZXMgdGhlIHZhbHVlLgorCisJIyBlY2hvICIwIiA+IC9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9zb255LWxhcHRvcC9hdWRpb3Bvd2VyCitwb3dlcnMgb2ZmIHRoZSBzb3VuZCBjYXJkLAorCSMgZWNobyAiMSIgPiAvc3lzL2RldmljZXMvcGxhdGZvcm0vc29ueS1sYXB0b3AvYXVkaW9wb3dlcgorcG93ZXJzIG9uIHRoZSBzb3VuZCBjYXJkLgorCitEZXZlbG9wbWVudDoKKy0tLS0tLS0tLS0tLQorCitJZiB5b3Ugd2FudCB0byBoZWxwIHdpdGggdGhlIGRldmVsb3BtZW50IG9mIHRoaXMgZHJpdmVyIChhbmQKK3lvdSBhcmUgbm90IGFmcmFpZCBvZiBhbnkgc2lkZSBlZmZlY3RzIGRvaW5nIHN0cmFuZ2UgdGhpbmdzIHdpdGgKK3lvdXIgQUNQSSBCSU9TIGNvdWxkIGhhdmUgb24geW91ciBsYXB0b3ApLCBsb2FkIHRoZSBkcml2ZXIgYW5kCitwYXNzIHRoZSBvcHRpb24gJ2RlYnVnPTEnLgorCitSRVBFQVQ6IERPTidUIERPIFRISVMgSUYgWU9VIERPTidUIExJS0UgUklTS1kgQlVTSU5FU1MuCisKK0luIHlvdXIga2VybmVsIGxvZ3MgeW91IHdpbGwgZmluZCB0aGUgbGlzdCBvZiBhbGwgQUNQSSBtZXRob2RzCit0aGUgU05DIGRldmljZSBoYXMgb24geW91ciBsYXB0b3AuIFlvdSBjYW4gc2VlIHRoZSBHQ0RQL0dDRFAgbWV0aG9kcwordXNlZCB0byBwd2VyIG9uL29mZiB0aGUgQ0QgZHJpdmUsIGJ1dCB0aGVyZSBhcmUgb3RoZXJzLgorCitJIEhBVkUgTk8gSURFQSBXSEFUIFRIT1NFIE1FVEhPRFMgRE8uCisKK1RoZSBzb255LWxhcHRvcCBkcml2ZXIgY3JlYXRlcywgZm9yIHNvbWUgb2YgdGhvc2UgbWV0aG9kcyAodGhlIG1vc3QKK2N1cnJlbnQgb25lcyBmb3VuZCBvbiBzZXZlcmFsIFZhaW8gbW9kZWxzKSwgYW4gZW50cnkgdW5kZXIKKy9zeXMvZGV2aWNlcy9wbGF0Zm9ybS9zb255LWxhcHRvcCwganVzdCBsaWtlIHRoZSAnY2Rwb3dlcicgb25lLgorWW91IGNhbiBjcmVhdGUgb3RoZXIgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHlvdXIgb3duIGxhcHRvcCBtZXRob2RzIGJ5CitmdXJ0aGVyIGVkaXRpbmcgdGhlIHNvdXJjZSAoc2VlIHRoZSAnc29ueV9hY3BpX3ZhbHVlcycgdGFibGUsIGFuZCBhZGQgYSBuZXcKK2VudHJ5IHRvIHRoaXMgdGFibGUgd2l0aCB5b3VyIGdldC9zZXQgbWV0aG9kIG5hbWVzIHVzaW5nIHRoZQorSEFORExFX05BTUVTIG1hY3JvKS4KKworWW91ciBtaXNzaW9uLCBzaG91bGQgeW91IGFjY2VwdCBpdCwgaXMgdG8gdHJ5IGZpbmRpbmcgb3V0IHdoYXQKK3Rob3NlIGVudHJpZXMgYXJlIGZvciwgYnkgcmVhZGluZy93cml0aW5nIHJhbmRvbSB2YWx1ZXMgZnJvbS90byB0aG9zZQorZmlsZXMgYW5kIGZpbmQgb3V0IHdoYXQgaXMgdGhlIGltcGFjdCBvbiB5b3VyIGxhcHRvcC4KKworU2hvdWxkIHlvdSBmaW5kIGFueXRoaW5nIGludGVyZXN0aW5nLCBwbGVhc2UgcmVwb3J0IGl0IGJhY2sgdG8gbWUsCitJIHdpbGwgbm90IGRpc2F2b3cgYWxsIGtub3dsZWRnZSBvZiB5b3VyIGFjdGlvbnMgOikKKworQnVncy9MaW1pdGF0aW9uczoKKy0tLS0tLS0tLS0tLS0tLS0tCisKKyogVGhpcyBkcml2ZXIgaXMgbm90IGJhc2VkIG9uIG9mZmljaWFsIGRvY3VtZW50YXRpb24gZnJvbSBTb255CisgIChiZWNhdXNlIHRoZXJlIGlzIG5vbmUpLCBzbyB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhpcyBkcml2ZXIKKyAgd2lsbCB3b3JrIGF0IGFsbCwgb3IgZG8gdGhlIHJpZ2h0IHRoaW5nLiBBbHRob3VnaCB0aGlzIGhhc24ndAorICBoYXBwZW5lZCB0byBtZSwgdGhpcyBkcml2ZXIgY291bGQgZG8gdmVyeSBiYWQgdGhpbmdzIHRvIHlvdXIKKyAgbGFwdG9wLCBpbmNsdWRpbmcgcGVybWFuZW50IGRhbWFnZS4KKworKiBUaGUgc29ueS1sYXB0b3AgYW5kIHNvbnlwaSBkcml2ZXJzIGRvIG5vdCBpbnRlcmFjdCBhdCBhbGwuIEluIHRoZQorICBmdXR1cmUsIHNvbnlwaSBjb3VsZCB1c2Ugc29ueS1sYXB0b3AgdG8gZG8gKHBhcnQgb2YpIGl0cyBidXNpbmVzcy4KKworKiBzcGljY3RybCwgd2hpY2ggaXMgdGhlIHVzZXJzcGFjZSB0b29sIHVzZWQgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUKKyAgc29ueXBpIGRyaXZlciAodGhyb3VnaCAvZGV2L3NvbnlwaSkgZG9lcyBub3QgdHJ5IHRvIHVzZSB0aGUKKyAgc29ueS1sYXB0b3AgZHJpdmVyLiBJbiB0aGUgZnV0dXJlLCBzcGljY3RybCBjb3VsZCB0cnkgc29ueXBpIGZpcnN0LAorICBhbmQgaWYgaXQgaXNuJ3QgcHJlc2VudCwgdHJ5IHNvbnktbGFwdG9wIGluc3RlYWQuCisKZGlmZiAtLWdpdCBhL01BSU5UQUlORVJTIGIvTUFJTlRBSU5FUlMKaW5kZXggYjBmZDcxYi4uYTM4NDU1MSAxMDA2NDQKLS0tIGEvTUFJTlRBSU5FUlMKKysrIGIvTUFJTlRBSU5FUlMKQEAgLTI0Nyw2ICsyNDcsMTMgQEAKIFc6CWh0dHA6Ly9hY3BpLnNvdXJjZWZvcmdlLm5ldC8KIFM6CVN1cHBvcnRlZAogCitBQ1BJIFZJREVPIERSSVZFUgorUDoJTHVtaW5nIFl1CitNOglsdW1pbmcueXVAaW50ZWwuY29tCitMOglsaW51eC1hY3BpQHZnZXIua2VybmVsLm9yZworVzoJaHR0cDovL2FjcGkuc291cmNlZm9yZ2UubmV0LworUzoJU3VwcG9ydGVkCisKIEFEMTgxNiBTT1VORCBEUklWRVIKIFA6CVRob3JzdGVuIEtuYWJlCiBNOglUaG9yc3RlbiBLbmFiZSA8bGludXhAdGhvcnN0ZW4ta25hYmUuZGU+CkBAIC0zMDYxLDYgKzMwNjgsOCBAQAogU09OWSBWQUlPIENPTlRST0wgREVWSUNFIERSSVZFUgogUDoJU3RlbGlhbiBQb3AKIE06CXN0ZWxpYW5AcG9waWVzLm5ldAorUDoJTWF0dGlhIERvbmdpbGkKK006CW1hbGF0dGlhQGxpbnV4Lml0CiBXOglodHRwOi8vcG9waWVzLm5ldC9zb255cGkvCiBTOglNYWludGFpbmVkCiAKZGlmZiAtLWdpdCBhL2FyY2gvYXJtL2tlcm5lbC9pcnEuYyBiL2FyY2gvYXJtL2tlcm5lbC9pcnEuYwppbmRleCBlYzAxZjA4Li5lMTAxODQ2IDEwMDY0NAotLS0gYS9hcmNoL2FybS9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC9hcm0va2VybmVsL2lycS5jCkBAIC0xNTksOCArMTU5LDcgQEAKIAlpbnQgaXJxOwogCiAJZm9yIChpcnEgPSAwOyBpcnEgPCBOUl9JUlFTOyBpcnErKykKLQkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgfD0gSVJRX05PUkVRVUVTVCB8IElSUV9ERUxBWUVEX0RJU0FCTEUgfAotCQkJSVJRX05PUFJPQkU7CisJCWlycV9kZXNjW2lycV0uc3RhdHVzIHw9IElSUV9OT1JFUVVFU1QgfCBJUlFfTk9QUk9CRTsKIAogI2lmZGVmIENPTkZJR19TTVAKIAliYWRfaXJxX2Rlc2MuYWZmaW5pdHkgPSBDUFVfTUFTS19BTEw7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMgYi9hcmNoL2FybS9tYWNoLWlteC90aW1lLmMKaW5kZXggNDAwMzliMi4uMjcwM2E3MyAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1pbXgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtaW14L3RpbWUuYwpAQCAtODcsNyArODcsNyBAQAogCS5yZWFkCQk9IGlteF9nZXRfY3ljbGVzLAogCS5tYXNrCQk9IDB4RkZGRkZGRkYsCiAJLnNoaWZ0IAkJPSAyMCwKLQkuaXNfY29udGludW91cyAJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGlteF9jbG9ja3NvdXJjZV9pbml0KHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLWl4cDR4eC9jb21tb24uYyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCmluZGV4IDJlYzlhOWUuLjQ1MDY4YzMgMTAwNjQ0Ci0tLSBhL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCisrKyBiL2FyY2gvYXJtL21hY2gtaXhwNHh4L2NvbW1vbi5jCkBAIC0zOTUsNyArMzk1LDcgQEAKIAkucmVhZAkJPSBpeHA0eHhfZ2V0X2N5Y2xlcywKIAkubWFzawkJPSBDTE9DS1NPVVJDRV9NQVNLKDMyKSwKIAkuc2hpZnQgCQk9IDIwLAotCS5pc19jb250aW51b3VzIAk9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogdW5zaWduZWQgbG9uZyBpeHA0eHhfdGltZXJfZnJlcSA9IEZSRVE7CmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jIGIvYXJjaC9hcm0vbWFjaC1uZXR4L3RpbWUuYwppbmRleCA1NzczYjU1Li43ZTEzMmZjIDEwMDY0NAotLS0gYS9hcmNoL2FybS9tYWNoLW5ldHgvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtbmV0eC90aW1lLmMKQEAgLTYyLDcgKzYyLDcgQEAKIAkucmVhZAkJPSBuZXR4X2dldF9jeWNsZXMsCiAJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJLnNoaWZ0IAkJPSAyMCwKLQkuaXNfY29udGludW91cyAJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMgYi9hcmNoL2FybS9tYWNoLXB4YS90aW1lLmMKaW5kZXggZWUyYmViNC4uZmMzYjgyYSAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vbWFjaC1weGEvdGltZS5jCisrKyBiL2FyY2gvYXJtL21hY2gtcHhhL3RpbWUuYwpAQCAtMTEyLDcgKzExMiw3IEBACiAJLnJlYWQgICAgICAgICAgID0gcHhhX2dldF9jeWNsZXMsCiAJLm1hc2sgICAgICAgICAgID0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCiAJLnNoaWZ0ICAgICAgICAgID0gMjAsCi0JLmlzX2NvbnRpbnVvdXMgID0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiBzdGF0aWMgdm9pZCBfX2luaXQgcHhhX3RpbWVyX2luaXQodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYyBiL2FyY2gvYXZyMzIvYm9hcmRzL2F0c3RrMTAwMC9hdHN0azEwMDIuYwppbmRleCBkNDdlMzlmLi41OTc0NzY4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2JvYXJkcy9hdHN0azEwMDAvYXRzdGsxMDAyLmMKKysrIGIvYXJjaC9hdnIzMi9ib2FyZHMvYXRzdGsxMDAwL2F0c3RrMTAwMi5jCkBAIC04LDcgKzgsNiBAQAogICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAgKi8KICNpbmNsdWRlIDxsaW51eC9jbGsuaD4KLSNpbmNsdWRlIDxsaW51eC9kZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KQEAgLTM2LDEyICszNSwxMSBAQAogc3RhdGljIHN0cnVjdCBldGhfcGxhdGZvcm1fZGF0YSBfX2luaXRkYXRhIGV0aF9kYXRhWzJdOwogZXh0ZXJuIHN0cnVjdCBsY2RjX3BsYXRmb3JtX2RhdGEgYXRzdGsxMDAwX2ZiMF9kYXRhOwogCi1zdGF0aWMgc3RydWN0IHNwaV9ib2FyZF9pbmZvIHNwaV9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKK3N0YXRpYyBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gc3BpMF9ib2FyZF9pbmZvW10gX19pbml0ZGF0YSA9IHsKIAl7CisJCS8qIFFWR0EgZGlzcGxheSAqLwogCQkubW9kYWxpYXMJPSAibHR2MzUwcXYiLAotCQkuY29udHJvbGxlcl9kYXRhID0gKHZvaWQgKilHUElPX1BJTl9QQSg0KSwKIAkJLm1heF9zcGVlZF9oegk9IDE2MDAwMDAwLAotCQkuYnVzX251bQk9IDAsCiAJCS5jaGlwX3NlbGVjdAk9IDEsCiAJfSwKIH07CkBAIC0xNDksOCArMTQ3LDcgQEAKIAogCXNldF9od19hZGRyKGF0MzJfYWRkX2RldmljZV9ldGgoMCwgJmV0aF9kYXRhWzBdKSk7CiAKLQlzcGlfcmVnaXN0ZXJfYm9hcmRfaW5mbyhzcGlfYm9hcmRfaW5mbywgQVJSQVlfU0laRShzcGlfYm9hcmRfaW5mbykpOwotCWF0MzJfYWRkX2RldmljZV9zcGkoMCk7CisJYXQzMl9hZGRfZGV2aWNlX3NwaSgwLCBzcGkwX2JvYXJkX2luZm8sIEFSUkFZX1NJWkUoc3BpMF9ib2FyZF9pbmZvKSk7CiAJYXQzMl9hZGRfZGV2aWNlX2xjZGMoMCwgJmF0c3RrMTAwMF9mYjBfZGF0YSk7CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGxfdGFibGUuUyBiL2FyY2gvYXZyMzIva2VybmVsL3N5c2NhbGxfdGFibGUuUwppbmRleCBkYjhmOGI1Li43YzI3OTU4IDEwMDY0NAotLS0gYS9hcmNoL2F2cjMyL2tlcm5lbC9zeXNjYWxsX3RhYmxlLlMKKysrIGIvYXJjaC9hdnIzMi9rZXJuZWwvc3lzY2FsbF90YWJsZS5TCkBAIC04LDE0ICs4LDYgQEAKICAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgogICovCiAKLSNpZiAhZGVmaW5lZChDT05GSUdfTkZTRCkgJiYgIWRlZmluZWQoQ09ORklHX05GU0RfTU9EVUxFKQotI2RlZmluZSBzeXNfbmZzc2VydmN0bCBzeXNfbmlfc3lzY2FsbAotI2VuZGlmCi0KLSNpZiAhZGVmaW5lZChDT05GSUdfU1lTVl9JUEMpCi0jIGRlZmluZSBzeXNfaXBjCXN5c19uaV9zeXNjYWxsCi0jZW5kaWYKLQogCS5zZWN0aW9uIC5yb2RhdGEsImEiLEBwcm9nYml0cwogCS50eXBlCXN5c19jYWxsX3RhYmxlLEBvYmplY3QKIAkuZ2xvYmFsCXN5c19jYWxsX3RhYmxlCkBAIC0xMjksNyArMTIxLDcgQEAKIAkubG9uZwlzeXNfZ2V0aXRpbWVyCQkvKiAxMDUgKi8KIAkubG9uZwlzeXNfc3dhcG9mZgogCS5sb25nCXN5c19zeXNpbmZvCi0JLmxvbmcJc3lzX2lwYworCS5sb25nCXN5c19uaV9zeXNjYWxsCQkvKiB3YXMgc3lzX2lwYyBicmllZmx5ICovCiAJLmxvbmcJc3lzX3NlbmRmaWxlCiAJLmxvbmcJc3lzX3NldGRvbWFpbm5hbWUJLyogMTEwICovCiAJLmxvbmcJc3lzX25ld3VuYW1lCkBAIC0yODcsNCArMjc5LDE2IEBACiAJLmxvbmcJc3lzX3RlZQogCS5sb25nCXN5c192bXNwbGljZQogCS5sb25nCV9fc3lzX2Vwb2xsX3B3YWl0CS8qIDI2NSAqLworCS5sb25nCXN5c19tc2dnZXQKKwkubG9uZwlzeXNfbXNnc25kCisJLmxvbmcJc3lzX21zZ3JjdgorCS5sb25nCXN5c19tc2djdGwKKwkubG9uZwlzeXNfc2VtZ2V0CQkvKiAyNzAgKi8KKwkubG9uZwlzeXNfc2Vtb3AKKwkubG9uZwlzeXNfc2VtY3RsCisJLmxvbmcJc3lzX3NlbXRpbWVkb3AKKwkubG9uZwlzeXNfc2htYXQKKwkubG9uZwlzeXNfc2htZ2V0CQkvKiAyNzUgKi8KKwkubG9uZwlzeXNfc2htZHQKKwkubG9uZwlzeXNfc2htY3RsCiAJLmxvbmcJc3lzX25pX3N5c2NhbGwJCS8qIHI4IGlzIHNhdHVyYXRlZCBhdCBucl9zeXNjYWxscyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jIGIvYXJjaC9hdnIzMi9rZXJuZWwvdGltZS5jCmluZGV4IGEyZjc0YWYuLmMxMDgzM2YgMTAwNjQ0Ci0tLSBhL2FyY2gvYXZyMzIva2VybmVsL3RpbWUuYworKysgYi9hcmNoL2F2cjMyL2tlcm5lbC90aW1lLmMKQEAgLTM3LDcgKzM3LDcgQEAKIAkucmVhZAkJPSByZWFkX2N5Y2xlX2NvdW50LAogCS5tYXNrCQk9IENMT0NLU09VUkNFX01BU0soMzIpLAogCS5zaGlmdAkJPSAxNiwKLQkuaXNfY29udGludW91cwk9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvYXQzMmFwNzAwMC5jIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKaW5kZXggYzFlNDc3ZS4uYmMyMzU1MCAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKKysrIGIvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9hdDMyYXA3MDAwLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvY2xrLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaS9zcGkuaD4KIAogI2luY2x1ZGUgPGFzbS9pby5oPgogCkBAIC0zMTAsOCArMzExLDYgQEAKIHsKIAl1MzIgY29udHJvbDsKIAotCUJVR19PTihjbGstPmluZGV4ID4gNyk7Ci0KIAljb250cm9sID0gc21fcmVhZGwoJnN5c3RlbV9tYW5hZ2VyLCBQTV9HQ0NUUkwgKyA0ICogY2xrLT5pbmRleCk7CiAJaWYgKGVuYWJsZWQpCiAJCWNvbnRyb2wgfD0gU01fQklUKENFTik7CkBAIC0zMjUsMTEgKzMyNCw2IEBACiAJdTMyIGNvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBkaXYgPSAxOwogCi0JQlVHX09OKGNsay0+aW5kZXggPiA3KTsKLQotCWlmICghY2xrLT5wYXJlbnQpCi0JCXJldHVybiAwOwotCiAJY29udHJvbCA9IHNtX3JlYWRsKCZzeXN0ZW1fbWFuYWdlciwgUE1fR0NDVFJMICsgNCAqIGNsay0+aW5kZXgpOwogCWlmIChjb250cm9sICYgU01fQklUKERJVkVOKSkKIAkJZGl2ID0gMiAqIChTTV9CRkVYVChESVYsIGNvbnRyb2wpICsgMSk7CkBAIC0zNDIsMTEgKzMzNiw2IEBACiAJdTMyIGNvbnRyb2w7CiAJdW5zaWduZWQgbG9uZyBwYXJlbnRfcmF0ZSwgYWN0dWFsX3JhdGUsIGRpdjsKIAotCUJVR19PTihjbGstPmluZGV4ID4gNyk7Ci0KLQlpZiAoIWNsay0+cGFyZW50KQotCQlyZXR1cm4gMDsKLQogCXBhcmVudF9yYXRlID0gY2xrLT5wYXJlbnQtPmdldF9yYXRlKGNsay0+cGFyZW50KTsKIAljb250cm9sID0gc21fcmVhZGwoJnN5c3RlbV9tYW5hZ2VyLCBQTV9HQ0NUUkwgKyA0ICogY2xrLT5pbmRleCk7CiAKQEAgLTM3MywxMSArMzYyLDggQEAKIHsKIAl1MzIgY29udHJvbDsKIAotCUJVR19PTihjbGstPmluZGV4ID4gNyk7Ci0KIAlwcmludGsoImNsayAlczogbmV3IHBhcmVudCAlcyAod2FzICVzKVxuIiwKLQkgICAgICAgY2xrLT5uYW1lLCBwYXJlbnQtPm5hbWUsCi0JICAgICAgIGNsay0+cGFyZW50ID8gY2xrLT5wYXJlbnQtPm5hbWUgOiAiKG51bGwpIik7CisJICAgICAgIGNsay0+bmFtZSwgcGFyZW50LT5uYW1lLCBjbGstPnBhcmVudC0+bmFtZSk7CiAKIAljb250cm9sID0gc21fcmVhZGwoJnN5c3RlbV9tYW5hZ2VyLCBQTV9HQ0NUUkwgKyA0ICogY2xrLT5pbmRleCk7CiAKQEAgLTM5OSw2ICszODUsMjIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHZvaWQgX19pbml0IGdlbmNsa19pbml0X3BhcmVudChzdHJ1Y3QgY2xrICpjbGspCit7CisJdTMyIGNvbnRyb2w7CisJc3RydWN0IGNsayAqcGFyZW50OworCisJQlVHX09OKGNsay0+aW5kZXggPiA3KTsKKworCWNvbnRyb2wgPSBzbV9yZWFkbCgmc3lzdGVtX21hbmFnZXIsIFBNX0dDQ1RSTCArIDQgKiBjbGstPmluZGV4KTsKKwlpZiAoY29udHJvbCAmIFNNX0JJVChPU0NTRUwpKQorCQlwYXJlbnQgPSAoY29udHJvbCAmIFNNX0JJVChQTExTRUwpKSA/ICZwbGwxIDogJm9zYzE7CisJZWxzZQorCQlwYXJlbnQgPSAoY29udHJvbCAmIFNNX0JJVChQTExTRUwpKSA/ICZwbGwwIDogJm9zYzA7CisKKwljbGstPnBhcmVudCA9IHBhcmVudDsKK30KKwogLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAqICBTeXN0ZW0gcGVyaXBoZXJhbHMKICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC03NTAsOCArNzUyLDQxIEBACiBERUZJTkVfREVWKGF0bWVsX3NwaSwgMSk7CiBERVZfQ0xLKHNwaV9jbGssIGF0bWVsX3NwaTEsIHBiYSwgMSk7CiAKLXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKl9faW5pdCBhdDMyX2FkZF9kZXZpY2Vfc3BpKHVuc2lnbmVkIGludCBpZCkKK3N0YXRpYyB2b2lkCithdDMyX3NwaV9zZXR1cF9zbGF2ZXModW5zaWduZWQgaW50IGJ1c19udW0sIHN0cnVjdCBzcGlfYm9hcmRfaW5mbyAqYiwKKwkJICAgICAgdW5zaWduZWQgaW50IG4sIGNvbnN0IHU4ICpwaW5zKQogeworCXVuc2lnbmVkIGludCBwaW4sIG1vZGU7CisKKwlmb3IgKDsgbjsgbi0tLCBiKyspIHsKKwkJYi0+YnVzX251bSA9IGJ1c19udW07CisJCWlmIChiLT5jaGlwX3NlbGVjdCA+PSA0KQorCQkJY29udGludWU7CisJCXBpbiA9ICh1bnNpZ25lZCliLT5jb250cm9sbGVyX2RhdGE7CisJCWlmICghcGluKSB7CisJCQlwaW4gPSBwaW5zW2ItPmNoaXBfc2VsZWN0XTsKKwkJCWItPmNvbnRyb2xsZXJfZGF0YSA9ICh2b2lkICopcGluOworCQl9CisJCW1vZGUgPSBBVDMyX0dQSU9GX09VVFBVVDsKKwkJaWYgKCEoYi0+bW9kZSAmIFNQSV9DU19ISUdIKSkKKwkJCW1vZGUgfD0gQVQzMl9HUElPRl9ISUdIOworCQlhdDMyX3NlbGVjdF9ncGlvKHBpbiwgbW9kZSk7CisJfQorfQorCitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpfX2luaXQKK2F0MzJfYWRkX2RldmljZV9zcGkodW5zaWduZWQgaW50IGlkLCBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCBuKQoreworCS8qCisJICogTWFuYWdlIHRoZSBjaGlwc2VsZWN0cyBhcyBHUElPcywgbm9ybWFsbHkgdXNpbmcgdGhlIHNhbWUgcGlucworCSAqIHRoZSBTUEkgY29udHJvbGxlciBleHBlY3RzOyBidXQgYm9hcmRzIGNhbiB1c2Ugb3RoZXIgcGlucy4KKwkgKi8KKwlzdGF0aWMgdTggX19pbml0ZGF0YSBzcGkwX3BpbnNbXSA9CisJCXsgR1BJT19QSU5fUEEoMyksIEdQSU9fUElOX1BBKDQpLAorCQkgIEdQSU9fUElOX1BBKDUpLCBHUElPX1BJTl9QQSgyMCksIH07CisJc3RhdGljIHU4IF9faW5pdGRhdGEgc3BpMV9waW5zW10gPQorCQl7IEdQSU9fUElOX1BCKDIpLCBHUElPX1BJTl9QQigzKSwKKwkJICBHUElPX1BJTl9QQig0KSwgR1BJT19QSU5fUEEoMjcpLCB9OwogCXN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXY7CiAKIAlzd2l0Y2ggKGlkKSB7CkBAIC03NjAsMTQgKzc5NSw3IEBACiAJCXNlbGVjdF9wZXJpcGhlcmFsKFBBKDApLCAgUEVSSVBIX0EsIDApOwkvKiBNSVNPCSAqLwogCQlzZWxlY3RfcGVyaXBoZXJhbChQQSgxKSwgIFBFUklQSF9BLCAwKTsJLyogTU9TSQkgKi8KIAkJc2VsZWN0X3BlcmlwaGVyYWwoUEEoMiksICBQRVJJUEhfQSwgMCk7CS8qIFNDSwkgKi8KLQotCQkvKiBOUENTWzI6MF0gKi8KLQkJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQSgzKSwKLQkJCQkgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOwotCQlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BBKDQpLAotCQkJCSBBVDMyX0dQSU9GX09VVFBVVCB8IEFUMzJfR1BJT0ZfSElHSCk7Ci0JCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEEoNSksCi0JCQkJIEFUMzJfR1BJT0ZfT1VUUFVUIHwgQVQzMl9HUElPRl9ISUdIKTsKKwkJYXQzMl9zcGlfc2V0dXBfc2xhdmVzKDAsIGIsIG4sIHNwaTBfcGlucyk7CiAJCWJyZWFrOwogCiAJY2FzZSAxOgpAQCAtNzc1LDIwICs4MDMsMTQgQEAKIAkJc2VsZWN0X3BlcmlwaGVyYWwoUEIoMCksICBQRVJJUEhfQiwgMCk7CS8qIE1JU08gICovCiAJCXNlbGVjdF9wZXJpcGhlcmFsKFBCKDEpLCAgUEVSSVBIX0IsIDApOwkvKiBNT1NJICAqLwogCQlzZWxlY3RfcGVyaXBoZXJhbChQQig1KSwgIFBFUklQSF9CLCAwKTsJLyogU0NLICAgKi8KLQotCQkvKiBOUENTWzI6MF0gKi8KLQkJYXQzMl9zZWxlY3RfZ3BpbyhHUElPX1BJTl9QQigyKSwKLQkJCQkgQVQzMl9HUElPRl9PVVRQVVQgfCBBVDMyX0dQSU9GX0hJR0gpOwotCQlhdDMyX3NlbGVjdF9ncGlvKEdQSU9fUElOX1BCKDMpLAotCQkJCSBBVDMyX0dQSU9GX09VVFBVVCB8IEFUMzJfR1BJT0ZfSElHSCk7Ci0JCWF0MzJfc2VsZWN0X2dwaW8oR1BJT19QSU5fUEIoNCksCi0JCQkJIEFUMzJfR1BJT0ZfT1VUUFVUIHwgQVQzMl9HUElPRl9ISUdIKTsKKwkJYXQzMl9zcGlfc2V0dXBfc2xhdmVzKDEsIGIsIG4sIHNwaTFfcGlucyk7CiAJCWJyZWFrOwogCiAJZGVmYXVsdDoKIAkJcmV0dXJuIE5VTEw7CiAJfQogCisJc3BpX3JlZ2lzdGVyX2JvYXJkX2luZm8oYiwgbik7CiAJcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyKHBkZXYpOwogCXJldHVybiBwZGV2OwogfQpAQCAtODcyLDYgKzg5NCw1MCBAQAogCXJldHVybiBwZGV2OwogfQogCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIEdDTEsKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCitzdGF0aWMgc3RydWN0IGNsayBnY2xrMCA9IHsKKwkubmFtZQkJPSAiZ2NsazAiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gMCwKK307CitzdGF0aWMgc3RydWN0IGNsayBnY2xrMSA9IHsKKwkubmFtZQkJPSAiZ2NsazEiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gMSwKK307CitzdGF0aWMgc3RydWN0IGNsayBnY2xrMiA9IHsKKwkubmFtZQkJPSAiZ2NsazIiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gMiwKK307CitzdGF0aWMgc3RydWN0IGNsayBnY2xrMyA9IHsKKwkubmFtZQkJPSAiZ2NsazMiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gMywKK307CitzdGF0aWMgc3RydWN0IGNsayBnY2xrNCA9IHsKKwkubmFtZQkJPSAiZ2NsazQiLAorCS5tb2RlCQk9IGdlbmNsa19tb2RlLAorCS5nZXRfcmF0ZQk9IGdlbmNsa19nZXRfcmF0ZSwKKwkuc2V0X3JhdGUJPSBnZW5jbGtfc2V0X3JhdGUsCisJLnNldF9wYXJlbnQJPSBnZW5jbGtfc2V0X3BhcmVudCwKKwkuaW5kZXgJCT0gNCwKK307CisKIHN0cnVjdCBjbGsgKmF0MzJfY2xvY2tfbGlzdFtdID0gewogCSZvc2MzMmssCiAJJm9zYzAsCkBAIC05MDgsNiArOTc0LDExIEBACiAJJmF0bWVsX3NwaTFfc3BpX2NsaywKIAkmbGNkYzBfaGNsaywKIAkmbGNkYzBfcGl4Y2xrLAorCSZnY2xrMCwKKwkmZ2NsazEsCisJJmdjbGsyLAorCSZnY2xrMywKKwkmZ2NsazQsCiB9OwogdW5zaWduZWQgaW50IGF0MzJfbnJfY2xvY2tzID0gQVJSQVlfU0laRShhdDMyX2Nsb2NrX2xpc3QpOwogCkBAIC05MzYsNiArMTAwNywxMyBAQAogCWlmIChzbV9yZWFkbChzbSwgUE1fUExMMSkgJiBTTV9CSVQoUExMT1NDKSkKIAkJcGxsMS5wYXJlbnQgPSAmb3NjMTsKIAorCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazApOworCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazEpOworCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazIpOworCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazMpOworCWdlbmNsa19pbml0X3BhcmVudCgmZ2NsazQpOworCWdlbmNsa19pbml0X3BhcmVudCgmbGNkYzBfcGl4Y2xrKTsKKwogCS8qCiAJICogVHVybiBvbiBhbGwgY2xvY2tzIHRoYXQgaGF2ZSBhdCBsZWFzdCBvbmUgdXNlciBhbHJlYWR5LCBhbmQKIAkgKiB0dXJuIG9mZiBldmVyeXRoaW5nIGVsc2UuIFdlIG9ubHkgZG8gdGhpcyBmb3IgbW9kdWxlCmRpZmYgLS1naXQgYS9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMgYi9hcmNoL2F2cjMyL21hY2gtYXQzMmFwL2Nsb2NrLmMKaW5kZXggM2QwZDEwOS4uNDllN2IxMiAxMDA2NDQKLS0tIGEvYXJjaC9hdnIzMi9tYWNoLWF0MzJhcC9jbG9jay5jCisrKyBiL2FyY2gvYXZyMzIvbWFjaC1hdDMyYXAvY2xvY2suYwpAQCAtNjMsNyArNjMsMTEgQEAKIAogc3RhdGljIHZvaWQgX19jbGtfZGlzYWJsZShzdHJ1Y3QgY2xrICpjbGspCiB7Ci0JQlVHX09OKGNsay0+dXNlcnMgPT0gMCk7CisJaWYgKGNsay0+dXNlcnMgPT0gMCkgeworCQlwcmludGsoS0VSTl9FUlIgIiVzOiBtaXNtYXRjaGVkIGRpc2FibGVcbiIsIGNsay0+bmFtZSk7CisJCVdBUk5fT04oMSk7CisJCXJldHVybjsKKwl9CiAKIAlpZiAoLS1jbGstPnVzZXJzID09IDAgJiYgY2xrLT5tb2RlKQogCQljbGstPm1vZGUoY2xrLCAwKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9LY29uZmlnIGIvYXJjaC9pMzg2L0tjb25maWcKaW5kZXggNTk1ZmI3Ny4uMWRmNGExZiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L0tjb25maWcKKysrIGIvYXJjaC9pMzg2L0tjb25maWcKQEAgLTE4LDYgKzE4LDE4IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgQ0xPQ0tTT1VSQ0VfV0FUQ0hET0cKKwlib29sCisJZGVmYXVsdCB5CisKK2NvbmZpZyBHRU5FUklDX0NMT0NLRVZFTlRTCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKKwlib29sCisJZGVmYXVsdCB5CisKIGNvbmZpZyBMT0NLREVQX1NVUFBPUlQKIAlib29sCiAJZGVmYXVsdCB5CkBAIC03NCw2ICs4Niw4IEBACiAKIG1lbnUgIlByb2Nlc3NvciB0eXBlIGFuZCBmZWF0dXJlcyIKIAorc291cmNlICJrZXJuZWwvdGltZS9LY29uZmlnIgorCiBjb25maWcgU01QCiAJYm9vbCAiU3ltbWV0cmljIG11bHRpLXByb2Nlc3Npbmcgc3VwcG9ydCIKIAktLS1oZWxwLS0tCkBAIC0yMDUsNyArMjE5LDcgQEAKIAogY29uZmlnIFZNSQogCWJvb2wgIlZNSSBQYXJhdmlydC1vcHMgc3VwcG9ydCIKLQlkZXBlbmRzIG9uIFBBUkFWSVJUCisJZGVwZW5kcyBvbiBQQVJBVklSVCAmJiAhTk9fSFoKIAlkZWZhdWx0IHkKIAloZWxwCiAJICBWTUkgcHJvdmlkZXMgYSBwYXJhdmlydHVhbGl6ZWQgaW50ZXJmYWNlIHRvIG11bHRpcGxlIGh5cGVydmlzb3JzCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCBjYmU0ZTYwLi40YWUzZGNmIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvTWFrZWZpbGUKQEAgLTE4LDcgKzE4LDcgQEAKIG9iai0kKENPTkZJR19YODZfQ1BVSUQpCQkrPSBjcHVpZC5vCiBvYmotJChDT05GSUdfTUlDUk9DT0RFKQkJKz0gbWljcm9jb2RlLm8KIG9iai0kKENPTkZJR19BUE0pCQkrPSBhcG0ubwotb2JqLSQoQ09ORklHX1g4Nl9TTVApCQkrPSBzbXAubyBzbXBib290Lm8KK29iai0kKENPTkZJR19YODZfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vIHRzY19zeW5jLm8KIG9iai0kKENPTkZJR19YODZfVFJBTVBPTElORSkJKz0gdHJhbXBvbGluZS5vCiBvYmotJChDT05GSUdfWDg2X01QUEFSU0UpCSs9IG1wcGFyc2Uubwogb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkrPSBhcGljLm8gbm1pLm8KQEAgLTMyLDcgKzMyLDYgQEAKIG9iai0kKENPTkZJR19NT0RVTEVTKQkJKz0gbW9kdWxlLm8KIG9iai15CQkJCSs9IHN5c2VudGVyLm8gdnN5c2NhbGwubwogb2JqLSQoQ09ORklHX0FDUElfU1JBVCkgCSs9IHNyYXQubwotb2JqLSQoQ09ORklHX0hQRVRfVElNRVIpIAkrPSB0aW1lX2hwZXQubwogb2JqLSQoQ09ORklHX0VGSSkgCQkrPSBlZmkubyBlZmlfc3R1Yi5vCiBvYmotJChDT05GSUdfRE9VQkxFRkFVTFQpIAkrPSBkb3VibGVmYXVsdC5vCiBvYmotJChDT05GSUdfVk04NikJCSs9IHZtODYubwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYWNwaS9ib290LmMKaW5kZXggZTk0YWZmNi4uZTVlYjk3YSAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jCkBAIC0yNSw2ICsyNSw3IEBACiAKICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGlfcG10bXIuaD4KICNpbmNsdWRlIDxsaW51eC9lZmkuaD4KICNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CkBAIC02MTUsNiArNjE2LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KIAogc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9ocGV0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CkBAIC02NDUsMjQgKzY0NywxMSBAQAogCQlocGV0X3Jlcy0+ZW5kID0gKDEgKiAxMDI0KSAtIDE7CiAJfQogCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCXZ4dGltZS5ocGV0X2FkZHJlc3MgPSBocGV0X3RibC0+YWRkcmVzcy5hZGRyZXNzOwotCisJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHJlc3MuYWRkcmVzczsKIAlwcmludGsoS0VSTl9JTkZPIFBSRUZJWCAiSFBFVCBpZDogJSN4IGJhc2U6ICUjbHhcbiIsCi0JCWhwZXRfdGJsLT5pZCwgdnh0aW1lLmhwZXRfYWRkcmVzcyk7CisJICAgICAgIGhwZXRfdGJsLT5pZCwgaHBldF9hZGRyZXNzKTsKIAotCXJlc19zdGFydCA9IHZ4dGltZS5ocGV0X2FkZHJlc3M7Ci0jZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogWDg2ICovCi0JewotCQlleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7Ci0KLQkJaHBldF9hZGRyZXNzID0gaHBldF90YmwtPmFkZHJlc3MuYWRkcmVzczsKLQkJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIkhQRVQgaWQ6ICUjeCBiYXNlOiAlI2x4XG4iLAotCQkJaHBldF90YmwtPmlkLCBocGV0X2FkZHJlc3MpOwotCi0JCXJlc19zdGFydCA9IGhwZXRfYWRkcmVzczsKLQl9Ci0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgLyogWDg2ICovCisJcmVzX3N0YXJ0ID0gaHBldF9hZGRyZXNzOwogCiAJaWYgKGhwZXRfcmVzKSB7CiAJCWhwZXRfcmVzLT5zdGFydCA9IHJlc19zdGFydDsKQEAgLTY3NiwxMCArNjY1LDYgQEAKICNkZWZpbmUJYWNwaV9wYXJzZV9ocGV0CU5VTEwKICNlbmRpZgogCi0jaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgotZXh0ZXJuIHUzMiBwbXRtcl9pb3BvcnQ7Ci0jZW5kaWYKLQogc3RhdGljIGludCBfX2luaXQgYWNwaV9wYXJzZV9mYWR0KHN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUpCiB7CiAKQEAgLTg2NSwxMCArODUwLDkgQEAKIHN0YXRpYyB2b2lkIF9faW5pdCBhY3BpX3Byb2Nlc3NfbWFkdCh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCWludCBjb3VudCwgZXJyb3I7CisJaW50IGVycm9yOwogCi0JY291bnQgPSBhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX01BRFQsIGFjcGlfcGFyc2VfbWFkdCk7Ci0JaWYgKGNvdW50ID49IDEpIHsKKwlpZiAoIWFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfTUFEVCwgYWNwaV9wYXJzZV9tYWR0KSkgewogCiAJCS8qCiAJCSAqIFBhcnNlIE1BRFQgTEFQSUMgZW50cmllcwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwppbmRleCBmNDE1OWUwLi45NjU1YzIzIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2FwaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwaWMuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGlfcG10bXIuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KQEAgLTQ1LDEyOCArNDcsNTQ5IEBACiAjaW5jbHVkZSAiaW9fcG9ydHMuaCIKIAogLyoKLSAqIGNwdV9tYXNrIHRoYXQgZGVub3RlcyB0aGUgQ1BVcyB0aGF0IG5lZWRzIHRpbWVyIGludGVycnVwdCBjb21pbmcgaW4gYXMKLSAqIElQSXMgaW4gcGxhY2Ugb2YgbG9jYWwgQVBJQyB0aW1lcnMKKyAqIFNhbml0eSBjaGVjawogICovCi1zdGF0aWMgY3B1bWFza190IHRpbWVyX2JjYXN0X2lwaTsKKyNpZiAoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDBGKSAhPSAweDBGCisjIGVycm9yIFNQVVJJT1VTX0FQSUNfVkVDVE9SIGRlZmluaXRpb24gZXJyb3IKKyNlbmRpZgogCiAvKgogICogS25vYiB0byBjb250cm9sIG91ciB3aWxsaW5nbmVzcyB0byBlbmFibGUgdGhlIGxvY2FsIEFQSUMuCisgKgorICogLTE9Zm9yY2UtZGlzYWJsZSwgKzE9Zm9yY2UtZW5hYmxlCiAgKi8KLXN0YXRpYyBpbnQgZW5hYmxlX2xvY2FsX2FwaWMgX19pbml0ZGF0YSA9IDA7IC8qIC0xPWZvcmNlLWRpc2FibGUsICsxPWZvcmNlLWVuYWJsZSAqLworc3RhdGljIGludCBlbmFibGVfbG9jYWxfYXBpYyBfX2luaXRkYXRhID0gMDsKIAotc3RhdGljIGlubGluZSB2b2lkIGxhcGljX2Rpc2FibGUodm9pZCkKLXsKLQllbmFibGVfbG9jYWxfYXBpYyA9IC0xOwotCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIGxhcGljX2VuYWJsZSh2b2lkKQotewotCWVuYWJsZV9sb2NhbF9hcGljID0gMTsKLX0KKy8qIExvY2FsIEFQSUMgdGltZXIgdmVyaWZpY2F0aW9uIG9rICovCitzdGF0aWMgaW50IGxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rOwogCiAvKgotICogRGVidWcgbGV2ZWwKKyAqIERlYnVnIGxldmVsLCBleHBvcnRlZCBmb3IgaW9fYXBpYy5jCiAgKi8KIGludCBhcGljX3ZlcmJvc2l0eTsKIAorc3RhdGljIHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl9yZXN1bHQ7CiAKK3N0YXRpYyBpbnQgbGFwaWNfbmV4dF9ldmVudCh1bnNpZ25lZCBsb25nIGRlbHRhLAorCQkJICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9zZXR1cChlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCk7CitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9icm9hZGNhc3QoY3B1bWFza190IG1hc2spOwogc3RhdGljIHZvaWQgYXBpY19wbV9hY3RpdmF0ZSh2b2lkKTsKIAotc3RhdGljIGludCBtb2Rlcm5fYXBpYyh2b2lkKQorLyoKKyAqIFRoZSBsb2NhbCBhcGljIHRpbWVyIGNhbiBiZSB1c2VkIGZvciBhbnkgZnVuY3Rpb24gd2hpY2ggaXMgQ1BVIGxvY2FsLgorICovCitzdGF0aWMgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSBsYXBpY19jbG9ja2V2ZW50ID0geworCS5uYW1lCQk9ICJsYXBpYyIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9UCisJCQl8IENMT0NLX0VWVF9GRUFUX0MzU1RPUCB8IENMT0NLX0VWVF9GRUFUX0RVTU1ZLAorCS5zaGlmdAkJPSAzMiwKKwkuc2V0X21vZGUJPSBsYXBpY190aW1lcl9zZXR1cCwKKwkuc2V0X25leHRfZXZlbnQJPSBsYXBpY19uZXh0X2V2ZW50LAorCS5icm9hZGNhc3QJPSBsYXBpY190aW1lcl9icm9hZGNhc3QsCisJLnJhdGluZwkJPSAxMDAsCisJLmlycQkJPSAtMSwKK307CitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSwgbGFwaWNfZXZlbnRzKTsKKworLyogTG9jYWwgQVBJQyB3YXMgZGlzYWJsZWQgYnkgdGhlIEJJT1MgYW5kIGVuYWJsZWQgYnkgdGhlIGtlcm5lbCAqLworc3RhdGljIGludCBlbmFibGVkX3ZpYV9hcGljYmFzZTsKKworLyoKKyAqIEdldCB0aGUgTEFQSUMgdmVyc2lvbgorICovCitzdGF0aWMgaW5saW5lIGludCBsYXBpY19nZXRfdmVyc2lvbih2b2lkKQogewotCXVuc2lnbmVkIGludCBsdnIsIHZlcnNpb247Ci0JLyogQU1EIHN5c3RlbXMgdXNlIG9sZCBBUElDIHZlcnNpb25zLCBzbyBjaGVjayB0aGUgQ1BVICovCi0JaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCAmJgotCQlib290X2NwdV9kYXRhLng4NiA+PSAweGYpCi0JCXJldHVybiAxOwotCWx2ciA9IGFwaWNfcmVhZChBUElDX0xWUik7Ci0JdmVyc2lvbiA9IEdFVF9BUElDX1ZFUlNJT04obHZyKTsKLQlyZXR1cm4gdmVyc2lvbiA+PSAweDE0OworCXJldHVybiBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwogfQogCiAvKgotICogJ3doYXQgc2hvdWxkIHdlIGRvIGlmIHdlIGdldCBhIGh3IGlycSBldmVudCBvbiBhbiBpbGxlZ2FsIHZlY3RvcicuCi0gKiBlYWNoIGFyY2hpdGVjdHVyZSBoYXMgdG8gYW5zd2VyIHRoaXMgdGhlbXNlbHZlcy4KKyAqIENoZWNrLCBpZiB0aGUgQVBJQyBpcyBpbnRlZ3JhdGVkIG9yIGEgc2VwZXJhdGUgY2hpcAogICovCi12b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgaW5saW5lIGludCBsYXBpY19pc19pbnRlZ3JhdGVkKHZvaWQpCiB7Ci0JcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOwotCS8qCi0JICogQ3VycmVudGx5IHVuZXhwZWN0ZWQgdmVjdG9ycyBoYXBwZW4gb25seSBvbiBTTVAgYW5kIEFQSUMuCi0JICogV2UgX211c3RfIGFjayB0aGVzZSBiZWNhdXNlIGV2ZXJ5IGxvY2FsIEFQSUMgaGFzIG9ubHkgTgotCSAqIGlycSBzbG90cyBwZXIgcHJpb3JpdHkgbGV2ZWwsIGFuZCBhICdoYW5naW5nLCB1bmFja2VkJyBJUlEKLQkgKiBob2xkcyB1cCBhbiBpcnEgc2xvdCAtIGluIGV4Y2Vzc2l2ZSBjYXNlcyAod2hlbiBtdWx0aXBsZQotCSAqIHVuZXhwZWN0ZWQgdmVjdG9ycyBvY2N1cikgdGhhdCBtaWdodCBsb2NrIHVwIHRoZSBBUElDCi0JICogY29tcGxldGVseS4KLQkgKiBCdXQgb25seSBhY2sgd2hlbiB0aGUgQVBJQyBpcyBlbmFibGVkIC1BSwotCSAqLwotCWlmIChjcHVfaGFzX2FwaWMpCi0JCWFja19BUElDX2lycSgpOworCXJldHVybiBBUElDX0lOVEVHUkFURUQobGFwaWNfZ2V0X3ZlcnNpb24oKSk7CiB9CiAKLXZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCisvKgorICogQ2hlY2ssIHdoZXRoZXIgdGhpcyBpcyBhIG1vZGVybiBvciBhIGZpcnN0IGdlbmVyYXRpb24gQVBJQworICovCitzdGF0aWMgaW50IG1vZGVybl9hcGljKHZvaWQpCiB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCXNtcF9pbnRyX2luaXQoKTsKLSNlbmRpZgotCS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAqLwotCXNldF9pbnRyX2dhdGUoTE9DQUxfVElNRVJfVkVDVE9SLCBhcGljX3RpbWVyX2ludGVycnVwdCk7Ci0KLQkvKiBJUEkgdmVjdG9ycyBmb3IgQVBJQyBzcHVyaW91cyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLwotCXNldF9pbnRyX2dhdGUoU1BVUklPVVNfQVBJQ19WRUNUT1IsIHNwdXJpb3VzX2ludGVycnVwdCk7Ci0Jc2V0X2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKLQotCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCi0jaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCi0Jc2V0X2ludHJfZ2F0ZShUSEVSTUFMX0FQSUNfVkVDVE9SLCB0aGVybWFsX2ludGVycnVwdCk7Ci0jZW5kaWYKKwkvKiBBTUQgc3lzdGVtcyB1c2Ugb2xkIEFQSUMgdmVyc2lvbnMsIHNvIGNoZWNrIHRoZSBDUFUgKi8KKwlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EICYmCisJICAgIGJvb3RfY3B1X2RhdGEueDg2ID49IDB4ZikKKwkJcmV0dXJuIDE7CisJcmV0dXJuIGxhcGljX2dldF92ZXJzaW9uKCkgPj0gMHgxNDsKIH0KIAotLyogVXNpbmcgQVBJQyB0byBnZW5lcmF0ZSBzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0PyAqLwotaW50IHVzaW5nX2FwaWNfdGltZXIgX19yZWFkX21vc3RseSA9IDA7Ci0KLXN0YXRpYyBpbnQgZW5hYmxlZF92aWFfYXBpY2Jhc2U7Ci0KKy8qKgorICogZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgLSBlbmFibGUgTk1JIHRocm91Z2ggbG9jYWwgdmVjdG9yIHRhYmxlIDAKKyAqLwogdm9pZCBlbmFibGVfTk1JX3Rocm91Z2hfTFZUMCAodm9pZCAqIGR1bW15KQogewotCXVuc2lnbmVkIGludCB2LCB2ZXI7CisJdW5zaWduZWQgaW50IHYgPSBBUElDX0RNX05NSTsKIAotCXZlciA9IGFwaWNfcmVhZChBUElDX0xWUik7Ci0JdmVyID0gR0VUX0FQSUNfVkVSU0lPTih2ZXIpOwotCXYgPSBBUElDX0RNX05NSTsJCQkvKiB1bm1hc2sgYW5kIHNldCB0byBOTUkgKi8KLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCS8qIExldmVsIHRyaWdnZXJlZCBmb3IgODI0ODlEWCAqLworCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQogCQl2IHw9IEFQSUNfTFZUX0xFVkVMX1RSSUdHRVI7CiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2KTsKIH0KIAorLyoqCisgKiBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0IC0gR2V0IG51bWJlciBvZiBwaHlzaWNhbCBicm9hZGNhc3QgSURzCisgKi8KIGludCBnZXRfcGh5c2ljYWxfYnJvYWRjYXN0KHZvaWQpCiB7Ci0JaWYgKG1vZGVybl9hcGljKCkpCi0JCXJldHVybiAweGZmOwotCWVsc2UKLQkJcmV0dXJuIDB4ZjsKKwlyZXR1cm4gbW9kZXJuX2FwaWMoKSA/IDB4ZmYgOiAweGY7CiB9CiAKLWludCBnZXRfbWF4bHZ0KHZvaWQpCisvKioKKyAqIGxhcGljX2dldF9tYXhsdnQgLSBnZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxvY2FsIHZlY3RvciB0YWJsZSBlbnRyaWVzCisgKi8KK2ludCBsYXBpY19nZXRfbWF4bHZ0KHZvaWQpCiB7Ci0JdW5zaWduZWQgaW50IHYsIHZlciwgbWF4bHZ0OworCXVuc2lnbmVkIGludCB2ID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKIAotCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odik7CiAJLyogODI0ODlEWHMgZG8gbm90IHJlcG9ydCAjIG9mIExWVCBlbnRyaWVzLiAqLwotCW1heGx2dCA9IEFQSUNfSU5URUdSQVRFRCh2ZXIpID8gR0VUX0FQSUNfTUFYTFZUKHYpIDogMjsKLQlyZXR1cm4gbWF4bHZ0OworCXJldHVybiBBUElDX0lOVEVHUkFURUQoR0VUX0FQSUNfVkVSU0lPTih2KSkgPyBHRVRfQVBJQ19NQVhMVlQodikgOiAyOwogfQogCisvKgorICogTG9jYWwgQVBJQyB0aW1lcgorICovCisKKy8qIENsb2NrIGRpdmlzb3IgaXMgc2V0IHRvIDE2ICovCisjZGVmaW5lIEFQSUNfRElWSVNPUiAxNgorCisvKgorICogVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBsb2NhbCBBUElDIHRpbWVyLCB3aXRoIGEgdGltZW91dCBvZgorICogJ2Nsb2NrcycgQVBJQyBidXMgY2xvY2suIER1cmluZyBjYWxpYnJhdGlvbiB3ZSBhY3R1YWxseSBjYWxsCisgKiB0aGlzIGZ1bmN0aW9uIHR3aWNlIG9uIHRoZSBib290IENQVSwgb25jZSB3aXRoIGEgYm9ndXMgdGltZW91dAorICogdmFsdWUsIHNlY29uZCB0aW1lIGZvciByZWFsLiBUaGUgb3RoZXIgKG5vbmNhbGlicmF0aW5nKSBDUFVzCisgKiBjYWxsIHRoaXMgZnVuY3Rpb24gb25seSBvbmNlLCB3aXRoIHRoZSByZWFsLCBjYWxpYnJhdGVkIHZhbHVlLgorICoKKyAqIFdlIGRvIHJlYWRzIGJlZm9yZSB3cml0ZXMgZXZlbiBpZiB1bm5lY2Vzc2FyeSwgdG8gZ2V0IGFyb3VuZCB0aGUKKyAqIFA1IEFQSUMgZG91YmxlIHdyaXRlIGJ1Zy4KKyAqLworc3RhdGljIHZvaWQgX19zZXR1cF9BUElDX0xWVFQodW5zaWduZWQgaW50IGNsb2NrcywgaW50IG9uZXNob3QsIGludCBpcnFlbikKK3sKKwl1bnNpZ25lZCBpbnQgbHZ0dF92YWx1ZSwgdG1wX3ZhbHVlOworCisJbHZ0dF92YWx1ZSA9IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKKwlpZiAoIW9uZXNob3QpCisJCWx2dHRfdmFsdWUgfD0gQVBJQ19MVlRfVElNRVJfUEVSSU9ESUM7CisJaWYgKCFsYXBpY19pc19pbnRlZ3JhdGVkKCkpCisJCWx2dHRfdmFsdWUgfD0gU0VUX0FQSUNfVElNRVJfQkFTRShBUElDX1RJTUVSX0JBU0VfRElWKTsKKworCWlmICghaXJxZW4pCisJCWx2dHRfdmFsdWUgfD0gQVBJQ19MVlRfTUFTS0VEOworCisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCBsdnR0X3ZhbHVlKTsKKworCS8qCisJICogRGl2aWRlIFBJQ0xLIGJ5IDE2CisJICovCisJdG1wX3ZhbHVlID0gYXBpY19yZWFkKEFQSUNfVERDUik7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19URENSLCAodG1wX3ZhbHVlCisJCQkJJiB+KEFQSUNfVERSX0RJVl8xIHwgQVBJQ19URFJfRElWX1RNQkFTRSkpCisJCQkJfCBBUElDX1REUl9ESVZfMTYpOworCisJaWYgKCFvbmVzaG90KQorCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1RNSUNULCBjbG9ja3MvQVBJQ19ESVZJU09SKTsKK30KKworLyoKKyAqIFByb2dyYW0gdGhlIG5leHQgZXZlbnQsIHJlbGF0aXZlIHRvIG5vdworICovCitzdGF0aWMgaW50IGxhcGljX25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKwkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJYXBpY193cml0ZV9hcm91bmQoQVBJQ19UTUlDVCwgZGVsdGEpOworCXJldHVybiAwOworfQorCisvKgorICogU2V0dXAgdGhlIGxhcGljIHRpbWVyIGluIHBlcmlvZGljIG9yIG9uZXNob3QgbW9kZQorICovCitzdGF0aWMgdm9pZCBsYXBpY190aW1lcl9zZXR1cChlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgICAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCB2OworCisJLyogTGFwaWMgdXNlZCBmb3IgYnJvYWRjYXN0ID8gKi8KKwlpZiAoIWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzd2l0Y2ggKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfT05FU0hPVDoKKwkJX19zZXR1cF9BUElDX0xWVFQoY2FsaWJyYXRpb25fcmVzdWx0LAorCQkJCSAgbW9kZSAhPSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQywgMSk7CisJCWJyZWFrOworCWNhc2UgQ0xPQ0tfRVZUX01PREVfVU5VU0VEOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwkJdiB8PSAoQVBJQ19MVlRfTUFTS0VEIHwgTE9DQUxfVElNRVJfVkVDVE9SKTsKKwkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlRULCB2KTsKKwkJYnJlYWs7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogTG9jYWwgQVBJQyB0aW1lciBicm9hZGNhc3QgZnVuY3Rpb24KKyAqLworc3RhdGljIHZvaWQgbGFwaWNfdGltZXJfYnJvYWRjYXN0KGNwdW1hc2tfdCBtYXNrKQoreworI2lmZGVmIENPTkZJR19TTVAKKwlzZW5kX0lQSV9tYXNrKG1hc2ssIExPQ0FMX1RJTUVSX1ZFQ1RPUik7CisjZW5kaWYKK30KKworLyoKKyAqIFNldHVwIHRoZSBsb2NhbCBBUElDIHRpbWVyIGZvciB0aGlzIENQVS4gQ29weSB0aGUgaW5pdGlsaXplZCB2YWx1ZXMKKyAqIG9mIHRoZSBib290IENQVSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IGluIHRoZSBmcmFtZXdvcmsuCisgKi8KK3N0YXRpYyB2b2lkIF9fZGV2aW5pdCBzZXR1cF9BUElDX3RpbWVyKHZvaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbGV2dCA9ICZfX2dldF9jcHVfdmFyKGxhcGljX2V2ZW50cyk7CisKKwltZW1jcHkobGV2dCwgJmxhcGljX2Nsb2NrZXZlbnQsIHNpemVvZigqbGV2dCkpOworCWxldnQtPmNwdW1hc2sgPSBjcHVtYXNrX29mX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpOworCisJY2xvY2tldmVudHNfcmVnaXN0ZXJfZGV2aWNlKGxldnQpOworfQorCisvKgorICogSW4gdGhpcyBmdW5jdGlvbnMgd2UgY2FsaWJyYXRlIEFQSUMgYnVzIGNsb2NrcyB0byB0aGUgZXh0ZXJuYWwgdGltZXIuCisgKgorICogV2Ugd2FudCB0byBkbyB0aGUgY2FsaWJyYXRpb24gb25seSBvbmNlIHNpbmNlIHdlIHdhbnQgdG8gaGF2ZSBsb2NhbCB0aW1lcgorICogaXJxcyBzeW5jcm9uLiBDUFVzIGNvbm5lY3RlZCBieSB0aGUgc2FtZSBBUElDIGJ1cyBoYXZlIHRoZSB2ZXJ5IHNhbWUgYnVzCisgKiBmcmVxdWVuY3kuCisgKgorICogVGhpcyB3YXMgcHJldmlvdXNseSBkb25lIGJ5IHJlYWRpbmcgdGhlIFBJVC9IUEVUIGFuZCB3YWl0aW5nIGZvciBhIHdyYXAKKyAqIGFyb3VuZCB0byBmaW5kIG91dCwgdGhhdCBhIHRpY2sgaGFzIGVsYXBzZWQuIEkgaGF2ZSBhIGJveCwgd2hlcmUgdGhlIFBJVAorICogcmVhZG91dCBpcyBicm9rZW4sIHNvIGl0IG5ldmVyIGdldHMgb3V0IG9mIHRoZSB3YWl0IGxvb3AgYWdhaW4uIFRoaXMgd2FzCisgKiBhbHNvIHJlcG9ydGVkIGJ5IG90aGVycy4KKyAqCisgKiBNb25pdG9yaW5nIHRoZSBqaWZmaWVzIHZhbHVlIGlzIGluYWNjdXJhdGUgYW5kIHRoZSBjbG9ja2V2ZW50cworICogaW5mcmFzdHJ1Y3R1cmUgYWxsb3dzIHVzIHRvIGRvIGEgc2ltcGxlIHN1YnN0aXR1dGlvbiBvZiB0aGUgaW50ZXJydXB0CisgKiBoYW5kbGVyLgorICoKKyAqIFRoZSBjYWxpYnJhdGlvbiByb3V0aW5lIGFsc28gdXNlcyB0aGUgcG1fdGltZXIgd2hlbiBwb3NzaWJsZSwgYXMgdGhlIFBJVAorICogaGFwcGVucyB0byBydW4gd2F5IHRvbyBzbG93IChmYWN0b3IgMi4zIG9uIG15IFZBSU8gQ29yZUR1bywgd2hpY2ggZ29lcworICogYmFjayB0byBub3JtYWwgbGF0ZXIgaW4gdGhlIGJvb3QgcHJvY2VzcykuCisgKi8KKworI2RlZmluZSBMQVBJQ19DQUxfTE9PUFMJCShIWi8xMCkKKworc3RhdGljIF9faW5pdGRhdGEgdm9sYXRpbGUgaW50IGxhcGljX2NhbF9sb29wcyA9IC0xOworc3RhdGljIF9faW5pdGRhdGEgbG9uZyBsYXBpY19jYWxfdDEsIGxhcGljX2NhbF90MjsKK3N0YXRpYyBfX2luaXRkYXRhIHVuc2lnbmVkIGxvbmcgbG9uZyBsYXBpY19jYWxfdHNjMSwgbGFwaWNfY2FsX3RzYzI7CitzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBsb25nIGxhcGljX2NhbF9wbTEsIGxhcGljX2NhbF9wbTI7CitzdGF0aWMgX19pbml0ZGF0YSB1bnNpZ25lZCBsb25nIGxhcGljX2NhbF9qMSwgbGFwaWNfY2FsX2oyOworCisvKgorICogVGVtcG9yYXJ5IGludGVycnVwdCBoYW5kbGVyLgorICovCitzdGF0aWMgdm9pZCBfX2luaXQgbGFwaWNfY2FsX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0c2MgPSAwOworCWxvbmcgdGFwaWMgPSBhcGljX3JlYWQoQVBJQ19UTUNDVCk7CisJdW5zaWduZWQgbG9uZyBwbSA9IGFjcGlfcG1fcmVhZF9lYXJseSgpOworCisJaWYgKGNwdV9oYXNfdHNjKQorCQlyZHRzY2xsKHRzYyk7CisKKwlzd2l0Y2ggKGxhcGljX2NhbF9sb29wcysrKSB7CisJY2FzZSAwOgorCQlsYXBpY19jYWxfdDEgPSB0YXBpYzsKKwkJbGFwaWNfY2FsX3RzYzEgPSB0c2M7CisJCWxhcGljX2NhbF9wbTEgPSBwbTsKKwkJbGFwaWNfY2FsX2oxID0gamlmZmllczsKKwkJYnJlYWs7CisKKwljYXNlIExBUElDX0NBTF9MT09QUzoKKwkJbGFwaWNfY2FsX3QyID0gdGFwaWM7CisJCWxhcGljX2NhbF90c2MyID0gdHNjOworCQlpZiAocG0gPCBsYXBpY19jYWxfcG0xKQorCQkJcG0gKz0gQUNQSV9QTV9PVlJSVU47CisJCWxhcGljX2NhbF9wbTIgPSBwbTsKKwkJbGFwaWNfY2FsX2oyID0gamlmZmllczsKKwkJYnJlYWs7CisJfQorfQorCisvKgorICogU2V0dXAgdGhlIGJvb3QgQVBJQworICoKKyAqIENhbGlicmF0ZSBhbmQgdmVyaWZ5IHRoZSByZXN1bHQuCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX2Jvb3RfQVBJQ19jbG9jayh2b2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmxldnQgPSAmX19nZXRfY3B1X3ZhcihsYXBpY19ldmVudHMpOworCWNvbnN0IGxvbmcgcG1fMTAwbXMgPSBQTVRNUl9USUNLU19QRVJfU0VDLzEwOworCWNvbnN0IGxvbmcgcG1fdGhyZXNoID0gcG1fMTAwbXMvMTAwOworCXZvaWQgKCpyZWFsX2hhbmRsZXIpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CisJdW5zaWduZWQgbG9uZyBkZWx0YWo7CisJbG9uZyBkZWx0YSwgZGVsdGFwbTsKKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIlVzaW5nIGxvY2FsIEFQSUMgdGltZXIgaW50ZXJydXB0cy5cbiIKKwkJICAgICJjYWxpYnJhdGluZyBBUElDIHRpbWVyIC4uLlxuIik7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogUmVwbGFjZSB0aGUgZ2xvYmFsIGludGVycnVwdCBoYW5kbGVyICovCisJcmVhbF9oYW5kbGVyID0gZ2xvYmFsX2Nsb2NrX2V2ZW50LT5ldmVudF9oYW5kbGVyOworCWdsb2JhbF9jbG9ja19ldmVudC0+ZXZlbnRfaGFuZGxlciA9IGxhcGljX2NhbF9oYW5kbGVyOworCisJLyoKKwkgKiBTZXR1cCB0aGUgQVBJQyBjb3VudGVyIHRvIDFlOS4gVGhlcmUgaXMgbm8gd2F5IHRoZSBsYXBpYworCSAqIGNhbiB1bmRlcmZsb3cgaW4gdGhlIDEwMG1zIGRldGVjdGlvbiB0aW1lIGZyYW1lCisJICovCisJX19zZXR1cF9BUElDX0xWVFQoMTAwMDAwMDAwMCwgMCwgMCk7CisKKwkvKiBMZXQgdGhlIGludGVycnVwdHMgcnVuICovCisJbG9jYWxfaXJxX2VuYWJsZSgpOworCisJd2hpbGUobGFwaWNfY2FsX2xvb3BzIDw9IExBUElDX0NBTF9MT09QUyk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCisJLyogUmVzdG9yZSB0aGUgcmVhbCBldmVudCBoYW5kbGVyICovCisJZ2xvYmFsX2Nsb2NrX2V2ZW50LT5ldmVudF9oYW5kbGVyID0gcmVhbF9oYW5kbGVyOworCisJLyogQnVpbGQgZGVsdGEgdDEtdDIgYXMgYXBpYyB0aW1lciBjb3VudHMgZG93biAqLworCWRlbHRhID0gbGFwaWNfY2FsX3QxIC0gbGFwaWNfY2FsX3QyOworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLiBsYXBpYyBkZWx0YSA9ICVsZFxuIiwgZGVsdGEpOworCisJLyogQ2hlY2ssIGlmIHRoZSBQTSB0aW1lciBpcyBhdmFpbGFibGUgKi8KKwlkZWx0YXBtID0gbGFwaWNfY2FsX3BtMiAtIGxhcGljX2NhbF9wbTE7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIGRlbHRhID0gJWxkXG4iLCBkZWx0YXBtKTsKKworCWlmIChkZWx0YXBtKSB7CisJCXVuc2lnbmVkIGxvbmcgbXVsdDsKKwkJdTY0IHJlczsKKworCQltdWx0ID0gY2xvY2tzb3VyY2VfaHoybXVsdChQTVRNUl9USUNLU19QRVJfU0VDLCAyMik7CisKKwkJaWYgKGRlbHRhcG0gPiAocG1fMTAwbXMgLSBwbV90aHJlc2gpICYmCisJCSAgICBkZWx0YXBtIDwgKHBtXzEwMG1zICsgcG1fdGhyZXNoKSkgeworCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIHJlc3VsdCBva1xuIik7CisJCX0gZWxzZSB7CisJCQlyZXMgPSAoKCh1NjQpIGRlbHRhcG0pICogIG11bHQpID4+IDIyOworCQkJZG9fZGl2KHJlcywgMTAwMDAwMCk7CisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJBUElDIGNhbGlicmF0aW9uIG5vdCBjb25zaXN0ZW50ICIKKwkJCSAgICAgICAid2l0aCBQTSBUaW1lcjogJWxkbXMgaW5zdGVhZCBvZiAxMDBtc1xuIiwKKwkJCSAgICAgICAobG9uZylyZXMpOworCQkJLyogQ29ycmVjdCB0aGUgbGFwaWMgY291bnRlciB2YWx1ZSAqLworCQkJcmVzID0gKCgodTY0KSBkZWx0YSApICogcG1fMTAwbXMpOworCQkJZG9fZGl2KHJlcywgZGVsdGFwbSk7CisJCQlwcmludGsoS0VSTl9JTkZPICJBUElDIGRlbHRhIGFkanVzdGVkIHRvIFBNLVRpbWVyOiAiCisJCQkgICAgICAgIiVsdSAoJWxkKVxuIiwgKHVuc2lnbmVkIGxvbmcpIHJlcywgZGVsdGEpOworCQkJZGVsdGEgPSAobG9uZykgcmVzOworCQl9CisJfQorCisJLyogQ2FsY3VsYXRlIHRoZSBzY2FsZWQgbWF0aCBtdWx0aXBsaWNhdGlvbiBmYWN0b3IgKi8KKwlsYXBpY19jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoZGVsdGEsIFRJQ0tfTlNFQyAqIExBUElDX0NBTF9MT09QUywgMzIpOworCWxhcGljX2Nsb2NrZXZlbnQubWF4X2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweDdGRkZGRiwgJmxhcGljX2Nsb2NrZXZlbnQpOworCWxhcGljX2Nsb2NrZXZlbnQubWluX2RlbHRhX25zID0KKwkJY2xvY2tldmVudF9kZWx0YTJucygweEYsICZsYXBpY19jbG9ja2V2ZW50KTsKKworCWNhbGlicmF0aW9uX3Jlc3VsdCA9IChkZWx0YSAqIEFQSUNfRElWSVNPUikgLyBMQVBJQ19DQUxfTE9PUFM7CisKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBkZWx0YSAlbGRcbiIsIGRlbHRhKTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBtdWx0OiAlbGRcbiIsIGxhcGljX2Nsb2NrZXZlbnQubXVsdCk7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uLi4gY2FsaWJyYXRpb24gcmVzdWx0OiAldVxuIiwKKwkJICAgIGNhbGlicmF0aW9uX3Jlc3VsdCk7CisKKwlpZiAoY3B1X2hhc190c2MpIHsKKwkJZGVsdGEgPSAobG9uZykobGFwaWNfY2FsX3RzYzIgLSBsYXBpY19jYWxfdHNjMSk7CisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIENQVSBjbG9jayBzcGVlZCBpcyAiCisJCQkgICAgIiVsZC4lMDRsZCBNSHouXG4iLAorCQkJICAgIChkZWx0YSAvIExBUElDX0NBTF9MT09QUykgLyAoMTAwMDAwMCAvIEhaKSwKKwkJCSAgICAoZGVsdGEgLyBMQVBJQ19DQUxfTE9PUFMpICUgKDEwMDAwMDAgLyBIWikpOworCX0KKworCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLi4uIGhvc3QgYnVzIGNsb2NrIHNwZWVkIGlzICIKKwkJICAgICIldS4lMDR1IE1Iei5cbiIsCisJCSAgICBjYWxpYnJhdGlvbl9yZXN1bHQgLyAoMTAwMDAwMCAvIEhaKSwKKwkJICAgIGNhbGlicmF0aW9uX3Jlc3VsdCAlICgxMDAwMDAwIC8gSFopKTsKKworCisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIHZlcmlmeSBBUElDIHRpbWVyXG4iKTsKKworCS8qCisJICogU2V0dXAgdGhlIGFwaWMgdGltZXIgbWFudWFsbHkKKwkgKi8KKwlsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vayA9IDE7CisJbGV2dC0+ZXZlbnRfaGFuZGxlciA9IGxhcGljX2NhbF9oYW5kbGVyOworCWxhcGljX3RpbWVyX3NldHVwKENMT0NLX0VWVF9NT0RFX1BFUklPRElDLCBsZXZ0KTsKKwlsYXBpY19jYWxfbG9vcHMgPSAtMTsKKworCS8qIExldCB0aGUgaW50ZXJydXB0cyBydW4gKi8KKwlsb2NhbF9pcnFfZW5hYmxlKCk7CisKKwl3aGlsZShsYXBpY19jYWxfbG9vcHMgPD0gTEFQSUNfQ0FMX0xPT1BTKTsKKworCWxvY2FsX2lycV9kaXNhYmxlKCk7CisKKwkvKiBTdG9wIHRoZSBsYXBpYyB0aW1lciAqLworCWxhcGljX3RpbWVyX3NldHVwKENMT0NLX0VWVF9NT0RFX1NIVVRET1dOLCBsZXZ0KTsKKworCWxvY2FsX2lycV9lbmFibGUoKTsKKworCS8qIEppZmZpZXMgZGVsdGEgKi8KKwlkZWx0YWogPSBsYXBpY19jYWxfajIgLSBsYXBpY19jYWxfajE7CisJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIGppZmZpZXMgZGVsdGEgPSAlbHVcbiIsIGRlbHRhaik7CisKKwkvKiBDaGVjaywgaWYgdGhlIFBNIHRpbWVyIGlzIGF2YWlsYWJsZSAqLworCWRlbHRhcG0gPSBsYXBpY19jYWxfcG0yIC0gbGFwaWNfY2FsX3BtMTsKKwlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4gUE0gdGltZXIgZGVsdGEgPSAlbGRcbiIsIGRlbHRhcG0pOworCisJbG9jYWxfYXBpY190aW1lcl92ZXJpZnlfb2sgPSAwOworCisJaWYgKGRlbHRhcG0pIHsKKwkJaWYgKGRlbHRhcG0gPiAocG1fMTAwbXMgLSBwbV90aHJlc2gpICYmCisJCSAgICBkZWx0YXBtIDwgKHBtXzEwMG1zICsgcG1fdGhyZXNoKSkgeworCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uIFBNIHRpbWVyIHJlc3VsdCBva1xuIik7CisJCQkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgcmVzdWx0IGlzIGNvbnNpc3RlbnQgKi8KKwkJCWlmIChkZWx0YWogPCBMQVBJQ19DQUxfTE9PUFMtMiB8fAorCQkJICAgIGRlbHRhaiA+IExBUElDX0NBTF9MT09QUysyKSB7CisJCQkJLyoKKwkJCQkgKiBOb3Qgc3VyZSwgd2hhdCB3ZSBjYW4gZG8gYWJvdXQgdGhpcyBvbmUuCisJCQkJICogV2hlbiBoaWdoIHJlc3VsdGlvbiB0aW1lcnMgYXJlIGFjdGl2ZQorCQkJCSAqIGFuZCB0aGUgbGFwaWMgdGltZXIgZG9lcyBub3Qgc3RvcCBpbiBDMworCQkJCSAqIHdlIGFyZSBmaW5lLiBPdGhlcndpc2UgbW9yZSB0cm91YmxlIG1pZ2h0CisJCQkJICogYmUgd2FpdGluZy4gLS0gdGdseAorCQkJCSAqLworCQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkdsb2JhbCBldmVudCBkZXZpY2UgJXMgIgorCQkJCSAgICAgICAiaGFzIHdyb25nIGZyZXF1ZW5jeSAiCisJCQkJICAgICAgICIoJWx1IHRpY2tzIGluc3RlYWQgb2YgJWQpXG4iLAorCQkJCSAgICAgICBnbG9iYWxfY2xvY2tfZXZlbnQtPm5hbWUsIGRlbHRhaiwKKwkJCQkgICAgICAgTEFQSUNfQ0FMX0xPT1BTKTsKKwkJCX0KKwkJCWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rID0gMTsKKwkJfQorCX0gZWxzZSB7CisJCS8qIENoZWNrLCBpZiB0aGUgamlmZmllcyByZXN1bHQgaXMgY29uc2lzdGVudCAqLworCQlpZiAoZGVsdGFqID49IExBUElDX0NBTF9MT09QUy0yICYmCisJCSAgICBkZWx0YWogPD0gTEFQSUNfQ0FMX0xPT1BTKzIpIHsKKwkJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgIi4uLiBqaWZmaWVzIHJlc3VsdCBva1xuIik7CisJCQlsb2NhbF9hcGljX3RpbWVyX3ZlcmlmeV9vayA9IDE7CisJCX0KKwl9CisKKwlpZiAoIWxvY2FsX2FwaWNfdGltZXJfdmVyaWZ5X29rKSB7CisJCXByaW50ayhLRVJOX1dBUk5JTkcKKwkJICAgICAgICJBUElDIHRpbWVyIGRpc2FibGVkIGR1ZSB0byB2ZXJpZmljYXRpb24gZmFpbHVyZS5cbiIpOworCQkvKiBObyBicm9hZGNhc3Qgb24gVVAgISAqLworCQlpZiAobnVtX3Bvc3NpYmxlX2NwdXMoKSA9PSAxKQorCQkJcmV0dXJuOworCX0gZWxzZQorCQlsYXBpY19jbG9ja2V2ZW50LmZlYXR1cmVzICY9IH5DTE9DS19FVlRfRkVBVF9EVU1NWTsKKworCS8qIFNldHVwIHRoZSBsYXBpYyBvciByZXF1ZXN0IHRoZSBicm9hZGNhc3QgKi8KKwlzZXR1cF9BUElDX3RpbWVyKCk7Cit9CisKK3ZvaWQgX19kZXZpbml0IHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrKHZvaWQpCit7CisJc2V0dXBfQVBJQ190aW1lcigpOworfQorCisvKgorICogVGhlIGd1dHMgb2YgdGhlIGFwaWMgdGltZXIgaW50ZXJydXB0CisgKi8KK3N0YXRpYyB2b2lkIGxvY2FsX2FwaWNfdGltZXJfaW50ZXJydXB0KHZvaWQpCit7CisJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQgPSAmcGVyX2NwdShsYXBpY19ldmVudHMsIGNwdSk7CisKKwkvKgorCSAqIE5vcm1hbGx5IHdlIHNob3VsZCBub3QgYmUgaGVyZSB0aWxsIExBUElDIGhhcyBiZWVuIGluaXRpYWxpemVkIGJ1dAorCSAqIGluIHNvbWUgY2FzZXMgbGlrZSBrZHVtcCwgaXRzIHBvc3NpYmxlIHRoYXQgdGhlcmUgaXMgYSBwZW5kaW5nIExBUElDCisJICogdGltZXIgaW50ZXJydXB0IGZyb20gcHJldmlvdXMga2VybmVsJ3MgY29udGV4dCBhbmQgaXMgZGVsaXZlcmVkIGluCisJICogbmV3IGtlcm5lbCB0aGUgbW9tZW50IGludGVycnVwdHMgYXJlIGVuYWJsZWQuCisJICoKKwkgKiBJbnRlcnJ1cHRzIGFyZSBlbmFibGVkIGVhcmx5IGFuZCBMQVBJQyBpcyBzZXR1cCBtdWNoIGxhdGVyLCBoZW5jZQorCSAqIGl0cyBwb3NzaWJsZSB0aGF0IHdoZW4gd2UgZ2V0IGhlcmUgZXZ0LT5ldmVudF9oYW5kbGVyIGlzIE5VTEwuCisJICogQ2hlY2sgZm9yIGV2ZW50X2hhbmRsZXIgYmVpbmcgTlVMTCBhbmQgZGlzY2FyZCB0aGUgaW50ZXJydXB0IGFzCisJICogc3B1cmlvdXMuCisJICovCisJaWYgKCFldnQtPmV2ZW50X2hhbmRsZXIpIHsKKwkJcHJpbnRrKEtFUk5fV0FSTklORworCQkgICAgICAgIlNwdXJpb3VzIExBUElDIHRpbWVyIGludGVycnVwdCBvbiBjcHUgJWRcbiIsIGNwdSk7CisJCS8qIFN3aXRjaCBpdCBvZmYgKi8KKwkJbGFwaWNfdGltZXJfc2V0dXAoQ0xPQ0tfRVZUX01PREVfU0hVVERPV04sIGV2dCk7CisJCXJldHVybjsKKwl9CisKKwlwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcysrOworCisJZXZ0LT5ldmVudF9oYW5kbGVyKGV2dCk7Cit9CisKKy8qCisgKiBMb2NhbCBBUElDIHRpbWVyIGludGVycnVwdC4gVGhpcyBpcyB0aGUgbW9zdCBuYXR1cmFsIHdheSBmb3IgZG9pbmcKKyAqIGxvY2FsIGludGVycnVwdHMsIGJ1dCBsb2NhbCB0aW1lciBpbnRlcnJ1cHRzIGNhbiBiZSBlbXVsYXRlZCBieQorICogYnJvYWRjYXN0IGludGVycnVwdHMgdG9vLiBbaW4gY2FzZSB0aGUgaHcgZG9lc24ndCBzdXBwb3J0IEFQSUMgdGltZXJzXQorICoKKyAqIFsgaWYgYSBzaW5nbGUtQ1BVIHN5c3RlbSBydW5zIGFuIFNNUCBrZXJuZWwgdGhlbiB3ZSBjYWxsIHRoZSBsb2NhbAorICogICBpbnRlcnJ1cHQgYXMgd2VsbC4gVGh1cyB3ZSBjYW5ub3QgaW5saW5lIHRoZSBsb2NhbCBpcnEgLi4uIF0KKyAqLworCit2b2lkIGZhc3RjYWxsIHNtcF9hcGljX3RpbWVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqb2xkX3JlZ3MgPSBzZXRfaXJxX3JlZ3MocmVncyk7CisKKwkvKgorCSAqIE5PVEUhIFdlJ2QgYmV0dGVyIEFDSyB0aGUgaXJxIGltbWVkaWF0ZWx5LAorCSAqIGJlY2F1c2UgdGltZXIgaGFuZGxpbmcgY2FuIGJlIHNsb3cuCisJICovCisJYWNrX0FQSUNfaXJxKCk7CisJLyoKKwkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIGV4cGVjdHMgdXMgdG8gaGF2ZSBkb25lIGlycV9lbnRlcigpLgorCSAqIEJlc2lkZXMsIGlmIHdlIGRvbid0IHRpbWVyIGludGVycnVwdHMgaWdub3JlIHRoZSBnbG9iYWwKKwkgKiBpbnRlcnJ1cHQgbG9jaywgd2hpY2ggaXMgdGhlIFdyb25nVGhpbmcgKHRtKSB0byBkby4KKwkgKi8KKwlleGl0X2lkbGUoKTsKKwlpcnFfZW50ZXIoKTsKKwlsb2NhbF9hcGljX3RpbWVyX2ludGVycnVwdCgpOworCWlycV9leGl0KCk7CisKKwlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOworfQorCitpbnQgc2V0dXBfcHJvZmlsaW5nX3RpbWVyKHVuc2lnbmVkIGludCBtdWx0aXBsaWVyKQoreworCXJldHVybiAtRUlOVkFMOworfQorCisvKgorICogTG9jYWwgQVBJQyBzdGFydCBhbmQgc2h1dGRvd24KKyAqLworCisvKioKKyAqIGNsZWFyX2xvY2FsX0FQSUMgLSBzaHV0ZG93biB0aGUgbG9jYWwgQVBJQworICoKKyAqIFRoaXMgaXMgY2FsbGVkLCB3aGVuIGEgQ1BVIGlzIGRpc2FibGVkIGFuZCBiZWZvcmUgcmVib290aW5nLCBzbyB0aGUgc3RhdGUgb2YKKyAqIHRoZSBsb2NhbCBBUElDIGhhcyBubyBkYW5nbGluZyBsZWZ0b3ZlcnMuIEFsc28gdXNlZCB0byBjbGVhbm91dCBhbnkgQklPUworICogbGVmdG92ZXJzIGR1cmluZyBib290LgorICovCiB2b2lkIGNsZWFyX2xvY2FsX0FQSUModm9pZCkKIHsKLQlpbnQgbWF4bHZ0OworCWludCBtYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAJdW5zaWduZWQgbG9uZyB2OwogCi0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOwotCiAJLyoKIAkgKiBNYXNraW5nIGFuIExWVCBlbnRyeSBjYW4gdHJpZ2dlciBhIGxvY2FsIEFQSUMgZXJyb3IKIAkgKiBpZiB0aGUgdmVjdG9yIGlzIHplcm8uIE1hc2sgTFZURVJSIGZpcnN0IHRvIHByZXZlbnQgdGhpcy4KQEAgLTE5MCw3ICs2MTMsNyBAQAogCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFBDLCB2IHwgQVBJQ19MVlRfTUFTS0VEKTsKIAl9CiAKLS8qIGxldHMgbm90IHRvdWNoIHRoaXMgaWYgd2UgZGlkbid0IGZyb2IgaXQgKi8KKwkvKiBsZXRzIG5vdCB0b3VjaCB0aGlzIGlmIHdlIGRpZG4ndCBmcm9iIGl0ICovCiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCiAJaWYgKG1heGx2dCA+PSA1KSB7CiAJCXYgPSBhcGljX3JlYWQoQVBJQ19MVlRUSE1SKTsKQEAgLTIxMiw4NSArNjM1LDE4IEBACiAJaWYgKG1heGx2dCA+PSA1KQogCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFRITVIsIEFQSUNfTFZUX01BU0tFRCk7CiAjZW5kaWYKLQl2ID0gR0VUX0FQSUNfVkVSU0lPTihhcGljX3JlYWQoQVBJQ19MVlIpKTsKLQlpZiAoQVBJQ19JTlRFR1JBVEVEKHYpKSB7CS8qICE4MjQ4OURYICovCi0JCWlmIChtYXhsdnQgPiAzKQkJLyogRHVlIHRvIFBlbnRpdW0gZXJyYXRhIDNBUCBhbmQgMTFBUC4gKi8KKwkvKiBJbnRlZ3JhdGVkIEFQSUMgKCE4MjQ4OURYKSA/ICovCisJaWYgKGxhcGljX2lzX2ludGVncmF0ZWQoKSkgeworCQlpZiAobWF4bHZ0ID4gMykKKwkJCS8qIENsZWFyIEVTUiBkdWUgdG8gUGVudGl1bSBlcnJhdGEgM0FQIGFuZCAxMUFQICovCiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJYXBpY19yZWFkKEFQSUNfRVNSKTsKIAl9CiB9CiAKLXZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKLXsKLQlpZiAocGljX21vZGUpIHsKLQkJLyoKLQkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KLQkJICovCi0JCWNsZWFyX2xvY2FsX0FQSUMoKTsKLQkJLyoKLQkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4KLQkJICogY29ubmVjdCBCU1AncyBsb2NhbCBBUElDIHRvIElOVCBhbmQgTk1JIGxpbmVzLgotCQkgKi8KLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibGVhdmluZyBQSUMgbW9kZSwgIgotCQkJCSJlbmFibGluZyBBUElDIG1vZGUuXG4iKTsKLQkJb3V0YigweDcwLCAweDIyKTsKLQkJb3V0YigweDAxLCAweDIzKTsKLQl9Ci0JZW5hYmxlX2FwaWNfbW9kZSgpOwotfQotCi12b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUMoaW50IHZpcnRfd2lyZV9zZXR1cCkKLXsKLQlpZiAocGljX21vZGUpIHsKLQkJLyoKLQkJICogUHV0IHRoZSBib2FyZCBiYWNrIGludG8gUElDIG1vZGUgKGhhcyBhbiBlZmZlY3QKLQkJICogb25seSBvbiBjZXJ0YWluIG9sZGVyIGJvYXJkcykuICBOb3RlIHRoYXQgQVBJQwotCQkgKiBpbnRlcnJ1cHRzLCBpbmNsdWRpbmcgSVBJcywgd29uJ3Qgd29yayBiZXlvbmQKLQkJICogdGhpcyBwb2ludCEgIFRoZSBvbmx5IGV4Y2VwdGlvbiBhcmUgSU5JVCBJUElzLgotCQkgKi8KLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZGlzYWJsaW5nIEFQSUMgbW9kZSwgIgotCQkJCSJlbnRlcmluZyBQSUMgbW9kZS5cbiIpOwotCQlvdXRiKDB4NzAsIDB4MjIpOwotCQlvdXRiKDB4MDAsIDB4MjMpOwotCX0KLQllbHNlIHsKLQkJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCi0JCXVuc2lnbmVkIGxvbmcgdmFsdWU7Ci0KLQkJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCi0JCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7Ci0JCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwotCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOwotCQl2YWx1ZSB8PSAweGY7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOwotCi0JCWlmICghdmlydF93aXJlX3NldHVwKSB7Ci0JCQkvKiBGb3IgTFZUMCBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgZXh0ZXJuYWwgYW5kIGVuYWJsZWQgKi8KLQkJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZUMCk7Ci0JCQl2YWx1ZSAmPSB+KEFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAotCQkJCUFQSUNfSU5QVVRfUE9MQVJJVFkgfCBBUElDX0xWVF9SRU1PVEVfSVJSIHwKLQkJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEICk7Ci0JCQl2YWx1ZSB8PSBBUElDX0xWVF9SRU1PVEVfSVJSIHwgQVBJQ19TRU5EX1BFTkRJTkc7Ci0JCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9FWFRJTlQpOwotCQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCB2YWx1ZSk7Ci0JCX0KLQkJZWxzZSB7Ci0JCQkvKiBEaXNhYmxlIExWVDAgKi8KLQkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgQVBJQ19MVlRfTUFTS0VEKTsKLQkJfQotCi0JCS8qIEZvciBMVlQxIG1ha2UgaXQgZWRnZSB0cmlnZ2VyZWQsIGFjdGl2ZSBoaWdoLCBubWkgYW5kIGVuYWJsZWQgKi8KLQkJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlQxKTsKLQkJdmFsdWUgJj0gfigKLQkJCUFQSUNfTU9ERV9NQVNLIHwgQVBJQ19TRU5EX1BFTkRJTkcgfAotCQkJQVBJQ19JTlBVVF9QT0xBUklUWSB8IEFQSUNfTFZUX1JFTU9URV9JUlIgfAotCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCk7Ci0JCXZhbHVlIHw9IEFQSUNfTFZUX1JFTU9URV9JUlIgfCBBUElDX1NFTkRfUEVORElORzsKLQkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfTk1JKTsKLQkJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQxLCB2YWx1ZSk7Ci0JfQotfQotCisvKioKKyAqIGRpc2FibGVfbG9jYWxfQVBJQyAtIGNsZWFyIGFuZCBkaXNhYmxlIHRoZSBsb2NhbCBBUElDCisgKi8KIHZvaWQgZGlzYWJsZV9sb2NhbF9BUElDKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZTsKQEAgLTMwNSw4ICs2NjEsMTMgQEAKIAl2YWx1ZSAmPSB+QVBJQ19TUElWX0FQSUNfRU5BQkxFRDsKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1NQSVYsIHZhbHVlKTsKIAorCS8qCisJICogV2hlbiBMQVBJQyB3YXMgZGlzYWJsZWQgYnkgdGhlIEJJT1MgYW5kIGVuYWJsZWQgYnkgdGhlIGtlcm5lbCwKKwkgKiByZXN0b3JlIHRoZSBkaXNhYmxlZCBzdGF0ZS4KKwkgKi8KIAlpZiAoZW5hYmxlZF92aWFfYXBpY2Jhc2UpIHsKIAkJdW5zaWduZWQgaW50IGwsIGg7CisKIAkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwogCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9FTkFCTEU7CiAJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKQEAgLTMxNCw2ICs2NzUsMjggQEAKIH0KIAogLyoKKyAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdCBkaXNhYmxlIGl0IGRvd24gYmVmb3JlCisgKiByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4gIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZAorICogbm90IHBvd2VyLW9mZi4gIEFkZGl0aW9uYWxseSBjbGVhciBhbGwgTFZUIGVudHJpZXMgYmVmb3JlIGRpc2FibGVfbG9jYWxfQVBJQworICogZm9yIHRoZSBjYXNlIHdoZXJlIExpbnV4IGRpZG4ndCBlbmFibGUgdGhlIExBUElDLgorICovCit2b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghY3B1X2hhc19hcGljKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJY2xlYXJfbG9jYWxfQVBJQygpOworCisJaWYgKGVuYWJsZWRfdmlhX2FwaWNiYXNlKQorCQlkaXNhYmxlX2xvY2FsX0FQSUMoKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKICAqIFRoaXMgaXMgdG8gdmVyaWZ5IHRoYXQgd2UncmUgbG9va2luZyBhdCBhIHJlYWwgbG9jYWwgQVBJQy4KICAqIENoZWNrIHRoZXNlIGFnYWluc3QgeW91ciBib2FyZCBpZiB0aGUgQ1BVcyBhcmVuJ3QgZ2V0dGluZwogICogc3RhcnRlZCBmb3Igbm8gYXBwYXJlbnQgcmVhc29uLgpAQCAtMzQ1LDcgKzcyOCw3IEBACiAJcmVnMSA9IEdFVF9BUElDX1ZFUlNJT04ocmVnMCk7CiAJaWYgKHJlZzEgPT0gMHgwMCB8fCByZWcxID09IDB4ZmYpCiAJCXJldHVybiAwOwotCXJlZzEgPSBnZXRfbWF4bHZ0KCk7CisJcmVnMSA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAlpZiAocmVnMSA8IDB4MDIgfHwgcmVnMSA9PSAweGZmKQogCQlyZXR1cm4gMDsKIApAQCAtMzY4LDEwICs3NTEsMTUgQEAKIAlyZXR1cm4gMTsKIH0KIAorLyoqCisgKiBzeW5jX0FyYl9JRHMgLSBzeW5jaHJvbml6ZSBBUElDIGJ1cyBhcmJpdHJhdGlvbiBJRHMKKyAqLwogdm9pZCBfX2luaXQgc3luY19BcmJfSURzKHZvaWQpCiB7Ci0JLyogVW5zdXBwb3J0ZWQgb24gUDQgLSBzZWUgSW50ZWwgRGV2LiBNYW51YWwgVm9sLiAzLCBDaC4gOC42LjEKLQkgICBBbmQgbm90IG5lZWRlZCBvbiBBTUQgKi8KKwkvKgorCSAqIFVuc3VwcG9ydGVkIG9uIFA0IC0gc2VlIEludGVsIERldi4gTWFudWFsIFZvbC4gMywgQ2guIDguNi4xIEFuZCBub3QKKwkgKiBuZWVkZWQgb24gQU1ELgorCSAqLwogCWlmIChtb2Rlcm5fYXBpYygpKQogCQlyZXR1cm47CiAJLyoKQEAgLTM4NCwxNCArNzcyLDEyIEBACiAJCQkJfCBBUElDX0RNX0lOSVQpOwogfQogCi1leHRlcm4gdm9pZCBfX2Vycm9yX2luX2FwaWNfYyAodm9pZCk7Ci0KIC8qCiAgKiBBbiBpbml0aWFsIHNldHVwIG9mIHRoZSB2aXJ0dWFsIHdpcmUgbW9kZS4KICAqLwogdm9pZCBfX2luaXQgaW5pdF9ic3BfQVBJQyh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgdmFsdWUsIHZlcjsKKwl1bnNpZ25lZCBsb25nIHZhbHVlOwogCiAJLyoKIAkgKiBEb24ndCBkbyB0aGUgc2V0dXAgbm93IGlmIHdlIGhhdmUgYSBTTVAgQklPUyBhcyB0aGUKQEAgLTQwMCw5ICs3ODYsNiBAQAogCWlmIChzbXBfZm91bmRfY29uZmlnIHx8ICFjcHVfaGFzX2FwaWMpCiAJCXJldHVybjsKIAotCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfTFZSKTsKLQl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKHZhbHVlKTsKLQogCS8qCiAJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KIAkgKi8KQEAgLTQxNCw5ICs3OTcsMTAgQEAKIAl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX1NQSVYpOwogCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOwogCXZhbHVlIHw9IEFQSUNfU1BJVl9BUElDX0VOQUJMRUQ7Ci0JCisKIAkvKiBUaGlzIGJpdCBpcyByZXNlcnZlZCBvbiBQNC9YZW9uIGFuZCBzaG91bGQgYmUgY2xlYXJlZCAqLwotCWlmICgoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpICYmIChib290X2NwdV9kYXRhLng4NiA9PSAxNSkpCisJaWYgKChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkgJiYKKwkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKIAkJdmFsdWUgJj0gfkFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKIAllbHNlCiAJCXZhbHVlIHw9IEFQSUNfU1BJVl9GT0NVU19ESVNBQkxFRDsKQEAgLTQyOCwxNCArODEyLDE3IEBACiAJICovCiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19MVlQwLCBBUElDX0RNX0VYVElOVCk7CiAJdmFsdWUgPSBBUElDX0RNX05NSTsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCWlmICghbGFwaWNfaXNfaW50ZWdyYXRlZCgpKQkJLyogODI0ODlEWCAqLwogCQl2YWx1ZSB8PSBBUElDX0xWVF9MRVZFTF9UUklHR0VSOwogCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMSwgdmFsdWUpOwogfQogCisvKioKKyAqIHNldHVwX2xvY2FsX0FQSUMgLSBzZXR1cCB0aGUgbG9jYWwgQVBJQworICovCiB2b2lkIF9fZGV2aW5pdCBzZXR1cF9sb2NhbF9BUElDKHZvaWQpCiB7Ci0JdW5zaWduZWQgbG9uZyBvbGR2YWx1ZSwgdmFsdWUsIHZlciwgbWF4bHZ0OworCXVuc2lnbmVkIGxvbmcgb2xkdmFsdWUsIHZhbHVlLCBtYXhsdnQsIGludGVncmF0ZWQ7CiAJaW50IGksIGo7CiAKIAkvKiBQb3VuZCB0aGUgRVNSIHJlYWxseSBoYXJkIG92ZXIgdGhlIGhlYWQgd2l0aCBhIGJpZyBoYW1tZXIgLSBtYmxpZ2ggKi8KQEAgLTQ0NiwxMSArODMzLDcgQEAKIAkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CiAJfQogCi0JdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwotCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odmFsdWUpOwotCi0JaWYgKChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIDB4MGYpICE9IDB4MGYpCi0JCV9fZXJyb3JfaW5fYXBpY19jKCk7CisJaW50ZWdyYXRlZCA9IGxhcGljX2lzX2ludGVncmF0ZWQoKTsKIAogCS8qCiAJICogRG91YmxlLWNoZWNrIHdoZXRoZXIgdGhpcyBBUElDIGlzIHJlYWxseSByZWdpc3RlcmVkLgpAQCAtNTIxLDEzICs5MDQsMTAgQEAKIAkgKiBsaWtlIExSVSB0aGFuIE1SVSAodGhlIHNob3J0LXRlcm0gbG9hZCBpcyBtb3JlIGV2ZW4gYWNyb3NzIENQVXMpLgogCSAqIFNlZSBhbHNvIHRoZSBjb21tZW50IGluIGVuZF9sZXZlbF9pb2FwaWNfaXJxKCkuICAtLW1hY3JvCiAJICovCi0jaWYgMQorCiAJLyogRW5hYmxlIGZvY3VzIHByb2Nlc3NvciAoYml0PT0wKSAqLwogCXZhbHVlICY9IH5BUElDX1NQSVZfRk9DVVNfRElTQUJMRUQ7Ci0jZWxzZQotCS8qIERpc2FibGUgZm9jdXMgcHJvY2Vzc29yIChiaXQ9PTEpICovCi0JdmFsdWUgfD0gQVBJQ19TUElWX0ZPQ1VTX0RJU0FCTEVEOwotI2VuZGlmCisKIAkvKgogCSAqIFNldCBzcHVyaW91cyBJUlEgdmVjdG9yCiAJICovCkBAIC01NjMsMTcgKzk0MywxOCBAQAogCQl2YWx1ZSA9IEFQSUNfRE1fTk1JOwogCWVsc2UKIAkJdmFsdWUgPSBBUElDX0RNX05NSSB8IEFQSUNfTFZUX01BU0tFRDsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQkJLyogODI0ODlEWCAqLworCWlmICghaW50ZWdyYXRlZCkJCS8qIDgyNDg5RFggKi8KIAkJdmFsdWUgfD0gQVBJQ19MVlRfTEVWRUxfVFJJR0dFUjsKIAlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKIAotCWlmIChBUElDX0lOVEVHUkFURUQodmVyKSAmJiAhZXNyX2Rpc2FibGUpIHsJCS8qICE4MjQ4OURYICovCi0JCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwlpZiAoaW50ZWdyYXRlZCAmJiAhZXNyX2Rpc2FibGUpIHsJCS8qICE4MjQ4OURYICovCisJCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAkJaWYgKG1heGx2dCA+IDMpCQkvKiBEdWUgdG8gdGhlIFBlbnRpdW0gZXJyYXR1bSAzQVAuICovCiAJCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAkJb2xkdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19FU1IpOwogCi0JCXZhbHVlID0gRVJST1JfQVBJQ19WRUNUT1I7ICAgICAgLy8gZW5hYmxlcyBzZW5kaW5nIGVycm9ycworCQkvKiBlbmFibGVzIHNlbmRpbmcgZXJyb3JzICovCisJCXZhbHVlID0gRVJST1JfQVBJQ19WRUNUT1I7CiAJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZURVJSLCB2YWx1ZSk7CiAJCS8qCiAJCSAqIHNwZWMgc2F5cyBjbGVhciBlcnJvcnMgYWZ0ZXIgZW5hYmxpbmcgdmVjdG9yLgpAQCAtNTg2LDQ1ICs5NjcsNDE3IEBACiAJCQkJInZlY3RvcjogMHglMDhseCAgYWZ0ZXI6IDB4JTA4bHhcbiIsCiAJCQkJb2xkdmFsdWUsIHZhbHVlKTsKIAl9IGVsc2UgewotCQlpZiAoZXNyX2Rpc2FibGUpCQotCQkJLyogCi0JCQkgKiBTb21ldGhpbmcgdW50cmFjZWJsZSBpcyBjcmVhdGluZyBiYWQgaW50ZXJydXB0cyBvbiAKKwkJaWYgKGVzcl9kaXNhYmxlKQorCQkJLyoKKwkJCSAqIFNvbWV0aGluZyB1bnRyYWNlYmxlIGlzIGNyZWF0aW5nIGJhZCBpbnRlcnJ1cHRzIG9uCiAJCQkgKiBzZWNvbmRhcnkgcXVhZHMgLi4uIGZvciB0aGUgbW9tZW50LCBqdXN0IGxlYXZlIHRoZQogCQkJICogRVNSIGRpc2FibGVkIC0gd2UgY2FuJ3QgZG8gYW55dGhpbmcgdXNlZnVsIHdpdGggdGhlCiAJCQkgKiBlcnJvcnMgYW55d2F5IC0gbWJsaWdoCiAJCQkgKi8KLQkJCXByaW50aygiTGVhdmluZyBFU1IgZGlzYWJsZWQuXG4iKTsKLQkJZWxzZSAKLQkJCXByaW50aygiTm8gRVNSIGZvciA4MjQ4OURYLlxuIik7CisJCQlwcmludGsoS0VSTl9JTkZPICJMZWF2aW5nIEVTUiBkaXNhYmxlZC5cbiIpOworCQllbHNlCisJCQlwcmludGsoS0VSTl9JTkZPICJObyBFU1IgZm9yIDgyNDg5RFguXG4iKTsKIAl9CiAKKwkvKiBEaXNhYmxlIHRoZSBsb2NhbCBhcGljIHRpbWVyICovCisJdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19MVlRUKTsKKwl2YWx1ZSB8PSAoQVBJQ19MVlRfTUFTS0VEIHwgTE9DQUxfVElNRVJfVkVDVE9SKTsKKwlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIHZhbHVlKTsKKwogCXNldHVwX2FwaWNfbm1pX3dhdGNoZG9nKE5VTEwpOwogCWFwaWNfcG1fYWN0aXZhdGUoKTsKIH0KIAogLyoKLSAqIElmIExpbnV4IGVuYWJsZWQgdGhlIExBUElDIGFnYWluc3QgdGhlIEJJT1MgZGVmYXVsdAotICogZGlzYWJsZSBpdCBkb3duIGJlZm9yZSByZS1lbnRlcmluZyB0aGUgQklPUyBvbiBzaHV0ZG93bi4KLSAqIE90aGVyd2lzZSB0aGUgQklPUyBtYXkgZ2V0IGNvbmZ1c2VkIGFuZCBub3QgcG93ZXItb2ZmLgotICogQWRkaXRpb25hbGx5IGNsZWFyIGFsbCBMVlQgZW50cmllcyBiZWZvcmUgZGlzYWJsZV9sb2NhbF9BUElDCi0gKiBmb3IgdGhlIGNhc2Ugd2hlcmUgTGludXggZGlkbid0IGVuYWJsZSB0aGUgTEFQSUMuCisgKiBEZXRlY3QgYW5kIGluaXRpYWxpemUgQVBJQwogICovCi12b2lkIGxhcGljX3NodXRkb3duKHZvaWQpCitzdGF0aWMgaW50IF9faW5pdCBkZXRlY3RfaW5pdF9BUElDICh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdTMyIGgsIGwsIGZlYXR1cmVzOwogCi0JaWYgKCFjcHVfaGFzX2FwaWMpCi0JCXJldHVybjsKKwkvKiBEaXNhYmxlZCBieSBrZXJuZWwgb3B0aW9uPyAqLworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCXJldHVybiAtMTsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQljbGVhcl9sb2NhbF9BUElDKCk7CisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKKwljYXNlIFg4Nl9WRU5ET1JfQU1EOgorCQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAxKSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkKKwkJCWJyZWFrOworCQlnb3RvIG5vX2FwaWM7CisJY2FzZSBYODZfVkVORE9SX0lOVEVMOgorCQlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNiB8fCBib290X2NwdV9kYXRhLng4NiA9PSAxNSB8fAorCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDUgJiYgY3B1X2hhc19hcGljKSkKKwkJCWJyZWFrOworCQlnb3RvIG5vX2FwaWM7CisJZGVmYXVsdDoKKwkJZ290byBub19hcGljOworCX0KIAotCWlmIChlbmFibGVkX3ZpYV9hcGljYmFzZSkKLQkJZGlzYWJsZV9sb2NhbF9BUElDKCk7CisJaWYgKCFjcHVfaGFzX2FwaWMpIHsKKwkJLyoKKwkJICogT3Zlci1yaWRlIEJJT1MgYW5kIHRyeSB0byBlbmFibGUgdGhlIGxvY2FsIEFQSUMgb25seSBpZgorCQkgKiAibGFwaWMiIHNwZWNpZmllZC4KKwkJICovCisJCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8PSAwKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJMb2NhbCBBUElDIGRpc2FibGVkIGJ5IEJJT1MgLS0gIgorCQkJICAgICAgICJ5b3UgY2FuIGVuYWJsZSBpdCB3aXRoIFwibGFwaWNcIlxuIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJLyoKKwkJICogU29tZSBCSU9TZXMgZGlzYWJsZSB0aGUgbG9jYWwgQVBJQyBpbiB0aGUgQVBJQ19CQVNFCisJCSAqIE1TUi4gVGhpcyBjYW4gb25seSBiZSBkb25lIGluIHNvZnR3YXJlIGZvciBJbnRlbCBQNiBvciBsYXRlcgorCQkgKiBhbmQgQU1EIEs3IChNb2RlbCA+IDEpIG9yIGxhdGVyLgorCQkgKi8KKwkJcmRtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOworCQlpZiAoIShsICYgTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFKSkgeworCQkJcHJpbnRrKEtFUk5fSU5GTworCQkJICAgICAgICJMb2NhbCBBUElDIGRpc2FibGVkIGJ5IEJJT1MgLS0gcmVlbmFibGluZy5cbiIpOworCQkJbCAmPSB+TVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKwkJCWwgfD0gTVNSX0lBMzJfQVBJQ0JBU0VfRU5BQkxFIHwgQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKKwkJCXdybXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBsLCBoKTsKKwkJCWVuYWJsZWRfdmlhX2FwaWNiYXNlID0gMTsKKwkJfQorCX0KKwkvKgorCSAqIFRoZSBBUElDIGZlYXR1cmUgYml0IHNob3VsZCBub3cgYmUgZW5hYmxlZAorCSAqIGluIGBjcHVpZCcKKwkgKi8KKwlmZWF0dXJlcyA9IGNwdWlkX2VkeCgxKTsKKwlpZiAoIShmZWF0dXJlcyAmICgxIDw8IFg4Nl9GRUFUVVJFX0FQSUMpKSkgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJDb3VsZCBub3QgZW5hYmxlIEFQSUMhXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzZXRfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCW1wX2xhcGljX2FkZHIgPSBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwogCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCS8qIFRoZSBCSU9TIG1heSBoYXZlIHNldCB1cCB0aGUgQVBJQyBhdCBzb21lIG90aGVyIGFkZHJlc3MgKi8KKwlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7CisJaWYgKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpCisJCW1wX2xhcGljX2FkZHIgPSBsICYgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKKworCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX05PTkUpCisJCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOworCisJcHJpbnRrKEtFUk5fSU5GTyAiRm91bmQgYW5kIGVuYWJsZWQgbG9jYWwgQVBJQyFcbiIpOworCisJYXBpY19wbV9hY3RpdmF0ZSgpOworCisJcmV0dXJuIDA7CisKK25vX2FwaWM6CisJcHJpbnRrKEtFUk5fSU5GTyAiTm8gbG9jYWwgQVBJQyBwcmVzZW50IG9yIGhhcmR3YXJlIGRpc2FibGVkXG4iKTsKKwlyZXR1cm4gLTE7CiB9CiAKKy8qKgorICogaW5pdF9hcGljX21hcHBpbmdzIC0gaW5pdGlhbGl6ZSBBUElDIG1hcHBpbmdzCisgKi8KK3ZvaWQgX19pbml0IGluaXRfYXBpY19tYXBwaW5ncyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgYXBpY19waHlzOworCisJLyoKKwkgKiBJZiBubyBsb2NhbCBBUElDIGNhbiBiZSBmb3VuZCB0aGVuIHNldCB1cCBhIGZha2UgYWxsCisJICogemVyb2VzIHBhZ2UgdG8gc2ltdWxhdGUgdGhlIGxvY2FsIEFQSUMgYW5kIGFub3RoZXIKKwkgKiBvbmUgZm9yIHRoZSBJTy1BUElDLgorCSAqLworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiBkZXRlY3RfaW5pdF9BUElDKCkpIHsKKwkJYXBpY19waHlzID0gKHVuc2lnbmVkIGxvbmcpIGFsbG9jX2Jvb3RtZW1fcGFnZXMoUEFHRV9TSVpFKTsKKwkJYXBpY19waHlzID0gX19wYShhcGljX3BoeXMpOworCX0gZWxzZQorCQlhcGljX3BoeXMgPSBtcF9sYXBpY19hZGRyOworCisJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9BUElDX0JBU0UsIGFwaWNfcGh5cyk7CisJcHJpbnRrKEtFUk5fREVCVUcgIm1hcHBlZCBBUElDIHRvICUwOGx4ICglMDhseClcbiIsIEFQSUNfQkFTRSwKKwkgICAgICAgYXBpY19waHlzKTsKKworCS8qCisJICogRmV0Y2ggdGhlIEFQSUMgSUQgb2YgdGhlIEJTUCBpbiBjYXNlIHdlIGhhdmUgYQorCSAqIGRlZmF1bHQgY29uZmlndXJhdGlvbiAob3IgdGhlIE1QIHRhYmxlIGlzIGJyb2tlbikuCisJICovCisJaWYgKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9PSAtMVUpCisJCWJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCA9IEdFVF9BUElDX0lEKGFwaWNfcmVhZChBUElDX0lEKSk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwl7CisJCXVuc2lnbmVkIGxvbmcgaW9hcGljX3BoeXMsIGlkeCA9IEZJWF9JT19BUElDX0JBU0VfMDsKKwkJaW50IGk7CisKKwkJZm9yIChpID0gMDsgaSA8IG5yX2lvYXBpY3M7IGkrKykgeworCQkJaWYgKHNtcF9mb3VuZF9jb25maWcpIHsKKwkJCQlpb2FwaWNfcGh5cyA9IG1wX2lvYXBpY3NbaV0ubXBjX2FwaWNhZGRyOworCQkJCWlmICghaW9hcGljX3BoeXMpIHsKKwkJCQkJcHJpbnRrKEtFUk5fRVJSCisJCQkJCSAgICAgICAiV0FSTklORzogYm9ndXMgemVybyBJTy1BUElDICIKKwkJCQkJICAgICAgICJhZGRyZXNzIGZvdW5kIGluIE1QVEFCTEUsICIKKwkJCQkJICAgICAgICJkaXNhYmxpbmcgSU8vQVBJQyBzdXBwb3J0IVxuIik7CisJCQkJCXNtcF9mb3VuZF9jb25maWcgPSAwOworCQkJCQlza2lwX2lvYXBpY19zZXR1cCA9IDE7CisJCQkJCWdvdG8gZmFrZV9pb2FwaWNfcGFnZTsKKwkJCQl9CisJCQl9IGVsc2UgeworZmFrZV9pb2FwaWNfcGFnZToKKwkJCQlpb2FwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKQorCQkJCQkgICAgICBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7CisJCQkJaW9hcGljX3BoeXMgPSBfX3BhKGlvYXBpY19waHlzKTsKKwkJCX0KKwkJCXNldF9maXhtYXBfbm9jYWNoZShpZHgsIGlvYXBpY19waHlzKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICJtYXBwZWQgSU9BUElDIHRvICUwOGx4ICglMDhseClcbiIsCisJCQkgICAgICAgX19maXhfdG9fdmlydChpZHgpLCBpb2FwaWNfcGh5cyk7CisJCQlpZHgrKzsKKwkJfQorCX0KKyNlbmRpZgorfQorCisvKgorICogVGhpcyBpbml0aWFsaXplcyB0aGUgSU8tQVBJQyBhbmQgQVBJQyBoYXJkd2FyZSBpZiB0aGlzIGlzCisgKiBhIFVQIGtlcm5lbC4KKyAqLworaW50IF9faW5pdCBBUElDX2luaXRfdW5pcHJvY2Vzc29yICh2b2lkKQoreworCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCisJCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKKworCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhY3B1X2hhc19hcGljKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KKwkgKi8KKwlpZiAoIWNwdV9oYXNfYXBpYyAmJgorCSAgICBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7CisJCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIGxvY2FsIEFQSUMgIyVkIG5vdCBkZXRlY3RlZCEuLi5cbiIsCisJCSAgICAgICBib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7CisJCXJldHVybiAtMTsKKwl9CisKKwl2ZXJpZnlfbG9jYWxfQVBJQygpOworCisJY29ubmVjdF9ic3BfQVBJQygpOworCisJLyoKKwkgKiBIYWNrOiBJbiBjYXNlIG9mIGtkdW1wLCBhZnRlciBhIGNyYXNoLCBrZXJuZWwgbWlnaHQgYmUgYm9vdGluZworCSAqIG9uIGEgY3B1IHdpdGggbm9uLXplcm8gbGFwaWMgaWQuIEJ1dCBib290X2NwdV9waHlzaWNhbF9hcGljaWQKKwkgKiBtaWdodCBiZSB6ZXJvIGlmIHJlYWQgZnJvbSBNUCB0YWJsZXMuIEdldCBpdCBmcm9tIExBUElDLgorCSAqLworI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCisJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKKyNlbmRpZgorCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7CisKKwlzZXR1cF9sb2NhbF9BUElDKCk7CisKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwlpZiAoc21wX2ZvdW5kX2NvbmZpZykKKwkJaWYgKCFza2lwX2lvYXBpY19zZXR1cCAmJiBucl9pb2FwaWNzKQorCQkJc2V0dXBfSU9fQVBJQygpOworI2VuZGlmCisJc2V0dXBfYm9vdF9jbG9jaygpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBBUElDIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX2xhcGljKGNoYXIgKmFyZykKK3sKKwllbmFibGVfbG9jYWxfYXBpYyA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibGFwaWMiLCBwYXJzZV9sYXBpYyk7CisKK3N0YXRpYyBpbnQgX19pbml0IHBhcnNlX25vbGFwaWMoY2hhciAqYXJnKQoreworCWVuYWJsZV9sb2NhbF9hcGljID0gLTE7CisJY2xlYXJfYml0KFg4Nl9GRUFUVVJFX0FQSUMsIGJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHkpOworCXJldHVybiAwOworfQorZWFybHlfcGFyYW0oIm5vbGFwaWMiLCBwYXJzZV9ub2xhcGljKTsKKworc3RhdGljIGludCBfX2luaXQgYXBpY19zZXRfdmVyYm9zaXR5KGNoYXIgKnN0cikKK3sKKwlpZiAoc3RyY21wKCJkZWJ1ZyIsIHN0cikgPT0gMCkKKwkJYXBpY192ZXJib3NpdHkgPSBBUElDX0RFQlVHOworCWVsc2UgaWYgKHN0cmNtcCgidmVyYm9zZSIsIHN0cikgPT0gMCkKKwkJYXBpY192ZXJib3NpdHkgPSBBUElDX1ZFUkJPU0U7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImFwaWM9IiwgYXBpY19zZXRfdmVyYm9zaXR5KTsKKworCisvKgorICogTG9jYWwgQVBJQyBpbnRlcnJ1cHRzCisgKi8KKworLyoKKyAqIFRoaXMgaW50ZXJydXB0IHNob3VsZCBfbmV2ZXJfIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKKyAqLwordm9pZCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICpyZWdzKQoreworCXVuc2lnbmVkIGxvbmcgdjsKKworCWV4aXRfaWRsZSgpOworCWlycV9lbnRlcigpOworCS8qCisJICogQ2hlY2sgaWYgdGhpcyByZWFsbHkgaXMgYSBzcHVyaW91cyBpbnRlcnJ1cHQgYW5kIEFDSyBpdAorCSAqIGlmIGl0IGlzIGEgdmVjdG9yZWQgb25lLiAgSnVzdCBpbiBjYXNlLi4uCisJICogU3B1cmlvdXMgaW50ZXJydXB0cyBzaG91bGQgbm90IGJlIEFDS2VkLgorCSAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19JU1IgKyAoKFNQVVJJT1VTX0FQSUNfVkVDVE9SICYgfjB4MWYpID4+IDEpKTsKKwlpZiAodiAmICgxIDw8IChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIDB4MWYpKSkKKwkJYWNrX0FQSUNfaXJxKCk7CisKKwkvKiBzZWUgc3ctZGV2LW1hbiB2b2wgMywgY2hhcHRlciA3LjQuMTMuNSAqLworCXByaW50ayhLRVJOX0lORk8gInNwdXJpb3VzIEFQSUMgaW50ZXJydXB0IG9uIENQVSMlZCwgIgorCSAgICAgICAic2hvdWxkIG5ldmVyIGhhcHBlbi5cbiIsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJaXJxX2V4aXQoKTsKK30KKworLyoKKyAqIFRoaXMgaW50ZXJydXB0IHNob3VsZCBuZXZlciBoYXBwZW4gd2l0aCBvdXIgQVBJQy9TTVAgYXJjaGl0ZWN0dXJlCisgKi8KK3ZvaWQgc21wX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIHYsIHYxOworCisJZXhpdF9pZGxlKCk7CisJaXJxX2VudGVyKCk7CisJLyogRmlyc3QgdGlja2xlIHRoZSBoYXJkd2FyZSwgb25seSB0aGVuIHJlcG9ydCB3aGF0IHdlbnQgb24uIC0tIFJFVyAqLworCXYgPSBhcGljX3JlYWQoQVBJQ19FU1IpOworCWFwaWNfd3JpdGUoQVBJQ19FU1IsIDApOworCXYxID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKKwlhY2tfQVBJQ19pcnEoKTsKKwlhdG9taWNfaW5jKCZpcnFfZXJyX2NvdW50KTsKKworCS8qIEhlcmUgaXMgd2hhdCB0aGUgQVBJQyBlcnJvciBiaXRzIG1lYW46CisJICAgMDogU2VuZCBDUyBlcnJvcgorCSAgIDE6IFJlY2VpdmUgQ1MgZXJyb3IKKwkgICAyOiBTZW5kIGFjY2VwdCBlcnJvcgorCSAgIDM6IFJlY2VpdmUgYWNjZXB0IGVycm9yCisJICAgNDogUmVzZXJ2ZWQKKwkgICA1OiBTZW5kIGlsbGVnYWwgdmVjdG9yCisJICAgNjogUmVjZWl2ZWQgaWxsZWdhbCB2ZWN0b3IKKwkgICA3OiBJbGxlZ2FsIHJlZ2lzdGVyIGFkZHJlc3MKKwkqLworCXByaW50ayAoS0VSTl9ERUJVRyAiQVBJQyBlcnJvciBvbiBDUFUlZDogJTAybHgoJTAybHgpXG4iLAorCQlzbXBfcHJvY2Vzc29yX2lkKCksIHYgLCB2MSk7CisJaXJxX2V4aXQoKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgQVBJQyBpbnRlcnJ1cHRzCisgKi8KK3ZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorCXNtcF9pbnRyX2luaXQoKTsKKyNlbmRpZgorCS8qIHNlbGYgZ2VuZXJhdGVkIElQSSBmb3IgbG9jYWwgQVBJQyB0aW1lciAqLworCXNldF9pbnRyX2dhdGUoTE9DQUxfVElNRVJfVkVDVE9SLCBhcGljX3RpbWVyX2ludGVycnVwdCk7CisKKwkvKiBJUEkgdmVjdG9ycyBmb3IgQVBJQyBzcHVyaW91cyBhbmQgZXJyb3IgaW50ZXJydXB0cyAqLworCXNldF9pbnRyX2dhdGUoU1BVUklPVVNfQVBJQ19WRUNUT1IsIHNwdXJpb3VzX2ludGVycnVwdCk7CisJc2V0X2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKKworCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCisjaWZkZWYgQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMCisJc2V0X2ludHJfZ2F0ZShUSEVSTUFMX0FQSUNfVkVDVE9SLCB0aGVybWFsX2ludGVycnVwdCk7CisjZW5kaWYKK30KKworLyoqCisgKiBjb25uZWN0X2JzcF9BUElDIC0gYXR0YWNoIHRoZSBBUElDIHRvIHRoZSBpbnRlcnJ1cHQgc3lzdGVtCisgKi8KK3ZvaWQgX19pbml0IGNvbm5lY3RfYnNwX0FQSUModm9pZCkKK3sKKwlpZiAocGljX21vZGUpIHsKKwkJLyoKKwkJICogRG8gbm90IHRydXN0IHRoZSBsb2NhbCBBUElDIGJlaW5nIGVtcHR5IGF0IGJvb3R1cC4KKwkJICovCisJCWNsZWFyX2xvY2FsX0FQSUMoKTsKKwkJLyoKKwkJICogUElDIG1vZGUsIGVuYWJsZSBBUElDIG1vZGUgaW4gdGhlIElNQ1IsIGkuZS4gIGNvbm5lY3QgQlNQJ3MKKwkJICogbG9jYWwgQVBJQyB0byBJTlQgYW5kIE5NSSBsaW5lcy4KKwkJICovCisJCWFwaWNfcHJpbnRrKEFQSUNfVkVSQk9TRSwgImxlYXZpbmcgUElDIG1vZGUsICIKKwkJCQkiZW5hYmxpbmcgQVBJQyBtb2RlLlxuIik7CisJCW91dGIoMHg3MCwgMHgyMik7CisJCW91dGIoMHgwMSwgMHgyMyk7CisJfQorCWVuYWJsZV9hcGljX21vZGUoKTsKK30KKworLyoqCisgKiBkaXNjb25uZWN0X2JzcF9BUElDIC0gZGV0YWNoIHRoZSBBUElDIGZyb20gdGhlIGludGVycnVwdCBzeXN0ZW0KKyAqIEB2aXJ0X3dpcmVfc2V0dXA6CWluZGljYXRlcywgd2hldGhlciB2aXJ0dWFsIHdpcmUgbW9kZSBpcyBzZWxlY3RlZAorICoKKyAqIFZpcnR1YWwgd2lyZSBtb2RlIGlzIG5lY2Vzc2FyeSB0byBkZWxpdmVyIGxlZ2FjeSBpbnRlcnJ1cHRzIGV2ZW4gd2hlbiB0aGUKKyAqIEFQSUMgaXMgZGlzYWJsZWQuCisgKi8KK3ZvaWQgZGlzY29ubmVjdF9ic3BfQVBJQyhpbnQgdmlydF93aXJlX3NldHVwKQoreworCWlmIChwaWNfbW9kZSkgeworCQkvKgorCQkgKiBQdXQgdGhlIGJvYXJkIGJhY2sgaW50byBQSUMgbW9kZSAoaGFzIGFuIGVmZmVjdCBvbmx5IG9uCisJCSAqIGNlcnRhaW4gb2xkZXIgYm9hcmRzKS4gIE5vdGUgdGhhdCBBUElDIGludGVycnVwdHMsIGluY2x1ZGluZworCQkgKiBJUElzLCB3b24ndCB3b3JrIGJleW9uZCB0aGlzIHBvaW50ISAgVGhlIG9ubHkgZXhjZXB0aW9uIGFyZQorCQkgKiBJTklUIElQSXMuCisJCSAqLworCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJkaXNhYmxpbmcgQVBJQyBtb2RlLCAiCisJCQkJImVudGVyaW5nIFBJQyBtb2RlLlxuIik7CisJCW91dGIoMHg3MCwgMHgyMik7CisJCW91dGIoMHgwMCwgMHgyMyk7CisJfSBlbHNlIHsKKwkJLyogR28gYmFjayB0byBWaXJ0dWFsIFdpcmUgY29tcGF0aWJpbGl0eSBtb2RlICovCisJCXVuc2lnbmVkIGxvbmcgdmFsdWU7CisKKwkJLyogRm9yIHRoZSBzcHVyaW91cyBpbnRlcnJ1cHQgdXNlIHZlY3RvciBGLCBhbmQgZW5hYmxlIGl0ICovCisJCXZhbHVlID0gYXBpY19yZWFkKEFQSUNfU1BJVik7CisJCXZhbHVlICY9IH5BUElDX1ZFQ1RPUl9NQVNLOworCQl2YWx1ZSB8PSBBUElDX1NQSVZfQVBJQ19FTkFCTEVEOworCQl2YWx1ZSB8PSAweGY7CisJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfU1BJViwgdmFsdWUpOworCisJCWlmICghdmlydF93aXJlX3NldHVwKSB7CisJCQkvKgorCQkJICogRm9yIExWVDAgbWFrZSBpdCBlZGdlIHRyaWdnZXJlZCwgYWN0aXZlIGhpZ2gsCisJCQkgKiBleHRlcm5hbCBhbmQgZW5hYmxlZAorCQkJICovCisJCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDApOworCQkJdmFsdWUgJj0gfihBUElDX01PREVfTUFTSyB8IEFQSUNfU0VORF9QRU5ESU5HIHwKKwkJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CisJCQkJQVBJQ19MVlRfTEVWRUxfVFJJR0dFUiB8IEFQSUNfTFZUX01BU0tFRCApOworCQkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOworCQkJdmFsdWUgPSBTRVRfQVBJQ19ERUxJVkVSWV9NT0RFKHZhbHVlLCBBUElDX01PREVfRVhUSU5UKTsKKwkJCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUMCwgdmFsdWUpOworCQl9IGVsc2UgeworCQkJLyogRGlzYWJsZSBMVlQwICovCisJCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDAsIEFQSUNfTFZUX01BU0tFRCk7CisJCX0KKworCQkvKgorCQkgKiBGb3IgTFZUMSBtYWtlIGl0IGVkZ2UgdHJpZ2dlcmVkLCBhY3RpdmUgaGlnaCwgbm1pIGFuZAorCQkgKiBlbmFibGVkCisJCSAqLworCQl2YWx1ZSA9IGFwaWNfcmVhZChBUElDX0xWVDEpOworCQl2YWx1ZSAmPSB+KAorCQkJQVBJQ19NT0RFX01BU0sgfCBBUElDX1NFTkRfUEVORElORyB8CisJCQlBUElDX0lOUFVUX1BPTEFSSVRZIHwgQVBJQ19MVlRfUkVNT1RFX0lSUiB8CisJCQlBUElDX0xWVF9MRVZFTF9UUklHR0VSIHwgQVBJQ19MVlRfTUFTS0VEKTsKKwkJdmFsdWUgfD0gQVBJQ19MVlRfUkVNT1RFX0lSUiB8IEFQSUNfU0VORF9QRU5ESU5HOworCQl2YWx1ZSA9IFNFVF9BUElDX0RFTElWRVJZX01PREUodmFsdWUsIEFQSUNfTU9ERV9OTUkpOworCQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVDEsIHZhbHVlKTsKKwl9Cit9CisKKy8qCisgKiBQb3dlciBtYW5hZ2VtZW50CisgKi8KICNpZmRlZiBDT05GSUdfUE0KIAogc3RhdGljIHN0cnVjdCB7CkBAIC02NTMsNyArMTQwNiw3IEBACiAJaWYgKCFhcGljX3BtX3N0YXRlLmFjdGl2ZSkKIAkJcmV0dXJuIDA7CiAKLQltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOwogCiAJYXBpY19wbV9zdGF0ZS5hcGljX2lkID0gYXBpY19yZWFkKEFQSUNfSUQpOwogCWFwaWNfcG1fc3RhdGUuYXBpY190YXNrcHJpID0gYXBpY19yZWFkKEFQSUNfVEFTS1BSSSk7CkBAIC02NzIsNyArMTQyNSw3IEBACiAJaWYgKG1heGx2dCA+PSA1KQogCQlhcGljX3BtX3N0YXRlLmFwaWNfdGhtciA9IGFwaWNfcmVhZChBUElDX0xWVFRITVIpOwogI2VuZGlmCi0JCisKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJZGlzYWJsZV9sb2NhbF9BUElDKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwpAQCAtNjg4LDcgKzE0NDEsNyBAQAogCWlmICghYXBpY19wbV9zdGF0ZS5hY3RpdmUpCiAJCXJldHVybiAwOwogCi0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIApAQCAtNzcwLDY1MSArMTUyMywzIEBACiBzdGF0aWMgdm9pZCBhcGljX3BtX2FjdGl2YXRlKHZvaWQpIHsgfQogCiAjZW5kaWYJLyogQ09ORklHX1BNICovCi0KLS8qCi0gKiBEZXRlY3QgYW5kIGVuYWJsZSBsb2NhbCBBUElDcyBvbiBub24tU01QIGJvYXJkcy4KLSAqIE9yaWdpbmFsIGNvZGUgd3JpdHRlbiBieSBLZWlyIEZyYXNlci4KLSAqLwotCi1zdGF0aWMgaW50IF9faW5pdCBhcGljX3NldF92ZXJib3NpdHkoY2hhciAqc3RyKQotewotCWlmIChzdHJjbXAoImRlYnVnIiwgc3RyKSA9PSAwKQotCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfREVCVUc7Ci0JZWxzZSBpZiAoc3RyY21wKCJ2ZXJib3NlIiwgc3RyKSA9PSAwKQotCQlhcGljX3ZlcmJvc2l0eSA9IEFQSUNfVkVSQk9TRTsKLQlyZXR1cm4gMTsKLX0KLQotX19zZXR1cCgiYXBpYz0iLCBhcGljX3NldF92ZXJib3NpdHkpOwotCi1zdGF0aWMgaW50IF9faW5pdCBkZXRlY3RfaW5pdF9BUElDICh2b2lkKQotewotCXUzMiBoLCBsLCBmZWF0dXJlczsKLQotCS8qIERpc2FibGVkIGJ5IGtlcm5lbCBvcHRpb24/ICovCi0JaWYgKGVuYWJsZV9sb2NhbF9hcGljIDwgMCkKLQkJcmV0dXJuIC0xOwotCi0Jc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IpIHsKLQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2ID09IDYgJiYgYm9vdF9jcHVfZGF0YS54ODZfbW9kZWwgPiAxKSB8fAotCQkgICAgKGJvb3RfY3B1X2RhdGEueDg2ID09IDE1KSkJICAgIAotCQkJYnJlYWs7Ci0JCWdvdG8gbm9fYXBpYzsKLQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6Ci0JCWlmIChib290X2NwdV9kYXRhLng4NiA9PSA2IHx8IGJvb3RfY3B1X2RhdGEueDg2ID09IDE1IHx8Ci0JCSAgICAoYm9vdF9jcHVfZGF0YS54ODYgPT0gNSAmJiBjcHVfaGFzX2FwaWMpKQotCQkJYnJlYWs7Ci0JCWdvdG8gbm9fYXBpYzsKLQlkZWZhdWx0OgotCQlnb3RvIG5vX2FwaWM7Ci0JfQotCi0JaWYgKCFjcHVfaGFzX2FwaWMpIHsKLQkJLyoKLQkJICogT3Zlci1yaWRlIEJJT1MgYW5kIHRyeSB0byBlbmFibGUgdGhlIGxvY2FsCi0JCSAqIEFQSUMgb25seSBpZiAibGFwaWMiIHNwZWNpZmllZC4KLQkJICovCi0JCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8PSAwKSB7Ci0JCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSAiCi0JCQkgICAgICAgInlvdSBjYW4gZW5hYmxlIGl0IHdpdGggXCJsYXBpY1wiXG4iKTsKLQkJCXJldHVybiAtMTsKLQkJfQotCQkvKgotCQkgKiBTb21lIEJJT1NlcyBkaXNhYmxlIHRoZSBsb2NhbCBBUElDIGluIHRoZQotCQkgKiBBUElDX0JBU0UgTVNSLiBUaGlzIGNhbiBvbmx5IGJlIGRvbmUgaW4KLQkJICogc29mdHdhcmUgZm9yIEludGVsIFA2IG9yIGxhdGVyIGFuZCBBTUQgSzcKLQkJICogKE1vZGVsID4gMSkgb3IgbGF0ZXIuCi0JCSAqLwotCQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7Ci0JCWlmICghKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpKSB7Ci0JCQlwcmludGsoIkxvY2FsIEFQSUMgZGlzYWJsZWQgYnkgQklPUyAtLSByZWVuYWJsaW5nLlxuIik7Ci0JCQlsICY9IH5NU1JfSUEzMl9BUElDQkFTRV9CQVNFOwotCQkJbCB8PSBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUgfCBBUElDX0RFRkFVTFRfUEhZU19CQVNFOwotCQkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIGwsIGgpOwotCQkJZW5hYmxlZF92aWFfYXBpY2Jhc2UgPSAxOwotCQl9Ci0JfQotCS8qCi0JICogVGhlIEFQSUMgZmVhdHVyZSBiaXQgc2hvdWxkIG5vdyBiZSBlbmFibGVkCi0JICogaW4gYGNwdWlkJwotCSAqLwotCWZlYXR1cmVzID0gY3B1aWRfZWR4KDEpOwotCWlmICghKGZlYXR1cmVzICYgKDEgPDwgWDg2X0ZFQVRVUkVfQVBJQykpKSB7Ci0JCXByaW50aygiQ291bGQgbm90IGVuYWJsZSBBUElDIVxuIik7Ci0JCXJldHVybiAtMTsKLQl9Ci0Jc2V0X2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLQltcF9sYXBpY19hZGRyID0gQVBJQ19ERUZBVUxUX1BIWVNfQkFTRTsKLQotCS8qIFRoZSBCSU9TIG1heSBoYXZlIHNldCB1cCB0aGUgQVBJQyBhdCBzb21lIG90aGVyIGFkZHJlc3MgKi8KLQlyZG1zcihNU1JfSUEzMl9BUElDQkFTRSwgbCwgaCk7Ci0JaWYgKGwgJiBNU1JfSUEzMl9BUElDQkFTRV9FTkFCTEUpCi0JCW1wX2xhcGljX2FkZHIgPSBsICYgTVNSX0lBMzJfQVBJQ0JBU0VfQkFTRTsKLQotCWlmIChubWlfd2F0Y2hkb2cgIT0gTk1JX05PTkUpCi0JCW5taV93YXRjaGRvZyA9IE5NSV9MT0NBTF9BUElDOwotCi0JcHJpbnRrKCJGb3VuZCBhbmQgZW5hYmxlZCBsb2NhbCBBUElDIVxuIik7Ci0KLQlhcGljX3BtX2FjdGl2YXRlKCk7Ci0KLQlyZXR1cm4gMDsKLQotbm9fYXBpYzoKLQlwcmludGsoIk5vIGxvY2FsIEFQSUMgcHJlc2VudCBvciBoYXJkd2FyZSBkaXNhYmxlZFxuIik7Ci0JcmV0dXJuIC0xOwotfQotCi12b2lkIF9faW5pdCBpbml0X2FwaWNfbWFwcGluZ3Modm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGFwaWNfcGh5czsKLQotCS8qCi0JICogSWYgbm8gbG9jYWwgQVBJQyBjYW4gYmUgZm91bmQgdGhlbiBzZXQgdXAgYSBmYWtlIGFsbAotCSAqIHplcm9lcyBwYWdlIHRvIHNpbXVsYXRlIHRoZSBsb2NhbCBBUElDIGFuZCBhbm90aGVyCi0JICogb25lIGZvciB0aGUgSU8tQVBJQy4KLQkgKi8KLQlpZiAoIXNtcF9mb3VuZF9jb25maWcgJiYgZGV0ZWN0X2luaXRfQVBJQygpKSB7Ci0JCWFwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7Ci0JCWFwaWNfcGh5cyA9IF9fcGEoYXBpY19waHlzKTsKLQl9IGVsc2UKLQkJYXBpY19waHlzID0gbXBfbGFwaWNfYWRkcjsKLQotCXNldF9maXhtYXBfbm9jYWNoZShGSVhfQVBJQ19CQVNFLCBhcGljX3BoeXMpOwotCXByaW50ayhLRVJOX0RFQlVHICJtYXBwZWQgQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLCBBUElDX0JBU0UsCi0JICAgICAgIGFwaWNfcGh5cyk7Ci0KLQkvKgotCSAqIEZldGNoIHRoZSBBUElDIElEIG9mIHRoZSBCU1AgaW4gY2FzZSB3ZSBoYXZlIGEKLQkgKiBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gKG9yIHRoZSBNUCB0YWJsZSBpcyBicm9rZW4pLgotCSAqLwotCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgPT0gLTFVKQotCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBHRVRfQVBJQ19JRChhcGljX3JlYWQoQVBJQ19JRCkpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCi0JewotCQl1bnNpZ25lZCBsb25nIGlvYXBpY19waHlzLCBpZHggPSBGSVhfSU9fQVBJQ19CQVNFXzA7Ci0JCWludCBpOwotCi0JCWZvciAoaSA9IDA7IGkgPCBucl9pb2FwaWNzOyBpKyspIHsKLQkJCWlmIChzbXBfZm91bmRfY29uZmlnKSB7Ci0JCQkJaW9hcGljX3BoeXMgPSBtcF9pb2FwaWNzW2ldLm1wY19hcGljYWRkcjsKLQkJCQlpZiAoIWlvYXBpY19waHlzKSB7Ci0JCQkJCXByaW50ayhLRVJOX0VSUgotCQkJCQkgICAgICAgIldBUk5JTkc6IGJvZ3VzIHplcm8gSU8tQVBJQyAiCi0JCQkJCSAgICAgICAiYWRkcmVzcyBmb3VuZCBpbiBNUFRBQkxFLCAiCi0JCQkJCSAgICAgICAiZGlzYWJsaW5nIElPL0FQSUMgc3VwcG9ydCFcbiIpOwotCQkJCQlzbXBfZm91bmRfY29uZmlnID0gMDsKLQkJCQkJc2tpcF9pb2FwaWNfc2V0dXAgPSAxOwotCQkJCQlnb3RvIGZha2VfaW9hcGljX3BhZ2U7Ci0JCQkJfQotCQkJfSBlbHNlIHsKLWZha2VfaW9hcGljX3BhZ2U6Ci0JCQkJaW9hcGljX3BoeXMgPSAodW5zaWduZWQgbG9uZykKLQkJCQkJICAgICAgYWxsb2NfYm9vdG1lbV9wYWdlcyhQQUdFX1NJWkUpOwotCQkJCWlvYXBpY19waHlzID0gX19wYShpb2FwaWNfcGh5cyk7Ci0JCQl9Ci0JCQlzZXRfZml4bWFwX25vY2FjaGUoaWR4LCBpb2FwaWNfcGh5cyk7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAibWFwcGVkIElPQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLAotCQkJICAgICAgIF9fZml4X3RvX3ZpcnQoaWR4KSwgaW9hcGljX3BoeXMpOwotCQkJaWR4Kys7Ci0JCX0KLQl9Ci0jZW5kaWYKLX0KLQotLyoKLSAqIFRoaXMgcGFydCBzZXRzIHVwIHRoZSBBUElDIDMyIGJpdCBjbG9jayBpbiBMVlRUMSwgd2l0aCBIWiBpbnRlcnJ1cHRzCi0gKiBwZXIgc2Vjb25kLiBXZSBhc3N1bWUgdGhhdCB0aGUgY2FsbGVyIGhhcyBhbHJlYWR5IHNldCB1cCB0aGUgbG9jYWwKLSAqIEFQSUMuCi0gKgotICogVGhlIEFQSUMgdGltZXIgaXMgbm90IGV4YWN0bHkgc3luYyB3aXRoIHRoZSBleHRlcm5hbCB0aW1lciBjaGlwLCBpdAotICogY2xvc2VseSBmb2xsb3dzIGJ1cyBjbG9ja3MuCi0gKi8KLQotLyoKLSAqIFRoZSB0aW1lciBjaGlwIGlzIGFscmVhZHkgc2V0IHVwIGF0IEhaIGludGVycnVwdHMgcGVyIHNlY29uZCBoZXJlLAotICogYnV0IHdlIGRvIG5vdCBhY2NlcHQgdGltZXIgaW50ZXJydXB0cyB5ZXQuIFdlIG9ubHkgYWxsb3cgdGhlIEJQCi0gKiB0byBjYWxpYnJhdGUuCi0gKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19kZXZpbml0IGdldF84MjU0X3RpbWVyX2NvdW50KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCXVuc2lnbmVkIGludCBjb3VudDsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpODI1M19sb2NrLCBmbGFncyk7Ci0KLQlvdXRiX3AoMHgwMCwgUElUX01PREUpOwotCWNvdW50ID0gaW5iX3AoUElUX0NIMCk7Ci0JY291bnQgfD0gaW5iX3AoUElUX0NIMCkgPDwgODsKLQotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKLQotCXJldHVybiBjb3VudDsKLX0KLQotLyogbmV4dCB0aWNrIGluIDgyNTQgY2FuIGJlIGNhdWdodCBieSBjYXRjaGluZyB0aW1lciB3cmFwYXJvdW5kICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgd2FpdF84MjU0X3dyYXBhcm91bmQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY3Vycl9jb3VudCwgcHJldl9jb3VudDsKLQotCWN1cnJfY291bnQgPSBnZXRfODI1NF90aW1lcl9jb3VudCgpOwotCWRvIHsKLQkJcHJldl9jb3VudCA9IGN1cnJfY291bnQ7Ci0JCWN1cnJfY291bnQgPSBnZXRfODI1NF90aW1lcl9jb3VudCgpOwotCi0JCS8qIHdvcmthcm91bmQgZm9yIGJyb2tlbiBNZXJjdXJ5L05lcHR1bmUgKi8KLQkJaWYgKHByZXZfY291bnQgPj0gY3Vycl9jb3VudCArIDB4MTAwKQotCQkJY3Vycl9jb3VudCA9IGdldF84MjU0X3RpbWVyX2NvdW50KCk7Ci0KLQl9IHdoaWxlIChwcmV2X2NvdW50ID49IGN1cnJfY291bnQpOwotfQotCi0vKgotICogRGVmYXVsdCBpbml0aWFsaXphdGlvbiBmb3IgODI1NCB0aW1lcnMuIElmIHdlIHVzZSBvdGhlciB0aW1lcnMgbGlrZSBIUEVULAotICogd2Ugb3ZlcnJpZGUgdGhpcyBsYXRlcgotICovCi12b2lkICgqd2FpdF90aW1lcl90aWNrKSh2b2lkKSBfX2RldmluaXRkYXRhID0gd2FpdF84MjU0X3dyYXBhcm91bmQ7Ci0KLS8qCi0gKiBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGxvY2FsIEFQSUMgdGltZXIsIHdpdGggYSB0aW1lb3V0IG9mCi0gKiAnY2xvY2tzJyBBUElDIGJ1cyBjbG9jay4gRHVyaW5nIGNhbGlicmF0aW9uIHdlIGFjdHVhbGx5IGNhbGwKLSAqIHRoaXMgZnVuY3Rpb24gdHdpY2Ugb24gdGhlIGJvb3QgQ1BVLCBvbmNlIHdpdGggYSBib2d1cyB0aW1lb3V0Ci0gKiB2YWx1ZSwgc2Vjb25kIHRpbWUgZm9yIHJlYWwuIFRoZSBvdGhlciAobm9uY2FsaWJyYXRpbmcpIENQVXMKLSAqIGNhbGwgdGhpcyBmdW5jdGlvbiBvbmx5IG9uY2UsIHdpdGggdGhlIHJlYWwsIGNhbGlicmF0ZWQgdmFsdWUuCi0gKgotICogV2UgZG8gcmVhZHMgYmVmb3JlIHdyaXRlcyBldmVuIGlmIHVubmVjZXNzYXJ5LCB0byBnZXQgYXJvdW5kIHRoZQotICogUDUgQVBJQyBkb3VibGUgd3JpdGUgYnVnLgotICovCi0KLSNkZWZpbmUgQVBJQ19ESVZJU09SIDE2Ci0KLXN0YXRpYyB2b2lkIF9fc2V0dXBfQVBJQ19MVlRUKHVuc2lnbmVkIGludCBjbG9ja3MpCi17Ci0JdW5zaWduZWQgaW50IGx2dHRfdmFsdWUsIHRtcF92YWx1ZSwgdmVyOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQl2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwotCWx2dHRfdmFsdWUgPSBBUElDX0xWVF9USU1FUl9QRVJJT0RJQyB8IExPQ0FMX1RJTUVSX1ZFQ1RPUjsKLQlpZiAoIUFQSUNfSU5URUdSQVRFRCh2ZXIpKQotCQlsdnR0X3ZhbHVlIHw9IFNFVF9BUElDX1RJTUVSX0JBU0UoQVBJQ19USU1FUl9CQVNFX0RJVik7Ci0KLQlpZiAoY3B1X2lzc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKSkKLQkJbHZ0dF92YWx1ZSB8PSBBUElDX0xWVF9NQVNLRUQ7Ci0KLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX0xWVFQsIGx2dHRfdmFsdWUpOwotCi0JLyoKLQkgKiBEaXZpZGUgUElDTEsgYnkgMTYKLQkgKi8KLQl0bXBfdmFsdWUgPSBhcGljX3JlYWQoQVBJQ19URENSKTsKLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1REQ1IsICh0bXBfdmFsdWUKLQkJCQkmIH4oQVBJQ19URFJfRElWXzEgfCBBUElDX1REUl9ESVZfVE1CQVNFKSkKLQkJCQl8IEFQSUNfVERSX0RJVl8xNik7Ci0KLQlhcGljX3dyaXRlX2Fyb3VuZChBUElDX1RNSUNULCBjbG9ja3MvQVBJQ19ESVZJU09SKTsKLX0KLQotc3RhdGljIHZvaWQgX19kZXZpbml0IHNldHVwX0FQSUNfdGltZXIodW5zaWduZWQgaW50IGNsb2NrcykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyoKLQkgKiBXYWl0IGZvciBJUlEwJ3Mgc2xpY2U6Ci0JICovCi0Jd2FpdF90aW1lcl90aWNrKCk7Ci0KLQlfX3NldHVwX0FQSUNfTFZUVChjbG9ja3MpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKgotICogSW4gdGhpcyBmdW5jdGlvbiB3ZSBjYWxpYnJhdGUgQVBJQyBidXMgY2xvY2tzIHRvIHRoZSBleHRlcm5hbAotICogdGltZXIuIFVuZm9ydHVuYXRlbHkgd2UgY2Fubm90IHVzZSBqaWZmaWVzIGFuZCB0aGUgdGltZXIgaXJxCi0gKiB0byBjYWxpYnJhdGUsIHNpbmNlIHNvbWUgbGF0ZXIgYm9vdHVwIGNvZGUgZGVwZW5kcyBvbiBnZXR0aW5nCi0gKiB0aGUgZmlyc3QgaXJxPyBVZ2guCi0gKgotICogV2Ugd2FudCB0byBkbyB0aGUgY2FsaWJyYXRpb24gb25seSBvbmNlIHNpbmNlIHdlCi0gKiB3YW50IHRvIGhhdmUgbG9jYWwgdGltZXIgaXJxcyBzeW5jcm9uLiBDUFVzIGNvbm5lY3RlZAotICogYnkgdGhlIHNhbWUgQVBJQyBidXMgaGF2ZSB0aGUgdmVyeSBzYW1lIGJ1cyBmcmVxdWVuY3kuCi0gKiBBbmQgd2Ugd2FudCB0byBoYXZlIGlycXMgb2ZmIGFueXdheXMsIG5vIGFjY2lkZW50YWwKLSAqIEFQSUMgaXJxIHRoYXQgd2F5LgotICovCi0KLXN0YXRpYyBpbnQgX19pbml0IGNhbGlicmF0ZV9BUElDX2Nsb2NrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBsb25nIHQxID0gMCwgdDIgPSAwOwotCWxvbmcgdHQxLCB0dDI7Ci0JbG9uZyByZXN1bHQ7Ci0JaW50IGk7Ci0JY29uc3QgaW50IExPT1BTID0gSFovMTA7Ci0KLQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJjYWxpYnJhdGluZyBBUElDIHRpbWVyIC4uLlxuIik7Ci0KLQkvKgotCSAqIFB1dCB3aGF0ZXZlciBhcmJpdHJhcnkgKGJ1dCBsb25nIGVub3VnaCkgdGltZW91dAotCSAqIHZhbHVlIGludG8gdGhlIEFQSUMgY2xvY2ssIHdlIGp1c3Qgd2FudCB0byBnZXQgdGhlCi0JICogY291bnRlciBydW5uaW5nIGZvciBjYWxpYnJhdGlvbi4KLQkgKi8KLQlfX3NldHVwX0FQSUNfTFZUVCgxMDAwMDAwMDAwKTsKLQotCS8qCi0JICogVGhlIHRpbWVyIGNoaXAgY291bnRzIGRvd24gdG8gemVyby4gTGV0J3Mgd2FpdAotCSAqIGZvciBhIHdyYXBhcm91bmQgdG8gc3RhcnQgZXhhY3QgbWVhc3VyZW1lbnQ6Ci0JICogKHRoZSBjdXJyZW50IHRpY2sgbWlnaHQgaGF2ZSBiZWVuIGFscmVhZHkgaGFsZiBkb25lKQotCSAqLwotCi0Jd2FpdF90aW1lcl90aWNrKCk7Ci0KLQkvKgotCSAqIFdlIHdyYXBwZWQgYXJvdW5kIGp1c3Qgbm93LiBMZXQncyBzdGFydDoKLQkgKi8KLQlpZiAoY3B1X2hhc190c2MpCi0JCXJkdHNjbGwodDEpOwotCXR0MSA9IGFwaWNfcmVhZChBUElDX1RNQ0NUKTsKLQotCS8qCi0JICogTGV0J3Mgd2FpdCBMT09QUyB3cmFwcm91bmRzOgotCSAqLwotCWZvciAoaSA9IDA7IGkgPCBMT09QUzsgaSsrKQotCQl3YWl0X3RpbWVyX3RpY2soKTsKLQotCXR0MiA9IGFwaWNfcmVhZChBUElDX1RNQ0NUKTsKLQlpZiAoY3B1X2hhc190c2MpCi0JCXJkdHNjbGwodDIpOwotCi0JLyoKLQkgKiBUaGUgQVBJQyBidXMgY2xvY2sgY291bnRlciBpcyAzMiBiaXRzIG9ubHksIGl0Ci0JICogbWlnaHQgaGF2ZSBvdmVyZmxvd24sIGJ1dCBub3RlIHRoYXQgd2UgdXNlIHNpZ25lZAotCSAqIGxvbmdzLCB0aHVzIG5vIGV4dHJhIGNhcmUgbmVlZGVkLgotCSAqCi0JICogdW5kZXJmbG93biB0byBiZSBleGFjdCwgYXMgdGhlIHRpbWVyIGNvdW50cyBkb3duIDspCi0JICovCi0KLQlyZXN1bHQgPSAodHQxLXR0MikqQVBJQ19ESVZJU09SL0xPT1BTOwotCi0JaWYgKGNwdV9oYXNfdHNjKQotCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIuLi4uLiBDUFUgY2xvY2sgc3BlZWQgaXMgIgotCQkJIiVsZC4lMDRsZCBNSHouXG4iLAotCQkJKChsb25nKSh0Mi10MSkvTE9PUFMpLygxMDAwMDAwL0haKSwKLQkJCSgobG9uZykodDItdDEpL0xPT1BTKSUoMTAwMDAwMC9IWikpOwotCi0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiLi4uLi4gaG9zdCBidXMgY2xvY2sgc3BlZWQgaXMgIgotCQkiJWxkLiUwNGxkIE1Iei5cbiIsCi0JCXJlc3VsdC8oMTAwMDAwMC9IWiksCi0JCXJlc3VsdCUoMTAwMDAwMC9IWikpOwotCi0JcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHVuc2lnbmVkIGludCBjYWxpYnJhdGlvbl9yZXN1bHQ7Ci0KLXZvaWQgX19pbml0IHNldHVwX2Jvb3RfQVBJQ19jbG9jayh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiVXNpbmcgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHRzLlxuIik7Ci0JdXNpbmdfYXBpY190aW1lciA9IDE7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQljYWxpYnJhdGlvbl9yZXN1bHQgPSBjYWxpYnJhdGVfQVBJQ19jbG9jaygpOwotCS8qCi0JICogTm93IHNldCB1cCB0aGUgdGltZXIgZm9yIHJlYWwuCi0JICovCi0Jc2V0dXBfQVBJQ190aW1lcihjYWxpYnJhdGlvbl9yZXN1bHQpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi12b2lkIF9fZGV2aW5pdCBzZXR1cF9zZWNvbmRhcnlfQVBJQ19jbG9jayh2b2lkKQotewotCXNldHVwX0FQSUNfdGltZXIoY2FsaWJyYXRpb25fcmVzdWx0KTsKLX0KLQotdm9pZCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCkKLXsKLQlpZiAodXNpbmdfYXBpY190aW1lcikgewotCQl1bnNpZ25lZCBsb25nIHY7Ci0KLQkJdiA9IGFwaWNfcmVhZChBUElDX0xWVFQpOwotCQkvKgotCQkgKiBXaGVuIGFuIGlsbGVnYWwgdmVjdG9yIHZhbHVlICgwLTE1KSBpcyB3cml0dGVuIHRvIGFuIExWVAotCQkgKiBlbnRyeSBhbmQgZGVsaXZlcnkgbW9kZSBpcyBGaXhlZCwgdGhlIEFQSUMgbWF5IHNpZ25hbCBhbgotCQkgKiBpbGxlZ2FsIHZlY3RvciBlcnJvciwgd2l0aCBvdXQgcmVnYXJkIHRvIHdoZXRoZXIgdGhlIG1hc2sKLQkJICogYml0IGlzIHNldCBvciB3aGV0aGVyIGFuIGludGVycnVwdCBpcyBhY3R1YWxseSBzZWVuIG9uIGlucHV0LgotCQkgKgotCQkgKiBCb290IHNlcXVlbmNlIG1pZ2h0IGNhbGwgdGhpcyBmdW5jdGlvbiB3aGVuIHRoZSBMVlRUIGhhcwotCQkgKiAnMCcgdmVjdG9yIHZhbHVlLiBTbyBtYWtlIHN1cmUgdmVjdG9yIGZpZWxkIGlzIHNldCB0bwotCQkgKiB2YWxpZCB2YWx1ZS4KLQkJICovCi0JCXYgfD0gKEFQSUNfTFZUX01BU0tFRCB8IExPQ0FMX1RJTUVSX1ZFQ1RPUik7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdik7Ci0JfQotfQotCi12b2lkIGVuYWJsZV9BUElDX3RpbWVyKHZvaWQpCi17Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWlmICh1c2luZ19hcGljX3RpbWVyICYmCi0JICAgICFjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgdjsKLQotCQl2ID0gYXBpY19yZWFkKEFQSUNfTFZUVCk7Ci0JCWFwaWNfd3JpdGVfYXJvdW5kKEFQSUNfTFZUVCwgdiAmIH5BUElDX0xWVF9NQVNLRUQpOwotCX0KLX0KLQotdm9pZCBzd2l0Y2hfQVBJQ190aW1lcl90b19pcGkodm9pZCAqY3B1bWFzaykKLXsKLQljcHVtYXNrX3QgbWFzayA9ICooY3B1bWFza190ICopY3B1bWFzazsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JaWYgKGNwdV9pc3NldChjcHUsIG1hc2spICYmCi0JICAgICFjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCWRpc2FibGVfQVBJQ190aW1lcigpOwotCQljcHVfc2V0KGNwdSwgdGltZXJfYmNhc3RfaXBpKTsKLQl9Ci19Ci1FWFBPUlRfU1lNQk9MKHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSk7Ci0KLXZvaWQgc3dpdGNoX2lwaV90b19BUElDX3RpbWVyKHZvaWQgKmNwdW1hc2spCi17Ci0JY3B1bWFza190IG1hc2sgPSAqKGNwdW1hc2tfdCAqKWNwdW1hc2s7Ci0JaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQotCWlmIChjcHVfaXNzZXQoY3B1LCBtYXNrKSAmJgotCSAgICBjcHVfaXNzZXQoY3B1LCB0aW1lcl9iY2FzdF9pcGkpKSB7Ci0JCWNwdV9jbGVhcihjcHUsIHRpbWVyX2JjYXN0X2lwaSk7Ci0JCWVuYWJsZV9BUElDX3RpbWVyKCk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIpOwotCi0jdW5kZWYgQVBJQ19ESVZJU09SCi0KLS8qCi0gKiBMb2NhbCB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlci4gSXQgZG9lcyBib3RoIHByb2ZpbGluZyBhbmQKLSAqIHByb2Nlc3Mgc3RhdGlzdGljcy9yZXNjaGVkdWxpbmcuCi0gKgotICogV2UgZG8gcHJvZmlsaW5nIGluIGV2ZXJ5IGxvY2FsIHRpY2ssIHN0YXRpc3RpY3MvcmVzY2hlZHVsaW5nCi0gKiBoYXBwZW4gb25seSBldmVyeSAncHJvZmlsaW5nIG11bHRpcGxpZXInIHRpY2tzLiBUaGUgZGVmYXVsdAotICogbXVsdGlwbGllciBpcyAxIGFuZCBpdCBjYW4gYmUgY2hhbmdlZCBieSB3cml0aW5nIHRoZSBuZXcgbXVsdGlwbGllcgotICogdmFsdWUgaW50byAvcHJvYy9wcm9maWxlLgotICovCi0KLWlubGluZSB2b2lkIHNtcF9sb2NhbF90aW1lcl9pbnRlcnJ1cHQodm9pZCkKLXsKLQlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Ci0jaWZkZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZV92bShnZXRfaXJxX3JlZ3MoKSkpOwotI2VuZGlmCi0KLQkvKgotCSAqIFdlIHRha2UgdGhlICdsb25nJyByZXR1cm4gcGF0aCwgYW5kIHRoZXJlIGV2ZXJ5IHN1YnN5c3RlbQotCSAqIGdyYWJzIHRoZSBhcHJvcHJpYXRlIGxvY2tzIChrZXJuZWwgbG9jay8gaXJxIGxvY2spLgotCSAqCi0JICogd2UgbWlnaHQgd2FudCB0byBkZWNvdXBsZSBwcm9maWxpbmcgZnJvbSB0aGUgJ2xvbmcgcGF0aCcsCi0JICogYW5kIGRvIHRoZSBwcm9maWxpbmcgdG90YWxseSBpbiBhc3NlbWJseS4KLQkgKgotCSAqIEN1cnJlbnRseSB0aGlzIGlzbid0IHRvbyBtdWNoIG9mIGFuIGlzc3VlIChwZXJmb3JtYW5jZSB3aXNlKSwKLQkgKiB3ZSBjYW4gdGFrZSBtb3JlIHRoYW4gMTAwSyBsb2NhbCBpcnFzIHBlciBzZWNvbmQgb24gYSAxMDAgTUh6IFA1LgotCSAqLwotfQotCi0vKgotICogTG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQuIFRoaXMgaXMgdGhlIG1vc3QgbmF0dXJhbCB3YXkgZm9yIGRvaW5nCi0gKiBsb2NhbCBpbnRlcnJ1cHRzLCBidXQgbG9jYWwgdGltZXIgaW50ZXJydXB0cyBjYW4gYmUgZW11bGF0ZWQgYnkKLSAqIGJyb2FkY2FzdCBpbnRlcnJ1cHRzIHRvby4gW2luIGNhc2UgdGhlIGh3IGRvZXNuJ3Qgc3VwcG9ydCBBUElDIHRpbWVyc10KLSAqCi0gKiBbIGlmIGEgc2luZ2xlLUNQVSBzeXN0ZW0gcnVucyBhbiBTTVAga2VybmVsIHRoZW4gd2UgY2FsbCB0aGUgbG9jYWwKLSAqICAgaW50ZXJydXB0IGFzIHdlbGwuIFRodXMgd2UgY2Fubm90IGlubGluZSB0aGUgbG9jYWwgaXJxIC4uLiBdCi0gKi8KLQotZmFzdGNhbGwgdm9pZCBzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHB0X3JlZ3MgKm9sZF9yZWdzID0gc2V0X2lycV9yZWdzKHJlZ3MpOwotCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0KLQkvKgotCSAqIHRoZSBOTUkgZGVhZGxvY2stZGV0ZWN0b3IgdXNlcyB0aGlzLgotCSAqLwotCXBlcl9jcHUoaXJxX3N0YXQsIGNwdSkuYXBpY190aW1lcl9pcnFzKys7Ci0KLQkvKgotCSAqIE5PVEUhIFdlJ2QgYmV0dGVyIEFDSyB0aGUgaXJxIGltbWVkaWF0ZWx5LAotCSAqIGJlY2F1c2UgdGltZXIgaGFuZGxpbmcgY2FuIGJlIHNsb3cuCi0JICovCi0JYWNrX0FQSUNfaXJxKCk7Ci0JLyoKLQkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIGV4cGVjdHMgdXMgdG8gaGF2ZSBkb25lIGlycV9lbnRlcigpLgotCSAqIEJlc2lkZXMsIGlmIHdlIGRvbid0IHRpbWVyIGludGVycnVwdHMgaWdub3JlIHRoZSBnbG9iYWwKLQkgKiBpbnRlcnJ1cHQgbG9jaywgd2hpY2ggaXMgdGhlIFdyb25nVGhpbmcgKHRtKSB0byBkby4KLQkgKi8KLQlleGl0X2lkbGUoKTsKLQlpcnFfZW50ZXIoKTsKLQlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KCk7Ci0JaXJxX2V4aXQoKTsKLQlzZXRfaXJxX3JlZ3Mob2xkX3JlZ3MpOwotfQotCi0jaWZuZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIHVwX2FwaWNfdGltZXJfaW50ZXJydXB0X2NhbGwodm9pZCkKLXsKLQlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwotCi0JLyoKLQkgKiB0aGUgTk1JIGRlYWRsb2NrLWRldGVjdG9yIHVzZXMgdGhpcy4KLQkgKi8KLQlwZXJfY3B1KGlycV9zdGF0LCBjcHUpLmFwaWNfdGltZXJfaXJxcysrOwotCi0Jc21wX2xvY2FsX3RpbWVyX2ludGVycnVwdCgpOwotfQotI2VuZGlmCi0KLXZvaWQgc21wX3NlbmRfdGltZXJfYnJvYWRjYXN0X2lwaSh2b2lkKQotewotCWNwdW1hc2tfdCBtYXNrOwotCi0JY3B1c19hbmQobWFzaywgY3B1X29ubGluZV9tYXAsIHRpbWVyX2JjYXN0X2lwaSk7Ci0JaWYgKCFjcHVzX2VtcHR5KG1hc2spKSB7Ci0jaWZkZWYgQ09ORklHX1NNUAotCQlzZW5kX0lQSV9tYXNrKG1hc2ssIExPQ0FMX1RJTUVSX1ZFQ1RPUik7Ci0jZWxzZQotCQkvKgotCQkgKiBXZSBjYW4gZGlyZWN0bHkgY2FsbCB0aGUgYXBpYyB0aW1lciBpbnRlcnJ1cHQgaGFuZGxlcgotCQkgKiBpbiBVUCBjYXNlLiBNaW51cyBhbGwgaXJxIHJlbGF0ZWQgZnVuY3Rpb25zCi0JCSAqLwotCQl1cF9hcGljX3RpbWVyX2ludGVycnVwdF9jYWxsKCk7Ci0jZW5kaWYKLQl9Ci19Ci0KLWludCBzZXR1cF9wcm9maWxpbmdfdGltZXIodW5zaWduZWQgaW50IG11bHRpcGxpZXIpCi17Ci0JcmV0dXJuIC1FSU5WQUw7Ci19Ci0KLS8qCi0gKiBUaGlzIGludGVycnVwdCBzaG91bGQgX25ldmVyXyBoYXBwZW4gd2l0aCBvdXIgQVBJQy9TTVAgYXJjaGl0ZWN0dXJlCi0gKi8KLWZhc3RjYWxsIHZvaWQgc21wX3NwdXJpb3VzX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKLXsKLQl1bnNpZ25lZCBsb25nIHY7Ci0KLQlleGl0X2lkbGUoKTsKLQlpcnFfZW50ZXIoKTsKLQkvKgotCSAqIENoZWNrIGlmIHRoaXMgcmVhbGx5IGlzIGEgc3B1cmlvdXMgaW50ZXJydXB0IGFuZCBBQ0sgaXQKLQkgKiBpZiBpdCBpcyBhIHZlY3RvcmVkIG9uZS4gIEp1c3QgaW4gY2FzZS4uLgotCSAqIFNwdXJpb3VzIGludGVycnVwdHMgc2hvdWxkIG5vdCBiZSBBQ0tlZC4KLQkgKi8KLQl2ID0gYXBpY19yZWFkKEFQSUNfSVNSICsgKChTUFVSSU9VU19BUElDX1ZFQ1RPUiAmIH4weDFmKSA+PiAxKSk7Ci0JaWYgKHYgJiAoMSA8PCAoU1BVUklPVVNfQVBJQ19WRUNUT1IgJiAweDFmKSkpCi0JCWFja19BUElDX2lycSgpOwotCi0JLyogc2VlIHN3LWRldi1tYW4gdm9sIDMsIGNoYXB0ZXIgNy40LjEzLjUgKi8KLQlwcmludGsoS0VSTl9JTkZPICJzcHVyaW91cyBBUElDIGludGVycnVwdCBvbiBDUFUjJWQsIHNob3VsZCBuZXZlciBoYXBwZW4uXG4iLAotCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlpcnFfZXhpdCgpOwotfQotCi0vKgotICogVGhpcyBpbnRlcnJ1cHQgc2hvdWxkIG5ldmVyIGhhcHBlbiB3aXRoIG91ciBBUElDL1NNUCBhcmNoaXRlY3R1cmUKLSAqLwotCi1mYXN0Y2FsbCB2b2lkIHNtcF9lcnJvcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0JdW5zaWduZWQgbG9uZyB2LCB2MTsKLQotCWV4aXRfaWRsZSgpOwotCWlycV9lbnRlcigpOwotCS8qIEZpcnN0IHRpY2tsZSB0aGUgaGFyZHdhcmUsIG9ubHkgdGhlbiByZXBvcnQgd2hhdCB3ZW50IG9uLiAtLSBSRVcgKi8KLQl2ID0gYXBpY19yZWFkKEFQSUNfRVNSKTsKLQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKLQl2MSA9IGFwaWNfcmVhZChBUElDX0VTUik7Ci0JYWNrX0FQSUNfaXJxKCk7Ci0JYXRvbWljX2luYygmaXJxX2Vycl9jb3VudCk7Ci0KLQkvKiBIZXJlIGlzIHdoYXQgdGhlIEFQSUMgZXJyb3IgYml0cyBtZWFuOgotCSAgIDA6IFNlbmQgQ1MgZXJyb3IKLQkgICAxOiBSZWNlaXZlIENTIGVycm9yCi0JICAgMjogU2VuZCBhY2NlcHQgZXJyb3IKLQkgICAzOiBSZWNlaXZlIGFjY2VwdCBlcnJvcgotCSAgIDQ6IFJlc2VydmVkCi0JICAgNTogU2VuZCBpbGxlZ2FsIHZlY3RvcgotCSAgIDY6IFJlY2VpdmVkIGlsbGVnYWwgdmVjdG9yCi0JICAgNzogSWxsZWdhbCByZWdpc3RlciBhZGRyZXNzCi0JKi8KLQlwcmludGsgKEtFUk5fREVCVUcgIkFQSUMgZXJyb3Igb24gQ1BVJWQ6ICUwMmx4KCUwMmx4KVxuIiwKLQkgICAgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSwgdiAsIHYxKTsKLQlpcnFfZXhpdCgpOwotfQotCi0vKgotICogVGhpcyBpbml0aWFsaXplcyB0aGUgSU8tQVBJQyBhbmQgQVBJQyBoYXJkd2FyZSBpZiB0aGlzIGlzCi0gKiBhIFVQIGtlcm5lbC4KLSAqLwotaW50IF9faW5pdCBBUElDX2luaXRfdW5pcHJvY2Vzc29yICh2b2lkKQotewotCWlmIChlbmFibGVfbG9jYWxfYXBpYyA8IDApCi0JCWNsZWFyX2JpdChYODZfRkVBVFVSRV9BUElDLCBib290X2NwdV9kYXRhLng4Nl9jYXBhYmlsaXR5KTsKLQotCWlmICghc21wX2ZvdW5kX2NvbmZpZyAmJiAhY3B1X2hhc19hcGljKQotCQlyZXR1cm4gLTE7Ci0KLQkvKgotCSAqIENvbXBsYWluIGlmIHRoZSBCSU9TIHByZXRlbmRzIHRoZXJlIGlzIG9uZS4KLQkgKi8KLQlpZiAoIWNwdV9oYXNfYXBpYyAmJiBBUElDX0lOVEVHUkFURUQoYXBpY192ZXJzaW9uW2Jvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZF0pKSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQklPUyBidWcsIGxvY2FsIEFQSUMgIyVkIG5vdCBkZXRlY3RlZCEuLi5cbiIsCi0JCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOwotCQljbGVhcl9iaXQoWDg2X0ZFQVRVUkVfQVBJQywgYm9vdF9jcHVfZGF0YS54ODZfY2FwYWJpbGl0eSk7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQl2ZXJpZnlfbG9jYWxfQVBJQygpOwotCi0JY29ubmVjdF9ic3BfQVBJQygpOwotCi0JLyoKLQkgKiBIYWNrOiBJbiBjYXNlIG9mIGtkdW1wLCBhZnRlciBhIGNyYXNoLCBrZXJuZWwgbWlnaHQgYmUgYm9vdGluZwotCSAqIG9uIGEgY3B1IHdpdGggbm9uLXplcm8gbGFwaWMgaWQuIEJ1dCBib290X2NwdV9waHlzaWNhbF9hcGljaWQKLQkgKiBtaWdodCBiZSB6ZXJvIGlmIHJlYWQgZnJvbSBNUCB0YWJsZXMuIEdldCBpdCBmcm9tIExBUElDLgotCSAqLwotI2lmZGVmIENPTkZJR19DUkFTSF9EVU1QCi0JYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gR0VUX0FQSUNfSUQoYXBpY19yZWFkKEFQSUNfSUQpKTsKLSNlbmRpZgotCXBoeXNfY3B1X3ByZXNlbnRfbWFwID0gcGh5c2lkX21hc2tfb2ZfcGh5c2lkKGJvb3RfY3B1X3BoeXNpY2FsX2FwaWNpZCk7Ci0KLQlzZXR1cF9sb2NhbF9BUElDKCk7Ci0KLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQlpZiAoc21wX2ZvdW5kX2NvbmZpZykKLQkJaWYgKCFza2lwX2lvYXBpY19zZXR1cCAmJiBucl9pb2FwaWNzKQotCQkJc2V0dXBfSU9fQVBJQygpOwotI2VuZGlmCi0Jc2V0dXBfYm9vdF9jbG9jaygpOwotCi0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2xhcGljKGNoYXIgKmFyZykKLXsKLQlsYXBpY19lbmFibGUoKTsKLQlyZXR1cm4gMDsKLX0KLWVhcmx5X3BhcmFtKCJsYXBpYyIsIHBhcnNlX2xhcGljKTsKLQotc3RhdGljIGludCBfX2luaXQgcGFyc2Vfbm9sYXBpYyhjaGFyICphcmcpCi17Ci0JbGFwaWNfZGlzYWJsZSgpOwotCXJldHVybiAwOwotfQotZWFybHlfcGFyYW0oIm5vbGFwaWMiLCBwYXJzZV9ub2xhcGljKTsKLQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYyBiL2FyY2gvaTM4Ni9rZXJuZWwvYXBtLmMKaW5kZXggZjliYTBhZi4uMDY0YmJmMiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9hcG0uYworKysgYi9hcmNoL2kzODYva2VybmVsL2FwbS5jCkBAIC0yMzYsNyArMjM2LDYgQEAKIAogI2luY2x1ZGUgImlvX3BvcnRzLmgiCiAKLWV4dGVybiB1bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCk7CiBleHRlcm4gdm9pZCBtYWNoaW5lX3JlYWxfcmVzdGFydCh1bnNpZ25lZCBjaGFyICosIGludCk7CiAKICNpZiBkZWZpbmVkKENPTkZJR19BUE1fRElTUExBWV9CTEFOSykgJiYgZGVmaW5lZChDT05GSUdfVlQpCkBAIC0xMTc2LDI4ICsxMTc1LDYgQEAKIAlzcGluX3VubG9jaygmdXNlcl9saXN0X2xvY2spOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfdGltZSh2b2lkKQotewotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQlpZiAoZ290X2Nsb2NrX2RpZmYpIHsJLyogTXVzdCBrbm93IHRpbWUgem9uZSBpbiBvcmRlciB0byBzZXQgY2xvY2sgKi8KLQkJdHMudHZfc2VjID0gZ2V0X2Ntb3NfdGltZSgpICsgY2xvY2tfY21vc19kaWZmOwotCQl0cy50dl9uc2VjID0gMDsKLQkJZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0JfSAKLX0KLQotc3RhdGljIHZvaWQgZ2V0X3RpbWVfZGlmZih2b2lkKQotewotI2lmbmRlZiBDT05GSUdfQVBNX1JUQ19JU19HTVQKLQkvKgotCSAqIEVzdGltYXRlIHRpbWUgem9uZSBzbyB0aGF0IHNldF90aW1lIGNhbiB1cGRhdGUgdGhlIGNsb2NrCi0JICovCi0JY2xvY2tfY21vc19kaWZmID0gLWdldF9jbW9zX3RpbWUoKTsKLQljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKLQlnb3RfY2xvY2tfZGlmZiA9IDE7Ci0jZW5kaWYKLX0KLQogc3RhdGljIHZvaWQgcmVpbml0X3RpbWVyKHZvaWQpCiB7CiAjaWZkZWYgSU5JVF9USU1FUl9BRlRFUl9TVVNQRU5ECkBAIC0xMjM3LDE5ICsxMjE0LDYgQEAKIAlsb2NhbF9pcnFfZGlzYWJsZSgpOwogCWRldmljZV9wb3dlcl9kb3duKFBNU0dfU1VTUEVORCk7CiAKLQkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0KLQkvKiBwcm90ZWN0IGFnYWluc3QgYWNjZXNzIHRvIHRpbWVyIGNoaXAgcmVnaXN0ZXJzICovCi0Jc3Bpbl9sb2NrKCZpODI1M19sb2NrKTsKLQotCWdldF90aW1lX2RpZmYoKTsKLQkvKgotCSAqIElycSBzcGlubG9jayBtdXN0IGJlIGRyb3BwZWQgYXJvdW5kIHNldF9zeXN0ZW1fcG93ZXJfc3RhdGUuCi0JICogV2UnbGwgdW5kbyBhbnkgdGltZXIgY2hhbmdlcyBkdWUgdG8gaW50ZXJydXB0cyBiZWxvdy4KLQkgKi8KLQlzcGluX3VubG9jaygmaTgyNTNfbG9jayk7Ci0Jd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAKIAlzYXZlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwpAQCAtMTI1OCw3ICsxMjIyLDYgQEAKIAlyZXN0b3JlX3Byb2Nlc3Nvcl9zdGF0ZSgpOwogCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlzZXRfdGltZSgpOwogCXJlaW5pdF90aW1lcigpOwogCiAJaWYgKGVyciA9PSBBUE1fTk9fRVJST1IpCkBAIC0xMjg4LDExICsxMjUxLDYgQEAKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAJZGV2aWNlX3Bvd2VyX2Rvd24oUE1TR19TVVNQRU5EKTsKLQkvKiBzZXJpYWxpemUgd2l0aCB0aGUgdGltZXIgaW50ZXJydXB0ICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0JLyogSWYgbmVlZGVkLCBub3RpZnkgZHJpdmVycyBoZXJlICovCi0JZ2V0X3RpbWVfZGlmZigpOwotCXdyaXRlX3NlcXVubG9jaygmeHRpbWVfbG9jayk7CiAJbG9jYWxfaXJxX2VuYWJsZSgpOwogCiAJZXJyID0gc2V0X3N5c3RlbV9wb3dlcl9zdGF0ZShBUE1fU1RBVEVfU1RBTkRCWSk7CkBAIC0xMzg2LDcgKzEzNDQsNiBAQAogCQkJaWdub3JlX2JvdW5jZSA9IDE7CiAJCQlpZiAoKGV2ZW50ICE9IEFQTV9OT1JNQUxfUkVTVU1FKQogCQkJICAgIHx8IChpZ25vcmVfbm9ybWFsX3Jlc3VtZSA9PSAwKSkgewotCQkJCXNldF90aW1lKCk7CiAJCQkJZGV2aWNlX3Jlc3VtZSgpOwogCQkJCXBtX3NlbmRfYWxsKFBNX1JFU1VNRSwgKHZvaWQgKikwKTsKIAkJCQlxdWV1ZV9ldmVudChldmVudCwgTlVMTCk7CkBAIC0xNDAyLDcgKzEzNTksNiBAQAogCQkJYnJlYWs7CiAKIAkJY2FzZSBBUE1fVVBEQVRFX1RJTUU6Ci0JCQlzZXRfdGltZSgpOwogCQkJYnJlYWs7CiAKIAkJY2FzZSBBUE1fQ1JJVElDQUxfU1VTUEVORDoKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvS2NvbmZpZwppbmRleCA1Mjk5YzViLi42YzUyMTgyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnCkBAIC0yMTcsNiArMjE3LDE1IEBACiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIAorY29uZmlnIFg4Nl9FX1BPV0VSU0FWRVIKKwl0cmlzdGF0ZSAiVklBIEM3IEVuaGFuY2VkIFBvd2VyU2F2ZXIgKEVYUEVSSU1FTlRBTCkiCisJc2VsZWN0IENQVV9GUkVRX1RBQkxFCisJZGVwZW5kcyBvbiBFWFBFUklNRU5UQUwKKwloZWxwCisJICBUaGlzIGFkZHMgdGhlIENQVUZyZXEgZHJpdmVyIGZvciBWSUEgQzcgcHJvY2Vzc29ycy4KKworCSAgSWYgaW4gZG91YnQsIHNheSBOLgorCiBjb21tZW50ICJzaGFyZWQgb3B0aW9ucyIKIAogY29uZmlnIFg4Nl9BQ1BJX0NQVUZSRVFfUFJPQ19JTlRGCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9NYWtlZmlsZQppbmRleCA4ZGUzYWJlLi41NjBmNzc2IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL01ha2VmaWxlCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvTWFrZWZpbGUKQEAgLTIsNiArMiw3IEBACiBvYmotJChDT05GSUdfWDg2X1BPV0VSTk9XX0s3KQkJKz0gcG93ZXJub3ctazcubwogb2JqLSQoQ09ORklHX1g4Nl9QT1dFUk5PV19LOCkJCSs9IHBvd2Vybm93LWs4Lm8KIG9iai0kKENPTkZJR19YODZfTE9OR0hBVUwpCQkrPSBsb25naGF1bC5vCitvYmotJChDT05GSUdfWDg2X0VfUE9XRVJTQVZFUikJCSs9IGVfcG93ZXJzYXZlci5vCiBvYmotJChDT05GSUdfRUxBTl9DUFVGUkVRKQkJKz0gZWxhbmZyZXEubwogb2JqLSQoQ09ORklHX1NDNTIwX0NQVUZSRVEpCQkrPSBzYzUyMF9mcmVxLm8KIG9iai0kKENPTkZJR19YODZfTE9OR1JVTikJCSs9IGxvbmdydW4ubyAgCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2VfcG93ZXJzYXZlci5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDNkOThlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9lX3Bvd2Vyc2F2ZXIuYwpAQCAtMCwwICsxLDMzNCBAQAorLyoKKyAqICBCYXNlZCBvbiBkb2N1bWVudGF0aW9uIHByb3ZpZGVkIGJ5IERhdmUgSm9uZXMuIFRoYW5rcyEKKyAqCisgKiAgTGljZW5zZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIExpY2Vuc2UgdmVyc2lvbiAyLgorICoKKyAqICBCSUcgRkFUIERJU0NMQUlNRVI6IFdvcmsgaW4gcHJvZ3Jlc3MgY29kZS4gUG9zc2libHkgKmRhbmdlcm91cyoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisKKyNpbmNsdWRlIDxhc20vbXNyLmg+CisjaW5jbHVkZSA8YXNtL3RzYy5oPgorI2luY2x1ZGUgPGFzbS90aW1leC5oPgorI2luY2x1ZGUgPGFzbS9pby5oPgorI2luY2x1ZGUgPGFzbS9kZWxheS5oPgorCisjZGVmaW5lIEVQU19CUkFORF9DN00JMAorI2RlZmluZSBFUFNfQlJBTkRfQzcJMQorI2RlZmluZSBFUFNfQlJBTkRfRURFTgkyCisjZGVmaW5lIEVQU19CUkFORF9DMwkzCisKK3N0cnVjdCBlcHNfY3B1X2RhdGEgeworCXUzMiBmc2I7CisJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlIGZyZXFfdGFibGVbXTsKK307CisKK3N0YXRpYyBzdHJ1Y3QgZXBzX2NwdV9kYXRhICplcHNfY3B1W05SX0NQVVNdOworCisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZXBzX2dldCh1bnNpZ25lZCBpbnQgY3B1KQoreworCXN0cnVjdCBlcHNfY3B1X2RhdGEgKmNlbnRhdXI7CisJdTMyIGxvLCBoaTsKKworCWlmIChjcHUpCisJCXJldHVybiAwOworCWNlbnRhdXIgPSBlcHNfY3B1W2NwdV07CisJaWYgKGNlbnRhdXIgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKKwlyZXR1cm4gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOworfQorCitzdGF0aWMgaW50IGVwc19zZXRfc3RhdGUoc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1ciwKKwkJCSB1bnNpZ25lZCBpbnQgY3B1LAorCQkJIHUzMiBkZXN0X3N0YXRlKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzIGZyZXFzOworCXUzMiBsbywgaGk7CisJaW50IGVyciA9IDA7CisJaW50IGk7CisKKwlmcmVxcy5vbGQgPSBlcHNfZ2V0KGNwdSk7CisJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChkZXN0X3N0YXRlID4+IDgpICYgMHhmZik7CisJZnJlcXMuY3B1ID0gY3B1OworCWNwdWZyZXFfbm90aWZ5X3RyYW5zaXRpb24oJmZyZXFzLCBDUFVGUkVRX1BSRUNIQU5HRSk7CisKKwkvKiBXYWl0IHdoaWxlIENQVSBpcyBidXN5ICovCisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJaSA9IDA7CisJd2hpbGUgKGxvICYgKCgxIDw8IDE2KSB8ICgxIDw8IDE3KSkpIHsKKwkJdWRlbGF5KDE2KTsKKwkJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJCWkrKzsKKwkJaWYgKHVubGlrZWx5KGkgPiA2NCkpIHsKKwkJCWVyciA9IC1FTk9ERVY7CisJCQlnb3RvIHBvc3RjaGFuZ2U7CisJCX0KKwl9CisJLyogU2V0IG5ldyBtdWx0aXBsaWVyIGFuZCB2b2x0YWdlICovCisJd3Jtc3IoTVNSX0lBMzJfUEVSRl9DVEwsIGRlc3Rfc3RhdGUgJiAweGZmZmYsIDApOworCS8qIFdhaXQgdW50aWwgdHJhbnNpdGlvbiBlbmQgKi8KKwlpID0gMDsKKwlkbyB7CisJCXVkZWxheSgxNik7CisJCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOworCQlpKys7CisJCWlmICh1bmxpa2VseShpID4gNjQpKSB7CisJCQllcnIgPSAtRU5PREVWOworCQkJZ290byBwb3N0Y2hhbmdlOworCQl9CisJfSB3aGlsZSAobG8gJiAoKDEgPDwgMTYpIHwgKDEgPDwgMTcpKSk7CisKKwkvKiBSZXR1cm4gY3VycmVudCBmcmVxdWVuY3kgKi8KK3Bvc3RjaGFuZ2U6CisJcmRtc3IoTVNSX0lBMzJfUEVSRl9TVEFUVVMsIGxvLCBoaSk7CisJZnJlcXMubmV3ID0gY2VudGF1ci0+ZnNiICogKChsbyA+PiA4KSAmIDB4ZmYpOworCisJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGludCBlcHNfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAorCQkJICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKKwkJCSAgICAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCit7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwl1bnNpZ25lZCBpbnQgbmV3c3RhdGUgPSAwOworCXVuc2lnbmVkIGludCBjcHUgPSBwb2xpY3ktPmNwdTsKKwl1bnNpZ25lZCBpbnQgZGVzdF9zdGF0ZTsKKwlpbnQgcmV0OworCisJaWYgKHVubGlrZWx5KGVwc19jcHVbY3B1XSA9PSBOVUxMKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisJY2VudGF1ciA9IGVwc19jcHVbY3B1XTsKKworCWlmICh1bmxpa2VseShjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV90YXJnZXQocG9saWN5LAorCQkJJmVwc19jcHVbY3B1XS0+ZnJlcV90YWJsZVswXSwKKwkJCXRhcmdldF9mcmVxLAorCQkJcmVsYXRpb24sCisJCQkmbmV3c3RhdGUpKSkgeworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKiBNYWtlIGZyZXF1ZW5jeSB0cmFuc2l0aW9uICovCisJZGVzdF9zdGF0ZSA9IGNlbnRhdXItPmZyZXFfdGFibGVbbmV3c3RhdGVdLmluZGV4ICYgMHhmZmZmOworCXJldCA9IGVwc19zZXRfc3RhdGUoY2VudGF1ciwgY3B1LCBkZXN0X3N0YXRlKTsKKwlpZiAocmV0KQorCQlwcmludGsoS0VSTl9FUlIgImVwczogVGltZW91dCFcbiIpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgZXBzX3ZlcmlmeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwlyZXR1cm4gY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfdmVyaWZ5KHBvbGljeSwKKwkJCSZlcHNfY3B1W3BvbGljeS0+Y3B1XS0+ZnJlcV90YWJsZVswXSk7Cit9CisKK3N0YXRpYyBpbnQgZXBzX2NwdV9pbml0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KQoreworCXVuc2lnbmVkIGludCBpOworCXUzMiBsbywgaGk7CisJdTY0IHZhbDsKKwl1OCBjdXJyZW50X211bHRpcGxpZXIsIGN1cnJlbnRfdm9sdGFnZTsKKwl1OCBtYXhfbXVsdGlwbGllciwgbWF4X3ZvbHRhZ2U7CisJdTggbWluX211bHRpcGxpZXIsIG1pbl92b2x0YWdlOworCXU4IGJyYW5kOworCXUzMiBmc2I7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwlzdHJ1Y3QgY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGUgKmZfdGFibGU7CisJaW50IGssIHN0ZXAsIHZvbHRhZ2U7CisJaW50IHJldDsKKwlpbnQgc3RhdGVzOworCisJaWYgKHBvbGljeS0+Y3B1ICE9IDApCisJCXJldHVybiAtRU5PREVWOworCisJLyogQ2hlY2sgYnJhbmQgKi8KKwlwcmludGsoImVwczogRGV0ZWN0ZWQgVklBICIpOworCXJkbXNyKDB4MTE1MywgbG8sIGhpKTsKKwlicmFuZCA9ICgoKGxvID4+IDIpIF4gbG8pID4+IDE4KSAmIDM7CisJc3dpdGNoKGJyYW5kKSB7CisJY2FzZSBFUFNfQlJBTkRfQzdNOgorCQlwcmludGsoIkM3LU1cbiIpOworCQlicmVhazsKKwljYXNlIEVQU19CUkFORF9DNzoKKwkJcHJpbnRrKCJDN1xuIik7CisJCWJyZWFrOworCWNhc2UgRVBTX0JSQU5EX0VERU46CisJCXByaW50aygiRWRlblxuIik7CisJCWJyZWFrOworCWNhc2UgRVBTX0JSQU5EX0MzOgorCQlwcmludGsoIkMzXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJCWJyZWFrOworCX0KKwkvKiBFbmFibGUgRW5oYW5jZWQgUG93ZXJTYXZlciAqLworCXJkbXNybChNU1JfSUEzMl9NSVNDX0VOQUJMRSwgdmFsKTsKKwlpZiAoISh2YWwgJiAxIDw8IDE2KSkgeworCQl2YWwgfD0gMSA8PCAxNjsKKwkJd3Jtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOworCQkvKiBDYW4gYmUgbG9ja2VkIGF0IDAgKi8KKwkJcmRtc3JsKE1TUl9JQTMyX01JU0NfRU5BQkxFLCB2YWwpOworCQlpZiAoISh2YWwgJiAxIDw8IDE2KSkgeworCQkJcHJpbnRrKCJlcHM6IENhbid0IGVuYWJsZSBFbmhhbmNlZCBQb3dlclNhdmVyXG4iKTsKKwkJCXJldHVybiAtRU5PREVWOworCQl9CisJfQorCisJLyogUHJpbnQgdm9sdGFnZSBhbmQgbXVsdGlwbGllciAqLworCXJkbXNyKE1TUl9JQTMyX1BFUkZfU1RBVFVTLCBsbywgaGkpOworCWN1cnJlbnRfdm9sdGFnZSA9IGxvICYgMHhmZjsKKwlwcmludGsoImVwczogQ3VycmVudCB2b2x0YWdlID0gJWRtVlxuIiwgY3VycmVudF92b2x0YWdlICogMTYgKyA3MDApOworCWN1cnJlbnRfbXVsdGlwbGllciA9IChsbyA+PiA4KSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IEN1cnJlbnQgbXVsdGlwbGllciA9ICVkXG4iLCBjdXJyZW50X211bHRpcGxpZXIpOworCisJLyogUHJpbnQgbGltaXRzICovCisJbWF4X3ZvbHRhZ2UgPSBoaSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IEhpZ2hlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1heF92b2x0YWdlICogMTYgKyA3MDApOworCW1heF9tdWx0aXBsaWVyID0gKGhpID4+IDgpICYgMHhmZjsKKwlwcmludGsoImVwczogSGlnaGVzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1heF9tdWx0aXBsaWVyKTsKKwltaW5fdm9sdGFnZSA9IChoaSA+PiAxNikgJiAweGZmOworCXByaW50aygiZXBzOiBMb3dlc3Qgdm9sdGFnZSA9ICVkbVZcbiIsIG1pbl92b2x0YWdlICogMTYgKyA3MDApOworCW1pbl9tdWx0aXBsaWVyID0gKGhpID4+IDI0KSAmIDB4ZmY7CisJcHJpbnRrKCJlcHM6IExvd2VzdCBtdWx0aXBsaWVyID0gJWRcbiIsIG1pbl9tdWx0aXBsaWVyKTsKKworCS8qIFNhbml0eSBjaGVja3MgKi8KKwlpZiAoY3VycmVudF9tdWx0aXBsaWVyID09IDAgfHwgbWF4X211bHRpcGxpZXIgPT0gMAorCSAgICB8fCBtaW5fbXVsdGlwbGllciA9PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoY3VycmVudF9tdWx0aXBsaWVyID4gbWF4X211bHRpcGxpZXIKKwkgICAgfHwgbWF4X211bHRpcGxpZXIgPD0gbWluX211bHRpcGxpZXIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChjdXJyZW50X3ZvbHRhZ2UgPiAweDFjIHx8IG1heF92b2x0YWdlID4gMHgxYykKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKG1heF92b2x0YWdlIDwgbWluX3ZvbHRhZ2UpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogQ2FsYyBGU0Igc3BlZWQgKi8KKwlmc2IgPSBjcHVfa2h6IC8gY3VycmVudF9tdWx0aXBsaWVyOworCS8qIENhbGMgbnVtYmVyIG9mIHAtc3RhdGVzIHN1cHBvcnRlZCAqLworCWlmIChicmFuZCA9PSBFUFNfQlJBTkRfQzdNKQorCQlzdGF0ZXMgPSBtYXhfbXVsdGlwbGllciAtIG1pbl9tdWx0aXBsaWVyICsgMTsKKwllbHNlCisJCXN0YXRlcyA9IDI7CisKKwkvKiBBbGxvY2F0ZSBwcml2YXRlIGRhdGEgYW5kIGZyZXF1ZW5jeSB0YWJsZSBmb3IgY3VycmVudCBjcHUgKi8KKwljZW50YXVyID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGVwc19jcHVfZGF0YSkKKwkJICAgICsgKHN0YXRlcyArIDEpICogc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZSksCisJCSAgICBHRlBfS0VSTkVMKTsKKwlpZiAoIWNlbnRhdXIpCisJCXJldHVybiAtRU5PTUVNOworCWVwc19jcHVbMF0gPSBjZW50YXVyOworCisJLyogQ29weSBiYXNpYyB2YWx1ZXMgKi8KKwljZW50YXVyLT5mc2IgPSBmc2I7CisKKwkvKiBGaWxsIGZyZXF1ZW5jeSBhbmQgTVNSIHZhbHVlIHRhYmxlICovCisJZl90YWJsZSA9ICZjZW50YXVyLT5mcmVxX3RhYmxlWzBdOworCWlmIChicmFuZCAhPSBFUFNfQlJBTkRfQzdNKSB7CisJCWZfdGFibGVbMF0uZnJlcXVlbmN5ID0gZnNiICogbWluX211bHRpcGxpZXI7CisJCWZfdGFibGVbMF0uaW5kZXggPSAobWluX211bHRpcGxpZXIgPDwgOCkgfCBtaW5fdm9sdGFnZTsKKwkJZl90YWJsZVsxXS5mcmVxdWVuY3kgPSBmc2IgKiBtYXhfbXVsdGlwbGllcjsKKwkJZl90YWJsZVsxXS5pbmRleCA9IChtYXhfbXVsdGlwbGllciA8PCA4KSB8IG1heF92b2x0YWdlOworCQlmX3RhYmxlWzJdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCX0gZWxzZSB7CisJCWsgPSAwOworCQlzdGVwID0gKChtYXhfdm9sdGFnZSAtIG1pbl92b2x0YWdlKSAqIDI1NikKKwkJCS8gKG1heF9tdWx0aXBsaWVyIC0gbWluX211bHRpcGxpZXIpOworCQlmb3IgKGkgPSBtaW5fbXVsdGlwbGllcjsgaSA8PSBtYXhfbXVsdGlwbGllcjsgaSsrKSB7CisJCQl2b2x0YWdlID0gKGsgKiBzdGVwKSAvIDI1NiArIG1pbl92b2x0YWdlOworCQkJZl90YWJsZVtrXS5mcmVxdWVuY3kgPSBmc2IgKiBpOworCQkJZl90YWJsZVtrXS5pbmRleCA9IChpIDw8IDgpIHwgdm9sdGFnZTsKKwkJCWsrKzsKKwkJfQorCQlmX3RhYmxlW2tdLmZyZXF1ZW5jeSA9IENQVUZSRVFfVEFCTEVfRU5EOworCX0KKworCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CisJcG9saWN5LT5jcHVpbmZvLnRyYW5zaXRpb25fbGF0ZW5jeSA9IDE0MDAwMDsgLyogODQ0bVYgLT4gNzAwbVYgaW4gbnMgKi8KKwlwb2xpY3ktPmN1ciA9IGZzYiAqIGN1cnJlbnRfbXVsdGlwbGllcjsKKworCXJldCA9IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlX2NwdWluZm8ocG9saWN5LCAmY2VudGF1ci0+ZnJlcV90YWJsZVswXSk7CisJaWYgKHJldCkgeworCQlrZnJlZShjZW50YXVyKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwljcHVmcmVxX2ZyZXF1ZW5jeV90YWJsZV9nZXRfYXR0cigmY2VudGF1ci0+ZnJlcV90YWJsZVswXSwgcG9saWN5LT5jcHUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVwc19jcHVfZXhpdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gcG9saWN5LT5jcHU7CisJc3RydWN0IGVwc19jcHVfZGF0YSAqY2VudGF1cjsKKwl1MzIgbG8sIGhpOworCisJaWYgKGVwc19jcHVbY3B1XSA9PSBOVUxMKQorCQlyZXR1cm4gLUVOT0RFVjsKKwljZW50YXVyID0gZXBzX2NwdVtjcHVdOworCisJLyogR2V0IG1heCBmcmVxdWVuY3kgKi8KKwlyZG1zcihNU1JfSUEzMl9QRVJGX1NUQVRVUywgbG8sIGhpKTsKKwkvKiBTZXQgbWF4IGZyZXF1ZW5jeSAqLworCWVwc19zZXRfc3RhdGUoY2VudGF1ciwgY3B1LCBoaSAmIDB4ZmZmZik7CisJLyogQnllICovCisJY3B1ZnJlcV9mcmVxdWVuY3lfdGFibGVfcHV0X2F0dHIocG9saWN5LT5jcHUpOworCWtmcmVlKGVwc19jcHVbY3B1XSk7CisJZXBzX2NwdVtjcHVdID0gTlVMTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHN0cnVjdCBmcmVxX2F0dHIqIGVwc19hdHRyW10gPSB7CisJJmNwdWZyZXFfZnJlcV9hdHRyX3NjYWxpbmdfYXZhaWxhYmxlX2ZyZXFzLAorCU5VTEwsCit9OworCitzdGF0aWMgc3RydWN0IGNwdWZyZXFfZHJpdmVyIGVwc19kcml2ZXIgPSB7CisJLnZlcmlmeQkJPSBlcHNfdmVyaWZ5LAorCS50YXJnZXQJCT0gZXBzX3RhcmdldCwKKwkuaW5pdAkJPSBlcHNfY3B1X2luaXQsCisJLmV4aXQJCT0gZXBzX2NwdV9leGl0LAorCS5nZXQJCT0gZXBzX2dldCwKKwkubmFtZQkJPSAiZV9wb3dlcnNhdmVyIiwKKwkub3duZXIJCT0gVEhJU19NT0RVTEUsCisJLmF0dHIJCT0gZXBzX2F0dHIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBlcHNfaW5pdCh2b2lkKQoreworCXN0cnVjdCBjcHVpbmZvX3g4NiAqYyA9IGNwdV9kYXRhOworCisJLyogVGhpcyBkcml2ZXIgd2lsbCB3b3JrIG9ubHkgb24gQ2VudGF1ciBDNyBwcm9jZXNzb3JzIHdpdGgKKwkgKiBFbmhhbmNlZCBTcGVlZFN0ZXAvUG93ZXJTYXZlciByZWdpc3RlcnMgKi8KKwlpZiAoYy0+eDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0NFTlRBVVIKKwkgICAgfHwgYy0+eDg2ICE9IDYgfHwgYy0+eDg2X21vZGVsICE9IDEwKQorCQlyZXR1cm4gLUVOT0RFVjsKKwlpZiAoIWNwdV9oYXMoYywgWDg2X0ZFQVRVUkVfRVNUKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwlpZiAoY3B1ZnJlcV9yZWdpc3Rlcl9kcml2ZXIoJmVwc19kcml2ZXIpKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGVwc19leGl0KHZvaWQpCit7CisJY3B1ZnJlcV91bnJlZ2lzdGVyX2RyaXZlcigmZXBzX2RyaXZlcik7Cit9CisKK01PRFVMRV9BVVRIT1IoIlJhZmGzIEJpbHNraSA8cmFmYWxiaWxza2lAaW50ZXJpYS5wbD4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiRW5oYW5jZWQgUG93ZXJTYXZlciBkcml2ZXIgZm9yIFZJQSBDNyBDUFUncy4iKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKKworbW9kdWxlX2luaXQoZXBzX2luaXQpOworbW9kdWxlX2V4aXQoZXBzX2V4aXQpOwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5jCmluZGV4IGEzZGI5MzMuLmI1OTg3OGEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuYworKysgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmMKQEAgLTgsMTIgKzgsMTEgQEAKICAqICBWSUEgaGF2ZSBjdXJyZW50bHkgMyBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgTG9uZ2hhdWwuCiAgKiAgVmVyc2lvbiAxIChMb25naGF1bCkgdXNlcyB0aGUgQkNSMiBNU1IgYXQgMHgxMTQ3LgogICogICBJdCBpcyBwcmVzZW50IG9ubHkgaW4gU2FtdWVsIDEgKEM1QSksIFNhbXVlbCAyIChDNUIpIHN0ZXBwaW5nIDAuCi0gKiAgVmVyc2lvbiAyIG9mIGxvbmdoYXVsIGlzIHRoZSBzYW1lIGFzIHYxLCBidXQgYWRkcyB2b2x0YWdlIHNjYWxpbmcuCi0gKiAgIFByZXNlbnQgaW4gU2FtdWVsIDIgKHN0ZXBwaW5ncyAxLTcgb25seSkgKEM1QiksIGFuZCBFenJhIChDNUMpCi0gKiAgIHZvbHRhZ2Ugc2NhbGluZyBzdXBwb3J0IGhhcyBjdXJyZW50bHkgYmVlbiBkaXNhYmxlZCBpbiB0aGlzIGRyaXZlcgotICogICB1bnRpbCB3ZSBoYXZlIGNvZGUgdGhhdCBnZXRzIGl0IHJpZ2h0LgorICogIFZlcnNpb24gMiBvZiBsb25naGF1bCBpcyBiYWNrd2FyZCBjb21wYXRpYmxlIHdpdGggdjEsIGJ1dCBhZGRzCisgKiAgIExPTkdIQVVMIE1TUiBmb3IgcHVycG9zZSBvZiBib3RoIGZyZXF1ZW5jeSBhbmQgdm9sdGFnZSBzY2FsaW5nLgorICogICBQcmVzZW50IGluIFNhbXVlbCAyIChzdGVwcGluZ3MgMS03IG9ubHkpIChDNUIpLCBhbmQgRXpyYSAoQzVDKS4KICAqICBWZXJzaW9uIDMgb2YgbG9uZ2hhdWwgZ290IHJlbmFtZWQgdG8gUG93ZXJzYXZlciBhbmQgcmVkZXNpZ25lZAotICogICB0byB1c2UgdGhlIFBPV0VSU0FWRVIgTVNSIGF0IDB4MTEwYS4KKyAqICAgdG8gdXNlIG9ubHkgdGhlIFBPV0VSU0FWRVIgTVNSIGF0IDB4MTEwYS4KICAqICAgSXQgaXMgcHJlc2VudCBpbiBFenJhLVQgKEM1TSksIE5laGVtaWFoIChDNVgpIGFuZCBhYm92ZS4KICAqICAgSXQncyBwcmV0dHkgbXVjaCB0aGUgc2FtZSBmZWF0dXJlIHdpc2UgdG8gbG9uZ2hhdWwgdjIsIHRob3VnaAogICogICB0aGVyZSBpcyBwcm92aXNpb24gZm9yIHNjYWxpbmcgRlNCIHRvbywgYnV0IHRoaXMgZG9lc24ndCB3b3JrCkBAIC01MSwxMCArNTAsMTIgQEAKICNkZWZpbmUJQ1BVX0VaUkEJMwogI2RlZmluZQlDUFVfRVpSQV9UCTQKICNkZWZpbmUJQ1BVX05FSEVNSUFICTUKKyNkZWZpbmUJQ1BVX05FSEVNSUFIX0MJNgogCiAvKiBGbGFncyAqLwogI2RlZmluZSBVU0VfQUNQSV9DMwkJKDEgPDwgMSkKICNkZWZpbmUgVVNFX05PUlRIQlJJREdFCQkoMSA8PCAyKQorI2RlZmluZSBVU0VfVlQ4MjM1CQkoMSA8PCAzKQogCiBzdGF0aWMgaW50IGNwdV9tb2RlbDsKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbnVtc2NhbGVzPTE2OwpAQCAtNjMsNyArNjQsOCBAQAogc3RhdGljIHN0cnVjdCBtVl9wb3MgKnZybV9tVl90YWJsZTsKIHN0YXRpYyB1bnNpZ25lZCBjaGFyICptVl92cm1fdGFibGU7CiBzdHJ1Y3QgZl9tc3IgewotCXVuc2lnbmVkIGNoYXIgdnJtOworCXU4IHZybTsKKwl1OCBwb3M7CiB9Owogc3RhdGljIHN0cnVjdCBmX21zciBmX21zcl90YWJsZVszMl07CiAKQEAgLTczLDEwICs3NSwxMCBAQAogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBOVUxMOwogc3RhdGljIHN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCAqY3ggPSBOVUxMOwogc3RhdGljIHU4IGxvbmdoYXVsX2ZsYWdzOworc3RhdGljIHU4IGxvbmdoYXVsX3BvczsKIAogLyogTW9kdWxlIHBhcmFtZXRlcnMgKi8KIHN0YXRpYyBpbnQgc2NhbGVfdm9sdGFnZTsKLXN0YXRpYyBpbnQgaWdub3JlX2xhdGVuY3k7CiAKICNkZWZpbmUgZHByaW50ayhtc2cuLi4pIGNwdWZyZXFfZGVidWdfcHJpbnRrKENQVUZSRVFfREVCVUdfRFJJVkVSLCAibG9uZ2hhdWwiLCBtc2cpCiAKQEAgLTE2NCwyNiArMTY2LDQ3IEBACiBzdGF0aWMgdm9pZCBkb19wb3dlcnNhdmVyKGludCBjeF9hZGRyZXNzLCB1bnNpZ25lZCBpbnQgY2xvY2tfcmF0aW9faW5kZXgpCiB7CiAJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOworCXU4IGRlc3RfcG9zOwogCXUzMiB0OwogCisJZGVzdF9wb3MgPSBmX21zcl90YWJsZVtjbG9ja19yYXRpb19pbmRleF0ucG9zOworCiAJcmRtc3JsKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CisJLyogU2V0dXAgbmV3IGZyZXF1ZW5jeSAqLwogCWxvbmdoYXVsLmJpdHMuUmV2aXNpb25LZXkgPSBsb25naGF1bC5iaXRzLlJldmlzaW9uSUQ7CiAJbG9uZ2hhdWwuYml0cy5Tb2Z0QnVzUmF0aW8gPSBjbG9ja19yYXRpb19pbmRleCAmIDB4ZjsKIAlsb25naGF1bC5iaXRzLlNvZnRCdXNSYXRpbzQgPSAoY2xvY2tfcmF0aW9faW5kZXggJiAweDEwKSA+PiA0OwotCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMTsKLQotCWlmIChjYW5fc2NhbGVfdm9sdGFnZSkgeworCS8qIFNldHVwIG5ldyB2b2x0YWdlICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlKQogCQlsb25naGF1bC5iaXRzLlNvZnRWSUQgPSBmX21zcl90YWJsZVtjbG9ja19yYXRpb19pbmRleF0udnJtOwotCQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRWSUQgPSAxOwotCX0KLQogCS8qIFN5bmMgdG8gdGltZXIgdGljayAqLwogCXNhZmVfaGFsdCgpOworCS8qIFJhaXNlIHZvbHRhZ2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlICYmIGxvbmdoYXVsX3BvcyA8IGRlc3RfcG9zKSB7CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDE7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQkvKiBDaGFuZ2Ugdm9sdGFnZSAqLworCQlpZiAoIWN4X2FkZHJlc3MpIHsKKwkJCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisJCQloYWx0KCk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCQkJLyogSW52b2tlIEMzICovCisJCQlpbmIoY3hfYWRkcmVzcyk7CisJCQkvKiBEdW1teSBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwzCisJCQkgKiByZWFkICovCisJCQl0ID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOworCQl9CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDA7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQlsb25naGF1bF9wb3MgPSBkZXN0X3BvczsKKwl9CisKIAkvKiBDaGFuZ2UgZnJlcXVlbmN5IG9uIG5leHQgaGFsdCBvciBzbGVlcCAqLworCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMTsKIAl3cm1zcmwoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwudmFsKTsKIAlpZiAoIWN4X2FkZHJlc3MpIHsKIAkJQUNQSV9GTFVTSF9DUFVfQ0FDSEUoKTsKLQkJLyogSW52b2tlIEMxICovCiAJCWhhbHQoKTsKIAl9IGVsc2UgewogCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOwpAQCAtMTkzLDEyICsyMTYsMjkgQEAKIAkJdCA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKIAl9CiAJLyogRGlzYWJsZSBidXMgcmF0aW8gYml0ICovCi0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQlsb25naGF1bC5iaXRzLlJldmlzaW9uS2V5ID0gbG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEOwogCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdEJ1c1JhdGlvID0gMDsKLQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRCU0VMID0gMDsKLQlsb25naGF1bC5iaXRzLkVuYWJsZVNvZnRWSUQgPSAwOwogCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCisJLyogUmVkdWNlIHZvbHRhZ2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGNhbl9zY2FsZV92b2x0YWdlICYmIGxvbmdoYXVsX3BvcyA+IGRlc3RfcG9zKSB7CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDE7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQkvKiBDaGFuZ2Ugdm9sdGFnZSAqLworCQlpZiAoIWN4X2FkZHJlc3MpIHsKKwkJCUFDUElfRkxVU0hfQ1BVX0NBQ0hFKCk7CisJCQloYWx0KCk7CisJCX0gZWxzZSB7CisJCQlBQ1BJX0ZMVVNIX0NQVV9DQUNIRSgpOworCQkJLyogSW52b2tlIEMzICovCisJCQlpbmIoY3hfYWRkcmVzcyk7CisJCQkvKiBEdW1teSBvcCAtIG11c3QgZG8gc29tZXRoaW5nIHVzZWxlc3MgYWZ0ZXIgUF9MVkwzCisJCQkgKiByZWFkICovCisJCQl0ID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOworCQl9CisJCWxvbmdoYXVsLmJpdHMuRW5hYmxlU29mdFZJRCA9IDA7CisJCXdybXNybChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOworCQlsb25naGF1bF9wb3MgPSBkZXN0X3BvczsKKwl9CiB9CiAKIC8qKgpAQCAtMjU3LDI2ICsyOTcsMTkgQEAKIAkvKgogCSAqIExvbmdoYXVsIHYxLiAoU2FtdWVsW0M1QV0gYW5kIFNhbXVlbDIgc3RlcHBpbmcgMFtDNUJdKQogCSAqIFNvZnR3YXJlIGNvbnRyb2xsZWQgbXVsdGlwbGllcnMgb25seS4KLQkgKgotCSAqICpOQiogVW50aWwgd2UgZ2V0IHZvbHRhZ2Ugc2NhbGluZyB3b3JraW5nIHYxICYgdjIgYXJlIHRoZSBzYW1lIGNvZGUuCi0JICogTG9uZ2hhdWwgdjIgYXBwZWFycyBpbiBTYW11ZWwyIFN0ZXBwaW5ncyAxLT43IFtDNWJdIGFuZCBFenJhIFtDNUNdCiAJICovCiAJY2FzZSBUWVBFX0xPTkdIQVVMX1YxOgotCWNhc2UgVFlQRV9MT05HSEFVTF9WMjoKIAkJZG9fbG9uZ2hhdWwxKGNsb2NrX3JhdGlvX2luZGV4KTsKIAkJYnJlYWs7CiAKIAkvKgorCSAqIExvbmdoYXVsIHYyIGFwcGVhcnMgaW4gU2FtdWVsMiBTdGVwcGluZ3MgMS0+NyBbQzVCXSBhbmQgRXpyYSBbQzVDXQorCSAqCiAJICogTG9uZ2hhdWwgdjMgKGFrYSBQb3dlcnNhdmVyKS4gKEV6cmEtVCBbQzVNXSAmIE5laGVtaWFoIFtDNU5dKQotCSAqIFdlIGNhbiBzY2FsZSB2b2x0YWdlIHdpdGggdGhpcyB0b28sIGJ1dCB0aGF0J3MgY3VycmVudGx5Ci0JICogZGlzYWJsZWQgdW50aWwgd2UgY29tZSB1cCB3aXRoIGEgZGVjZW50ICdtYXRjaCBmcmVxIHRvIHZvbHRhZ2UnCi0JICogYWxnb3JpdGhtLgotCSAqIFdoZW4gd2UgYWRkIHZvbHRhZ2Ugc2NhbGluZywgd2Ugd2lsbCBhbHNvIG5lZWQgdG8gZG8gdGhlCi0JICogdm9sdGFnZS9mcmVxIHNldHRpbmcgaW4gb3JkZXIgZGVwZW5kaW5nIG9uIHRoZSBkaXJlY3Rpb24KLQkgKiBvZiBzY2FsaW5nIChsaWtlIHdlIGRvIGluIHBvd2Vybm93LWs3LmMpCiAJICogTmVoZW1pYWggY2FuIGRvIEZTQiBzY2FsaW5nIHRvbywgYnV0IHRoaXMgaGFzIG5ldmVyIGJlZW4gcHJvdmVuCiAJICogdG8gd29yayBpbiBwcmFjdGljZS4KIAkgKi8KKwljYXNlIFRZUEVfTE9OR0hBVUxfVjI6CiAJY2FzZSBUWVBFX1BPV0VSU0FWRVI6CiAJCWlmIChsb25naGF1bF9mbGFncyAmIFVTRV9BQ1BJX0MzKSB7CiAJCQkvKiBEb24ndCBhbGxvdyB3YWtldXAgKi8KQEAgLTMwMSw2ICszMzQsNyBAQAogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAlwcmVlbXB0X2VuYWJsZSgpOwogCisJZnJlcXMubmV3ID0gY2FsY19zcGVlZChsb25naGF1bF9nZXRfY3B1X211bHQoKSk7CiAJY3B1ZnJlcV9ub3RpZnlfdHJhbnNpdGlvbigmZnJlcXMsIENQVUZSRVFfUE9TVENIQU5HRSk7CiB9CiAKQEAgLTMxNSwzMSArMzQ5LDE5IEBACiAKICNkZWZpbmUgUk9VTkRJTkcJMHhmCiAKLXN0YXRpYyBpbnQgX2d1ZXNzKGludCBndWVzcywgaW50IG11bHQpCi17Ci0JaW50IHRhcmdldDsKLQotCXRhcmdldCA9ICgobXVsdC8xMCkqZ3Vlc3MpOwotCWlmIChtdWx0JTEwICE9IDApCi0JCXRhcmdldCArPSAoZ3Vlc3MvMik7Ci0JdGFyZ2V0ICs9IFJPVU5ESU5HLzI7Ci0JdGFyZ2V0ICY9IH5ST1VORElORzsKLQlyZXR1cm4gdGFyZ2V0OwotfQotCi0KIHN0YXRpYyBpbnQgZ3Vlc3NfZnNiKGludCBtdWx0KQogewotCWludCBzcGVlZCA9IChjcHVfa2h6LzEwMDApOworCWludCBzcGVlZCA9IGNwdV9raHogLyAxMDAwOwogCWludCBpOwotCWludCBzcGVlZHNbXSA9IHsgNjYsIDEwMCwgMTMzLCAyMDAgfTsKKwlpbnQgc3BlZWRzW10gPSB7IDY2NiwgMTAwMCwgMTMzMywgMjAwMCB9OworCWludCBmX21heCwgZl9taW47CiAKLQlzcGVlZCArPSBST1VORElORy8yOwotCXNwZWVkICY9IH5ST1VORElORzsKLQotCWZvciAoaT0wOyBpPDQ7IGkrKykgewotCQlpZiAoX2d1ZXNzKHNwZWVkc1tpXSwgbXVsdCkgPT0gc3BlZWQpCi0JCQlyZXR1cm4gc3BlZWRzW2ldOworCWZvciAoaSA9IDA7IGkgPCA0OyBpKyspIHsKKwkJZl9tYXggPSAoKHNwZWVkc1tpXSAqIG11bHQpICsgNTApIC8gMTAwOworCQlmX21heCArPSAoUk9VTkRJTkcgLyAyKTsKKwkJZl9taW4gPSBmX21heCAtIFJPVU5ESU5HOworCQlpZiAoKHNwZWVkIDw9IGZfbWF4KSAmJiAoc3BlZWQgPj0gZl9taW4pKQorCQkJcmV0dXJuIHNwZWVkc1tpXSAvIDEwOwogCX0KIAlyZXR1cm4gMDsKIH0KQEAgLTM0Nyw2NyArMzY5LDQwIEBACiAKIHN0YXRpYyBpbnQgX19pbml0IGxvbmdoYXVsX2dldF9yYW5nZXModm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGludmFsdWU7Ci0JdW5zaWduZWQgaW50IGV6cmFfdF9tdWx0aXBsaWVyc1szMl09IHsKLQkJCTkwLCAgMzAsICA0MCwgMTAwLCAgNTUsICAzNSwgIDQ1LCAgOTUsCi0JCQk1MCwgIDcwLCAgODAsICA2MCwgMTIwLCAgNzUsICA4NSwgIDY1LAotCQkJLTEsIDExMCwgMTIwLCAgLTEsIDEzNSwgMTE1LCAxMjUsIDEwNSwKLQkJCTEzMCwgMTUwLCAxNjAsIDE0MCwgIC0xLCAxNTUsICAtMSwgMTQ1IH07CiAJdW5zaWduZWQgaW50IGosIGsgPSAwOwotCXVuaW9uIG1zcl9sb25naGF1bCBsb25naGF1bDsKLQlpbnQgbXVsdCA9IDA7CisJaW50IG11bHQ7CiAKLQlzd2l0Y2ggKGxvbmdoYXVsX3ZlcnNpb24pIHsKLQljYXNlIFRZUEVfTE9OR0hBVUxfVjE6Ci0JY2FzZSBUWVBFX0xPTkdIQVVMX1YyOgotCQkvKiBVZ2gsIExvbmdoYXVsIHYxIGRpZG4ndCBoYXZlIHRoZSBtaW4vbWF4IE1TUnMuCi0JCSAgIEFzc3VtZSBtaW49My4weCAmIG1heCA9IHdoYXRldmVyIHdlIGJvb3RlZCBhdC4gKi8KLQkJbWlubXVsdCA9IDMwOwotCQltYXhtdWx0ID0gbXVsdCA9IGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpOwotCQlicmVhazsKLQotCWNhc2UgVFlQRV9QT1dFUlNBVkVSOgotCQkvKiBFenJhLVQgKi8KLQkJaWYgKGNwdV9tb2RlbD09Q1BVX0VaUkFfVCkgewotCQkJbWlubXVsdCA9IDMwOwotCQkJcmRtc3JsIChNU1JfVklBX0xPTkdIQVVMLCBsb25naGF1bC52YWwpOwotCQkJaW52YWx1ZSA9IGxvbmdoYXVsLmJpdHMuTWF4TUh6QlI7Ci0JCQlpZiAobG9uZ2hhdWwuYml0cy5NYXhNSHpCUjQpCi0JCQkJaW52YWx1ZSArPSAxNjsKLQkJCW1heG11bHQgPSBtdWx0ID0gZXpyYV90X211bHRpcGxpZXJzW2ludmFsdWVdOwotCQkJYnJlYWs7Ci0JCX0KLQotCQkvKiBOZWhlbWlhaCAqLwotCQlpZiAoY3B1X21vZGVsPT1DUFVfTkVIRU1JQUgpIHsKLQkJCXJkbXNybCAoTVNSX1ZJQV9MT05HSEFVTCwgbG9uZ2hhdWwudmFsKTsKLQotCQkJLyoKLQkJCSAqIFRPRE86IFRoaXMgY29kZSB3b3JrcywgYnV0IHJhaXNlcyBhIGxvdCBvZiBxdWVzdGlvbnMuCi0JCQkgKiAtIFNvbWUgTmVoZW1pYWgncyBzZWVtIHRvIGhhdmUgYnJva2VuIE1pbi9NYXhNSHpCUidzLgotCQkJICogICBXZSBnZXQgYXJvdW5kIHRoaXMgYnkgdXNpbmcgYSBoYXJkY29kZWQgbXVsdGlwbGllciBvZiA0LjB4Ci0JCQkgKiAgIGZvciB0aGUgbWluaW1pbXVtIHNwZWVkLCBhbmQgdGhlIHNwZWVkIHdlIGJvb3RlZCB1cCBhdCBmb3IgdGhlIG1heC4KLQkJCSAqICAgVGhpcyBpcyBkb25lIGluIGxvbmdoYXVsX2dldF9jcHVfbXVsdCgpIGJ5IHJlYWRpbmcgdGhlIEVCTENSIHJlZ2lzdGVyLgotCQkJICogLSBBY2NvcmRpbmcgdG8gc29tZSBWSUEgZG9jdW1lbnRhdGlvbiBFQkxDUiBpcyBvbmx5Ci0JCQkgKiAgIGluIHByZS1OZWhlbWlhaCBDM3MuIEhvdyB0aGlzIHN0aWxsIHdvcmtzIGlzIGEgbXlzdGVyeS4KLQkJCSAqICAgV2UncmUgcG9zc2libHkgdXNpbmcgc29tZXRoaW5nIHVuZG9jdW1lbnRlZCBhbmQgdW5zdXBwb3J0ZWQsCi0JCQkgKiAgIEJ1dCBpdCB3b3Jrcywgc28gd2UgZG9uJ3QgZ3J1bWJsZS4KLQkJCSAqLwotCQkJbWlubXVsdD00MDsKLQkJCW1heG11bHQgPSBtdWx0ID0gbG9uZ2hhdWxfZ2V0X2NwdV9tdWx0KCk7Ci0JCQlicmVhazsKLQkJfQorCS8qIEdldCBjdXJyZW50IGZyZXF1ZW5jeSAqLworCW11bHQgPSBsb25naGF1bF9nZXRfY3B1X211bHQoKTsKKwlpZiAobXVsdCA9PSAtMSkgeworCQlwcmludGsoS0VSTl9JTkZPIFBGWCAiSW52YWxpZCAocmVzZXJ2ZWQpIG11bHRpcGxpZXIhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWZzYiA9IGd1ZXNzX2ZzYihtdWx0KTsKKwlpZiAoZnNiID09IDApIHsKKwkJcHJpbnRrKEtFUk5fSU5GTyBQRlggIkludmFsaWQgKHJlc2VydmVkKSBGU0IhXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCS8qIEdldCBtYXggbXVsdGlwbGllciAtIGFzIHdlIGFsd2F5cyBkaWQuCisJICogTG9uZ2hhdWwgTVNSIGlzIHVzZWZ1bGwgb25seSB3aGVuIHZvbHRhZ2Ugc2NhbGluZyBpcyBlbmFibGVkLgorCSAqIEMzIGlzIGJvb3RpbmcgYXQgbWF4IGFueXdheS4gKi8KKwltYXhtdWx0ID0gbXVsdDsKKwkvKiBHZXQgbWluIG11bHRpcGxpZXIgKi8KKwlzd2l0Y2ggKGNwdV9tb2RlbCkgeworCWNhc2UgQ1BVX05FSEVNSUFIOgorCQltaW5tdWx0ID0gNTA7CisJCWJyZWFrOworCWNhc2UgQ1BVX05FSEVNSUFIX0M6CisJCW1pbm11bHQgPSA0MDsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJbWlubXVsdCA9IDMwOworCQlicmVhazsKKwl9CiAKIAlkcHJpbnRrICgiTWluTXVsdDolZC4lZHggTWF4TXVsdDolZC4lZHhcbiIsCiAJCSBtaW5tdWx0LzEwLCBtaW5tdWx0JTEwLCBtYXhtdWx0LzEwLCBtYXhtdWx0JTEwKTsKIAotCWlmIChmc2IgPT0gMCkgewotCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkludmFsaWQgKHJlc2VydmVkKSBGU0IhXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCiAJaGlnaGVzdF9zcGVlZCA9IGNhbGNfc3BlZWQobWF4bXVsdCk7CiAJbG93ZXN0X3NwZWVkID0gY2FsY19zcGVlZChtaW5tdWx0KTsKIAlkcHJpbnRrICgiRlNCOiVkTUh6ICBMb3dlc3Qgc3BlZWQ6ICVzICAgSGlnaGVzdCBzcGVlZDolc1xuIiwgZnNiLApAQCAtNDU1LDYgKzQ1MCw3IEBACiAJdW5pb24gbXNyX2xvbmdoYXVsIGxvbmdoYXVsOwogCXN0cnVjdCBtVl9wb3MgbWludmlkLCBtYXh2aWQ7CiAJdW5zaWduZWQgaW50IGosIHNwZWVkLCBwb3MsIGtIel9zdGVwLCBudW12c2NhbGVzOworCWludCBtaW5fdmlkX3NwZWVkOwogCiAJcmRtc3JsKE1TUl9WSUFfTE9OR0hBVUwsIGxvbmdoYXVsLnZhbCk7CiAJaWYgKCEobG9uZ2hhdWwuYml0cy5SZXZpc2lvbklEICYgMSkpIHsKQEAgLTQ2OCwxNCArNDY0LDE0IEBACiAJCW1WX3ZybV90YWJsZSA9ICZtVl92cm04NVswXTsKIAl9IGVsc2UgewogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIk1vYmlsZSBWUk1cbiIpOworCQlpZiAoY3B1X21vZGVsIDwgQ1BVX05FSEVNSUFIKQorCQkJcmV0dXJuOwogCQl2cm1fbVZfdGFibGUgPSAmbW9iaWxldnJtX21WWzBdOwogCQltVl92cm1fdGFibGUgPSAmbVZfbW9iaWxldnJtWzBdOwogCX0KIAogCW1pbnZpZCA9IHZybV9tVl90YWJsZVtsb25naGF1bC5iaXRzLk1pbmltdW1WSURdOwogCW1heHZpZCA9IHZybV9tVl90YWJsZVtsb25naGF1bC5iaXRzLk1heGltdW1WSURdOwotCW51bXZzY2FsZXMgPSBtYXh2aWQucG9zIC0gbWludmlkLnBvcyArIDE7Ci0Ja0h6X3N0ZXAgPSAoaGlnaGVzdF9zcGVlZCAtIGxvd2VzdF9zcGVlZCkgLyBudW12c2NhbGVzOwogCiAJaWYgKG1pbnZpZC5tViA9PSAwIHx8IG1heHZpZC5tViA9PSAwIHx8IG1pbnZpZC5tViA+IG1heHZpZC5tVikgewogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIkJvZ3VzIHZhbHVlcyBNaW46JWQuJTAzZCBNYXg6JWQuJTAzZC4gIgpAQCAtNDkxLDIwICs0ODcsNTkgQEAKIAkJcmV0dXJuOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gUEZYICJNYXggVklEPSVkLiUwM2QgIE1pbiBWSUQ9JWQuJTAzZCwgJWQgcG9zc2libGUgdm9sdGFnZSBzY2FsZXNcbiIsCisJLyogSG93IG1hbnkgdm9sdGFnZSBzdGVwcyAqLworCW51bXZzY2FsZXMgPSBtYXh2aWQucG9zIC0gbWludmlkLnBvcyArIDE7CisJcHJpbnRrKEtFUk5fSU5GTyBQRlgKKwkJIk1heCBWSUQ9JWQuJTAzZCAgIgorCQkiTWluIFZJRD0lZC4lMDNkLCAiCisJCSIlZCBwb3NzaWJsZSB2b2x0YWdlIHNjYWxlc1xuIiwKIAkJbWF4dmlkLm1WLzEwMDAsIG1heHZpZC5tViUxMDAwLAogCQltaW52aWQubVYvMTAwMCwgbWludmlkLm1WJTEwMDAsCiAJCW51bXZzY2FsZXMpOwogCisJLyogQ2FsY3VsYXRlIG1heCBmcmVxdWVuY3kgYXQgbWluIHZvbHRhZ2UgKi8KKwlqID0gbG9uZ2hhdWwuYml0cy5NaW5NSHpCUjsKKwlpZiAobG9uZ2hhdWwuYml0cy5NaW5NSHpCUjQpCisJCWogKz0gMTY7CisJbWluX3ZpZF9zcGVlZCA9IGVibGNyX3RhYmxlW2pdOworCWlmIChtaW5fdmlkX3NwZWVkID09IC0xKQorCQlyZXR1cm47CisJc3dpdGNoIChsb25naGF1bC5iaXRzLk1pbk1IekZTQikgeworCWNhc2UgMDoKKwkJbWluX3ZpZF9zcGVlZCAqPSAxMzMzMzsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQltaW5fdmlkX3NwZWVkICo9IDEwMDAwOworCQlicmVhazsKKwljYXNlIDM6CisJCW1pbl92aWRfc3BlZWQgKj0gNjY2NjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmV0dXJuOworCQlicmVhazsKKwl9CisJaWYgKG1pbl92aWRfc3BlZWQgPj0gaGlnaGVzdF9zcGVlZCkKKwkJcmV0dXJuOworCS8qIENhbGN1bGF0ZSBrSHogZm9yIG9uZSB2b2x0YWdlIHN0ZXAgKi8KKwlrSHpfc3RlcCA9IChoaWdoZXN0X3NwZWVkIC0gbWluX3ZpZF9zcGVlZCkgLyBudW12c2NhbGVzOworCisKIAlqID0gMDsKIAl3aGlsZSAobG9uZ2hhdWxfdGFibGVbal0uZnJlcXVlbmN5ICE9IENQVUZSRVFfVEFCTEVfRU5EKSB7CiAJCXNwZWVkID0gbG9uZ2hhdWxfdGFibGVbal0uZnJlcXVlbmN5OwotCQlwb3MgPSAoc3BlZWQgLSBsb3dlc3Rfc3BlZWQpIC8ga0h6X3N0ZXAgKyBtaW52aWQucG9zOworCQlpZiAoc3BlZWQgPiBtaW5fdmlkX3NwZWVkKQorCQkJcG9zID0gKHNwZWVkIC0gbWluX3ZpZF9zcGVlZCkgLyBrSHpfc3RlcCArIG1pbnZpZC5wb3M7CisJCWVsc2UKKwkJCXBvcyA9IG1pbnZpZC5wb3M7CiAJCWZfbXNyX3RhYmxlW2xvbmdoYXVsX3RhYmxlW2pdLmluZGV4XS52cm0gPSBtVl92cm1fdGFibGVbcG9zXTsKKwkJZl9tc3JfdGFibGVbbG9uZ2hhdWxfdGFibGVbal0uaW5kZXhdLnBvcyA9IHBvczsKIAkJaisrOwogCX0KIAorCWxvbmdoYXVsX3BvcyA9IG1heHZpZC5wb3M7CiAJY2FuX3NjYWxlX3ZvbHRhZ2UgPSAxOworCXByaW50ayhLRVJOX0lORk8gUEZYICJWb2x0YWdlIHNjYWxpbmcgZW5hYmxlZC4gIgorCQkiVXNlIG9mIFwiY29uc2VydmF0aXZlXCIgZ292ZXJub3IgaXMgaGlnaGx5IHJlY29tbWVuZGVkLlxuIik7CiB9CiAKIApAQCAtNTczLDIwICs2MDgsNTEgQEAKIAlpZiAoZGV2ICE9IE5VTEwpIHsKIAkJLyogRW5hYmxlIGFjY2VzcyB0byBwb3J0IDB4MjIgKi8KIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWcsICZwY2lfY21kKTsKLQkJaWYgKCAhKHBjaV9jbWQgJiAxPDw3KSApIHsKKwkJaWYgKCEocGNpX2NtZCAmIDE8PDcpKSB7CiAJCQlwY2lfY21kIHw9IDE8PDc7CiAJCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCByZWcsIHBjaV9jbWQpOworCQkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCByZWcsICZwY2lfY21kKTsKKwkJCWlmICghKHBjaV9jbWQgJiAxPDw3KSkgeworCQkJCXByaW50ayhLRVJOX0VSUiBQRlgKKwkJCQkJIkNhbid0IGVuYWJsZSBhY2Nlc3MgdG8gcG9ydCAweDIyLlxuIik7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCX0KIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwogfQogCitzdGF0aWMgaW50IGxvbmdoYXVsX3NldHVwX3Z0ODIzNSh2b2lkKQoreworCXN0cnVjdCBwY2lfZGV2ICpkZXY7CisJdTggcGNpX2NtZDsKKworCS8qIEZpbmQgVlQ4MjM1IHNvdXRoYnJpZGdlICovCisJZGV2ID0gcGNpX2ZpbmRfZGV2aWNlKFBDSV9WRU5ET1JfSURfVklBLCBQQ0lfREVWSUNFX0lEX1ZJQV84MjM1LCBOVUxMKTsKKwlpZiAoZGV2ICE9IE5VTEwpIHsKKwkJLyogU2V0IHRyYW5zaXRpb24gdGltZSB0byBtYXggKi8KKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGVjLCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgJj0gfigxIDw8IDIpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGVjLCBwY2lfY21kKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGU0LCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgJj0gfigxIDw8IDcpOworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGU0LCBwY2lfY21kKTsKKwkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCAweGU1LCAmcGNpX2NtZCk7CisJCXBjaV9jbWQgfD0gMSA8PCA3OworCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUoZGV2LCAweGU1LCBwY2lfY21kKTsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IF9faW5pdCBsb25naGF1bF9jcHVfaW5pdChzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSkKIHsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSBjcHVfZGF0YTsKIAljaGFyICpjcHVuYW1lPU5VTEw7CiAJaW50IHJldDsKKwl1MzIgbG8sIGhpOworCWludCB2dDgyMzVfcHJlc2VudDsKIAogCS8qIENoZWNrIHdoYXQgd2UgaGF2ZSBvbiB0aGlzIG1vdGhlcmJvYXJkICovCiAJc3dpdGNoIChjLT54ODZfbW9kZWwpIHsKQEAgLTU5OSwxNiArNjY1LDIwIEBACiAJCWJyZWFrOwogCiAJY2FzZSA3OgotCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9MT05HSEFVTF9WMTsKIAkJc3dpdGNoIChjLT54ODZfbWFzaykgewogCQljYXNlIDA6CisJCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9MT05HSEFVTF9WMTsKIAkJCWNwdV9tb2RlbCA9IENQVV9TQU1VRUwyOwogCQkJY3B1bmFtZSA9ICJDMyAnU2FtdWVsIDInIFtDNUJdIjsKLQkJCS8qIE5vdGUsIHRoaXMgaXMgbm90IGEgdHlwbywgZWFybHkgU2FtdWVsMidzIGhhZCBTYW11ZWwxIHJhdGlvcy4gKi8KLQkJCW1lbWNweSAoY2xvY2tfcmF0aW8sIHNhbXVlbDFfY2xvY2tfcmF0aW8sIHNpemVvZihzYW11ZWwxX2Nsb2NrX3JhdGlvKSk7Ci0JCQltZW1jcHkgKGVibGNyX3RhYmxlLCBzYW11ZWwyX2VibGNyLCBzaXplb2Yoc2FtdWVsMl9lYmxjcikpOworCQkJLyogTm90ZSwgdGhpcyBpcyBub3QgYSB0eXBvLCBlYXJseSBTYW11ZWwyJ3MgaGFkCisJCQkgKiBTYW11ZWwxIHJhdGlvcy4gKi8KKwkJCW1lbWNweShjbG9ja19yYXRpbywgc2FtdWVsMV9jbG9ja19yYXRpbywKKwkJCQlzaXplb2Yoc2FtdWVsMV9jbG9ja19yYXRpbykpOworCQkJbWVtY3B5KGVibGNyX3RhYmxlLCBzYW11ZWwyX2VibGNyLAorCQkJCXNpemVvZihzYW11ZWwyX2VibGNyKSk7CiAJCQlicmVhazsKIAkJY2FzZSAxIC4uLiAxNToKKwkJCWxvbmdoYXVsX3ZlcnNpb24gPSBUWVBFX0xPTkdIQVVMX1YyOwogCQkJaWYgKGMtPng4Nl9tYXNrIDwgOCkgewogCQkJCWNwdV9tb2RlbCA9IENQVV9TQU1VRUwyOwogCQkJCWNwdW5hbWUgPSAiQzMgJ1NhbXVlbCAyJyBbQzVCXSI7CkBAIC02MTYsOCArNjg2LDEwIEBACiAJCQkJY3B1X21vZGVsID0gQ1BVX0VaUkE7CiAJCQkJY3B1bmFtZSA9ICJDMyAnRXpyYScgW0M1Q10iOwogCQkJfQotCQkJbWVtY3B5IChjbG9ja19yYXRpbywgZXpyYV9jbG9ja19yYXRpbywgc2l6ZW9mKGV6cmFfY2xvY2tfcmF0aW8pKTsKLQkJCW1lbWNweSAoZWJsY3JfdGFibGUsIGV6cmFfZWJsY3IsIHNpemVvZihlenJhX2VibGNyKSk7CisJCQltZW1jcHkoY2xvY2tfcmF0aW8sIGV6cmFfY2xvY2tfcmF0aW8sCisJCQkJc2l6ZW9mKGV6cmFfY2xvY2tfcmF0aW8pKTsKKwkJCW1lbWNweShlYmxjcl90YWJsZSwgZXpyYV9lYmxjciwKKwkJCQlzaXplb2YoZXpyYV9lYmxjcikpOwogCQkJYnJlYWs7CiAJCX0KIAkJYnJlYWs7CkBAIC02MzIsMjQgKzcwNCwyNCBAQAogCQlicmVhazsKIAogCWNhc2UgOToKLQkJY3B1X21vZGVsID0gQ1BVX05FSEVNSUFIOwogCQlsb25naGF1bF92ZXJzaW9uID0gVFlQRV9QT1dFUlNBVkVSOwotCQludW1zY2FsZXM9MzI7CisJCW51bXNjYWxlcyA9IDMyOworCQltZW1jcHkoY2xvY2tfcmF0aW8sCisJCSAgICAgICBuZWhlbWlhaF9jbG9ja19yYXRpbywKKwkJICAgICAgIHNpemVvZihuZWhlbWlhaF9jbG9ja19yYXRpbykpOworCQltZW1jcHkoZWJsY3JfdGFibGUsIG5laGVtaWFoX2VibGNyLCBzaXplb2YobmVoZW1pYWhfZWJsY3IpKTsKIAkJc3dpdGNoIChjLT54ODZfbWFzaykgewogCQljYXNlIDAgLi4uIDE6Ci0JCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBBJyBbQzVOXSI7Ci0JCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9hX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfYV9jbG9ja19yYXRpbykpOwotCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfYV9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2FfZWJsY3IpKTsKKwkJCWNwdV9tb2RlbCA9IENQVV9ORUhFTUlBSDsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEEnIFtDNVhMT0VdIjsKIAkJCWJyZWFrOwogCQljYXNlIDIgLi4uIDQ6Ci0JCQljcHVuYW1lID0gIkMzICdOZWhlbWlhaCBCJyBbQzVOXSI7Ci0JCQltZW1jcHkgKGNsb2NrX3JhdGlvLCBuZWhlbWlhaF9iX2Nsb2NrX3JhdGlvLCBzaXplb2YobmVoZW1pYWhfYl9jbG9ja19yYXRpbykpOwotCQkJbWVtY3B5IChlYmxjcl90YWJsZSwgbmVoZW1pYWhfYl9lYmxjciwgc2l6ZW9mKG5laGVtaWFoX2JfZWJsY3IpKTsKKwkJCWNwdV9tb2RlbCA9IENQVV9ORUhFTUlBSDsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEInIFtDNVhMT0hdIjsKIAkJCWJyZWFrOwogCQljYXNlIDUgLi4uIDE1OgotCQkJY3B1bmFtZSA9ICJDMyAnTmVoZW1pYWggQycgW0M1Tl0iOwotCQkJbWVtY3B5IChjbG9ja19yYXRpbywgbmVoZW1pYWhfY19jbG9ja19yYXRpbywgc2l6ZW9mKG5laGVtaWFoX2NfY2xvY2tfcmF0aW8pKTsKLQkJCW1lbWNweSAoZWJsY3JfdGFibGUsIG5laGVtaWFoX2NfZWJsY3IsIHNpemVvZihuZWhlbWlhaF9jX2VibGNyKSk7CisJCQljcHVfbW9kZWwgPSBDUFVfTkVIRU1JQUhfQzsKKwkJCWNwdW5hbWUgPSAiQzMgJ05laGVtaWFoIEMnIFtDNVBdIjsKIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtNjU4LDYgKzczMCwxMyBAQAogCQljcHVuYW1lID0gIlVua25vd24iOwogCQlicmVhazsKIAl9CisJLyogQ2hlY2sgTG9uZ2hhdWwgdmVyLiAyICovCisJaWYgKGxvbmdoYXVsX3ZlcnNpb24gPT0gVFlQRV9MT05HSEFVTF9WMikgeworCQlyZG1zcihNU1JfVklBX0xPTkdIQVVMLCBsbywgaGkpOworCQlpZiAobG8gPT0gMCAmJiBoaSA9PSAwKQorCQkJLyogTG9va3MgbGlrZSBNU1IgaXNuJ3QgcHJlc2VudCAqLworCQkJbG9uZ2hhdWxfdmVyc2lvbiA9IFRZUEVfTE9OR0hBVUxfVjE7CisJfQogCiAJcHJpbnRrIChLRVJOX0lORk8gUEZYICJWSUEgJXMgQ1BVIGRldGVjdGVkLiAgIiwgY3B1bmFtZSk7CiAJc3dpdGNoIChsb25naGF1bF92ZXJzaW9uKSB7CkBAIC02NzAsMTUgKzc0OSwxOCBAQAogCQlicmVhazsKIAl9OwogCisJLyogRG9lc24ndCBodXJ0ICovCisJdnQ4MjM1X3ByZXNlbnQgPSBsb25naGF1bF9zZXR1cF92dDgyMzUoKTsKKwogCS8qIEZpbmQgQUNQSSBkYXRhIGZvciBwcm9jZXNzb3IgKi8KLQlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9QUk9DRVNTT1IsIEFDUElfUk9PVF9PQkpFQ1QsIEFDUElfVUlOVDMyX01BWCwKLQkJCSAgICAmbG9uZ2hhdWxfd2Fsa19jYWxsYmFjaywgTlVMTCwgKHZvaWQgKikmcHIpOworCWFjcGlfd2Fsa19uYW1lc3BhY2UoQUNQSV9UWVBFX1BST0NFU1NPUiwgQUNQSV9ST09UX09CSkVDVCwKKwkJCQlBQ1BJX1VJTlQzMl9NQVgsICZsb25naGF1bF93YWxrX2NhbGxiYWNrLAorCQkJCU5VTEwsICh2b2lkICopJnByKTsKIAogCS8qIENoZWNrIEFDUEkgc3VwcG9ydCBmb3IgQzMgc3RhdGUgKi8KLQlpZiAoKHByICE9IE5VTEwpICYmIChsb25naGF1bF92ZXJzaW9uID09IFRZUEVfUE9XRVJTQVZFUikpIHsKKwlpZiAocHIgIT0gTlVMTCAmJiBsb25naGF1bF92ZXJzaW9uICE9IFRZUEVfTE9OR0hBVUxfVjEpIHsKIAkJY3ggPSAmcHItPnBvd2VyLnN0YXRlc1tBQ1BJX1NUQVRFX0MzXTsKLQkJaWYgKGN4LT5hZGRyZXNzID4gMCAmJgotCQkgICAoY3gtPmxhdGVuY3kgPD0gMTAwMCB8fCBpZ25vcmVfbGF0ZW5jeSAhPSAwKSApIHsKKwkJaWYgKGN4LT5hZGRyZXNzID4gMCAmJiBjeC0+bGF0ZW5jeSA8PSAxMDAwKSB7CiAJCQlsb25naGF1bF9mbGFncyB8PSBVU0VfQUNQSV9DMzsKIAkJCWdvdG8gcHJpbnRfc3VwcG9ydF90eXBlOwogCQl9CkBAIC02ODgsOCArNzcwLDExIEBACiAJCWxvbmdoYXVsX2ZsYWdzIHw9IFVTRV9OT1JUSEJSSURHRTsKIAkJZ290byBwcmludF9zdXBwb3J0X3R5cGU7CiAJfQotCi0JLyogTm8gQUNQSSBDMyBvciB3ZSBjYW4ndCB1c2UgaXQgKi8KKwkvKiBVc2UgVlQ4MjM1IHNvdXRoYnJpZGdlIGlmIHByZXNlbnQgKi8KKwlpZiAobG9uZ2hhdWxfdmVyc2lvbiA9PSBUWVBFX1BPV0VSU0FWRVIgJiYgdnQ4MjM1X3ByZXNlbnQpIHsKKwkJbG9uZ2hhdWxfZmxhZ3MgfD0gVVNFX1ZUODIzNTsKKwkJZ290byBwcmludF9zdXBwb3J0X3R5cGU7CisJfQogCS8qIENoZWNrIEFDUEkgc3VwcG9ydCBmb3IgYnVzIG1hc3RlciBhcmJpdGVyIGRpc2FibGUgKi8KIAlpZiAoKHByID09IE5VTEwpIHx8ICEocHItPmZsYWdzLmJtX2NvbnRyb2wpKSB7CiAJCXByaW50ayhLRVJOX0VSUiBQRlgKQEAgLTY5OCwxOCArNzgzLDE4IEBACiAJfQogCiBwcmludF9zdXBwb3J0X3R5cGU6Ci0JaWYgKCEobG9uZ2hhdWxfZmxhZ3MgJiBVU0VfTk9SVEhCUklER0UpKSB7Ci0JCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgQUNQSSBzdXBwb3J0LlxuIik7Ci0JfSBlbHNlIHsKKwlpZiAobG9uZ2hhdWxfZmxhZ3MgJiBVU0VfTk9SVEhCUklER0UpCiAJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgbm9ydGhicmlkZ2Ugc3VwcG9ydC5cbiIpOwotCX0KKwllbHNlIGlmIChsb25naGF1bF9mbGFncyAmIFVTRV9WVDgyMzUpCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgVlQ4MjM1IHN1cHBvcnQuXG4iKTsKKwllbHNlCisJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVXNpbmcgQUNQSSBzdXBwb3J0LlxuIik7CiAKIAlyZXQgPSBsb25naGF1bF9nZXRfcmFuZ2VzKCk7CiAJaWYgKHJldCAhPSAwKQogCQlyZXR1cm4gcmV0OwogCi0JaWYgKChsb25naGF1bF92ZXJzaW9uPT1UWVBFX0xPTkdIQVVMX1YyIHx8IGxvbmdoYXVsX3ZlcnNpb249PVRZUEVfUE9XRVJTQVZFUikgJiYKLQkJIChzY2FsZV92b2x0YWdlICE9IDApKQorCWlmICgobG9uZ2hhdWxfdmVyc2lvbiAhPSBUWVBFX0xPTkdIQVVMX1YxKSAmJiAoc2NhbGVfdm9sdGFnZSAhPSAwKSkKIAkJbG9uZ2hhdWxfc2V0dXBfdm9sdGFnZXNjYWxpbmcoKTsKIAogCXBvbGljeS0+Z292ZXJub3IgPSBDUFVGUkVRX0RFRkFVTFRfR09WRVJOT1I7CkBAIC03OTcsOCArODgyLDYgQEAKIAogbW9kdWxlX3BhcmFtIChzY2FsZV92b2x0YWdlLCBpbnQsIDA2NDQpOwogTU9EVUxFX1BBUk1fREVTQyhzY2FsZV92b2x0YWdlLCAiU2NhbGUgdm9sdGFnZSBvZiBwcm9jZXNzb3IiKTsKLW1vZHVsZV9wYXJhbShpZ25vcmVfbGF0ZW5jeSwgaW50LCAwNjQ0KTsKLU1PRFVMRV9QQVJNX0RFU0MoaWdub3JlX2xhdGVuY3ksICJTa2lwIEFDUEkgQzMgbGF0ZW5jeSB0ZXN0Iik7CiAKIE1PRFVMRV9BVVRIT1IgKCJEYXZlIEpvbmVzIDxkYXZlakBjb2RlbW9ua2V5Lm9yZy51az4iKTsKIE1PRFVMRV9ERVNDUklQVElPTiAoIkxvbmdoYXVsIGRyaXZlciBmb3IgVklBIEN5cml4IHByb2Nlc3NvcnMuIik7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmggYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL2xvbmdoYXVsLmgKaW5kZXggYmM0NjgyYS4uYmIwYTA0YiAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9sb25naGF1bC5oCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvbG9uZ2hhdWwuaApAQCAtMjM1LDQ5ICsyMzUsMTQgQEAKIC8qCiAgKiBWSUEgQzMgTmVoZW1pYWggKi8KIAotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfY2xvY2tfcmF0aW9bMzJdID0geworc3RhdGljIGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9jbG9ja19yYXRpb1szMl0gPSB7CiAJMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCiAJMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCi0JLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLworCTQwLCAgLyogMDAxMCAtPiAgNC4weCAqLwogCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLwogCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLwogCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KLQktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCi0JNTUsICAvKiAwMTExIC0+ICA1LjV4ICovCi0JNjAsICAvKiAxMDAwIC0+ICA2LjB4ICovCi0JNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCi0JODAsICAvKiAxMDEwIC0+ICA4LjB4ICovCi0JNTAsICAvKiAxMDExIC0+ICA1LjB4ICovCi0JNjUsICAvKiAxMTAwIC0+ICA2LjV4ICovCi0JNzUsICAvKiAxMTAxIC0+ICA3LjV4ICovCi0JODUsICAvKiAxMTEwIC0+ICA4LjV4ICovCi0JMTIwLCAvKiAxMTExIC0+IDEyLjB4ICovCi0JMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCi0JLTEsICAvKiAwMDAxIC0+IFJFU0VSVkVEICovCi0JMTIwLCAvKiAwMDEwIC0+IDEyLjB4ICovCi0JOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCi0JMTA1LCAvKiAwMTAwIC0+IDEwLjV4ICovCi0JMTE1LCAvKiAwMTAxIC0+IDExLjV4ICovCi0JMTI1LCAvKiAwMTEwIC0+IDEyLjV4ICovCi0JMTM1LCAvKiAwMTExIC0+IDEzLjV4ICovCi0JMTQwLCAvKiAxMDAwIC0+IDE0LjB4ICovCi0JMTUwLCAvKiAxMDAxIC0+IDE1LjB4ICovCi0JMTYwLCAvKiAxMDEwIC0+IDE2LjB4ICovCi0JMTMwLCAvKiAxMDExIC0+IDEzLjB4ICovCi0JMTQ1LCAvKiAxMTAwIC0+IDE0LjV4ICovCi0JMTU1LCAvKiAxMTAxIC0+IDE1LjV4ICovCi0JLTEsICAvKiAxMTEwIC0+IFJFU0VSVkVEICgxMy4weCkgKi8KLQkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0ZGF0YSAgbmVoZW1pYWhfYl9jbG9ja19yYXRpb1szMl0gPSB7Ci0JMTAwLCAvKiAwMDAwIC0+IDEwLjB4ICovCi0JMTYwLCAvKiAwMDAxIC0+IDE2LjB4ICovCi0JLTEsICAvKiAwMDEwIC0+ICBSRVNFUlZFRCAqLwotCTkwLCAgLyogMDAxMSAtPiAgOS4weCAqLwotCTk1LCAgLyogMDEwMCAtPiAgOS41eCAqLwotCS0xLCAgLyogMDEwMSAtPiAgUkVTRVJWRUQgKi8KLQktMSwgIC8qIDAxMTAgLT4gIFJFU0VSVkVEICovCisJNDUsICAvKiAwMTEwIC0+ICA0LjV4ICovCiAJNTUsICAvKiAwMTExIC0+ICA1LjV4ICovCiAJNjAsICAvKiAxMDAwIC0+ICA2LjB4ICovCiAJNzAsICAvKiAxMDAxIC0+ICA3LjB4ICovCkBAIC0zMDUsODQgKzI3MCwxNCBAQAogCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLwogfTsKIAotc3RhdGljIGludCBfX2luaXRkYXRhICBuZWhlbWlhaF9jX2Nsb2NrX3JhdGlvWzMyXSA9IHsKLQkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KLQkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KLQk0MCwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCi0JOTAsICAvKiAwMDExIC0+ICA5LjB4ICovCi0JOTUsICAvKiAwMTAwIC0+ICA5LjV4ICovCi0JLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLwotCTQ1LCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KLQk1NSwgIC8qIDAxMTEgLT4gIDUuNXggKi8KLQk2MCwgIC8qIDEwMDAgLT4gIDYuMHggKi8KLQk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KLQk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KLQk1MCwgIC8qIDEwMTEgLT4gIDUuMHggKi8KLQk2NSwgIC8qIDExMDAgLT4gIDYuNXggKi8KLQk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KLQk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KLQkxMjAsIC8qIDExMTEgLT4gMTIuMHggKi8KLQkxMDAsIC8qIDAwMDAgLT4gMTAuMHggKi8KLQkxMTAsIC8qIDAwMDEgLT4gMTEuMHggKi8KLQkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KLQk5MCwgIC8qIDAwMTEgLT4gIDkuMHggKi8KLQkxMDUsIC8qIDAxMDAgLT4gMTAuNXggKi8KLQkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KLQkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KLQkxMzUsIC8qIDAxMTEgLT4gMTMuNXggKi8KLQkxNDAsIC8qIDEwMDAgLT4gMTQuMHggKi8KLQkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KLQkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KLQkxMzAsIC8qIDEwMTEgLT4gMTMuMHggKi8KLQkxNDUsIC8qIDExMDAgLT4gMTQuNXggKi8KLQkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KLQktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLwotCTEyMCwgLyogMTExMSAtPiAxMi4weCAqLwotfTsKLQotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2FfZWJsY3JbMzJdID0geworc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2VibGNyWzMyXSA9IHsKIAk1MCwgIC8qIDAwMDAgLT4gIDUuMHggKi8KIAkxNjAsIC8qIDAwMDEgLT4gMTYuMHggKi8KLQktMSwgIC8qIDAwMTAgLT4gIFJFU0VSVkVEICovCisJNDAsICAvKiAwMDEwIC0+ICA0LjB4ICovCiAJMTAwLCAvKiAwMDExIC0+IDEwLjB4ICovCiAJNTUsICAvKiAwMTAwIC0+ICA1LjV4ICovCiAJLTEsICAvKiAwMTAxIC0+ICBSRVNFUlZFRCAqLwotCS0xLCAgLyogMDExMCAtPiAgUkVTRVJWRUQgKi8KLQk5NSwgIC8qIDAxMTEgLT4gIDkuNXggKi8KLQk5MCwgIC8qIDEwMDAgLT4gIDkuMHggKi8KLQk3MCwgIC8qIDEwMDEgLT4gIDcuMHggKi8KLQk4MCwgIC8qIDEwMTAgLT4gIDguMHggKi8KLQk2MCwgIC8qIDEwMTEgLT4gIDYuMHggKi8KLQkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KLQk3NSwgIC8qIDExMDEgLT4gIDcuNXggKi8KLQk4NSwgIC8qIDExMTAgLT4gIDguNXggKi8KLQk2NSwgIC8qIDExMTEgLT4gIDYuNXggKi8KLQk5MCwgIC8qIDAwMDAgLT4gIDkuMHggKi8KLQktMSwgIC8qIDAwMDEgLT4gUkVTRVJWRUQgKi8KLQkxMjAsIC8qIDAwMTAgLT4gMTIuMHggKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQkxMzUsIC8qIDAxMDAgLT4gMTMuNXggKi8KLQkxMTUsIC8qIDAxMDEgLT4gMTEuNXggKi8KLQkxMjUsIC8qIDAxMTAgLT4gMTIuNXggKi8KLQkxMDUsIC8qIDAxMTEgLT4gMTAuNXggKi8KLQkxMzAsIC8qIDEwMDAgLT4gMTMuMHggKi8KLQkxNTAsIC8qIDEwMDEgLT4gMTUuMHggKi8KLQkxNjAsIC8qIDEwMTAgLT4gMTYuMHggKi8KLQkxNDAsIC8qIDEwMTEgLT4gMTQuMHggKi8KLQkxMjAsIC8qIDExMDAgLT4gMTIuMHggKi8KLQkxNTUsIC8qIDExMDEgLT4gMTUuNXggKi8KLQktMSwgIC8qIDExMTAgLT4gUkVTRVJWRUQgKDEzLjB4KSAqLwotCTE0NSAvKiAxMTExIC0+IDE0LjV4ICovCi0gICAvKiBlbmQgb2YgdGFibGUgICovCi19Owotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2JfZWJsY3JbMzJdID0gewotCTUwLCAgLyogMDAwMCAtPiAgNS4weCAqLwotCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLwotCS0xLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KLQktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCi0JLTEsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLworCTQ1LCAgLyogMDExMCAtPiAgNC41eCAqLwogCTk1LCAgLyogMDExMSAtPiAgOS41eCAqLwogCTkwLCAgLyogMTAwMCAtPiAgOS4weCAqLwogCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLwpAQCAtNDA4LDQyICszMDMsNiBAQAogCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLwogCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCiAJMTQ1IC8qIDExMTEgLT4gMTQuNXggKi8KLQkgICAvKiBlbmQgb2YgdGFibGUgICovCi19Owotc3RhdGljIGludCBfX2luaXRkYXRhIG5laGVtaWFoX2NfZWJsY3JbMzJdID0gewotCTUwLCAgLyogMDAwMCAtPiAgNS4weCAqLwotCTE2MCwgLyogMDAwMSAtPiAxNi4weCAqLwotCTQwLCAgLyogMDAxMCAtPiAgUkVTRVJWRUQgKi8KLQkxMDAsIC8qIDAwMTEgLT4gMTAuMHggKi8KLQk1NSwgIC8qIDAxMDAgLT4gIDUuNXggKi8KLQktMSwgIC8qIDAxMDEgLT4gIFJFU0VSVkVEICovCi0JNDUsICAvKiAwMTEwIC0+ICBSRVNFUlZFRCAqLwotCTk1LCAgLyogMDExMSAtPiAgOS41eCAqLwotCTkwLCAgLyogMTAwMCAtPiAgOS4weCAqLwotCTcwLCAgLyogMTAwMSAtPiAgNy4weCAqLwotCTgwLCAgLyogMTAxMCAtPiAgOC4weCAqLwotCTYwLCAgLyogMTAxMSAtPiAgNi4weCAqLwotCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLwotCTc1LCAgLyogMTEwMSAtPiAgNy41eCAqLwotCTg1LCAgLyogMTExMCAtPiAgOC41eCAqLwotCTY1LCAgLyogMTExMSAtPiAgNi41eCAqLwotCTkwLCAgLyogMDAwMCAtPiAgOS4weCAqLwotCTExMCwgLyogMDAwMSAtPiAxMS4weCAqLwotCTEyMCwgLyogMDAxMCAtPiAxMi4weCAqLwotCTEwMCwgLyogMDAxMSAtPiAxMC4weCAqLwotCTEzNSwgLyogMDEwMCAtPiAxMy41eCAqLwotCTExNSwgLyogMDEwMSAtPiAxMS41eCAqLwotCTEyNSwgLyogMDExMCAtPiAxMi41eCAqLwotCTEwNSwgLyogMDExMSAtPiAxMC41eCAqLwotCTEzMCwgLyogMTAwMCAtPiAxMy4weCAqLwotCTE1MCwgLyogMTAwMSAtPiAxNS4weCAqLwotCTE2MCwgLyogMTAxMCAtPiAxNi4weCAqLwotCTE0MCwgLyogMTAxMSAtPiAxNC4weCAqLwotCTEyMCwgLyogMTEwMCAtPiAxMi4weCAqLwotCTE1NSwgLyogMTEwMSAtPiAxNS41eCAqLwotCS0xLCAgLyogMTExMCAtPiBSRVNFUlZFRCAoMTMuMHgpICovCi0JMTQ1IC8qIDExMTEgLT4gMTQuNXggKi8KLQkgIC8qIGVuZCBvZiB0YWJsZSAgKi8KIH07CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMgYi9hcmNoL2kzODYva2VybmVsL2NwdS9jcHVmcmVxL3Bvd2Vybm93LWs4LmMKaW5kZXggMmQ2NDkxNi4uZmUzYjY3MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9wb3dlcm5vdy1rOC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvcG93ZXJub3ctazguYwpAQCAtMTI4OSw3ICsxMjg5LDExIEBACiAJaWYgKHF1ZXJ5X2N1cnJlbnRfdmFsdWVzX3dpdGhfcGVuZGluZ193YWl0KGRhdGEpKQogCQlnb3RvIG91dDsKIAotCWtoeiA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisJaWYgKGNwdV9mYW1pbHkgPT0gQ1BVX0hXX1BTVEFURSkKKwkJa2h6ID0gZmluZF9raHpfZnJlcV9mcm9tX2ZpZGRpZChkYXRhLT5jdXJyZmlkLCBkYXRhLT5jdXJyZGlkKTsKKwllbHNlCisJCWtoeiA9IGZpbmRfa2h6X2ZyZXFfZnJvbV9maWQoZGF0YS0+Y3VycmZpZCk7CisKIAogb3V0OgogCXNldF9jcHVzX2FsbG93ZWQoY3VycmVudCwgb2xkbWFzayk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCmluZGV4IDBiMjlkNDEuLmUxMDA2YjcgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvaHBldC5jCkBAIC0xLDQgKzEsNSBAQAogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvaHBldC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KQEAgLTYsMTcgKzcsMjc4IEBACiAjaW5jbHVkZSA8YXNtL2hwZXQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAorZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKKwogI2RlZmluZSBIUEVUX01BU0sJQ0xPQ0tTT1VSQ0VfTUFTSygzMikKICNkZWZpbmUgSFBFVF9TSElGVAkyMgogCiAvKiBGU0VDID0gMTBeLTE1IE5TRUMgPSAxMF4tOSAqLwogI2RlZmluZSBGU0VDX1BFUl9OU0VDCTEwMDAwMDAKIAotc3RhdGljIHZvaWQgX19pb21lbSAqaHBldF9wdHI7CisvKgorICogSFBFVCBhZGRyZXNzIGlzIHNldCBpbiBhY3BpL2Jvb3QuYywgd2hlbiBhbiBBQ1BJIGVudHJ5IGV4aXN0cworICovCit1bnNpZ25lZCBsb25nIGhwZXRfYWRkcmVzczsKK3N0YXRpYyB2b2lkIF9faW9tZW0gKiBocGV0X3ZpcnRfYWRkcmVzczsKIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGhwZXRfcmVhZGwodW5zaWduZWQgbG9uZyBhKQoreworCXJldHVybiByZWFkbChocGV0X3ZpcnRfYWRkcmVzcyArIGEpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaHBldF93cml0ZWwodW5zaWduZWQgbG9uZyBkLCB1bnNpZ25lZCBsb25nIGEpCit7CisJd3JpdGVsKGQsIGhwZXRfdmlydF9hZGRyZXNzICsgYSk7Cit9CisKKy8qCisgKiBIUEVUIGNvbW1hbmQgbGluZSBlbmFibGUgLyBkaXNhYmxlCisgKi8KK3N0YXRpYyBpbnQgYm9vdF9ocGV0X2Rpc2FibGU7CisKK3N0YXRpYyBpbnQgX19pbml0IGhwZXRfc2V0dXAoY2hhciogc3RyKQoreworCWlmIChzdHIpIHsKKwkJaWYgKCFzdHJuY21wKCJkaXNhYmxlIiwgc3RyLCA3KSkKKwkJCWJvb3RfaHBldF9kaXNhYmxlID0gMTsKKwl9CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJocGV0PSIsIGhwZXRfc2V0dXApOworCitzdGF0aWMgaW5saW5lIGludCBpc19ocGV0X2NhcGFibGUodm9pZCkKK3sKKwlyZXR1cm4gKCFib290X2hwZXRfZGlzYWJsZSAmJiBocGV0X2FkZHJlc3MpOworfQorCisvKgorICogSFBFVCB0aW1lciBpbnRlcnJ1cHQgZW5hYmxlIC8gZGlzYWJsZQorICovCitzdGF0aWMgaW50IGhwZXRfbGVnYWN5X2ludF9lbmFibGVkOworCisvKioKKyAqIGlzX2hwZXRfZW5hYmxlZCAtIGNoZWNrIHdoZXRoZXIgdGhlIGhwZXQgdGltZXIgaW50ZXJydXB0IGlzIGVuYWJsZWQKKyAqLworaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKQoreworCXJldHVybiBpc19ocGV0X2NhcGFibGUoKSAmJiBocGV0X2xlZ2FjeV9pbnRfZW5hYmxlZDsKK30KKworLyoKKyAqIFdoZW4gdGhlIGhwZXQgZHJpdmVyICgvZGV2L2hwZXQpIGlzIGVuYWJsZWQsIHdlIG5lZWQgdG8gcmVzZXJ2ZQorICogdGltZXIgMCBhbmQgdGltZXIgMSBpbiBjYXNlIG9mIFJUQyBlbXVsYXRpb24uCisgKi8KKyNpZmRlZiBDT05GSUdfSFBFVAorc3RhdGljIHZvaWQgaHBldF9yZXNlcnZlX3BsYXRmb3JtX3RpbWVycyh1bnNpZ25lZCBsb25nIGlkKQoreworCXN0cnVjdCBocGV0IF9faW9tZW0gKmhwZXQgPSBocGV0X3ZpcnRfYWRkcmVzczsKKwlzdHJ1Y3QgaHBldF90aW1lciBfX2lvbWVtICp0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsKKwl1bnNpZ25lZCBpbnQgbnJ0aW1lcnMsIGk7CisJc3RydWN0IGhwZXRfZGF0YSBoZDsKKworCW5ydGltZXJzID0gKChpZCAmIEhQRVRfSURfTlVNQkVSKSA+PiBIUEVUX0lEX05VTUJFUl9TSElGVCkgKyAxOworCisJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOworCWhkLmhkX3BoeXNfYWRkcmVzcyA9IGhwZXRfYWRkcmVzczsKKwloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7CisJaGQuaGRfbmlycXMgPSBucnRpbWVyczsKKwloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKKwlocGV0X3Jlc2VydmVfdGltZXIoJmhkLCAwKTsKKworI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7CisjZW5kaWYKKworCWhkLmhkX2lycVswXSA9IEhQRVRfTEVHQUNZXzgyNTQ7CisJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOworCisJZm9yIChpID0gMjsgaSA8IG5ydGltZXJzOyB0aW1lcisrLCBpKyspCisJCWhkLmhkX2lycVtpXSA9ICh0aW1lci0+aHBldF9jb25maWcgJiBUbl9JTlRfUk9VVEVfQ05GX01BU0spID4+CisJCQlUbl9JTlRfUk9VVEVfQ05GX1NISUZUOworCisJaHBldF9hbGxvYygmaGQpOworCit9CisjZWxzZQorc3RhdGljIHZvaWQgaHBldF9yZXNlcnZlX3BsYXRmb3JtX3RpbWVycyh1bnNpZ25lZCBsb25nIGlkKSB7IH0KKyNlbmRpZgorCisvKgorICogQ29tbW9uIGhwZXQgaW5mbworICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsKKworc3RhdGljIHZvaWQgaHBldF9zZXRfbW9kZShlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSwKKwkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KTsKK3N0YXRpYyBpbnQgaHBldF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsCisJCQkgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpOworCisvKgorICogVGhlIGhwZXQgY2xvY2sgZXZlbnQgZGV2aWNlCisgKi8KK3N0YXRpYyBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIGhwZXRfY2xvY2tldmVudCA9IHsKKwkubmFtZQkJPSAiaHBldCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5zZXRfbW9kZQk9IGhwZXRfc2V0X21vZGUsCisJLnNldF9uZXh0X2V2ZW50ID0gaHBldF9uZXh0X2V2ZW50LAorCS5zaGlmdAkJPSAzMiwKKwkuaXJxCQk9IDAsCit9OworCitzdGF0aWMgdm9pZCBocGV0X3N0YXJ0X2NvdW50ZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOworCisJY2ZnICY9IH5IUEVUX0NGR19FTkFCTEU7CisJaHBldF93cml0ZWwoY2ZnLCBIUEVUX0NGRyk7CisJaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSKTsKKwlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIgKyA0KTsKKwljZmcgfD0gSFBFVF9DRkdfRU5BQkxFOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOworfQorCitzdGF0aWMgdm9pZCBocGV0X2VuYWJsZV9pbnQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOworCisJY2ZnIHw9IEhQRVRfQ0ZHX0xFR0FDWTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKKwlocGV0X2xlZ2FjeV9pbnRfZW5hYmxlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIGhwZXRfc2V0X21vZGUoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGNmZywgY21wLCBub3c7CisJdWludDY0X3QgZGVsdGE7CisKKwlzd2l0Y2gobW9kZSkgeworCWNhc2UgQ0xPQ0tfRVZUX01PREVfUEVSSU9ESUM6CisJCWRlbHRhID0gKCh1aW50NjRfdCkoTlNFQ19QRVJfU0VDL0haKSkgKiBocGV0X2Nsb2NrZXZlbnQubXVsdDsKKwkJZGVsdGEgPj49IGhwZXRfY2xvY2tldmVudC5zaGlmdDsKKwkJbm93ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOworCQljbXAgPSBub3cgKyAodW5zaWduZWQgbG9uZykgZGVsdGE7CisJCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DRkcpOworCQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROX1BFUklPRElDIHwKKwkJICAgICAgIEhQRVRfVE5fU0VUVkFMIHwgSFBFVF9UTl8zMkJJVDsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisJCS8qCisJCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUKKwkJICogY29uZmlnIHJlZ2lzdGVyIHNldHMgdGhlIGNvdW50ZXIgdmFsdWUsIHRoZSBzZWNvbmQKKwkJICogd3JpdGUgc2V0cyB0aGUgcGVyaW9kLgorCQkgKi8KKwkJaHBldF93cml0ZWwoY21wLCBIUEVUX1QwX0NNUCk7CisJCXVkZWxheSgxKTsKKwkJaHBldF93cml0ZWwoKHVuc2lnbmVkIGxvbmcpIGRlbHRhLCBIUEVUX1QwX0NNUCk7CisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX1BFUklPRElDOworCQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOworCQlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDBfQ0ZHKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0VWVF9NT0RFX1VOVVNFRDoKKwljYXNlIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOOgorCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QwX0NGRyk7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGludCBocGV0X25leHRfZXZlbnQodW5zaWduZWQgbG9uZyBkZWx0YSwKKwkJCSAgIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGNudDsKKworCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwljbnQgKz0gZGVsdGE7CisJaHBldF93cml0ZWwoY250LCBIUEVUX1QwX0NNUCk7CisKKwlyZXR1cm4gKChsb25nKShocGV0X3JlYWRsKEhQRVRfQ09VTlRFUikgLSBjbnQgKSA+IDApOworfQorCisvKgorICogVHJ5IHRvIHNldHVwIHRoZSBIUEVUIHRpbWVyCisgKi8KK2ludCBfX2luaXQgaHBldF9lbmFibGUodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGlkOworCXVpbnQ2NF90IGhwZXRfZnJlcTsKKworCWlmICghaXNfaHBldF9jYXBhYmxlKCkpCisJCXJldHVybiAwOworCisJaHBldF92aXJ0X2FkZHJlc3MgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CisKKwkvKgorCSAqIFJlYWQgdGhlIHBlcmlvZCBhbmQgY2hlY2sgZm9yIGEgc2FuZSB2YWx1ZToKKwkgKi8KKwlocGV0X3BlcmlvZCA9IGhwZXRfcmVhZGwoSFBFVF9QRVJJT0QpOworCWlmIChocGV0X3BlcmlvZCA8IEhQRVRfTUlOX1BFUklPRCB8fCBocGV0X3BlcmlvZCA+IEhQRVRfTUFYX1BFUklPRCkKKwkJZ290byBvdXRfbm9ocGV0OworCisJLyoKKwkgKiBUaGUgcGVyaW9kIGlzIGEgZmVtdG8gc2Vjb25kcyB2YWx1ZS4gV2UgbmVlZCB0byBjYWxjdWxhdGUgdGhlCisJICogc2NhbGVkIG1hdGggbXVsdGlwbGljYXRpb24gZmFjdG9yIGZvciBuYW5vc2Vjb25kIHRvIGhwZXQgdGljaworCSAqIGNvbnZlcnNpb24uCisJICovCisJaHBldF9mcmVxID0gMTAwMDAwMDAwMDAwMDAwMFVMTDsKKwlkb19kaXYoaHBldF9mcmVxLCBocGV0X3BlcmlvZCk7CisJaHBldF9jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoKHVuc2lnbmVkIGxvbmcpIGhwZXRfZnJlcSwKKwkJCQkgICAgICBOU0VDX1BFUl9TRUMsIDMyKTsKKwkvKiBDYWxjdWxhdGUgdGhlIG1pbiAvIG1heCBkZWx0YSAqLworCWhwZXRfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPSBjbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRkZGRkYsCisJCQkJCQkJICAgJmhwZXRfY2xvY2tldmVudCk7CisJaHBldF9jbG9ja2V2ZW50Lm1pbl9kZWx0YV9ucyA9IGNsb2NrZXZlbnRfZGVsdGEybnMoMHgzMCwKKwkJCQkJCQkgICAmaHBldF9jbG9ja2V2ZW50KTsKKworCS8qCisJICogUmVhZCB0aGUgSFBFVCBJRCByZWdpc3RlciB0byByZXRyaWV2ZSB0aGUgSVJRIHJvdXRpbmcKKwkgKiBpbmZvcm1hdGlvbiBhbmQgdGhlIG51bWJlciBvZiBjaGFubmVscworCSAqLworCWlkID0gaHBldF9yZWFkbChIUEVUX0lEKTsKKworI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisJLyoKKwkgKiBUaGUgbGVnYWN5IHJvdXRpbmcgbW9kZSBuZWVkcyBhdCBsZWFzdCB0d28gY2hhbm5lbHMsIHRpY2sgdGltZXIKKwkgKiBhbmQgdGhlIHJ0YyBlbXVsYXRpb24gY2hhbm5lbC4KKwkgKi8KKwlpZiAoIShpZCAmIEhQRVRfSURfTlVNQkVSKSkKKwkJZ290byBvdXRfbm9ocGV0OworI2VuZGlmCisKKwkvKiBTdGFydCB0aGUgY291bnRlciAqLworCWhwZXRfc3RhcnRfY291bnRlcigpOworCisJaWYgKGlkICYgSFBFVF9JRF9MRUdTVVApIHsKKwkJaHBldF9lbmFibGVfaW50KCk7CisJCWhwZXRfcmVzZXJ2ZV9wbGF0Zm9ybV90aW1lcnMoaWQpOworCQkvKgorCQkgKiBTdGFydCBocGV0IHdpdGggdGhlIGJvb3QgY3B1IG1hc2sgYW5kIG1ha2UgaXQKKwkJICogZ2xvYmFsIGFmdGVyIHRoZSBJT19BUElDIGhhcyBiZWVuIGluaXRpYWxpemVkLgorCQkgKi8KKwkJaHBldF9jbG9ja2V2ZW50LmNwdW1hc2sgPWNwdW1hc2tfb2ZfY3B1KDApOworCQljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJmhwZXRfY2xvY2tldmVudCk7CisJCWdsb2JhbF9jbG9ja19ldmVudCA9ICZocGV0X2Nsb2NrZXZlbnQ7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKKworb3V0X25vaHBldDoKKwlpb3VubWFwKGhwZXRfdmlydF9hZGRyZXNzKTsKKwlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7CisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBDbG9jayBzb3VyY2UgcmVsYXRlZCBjb2RlCisgKi8KIHN0YXRpYyBjeWNsZV90IHJlYWRfaHBldCh2b2lkKQogewotCXJldHVybiAoY3ljbGVfdClyZWFkbChocGV0X3B0cik7CisJcmV0dXJuIChjeWNsZV90KWhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKIH0KIAogc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9ocGV0ID0gewpAQCAtMjQsMjggKzI4NiwxNyBAQAogCS5yYXRpbmcJCT0gMjUwLAogCS5yZWFkCQk9IHJlYWRfaHBldCwKIAkubWFzawkJPSBIUEVUX01BU0ssCi0JLm11bHQJCT0gMCwgLyogc2V0IGJlbG93ICovCiAJLnNoaWZ0CQk9IEhQRVRfU0hJRlQsCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfaHBldF9jbG9ja3NvdXJjZSh2b2lkKQogewotCXVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7Ci0Jdm9pZCBfX2lvbWVtKiBocGV0X2Jhc2U7CiAJdTY0IHRtcDsKLQlpbnQgZXJyOwogCi0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwlpZiAoIWhwZXRfdmlydF9hZGRyZXNzKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCS8qIGNhbGN1bGF0ZSB0aGUgaHBldCBhZGRyZXNzOiAqLwotCWhwZXRfYmFzZSA9IGlvcmVtYXBfbm9jYWNoZShocGV0X2FkZHJlc3MsIEhQRVRfTU1BUF9TSVpFKTsKLQlocGV0X3B0ciA9IGhwZXRfYmFzZSArIEhQRVRfQ09VTlRFUjsKLQotCS8qIGNhbGN1bGF0ZSB0aGUgZnJlcXVlbmN5OiAqLwotCWhwZXRfcGVyaW9kID0gcmVhZGwoaHBldF9iYXNlICsgSFBFVF9QRVJJT0QpOwotCiAJLyoKIAkgKiBocGV0IHBlcmlvZCBpcyBpbiBmZW10byBzZWNvbmRzIHBlciBjeWNsZQogCSAqIHNvIHdlIG5lZWQgdG8gY29udmVydCB0aGlzIHRvIG5zL2N5YyB1bml0cwpAQCAtNjEsMTEgKzMxMiwyMTggQEAKIAlkb19kaXYodG1wLCBGU0VDX1BFUl9OU0VDKTsKIAljbG9ja3NvdXJjZV9ocGV0Lm11bHQgPSAodTMyKXRtcDsKIAotCWVyciA9IGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9ocGV0KTsKLQlpZiAoZXJyKQotCQlpb3VubWFwKGhwZXRfYmFzZSk7Ci0KLQlyZXR1cm4gZXJyOworCXJldHVybiBjbG9ja3NvdXJjZV9yZWdpc3RlcigmY2xvY2tzb3VyY2VfaHBldCk7CiB9CiAKIG1vZHVsZV9pbml0KGluaXRfaHBldF9jbG9ja3NvdXJjZSk7CisKKyNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworCisvKiBIUEVUIGluIExlZ2FjeVJlcGxhY2VtZW50IE1vZGUgZWF0cyB1cCBSVEMgaW50ZXJydXB0IGxpbmUuIFdoZW4sIEhQRVQKKyAqIGlzIGVuYWJsZWQsIHdlIHN1cHBvcnQgUlRDIGludGVycnVwdCBmdW5jdGlvbmFsaXR5IGluIHNvZnR3YXJlLgorICogUlRDIGhhcyAzIGtpbmRzIG9mIGludGVycnVwdHM6CisgKiAxKSBVcGRhdGUgSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0LCBldmVyeSBzZWMsIHdoZW4gUlRDIGNsb2NrCisgKiAgICBpcyB1cGRhdGVkCisgKiAyKSBBbGFybSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgYXQgYSBzcGVjaWZpYyB0aW1lIG9mIGRheQorICogMykgUGVyaW9kaWMgSW50ZXJydXB0IC0gZ2VuZXJhdGUgcGVyaW9kaWMgaW50ZXJydXB0LCB3aXRoIGZyZXF1ZW5jaWVzCisgKiAgICAySHotODE5Mkh6ICgySHotNjRIeiBmb3Igbm9uLXJvb3QgdXNlcikgKGFsbCBmcmVxcyBpbiBwb3dlcnMgb2YgMikKKyAqICgxKSBhbmQgKDIpIGFib3ZlIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBwb2xsaW5nIGF0IGEgZnJlcXVlbmN5IG9mCisgKiA2NCBIei4gVGhlIGV4YWN0IGZyZXF1ZW5jeSBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gYWNjdXJhY3kgYW5kIGludGVycnVwdAorICogb3ZlcmhlYWQuIChERUZBVUxUX1JUQ19JTlRfRlJFUSkKKyAqIEZvciAoMyksIHdlIHVzZSBpbnRlcnJ1cHRzIGF0IDY0SHogb3IgdXNlciBzcGVjaWZpZWQgcGVyaW9kaWMKKyAqIGZyZXF1ZW5jeSwgd2hpY2hldmVyIGlzIGhpZ2hlci4KKyAqLworI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CisjaW5jbHVkZSA8bGludXgvcnRjLmg+CisKKyNkZWZpbmUgREVGQVVMVF9SVENfSU5UX0ZSRVEJNjQKKyNkZWZpbmUgREVGQVVMVF9SVENfU0hJRlQJNgorI2RlZmluZSBSVENfTlVNX0lOVFMJCTEKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9ydGNfZmxhZ3M7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3ByZXZfdXBkYXRlX3NlYzsKK3N0YXRpYyBzdHJ1Y3QgcnRjX3RpbWUgaHBldF9hbGFybV90aW1lOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9waWVfY291bnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3QxX2NtcDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfZGVmYXVsdF9kZWx0YTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGhwZXRfcGllX2RlbHRhOworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9waWVfbGltaXQ7CisKKy8qCisgKiBUaW1lciAxIGZvciBSVEMgZW11bGF0aW9uLiBXZSB1c2Ugb25lIHNob3QgbW9kZSwgYXMgcGVyaW9kaWMgbW9kZQorICogaXMgbm90IHN1cHBvcnRlZCBieSBhbGwgSFBFVCBpbXBsZW1lbnRhdGlvbnMgZm9yIHRpbWVyIDEuCisgKgorICogaHBldF9ydGNfdGltZXJfaW5pdCgpIGlzIGNhbGxlZCB3aGVuIHRoZSBydGMgaXMgaW5pdGlhbGl6ZWQuCisgKi8KK2ludCBocGV0X3J0Y190aW1lcl9pbml0KHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBjZmcsIGNudCwgZGVsdGEsIGZsYWdzOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWhwZXRfZGVmYXVsdF9kZWx0YSkgeworCQl1aW50NjRfdCBjbGM7CisKKwkJY2xjID0gKHVpbnQ2NF90KSBocGV0X2Nsb2NrZXZlbnQubXVsdCAqIE5TRUNfUEVSX1NFQzsKKwkJY2xjID4+PSBocGV0X2Nsb2NrZXZlbnQuc2hpZnQgKyBERUZBVUxUX1JUQ19TSElGVDsKKwkJaHBldF9kZWZhdWx0X2RlbHRhID0gKHVuc2lnbmVkIGxvbmcpIGNsYzsKKwl9CisKKwlpZiAoIShocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpIHx8IGhwZXRfcGllX2xpbWl0KQorCQlkZWx0YSA9IGhwZXRfZGVmYXVsdF9kZWx0YTsKKwllbHNlCisJCWRlbHRhID0gaHBldF9waWVfZGVsdGE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljbnQgPSBkZWx0YSArIGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwlocGV0X3dyaXRlbChjbnQsIEhQRVRfVDFfQ01QKTsKKwlocGV0X3QxX2NtcCA9IGNudDsKKworCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOworCWNmZyAmPSB+SFBFVF9UTl9QRVJJT0RJQzsKKwljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOworCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIDE7Cit9CisKKy8qCisgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgZnJvbSBydGMgZHJpdmVyLgorICogUmV0dXJuIDAgaWYgSFBFVCBpcyBub3QgYmVpbmcgdXNlZC4KKyAqIE90aGVyd2lzZSBkbyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgYW5kIHJldHVybiAxLgorICovCitpbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCit7CisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlocGV0X3J0Y19mbGFncyAmPSB+Yml0X21hc2s7CisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKQoreworCXVuc2lnbmVkIGxvbmcgb2xkYml0cyA9IGhwZXRfcnRjX2ZsYWdzOworCisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlocGV0X3J0Y19mbGFncyB8PSBiaXRfbWFzazsKKworCWlmICghb2xkYml0cykKKwkJaHBldF9ydGNfdGltZXJfaW5pdCgpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwKKwkJCXVuc2lnbmVkIGNoYXIgc2VjKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJaHBldF9hbGFybV90aW1lLnRtX2hvdXIgPSBocnM7CisJaHBldF9hbGFybV90aW1lLnRtX21pbiA9IG1pbjsKKwlocGV0X2FsYXJtX3RpbWUudG1fc2VjID0gc2VjOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9wZXJpb2RpY19mcmVxKHVuc2lnbmVkIGxvbmcgZnJlcSkKK3sKKwl1aW50NjRfdCBjbGM7CisKKwlpZiAoIWlzX2hwZXRfZW5hYmxlZCgpKQorCQlyZXR1cm4gMDsKKworCWlmIChmcmVxIDw9IERFRkFVTFRfUlRDX0lOVF9GUkVRKQorCQlocGV0X3BpZV9saW1pdCA9IERFRkFVTFRfUlRDX0lOVF9GUkVRIC8gZnJlcTsKKwllbHNlIHsKKwkJY2xjID0gKHVpbnQ2NF90KSBocGV0X2Nsb2NrZXZlbnQubXVsdCAqIE5TRUNfUEVSX1NFQzsKKwkJZG9fZGl2KGNsYywgZnJlcSk7CisJCWNsYyA+Pj0gaHBldF9jbG9ja2V2ZW50LnNoaWZ0OworCQlocGV0X3BpZV9kZWx0YSA9ICh1bnNpZ25lZCBsb25nKSBjbGM7CisJfQorCXJldHVybiAxOworfQorCitpbnQgaHBldF9ydGNfZHJvcHBlZF9pcnEodm9pZCkKK3sKKwlyZXR1cm4gaXNfaHBldF9lbmFibGVkKCk7Cit9CisKK3N0YXRpYyB2b2lkIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgY2ZnLCBkZWx0YTsKKwlpbnQgbG9zdF9pbnRzID0gLTE7CisKKwlpZiAodW5saWtlbHkoIWhwZXRfcnRjX2ZsYWdzKSkgeworCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ0ZHKTsKKwkJY2ZnICY9IH5IUEVUX1ROX0VOQUJMRTsKKwkJaHBldF93cml0ZWwoY2ZnLCBIUEVUX1QxX0NGRyk7CisJCXJldHVybjsKKwl9CisKKwlpZiAoIShocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpIHx8IGhwZXRfcGllX2xpbWl0KQorCQlkZWx0YSA9IGhwZXRfZGVmYXVsdF9kZWx0YTsKKwllbHNlCisJCWRlbHRhID0gaHBldF9waWVfZGVsdGE7CisKKwkvKgorCSAqIEluY3JlbWVudCB0aGUgY29tcGFyYXRvciB2YWx1ZSB1bnRpbCB3ZSBhcmUgYWhlYWQgb2YgdGhlCisJICogY3VycmVudCBjb3VudC4KKwkgKi8KKwlkbyB7CisJCWhwZXRfdDFfY21wICs9IGRlbHRhOworCQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOworCQlsb3N0X2ludHMrKzsKKwl9IHdoaWxlICgobG9uZykoaHBldF9yZWFkbChIUEVUX0NPVU5URVIpIC0gaHBldF90MV9jbXApID4gMCk7CisKKwlpZiAobG9zdF9pbnRzKSB7CisJCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUpCisJCQlocGV0X3BpZV9jb3VudCArPSBsb3N0X2ludHM7CisJCWlmIChwcmludGtfcmF0ZWxpbWl0KCkpCisJCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3QgJWQgaW50ZXJydXB0c1xuIiwKKwkJCQlsb3N0X2ludHMpOworCX0KK30KKworaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKK3sKKwlzdHJ1Y3QgcnRjX3RpbWUgY3Vycl90aW1lOworCXVuc2lnbmVkIGxvbmcgcnRjX2ludF9mbGFnID0gMDsKKworCWhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpOworCisJaWYgKGhwZXRfcnRjX2ZsYWdzICYgKFJUQ19VSUUgfCBSVENfQUlFKSkKKwkJcnRjX2dldF9ydGNfdGltZSgmY3Vycl90aW1lKTsKKworCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19VSUUgJiYKKwkgICAgY3Vycl90aW1lLnRtX3NlYyAhPSBocGV0X3ByZXZfdXBkYXRlX3NlYykgeworCQlydGNfaW50X2ZsYWcgPSBSVENfVUY7CisJCWhwZXRfcHJldl91cGRhdGVfc2VjID0gY3Vycl90aW1lLnRtX3NlYzsKKwl9CisKKwlpZiAoaHBldF9ydGNfZmxhZ3MgJiBSVENfUElFICYmCisJICAgICsraHBldF9waWVfY291bnQgPj0gaHBldF9waWVfbGltaXQpIHsKKwkJcnRjX2ludF9mbGFnIHw9IFJUQ19QRjsKKwkJaHBldF9waWVfY291bnQgPSAwOworCX0KKworCWlmIChocGV0X3J0Y19mbGFncyAmIFJUQ19QSUUgJiYKKwkgICAgKGN1cnJfdGltZS50bV9zZWMgPT0gaHBldF9hbGFybV90aW1lLnRtX3NlYykgJiYKKwkgICAgKGN1cnJfdGltZS50bV9taW4gPT0gaHBldF9hbGFybV90aW1lLnRtX21pbikgJiYKKwkgICAgKGN1cnJfdGltZS50bV9ob3VyID09IGhwZXRfYWxhcm1fdGltZS50bV9ob3VyKSkKKwkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfQUY7CisKKwlpZiAocnRjX2ludF9mbGFnKSB7CisJCXJ0Y19pbnRfZmxhZyB8PSAoUlRDX0lSUUYgfCAoUlRDX05VTV9JTlRTIDw8IDgpKTsKKwkJcnRjX2ludGVycnVwdChydGNfaW50X2ZsYWcsIGRldl9pZCk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1My5jCmluZGV4IDlhMDA2MGIuLmE2YmM3YmIgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2k4MjUzLmMKQEAgLTIsNyArMiw3IEBACiAgKiBpODI1My5jICA4MjUzL1BJVCBmdW5jdGlvbnMKICAqCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KICNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KICNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KQEAgLTE5LDIwICsxOSwxMDAgQEAKIERFRklORV9TUElOTE9DSyhpODI1M19sb2NrKTsKIEVYUE9SVF9TWU1CT0woaTgyNTNfbG9jayk7CiAKLXZvaWQgc2V0dXBfcGl0X3RpbWVyKHZvaWQpCisvKgorICogSFBFVCByZXBsYWNlcyB0aGUgUElULCB3aGVuIGVuYWJsZWQuIFNvIHdlIG5lZWQgdG8ga25vdywgd2hpY2ggb2YKKyAqIHRoZSB0d28gdGltZXJzIGlzIHVzZWQKKyAqLworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZ2xvYmFsX2Nsb2NrX2V2ZW50OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgUElUIHRpbWVyLgorICoKKyAqIFRoaXMgaXMgYWxzbyBjYWxsZWQgYWZ0ZXIgcmVzdW1lIHRvIGJyaW5nIHRoZSBQSVQgaW50byBvcGVyYXRpb24gYWdhaW4uCisgKi8KK3N0YXRpYyB2b2lkIGluaXRfcGl0X3RpbWVyKGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlLAorCQkJICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmaTgyNTNfbG9jaywgZmxhZ3MpOwotCW91dGJfcCgweDM0LFBJVF9NT0RFKTsJCS8qIGJpbmFyeSwgbW9kZSAyLCBMU0IvTVNCLCBjaCAwICovCi0JdWRlbGF5KDEwKTsKLQlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLwotCXVkZWxheSgxMCk7Ci0Jb3V0YihMQVRDSCA+PiA4ICwgUElUX0NIMCk7CS8qIE1TQiAqLworCisJc3dpdGNoKG1vZGUpIHsKKwljYXNlIENMT0NLX0VWVF9NT0RFX1BFUklPRElDOgorCQkvKiBiaW5hcnksIG1vZGUgMiwgTFNCL01TQiwgY2ggMCAqLworCQlvdXRiX3AoMHgzNCwgUElUX01PREUpOworCQl1ZGVsYXkoMTApOworCQlvdXRiX3AoTEFUQ0ggJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCQl1ZGVsYXkoMTApOworCQlvdXRiKExBVENIID4+IDggLCBQSVRfQ0gwKTsJLyogTVNCICovCisJCWJyZWFrOworCisJY2FzZSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UOgorCWNhc2UgQ0xPQ0tfRVZUX01PREVfU0hVVERPV046CisJY2FzZSBDTE9DS19FVlRfTU9ERV9VTlVTRUQ6CisJCS8qIE9uZSBzaG90IHNldHVwICovCisJCW91dGJfcCgweDM4LCBQSVRfTU9ERSk7CisJCXVkZWxheSgxMCk7CisJCWJyZWFrOworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7CiB9CiAKIC8qCisgKiBQcm9ncmFtIHRoZSBuZXh0IGV2ZW50IGluIG9uZXNob3QgbW9kZQorICoKKyAqIERlbHRhIGlzIGdpdmVuIGluIFBJVCB0aWNrcworICovCitzdGF0aWMgaW50IHBpdF9uZXh0X2V2ZW50KHVuc2lnbmVkIGxvbmcgZGVsdGEsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmV2dCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKKwlvdXRiX3AoZGVsdGEgJiAweGZmICwgUElUX0NIMCk7CS8qIExTQiAqLworCW91dGIoZGVsdGEgPj4gOCAsIFBJVF9DSDApOwkvKiBNU0IgKi8KKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpODI1M19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIE9uIFVQIHRoZSBQSVQgY2FuIHNlcnZlIGFsbCBvZiB0aGUgcG9zc2libGUgdGltZXIgZnVuY3Rpb25zLiBPbiBTTVAgc3lzdGVtcworICogaXQgY2FuIGJlIHNvbGVseSB1c2VkIGZvciB0aGUgZ2xvYmFsIHRpY2suCisgKgorICogVGhlIHByb2ZpbGluZyBhbmQgdXBkYXRlIGNhcGFiaWxpdGVzIGFyZSBzd2l0Y2hlZCBvZmYgb25jZSB0aGUgbG9jYWwgYXBpYyBpcworICogcmVnaXN0ZXJlZC4gVGhpcyBtZWNoYW5pc20gcmVwbGFjZXMgdGhlIHByZXZpb3VzICNpZmRlZiBMT0NBTF9BUElDIC0KKyAqICF1c2luZ19hcGljX3RpbWVyIGRlY2lzaW9ucyBpbiBkb190aW1lcl9pbnRlcnJ1cHRfaG9vaygpCisgKi8KK3N0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgcGl0X2Nsb2NrZXZlbnQgPSB7CisJLm5hbWUJCT0gInBpdCIsCisJLmZlYXR1cmVzCT0gQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMgfCBDTE9DS19FVlRfRkVBVF9PTkVTSE9ULAorCS5zZXRfbW9kZQk9IGluaXRfcGl0X3RpbWVyLAorCS5zZXRfbmV4dF9ldmVudCA9IHBpdF9uZXh0X2V2ZW50LAorCS5zaGlmdAkJPSAzMiwKKwkuaXJxCQk9IDAsCit9OworCisvKgorICogSW5pdGlhbGl6ZSB0aGUgY29udmVyc2lvbiBmYWN0b3IgYW5kIHRoZSBtaW4vbWF4IGRlbHRhcyBvZiB0aGUgY2xvY2sgZXZlbnQKKyAqIHN0cnVjdHVyZSBhbmQgcmVnaXN0ZXIgdGhlIGNsb2NrIGV2ZW50IHNvdXJjZSB3aXRoIHRoZSBmcmFtZXdvcmsuCisgKi8KK3ZvaWQgX19pbml0IHNldHVwX3BpdF90aW1lcih2b2lkKQoreworCS8qCisJICogU3RhcnQgcGl0IHdpdGggdGhlIGJvb3QgY3B1IG1hc2sgYW5kIG1ha2UgaXQgZ2xvYmFsIGFmdGVyIHRoZQorCSAqIElPX0FQSUMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisJICovCisJcGl0X2Nsb2NrZXZlbnQuY3B1bWFzayA9IGNwdW1hc2tfb2ZfY3B1KDApOworCXBpdF9jbG9ja2V2ZW50Lm11bHQgPSBkaXZfc2MoQ0xPQ0tfVElDS19SQVRFLCBOU0VDX1BFUl9TRUMsIDMyKTsKKwlwaXRfY2xvY2tldmVudC5tYXhfZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4N0ZGRiwgJnBpdF9jbG9ja2V2ZW50KTsKKwlwaXRfY2xvY2tldmVudC5taW5fZGVsdGFfbnMgPQorCQljbG9ja2V2ZW50X2RlbHRhMm5zKDB4RiwgJnBpdF9jbG9ja2V2ZW50KTsKKwljbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2UoJnBpdF9jbG9ja2V2ZW50KTsKKwlnbG9iYWxfY2xvY2tfZXZlbnQgPSAmcGl0X2Nsb2NrZXZlbnQ7Cit9CisKKy8qCiAgKiBTaW5jZSB0aGUgUElUIG92ZXJmbG93cyBldmVyeSB0aWNrLCBpdHMgbm90IHZlcnkgdXNlZnVsCiAgKiB0byBqdXN0IHJlYWQgYnkgaXRzZWxmLiBTbyB1c2UgamlmZmllcyB0byBlbXVsYXRlIGEgZnJlZQogICogcnVubmluZyBjb3VudGVyOgpAQCAtNDYsNyArMTI2LDcgQEAKIAlzdGF0aWMgdTMyIG9sZF9qaWZzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmk4MjUzX2xvY2ssIGZsYWdzKTsKLSAgICAgICAgLyoKKwkvKgogCSAqIEFsdGhvdWdoIG91ciBjYWxsZXIgbWF5IGhhdmUgdGhlIHJlYWQgc2lkZSBvZiB4dGltZV9sb2NrLAogCSAqIHRoaXMgaXMgbm93IGEgc2VxbG9jaywgYW5kIHdlIGFyZSBjaGVhdGluZyBpbiB0aGlzIHJvdXRpbmUKIAkgKiBieSBoYXZpbmcgc2lkZSBlZmZlY3RzIG9uIHN0YXRlIHRoYXQgd2UgY2Fubm90IHVuZG8gaWYKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvaTgyNTkuYwppbmRleCBjOGQ0NTgyLi4wM2FiZmRiIDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9pODI1OS5jCkBAIC00MSw2ICs0MSw3IEBACiBzdGF0aWMgc3RydWN0IGlycV9jaGlwIGk4MjU5QV9jaGlwID0gewogCS5uYW1lCQk9ICJYVC1QSUMiLAogCS5tYXNrCQk9IGRpc2FibGVfODI1OUFfaXJxLAorCS5kaXNhYmxlCT0gZGlzYWJsZV84MjU5QV9pcnEsCiAJLnVubWFzawkJPSBlbmFibGVfODI1OUFfaXJxLAogCS5tYXNrX2Fjawk9IG1hc2tfYW5kX2Fja184MjU5QSwKIH07CkBAIC00MTAsMTIgKzQxMSw2IEBACiAJaW50cl9pbml0X2hvb2soKTsKIAogCS8qCi0JICogU2V0IHRoZSBjbG9jayB0byBIWiBIeiwgd2UgYWxyZWFkeSBoYXZlIGEgdmFsaWQKLQkgKiB2ZWN0b3Igbm93OgotCSAqLwotCXNldHVwX3BpdF90aW1lcigpOwotCi0JLyoKIAkgKiBFeHRlcm5hbCBGUFU/IFNldCB1cCBpcnExMyBpZiBzbywgZm9yCiAJICogb3JpZ2luYWwgYnJhaW5kYW1hZ2VkIElCTSBGRVJSIGNvdXBsaW5nLgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC9pb19hcGljLmMgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwppbmRleCBlMzBjY2VkLi40Y2NlYmQ0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lvX2FwaWMuYwpAQCAtNDgyLDggKzQ4Miw4IEBACiAJCXBhY2thZ2VfaW5kZXggPSBDUFVfVE9fUEFDS0FHRUlOREVYKGkpOwogCQlmb3IgKGogPSAwOyBqIDwgTlJfSVJRUzsgaisrKSB7CiAJCQl1bnNpZ25lZCBsb25nIHZhbHVlX25vdywgZGVsdGE7Ci0JCQkvKiBJcyB0aGlzIGFuIGFjdGl2ZSBJUlE/ICovCi0JCQlpZiAoIWlycV9kZXNjW2pdLmFjdGlvbikKKwkJCS8qIElzIHRoaXMgYW4gYWN0aXZlIElSUSBvciBiYWxhbmNpbmcgZGlzYWJsZWQgPyAqLworCQkJaWYgKCFpcnFfZGVzY1tqXS5hY3Rpb24gfHwgaXJxX2JhbGFuY2luZ19kaXNhYmxlZChqKSkKIAkJCQljb250aW51ZTsKIAkJCWlmICggcGFja2FnZV9pbmRleCA9PSBpICkKIAkJCQlJUlFfREVMVEEocGFja2FnZV9pbmRleCxqKSA9IDA7CkBAIC0xMjgxLDExICsxMjgxLDkgQEAKIAkJCXRyaWdnZXIgPT0gSU9BUElDX0xFVkVMKQogCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpcnEsICZpb2FwaWNfY2hpcCwKIAkJCQkJIGhhbmRsZV9mYXN0ZW9pX2lycSwgImZhc3Rlb2kiKTsKLQllbHNlIHsKLQkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgfD0gSVJRX0RFTEFZRURfRElTQUJMRTsKKwllbHNlCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlvYXBpY19jaGlwLAogCQkJCQkgaGFuZGxlX2VkZ2VfaXJxLCAiZWRnZSIpOwotCX0KIAlzZXRfaW50cl9nYXRlKHZlY3RvciwgaW50ZXJydXB0W2lycV0pOwogfQogCkBAIC0xNTg4LDcgKzE1ODYsNyBAQAogCXYgPSBhcGljX3JlYWQoQVBJQ19MVlIpOwogCXByaW50ayhLRVJOX0lORk8gIi4uLiBBUElDIFZFUlNJT046ICUwOHhcbiIsIHYpOwogCXZlciA9IEdFVF9BUElDX1ZFUlNJT04odik7Ci0JbWF4bHZ0ID0gZ2V0X21heGx2dCgpOworCW1heGx2dCA9IGxhcGljX2dldF9tYXhsdnQoKTsKIAogCXYgPSBhcGljX3JlYWQoQVBJQ19UQVNLUFJJKTsKIAlwcmludGsoS0VSTl9ERUJVRyAiLi4uIEFQSUMgVEFTS1BSSTogJTA4eCAoJTAyeClcbiIsIHYsIHYgJiBBUElDX1RQUklfTUFTSyk7CmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL2lycS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYwppbmRleCA1Nzg1ZDg0Li4wZjJjYTU5MCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2kzODYva2VybmVsL2lycS5jCkBAIC0xMCw3ICsxMCw2IEBACiAgKiBpb19hcGljLmMuKQogICovCiAKLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CkBAIC0yMSwxOSArMjAsMzQgQEAKIAogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAKKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKIERFRklORV9QRVJfQ1BVKGlycV9jcHVzdGF0X3QsIGlycV9zdGF0KSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGlycV9zdGF0KTsKIAotI2lmbmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIC8qCiAgKiAnd2hhdCBzaG91bGQgd2UgZG8gaWYgd2UgZ2V0IGEgaHcgaXJxIGV2ZW50IG9uIGFuIGlsbGVnYWwgdmVjdG9yJy4KICAqIGVhY2ggYXJjaGl0ZWN0dXJlIGhhcyB0byBhbnN3ZXIgdGhpcyB0aGVtc2VsdmVzLgogICovCiB2b2lkIGFja19iYWRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JcHJpbnRrKCJ1bmV4cGVjdGVkIElSUSB0cmFwIGF0IHZlY3RvciAlMDJ4XG4iLCBpcnEpOwotfQorCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBJUlEgdHJhcCBhdCB2ZWN0b3IgJTAyeFxuIiwgaXJxKTsKKworI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworCS8qCisJICogQ3VycmVudGx5IHVuZXhwZWN0ZWQgdmVjdG9ycyBoYXBwZW4gb25seSBvbiBTTVAgYW5kIEFQSUMuCisJICogV2UgX211c3RfIGFjayB0aGVzZSBiZWNhdXNlIGV2ZXJ5IGxvY2FsIEFQSUMgaGFzIG9ubHkgTgorCSAqIGlycSBzbG90cyBwZXIgcHJpb3JpdHkgbGV2ZWwsIGFuZCBhICdoYW5naW5nLCB1bmFja2VkJyBJUlEKKwkgKiBob2xkcyB1cCBhbiBpcnEgc2xvdCAtIGluIGV4Y2Vzc2l2ZSBjYXNlcyAod2hlbiBtdWx0aXBsZQorCSAqIHVuZXhwZWN0ZWQgdmVjdG9ycyBvY2N1cikgdGhhdCBtaWdodCBsb2NrIHVwIHRoZSBBUElDCisJICogY29tcGxldGVseS4KKwkgKiBCdXQgb25seSBhY2sgd2hlbiB0aGUgQVBJQyBpcyBlbmFibGVkIC1BSworCSAqLworCWlmIChjcHVfaGFzX2FwaWMpCisJCWFja19BUElDX2lycSgpOwogI2VuZGlmCit9CiAKICNpZmRlZiBDT05GSUdfNEtTVEFDS1MKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL25taS5jIGIvYXJjaC9pMzg2L2tlcm5lbC9ubWkuYwppbmRleCA1ZDhhMDdjLi44MjFkZjM0IDEwMDY0NAotLS0gYS9hcmNoL2kzODYva2VybmVsL25taS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvbm1pLmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kbWkuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAKICNpbmNsdWRlIDxhc20vc21wLmg+CiAjaW5jbHVkZSA8YXNtL25taS5oPgpAQCAtOTczLDkgKzk3NCwxMyBAQAogCQljcHVfY2xlYXIoY3B1LCBiYWNrdHJhY2VfbWFzayk7CiAJfQogCi0Jc3VtID0gcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5hcGljX3RpbWVyX2lycXM7CisJLyoKKwkgKiBUYWtlIHRoZSBsb2NhbCBhcGljIHRpbWVyIGFuZCBQSVQvSFBFVCBpbnRvIGFjY291bnQuIFdlIGRvbid0CisJICoga25vdyB3aGljaCBvbmUgaXMgYWN0aXZlLCB3aGVuIHdlIGhhdmUgaGlnaHJlcy9keW50aWNrIG9uCisJICovCisJc3VtID0gcGVyX2NwdShpcnFfc3RhdCwgY3B1KS5hcGljX3RpbWVyX2lycXMgKyBrc3RhdF9pcnFzKDApOwogCi0JLyogaWYgdGhlIGFwaWMgdGltZXIgaXNuJ3QgZmlyaW5nLCB0aGlzIGNwdSBpc24ndCBkb2luZyBtdWNoICovCisJLyogaWYgdGhlIG5vbmUgb2YgdGhlIHRpbWVycyBpc24ndCBmaXJpbmcsIHRoaXMgY3B1IGlzbid0IGRvaW5nIG11Y2ggKi8KIAlpZiAoIXRvdWNoZWQgJiYgbGFzdF9pcnFfc3Vtc1tjcHVdID09IHN1bSkgewogCQkvKgogCQkgKiBBeWllZSwgbG9va3MgbGlrZSB0aGlzIENQVSBpcyBzdHVjayAuLi4KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKaW5kZXggNzg0NWQ0OC4uYmVhMzA0ZCAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC9wcm9jZXNzLmMKQEAgLTM4LDYgKzM4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KICNpbmNsdWRlIDxsaW51eC9wZXJzb25hbGl0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTIxMSw2ICsyMTIsNyBAQAogCiAJLyogZW5kbGVzcyBpZGxlIGxvb3Agd2l0aCBubyBwcmlvcml0eSBhdCBhbGwgKi8KIAl3aGlsZSAoMSkgeworCQl0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKCk7CiAJCXdoaWxlICghbmVlZF9yZXNjaGVkKCkpIHsKIAkJCXZvaWQgKCppZGxlKSh2b2lkKTsKIApAQCAtMjM4LDYgKzI0MCw3IEBACiAJCQlpZGxlKCk7CiAJCQlfX2V4aXRfaWRsZSgpOwogCQl9CisJCXRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2soKTsKIAkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZCgpOwogCQlzY2hlZHVsZSgpOwogCQlwcmVlbXB0X2Rpc2FibGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jIGIvYXJjaC9pMzg2L2tlcm5lbC9zbXBib290LmMKaW5kZXggZjQ2YTRkMC4uNDhiZmNhYTEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvc21wYm9vdC5jCkBAIC05NCwxMiArOTQsNiBAQAogRVhQT1JUX1NZTUJPTChjcHVfcG9zc2libGVfbWFwKTsKIHN0YXRpYyBjcHVtYXNrX3Qgc21wX2NvbW1lbmNlZF9tYXNrOwogCi0vKiBUU0MncyB1cHBlciAzMiBiaXRzIGNhbid0IGJlIHdyaXR0ZW4gaW4gZWFyaWxlciBDUFUgKGJlZm9yZSBwcmVzY290dCksIHRoZXJlCi0gKiBpcyBubyB3YXkgdG8gcmVzeW5jIG9uZSBBUCBhZ2FpbnN0IEJQLiBUQkQ6IGZvciBwcmVzY290dCBhbmQgYWJvdmUsIHdlCi0gKiBzaG91bGQgdXNlIElBNjQncyBhbGdvcml0aG0KLSAqLwotc3RhdGljIGludCBfX2RldmluaXRkYXRhIHRzY19zeW5jX2Rpc2FibGVkOwotCiAvKiBQZXIgQ1BVIGJvZ29taXBzIGFuZCBvdGhlciBwYXJhbWV0ZXJzICovCiBzdHJ1Y3QgY3B1aW5mb194ODYgY3B1X2RhdGFbTlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsKIEVYUE9SVF9TWU1CT0woY3B1X2RhdGEpOwpAQCAtMjE2LDE1MSArMjEwLDYgQEAKIAk7CiB9CiAKLS8qCi0gKiBUU0Mgc3luY2hyb25pemF0aW9uLgotICoKLSAqIFdlIGZpcnN0IGNoZWNrIHdoZXRoZXIgYWxsIENQVXMgaGF2ZSB0aGVpciBUU0MncyBzeW5jaHJvbml6ZWQsCi0gKiB0aGVuIHdlIHByaW50IGEgd2FybmluZyBpZiBub3QsIGFuZCBhbHdheXMgcmVzeW5jLgotICovCi0KLXN0YXRpYyBzdHJ1Y3QgewotCWF0b21pY190IHN0YXJ0X2ZsYWc7Ci0JYXRvbWljX3QgY291bnRfc3RhcnQ7Ci0JYXRvbWljX3QgY291bnRfc3RvcDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWVzW05SX0NQVVNdOwotfSB0c2MgX19jcHVpbml0ZGF0YSA9IHsKLQkuc3RhcnRfZmxhZyA9IEFUT01JQ19JTklUKDApLAotCS5jb3VudF9zdGFydCA9IEFUT01JQ19JTklUKDApLAotCS5jb3VudF9zdG9wID0gQVRPTUlDX0lOSVQoMCksCi19OwotCi0jZGVmaW5lIE5SX0xPT1BTIDUKLQotc3RhdGljIHZvaWQgX19pbml0IHN5bmNocm9uaXplX3RzY19icCh2b2lkKQotewotCWludCBpOwotCXVuc2lnbmVkIGxvbmcgbG9uZyB0MDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgc3VtLCBhdmc7Ci0JbG9uZyBsb25nIGRlbHRhOwotCXVuc2lnbmVkIGludCBvbmVfdXNlYzsKLQlpbnQgYnVnZ3kgPSAwOwotCi0JcHJpbnRrKEtFUk5fSU5GTyAiY2hlY2tpbmcgVFNDIHN5bmNocm9uaXphdGlvbiBhY3Jvc3MgJXUgQ1BVczogIiwgbnVtX2Jvb3RpbmdfY3B1cygpKTsKLQotCS8qIGNvbnZlcnQgZnJvbSBrY3ljL3NlYyB0byBjeWMvdXNlYyAqLwotCW9uZV91c2VjID0gY3B1X2toeiAvIDEwMDA7Ci0KLQlhdG9taWNfc2V0KCZ0c2Muc3RhcnRfZmxhZywgMSk7Ci0Jd21iKCk7Ci0KLQkvKgotCSAqIFdlIGxvb3AgYSBmZXcgdGltZXMgdG8gZ2V0IGEgcHJpbWVkIGluc3RydWN0aW9uIGNhY2hlLAotCSAqIHRoZW4gdGhlIGxhc3QgcGFzcyBpcyBtb3JlIG9yIGxlc3Mgc3luY2hyb25pemVkIGFuZAotCSAqIHRoZSBCUCBhbmQgQVBzIHNldCB0aGVpciBjeWNsZSBjb3VudGVycyB0byB6ZXJvIGFsbCBhdAotCSAqIG9uY2UuIFRoaXMgcmVkdWNlcyB0aGUgY2hhbmNlIG9mIGhhdmluZyByYW5kb20gb2Zmc2V0cwotCSAqIGJldHdlZW4gdGhlIHByb2Nlc3NvcnMsIGFuZCBndWFyYW50ZWVzIHRoYXQgdGhlIG1heGltdW0KLQkgKiBkZWxheSBiZXR3ZWVuIHRoZSBjeWNsZSBjb3VudGVycyBpcyBuZXZlciBiaWdnZXIgdGhhbgotCSAqIHRoZSBsYXRlbmN5IG9mIGluZm9ybWF0aW9uLXBhc3NpbmcgKGNhY2hlbGluZXMpIGJldHdlZW4KLQkgKiB0d28gQ1BVcy4KLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgTlJfTE9PUFM7IGkrKykgewotCQkvKgotCQkgKiBhbGwgQVBzIHN5bmNocm9uaXplIGJ1dCB0aGV5IGxvb3Agb24gJz09IG51bV9jcHVzJwotCQkgKi8KLQkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2MuY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKS0xKQotCQkJY3B1X3JlbGF4KCk7Ci0JCWF0b21pY19zZXQoJnRzYy5jb3VudF9zdG9wLCAwKTsKLQkJd21iKCk7Ci0JCS8qCi0JCSAqIHRoaXMgbGV0cyB0aGUgQVBzIHNhdmUgdGhlaXIgY3VycmVudCBUU0M6Ci0JCSAqLwotCQlhdG9taWNfaW5jKCZ0c2MuY291bnRfc3RhcnQpOwotCi0JCXJkdHNjbGwodHNjLnZhbHVlc1tzbXBfcHJvY2Vzc29yX2lkKCldKTsKLQkJLyoKLQkJICogV2UgY2xlYXIgdGhlIFRTQyBpbiB0aGUgbGFzdCBsb29wOgotCQkgKi8KLQkJaWYgKGkgPT0gTlJfTE9PUFMtMSkKLQkJCXdyaXRlX3RzYygwLCAwKTsKLQotCQkvKgotCQkgKiBXYWl0IGZvciBhbGwgQVBzIHRvIGxlYXZlIHRoZSBzeW5jaHJvbml6YXRpb24gcG9pbnQ6Ci0JCSAqLwotCQl3aGlsZSAoYXRvbWljX3JlYWQoJnRzYy5jb3VudF9zdG9wKSAhPSBudW1fYm9vdGluZ19jcHVzKCktMSkKLQkJCWNwdV9yZWxheCgpOwotCQlhdG9taWNfc2V0KCZ0c2MuY291bnRfc3RhcnQsIDApOwotCQl3bWIoKTsKLQkJYXRvbWljX2luYygmdHNjLmNvdW50X3N0b3ApOwotCX0KLQotCXN1bSA9IDA7Ci0JZm9yIChpID0gMDsgaSA8IE5SX0NQVVM7IGkrKykgewotCQlpZiAoY3B1X2lzc2V0KGksIGNwdV9jYWxsb3V0X21hcCkpIHsKLQkJCXQwID0gdHNjLnZhbHVlc1tpXTsKLQkJCXN1bSArPSB0MDsKLQkJfQotCX0KLQlhdmcgPSBzdW07Ci0JZG9fZGl2KGF2ZywgbnVtX2Jvb3RpbmdfY3B1cygpKTsKLQotCWZvciAoaSA9IDA7IGkgPCBOUl9DUFVTOyBpKyspIHsKLQkJaWYgKCFjcHVfaXNzZXQoaSwgY3B1X2NhbGxvdXRfbWFwKSkKLQkJCWNvbnRpbnVlOwotCQlkZWx0YSA9IHRzYy52YWx1ZXNbaV0gLSBhdmc7Ci0JCWlmIChkZWx0YSA8IDApCi0JCQlkZWx0YSA9IC1kZWx0YTsKLQkJLyoKLQkJICogV2UgcmVwb3J0IGJpZ2dlciB0aGFuIDIgbWljcm9zZWNvbmRzIGNsb2NrIGRpZmZlcmVuY2VzLgotCQkgKi8KLQkJaWYgKGRlbHRhID4gMipvbmVfdXNlYykgewotCQkJbG9uZyBsb25nIHJlYWxkZWx0YTsKLQotCQkJaWYgKCFidWdneSkgewotCQkJCWJ1Z2d5ID0gMTsKLQkJCQlwcmludGsoIlxuIik7Ci0JCQl9Ci0JCQlyZWFsZGVsdGEgPSBkZWx0YTsKLQkJCWRvX2RpdihyZWFsZGVsdGEsIG9uZV91c2VjKTsKLQkJCWlmICh0c2MudmFsdWVzW2ldIDwgYXZnKQotCQkJCXJlYWxkZWx0YSA9IC1yZWFsZGVsdGE7Ci0KLQkJCWlmIChyZWFsZGVsdGEpCi0JCQkJcHJpbnRrKEtFUk5fSU5GTyAiQ1BVIyVkIGhhZCAlTGQgdXNlY3MgVFNDICIKLQkJCQkJInNrZXcsIGZpeGVkIGl0IHVwLlxuIiwgaSwgcmVhbGRlbHRhKTsKLQkJfQotCX0KLQlpZiAoIWJ1Z2d5KQotCQlwcmludGsoInBhc3NlZC5cbiIpOwotfQotCi1zdGF0aWMgdm9pZCBfX2NwdWluaXQgc3luY2hyb25pemVfdHNjX2FwKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQkvKgotCSAqIE5vdCBldmVyeSBjcHUgaXMgb25saW5lIGF0IHRoZSB0aW1lCi0JICogdGhpcyBnZXRzIGNhbGxlZCwgc28gd2UgZmlyc3Qgd2FpdCBmb3IgdGhlIEJQIHRvCi0JICogZmluaXNoIFNNUCBpbml0aWFsaXphdGlvbjoKLQkgKi8KLQl3aGlsZSAoIWF0b21pY19yZWFkKCZ0c2Muc3RhcnRfZmxhZykpCi0JCWNwdV9yZWxheCgpOwotCi0JZm9yIChpID0gMDsgaSA8IE5SX0xPT1BTOyBpKyspIHsKLQkJYXRvbWljX2luYygmdHNjLmNvdW50X3N0YXJ0KTsKLQkJd2hpbGUgKGF0b21pY19yZWFkKCZ0c2MuY291bnRfc3RhcnQpICE9IG51bV9ib290aW5nX2NwdXMoKSkKLQkJCWNwdV9yZWxheCgpOwotCi0JCXJkdHNjbGwodHNjLnZhbHVlc1tzbXBfcHJvY2Vzc29yX2lkKCldKTsKLQkJaWYgKGkgPT0gTlJfTE9PUFMtMSkKLQkJCXdyaXRlX3RzYygwLCAwKTsKLQotCQlhdG9taWNfaW5jKCZ0c2MuY291bnRfc3RvcCk7Ci0JCXdoaWxlIChhdG9taWNfcmVhZCgmdHNjLmNvdW50X3N0b3ApICE9IG51bV9ib290aW5nX2NwdXMoKSkKLQkJCWNwdV9yZWxheCgpOwotCX0KLX0KLSN1bmRlZiBOUl9MT09QUwotCiBleHRlcm4gdm9pZCBjYWxpYnJhdGVfZGVsYXkodm9pZCk7CiAKIHN0YXRpYyBhdG9taWNfdCBpbml0X2RlYXNzZXJ0ZWQ7CkBAIC00MzgsMjAgKzI4NywxMiBAQAogCS8qCiAJICogU2F2ZSBvdXIgcHJvY2Vzc29yIHBhcmFtZXRlcnMKIAkgKi8KLSAJc21wX3N0b3JlX2NwdV9pbmZvKGNwdWlkKTsKLQotCWRpc2FibGVfQVBJQ190aW1lcigpOworCXNtcF9zdG9yZV9jcHVfaW5mbyhjcHVpZCk7CiAKIAkvKgogCSAqIEFsbG93IHRoZSBtYXN0ZXIgdG8gY29udGludWUuCiAJICovCiAJY3B1X3NldChjcHVpZCwgY3B1X2NhbGxpbl9tYXApOwotCi0JLyoKLQkgKiAgICAgIFN5bmNocm9uaXplIHRoZSBUU0Mgd2l0aCB0aGUgQlAKLQkgKi8KLQlpZiAoY3B1X2hhc190c2MgJiYgY3B1X2toeiAmJiAhdHNjX3N5bmNfZGlzYWJsZWQpCi0JCXN5bmNocm9uaXplX3RzY19hcCgpOwogfQogCiBzdGF0aWMgaW50IGNwdWNvdW50OwpAQCAtNTU0LDEzICszOTUsMTcgQEAKIAlzbXBfY2FsbGluKCk7CiAJd2hpbGUgKCFjcHVfaXNzZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBzbXBfY29tbWVuY2VkX21hc2spKQogCQlyZXBfbm9wKCk7CisJLyoKKwkgKiBDaGVjayBUU0Mgc3luY2hyb25pemF0aW9uIHdpdGggdGhlIEJQOgorCSAqLworCWNoZWNrX3RzY19zeW5jX3RhcmdldCgpOworCiAJc2V0dXBfc2Vjb25kYXJ5X2Nsb2NrKCk7CiAJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfSU9fQVBJQykgewogCQlkaXNhYmxlXzgyNTlBX2lycSgwKTsKIAkJZW5hYmxlX05NSV90aHJvdWdoX0xWVDAoTlVMTCk7CiAJCWVuYWJsZV84MjU5QV9pcnEoMCk7CiAJfQotCWVuYWJsZV9BUElDX3RpbWVyKCk7CiAJLyoKIAkgKiBsb3ctbWVtb3J5IG1hcHBpbmdzIGhhdmUgYmVlbiBjbGVhcmVkLCBmbHVzaCB0aGVtIGZyb20KIAkgKiB0aGUgbG9jYWwgVExCcyB0b28uCkBAIC03NTIsNyArNTk3LDcgQEAKIAkvKgogCSAqIER1ZSB0byB0aGUgUGVudGl1bSBlcnJhdHVtIDNBUC4KIAkgKi8KLQltYXhsdnQgPSBnZXRfbWF4bHZ0KCk7CisJbWF4bHZ0ID0gbGFwaWNfZ2V0X21heGx2dCgpOwogCWlmIChtYXhsdnQgPiAzKSB7CiAJCWFwaWNfcmVhZF9hcm91bmQoQVBJQ19TUElWKTsKIAkJYXBpY193cml0ZShBUElDX0VTUiwgMCk7CkBAIC04NDksNyArNjk0LDcgQEAKIAkgKi8KIAlEcHJpbnRrKCIjc3RhcnR1cCBsb29wczogJWQuXG4iLCBudW1fc3RhcnRzKTsKIAotCW1heGx2dCA9IGdldF9tYXhsdnQoKTsKKwltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CiAKIAlmb3IgKGogPSAxOyBqIDw9IG51bV9zdGFydHM7IGorKykgewogCQlEcHJpbnRrKCJTZW5kaW5nIFNUQVJUVVAgIyVkLlxuIixqKTsKQEAgLTExMjUsOCArOTcwLDYgQEAKIAlpbmZvLmNwdSA9IGNwdTsKIAlJTklUX1dPUksoJmluZm8udGFzaywgZG9fd2FybV9ib290X2NwdSk7CiAKLQl0c2Nfc3luY19kaXNhYmxlZCA9IDE7Ci0KIAkvKiBpbml0IGxvdyBtZW0gbWFwcGluZyAqLwogCWNsb25lX3BnZF9yYW5nZShzd2FwcGVyX3BnX2Rpciwgc3dhcHBlcl9wZ19kaXIgKyBVU0VSX1BHRF9QVFJTLAogCQkJbWluX3QodW5zaWduZWQgbG9uZywgS0VSTkVMX1BHRF9QVFJTLCBVU0VSX1BHRF9QVFJTKSk7CkBAIC0xMTM0LDcgKzk3Nyw2IEBACiAJc2NoZWR1bGVfd29yaygmaW5mby50YXNrKTsKIAl3YWl0X2Zvcl9jb21wbGV0aW9uKCZkb25lKTsKIAotCXRzY19zeW5jX2Rpc2FibGVkID0gMDsKIAl6YXBfbG93X21hcHBpbmdzKCk7CiAJcmV0ID0gMDsKIGV4aXQ6CkBAIC0xMzMxLDEyICsxMTczLDYgQEAKIAlzbXBib290X3NldHVwX2lvX2FwaWMoKTsKIAogCXNldHVwX2Jvb3RfY2xvY2soKTsKLQotCS8qCi0JICogU3luY2hyb25pemUgdGhlIFRTQyB3aXRoIHRoZSBBUAotCSAqLwotCWlmIChjcHVfaGFzX3RzYyAmJiBjcHVjb3VudCAmJiBjcHVfa2h6KQotCQlzeW5jaHJvbml6ZV90c2NfYnAoKTsKIH0KIAogLyogVGhlc2UgYXJlIHdyYXBwZXJzIHRvIGludGVyZmFjZSB0byB0aGUgbmV3IGJvb3QgcHJvY2Vzcy4gIFNvbWVvbmUKQEAgLTE0NzEsOSArMTMwNywxNiBAQAogCX0KIAogCWxvY2FsX2lycV9lbmFibGUoKTsKKwogCXBlcl9jcHUoY3B1X3N0YXRlLCBjcHUpID0gQ1BVX1VQX1BSRVBBUkU7CiAJLyogVW5sZWFzaCB0aGUgQ1BVISAqLwogCWNwdV9zZXQoY3B1LCBzbXBfY29tbWVuY2VkX21hc2spOworCisJLyoKKwkgKiBDaGVjayBUU0Mgc3luY2hyb25pemF0aW9uIHdpdGggdGhlIEFQOgorCSAqLworCWNoZWNrX3RzY19zeW5jX3NvdXJjZShjcHUpOworCiAJd2hpbGUgKCFjcHVfaXNzZXQoY3B1LCBjcHVfb25saW5lX21hcCkpCiAJCWNwdV9yZWxheCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL2kzODYva2VybmVsL3RpbWUuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCmluZGV4IGE0ZjY3YTYuLmE1MzUwMDUgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCisrKyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZS5jCkBAIC0xNTksMTUgKzE1OSw2IEBACiAgKi8KIGlycXJldHVybl90IHRpbWVyX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7Ci0JLyoKLQkgKiBIZXJlIHdlIGFyZSBpbiB0aGUgdGltZXIgaXJxIGhhbmRsZXIuIFdlIGp1c3QgaGF2ZSBpcnFzIGxvY2FsbHkKLQkgKiBkaXNhYmxlZCBidXQgd2UgZG9uJ3Qga25vdyBpZiB0aGUgdGltZXJfYmggaXMgcnVubmluZyBvbiB0aGUgb3RoZXIKLQkgKiBDUFUuIFdlIG5lZWQgdG8gYXZvaWQgdG8gU01QIHJhY2Ugd2l0aCBpdC4gTk9URTogd2UgZG9uJyB0IG5lZWQKLQkgKiB0aGUgaXJxIHZlcnNpb24gb2Ygd3JpdGVfbG9jayBiZWNhdXNlIGFzIGp1c3Qgc2FpZCB3ZSBoYXZlIGlycQotCSAqIGxvY2FsbHkgZGlzYWJsZWQuIC1hcmNhCi0JICovCi0Jd3JpdGVfc2VxbG9jaygmeHRpbWVfbG9jayk7Ci0KICNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKIAlpZiAodGltZXJfYWNrKSB7CiAJCS8qCkBAIC0xODYsNyArMTc3LDYgQEAKIAogCWRvX3RpbWVyX2ludGVycnVwdF9ob29rKCk7CiAKLQogCWlmIChNQ0FfYnVzKSB7CiAJCS8qIFRoZSBQUy8yIHVzZXMgbGV2ZWwtdHJpZ2dlcmVkIGludGVycnVwdHMuICBZb3UgY2FuJ3QKIAkJdHVybiB0aGVtIG9mZiwgbm9yIHdvdWxkIHlvdSB3YW50IHRvIChhbnkgYXR0ZW1wdCB0bwpAQCAtMjAxLDE4ICsxOTEsMTEgQEAKIAkJb3V0Yl9wKCBpcnFfdnwweDgwLCAweDYxICk7CS8qIHJlc2V0IHRoZSBJUlEgKi8KIAl9CiAKLQl3cml0ZV9zZXF1bmxvY2soJnh0aW1lX2xvY2spOwotCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JaWYgKHVzaW5nX2FwaWNfdGltZXIpCi0JCXNtcF9zZW5kX3RpbWVyX2Jyb2FkY2FzdF9pcGkoKTsKLSNlbmRpZgotCiAJcmV0dXJuIElSUV9IQU5ETEVEOwogfQogCiAvKiBub3Qgc3RhdGljOiBuZWVkZWQgYnkgQVBNICovCi11bnNpZ25lZCBsb25nIGdldF9jbW9zX3RpbWUodm9pZCkKK3Vuc2lnbmVkIGxvbmcgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyByZXR2YWw7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKQEAgLTIyNSw3ICsyMDgsNiBAQAogCiAJcmV0dXJuIHJldHZhbDsKIH0KLUVYUE9SVF9TWU1CT0woZ2V0X2Ntb3NfdGltZSk7CiAKIHN0YXRpYyB2b2lkIHN5bmNfY21vc19jbG9jayh1bnNpZ25lZCBsb25nIGR1bW15KTsKIApAQCAtMjc4LDExNCArMjYwLDE2IEBACiAJCW1vZF90aW1lcigmc3luY19jbW9zX3RpbWVyLCBqaWZmaWVzICsgMSk7CiB9CiAKLXN0YXRpYyBsb25nIGNsb2NrX2Ntb3NfZGlmZjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHNsZWVwX3N0YXJ0OwotCi1zdGF0aWMgaW50IHRpbWVyX3N1c3BlbmQoc3RydWN0IHN5c19kZXZpY2UgKmRldiwgcG1fbWVzc2FnZV90IHN0YXRlKQotewotCS8qCi0JICogRXN0aW1hdGUgdGltZSB6b25lIHNvIHRoYXQgc2V0X3RpbWUgY2FuIHVwZGF0ZSB0aGUgY2xvY2sKLQkgKi8KLQl1bnNpZ25lZCBsb25nIGN0aW1lID0gIGdldF9jbW9zX3RpbWUoKTsKLQotCWNsb2NrX2Ntb3NfZGlmZiA9IC1jdGltZTsKLQljbG9ja19jbW9zX2RpZmYgKz0gZ2V0X3NlY29uZHMoKTsKLQlzbGVlcF9zdGFydCA9IGN0aW1lOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHRpbWVyX3Jlc3VtZShzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2KQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBzZWM7Ci0JdW5zaWduZWQgbG9uZyBjdGltZSA9IGdldF9jbW9zX3RpbWUoKTsKLQlsb25nIHNsZWVwX2xlbmd0aCA9IChjdGltZSAtIHNsZWVwX3N0YXJ0KSAqIEhaOwotCXN0cnVjdCB0aW1lc3BlYyB0czsKLQotCWlmIChzbGVlcF9sZW5ndGggPCAwKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgIkNNT1MgY2xvY2sgc2tldyBkZXRlY3RlZCBpbiB0aW1lciByZXN1bWUhXG4iKTsKLQkJLyogVGhlIHRpbWUgYWZ0ZXIgdGhlIHJlc3VtZSBtdXN0IG5vdCBiZSBlYXJsaWVyIHRoYW4gdGhlIHRpbWUKLQkJICogYmVmb3JlIHRoZSBzdXNwZW5kIG9yIHNvbWUgbmFzdHkgdGhpbmdzIHdpbGwgaGFwcGVuCi0JCSAqLwotCQlzbGVlcF9sZW5ndGggPSAwOwotCQljdGltZSA9IHNsZWVwX3N0YXJ0OwotCX0KLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgotCWlmIChpc19ocGV0X2VuYWJsZWQoKSkKLQkJaHBldF9yZWVuYWJsZSgpOwotI2VuZGlmCi0Jc2V0dXBfcGl0X3RpbWVyKCk7Ci0KLQlzZWMgPSBjdGltZSArIGNsb2NrX2Ntb3NfZGlmZjsKLQl0cy50dl9zZWMgPSBzZWM7Ci0JdHMudHZfbnNlYyA9IDA7Ci0JZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0Jd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0JamlmZmllc182NCArPSBzbGVlcF9sZW5ndGg7Ci0Jd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKLQl0b3VjaF9zb2Z0bG9ja3VwX3dhdGNoZG9nKCk7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBzdHJ1Y3Qgc3lzZGV2X2NsYXNzIHRpbWVyX3N5c2NsYXNzID0gewotCS5yZXN1bWUgPSB0aW1lcl9yZXN1bWUsCi0JLnN1c3BlbmQgPSB0aW1lcl9zdXNwZW5kLAotCXNldF9rc2V0X25hbWUoInRpbWVyIiksCi19OwotCi0KLS8qIFhYWCB0aGlzIGRyaXZlcmZzIHN0dWZmIHNob3VsZCBwcm9iYWJseSBnbyBlbHNld2hlcmUgbGF0ZXIgLWpvaG4gKi8KLXN0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBkZXZpY2VfdGltZXIgPSB7Ci0JLmlkCT0gMCwKLQkuY2xzCT0gJnRpbWVyX3N5c2NsYXNzLAotfTsKLQotc3RhdGljIGludCB0aW1lX2luaXRfZGV2aWNlKHZvaWQpCi17Ci0JaW50IGVycm9yID0gc3lzZGV2X2NsYXNzX3JlZ2lzdGVyKCZ0aW1lcl9zeXNjbGFzcyk7Ci0JaWYgKCFlcnJvcikKLQkJZXJyb3IgPSBzeXNkZXZfcmVnaXN0ZXIoJmRldmljZV90aW1lcik7Ci0JcmV0dXJuIGVycm9yOwotfQotCi1kZXZpY2VfaW5pdGNhbGwodGltZV9pbml0X2RldmljZSk7Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9USU1FUgogZXh0ZXJuIHZvaWQgKCpsYXRlX3RpbWVfaW5pdCkodm9pZCk7CiAvKiBEdXBsaWNhdGUgb2YgdGltZV9pbml0KCkgYmVsb3csIHdpdGggaHBldF9lbmFibGUgcGFydCBhZGRlZCAqLwogc3RhdGljIHZvaWQgX19pbml0IGhwZXRfdGltZV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzOwotCXRzLnR2X3NlYyA9IGdldF9jbW9zX3RpbWUoKTsKLQl0cy50dl9uc2VjID0gKElOSVRJQUxfSklGRklFUyAlIEhaKSAqIChOU0VDX1BFUl9TRUMgLyBIWik7Ci0KLQlkb19zZXR0aW1lb2ZkYXkoJnRzKTsKLQotCWlmICgoaHBldF9lbmFibGUoKSA+PSAwKSAmJiBocGV0X3VzZV90aW1lcikgewotCQlwcmludGsoIlVzaW5nIEhQRVQgZm9yIGJhc2UtdGltZXJcbiIpOwotCX0KLQorCWlmICghaHBldF9lbmFibGUoKSkKKwkJc2V0dXBfcGl0X3RpbWVyKCk7CiAJZG9fdGltZV9pbml0KCk7CiB9Ci0jZW5kaWYKIAogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7Ci0Jc3RydWN0IHRpbWVzcGVjIHRzOwotI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCi0JaWYgKGlzX2hwZXRfY2FwYWJsZSgpKSB7Ci0JCS8qCi0JCSAqIEhQRVQgaW5pdGlhbGl6YXRpb24gbmVlZHMgdG8gZG8gbWVtb3J5LW1hcHBlZCBpby4gU28sIGxldAotCQkgKiB1cyBkbyBhIGxhdGUgaW5pdGlhbGl6YXRpb24gYWZ0ZXIgbWVtX2luaXQoKS4KLQkJICovCi0JCWxhdGVfdGltZV9pbml0ID0gaHBldF90aW1lX2luaXQ7Ci0JCXJldHVybjsKLQl9Ci0jZW5kaWYKLQl0cy50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7Ci0JdHMudHZfbnNlYyA9IChJTklUSUFMX0pJRkZJRVMgJSBIWikgKiAoTlNFQ19QRVJfU0VDIC8gSFopOwotCi0JZG9fc2V0dGltZW9mZGF5KCZ0cyk7Ci0KLQlkb190aW1lX2luaXQoKTsKKwlsYXRlX3RpbWVfaW5pdCA9IGhwZXRfdGltZV9pbml0OwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYyBiL2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNDcwMmQuLjAwMDAwMDAKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC90aW1lX2hwZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDQ5NyArMCwwIEBACi0vKgotICogIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvdGltZV9ocGV0LmMKLSAqICBUaGlzIGNvZGUgbGFyZ2VseSBjb3BpZWQgZnJvbSBhcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCi0gKiAgU2VlIHRoYXQgZmlsZSBmb3IgY3JlZGl0cy4KLSAqCi0gKiAgMjAwMy0wNi0zMCAgICBWZW5rYXRlc2ggUGFsbGlwYWRpIC0gQWRkaXRpb25hbCBjaGFuZ2VzIGZvciBIUEVUIHN1cHBvcnQKLSAqLwotCi0jaW5jbHVkZSA8bGludXgvZXJybm8uaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wYXJhbS5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLQotI2luY2x1ZGUgPGFzbS90aW1lci5oPgotI2luY2x1ZGUgPGFzbS9maXhtYXAuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotCi0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLQotI2luY2x1ZGUgPGFzbS9ocGV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaHBldC5oPgotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsJLyogZnNlY3MgLyBIUEVUIGNsb2NrICovCi11bnNpZ25lZCBsb25nIGhwZXRfdGljazsJCS8qIGhwZXQgY2xrcyBjb3VudCBwZXIgdGljayAqLwotdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CQkvKiBocGV0IG1lbW9yeSBtYXAgcGh5c2ljYWwgYWRkcmVzcyAqLwotaW50IGhwZXRfdXNlX3RpbWVyOwotCi1zdGF0aWMgaW50IHVzZV9ocGV0OyAJCS8qIGNhbiBiZSB1c2VkIGZvciBydW50aW1lIGNoZWNrIG9mIGhwZXQgKi8KLXN0YXRpYyBpbnQgYm9vdF9ocGV0X2Rpc2FibGU7IAkvKiBib290dGltZSBvdmVycmlkZSBmb3IgSFBFVCB0aW1lciAqLwotc3RhdGljIHZvaWQgX19pb21lbSAqIGhwZXRfdmlydF9hZGRyZXNzOwkvKiBocGV0IGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3MgKi8KLQotI2RlZmluZSBGU0VDX1RPX1VTRUMgKDEwMDAwMDAwMDBVTCkKLQotaW50IGhwZXRfcmVhZGwodW5zaWduZWQgbG9uZyBhKQotewotCXJldHVybiByZWFkbChocGV0X3ZpcnRfYWRkcmVzcyArIGEpOwotfQotCi1zdGF0aWMgdm9pZCBocGV0X3dyaXRlbCh1bnNpZ25lZCBsb25nIGQsIHVuc2lnbmVkIGxvbmcgYSkKLXsKLQl3cml0ZWwoZCwgaHBldF92aXJ0X2FkZHJlc3MgKyBhKTsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotLyoKLSAqIEhQRVQgY291bnRlcnMgZG9udCB3cmFwIGFyb3VuZCBvbiBldmVyeSB0aWNrLiBUaGV5IGp1c3QgY2hhbmdlIHRoZQotICogY29tcGFyYXRvciB2YWx1ZSBhbmQgY29udGludWUuIE5leHQgdGljayBjYW4gYmUgY2F1Z2h0IGJ5IGNoZWNraW5nCi0gKiBmb3IgYSBjaGFuZ2UgaW4gdGhlIGNvbXBhcmF0b3IgdmFsdWUuIFVzZWQgaW4gYXBpYy5jLgotICovCi1zdGF0aWMgdm9pZCBfX2RldmluaXQgd2FpdF9ocGV0X3RpY2sodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgc3RhcnRfY21wX3ZhbCwgZW5kX2NtcF92YWw7Ci0KLQlzdGFydF9jbXBfdmFsID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCk7Ci0JZG8gewotCQllbmRfY21wX3ZhbCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApOwotCX0gd2hpbGUgKHN0YXJ0X2NtcF92YWwgPT0gZW5kX2NtcF92YWwpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaHBldF90aW1lcl9zdG9wX3NldF9nbyh1bnNpZ25lZCBsb25nIHRpY2spCi17Ci0JdW5zaWduZWQgaW50IGNmZzsKLQotCS8qCi0JICogU3RvcCB0aGUgdGltZXJzIGFuZCByZXNldCB0aGUgbWFpbiBjb3VudGVyLgotCSAqLwotCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9DRkcpOwotCWNmZyAmPSB+SFBFVF9DRkdfRU5BQkxFOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOwotCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUik7Ci0JaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSICsgNCk7Ci0KLQlpZiAoaHBldF91c2VfdGltZXIpIHsKLQkJLyoKLQkJICogU2V0IHVwIHRpbWVyIDAsIGFzIHBlcmlvZGljIHdpdGggZmlyc3QgaW50ZXJydXB0IHRvIGhhcHBlbiBhdAotCQkgKiBocGV0X3RpY2ssIGFuZCBwZXJpb2QgYWxzbyBocGV0X3RpY2suCi0JCSAqLwotCQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ0ZHKTsKLQkJY2ZnIHw9IEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9QRVJJT0RJQyB8Ci0JCSAgICAgICBIUEVUX1ROX1NFVFZBTCB8IEhQRVRfVE5fMzJCSVQ7Ci0JCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMF9DRkcpOwotCi0JCS8qCi0JCSAqIFRoZSBmaXJzdCB3cml0ZSBhZnRlciB3cml0aW5nIFROX1NFVFZBTCB0byB0aGUgY29uZmlnIHJlZ2lzdGVyIHNldHMKLQkJICogdGhlIGNvdW50ZXIgdmFsdWUsIHRoZSBzZWNvbmQgd3JpdGUgc2V0cyB0aGUgdGhyZXNob2xkLgotCQkgKi8KLQkJaHBldF93cml0ZWwodGljaywgSFBFVF9UMF9DTVApOwotCQlocGV0X3dyaXRlbCh0aWNrLCBIUEVUX1QwX0NNUCk7Ci0JfQotCS8qCi0gCSAqIEdvIQotIAkgKi8KLQljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKLQlpZiAoaHBldF91c2VfdGltZXIpCi0JCWNmZyB8PSBIUEVUX0NGR19MRUdBQ1k7Ci0JY2ZnIHw9IEhQRVRfQ0ZHX0VOQUJMRTsKLQlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKLQotCXJldHVybiAwOwotfQotCi0vKgotICogQ2hlY2sgd2hldGhlciBIUEVUIHdhcyBmb3VuZCBieSBBQ1BJIGJvb3QgcGFyc2UuIElmIHllcyBzZXR1cCBIUEVUCi0gKiBjb3VudGVyIDAgZm9yIGtlcm5lbCBiYXNlIHRpbWVyLgotICovCi1pbnQgX19pbml0IGhwZXRfZW5hYmxlKHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IGlkOwotCXVuc2lnbmVkIGxvbmcgdGlja19mc2VjX2xvdywgdGlja19mc2VjX2hpZ2g7IC8qIHRpY2sgaW4gZmVtdG8gc2VjICovCi0JdW5zaWduZWQgbG9uZyBocGV0X3RpY2tfcmVtOwotCi0JaWYgKGJvb3RfaHBldF9kaXNhYmxlKQotCQlyZXR1cm4gLTE7Ci0KLQlpZiAoIWhwZXRfYWRkcmVzcykgewotCQlyZXR1cm4gLTE7Ci0JfQotCWhwZXRfdmlydF9hZGRyZXNzID0gaW9yZW1hcF9ub2NhY2hlKGhwZXRfYWRkcmVzcywgSFBFVF9NTUFQX1NJWkUpOwotCS8qCi0JICogUmVhZCB0aGUgcGVyaW9kLCBjb21wdXRlIHRpY2sgYW5kIHF1b3RpZW50LgotCSAqLwotCWlkID0gaHBldF9yZWFkbChIUEVUX0lEKTsKLQotCS8qCi0JICogV2UgYXJlIGNoZWNraW5nIGZvciB2YWx1ZSAnMScgb3IgbW9yZSBpbiBudW1iZXIgZmllbGQgaWYKLQkgKiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQyBpcyBzZXQgYmVjYXVzZSB3ZSB3aWxsIG5lZWQgYW4KLQkgKiBhZGRpdGlvbmFsIHRpbWVyIGZvciBSVEMgZW11bGF0aW9uLgotCSAqIEhvd2V2ZXIsIHdlIGNhbiBkbyB3aXRoIG9uZSB0aW1lciBvdGhlcndpc2UgdXNpbmcgdGhlCi0JICogdGhlIHNpbmdsZSBIUEVUIHRpbWVyIGZvciBzeXN0ZW0gdGltZS4KLQkgKi8KLSNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotCWlmICghKGlkICYgSFBFVF9JRF9OVU1CRVIpKSB7Ci0JCWlvdW5tYXAoaHBldF92aXJ0X2FkZHJlc3MpOwotCQlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7Ci0JCXJldHVybiAtMTsKLQl9Ci0jZW5kaWYKLQotCi0JaHBldF9wZXJpb2QgPSBocGV0X3JlYWRsKEhQRVRfUEVSSU9EKTsKLQlpZiAoKGhwZXRfcGVyaW9kIDwgSFBFVF9NSU5fUEVSSU9EKSB8fCAoaHBldF9wZXJpb2QgPiBIUEVUX01BWF9QRVJJT0QpKSB7Ci0JCWlvdW5tYXAoaHBldF92aXJ0X2FkZHJlc3MpOwotCQlocGV0X3ZpcnRfYWRkcmVzcyA9IE5VTEw7Ci0JCXJldHVybiAtMTsKLQl9Ci0KLQkvKgotCSAqIDY0IGJpdCBtYXRoCi0JICogRmlyc3QgY2hhbmdpbmcgdGljayBpbnRvIGZzZWMKLQkgKiBUaGVuIDY0IGJpdCBkaXYgdG8gZmluZCBudW1iZXIgb2YgaHBldCBjbGsgcGVyIHRpY2sKLQkgKi8KLQlBU01fTVVMNjRfUkVHKHRpY2tfZnNlY19sb3csIHRpY2tfZnNlY19oaWdoLAotCQkJS0VSTkVMX1RJQ0tfVVNFQywgRlNFQ19UT19VU0VDKTsKLQlBU01fRElWNjRfUkVHKGhwZXRfdGljaywgaHBldF90aWNrX3JlbSwKLQkJCWhwZXRfcGVyaW9kLCB0aWNrX2ZzZWNfbG93LCB0aWNrX2ZzZWNfaGlnaCk7Ci0KLQlpZiAoaHBldF90aWNrX3JlbSA+IChocGV0X3BlcmlvZCA+PiAxKSkKLQkJaHBldF90aWNrKys7IC8qIHJvdW5kaW5nIHRoZSByZXN1bHQgKi8KLQotCWhwZXRfdXNlX3RpbWVyID0gaWQgJiBIUEVUX0lEX0xFR1NVUDsKLQotCWlmIChocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljaykpIHsKLQkJaW91bm1hcChocGV0X3ZpcnRfYWRkcmVzcyk7Ci0JCWhwZXRfdmlydF9hZGRyZXNzID0gTlVMTDsKLQkJcmV0dXJuIC0xOwotCX0KLQotCXVzZV9ocGV0ID0gMTsKLQotI2lmZGVmCUNPTkZJR19IUEVUCi0JewotCQlzdHJ1Y3QgaHBldF9kYXRhCWhkOwotCQl1bnNpZ25lZCBpbnQgCQludGltZXI7Ci0KLQkJbWVtc2V0KCZoZCwgMCwgc2l6ZW9mIChoZCkpOwotCi0JCW50aW1lciA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7Ci0JCW50aW1lciA9IChudGltZXIgJiBIUEVUX0lEX05VTUJFUikgPj4gSFBFVF9JRF9OVU1CRVJfU0hJRlQ7Ci0JCW50aW1lcisrOwotCi0JCS8qCi0JCSAqIFJlZ2lzdGVyIHdpdGggZHJpdmVyLgotCQkgKiBUaW1lcjAgYW5kIFRpbWVyMSBpcyB1c2VkIGJ5IHBsYXRmb3JtLgotCQkgKi8KLQkJaGQuaGRfcGh5c19hZGRyZXNzID0gaHBldF9hZGRyZXNzOwotCQloZC5oZF9hZGRyZXNzID0gaHBldF92aXJ0X2FkZHJlc3M7Ci0JCWhkLmhkX25pcnFzID0gbnRpbWVyOwotCQloZC5oZF9mbGFncyA9IEhQRVRfREFUQV9QTEFURk9STTsKLQkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMCk7Ci0jaWZkZWYJQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKLQkJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7Ci0jZW5kaWYKLQkJaGQuaGRfaXJxWzBdID0gSFBFVF9MRUdBQ1lfODI1NDsKLQkJaGQuaGRfaXJxWzFdID0gSFBFVF9MRUdBQ1lfUlRDOwotCQlpZiAobnRpbWVyID4gMikgewotCQkJc3RydWN0IGhwZXQgX19pb21lbQkqaHBldDsKLQkJCXN0cnVjdCBocGV0X3RpbWVyIF9faW9tZW0gKnRpbWVyOwotCQkJaW50CQkJaTsKLQotCQkJaHBldCA9IGhwZXRfdmlydF9hZGRyZXNzOwotCi0JCQlmb3IgKGkgPSAyLCB0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsgaSA8IG50aW1lcjsKLQkJCQl0aW1lcisrLCBpKyspCi0JCQkJaGQuaGRfaXJxW2ldID0gKHRpbWVyLT5ocGV0X2NvbmZpZyAmCi0JCQkJCVRuX0lOVF9ST1VURV9DTkZfTUFTSykgPj4KLQkJCQkJVG5fSU5UX1JPVVRFX0NORl9TSElGVDsKLQotCQl9Ci0KLQkJaHBldF9hbGxvYygmaGQpOwotCX0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCi0JaWYgKGhwZXRfdXNlX3RpbWVyKQotCQl3YWl0X3RpbWVyX3RpY2sgPSB3YWl0X2hwZXRfdGljazsKLSNlbmRpZgotCXJldHVybiAwOwotfQotCi1pbnQgaHBldF9yZWVuYWJsZSh2b2lkKQotewotCXJldHVybiBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljayk7Ci19Ci0KLWludCBpc19ocGV0X2VuYWJsZWQodm9pZCkKLXsKLQlyZXR1cm4gdXNlX2hwZXQ7Ci19Ci0KLWludCBpc19ocGV0X2NhcGFibGUodm9pZCkKLXsKLQlpZiAoIWJvb3RfaHBldF9kaXNhYmxlICYmIGhwZXRfYWRkcmVzcykKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhwZXRfc2V0dXAoY2hhciogc3RyKQotewotCWlmIChzdHIpIHsKLQkJaWYgKCFzdHJuY21wKCJkaXNhYmxlIiwgc3RyLCA3KSkKLQkJCWJvb3RfaHBldF9kaXNhYmxlID0gMTsKLQl9Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImhwZXQ9IiwgaHBldF9zZXR1cCk7Ci0KLSNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQwotLyogSFBFVCBpbiBMZWdhY3lSZXBsYWNlbWVudCBNb2RlIGVhdHMgdXAgUlRDIGludGVycnVwdCBsaW5lLiBXaGVuLCBIUEVUCi0gKiBpcyBlbmFibGVkLCB3ZSBzdXBwb3J0IFJUQyBpbnRlcnJ1cHQgZnVuY3Rpb25hbGl0eSBpbiBzb2Z0d2FyZS4KLSAqIFJUQyBoYXMgMyBraW5kcyBvZiBpbnRlcnJ1cHRzOgotICogMSkgVXBkYXRlIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCwgZXZlcnkgc2VjLCB3aGVuIFJUQyBjbG9jawotICogICAgaXMgdXBkYXRlZAotICogMikgQWxhcm0gSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGF0IGEgc3BlY2lmaWMgdGltZSBvZiBkYXkKLSAqIDMpIFBlcmlvZGljIEludGVycnVwdCAtIGdlbmVyYXRlIHBlcmlvZGljIGludGVycnVwdCwgd2l0aCBmcmVxdWVuY2llcwotICogICAgMkh6LTgxOTJIeiAoMkh6LTY0SHogZm9yIG5vbi1yb290IHVzZXIpIChhbGwgZnJlcXMgaW4gcG93ZXJzIG9mIDIpCi0gKiAoMSkgYW5kICgyKSBhYm92ZSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgcG9sbGluZyBhdCBhIGZyZXF1ZW5jeSBvZgotICogNjQgSHouIFRoZSBleGFjdCBmcmVxdWVuY3kgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIGFjY3VyYWN5IGFuZCBpbnRlcnJ1cHQKLSAqIG92ZXJoZWFkLiAoREVGQVVMVF9SVENfSU5UX0ZSRVEpCi0gKiBGb3IgKDMpLCB3ZSB1c2UgaW50ZXJydXB0cyBhdCA2NEh6IG9yIHVzZXIgc3BlY2lmaWVkIHBlcmlvZGljCi0gKiBmcmVxdWVuY3ksIHdoaWNoZXZlciBpcyBoaWdoZXIuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgotI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgotCi0jZGVmaW5lIERFRkFVTFRfUlRDX0lOVF9GUkVRIAk2NAotI2RlZmluZSBSVENfTlVNX0lOVFMgCQkxCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIFVJRV9vbjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHByZXZfdXBkYXRlX3NlYzsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgQUlFX29uOwotc3RhdGljIHN0cnVjdCBydGNfdGltZSBhbGFybV90aW1lOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfb247Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX2NvdW50OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3J0Y19pbnRfZnJlcTsgLyogUlRDIGludGVycnVwdCBmcmVxdWVuY3kgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaHBldF90MV9jbXA7IC8qIGNhY2hlZCBjb21wYXJhdG9yIHJlZ2lzdGVyICovCi0KLS8qCi0gKiBUaW1lciAxIGZvciBSVEMsIHdlIGRvIG5vdCB1c2UgcGVyaW9kaWMgaW50ZXJydXB0IGZlYXR1cmUsCi0gKiBldmVuIGlmIEhQRVQgc3VwcG9ydHMgcGVyaW9kaWMgaW50ZXJydXB0cyBvbiBUaW1lciAxLgotICogVGhlIHJlYXNvbiBiZWluZywgdG8gc2V0IHVwIGEgcGVyaW9kaWMgaW50ZXJydXB0IGluIEhQRVQsIHdlIG5lZWQgdG8KLSAqIHN0b3AgdGhlIG1haW4gY291bnRlci4gQW5kIGlmIHdlIGRvIHRoYXQgZXZlcnl0aW1lIHNvbWVvbmUgZGlhYmxlcy9lbmFibGVzCi0gKiBSVEMsIHdlIHdpbGwgaGF2ZSBhZHZlcnNlIGVmZmVjdCBvbiBtYWluIGtlcm5lbCB0aW1lciBydW5uaW5nIG9uIFRpbWVyIDAuCi0gKiBTbywgZm9yIHRoZSB0aW1lIGJlaW5nLCBzaW11bGF0ZSB0aGUgcGVyaW9kaWMgaW50ZXJydXB0IGluIHNvZnR3YXJlLgotICoKLSAqIGhwZXRfcnRjX3RpbWVyX2luaXQoKSBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lIGFuZCBkdXJpbmcgc3Vic2VxdWVudAotICogaW50ZXJ1cHB0cyByZWluaXQgaGFwcGVucyB0aHJvdWdoIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpLgotICovCi1pbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjZmcsIGNudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0JLyoKLQkgKiBTZXQgdGhlIGNvdW50ZXIgMSBhbmQgZW5hYmxlIHRoZSBpbnRlcnJ1cHRzLgotCSAqLwotCWlmIChQSUVfb24gJiYgKFBJRV9mcmVxID4gREVGQVVMVF9SVENfSU5UX0ZSRVEpKQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IFBJRV9mcmVxOwotCWVsc2UKLQkJaHBldF9ydGNfaW50X2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQljbnQgKz0gKChocGV0X3RpY2sqSFopL2hwZXRfcnRjX2ludF9mcmVxKTsKLQlocGV0X3dyaXRlbChjbnQsIEhQRVRfVDFfQ01QKTsKLQlocGV0X3QxX2NtcCA9IGNudDsKLQotCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOwotCWNmZyAmPSB+SFBFVF9UTl9QRVJJT0RJQzsKLQljZmcgfD0gSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROXzMyQklUOwotCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCi0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLXN0YXRpYyB2b2lkIGhwZXRfcnRjX3RpbWVyX3JlaW5pdCh2b2lkKQotewotCXVuc2lnbmVkIGludCBjZmcsIGNudCwgdGlja3NfcGVyX2ludCwgbG9zdF9pbnRzOwotCi0JaWYgKHVubGlrZWx5KCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkpIHsKLQkJY2ZnID0gaHBldF9yZWFkbChIUEVUX1QxX0NGRyk7Ci0JCWNmZyAmPSB+SFBFVF9UTl9FTkFCTEU7Ci0JCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9UMV9DRkcpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKFBJRV9vbiAmJiAoUElFX2ZyZXEgPiBERUZBVUxUX1JUQ19JTlRfRlJFUSkpCi0JCWhwZXRfcnRjX2ludF9mcmVxID0gUElFX2ZyZXE7Ci0JZWxzZQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotCi0JLyogSXQgaXMgbW9yZSBhY2N1cmF0ZSB0byB1c2UgdGhlIGNvbXBhcmF0b3IgdmFsdWUgdGhhbiBjdXJyZW50IGNvdW50LiovCi0JdGlja3NfcGVyX2ludCA9IGhwZXRfdGljayAqIEhaIC8gaHBldF9ydGNfaW50X2ZyZXE7Ci0JaHBldF90MV9jbXAgKz0gdGlja3NfcGVyX2ludDsKLQlocGV0X3dyaXRlbChocGV0X3QxX2NtcCwgSFBFVF9UMV9DTVApOwotCi0JLyoKLQkgKiBJZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIgd2FzIGRlbGF5ZWQgdG9vIGxvbmcsIHRoZSB3cml0ZSBhYm92ZSB0cmllcwotCSAqIHRvIHNjaGVkdWxlIHRoZSBuZXh0IGludGVycnVwdCBpbiB0aGUgcGFzdCBhbmQgdGhlIGhhcmR3YXJlIHdvdWxkCi0JICogbm90IGludGVycnVwdCB1bnRpbCB0aGUgY291bnRlciBoYWQgd3JhcHBlZCBhcm91bmQuCi0JICogU28gd2UgaGF2ZSB0byBjaGVjayB0aGF0IHRoZSBjb21wYXJhdG9yIHdhc24ndCBzZXQgdG8gYSBwYXN0IHRpbWUuCi0JICovCi0JY250ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCWlmICh1bmxpa2VseSgoaW50KShjbnQgLSBocGV0X3QxX2NtcCkgPiAwKSkgewotCQlsb3N0X2ludHMgPSAoY250IC0gaHBldF90MV9jbXApIC8gdGlja3NfcGVyX2ludCArIDE7Ci0JCS8qIE1ha2Ugc3VyZSB0aGF0LCBldmVuIHdpdGggdGhlIHRpbWUgbmVlZGVkIHRvIGV4ZWN1dGUKLQkJICogdGhpcyBjb2RlLCB0aGUgbmV4dCBzY2hlZHVsZWQgaW50ZXJydXB0IGhhcyBiZWVuIG1vdmVkCi0JCSAqIGJhY2sgdG8gdGhlIGZ1dHVyZTogKi8KLQkJbG9zdF9pbnRzKys7Ci0KLQkJaHBldF90MV9jbXAgKz0gbG9zdF9pbnRzICogdGlja3NfcGVyX2ludDsKLQkJaHBldF93cml0ZWwoaHBldF90MV9jbXAsIEhQRVRfVDFfQ01QKTsKLQotCQlpZiAoUElFX29uKQotCQkJUElFX2NvdW50ICs9IGxvc3RfaW50czsKLQotCQlwcmludGsoS0VSTl9XQVJOSU5HICJydGM6IGxvc3Qgc29tZSBpbnRlcnJ1cHRzIGF0ICVsZEh6LlxuIiwKLQkJICAgICAgIGhwZXRfcnRjX2ludF9mcmVxKTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgZnJvbSBydGMgZHJpdmVyLgotICogUmV0dXJuIDAgaWYgSFBFVCBpcyBub3QgYmVpbmcgdXNlZC4KLSAqIE90aGVyd2lzZSBkbyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgYW5kIHJldHVybiAxLgotICovCi1pbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYml0X21hc2sgJiBSVENfVUlFKQotCQlVSUVfb24gPSAwOwotCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpCi0JCVBJRV9vbiA9IDA7Ci0JaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkKLQkJQUlFX29uID0gMDsKLQotCXJldHVybiAxOwotfQotCi1pbnQgaHBldF9zZXRfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzaykKLXsKLQlpbnQgdGltZXJfaW5pdF9yZXFkID0gMDsKLQotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkKLQkJdGltZXJfaW5pdF9yZXFkID0gMTsKLQotCWlmIChiaXRfbWFzayAmIFJUQ19VSUUpIHsKLQkJVUlFX29uID0gMTsKLQl9Ci0JaWYgKGJpdF9tYXNrICYgUlRDX1BJRSkgewotCQlQSUVfb24gPSAxOwotCQlQSUVfY291bnQgPSAwOwotCX0KLQlpZiAoYml0X21hc2sgJiBSVENfQUlFKSB7Ci0JCUFJRV9vbiA9IDE7Ci0JfQotCi0JaWYgKHRpbWVyX2luaXRfcmVxZCkKLQkJaHBldF9ydGNfdGltZXJfaW5pdCgpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwgdW5zaWduZWQgY2hhciBzZWMpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlhbGFybV90aW1lLnRtX2hvdXIgPSBocnM7Ci0JYWxhcm1fdGltZS50bV9taW4gPSBtaW47Ci0JYWxhcm1fdGltZS50bV9zZWMgPSBzZWM7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfc2V0X3BlcmlvZGljX2ZyZXEodW5zaWduZWQgbG9uZyBmcmVxKQotewotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JUElFX2ZyZXEgPSBmcmVxOwotCVBJRV9jb3VudCA9IDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfcnRjX2Ryb3BwZWRfaXJxKHZvaWQpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCkKLXsKLQlzdHJ1Y3QgcnRjX3RpbWUgY3Vycl90aW1lOwotCXVuc2lnbmVkIGxvbmcgcnRjX2ludF9mbGFnID0gMDsKLQlpbnQgY2FsbF9ydGNfaW50ZXJydXB0ID0gMDsKLQotCWhwZXRfcnRjX3RpbWVyX3JlaW5pdCgpOwotCi0JaWYgKFVJRV9vbiB8IEFJRV9vbikgewotCQlydGNfZ2V0X3J0Y190aW1lKCZjdXJyX3RpbWUpOwotCX0KLQlpZiAoVUlFX29uKSB7Ci0JCWlmIChjdXJyX3RpbWUudG1fc2VjICE9IHByZXZfdXBkYXRlX3NlYykgewotCQkJLyogU2V0IHVwZGF0ZSBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLwotCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKLQkJCXJ0Y19pbnRfZmxhZyA9IFJUQ19VRjsKLQkJCXByZXZfdXBkYXRlX3NlYyA9IGN1cnJfdGltZS50bV9zZWM7Ci0JCX0KLQl9Ci0JaWYgKFBJRV9vbikgewotCQlQSUVfY291bnQrKzsKLQkJaWYgKFBJRV9jb3VudCA+PSBocGV0X3J0Y19pbnRfZnJlcS9QSUVfZnJlcSkgewotCQkJLyogU2V0IHBlcmlvZGljIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCi0JCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOwotCQkJcnRjX2ludF9mbGFnIHw9IFJUQ19QRjsKLQkJCVBJRV9jb3VudCA9IDA7Ci0JCX0KLQl9Ci0JaWYgKEFJRV9vbikgewotCQlpZiAoKGN1cnJfdGltZS50bV9zZWMgPT0gYWxhcm1fdGltZS50bV9zZWMpICYmCi0JCSAgICAoY3Vycl90aW1lLnRtX21pbiA9PSBhbGFybV90aW1lLnRtX21pbikgJiYKLQkJICAgIChjdXJyX3RpbWUudG1faG91ciA9PSBhbGFybV90aW1lLnRtX2hvdXIpKSB7Ci0JCQkvKiBTZXQgYWxhcm0gaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KLQkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7Ci0JCQlydGNfaW50X2ZsYWcgfD0gUlRDX0FGOwotCQl9Ci0JfQotCWlmIChjYWxsX3J0Y19pbnRlcnJ1cHQpIHsKLQkJcnRjX2ludF9mbGFnIHw9IChSVENfSVJRRiB8IChSVENfTlVNX0lOVFMgPDwgOCkpOwotCQlydGNfaW50ZXJydXB0KHJ0Y19pbnRfZmxhZywgZGV2X2lkKTsKLQl9Ci0JcmV0dXJuIElSUV9IQU5ETEVEOwotfQotI2VuZGlmCi0KZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMgYi9hcmNoL2kzODYva2VybmVsL3RzYy5jCmluZGV4IDQ2Zjc1MmEuLjMwODJhNDEgMTAwNjQ0Ci0tLSBhL2FyY2gvaTM4Ni9rZXJuZWwvdHNjLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC90c2MuYwpAQCAtNjAsMTIgKzYwLDYgQEAKIAlyZXR1cm4gdHNjX3Vuc3RhYmxlOwogfQogCi12b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKHZvaWQpCi17Ci0JdHNjX3Vuc3RhYmxlID0gMTsKLX0KLUVYUE9SVF9TWU1CT0xfR1BMKG1hcmtfdHNjX3Vuc3RhYmxlKTsKLQogLyogQWNjZWxsZXJhdG9ycyBmb3Igc2NoZWRfY2xvY2soKQogICogY29udmVydCBmcm9tIGN5Y2xlcyg2NGJpdHMpID0+IG5hbm9zZWNvbmRzICg2NGJpdHMpCiAgKiAgYmFzaWMgZXF1YXRpb246CkBAIC0yMjIsMzQgKzIxNiw2IEBACiAKICNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKIAotc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfaW5pdCA9IDA7Ci1zdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGNwdWZyZXFfZGVsYXllZF9nZXRfd29yazsKLQotc3RhdGljIHZvaWQgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0KLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKLQkJY3B1ZnJlcV9nZXQoY3B1KTsKLQotCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKLX0KLQotLyoKLSAqIGlmIHdlIG5vdGljZSBjcHVmcmVxIG9kZG5lc3MsIHNjaGVkdWxlIGEgY2FsbCB0byBjcHVmcmVxX2dldCgpIGFzIGl0IHRyaWVzCi0gKiB0byB2ZXJpZnkgdGhlIENQVSBmcmVxdWVuY3kgdGhlIHRpbWluZyBjb3JlIHRoaW5rcyB0aGUgQ1BVIGlzIHJ1bm5pbmcKLSAqIGF0IGlzIHN0aWxsIGNvcnJlY3QuCi0gKi8KLXN0YXRpYyBpbmxpbmUgdm9pZCBjcHVmcmVxX2RlbGF5ZWRfZ2V0KHZvaWQpCi17Ci0JaWYgKGNwdWZyZXFfaW5pdCAmJiAhY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQpIHsKLQkJY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAxOwotCQlwcmludGsoS0VSTl9ERUJVRyAiQ2hlY2tpbmcgaWYgQ1BVIGZyZXF1ZW5jeSBjaGFuZ2VkLlxuIik7Ci0JCXNjaGVkdWxlX3dvcmsoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yayk7Ci0JfQotfQotCiAvKgogICogaWYgdGhlIENQVSBmcmVxdWVuY3kgaXMgc2NhbGVkLCBUU0MtYmFzZWQgZGVsYXlzIHdpbGwgbmVlZCBhIGRpZmZlcmVudAogICogbG9vcHNfcGVyX2ppZmZ5IHZhbHVlIHRvIGZ1bmN0aW9uIHByb3Blcmx5LgpAQCAtMzEzLDE3ICsyNzksOSBAQAogCiBzdGF0aWMgaW50IF9faW5pdCBjcHVmcmVxX3RzYyh2b2lkKQogewotCWludCByZXQ7Ci0KLQlJTklUX1dPUksoJmNwdWZyZXFfZGVsYXllZF9nZXRfd29yaywgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQpOwotCXJldCA9IGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKLQkJCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKLQlpZiAoIXJldCkKLQkJY3B1ZnJlcV9pbml0ID0gMTsKLQotCXJldHVybiByZXQ7CisJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKKwkJCQkJIENQVUZSRVFfVFJBTlNJVElPTl9OT1RJRklFUik7CiB9Ci0KIGNvcmVfaW5pdGNhbGwoY3B1ZnJlcV90c2MpOwogCiAjZW5kaWYKQEAgLTMzMSw3ICsyODksNiBAQAogLyogY2xvY2sgc291cmNlIGNvZGUgKi8KIAogc3RhdGljIHVuc2lnbmVkIGxvbmcgY3VycmVudF90c2Nfa2h6ID0gMDsKLXN0YXRpYyBpbnQgdHNjX3VwZGF0ZV9jYWxsYmFjayh2b2lkKTsKIAogc3RhdGljIGN5Y2xlX3QgcmVhZF90c2Modm9pZCkKIHsKQEAgLTM0OSwzNyArMzA2LDI4IEBACiAJLm1hc2sJCQk9IENMT0NLU09VUkNFX01BU0soNjQpLAogCS5tdWx0CQkJPSAwLCAvKiB0byBiZSBzZXQgKi8KIAkuc2hpZnQJCQk9IDIyLAotCS51cGRhdGVfY2FsbGJhY2sJPSB0c2NfdXBkYXRlX2NhbGxiYWNrLAotCS5pc19jb250aW51b3VzCQk9IDEsCisJLmZsYWdzCQkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUyB8CisJCQkJICBDTE9DS19TT1VSQ0VfTVVTVF9WRVJJRlksCiB9OwogCi1zdGF0aWMgaW50IHRzY191cGRhdGVfY2FsbGJhY2sodm9pZCkKK3ZvaWQgbWFya190c2NfdW5zdGFibGUodm9pZCkKIHsKLQlpbnQgY2hhbmdlID0gMDsKLQotCS8qIGNoZWNrIHRvIHNlZSBpZiB3ZSBzaG91bGQgc3dpdGNoIHRvIHRoZSBzYWZlIGNsb2Nrc291cmNlOiAqLwotCWlmIChjbG9ja3NvdXJjZV90c2MucmF0aW5nICE9IDAgJiYgY2hlY2tfdHNjX3Vuc3RhYmxlKCkpIHsKLQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7Ci0JCWNsb2Nrc291cmNlX3Jlc2VsZWN0KCk7Ci0JCWNoYW5nZSA9IDE7CisJaWYgKCF0c2NfdW5zdGFibGUpIHsKKwkJdHNjX3Vuc3RhYmxlID0gMTsKKwkJLyogQ2FuIGJlIGNhbGxlZCBiZWZvcmUgcmVnaXN0cmF0aW9uICovCisJCWlmIChjbG9ja3NvdXJjZV90c2MubXVsdCkKKwkJCWNsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoJmNsb2Nrc291cmNlX3RzYywgMCk7CisJCWVsc2UKKwkJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSAwOwogCX0KLQotCS8qIG9ubHkgdXBkYXRlIGlmIHRzY19raHogaGFzIGNoYW5nZWQ6ICovCi0JaWYgKGN1cnJlbnRfdHNjX2toeiAhPSB0c2Nfa2h6KSB7Ci0JCWN1cnJlbnRfdHNjX2toeiA9IHRzY19raHo7Ci0JCWNsb2Nrc291cmNlX3RzYy5tdWx0ID0gY2xvY2tzb3VyY2Vfa2h6Mm11bHQoY3VycmVudF90c2Nfa2h6LAotCQkJCQkJCWNsb2Nrc291cmNlX3RzYy5zaGlmdCk7Ci0JCWNoYW5nZSA9IDE7Ci0JfQotCi0JcmV0dXJuIGNoYW5nZTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKG1hcmtfdHNjX3Vuc3RhYmxlKTsKIAogc3RhdGljIGludCBfX2luaXQgZG1pX21hcmtfdHNjX3Vuc3RhYmxlKHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQogewogCXByaW50ayhLRVJOX05PVElDRSAiJXMgZGV0ZWN0ZWQ6IG1hcmtpbmcgVFNDIHVuc3RhYmxlLlxuIiwKIAkJICAgICAgIGQtPmlkZW50KTsKLQltYXJrX3RzY191bnN0YWJsZSgpOworCXRzY191bnN0YWJsZSA9IDE7CiAJcmV0dXJuIDA7CiB9CiAKQEAgLTM5Niw2NiArMzQ0LDQ1IEBACiAJIHt9CiB9OwogCi0jZGVmaW5lIFRTQ19GUkVRX0NIRUNLX0lOVEVSVkFMICgxMCpNU0VDX1BFUl9TRUMpIC8qIDEwc2VjIGluIE1TICovCi1zdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdmVyaWZ5X3RzY19mcmVxX3RpbWVyOwotCi0vKiBYWFggLSBQcm9iYWJseSBzaG91bGQgYWRkIGxvY2tpbmcgKi8KLXN0YXRpYyB2b2lkIHZlcmlmeV90c2NfZnJlcSh1bnNpZ25lZCBsb25nIHVudXNlZCkKLXsKLQlzdGF0aWMgdTY0IGxhc3RfdHNjOwotCXN0YXRpYyB1bnNpZ25lZCBsb25nIGxhc3RfamlmZmllczsKLQotCXU2NCBub3dfdHNjLCBpbnRlcnZhbF90c2M7Ci0JdW5zaWduZWQgbG9uZyBub3dfamlmZmllcywgaW50ZXJ2YWxfamlmZmllczsKLQotCi0JaWYgKGNoZWNrX3RzY191bnN0YWJsZSgpKQotCQlyZXR1cm47Ci0KLQlyZHRzY2xsKG5vd190c2MpOwotCW5vd19qaWZmaWVzID0gamlmZmllczsKLQotCWlmICghbGFzdF9qaWZmaWVzKSB7Ci0JCWdvdG8gb3V0OwotCX0KLQotCWludGVydmFsX2ppZmZpZXMgPSBub3dfamlmZmllcyAtIGxhc3RfamlmZmllczsKLQlpbnRlcnZhbF90c2MgPSBub3dfdHNjIC0gbGFzdF90c2M7Ci0JaW50ZXJ2YWxfdHNjICo9IEhaOwotCWRvX2RpdihpbnRlcnZhbF90c2MsIGNwdV9raHoqMTAwMCk7Ci0KLQlpZiAoaW50ZXJ2YWxfdHNjIDwgKGludGVydmFsX2ppZmZpZXMgKiAzIC8gNCkpIHsKLQkJcHJpbnRrKCJUU0MgYXBwZWFycyB0byBiZSBydW5uaW5nIHNsb3dseS4gIgotCQkJIk1hcmtpbmcgaXQgYXMgdW5zdGFibGVcbiIpOwotCQltYXJrX3RzY191bnN0YWJsZSgpOwotCQlyZXR1cm47Ci0JfQotCi1vdXQ6Ci0JbGFzdF90c2MgPSBub3dfdHNjOwotCWxhc3RfamlmZmllcyA9IG5vd19qaWZmaWVzOwotCS8qIHNldCB1cyB1cCB0byBnbyBvZmYgb24gdGhlIG5leHQgaW50ZXJ2YWw6ICovCi0JbW9kX3RpbWVyKCZ2ZXJpZnlfdHNjX2ZyZXFfdGltZXIsCi0JCWppZmZpZXMgKyBtc2Vjc190b19qaWZmaWVzKFRTQ19GUkVRX0NIRUNLX0lOVEVSVkFMKSk7Ci19Ci0KIC8qCiAgKiBNYWtlIGFuIGVkdWNhdGVkIGd1ZXNzIGlmIHRoZSBUU0MgaXMgdHJ1c3R3b3J0aHkgYW5kIHN5bmNocm9uaXplZAogICogb3ZlciBhbGwgQ1BVcy4KICAqLwotc3RhdGljIF9faW5pdCBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpCitfX2NwdWluaXQgaW50IHVuc3luY2hyb25pemVkX3RzYyh2b2lkKQogeworCWlmICghY3B1X2hhc190c2MgfHwgdHNjX3Vuc3RhYmxlKQorCQlyZXR1cm4gMTsKIAkvKgogCSAqIEludGVsIHN5c3RlbXMgYXJlIG5vcm1hbGx5IGFsbCBzeW5jaHJvbml6ZWQuCiAJICogRXhjZXB0aW9ucyBtdXN0IG1hcmsgVFNDIGFzIHVuc3RhYmxlOgogCSAqLwotCWlmIChib290X2NwdV9kYXRhLng4Nl92ZW5kb3IgPT0gWDg2X1ZFTkRPUl9JTlRFTCkKLSAJCXJldHVybiAwOwotCi0JLyogYXNzdW1lIG11bHRpIHNvY2tldCBzeXN0ZW1zIGFyZSBub3Qgc3luY2hyb25pemVkOiAqLwotIAlyZXR1cm4gbnVtX3Bvc3NpYmxlX2NwdXMoKSA+IDE7CisJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciAhPSBYODZfVkVORE9SX0lOVEVMKSB7CisJCS8qIGFzc3VtZSBtdWx0aSBzb2NrZXQgc3lzdGVtcyBhcmUgbm90IHN5bmNocm9uaXplZDogKi8KKwkJaWYgKG51bV9wb3NzaWJsZV9jcHVzKCkgPiAxKQorCQkJdHNjX3Vuc3RhYmxlID0gMTsKKwl9CisJcmV0dXJuIHRzY191bnN0YWJsZTsKIH0KIAorLyoKKyAqIEdlb2RlX0xYIC0gdGhlIE9MUEMgQ1BVIGhhcyBhIHBvc3NpYmx5IGEgdmVyeSByZWxpYWJsZSBUU0MKKyAqLworI2lmZGVmIENPTkZJR19NR0VPREVfTFgKKy8qIFJUU0MgY291bnRzIGR1cmluZyBzdXNwZW5kICovCisjZGVmaW5lIFJUU0NfU1VTUCAweDEwMAorCitzdGF0aWMgdm9pZCBfX2luaXQgY2hlY2tfZ2VvZGVfdHNjX3JlbGlhYmxlKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlyZG1zcmwoTVNSX0dFT0RFX0JVU0NPTlRfQ09ORjAsIHZhbCk7CisJaWYgKCh2YWwgJiBSVFNDX1NVU1ApKQorCQljbG9ja3NvdXJjZV90c2MuZmxhZ3MgJj0gfkNMT0NLX1NPVVJDRV9NVVNUX1ZFUklGWTsKK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfZ2VvZGVfdHNjX3JlbGlhYmxlKHZvaWQpIHsgfQorI2VuZGlmCisKIHN0YXRpYyBpbnQgX19pbml0IGluaXRfdHNjX2Nsb2Nrc291cmNlKHZvaWQpCiB7CiAKQEAgLTQ2MywyMCArMzkwLDE2IEBACiAJCS8qIGNoZWNrIGJsYWNrbGlzdCAqLwogCQlkbWlfY2hlY2tfc3lzdGVtKGJhZF90c2NfZG1pX3RhYmxlKTsKIAotCQlpZiAodW5zeW5jaHJvbml6ZWRfdHNjKCkpIC8qIG1hcmsgdW5zdGFibGUgaWYgdW5zeW5jZWQgKi8KLQkJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CisJCXVuc3luY2hyb25pemVkX3RzYygpOworCQljaGVja19nZW9kZV90c2NfcmVsaWFibGUoKTsKIAkJY3VycmVudF90c2Nfa2h6ID0gdHNjX2toejsKIAkJY2xvY2tzb3VyY2VfdHNjLm11bHQgPSBjbG9ja3NvdXJjZV9raHoybXVsdChjdXJyZW50X3RzY19raHosCiAJCQkJCQkJY2xvY2tzb3VyY2VfdHNjLnNoaWZ0KTsKIAkJLyogbG93ZXIgdGhlIHJhdGluZyBpZiB3ZSBhbHJlYWR5IGtub3cgaXRzIHVuc3RhYmxlOiAqLwotCQlpZiAoY2hlY2tfdHNjX3Vuc3RhYmxlKCkpCisJCWlmIChjaGVja190c2NfdW5zdGFibGUoKSkgewogCQkJY2xvY2tzb3VyY2VfdHNjLnJhdGluZyA9IDA7Ci0KLQkJaW5pdF90aW1lcigmdmVyaWZ5X3RzY19mcmVxX3RpbWVyKTsKLQkJdmVyaWZ5X3RzY19mcmVxX3RpbWVyLmZ1bmN0aW9uID0gdmVyaWZ5X3RzY19mcmVxOwotCQl2ZXJpZnlfdHNjX2ZyZXFfdGltZXIuZXhwaXJlcyA9Ci0JCQlqaWZmaWVzICsgbXNlY3NfdG9famlmZmllcyhUU0NfRlJFUV9DSEVDS19JTlRFUlZBTCk7Ci0JCWFkZF90aW1lcigmdmVyaWZ5X3RzY19mcmVxX3RpbWVyKTsKKwkJCWNsb2Nrc291cmNlX3RzYy5mbGFncyAmPSB+Q0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVM7CisJCX0KIAogCQlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX3RzYyk7CiAJfQpkaWZmIC0tZ2l0IGEvYXJjaC9pMzg2L2tlcm5lbC90c2Nfc3luYy5jIGIvYXJjaC9pMzg2L2tlcm5lbC90c2Nfc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNDI0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL2kzODYva2VybmVsL3RzY19zeW5jLmMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uL3g4Nl82NC9rZXJuZWwvdHNjX3N5bmMuYyIKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9rZXJuZWwvdm1pdGltZS5jIGIvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKaW5kZXggMmUyZDhkYi4uNzZkMmFkYyAxMDA2NDQKLS0tIGEvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKKysrIGIvYXJjaC9pMzg2L2tlcm5lbC92bWl0aW1lLmMKQEAgLTExNSw3ICsxMTUsNyBAQAogCS5tYXNrCQkJPSBDTE9DS1NPVVJDRV9NQVNLKDY0KSwKIAkubXVsdAkJCT0gMCwgLyogdG8gYmUgc2V0ICovCiAJLnNoaWZ0CQkJPSAyMiwKLQkuaXNfY29udGludW91cwkJPSAxLAorCS5mbGFncwkJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYyBiL2FyY2gvaTM4Ni9tYWNoLWRlZmF1bHQvc2V0dXAuYwppbmRleCBjYzJmNTE5Li5jNzg4MTYyIDEwMDY0NAotLS0gYS9hcmNoL2kzODYvbWFjaC1kZWZhdWx0L3NldHVwLmMKKysrIGIvYXJjaC9pMzg2L21hY2gtZGVmYXVsdC9zZXR1cC5jCkBAIC03OSw3ICs3OSwxMiBAQAogewogfQogCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEwICA9IHsgdGltZXJfaW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELCBDUFVfTUFTS19OT05FLCAidGltZXIiLCBOVUxMLCBOVUxMfTsKK3N0YXRpYyBzdHJ1Y3QgaXJxYWN0aW9uIGlycTAgID0geworCS5oYW5kbGVyID0gdGltZXJfaW50ZXJydXB0LAorCS5mbGFncyA9IElSUUZfRElTQUJMRUQgfCBJUlFGX05PQkFMQU5DSU5HLAorCS5tYXNrID0gQ1BVX01BU0tfTk9ORSwKKwkubmFtZSA9ICJ0aW1lciIKK307CiAKIC8qKgogICogdGltZV9pbml0X2hvb2sgLSBkbyBhbnkgc3BlY2lmaWMgaW5pdGlhbGlzYXRpb25zIGZvciB0aGUgc3lzdGVtIHRpbWVyLgpAQCAtOTAsNiArOTUsNyBAQAogICoqLwogdm9pZCBfX2luaXQgdGltZV9pbml0X2hvb2sodm9pZCkKIHsKKwlpcnEwLm1hc2sgPSBjcHVtYXNrX29mX2NwdSgwKTsKIAlzZXR1cF9pcnEoMCwgJmlycTApOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQvS2NvbmZpZyBiL2FyY2gvaWE2NC9LY29uZmlnCmluZGV4IGRiMTg1ZjMuLmQ1MWYwZjEgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9LY29uZmlnCisrKyBiL2FyY2gvaWE2NC9LY29uZmlnCkBAIC0yMiw2ICsyMiw3IEBACiAKIGNvbmZpZyA2NEJJVAogCWJvb2wKKwlzZWxlY3QgQVRBX05PTlNUQU5EQVJEIGlmIEFUQQogCWRlZmF1bHQgeQogCiBjb25maWcgWk9ORV9ETUEKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKaW5kZXggOTE5N2Q3Yi4uMzU0OWM5NCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9hY3BpLmMKQEAgLTY1MSw3ICs2NTEsNyBAQAogCSAqIGluZm9ybWF0aW9uIC0tIHRoZSBzdWNjZXNzb3IgdG8gTVBTIHRhYmxlcy4KIAkgKi8KIAotCWlmIChhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX01BRFQsIGFjcGlfcGFyc2VfbWFkdCkgPCAxKSB7CisJaWYgKGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfTUFEVCwgYWNwaV9wYXJzZV9tYWR0KSkgewogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDYW4ndCBmaW5kIE1BRFRcbiIpOwogCQlnb3RvIHNraXBfbWFkdDsKIAl9CkBAIC03MDIsNyArNzAyLDcgQEAKIAkgKiBnZXRzIGludGVycnVwdHMgc3VjaCBhcyBwb3dlciBhbmQgc2xlZXAgYnV0dG9ucy4gIElmIGl0J3Mgbm90CiAJICogb24gYSBMZWdhY3kgaW50ZXJydXB0LCBpdCBuZWVkcyB0byBiZSBzZXR1cC4KIAkgKi8KLQlpZiAoYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19GQURULCBhY3BpX3BhcnNlX2ZhZHQpIDwgMSkKKwlpZiAoYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19GQURULCBhY3BpX3BhcnNlX2ZhZHQpKQogCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJDYW4ndCBmaW5kIEZBRFRcbiIpOwogCiAjaWZkZWYgQ09ORklHX1NNUApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC90aW1lLmMgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwppbmRleCA1NDVmY2JjLi5lNWU1NmJkIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL3RpbWUuYworKysgYi9hcmNoL21pcHMva2VybmVsL3RpbWUuYwpAQCAtMzA3LDcgKzMwNyw3IEBACiBzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfbWlwcyA9IHsKIAkubmFtZQkJPSAiTUlQUyIsCiAJLm1hc2sJCT0gMHhmZmZmZmZmZiwKLQkuaXNfY29udGludW91cwk9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogc3RhdGljIHZvaWQgX19pbml0IGluaXRfbWlwc19jbG9ja3NvdXJjZSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcG93ZXJtYWMvcGljLmMKaW5kZXggMzlkYjEyOC4uNWU1YzBlNCAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wb3dlcm1hYy9waWMuYworKysgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3Bvd2VybWFjL3BpYy5jCkBAIC0zMDUsOCArMzA1LDYgQEAKIAlsZXZlbCA9ICEhKGxldmVsX21hc2tbaHcgPj4gNV0gJiAoMVVMIDw8IChodyAmIDB4MWYpKSk7CiAJaWYgKGxldmVsKQogCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0xFVkVMOwotCWVsc2UKLQkJZGVzYy0+c3RhdHVzIHw9IElSUV9ERUxBWUVEX0RJU0FCTEU7CiAJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyKHZpcnEsICZwbWFjX3BpYywgbGV2ZWwgPwogCQkJCSBoYW5kbGVfbGV2ZWxfaXJxIDogaGFuZGxlX2VkZ2VfaXJxKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvczM5MC9rZXJuZWwvdGltZS5jIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKaW5kZXggM2I5MWYyNy4uZWU5ZmQ3YiAxMDA2NDQKLS0tIGEvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC9zMzkwL2tlcm5lbC90aW1lLmMKQEAgLTMxMiw3ICszMTIsNyBAQAogCS5tYXNrCQk9IC0xVUxMLAogCS5tdWx0CQk9IDEwMDAsCiAJLnNoaWZ0CQk9IDEyLAotCS5pc19jb250aW51b3VzCT0gMSwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvS2NvbmZpZyBiL2FyY2gvc2gvS2NvbmZpZwppbmRleCA0ZjM4OTEyLi40ZDE2ZDg5IDEwMDY0NAotLS0gYS9hcmNoL3NoL0tjb25maWcKKysrIGIvYXJjaC9zaC9LY29uZmlnCkBAIC0xMzUsMTIgKzEzNSw2IEBACiAJICBNb3JlIGluZm9ybWF0aW9uIChoYXJkd2FyZSBvbmx5KSBhdAogCSAgPGh0dHA6Ly93d3cuaHAuY29tL2pvcm5hZGEvPi4KIAotY29uZmlnIFNIX0VDMzEwNAotCWJvb2wgIkVDMzEwNCIKLQloZWxwCi0JICBTZWxlY3QgRUMzMTA0IGlmIGNvbmZpZ3VyaW5nIGZvciBhIHN5c3RlbSB3aXRoIGFuIEVjbGlwc2UKLQkgIEludGVybmF0aW9uYWwgRUMzMTA0IGNoaXAsIGUuZy4gdGhlIEhhcnJpcyBBRDIwMDAuCi0KIGNvbmZpZyBTSF9TQVRVUk4KIAlib29sICJTYXR1cm4iCiAJc2VsZWN0IENQVV9TVUJUWVBFX1NINzYwNApAQCAtMTU2LDkgKzE1MCw2IEBACiAJICA8aHR0cDovL3d3dy5tMTduLm9yZy9saW51eC1zaC9kcmVhbWNhc3QvPi4gIFRoZXJlIGlzIGEKIAkgIERyZWFtY2FzdCBwcm9qZWN0IGlzIGF0IDxodHRwOi8vbGludXhkYy5zb3VyY2Vmb3JnZS5uZXQvPi4KIAotY29uZmlnIFNIX0JJR1NVUgotCWJvb2wgIkJpZ1N1ciIKLQogY29uZmlnIFNIX01QQzEyMTEKIAlib29sICJJbnRlcmZhY2UgTVBDMTIxMSIKIAloZWxwCkBAIC00ODEsNiArNDcyLDcgQEAKIAogY29uZmlnIFNIX0NMS19NRAogCWludCAiQ1BVIE1vZGUgUGluIFNldHRpbmciCisJZGVmYXVsdCAwCiAJZGVwZW5kcyBvbiBDUFVfU1VCVFlQRV9TSDc2MTkgfHwgQ1BVX1NVQlRZUEVfU0g3MjA2CiAJaGVscAogCSAgTUQyIC0gTUQwIHBpbiBzZXR0aW5nLgpAQCAtNTEwLDggKzUwMiw5IEBACiBjb25maWcgSEVBUlRCRUFUCiAJYm9vbCAiSGVhcnRiZWF0IExFRCIKIAlkZXBlbmRzIG9uIFNIX01QQzEyMTEgfHwgU0hfU0gwMyB8fCBcCi0JCSAgIFNIX0JJR1NVUiB8fCBTT0xVVElPTl9FTkdJTkUgfHwgXAotCQkgICBTSF9SVFM3NzUxUjJEIHx8IFNIX1NINDIwMl9NSUNST0RFViB8fCBTSF9MQU5ESVNLCisJCSAgIFNPTFVUSU9OX0VOR0lORSB8fCBcCisJCSAgIFNIX1JUUzc3NTFSMkQgfHwgU0hfU0g0MjAyX01JQ1JPREVWIHx8IFNIX0xBTkRJU0sgfHwgXAorCQkgICBTSF9SNzc4MFJQCiAJaGVscAogCSAgVXNlIHRoZSBwb3dlci1vbiBMRUQgb24geW91ciBtYWNoaW5lIGFzIGEgbG9hZCBtZXRlci4gIFRoZSBleGFjdAogCSAgYmVoYXZpb3IgaXMgcGxhdGZvcm0tZGVwZW5kZW50LCBidXQgbm9ybWFsbHkgdGhlIGZsYXNoIGZyZXF1ZW5jeSBpcwpAQCAtNTk2LDYgKzU4OSw4IEBACiBjb25maWcgWkVST19QQUdFX09GRlNFVAogCWhleCAiWmVybyBwYWdlIG9mZnNldCIKIAlkZWZhdWx0ICIweDAwMDA0MDAwIiBpZiBTSF9NUEMxMjExIHx8IFNIX1NIMDMKKwlkZWZhdWx0ICIweDAwMDEwMDAwIiBpZiBQQUdFX1NJWkVfNjRLQgorCWRlZmF1bHQgIjB4MDAwMDIwMDAiIGlmIFBBR0VfU0laRV84S0IKIAlkZWZhdWx0ICIweDAwMDAxMDAwIgogCWhlbHAKIAkgIFRoaXMgc2V0cyB0aGUgZGVmYXVsdCBvZmZzZXQgb2YgemVybyBwYWdlLgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9NYWtlZmlsZSBiL2FyY2gvc2gvTWFrZWZpbGUKaW5kZXggYzFkYmVmMi4uYmQ5YjE3MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9NYWtlZmlsZQorKysgYi9hcmNoL3NoL01ha2VmaWxlCkBAIC0zNSw2ICszNSw3IEBACiBlbmRpZgogCiBjZmxhZ3MtJChDT05GSUdfQ1BVX1NIMikJCTo9IC1tMgorY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDJBKQkJOj0gLW0yYSAkKGNhbGwgY2Mtb3B0aW9uLC1tMmEtbm9mcHUsKQogY2ZsYWdzLSQoQ09ORklHX0NQVV9TSDMpCQk6PSAtbTMKIGNmbGFncy0kKENPTkZJR19DUFVfU0g0KQkJOj0gLW00IFwKIAkkKGNhbGwgY2Mtb3B0aW9uLC1tbm8taW1wbGljaXQtZnAsLW00LW5vZnB1KQpAQCAtOTMsMTAgKzk0LDggQEAKIG1hY2hkaXItJChDT05GSUdfU0hfNzM0M19TT0xVVElPTl9FTkdJTkUpCTo9IHNlLzczNDMKIG1hY2hkaXItJChDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FKQk6PSBzZS83MzE4MAogbWFjaGRpci0kKENPTkZJR19TSF9IUDZYWCkJCQk6PSBocDZ4eAotbWFjaGRpci0kKENPTkZJR19TSF9FQzMxMDQpCQkJOj0gZWMzMTA0CiBtYWNoZGlyLSQoQ09ORklHX1NIX1NBVFVSTikJCQk6PSBzYXR1cm4KIG1hY2hkaXItJChDT05GSUdfU0hfRFJFQU1DQVNUKQkJCTo9IGRyZWFtY2FzdAotbWFjaGRpci0kKENPTkZJR19TSF9CSUdTVVIpCQkJOj0gYmlnc3VyCiBtYWNoZGlyLSQoQ09ORklHX1NIX01QQzEyMTEpCQkJOj0gbXBjMTIxMQogbWFjaGRpci0kKENPTkZJR19TSF9TSDAzKQkJCTo9IHNoMDMKIG1hY2hkaXItJChDT05GSUdfU0hfU0VDVVJFRURHRTU0MTApCQk6PSBzbmFwZ2VhcgpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL01ha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY5NDk3Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9NYWtlZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotIwotIyBNYWtlZmlsZSBmb3IgdGhlIEJpZ1N1ciBzcGVjaWZpYyBwYXJ0cyBvZiB0aGUga2VybmVsCi0jCi0KLW9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8gbGVkLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lvLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaW8uYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMwNzFmOS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvaW8uYworKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lvLmMKLSAqCi0gKiBCeSBEdXN0aW4gTWNJbnRpcmUgKGR1c3RpbkBzZW5zb3JpYS5jb20pIChjKTIwMDEKLSAqIERlcml2ZWQgZnJvbSBpb19oZDY0NDY1LmgsIHdoaWNoIGJvcmUgdGhlIG1lc3NhZ2U6Ci0gKiBCeSBHcmVnIEJhbmtzIDxnYmFua3NAcG9ja2V0cGVuZ3VpbnMuY29tPgotICogKGMpIDIwMDAgUG9ja2V0UGVuZ3VpbnMgSW5jLiAKLSAqIGFuZCBmcm9tIGlvX2hkNjQ0NjEuaCwgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIENvcHlyaWdodCAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBJTyBmdW5jdGlvbnMgZm9yIGEgSGl0YWNoaSBCaWcgU3VyIEV2YWx1YXRpb24gQm9hcmQuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2JpZ3N1ci9iaWdzdXIuaD4KLQotLyogTG93IGlvbWFwIG1hcHMgcG9ydCAwLTFLIHRvIGFkZHJlc3NlcyBpbiA4Ynl0ZSBjaHVua3MgKi8KLSNkZWZpbmUgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCAweDQwMAotI2RlZmluZSBCSUdTVVJfSU9NQVBfTE9fU0hJRlQJMwotI2RlZmluZSBCSUdTVVJfSU9NQVBfTE9fTUFTSwkoKDE8PEJJR1NVUl9JT01BUF9MT19TSElGVCktMSkKLSNkZWZpbmUgQklHU1VSX0lPTUFQX0xPX05NQVAJKEJJR1NVUl9JT01BUF9MT19USFJFU0g+PkJJR1NVUl9JT01BUF9MT19TSElGVCkKLXN0YXRpYyB1MzIgYmlnc3VyX2lvbWFwX2xvW0JJR1NVUl9JT01BUF9MT19OTUFQXTsKLXN0YXRpYyB1OCBiaWdzdXJfaW9tYXBfbG9fc2hpZnRbQklHU1VSX0lPTUFQX0xPX05NQVBdOwotCi0vKiBIaWdoIGlvbWFwIG1hcHMgcG9ydCAxSy02NEsgdG8gYWRkcmVzc2VzIGluIDFLIGNodW5rcyAqLwotI2RlZmluZSBCSUdTVVJfSU9NQVBfSElfVEhSRVNIIDB4MTAwMDAKLSNkZWZpbmUgQklHU1VSX0lPTUFQX0hJX1NISUZUCTEwCi0jZGVmaW5lIEJJR1NVUl9JT01BUF9ISV9NQVNLCSgoMTw8QklHU1VSX0lPTUFQX0hJX1NISUZUKS0xKQotI2RlZmluZSBCSUdTVVJfSU9NQVBfSElfTk1BUAkoQklHU1VSX0lPTUFQX0hJX1RIUkVTSD4+QklHU1VSX0lPTUFQX0hJX1NISUZUKQotc3RhdGljIHUzMiBiaWdzdXJfaW9tYXBfaGlbQklHU1VSX0lPTUFQX0hJX05NQVBdOwotc3RhdGljIHU4IGJpZ3N1cl9pb21hcF9oaV9zaGlmdFtCSUdTVVJfSU9NQVBfSElfTk1BUF07Ci0KLXZvaWQgYmlnc3VyX3BvcnRfbWFwKHUzMiBiYXNlcG9ydCwgdTMyIG5wb3J0cywgdTMyIGFkZHIsIHU4IHNoaWZ0KQotewotCXUzMiBwb3J0LCBlbmRwb3J0ID0gYmFzZXBvcnQgKyBucG9ydHM7Ci0KLQlwcl9kZWJ1ZygiYmlnc3VyX3BvcnRfbWFwKGJhc2U9MHglMHgsIG49MHglMHgsIGFkZHI9MHglMDh4KVxuIiwKLQkJIGJhc2Vwb3J0LCBucG9ydHMsIGFkZHIpOwotCSAgICAKLQlmb3IgKHBvcnQgPSBiYXNlcG9ydCA7Ci0JICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCA7Ci0JICAgICBwb3J0ICs9ICgxPDxCSUdTVVJfSU9NQVBfTE9fU0hJRlQpKSB7Ci0JICAgIAlwcl9kZWJ1ZygiICAgIG1hcGxvWzB4JXhdID0gMHglMDh4XG4iLCBwb3J0LCBhZGRyKTsKLSAgICAJICAgIGJpZ3N1cl9pb21hcF9sb1twb3J0Pj5CSUdTVVJfSU9NQVBfTE9fU0hJRlRdID0gYWRkcjsKLSAgICAJICAgIGJpZ3N1cl9pb21hcF9sb19zaGlmdFtwb3J0Pj5CSUdTVVJfSU9NQVBfTE9fU0hJRlRdID0gc2hpZnQ7Ci0JICAgIAlhZGRyICs9ICgxPDwoQklHU1VSX0lPTUFQX0xPX1NISUZUKSk7Ci0JfQotCi0JZm9yIChwb3J0ID0gbWF4X3QodTMyLCBiYXNlcG9ydCwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCk7Ci0JICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgQklHU1VSX0lPTUFQX0hJX1RIUkVTSCA7Ci0JICAgICBwb3J0ICs9ICgxPDxCSUdTVVJfSU9NQVBfSElfU0hJRlQpKSB7Ci0JICAgIAlwcl9kZWJ1ZygiICAgIG1hcGhpWzB4JXhdID0gMHglMDh4XG4iLCBwb3J0LCBhZGRyKTsKLSAgICAJICAgIGJpZ3N1cl9pb21hcF9oaVtwb3J0Pj5CSUdTVVJfSU9NQVBfSElfU0hJRlRdID0gYWRkcjsKLSAgICAJICAgIGJpZ3N1cl9pb21hcF9oaV9zaGlmdFtwb3J0Pj5CSUdTVVJfSU9NQVBfSElfU0hJRlRdID0gc2hpZnQ7Ci0JICAgIAlhZGRyICs9ICgxPDwoQklHU1VSX0lPTUFQX0hJX1NISUZUKSk7Ci0JfQotfQotRVhQT1JUX1NZTUJPTChiaWdzdXJfcG9ydF9tYXApOwotCi12b2lkIGJpZ3N1cl9wb3J0X3VubWFwKHUzMiBiYXNlcG9ydCwgdTMyIG5wb3J0cykKLXsKLQl1MzIgcG9ydCwgZW5kcG9ydCA9IGJhc2Vwb3J0ICsgbnBvcnRzOwotCQotCXByX2RlYnVnKCJiaWdzdXJfcG9ydF91bm1hcChiYXNlPTB4JTB4LCBuPTB4JTB4KVxuIiwgYmFzZXBvcnQsIG5wb3J0cyk7Ci0KLQlmb3IgKHBvcnQgPSBiYXNlcG9ydCA7Ci0JICAgICBwb3J0IDwgZW5kcG9ydCAmJiBwb3J0IDwgQklHU1VSX0lPTUFQX0xPX1RIUkVTSCA7Ci0JICAgICBwb3J0ICs9ICgxPDxCSUdTVVJfSU9NQVBfTE9fU0hJRlQpKSB7Ci0JCWJpZ3N1cl9pb21hcF9sb1twb3J0Pj5CSUdTVVJfSU9NQVBfTE9fU0hJRlRdID0gMDsKLQl9Ci0KLQlmb3IgKHBvcnQgPSBtYXhfdCh1MzIsIGJhc2Vwb3J0LCBCSUdTVVJfSU9NQVBfTE9fVEhSRVNIKTsKLQkgICAgIHBvcnQgPCBlbmRwb3J0ICYmIHBvcnQgPCBCSUdTVVJfSU9NQVBfSElfVEhSRVNIIDsKLQkgICAgIHBvcnQgKz0gKDE8PEJJR1NVUl9JT01BUF9ISV9TSElGVCkpIHsKLQkJYmlnc3VyX2lvbWFwX2hpW3BvcnQ+PkJJR1NVUl9JT01BUF9ISV9TSElGVF0gPSAwOwotCX0KLX0KLUVYUE9SVF9TWU1CT0woYmlnc3VyX3BvcnRfdW5tYXApOwotCi11bnNpZ25lZCBsb25nIGJpZ3N1cl9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQl1bnNpZ25lZCBsb25nIGFkZHIgPSAwOwotCXVuc2lnbmVkIGNoYXIgc2hpZnQ7Ci0KLQkvKiBQaHlzaWNhbCBhZGRyZXNzIG5vdCBpbiBQMCwgZG8gbm90aGluZyAqLwotCWlmIChQWFNFRyhwb3J0KSkgewotCQlhZGRyID0gcG9ydDsKLQkvKiBwaHlzaWNhbCBhZGRyZXNzIGluIFAwLCBtYXAgdG8gUDIgKi8KLQl9IGVsc2UgaWYgKHBvcnQgPj0gMHgzMDAwMCkgewotCQlhZGRyID0gUDJTRUdBRERSKHBvcnQpOwotCS8qIEJpZyBTdXIgSS9PICsgSEQ2NDQ2NSByZWdpc3RlcnMgMHgxMDAwMC0weDMwMDAwICovCi0JfSBlbHNlIGlmIChwb3J0ID49IEJJR1NVUl9JT01BUF9ISV9USFJFU0gpIHsKLQkJYWRkciA9IEJJR1NVUl9JTlRFUk5BTF9CQVNFICsgKHBvcnQgLSBCSUdTVVJfSU9NQVBfSElfVEhSRVNIKTsKLQkvKiBIYW5kbGUgcmVtYXBwaW5nIG9mIGhpZ2ggSU8vUENJIElPIHBvcnRzICovCi0JfSBlbHNlIGlmIChwb3J0ID49IEJJR1NVUl9JT01BUF9MT19USFJFU0gpIHsKLQkJYWRkciA9IGJpZ3N1cl9pb21hcF9oaVtwb3J0ID4+IEJJR1NVUl9JT01BUF9ISV9TSElGVF07Ci0JCXNoaWZ0ID0gYmlnc3VyX2lvbWFwX2hpX3NoaWZ0W3BvcnQgPj4gQklHU1VSX0lPTUFQX0hJX1NISUZUXTsKLQotCQlpZiAoYWRkciAhPSAwKQotCQkJYWRkciArPSAocG9ydCAmIEJJR1NVUl9JT01BUF9ISV9NQVNLKSA8PCBzaGlmdDsKLQl9IGVsc2UgewotCQkvKiBIYW5kbGUgcmVtYXBwaW5nIG9mIGxvdyBJTyBwb3J0cyAqLwotCQlhZGRyID0gYmlnc3VyX2lvbWFwX2xvW3BvcnQgPj4gQklHU1VSX0lPTUFQX0xPX1NISUZUXTsKLQkJc2hpZnQgPSBiaWdzdXJfaW9tYXBfbG9fc2hpZnRbcG9ydCA+PiBCSUdTVVJfSU9NQVBfTE9fU0hJRlRdOwotCi0JCWlmIChhZGRyICE9IDApCi0JCQlhZGRyICs9IChwb3J0ICYgQklHU1VSX0lPTUFQX0xPX01BU0spIDw8IHNoaWZ0OwotCX0KLQotCXByX2RlYnVnKCIlcygweCUwOGx4KSA9IDB4JTA4bHhcbiIsIF9fRlVOQ1RJT05fXywgcG9ydCwgYWRkcik7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYWIwNGRhLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vKgotICoKLSAqIEJ5IER1c3RpbiBNY0ludGlyZSAoZHVzdGluQHNlbnNvcmlhLmNvbSkgKGMpMjAwMQotICoKLSAqIFNldHVwIGFuZCBJUlEgaGFuZGxpbmcgY29kZSBmb3IgdGhlIEhENjQ0NjUgY29tcGFuaW9uIGNoaXAuCi0gKiBieSBHcmVnIEJhbmtzIDxnYmFua3NAcG9ja2V0cGVuZ3VpbnMuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDAwIFBvY2tldFBlbmd1aW5zIEluYwotICoKLSAqIERlcml2ZWQgZnJvbSBzZXR1cF9oZDY0NDY1LmMgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIEdyZWcgQmFua3MgPGdiYW5rc0Bwb2NrZXRwZW5ndWlucy5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgUG9ja2V0UGVuZ3VpbnMgSW5jIGFuZAotICogQ29weXJpZ2h0IChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKLSAqIGFuZCBzZXR1cF9jcXJlZWsuYyB3aGljaCBib3JlIG1lc3NhZ2U6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgIE5paWJlIFl1dGFrYQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBJUlEgZnVuY3Rpb25zIGZvciBhIEhpdGFjaGkgQmlnIFN1ciBFdmFsdWF0aW9uIEJvYXJkLgotICoKLSAqLwotI3VuZGVmIERFQlVHCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3BhcmFtLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2lycS5oPgotI2luY2x1ZGUgPGxpbnV4L2JpdG9wcy5oPgotCi0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2lycS5oPgotCi0jaW5jbHVkZSA8YXNtL2JpZ3N1ci9pby5oPgotI2luY2x1ZGUgPGFzbS9oZDY0NDY1L2hkNjQ0NjUuaD4KLSNpbmNsdWRlIDxhc20vYmlnc3VyL2JpZ3N1ci5oPgotCi0vLyNkZWZpbmUgQklHU1VSX0RFQlVHIDMKLSN1bmRlZiBCSUdTVVJfREVCVUcKLQotI2lmZGVmIEJJR1NVUl9ERUJVRwotI2RlZmluZSBESVBSSU5USyhuLCBhcmdzLi4uKSAgICBpZiAoQklHU1VSX0RFQlVHPihuKSkgcHJpbnRrKGFyZ3MpCi0jZWxzZQotI2RlZmluZSBESVBSSU5USyhuLCBhcmdzLi4uKQotI2VuZGlmIC8qIEJJR1NVUl9ERUJVRyAqLwotCi0jaWZkZWYgQ09ORklHX0hENjQ0NjUKLWV4dGVybiBpbnQgaGQ2NDQ2NV9pcnFfZGVtdXgoaW50IGlycSk7Ci0jZW5kaWYgLyogQ09ORklHX0hENjQ0NjUgKi8KLQotCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLS8vICAgICAgICAgICAgICBCaWcgU3VyIENQTEQgSVJRIFJvdXRpbmVzCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotLyogTGV2ZWwgMSBJUlEgcm91dGluZXMgKi8KLXN0YXRpYyB2b2lkIGRpc2FibGVfYmlnc3VyX2wxaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKLSAgICAgICAgdW5zaWduZWQgaW50IG1hc2tfcG9ydCA9ICgoaXJxIC0gQklHU1VSX0lSUV9MT1cpLzgpID8gQklHU1VSX0lSTE1SMSA6IEJJR1NVUl9JUkxNUjA7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYml0ID0gICgxIDw8ICgoaXJxIC0gTUdBVEVfSVJRX0xPVyklOCkgKTsKLQotICAgICAgICBpZihpcnEgPj0gQklHU1VSX0lSUV9MT1cgJiYgaXJxIDwgQklHU1VSX0lSUV9ISUdIKSB7Ci0gICAgICAgICAgICAgICAgcHJfZGVidWcoIkRpc2FibGUgTDEgSVJRICVkXG4iLCBpcnEpOwotICAgICAgICAgICAgICAgIERJUFJJTlRLKDIsImRpc2FibGVfYmlnc3VyX2wxaXJxOiBJTVI9MHglMDh4IG1hc2s9MHgleFxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hc2tfcG9ydCwgYml0KTsKLQotICAgICAgICAgICAgICAgIC8qIERpc2FibGUgSVJRIC0gc2V0IG1hc2sgYml0ICovCi0gICAgICAgICAgICAgICAgbWFzayA9IGluYihtYXNrX3BvcnQpIHwgYml0OwotICAgICAgICAgICAgICAgIG91dGIobWFzaywgbWFza19wb3J0KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcHJfZGVidWcoImRpc2FibGVfYmlnc3VyX2wxaXJxOiBJbnZhbGlkIElSUSAlZFxuIiwgaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZW5hYmxlX2JpZ3N1cl9sMWlycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICB1bnNpZ25lZCBjaGFyIG1hc2s7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtYXNrX3BvcnQgPSAoKGlycSAtIEJJR1NVUl9JUlFfTE9XKS84KSA/IEJJR1NVUl9JUkxNUjEgOiBCSUdTVVJfSVJMTVIwOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdCA9ICAoMSA8PCAoKGlycSAtIE1HQVRFX0lSUV9MT1cpJTgpICk7Ci0KLSAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkgewotICAgICAgICAgICAgICAgIHByX2RlYnVnKCJFbmFibGUgTDEgSVJRICVkXG4iLCBpcnEpOwotICAgICAgICAgICAgICAgIERJUFJJTlRLKDIsImVuYWJsZV9iaWdzdXJfbDFpcnE6IElNUj0weCUwOHggbWFzaz0weCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFza19wb3J0LCBiaXQpOwotICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBMMSBJUlEgLSBjbGVhciBtYXNrIGJpdCAqLwotICAgICAgICAgICAgICAgIG1hc2sgPSBpbmIobWFza19wb3J0KSAmIH5iaXQ7Ci0gICAgICAgICAgICAgICAgb3V0YihtYXNrLCBtYXNrX3BvcnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwcl9kZWJ1ZygiZW5hYmxlX2JpZ3N1cl9sMWlycTogSW52YWxpZCBJUlEgJWRcbiIsIGlycSk7Ci19Ci0KLQotLyogTGV2ZWwgMiBpcnEgbWFza3MgYW5kIHJlZ2lzdGVycyBmb3IgTDIgZGVjb2RpbmcgKi8KLS8qIExldmVsMiBiaXRtYXNrcyBmb3IgZWFjaCBsZXZlbCAxIElSUSAqLwotY29uc3QgdTMyIGJpZ3N1cl9sMmlycV9tYXNrW10gPQotICAgIHsweDQwLDB4ODAsMHgwOCwweDAxLDB4MDEsMHgzQywweDNFLDB4RkYsMHg0MCwweDgwLDB4MDYsMHgwM307Ci0vKiBMZXZlbDIgdG8gSVNSW25dIG1hcCBmb3IgZWFjaCBsZXZlbCAxIElSUSAqLwotY29uc3QgdTMyIGJpZ3N1cl9sMmlycV9yZWdbXSAgPQotICAgIHsgICAyLCAgIDIsICAgMywgICAzLCAgIDEsICAgMiwgICAxLCAgIDAsICAgMSwgICAxLCAgIDMsICAgMn07Ci0vKiBMZXZlbDIgdG8gTGV2ZWwgMSBJUlEgbWFwICovCi1jb25zdCB1MzIgYmlnc3VyX2wyX2wxX21hcFtdICA9Ci0gICAgezcsNyw3LDcsNyw3LDcsNywgNCw2LDYsNiw2LDYsOCw5LCAxMSwxMSw1LDUsNSw1LDAsMSwgMywxMCwxMCwyLC0xLC0xLC0xLC0xfTsKLS8qIElSUSBpbmFjdGl2ZSBsZXZlbCAoaGlnaCBvciBsb3cpICovCi1jb25zdCB1MzIgYmlnc3VyX2wyX2luYWN0dl9zdGF0ZVtdICA9ICAgezB4MDAsIDB4QkUsIDB4RkMsIDB4Rjd9OwotCi0vKiBDUExEIGV4dGVybmFsIHN0YXR1cyBhbmQgbWFzayByZWdpc3RlcnMgYmFzZSBhbmQgb2Zmc2V0cyAqLwotc3RhdGljIGNvbnN0IHUzMiBpc3JfYmFzZSA9IEJJR1NVUl9JUlEwOwotc3RhdGljIGNvbnN0IHUzMiBpc3Jfb2Zmc2V0ID0gQklHU1VSX0lSUTAgLSBCSUdTVVJfSVJRMTsKLXN0YXRpYyBjb25zdCB1MzIgaW1yX2Jhc2UgPSBCSUdTVVJfSU1SMDsKLXN0YXRpYyBjb25zdCB1MzIgaW1yX29mZnNldCA9IEJJR1NVUl9JTVIwIC0gQklHU1VSX0lNUjE7Ci0KLSNkZWZpbmUgUkVHX05VTShpcnEpICAoKGlycS1CSUdTVVJfMk5ETFZMX0lSUV9MT1cpLzggKQotCi0vKiBMZXZlbCAyIElSUSByb3V0aW5lcyAqLwotc3RhdGljIHZvaWQgZGlzYWJsZV9iaWdzdXJfbDJpcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgICAgICAgdW5zaWduZWQgY2hhciBtYXNrOwotICAgICAgICB1bnNpZ25lZCBjaGFyIGJpdCA9IDEgPDwgKChpcnEtQklHU1VSXzJORExWTF9JUlFfTE9XKSU4KTsKLSAgICAgICAgdW5zaWduZWQgaW50IG1hc2tfcG9ydCA9IGltcl9iYXNlIC0gUkVHX05VTShpcnEpKmltcl9vZmZzZXQ7Ci0KLQlpZihpcnEgPj0gQklHU1VSXzJORExWTF9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl8yTkRMVkxfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICBwcl9kZWJ1ZygiRGlzYWJsZSBMMiBJUlEgJWRcbiIsIGlycSk7Ci0gICAgICAgICAgICAgICAgRElQUklOVEsoMiwiZGlzYWJsZV9iaWdzdXJfbDJpcnE6IElNUj0weCUwOHggbWFzaz0weCV4XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFza19wb3J0LCBiaXQpOwotCi0gICAgICAgICAgICAgICAgLyogRGlzYWJsZSBMMiBJUlEgLSBzZXQgbWFzayBiaXQgKi8KLSAgICAgICAgICAgICAgICBtYXNrID0gaW5iKG1hc2tfcG9ydCkgfCBiaXQ7Ci0gICAgICAgICAgICAgICAgb3V0YihtYXNrLCBtYXNrX3BvcnQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBwcl9kZWJ1ZygiZGlzYWJsZV9iaWdzdXJfbDJpcnE6IEludmFsaWQgSVJRICVkXG4iLCBpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmFibGVfYmlnc3VyX2wyaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgbWFzazsKLSAgICAgICAgdW5zaWduZWQgY2hhciBiaXQgPSAxIDw8ICgoaXJxLUJJR1NVUl8yTkRMVkxfSVJRX0xPVyklOCk7Ci0gICAgICAgIHVuc2lnbmVkIGludCBtYXNrX3BvcnQgPSBpbXJfYmFzZSAtIFJFR19OVU0oaXJxKSppbXJfb2Zmc2V0OwotCi0JaWYoaXJxID49IEJJR1NVUl8yTkRMVkxfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfMk5ETFZMX0lSUV9ISUdIKSB7Ci0gICAgICAgICAgICAgICAgcHJfZGVidWcoIkVuYWJsZSBMMiBJUlEgJWRcbiIsIGlycSk7Ci0gICAgICAgICAgICAgICAgRElQUklOVEsoMiwiZW5hYmxlX2JpZ3N1cl9sMmlycTogSU1SPTB4JTA4eCBtYXNrPTB4JXhcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXNrX3BvcnQsIGJpdCk7Ci0KLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgTDIgSVJRIC0gY2xlYXIgbWFzayBiaXQgKi8KLSAgICAgICAgICAgICAgICBtYXNrID0gaW5iKG1hc2tfcG9ydCkgJiB+Yml0OwotICAgICAgICAgICAgICAgIG91dGIobWFzaywgbWFza19wb3J0KTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgcHJfZGVidWcoImVuYWJsZV9iaWdzdXJfbDJpcnE6IEludmFsaWQgSVJRICVkXG4iLCBpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBtYXNrX2FuZF9hY2tfYmlnc3VyKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHByX2RlYnVnKCJtYXNrX2FuZF9hY2tfYmlnc3VyIElSUSAlZFxuIiwgaXJxKTsKLSAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkKLSAgICAgICAgICAgICAgICBkaXNhYmxlX2JpZ3N1cl9sMWlycShpcnEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKLX0KLQotc3RhdGljIHZvaWQgZW5kX2JpZ3N1cl9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgICAgICAgcHJfZGVidWcoImVuZF9iaWdzdXJfaXJxIElSUSAlZFxuIiwgaXJxKTsKLSAgICAgICAgaWYgKCEoaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiAoSVJRX0RJU0FCTEVEfElSUV9JTlBST0dSRVNTKSkpIHsKLSAgICAgICAgICAgICAgICBpZihpcnEgPj0gQklHU1VSX0lSUV9MT1cgJiYgaXJxIDwgQklHU1VSX0lSUV9ISUdIKQotICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlX2JpZ3N1cl9sMWlycShpcnEpOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKLSAgICAgICAgfQotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfYmlnc3VyX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICB1OCBtYXNrOwotICAgICAgICB1MzIgcmVnOwotCi0gICAgICAgIHByX2RlYnVnKCJzdGFydHVwX2JpZ3N1cl9pcnEgSVJRICVkXG4iLCBpcnEpOwotCi0gICAgICAgIGlmKGlycSA+PSBCSUdTVVJfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIEwxIElSUSAqLwotICAgICAgICAgICAgICAgIGVuYWJsZV9iaWdzdXJfbDFpcnEoaXJxKTsKLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgYWxsIEwyIElSUXMgaW4gdGhpcyBMMSBJUlEgKi8KLSAgICAgICAgICAgICAgICBtYXNrID0gfihiaWdzdXJfbDJpcnFfbWFza1tpcnEtQklHU1VSX0lSUV9MT1ddKTsKLSAgICAgICAgICAgICAgICByZWcgPSBpbXJfYmFzZSAtIGJpZ3N1cl9sMmlycV9yZWdbaXJxLUJJR1NVUl9JUlFfTE9XXSAqIGltcl9vZmZzZXQ7Ci0gICAgICAgICAgICAgICAgbWFzayAmPSBpbmIocmVnKTsKLSAgICAgICAgICAgICAgICBvdXRiKG1hc2sscmVnKTsKLSAgICAgICAgICAgICAgICBESVBSSU5USygyLCJzdGFydHVwX2JpZ3N1cl9pcnE6IElNUj0weCUwOHggbWFzaz0weCV4XG4iLHJlZyxpbmIocmVnKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgLyogRW5hYmxlIHRoZSBMMiBJUlEgLSBjbGVhciBtYXNrIGJpdCAqLwotICAgICAgICAgICAgICAgIGVuYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKLSAgICAgICAgICAgICAgICAvKiBFbmFibGUgdGhlIEwxIGJpdCBtYXNraW5nIHRoaXMgTDIgSVJRICovCi0gICAgICAgICAgICAgICAgZW5hYmxlX2JpZ3N1cl9sMWlycShiaWdzdXJfbDJfbDFfbWFwW2lycS1CSUdTVVJfMk5ETFZMX0lSUV9MT1ddKTsKLSAgICAgICAgICAgICAgICBESVBSSU5USygyLCJzdGFydHVwX2JpZ3N1cl9pcnE6IEwxPSVkIEwyPSVkXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgYmlnc3VyX2wyX2wxX21hcFtpcnEtQklHU1VSXzJORExWTF9JUlFfTE9XXSxpcnEpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9iaWdzdXJfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHByX2RlYnVnKCJzaHV0ZG93bl9iaWdzdXJfaXJxIElSUSAlZFxuIiwgaXJxKTsKLSAgICAgICAgaWYoaXJxID49IEJJR1NVUl9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl9JUlFfSElHSCkKLSAgICAgICAgICAgICAgICBkaXNhYmxlX2JpZ3N1cl9sMWlycShpcnEpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZGlzYWJsZV9iaWdzdXJfbDJpcnEoaXJxKTsKLX0KLQotLyogRGVmaW5lIHRoZSBJUlEgc3RydWN0dXJlcyBmb3IgdGhlIEwxIGFuZCBMMiBJUlEgdHlwZXMgKi8KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgYmlnc3VyX2wxaXJxX3R5cGUgPSB7Ci0JLnR5cGVuYW1lICA9ICJCaWdTdXItQ1BMRC1MZXZlbDEtSVJRIiwKLQkuc3RhcnR1cCA9IHN0YXJ0dXBfYmlnc3VyX2lycSwKLQkuc2h1dGRvd24gPSBzaHV0ZG93bl9iaWdzdXJfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfYmlnc3VyX2wxaXJxLAotCS5kaXNhYmxlID0gZGlzYWJsZV9iaWdzdXJfbDFpcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja19iaWdzdXIsCi0JLmVuZCA9IGVuZF9iaWdzdXJfaXJxCi19OwotCi1zdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGJpZ3N1cl9sMmlycV90eXBlID0gewotCS50eXBlbmFtZSAgPSAiQmlnU3VyLUNQTEQtTGV2ZWwyLUlSUSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX2JpZ3N1cl9pcnEsCi0JLnNodXRkb3duICA9c2h1dGRvd25fYmlnc3VyX2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX2JpZ3N1cl9sMmlycSwKLQkuZGlzYWJsZSA9IGRpc2FibGVfYmlnc3VyX2wyaXJxLAotCS5hY2sgPSBtYXNrX2FuZF9hY2tfYmlnc3VyLAotCS5lbmQgPSBlbmRfYmlnc3VyX2lycQotfTsKLQotCi1zdGF0aWMgdm9pZCBtYWtlX2JpZ3N1cl9sMWlzcih1bnNpZ25lZCBpbnQgaXJxKSB7Ci0KLSAgICAgICAgLyogc2FuaXR5IGNoZWNrIGZpcnN0ICovCi0gICAgICAgIGlmKGlycSA+PSBCSUdTVVJfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBoYW5kbGVyIGluIHRoZSBtYWluIGRlc2NyaXB0aW9uIHRhYmxlICovCi0gICAgICAgICAgICAgICAgaXJxX2Rlc2NbaXJxXS5jaGlwID0gJmJpZ3N1cl9sMWlycV90eXBlOwotICAgICAgICAgICAgICAgIGlycV9kZXNjW2lycV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotICAgICAgICAgICAgICAgIGlycV9kZXNjW2lycV0uYWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBpcnFfZGVzY1tpcnFdLmRlcHRoID0gMTsKLQotICAgICAgICAgICAgICAgIGRpc2FibGVfYmlnc3VyX2wxaXJxKGlycSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHByX2RlYnVnKCJtYWtlX2JpZ3N1cl9sMWlzcjogYmFkIGlycSwgJWRcbiIsIGlycSk7Ci0gICAgICAgIHJldHVybjsKLX0KLQotc3RhdGljIHZvaWQgbWFrZV9iaWdzdXJfbDJpc3IodW5zaWduZWQgaW50IGlycSkgewotCi0gICAgICAgIC8qIHNhbml0eSBjaGVjayBmaXJzdCAqLwotICAgICAgICBpZihpcnEgPj0gQklHU1VSXzJORExWTF9JUlFfTE9XICYmIGlycSA8IEJJR1NVUl8yTkRMVkxfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBoYW5kbGVyIGluIHRoZSBtYWluIGRlc2NyaXB0aW9uIHRhYmxlICovCi0gICAgICAgICAgICAgICAgaXJxX2Rlc2NbaXJxXS5jaGlwID0gJmJpZ3N1cl9sMmlycV90eXBlOwotICAgICAgICAgICAgICAgIGlycV9kZXNjW2lycV0uc3RhdHVzID0gSVJRX0RJU0FCTEVEOwotICAgICAgICAgICAgICAgIGlycV9kZXNjW2lycV0uYWN0aW9uID0gMDsKLSAgICAgICAgICAgICAgICBpcnFfZGVzY1tpcnFdLmRlcHRoID0gMTsKLQotICAgICAgICAgICAgICAgIGRpc2FibGVfYmlnc3VyX2wyaXJxKGlycSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHByX2RlYnVnKCJtYWtlX2JpZ3N1cl9sMmlzcjogYmFkIGlycSwgJWRcbiIsIGlycSk7Ci0gICAgICAgIHJldHVybjsKLX0KLQotLyogVGhlIElSUSdzIHdpbGwgYmUgZGVjb2RlZCBhcyBmb2xsb3dzOgotICogSWYgYSBsZXZlbCAyIGhhbmRsZXIgZXhpc3RzIGFuZCB0aGVyZSBpcyBhbiB1bm1hc2tlZCBhY3RpdmUKLSAqIElSUSwgdGhlIDJuZCBsZXZlbCBoYW5kbGVyIHdpbGwgYmUgY2FsbGVkLgotICogSWYgYSBsZXZlbCAyIGhhbmRsZXIgZG9lcyBub3QgZXhpc3QgZm9yIHRoZSBhY3RpdmUgSVJRCi0gKiB0aGUgMXN0IGxldmVsIGhhbmRsZXIgd2lsbCBiZSBjYWxsZWQuCi0gKi8KLQotaW50IGJpZ3N1cl9pcnFfZGVtdXgoaW50IGlycSkKLXsKLSAgICAgICAgaW50IGRtdXhfaXJxID0gaXJxOwotICAgICAgICB1OCBtYXNrLCBhY3R2X2lycXM7Ci0gICAgICAgIHUzMiByZWdfbnVtOwotCi0gICAgICAgIERJUFJJTlRLKDMsImJpZ3N1cl9pcnFfZGVtdXgsIGlycT0lZFxuIiwgaXJxKTsKLSAgICAgICAgLyogZGVjb2RlIHRoZSAxc3QgbGV2ZWwgSVJRICovCi0gICAgICAgIGlmKGlycSA+PSBCSUdTVVJfSVJRX0xPVyAmJiBpcnEgPCBCSUdTVVJfSVJRX0hJR0gpIHsKLSAgICAgICAgICAgICAgICAvKiBHZXQgY29ycmVzcG9uZGluZyBMMiBJU1IgYml0bWFzayBhbmQgSVNSIG51bWJlciAqLwotICAgICAgICAgICAgICAgIG1hc2sgPSBiaWdzdXJfbDJpcnFfbWFza1tpcnEtQklHU1VSX0lSUV9MT1ddOwotICAgICAgICAgICAgICAgIHJlZ19udW0gPSBiaWdzdXJfbDJpcnFfcmVnW2lycS1CSUdTVVJfSVJRX0xPV107Ci0gICAgICAgICAgICAgICAgLyogZmluZCB0aGUgYWN0aXZlIElSUSdzIChYT1Igd2l0aCBpbmFjdGl2ZSBsZXZlbCkqLwotICAgICAgICAgICAgICAgIGFjdHZfaXJxcyA9IGluYihpc3JfYmFzZS1yZWdfbnVtKmlzcl9vZmZzZXQpIF4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaWdzdXJfbDJfaW5hY3R2X3N0YXRlW3JlZ19udW1dOwotICAgICAgICAgICAgICAgIC8qIGRlY29kZSBhY3RpdmUgSVJRJ3MgKi8KLSAgICAgICAgICAgICAgICBhY3R2X2lycXMgPSBhY3R2X2lycXMgJiBtYXNrICYgfihpbmIoaW1yX2Jhc2UtcmVnX251bSppbXJfb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgLyogaWYgTkVaIHRoZW4gd2UgaGF2ZSBhbiBhY3RpdmUgTDIgSVJRICovCi0gICAgICAgICAgICAgICAgaWYoYWN0dl9pcnFzKSBkbXV4X2lycSA9IGZmeih+YWN0dl9pcnFzKSArIHJlZ19udW0qOCtCSUdTVVJfMk5ETFZMX0lSUV9MT1c7Ci0gICAgICAgICAgICAgICAgLyogaWYgbm8gMm5kIGxldmVsIElSUSBhY3Rpb24sIGJ1dCBoYXMgMXN0IGxldmVsLCB1c2UgMXN0IGxldmVsIGhhbmRsZXIgKi8KLSAgICAgICAgICAgICAgICBpZighaXJxX2Rlc2NbZG11eF9pcnFdLmFjdGlvbiAmJiBpcnFfZGVzY1tpcnFdLmFjdGlvbikKLSAgICAgICAgICAgICAgICAgICAgICAgIGRtdXhfaXJxID0gaXJxOwotICAgICAgICAgICAgICAgIERJUFJJTlRLKDEsImJpZ3N1cl9pcnFfZGVtdXg6IGlycT0lZCBkbXV4X2lycT0lZCBtYXNrPTB4JTA0eCByZWc9JWRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpcnEsIGRtdXhfaXJxLCBtYXNrLCByZWdfbnVtKTsKLSAgICAgICAgfQotI2lmZGVmIENPTkZJR19IRDY0NDY1Ci0gICAgICAgIGRtdXhfaXJxID0gaGQ2NDQ2NV9pcnFfZGVtdXgoZG11eF9pcnEpOwotI2VuZGlmIC8qIENPTkZJR19IRDY0NDY1ICovCi0gICAgICAgIERJUFJJTlRLKDMsImJpZ3N1cl9pcnFfZGVtdXgsIGRlbXV4X2lycT0lZFxuIiwgZG11eF9pcnEpOwotCi0gICAgICAgIHJldHVybiBkbXV4X2lycTsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0vLyAgICAgICAgICAgICAgQmlnIFN1ciBJbml0IFJvdXRpbmVzCi0vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLXZvaWQgX19pbml0IGluaXRfYmlnc3VyX0lSUSh2b2lkKQotewotICAgICAgICBpbnQgaTsKLQotICAgICAgICBpZiAoIU1BQ0hfQklHU1VSKSByZXR1cm47Ci0KLSAgICAgICAgLyogQ3JlYXRlIElTUidzIGZvciBCaWcgU3VyIENQTEQgSVJRJ3MgKi8KLSAgICAgICAgLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCi0gICAgICAgIGZvcihpPUJJR1NVUl9JUlFfTE9XO2k8QklHU1VSX0lSUV9ISUdIO2krKykKLSAgICAgICAgICAgICAgICBtYWtlX2JpZ3N1cl9sMWlzcihpKTsKLQotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJCaWcgU3VyIENQTEQgTDEgaW50ZXJydXB0cyAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgQklHU1VSX0lSUV9MT1csQklHU1VSX0lSUV9ISUdIKTsKLQotICAgICAgICBmb3IoaT1CSUdTVVJfMk5ETFZMX0lSUV9MT1c7aTxCSUdTVVJfMk5ETFZMX0lSUV9ISUdIO2krKykKLSAgICAgICAgICAgICAgICBtYWtlX2JpZ3N1cl9sMmlzcihpKTsKLQotICAgICAgICBwcmludGsoS0VSTl9JTkZPICJCaWcgU3VyIENQTEQgTDIgaW50ZXJydXB0cyAlZCB0byAlZC5cbiIsCi0gICAgICAgICAgICAgICAgQklHU1VSXzJORExWTF9JUlFfTE9XLEJJR1NVUl8yTkRMVkxfSVJRX0hJR0gpOwotCi19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyMjE0MzkuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL2xlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL2JpZ3N1ci9sZWQuYwotICoKLSAqIEJ5IER1c3RpbiBNY0ludGlyZSAoZHVzdGluQHNlbnNvcmlhLmNvbSkgKGMpMjAwMQotICogRGVyaXZlZCBmcm9tIGxlZF9zZS5jIGFuZCBsZWQuYywgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdHVhcnQgTWVuZWZ5IDxzdHVhcnQubWVuZWZ5QHN0LmNvbT4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIEJpZyBTdXIgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9iaWdzdXIvYmlnc3VyLmg+Ci0KLXN0YXRpYyB2b2lkIG1hY2hfbGVkKGludCBwb3NpdGlvbiwgaW50IHZhbHVlKQotewotCWludCB3b3JkOwotCQotCXdvcmQgPSBiaWdzdXJfaW5sKEJJR1NVUl9DU0xSKTsKLQlpZiAodmFsdWUpIHsKLQkJYmlnc3VyX291dGwod29yZCAmIH5CSUdTVVJfTEVELCBCSUdTVVJfQ1NMUik7Ci0JfSBlbHNlIHsKLQkJYmlnc3VyX291dGwod29yZCB8IEJJR1NVUl9MRUQsIEJJR1NVUl9DU0xSKTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0vKiBDeWNsZSB0aGUgTEVEIG9uL29mZiAqLwotdm9pZCBoZWFydGJlYXRfYmlnc3VyKHZvaWQpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGNudCA9IDAsIHBlcmlvZCA9IDAsIGRpc3QgPSAwOwotCi0JaWYgKGNudCA9PSAwIHx8IGNudCA9PSBkaXN0KQotCQltYWNoX2xlZCggLTEsIDEpOwotCWVsc2UgaWYgKGNudCA9PSA3IHx8IGNudCA9PSBkaXN0KzcpCi0JCW1hY2hfbGVkKCAtMSwgMCk7Ci0KLQlpZiAoKytjbnQgPiBwZXJpb2QpIHsKLQkJY250ID0gMDsKLQkJLyogVGhlIGh5cGVyYm9saWMgZnVuY3Rpb24gYmVsb3cgbW9kaWZpZXMgdGhlIGhlYXJ0YmVhdCBwZXJpb2QKLQkJICogbGVuZ3RoIGluIGRlcGVuZGVuY3kgb2YgdGhlIGN1cnJlbnQgKDVtaW4pIGxvYWQuIEl0IGdvZXMKLQkJICogdGhyb3VnaCB0aGUgcG9pbnRzIGYoMCk9MTI2LCBmKDEpPTg2LCBmKDUpPTUxLAotCQkgKiBmKGluZiktPjMwLiAqLwotCQlwZXJpb2QgPSAoKDY3Mjw8RlNISUZUKS8oNSphdmVucnVuWzBdKyg3PDxGU0hJRlQpKSkgKyAzMDsKLQkJZGlzdCA9IHBlcmlvZCAvIDQ7Ci0JfQotfQotI2VuZGlmIC8qIENPTkZJR19IRUFSVEJFQVQgKi8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvYmlnc3VyL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvc2V0dXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcxMWMyMC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9iaWdzdXIvc2V0dXAuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKgotICogQnkgRHVzdGluIE1jSW50aXJlIChkdXN0aW5Ac2Vuc29yaWEuY29tKSAoYykyMDAxCi0gKiAKLSAqIFNldHVwIGFuZCBJUlEgaGFuZGxpbmcgY29kZSBmb3IgdGhlIEhENjQ0NjUgY29tcGFuaW9uIGNoaXAuCi0gKiBieSBHcmVnIEJhbmtzIDxnYmFua3NAcG9ja2V0cGVuZ3VpbnMuY29tPgotICogQ29weXJpZ2h0IChjKSAyMDAwIFBvY2tldFBlbmd1aW5zIEluYwotICoKLSAqIERlcml2ZWQgZnJvbSBzZXR1cF9oZDY0NDY1LmMgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIEdyZWcgQmFua3MgPGdiYW5rc0Bwb2NrZXRwZW5ndWlucy5jb20+Ci0gKiBDb3B5cmlnaHQgKGMpIDIwMDAgUG9ja2V0UGVuZ3VpbnMgSW5jIGFuZAotICogQ29weXJpZ2h0IChDKSAyMDAwIFlBRUdBU0hJIFRha2VzaGkKLSAqIGFuZCBzZXR1cF9jcXJlZWsuYyB3aGljaCBib3JlIG1lc3NhZ2U6Ci0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgIE5paWJlIFl1dGFrYQotICogCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogU2V0dXAgZnVuY3Rpb25zIGZvciBhIEhpdGFjaGkgQmlnIFN1ciBFdmFsdWF0aW9uIEJvYXJkLgotICogCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vYmlnc3VyL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL2hkNjQ0NjUvaGQ2NDQ2NS5oPgotI2luY2x1ZGUgPGFzbS9iaWdzdXIvYmlnc3VyLmg+Ci0KLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLy8JCUJpZyBTdXIgSW5pdCBSb3V0aW5lcwkKLS8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotCi1zdGF0aWMgdm9pZCBfX2luaXQgYmlnc3VyX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCi17Ci0JLyogTWFzayBhbGwgMm5kIGxldmVsIElSUSdzICovCi0Jb3V0YigtMSxCSUdTVVJfSU1SMCk7Ci0Jb3V0YigtMSxCSUdTVVJfSU1SMSk7Ci0Jb3V0YigtMSxCSUdTVVJfSU1SMik7Ci0Jb3V0YigtMSxCSUdTVVJfSU1SMyk7Ci0KLQkvKiBNYXNrIDFzdCBsZXZlbCBpbnRlcnJ1cHRzICovCi0Jb3V0YigtMSxCSUdTVVJfSVJMTVIwKTsKLQlvdXRiKC0xLEJJR1NVUl9JUkxNUjEpOwotCi0jaWYgZGVmaW5lZCAoQ09ORklHX0hENjQ0NjUpICYmIGRlZmluZWQgKENPTkZJR19TRVJJQUwpIAotCS8qIHJlbWFwIElPIHBvcnRzIGZvciBmaXJzdCBJU0Egc2VyaWFsIHBvcnQgdG8gSEQ2NDQ2NSBVQVJUICovCi0JYmlnc3VyX3BvcnRfbWFwKDB4M2Y4LCA4LCBDT05GSUdfSEQ2NDQ2NV9JT0JBU0UgKyAweDgwMDAsIDEpOwotI2VuZGlmIC8qIENPTkZJR19IRDY0NDY1ICYmIENPTkZJR19TRVJJQUwgKi8KLQkvKiBUT0RPOiBzZXR1cCBJREUgcmVnaXN0ZXJzICovCi0JYmlnc3VyX3BvcnRfbWFwKEJJR1NVUl9JREVDVExfSU9QT1JULCAyLCBCSUdTVVJfSUNUTCwgOCk7Ci0JLyogU2V0dXAgdGhlIEV0aGVybmV0IHBvcnQgdG8gQklHU1VSX0VUSEVSX0lPUE9SVCAqLwotCWJpZ3N1cl9wb3J0X21hcChCSUdTVVJfRVRIRVJfSU9QT1JULCAxNiwgQklHU1VSX0VUSFIrQklHU1VSX0VUSEVSX0lPUE9SVCwgMCk7Ci0JLyogc2V0IHBhZ2UgdG8gMSAqLwotCW91dHcoMSwgQklHU1VSX0VUSFIrMHhlKTsKLQkvKiBzZXQgdGhlIElPIHBvcnQgdG8gQklHU1VSX0VUSEVSX0lPUE9SVCAqLwotCW91dHcoQklHU1VSX0VUSEVSX0lPUE9SVDw8MywgQklHU1VSX0VUSFIrMHgyKTsKLX0KLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi1leHRlcm4gdm9pZCBoZWFydGJlYXRfYmlnc3VyKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdF9iaWdzdXJfSVJRKHZvaWQpOwotCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfYmlnc3VyIF9faW5pdG12ID0gewotCS5tdl9uYW1lCQk9ICJCaWcgU3VyIiwKLQkubXZfc2V0dXAJCT0gYmlnc3VyX3NldHVwLAotCi0JLm12X2lzYV9wb3J0MmFkZHIJPSBiaWdzdXJfaXNhX3BvcnQyYWRkciwKLQkubXZfaXJxX2RlbXV4ICAgICAgIAk9IGJpZ3N1cl9pcnFfZGVtdXgsCi0KLQkubXZfaW5pdF9pcnEJCT0gaW5pdF9iaWdzdXJfSVJRLAotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQkubXZfaGVhcnRiZWF0CQk9IGhlYXJ0YmVhdF9iaWdzdXIsCi0jZW5kaWYKLX07Ci1BTElBU19NVihiaWdzdXIpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvTWFrZWZpbGUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ODg5MTUuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L01ha2VmaWxlCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0jCi0jIE1ha2VmaWxlIGZvciB0aGUgRUMzMTA0IHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKLSMKLQotb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubwotCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9lYzMxMDQvaW8uYyBiL2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9pby5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZjg2Mzk0Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9pby5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9pby5jCi0gKiAgRUMzMTA0IGNvbXBhbmlvbiBjaGlwIHN1cHBvcnQKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgUGhpbGlwcCBSdW1wZiA8cHJ1bXBmQHR1eC5vcmc+Ci0gKgotICovCi0vKiBFQzMxMDQgbm90ZToKLSAqIFRoaXMgY29kZSB3YXMgd3JpdHRlbiB3aXRob3V0IGFueSBkb2N1bWVudGF0aW9uIGFib3V0IHRoZSBFQzMxMDQgY2hpcC4gIFdoaWxlCi0gKiBJIGhvcGUgSSBnb3QgbW9zdCBvZiB0aGUgYmFzaWMgZnVuY3Rpb25hbGl0eSByaWdodCwgdGhlIHJlZ2lzdGVyIG5hbWVzIEkgdXNlCi0gKiBhcmUgbW9zdCBsaWtlbHkgY29tcGxldGVseSBkaWZmZXJlbnQgZnJvbSB0aG9zZSBpbiB0aGUgY2hpcCBkb2N1bWVudGF0aW9uLgotICoKLSAqIElmIHlvdSBoYXZlIGFueSBmdXJ0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBFQzMxMDQsIHBsZWFzZSB0ZWxsIG1lCi0gKiAocHJ1bXBmQHR1eC5vcmcpLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9wYWdlLmg+Ci0jaW5jbHVkZSA8YXNtL2VjMzEwNC9lYzMxMDQuaD4KLQotLyoKLSAqIEVDMzEwNCBoYXMgYSByZWFsIElTQSBidXMgd2hpY2ggd2UgcmVkaXJlY3QgbG93IHBvcnQgYWNjZXNzZXMgdG8gKHRoZQotICogYWN0dWFsIGRldmljZSBvbiBtaW5lIGlzIGEgRVNTIDE4NjgsIGFuZCBJIGRvbid0IHdhbnQgdG8gaGFjayB0aGUgZHJpdmVyCi0gKiBtb3JlIHRoYW4gc3RyaWN0bHkgbmVjZXNzYXJ5KS4gIEkgYW0gbm90IGdvaW5nIHRvIGR1cGxpY2F0ZSB0aGUKLSAqIGhhcmQgY29kaW5nIG9mIFBDIGFkZHJlc3NlcyAoZm9yIHRoZSAxNjU1MHMgYXNvKSBoZXJlIHRob3VnaDsgIGl0J3MganVzdAotICogdG9vIHVnbHkuCi0gKi8KLQotI2RlZmluZSBsb3dfcG9ydChwb3J0KSAoKHBvcnQpIDwgMHgxMDAwMCkKLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvcnQyYWRkcih1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0Jc3dpdGNoKHBvcnQgPj4gMTYpIHsKLQljYXNlIDA6Ci0JCXJldHVybiBFQzMxMDRfSVNBX0JBU0UgKyBwb3J0ICogMjsKLQotCQkvKiBYWFggaGFjay4gaXQncyB1bmNsZWFyIHdoYXQgdG8gZG8gYWJvdXQgdGhlIHNlcmlhbCBwb3J0cyAqLwotCWNhc2UgMToKLQkJcmV0dXJuIEVDMzEwNF9CQVNFICsgKHBvcnQmMHhmZmZmKSAqIDQ7Ci0KLQlkZWZhdWx0OgotCQkvKiBYWFggUENNQ0lBICovCi0JCXJldHVybiAwOwotCX0KLX0KLQotdW5zaWduZWQgY2hhciBlYzMxMDRfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQl1OCByZXQ7Ci0KLQlyZXQgPSAqKHZvbGF0aWxlIHU4ICopcG9ydDJhZGRyKHBvcnQpOwotCi0JcmV0dXJuIHJldDsKLX0KLQotdW5zaWduZWQgc2hvcnQgZWMzMTA0X2ludyh1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JQlVHKCk7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgZWMzMTA0X2lubCh1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JQlVHKCk7Ci19Ci0KLXZvaWQgZWMzMTA0X291dGIodW5zaWduZWQgY2hhciBkYXRhLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JKih2b2xhdGlsZSB1OCAqKXBvcnQyYWRkcihwb3J0KSA9IGRhdGE7Ci19Ci0KLXZvaWQgZWMzMTA0X291dHcodW5zaWduZWQgc2hvcnQgZGF0YSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCUJVRygpOwotfQotCi12b2lkIGVjMzEwNF9vdXRsKHVuc2lnbmVkIGxvbmcgZGF0YSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCUJVRygpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L2lycS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmE0ZmYxLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9pcnEuYworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L2lycS5jCi0gKiBFQzMxMDQgY29tcGFuaW9uIGNoaXAgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KLSAqCi0gKi8KLQotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9pcnEuaD4KLSNpbmNsdWRlIDxhc20vZWMzMTA0L2VjMzEwNC5oPgotCi0vKiBUaGlzIGlzIGZvciBkZWJ1Z2dpbmcgbW9zdGx5OyAgaGVyZSdzIHRoZSB0YWJsZSB0aGF0IEkgaW50ZW5kIHRvIGtlZXAKLSAqIGluIGhlcmU6Ci0gKgotICogICBpbmRleCAgICAgIGZ1bmN0aW9uICAgICAgICBiYXNlIGFkZHIgICAgICAgcG93ZXIgICAgICAgICAgIGludGVycnVwdCBiaXQKLSAqICAgICAgIDAgICAgICBwb3dlciAgICAgICAgICAgYjBlYzAwMDAgICAgICAgIC0tLSAgICAgICAgICAgICAwMDAwMDAwMSAodW51c2VkKQotICogICAgICAgMSAgICAgIGlycXMgICAgICAgICAgICBiMGVjMTAwMCAgICAgICAgLS0tICAgICAgICAgICAgIDAwMDAwMDAyICh1bnVzZWQpCi0gKiAgICAgICAyICAgICAgPz8gICAgICAgICAgICAgIGIwZWMyMDAwICAgICAgICBiMGVjMDAwOCAgICAgICAgMDAwMDAwMDQKLSAqICAgICAgIDMgICAgICBQUzIgKDEpICAgICAgICAgYjBlYzMwMDAgICAgICAgIGIwZWMwMDBjICAgICAgICAwMDAwMDAwOAotICogICAgICAgNCAgICAgIFBTMiAoMikgICAgICAgICBiMGVjNDAwMCAgICAgICAgYjBlYzAwMTAgICAgICAgIDAwMDAwMDEwCi0gKiAgICAgICA1ICAgICAgPz8gICAgICAgICAgICAgIGIwZWM1MDAwICAgICAgICBiMGVjMDAxNCAgICAgICAgMDAwMDAwMjAKLSAqICAgICAgIDYgICAgICBJMkMgICAgICAgICAgICAgYjBlYzYwMDAgICAgICAgIGIwZWMwMDE4ICAgICAgICAwMDAwMDA0MAotICogICAgICAgNyAgICAgIHNlcmlhbCAoMSkgICAgICBiMGVjNzAwMCAgICAgICAgYjBlYzAwMWMgICAgICAgIDAwMDAwMDgwCi0gKiAgICAgICA4ICAgICAgc2VyaWFsICgyKSAgICAgIGIwZWM4MDAwICAgICAgICBiMGVjMDAyMCAgICAgICAgMDAwMDAxMDAKLSAqICAgICAgIDkgICAgICBzZXJpYWwgKDMpICAgICAgYjBlYzkwMDAgICAgICAgIGIwZWMwMDI0ICAgICAgICAwMDAwMDIwMAotICogICAgICAxMCAgICAgIHNlcmlhbCAoNCkgICAgICBiMGVjYTAwMCAgICAgICAgYjBlYzAwMjggICAgICAgIDAwMDAwNDAwCi0gKiAgICAgIDEyICAgICAgR1BJTyAoMSkgICAgICAgIGIwZWNjMDAwICAgICAgICBiMGVjMDAzMAotICogICAgICAxMyAgICAgIEdQSU8gKDIpICAgICAgICBiMGVjYzAwMCAgICAgICAgYjBlYzAwMzAKLSAqICAgICAgMTYgICAgICBwY21jaWEgKDEpICAgICAgYjBlZDAwMDAgICAgICAgIGIwZWMwMDQwICAgICAgICAwMDAxMDAwMAotICogICAgICAxNyAgICAgIHBjbWNpYSAoMikgICAgICBiMGVkMTAwMCAgICAgICAgYjBlYzAwNDQgICAgICAgIDAwMDIwMDAwCi0gKi8KLQotLyogSSB1c2VkIHRoZSByZWdpc3RlciBuYW1lcyBmcm9tIGFub3RoZXIgaW50ZXJydXB0IGNvbnRyb2xsZXIgSSB3b3JrZWQgd2l0aCwKLSAqIHNpbmNlIGl0IHNlZW1zIHRvIGJlIGlkZW50aWNhbCB0byB0aGUgZWMzMTA0IGV4Y2VwdCB0aGF0IGFsbCBiaXRzIGFyZQotICogaW52ZXJ0ZWQ6Ci0gKgotICogSVJSOiBJbnRlcnJ1cHQgUmVxdWVzdCBSZWdpc3RlciAocGVuZGluZyBhbmQgZW5hYmxlZCBpbnRlcnJ1cHRzKQotICogSU1SOiBJbnRlcnJ1cHQgTWFzayBSZWdpc3RlciAod2hpY2ggaW50ZXJydXB0cyBhcmUgZW5hYmxlZCkKLSAqIElQUjogSW50ZXJydXB0IFBlbmRpbmcgUmVnaXN0ZXIgKHBlbmRpbmcgaW50ZXJydXB0cywgZXZlbiBkaXNhYmxlZCBvbmVzKQotICoKLSAqIDAgYml0cyBtZWFuIHBlbmRpbmcgb3IgZW5hYmxlZCwgMSBiaXRzIG1lYW4gbm90IHBlbmRpbmcgb3IgZGlzYWJsZWQuICBhbGwKLSAqIElSUXMgc2VlbSB0byBiZSBsZXZlbC10cmlnZ2VyZWQuCi0gKi8KLQotI2RlZmluZSBFQzMxMDRfSVJSIChFQzMxMDRfQkFTRSArIDB4MTAwMCkKLSNkZWZpbmUgRUMzMTA0X0lNUiAoRUMzMTA0X0JBU0UgKyAweDEwMDQpCi0jZGVmaW5lIEVDMzEwNF9JUFIgKEVDMzEwNF9CQVNFICsgMHgxMDA4KQotCi0jZGVmaW5lIGN0cmxfcmVhZGwoYWRkcikgKCoodm9sYXRpbGUgdTMyICopKGFkZHIpKQotI2RlZmluZSBjdHJsX3dyaXRlbChkYXRhLGFkZHIpICgqKHZvbGF0aWxlIHUzMiAqKShhZGRyKSA9IChkYXRhKSkKLSNkZWZpbmUgY3RybF9yZWFkYihhZGRyKSAoKih2b2xhdGlsZSB1OCAqKShhZGRyKSkKLQotc3RhdGljIGNoYXIgKmVjMzEwNF9uYW1lKHVuc2lnbmVkIGluZGV4KQotewotICAgICAgICBzd2l0Y2goaW5kZXgpIHsKLSAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIHJldHVybiAicG93ZXIgbWFuYWdlbWVudCI7Ci0gICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICByZXR1cm4gImludGVycnVwdHMiOwotICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJQUzIgKDEpIjsKLSAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgIHJldHVybiAiUFMyICgyKSI7Ci0gICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICByZXR1cm4gIkkyQyAoMSkiOwotICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJJMkMgKDIpIjsKLSAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgIHJldHVybiAic2VyaWFsICgxKSI7Ci0gICAgICAgIGNhc2UgODoKLSAgICAgICAgICAgICAgICByZXR1cm4gInNlcmlhbCAoMikiOwotICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJzZXJpYWwgKDMpIjsKLSAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInNlcmlhbCAoNCkiOwotICAgICAgICBjYXNlIDE2OgotICAgICAgICAgICAgICAgIHJldHVybiAicGNtY2lhICgxKSI7Ci0gICAgICAgIGNhc2UgMTc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwY21jaWEgKDIpIjsKLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIHN0YXRpYyBjaGFyIGJ1ZlszMl07Ci0KLSAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZiwgInVua25vd24gKCVkKSIsIGluZGV4KTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBidWY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci19Ci0KLWludCBnZXRfcGVuZGluZ19pbnRlcnJ1cHRzKGNoYXIgKmJ1ZikKLXsKLSAgICAgICAgdTMyIGlwcjsKLSAgICAgICAgdTMyIGJpdDsKLSAgICAgICAgY2hhciAqcCA9IGJ1ZjsKLQotICAgICAgICBwICs9IHNwcmludGYocCwgInBlbmRpbmc6ICgiKTsKLQotICAgICAgICBpcHIgPSBjdHJsX2lubChFQzMxMDRfSVBSKTsKLQotICAgICAgICBmb3IgKGJpdCA9IDE7IGJpdCA8IDMyOyBiaXQrKykKLSAgICAgICAgICAgICAgICBpZiAoIShpcHIgJiAoMTw8Yml0KSkpCi0gICAgICAgICAgICAgICAgICAgICAgICBwICs9IHNwcmludGYocCwgIiVzICIsIGVjMzEwNF9uYW1lKGJpdCkpOwotCi0gICAgICAgIHAgKz0gc3ByaW50ZihwLCAiKVxuIik7Ci0KLSAgICAgICAgcmV0dXJuIHAgLSBidWY7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdTMyIGVjMzEwNF9pcnEybWFzayh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICByZXR1cm4gKDEgPDwgKGlycSAtIEVDMzEwNF9JUlFCQVNFKSk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBtYXNrX2VjMzEwNF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgICAgICAgdTMyIG1hc2s7Ci0KLSAgICAgICAgbWFzayA9IGN0cmxfcmVhZGwoRUMzMTA0X0lNUik7Ci0KLSAgICAgICAgbWFzayB8PSBlYzMxMDRfaXJxMm1hc2soaXJxKTsKLQotICAgICAgICBjdHJsX3dyaXRlbChtYXNrLCBFQzMxMDRfSU1SKTsKLX0KLQotc3RhdGljIGlubGluZSB2b2lkIHVubWFza19lYzMxMDRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHUzMiBtYXNrOwotCi0gICAgICAgIG1hc2sgPSBjdHJsX3JlYWRsKEVDMzEwNF9JTVIpOwotCi0gICAgICAgIG1hc2sgJj0gfmVjMzEwNF9pcnEybWFzayhpcnEpOwotCi0gICAgICAgIGN0cmxfd3JpdGVsKG1hc2ssIEVDMzEwNF9JTVIpOwotfQotCi1zdGF0aWMgdm9pZCBkaXNhYmxlX2VjMzEwNF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLSAgICAgICAgbWFza19lYzMxMDRfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9lYzMxMDRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIHVubWFza19lYzMxMDRfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja19lYzMxMDRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIG1hc2tfZWMzMTA0X2lycShpcnEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfZWMzMTA0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICBpZiAoIShpcnFfZGVzY1tpcnFdLnN0YXR1cyAmIChJUlFfRElTQUJMRUR8SVJRX0lOUFJPR1JFU1MpKSkKLSAgICAgICAgICAgICAgICB1bm1hc2tfZWMzMTA0X2lycShpcnEpOwotfQotCi1zdGF0aWMgdW5zaWduZWQgaW50IHN0YXJ0dXBfZWMzMTA0X2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotICAgICAgICB1bm1hc2tfZWMzMTA0X2lycShpcnEpOwotCi0gICAgICAgIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBzaHV0ZG93bl9lYzMxMDRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0gICAgICAgIG1hc2tfZWMzMTA0X2lycShpcnEpOwotCi19Ci0KLXN0YXRpYyBzdHJ1Y3QgaHdfaW50ZXJydXB0X3R5cGUgZWMzMTA0X2ludCA9IHsKLSAgICAgICAgLnR5cGVuYW1lICAgICAgID0gIkVDMzEwNCIsCi0gICAgICAgIC5lbmFibGUgICAgICAgICA9IGVuYWJsZV9lYzMxMDRfaXJxLAotICAgICAgICAuZGlzYWJsZSAgICAgICAgPSBkaXNhYmxlX2VjMzEwNF9pcnEsCi0gICAgICAgIC5hY2sgICAgICAgICAgICA9IG1hc2tfYW5kX2Fja19lYzMxMDRfaXJxLAotICAgICAgICAuZW5kICAgICAgICAgICAgPSBlbmRfZWMzMTA0X2lycSwKLSAgICAgICAgLnN0YXJ0dXAgICAgICAgID0gc3RhcnR1cF9lYzMxMDRfaXJxLAotICAgICAgICAuc2h1dGRvd24gICAgICAgPSBzaHV0ZG93bl9lYzMxMDRfaXJxLAotfTsKLQotLyogWXVjay4gIHRoZSBfZGVtdXggQVBJIGlzIHVnbHkgKi8KLWludCBlYzMxMDRfaXJxX2RlbXV4KGludCBpcnEpCi17Ci0gICAgICAgIGlmIChpcnEgPT0gRUMzMTA0X0lSUSkgewotICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBtYXNrOwotCi0gICAgICAgICAgICAgICAgbWFzayA9IGN0cmxfcmVhZGwoRUMzMTA0X0lSUik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobWFzayA9PSAweGZmZmZmZmZmKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVDMzEwNF9JUlE7Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVDMzEwNF9JUlFCQVNFICsgZmZ6KG1hc2spOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlycTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL2VjMzEwNC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L3NldHVwLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMmJjOTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L3NldHVwLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvZWMzMTA0L3NldHVwLmMKLSAqICBFQzMxMDQgY29tcGFuaW9uIGNoaXAgc3VwcG9ydAotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBQaGlsaXBwIFJ1bXBmIDxwcnVtcGZAdHV4Lm9yZz4KLSAqCi0gKi8KLS8qIEVDMzEwNCBub3RlOgotICogVGhpcyBjb2RlIHdhcyB3cml0dGVuIHdpdGhvdXQgYW55IGRvY3VtZW50YXRpb24gYWJvdXQgdGhlIEVDMzEwNCBjaGlwLiAgV2hpbGUKLSAqIEkgaG9wZSBJIGdvdCBtb3N0IG9mIHRoZSBiYXNpYyBmdW5jdGlvbmFsaXR5IHJpZ2h0LCB0aGUgcmVnaXN0ZXIgbmFtZXMgSSB1c2UKLSAqIGFyZSBtb3N0IGxpa2VseSBjb21wbGV0ZWx5IGRpZmZlcmVudCBmcm9tIHRob3NlIGluIHRoZSBjaGlwIGRvY3VtZW50YXRpb24uCi0gKgotICogSWYgeW91IGhhdmUgYW55IGZ1cnRoZXIgaW5mb3JtYXRpb24gYWJvdXQgdGhlIEVDMzEwNCwgcGxlYXNlIHRlbGwgbWUKLSAqIChwcnVtcGZAdHV4Lm9yZykuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvcGFyYW0uaD4KLSNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaXJxLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9lYzMxMDQuaD4KLQotc3RhdGljIHZvaWQgX19pbml0IGVjMzEwNF9zZXR1cChjaGFyICoqY21kbGluZV9wKQotewotCWNoYXIgc3RyWzhdOwotCWludCBpOwotCi0JZm9yIChpPTA7IGk8ODsgaSsrKQotCQlzdHJbaV0gPSBjdHJsX3JlYWRiKEVDMzEwNF9CQVNFICsgaSk7Ci0KLQlmb3IgKGkgPSBFQzMxMDRfSVJRQkFTRTsgaSA8IEVDMzEwNF9JUlFCQVNFICsgMzI7IGkrKykKLQkJaXJxX2Rlc2NbaV0uaGFuZGxlciA9ICZlYzMxMDRfaW50OwotCi0JcHJpbnRrKCJpbml0aWFsaXppbmcgRUMzMTA0IFwiJS44c1wiIGF0ICUwOHgsIElSUSAlZCwgSVJRIGJhc2UgJWRcbiIsCi0JICAgICAgIHN0ciwgRUMzMTA0X0JBU0UsIEVDMzEwNF9JUlEsIEVDMzEwNF9JUlFCQVNFKTsKLQotCS8qIG1hc2sgYWxsIGludGVycnVwdHMuICB0aGlzIHNob3VsZCBoYXZlIGJlZW4gZG9uZSBieSB0aGUgYm9vdAotCSAqIGxvYWRlciBmb3IgdXMgYnV0IHdlIHdhbnQgdG8gYmUgc3VyZSAuLi4gKi8KLQljdHJsX3dyaXRlbCgweGZmZmZmZmZmLCBFQzMxMDRfSU1SKTsKLX0KLQotLyoKLSAqIFRoZSBNYWNoaW5lIFZlY3RvcgotICovCi1zdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfZWMzMTA0IF9faW5pdG12ID0gewotCS5tdl9uYW1lCT0gIkVDMzEwNCIsCi0JLm12X3NldHVwCT0gZWMzMTA0X3NldHVwLAotCS5tdl9ucl9pcnFzCT0gOTYsCi0KLQkubXZfaW5iCQk9IGVjMzEwNF9pbmIsCi0JLm12X2ludwkJPSBlYzMxMDRfaW53LAotCS5tdl9pbmwJCT0gZWMzMTA0X2lubCwKLQkubXZfb3V0Ygk9IGVjMzEwNF9vdXRiLAotCS5tdl9vdXR3CT0gZWMzMTA0X291dHcsCi0JLm12X291dGwJPSBlYzMxMDRfb3V0bCwKLQotCS5tdl9pcnFfZGVtdXgJPSBlYzMxMDRfaXJxX2RlbXV4LAotfTsKLUFMSUFTX01WKGVjMzEwNCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL01ha2VmaWxlCmluZGV4IDE2NDRlYmUuLjhjZDMxYjUgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9NYWtlZmlsZQpAQCAtMiw3ICsyLDcgQEAKICMgTWFrZWZpbGUgZm9yIHRoZSBJbnRlcmZhY2UgKENUUC9QQ0kvTVBDLVNIMDIpIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBrZXJuZWwKICMKIAotb2JqLXkJIDo9IHNldHVwLm8gcnRjLm8gbGVkLm8KK29iai15CSA6PSBzZXR1cC5vIHJ0Yy5vCiAKIG9iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGYxNTkxLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9sZWQuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAgU2FpdG8uSyAmIEplYW5uZQotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBJbnRlcmZhY2UgTVBDLTEyMTEgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLQotCi1zdGF0aWMgdm9pZCBtYWNoX2xlZChpbnQgcG9zaXRpb24sIGludCB2YWx1ZSkKLXsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKTB4YTIwMDAwMDA7Ci0KLQlpZiAodmFsdWUpIHsKLQkJKnAgfD0gMTsKLQl9IGVsc2UgewotCQkqcCAmPSB+MTsKLQl9Ci19Ci0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0vKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwotdm9pZCBoZWFydGJlYXRfbXBjMTIxMSh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKTB4YTIwMDAwMDA7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCAoMzAwPDxGU0hJRlQpLwotCQkJICgoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSApOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cD0wOwotCQl9IGVsc2UgewotCQkJYml0ICsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGJpdCA9PSAwKSB7Ci0JCQliaXQrKzsKLQkJCXVwPTE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDE8PGJpdDsKLQotfQotI2VuZGlmIC8qIENPTkZJR19IRUFSVEJFQVQgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL21wYzEyMTEvc2V0dXAuYwppbmRleCA3YzNkMWQzLi4xYTA2MDRiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9tcGMxMjExL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvbXBjMTIxMS9zZXR1cC5jCkBAIC0xMCw2ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvaGRyZWcuaD4KICNpbmNsdWRlIDxsaW51eC9pZGUuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9tcGMxMjExL21wYzEyMTEuaD4KQEAgLTI4MSw2ICsyODIsMzIgQEAKIAlyZXR1cm4gMDsKIH0KIAorc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSAweGEyMDAwMDAwLAorCQkuZW5kCT0gMHhhMjAwMDAwMCArIDggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGVhcnRiZWF0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGVhcnRiZWF0IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqbXBjMTIxMV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaGVhcnRiZWF0X2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IG1wYzEyMTFfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhtcGMxMjExX2RldmljZXMsCisJCQkJICAgIEFSUkFZX1NJWkUobXBjMTIxMV9kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKG1wYzEyMTFfZGV2aWNlc19zZXR1cCk7CisKIC8qIGFyY2gvc2gvYm9hcmRzL21wYzEyMTEvcnRjLmMgKi8KIHZvaWQgbXBjMTIxMV90aW1lX2luaXQodm9pZCk7CiAKQEAgLTMxNyw5ICszNDQsNSBAQAogCS5tdl9ucl9pcnFzCQk9IDQ4LAogCS5tdl9pcnFfZGVtdXgJCT0gbXBjMTIxMV9pcnFfZGVtdXgsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfbXBjMTIxMV9JUlEsCi0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfbXBjMTIxMSwKLSNlbmRpZgogfTsKIEFMSUFTX01WKG1wYzEyMTEpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvTWFrZWZpbGUKaW5kZXggNTc0YjAzMS4uM2M5MzAxMiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9NYWtlZmlsZQpAQCAtNCw1ICs0LDQgQEAKIAogb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubwogCi1vYmotJChDT05GSUdfSEVBUlRCRUFUKQkJKz0gbGVkLm8KIG9iai0kKENPTkZJR19QVVNIX1NXSVRDSCkJKz0gcHN3Lm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9pby5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKaW5kZXggMzExY2NjYy4uZjc0ZDJmZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL2lvLmMKQEAgLTExLDIyICsxMSw5IEBACiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9yNzc4MHJwLmg+CiAjaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9ydDJhZHIodW5zaWduZWQgaW50IHBvcnQpCi17Ci0JaWYgKCgweDFmMCA8PSBwb3J0ICYmIHBvcnQgPCAweDFmOCkgfHwgcG9ydCA9PSAweDNmNikKLQkJaWYgKHBvcnQgPT0gMHgzZjYpCi0JCQlyZXR1cm4gKFBBX0FSRUE1X0lPICsgMHg4MGMpOwotCQllbHNlCi0JCQlyZXR1cm4gKFBBX0FSRUE1X0lPICsgMHgxMDAwICsgKChwb3J0LTB4MWYwKSA8PCAxKSk7Ci0JZWxzZQotCQltYXliZWJhZGlvKCh1bnNpZ25lZCBsb25nKXBvcnQpOwotCi0JcmV0dXJuIHBvcnQ7Ci19CiAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBwb3J0ODg3OTZsKHVuc2lnbmVkIGludCBwb3J0LCBpbnQgZmxhZykKIHsKQEAgLTQwLDE4ICsyNyw2IEBACiAJcmV0dXJuIGFkZHI7CiB9CiAKLS8qIFRoZSA3NzgwIFI3NzgwUlAtMSBzZWVtcyB0byBoYXZlIGV2ZXJ5dGhpbmcgaG9va2VkICovCi0vKiB1cCBwcmV0dHkgbm9ybWFsbHkgKG5vdGhpbmcgb24gaGlnaC1ieXRlcyBvbmx5Li4uKSBzbyB0aGlzICovCi0vKiBzaG91bGRuJ3QgYmUgbmVlZGVkICovCi1zdGF0aWMgaW5saW5lIGludCBzaGlmdGVkX3BvcnQodW5zaWduZWQgbG9uZyBwb3J0KQotewotCS8qIEZvciBJREUgcmVnaXN0ZXJzLCB2YWx1ZSBpcyBub3Qgc2hpZnRlZCAqLwotCWlmICgoMHgxZjAgPD0gcG9ydCAmJiBwb3J0IDwgMHgxZjgpIHx8IHBvcnQgPT0gMHgzZjYpCi0JCXJldHVybiAwOwotCWVsc2UKLQkJcmV0dXJuIDE7Ci19Ci0KICNpZiBkZWZpbmVkKENPTkZJR19ORTIwMDApIHx8IGRlZmluZWQoQ09ORklHX05FMjAwMF9NT0RVTEUpCiAjZGVmaW5lIENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkgXAogICAoKHBvcnQgPj0gQVg4ODc5NkxfSU9fQkFTRSkgJiYgKHBvcnQgPCAoQVg4ODc5NkxfSU9fQkFTRSsweDIwKSkpCkBAIC03MCwxMiArNDUsMTAgQEAKIHsKIAlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKIAkJcmV0dXJuIGN0cmxfaW53KHBvcnQ4ODc5NmwocG9ydCwgMCkpICYgMHhmZjsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcmV0dXJuIGN0cmxfaW5iKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXJldHVybiBjdHJsX2luYihwY2lfaW9hZGRyKHBvcnQpKTsKIAotCXJldHVybiBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSkgJiAweGZmOworCXJldHVybiBjdHJsX2ludyhwb3J0KSAmIDB4ZmY7CiB9CiAKIHU4IHI3NzgwcnBfaW5iX3AodW5zaWduZWQgbG9uZyBwb3J0KQpAQCAtODQsMTIgKzU3LDEwIEBACiAKIAlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKIAkJdiA9IGN0cmxfaW53KHBvcnQ4ODc5NmwocG9ydCwgMCkpICYgMHhmZjsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJdiA9IGN0cmxfaW5iKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXYgPSBjdHJsX2luYihwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCXYgPSBjdHJsX2ludyhwb3J0MmFkcihwb3J0KSkgJiAweGZmOworCQl2ID0gY3RybF9pbncocG9ydCkgJiAweGZmOwogCiAJY3RybF9kZWxheSgpOwogCkBAIC05OCw4MCArNjksNTYgQEAKIAogdTE2IHI3NzgwcnBfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcmV0dXJuIGN0cmxfaW53KHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQogCQlyZXR1cm4gY3RybF9pbncocGNpX2lvYWRkcihwb3J0KSk7Ci0JZWxzZQotCQltYXliZWJhZGlvKHBvcnQpOwogCi0JcmV0dXJuIDA7CisJcmV0dXJuIGN0cmxfaW53KHBvcnQpOwogfQogCiB1MzIgcjc3ODBycF9pbmwodW5zaWduZWQgbG9uZyBwb3J0KQogewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQlyZXR1cm4gY3RybF9pbmwocG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXJldHVybiBjdHJsX2lubChwY2lfaW9hZGRyKHBvcnQpKTsKLQllbHNlCi0JCW1heWJlYmFkaW8ocG9ydCk7CiAKLQlyZXR1cm4gMDsKKwlyZXR1cm4gY3RybF9pbmwocG9ydCk7CiB9CiAKIHZvaWQgcjc3ODBycF9vdXRiKHU4IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDg4Nzk2bChwb3J0LCAwKSk7Ci0JZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCWN0cmxfb3V0Yih2YWx1ZSwgcG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKIAkJY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOworCQljdHJsX291dGIodmFsdWUsIHBvcnQpOwogfQogCiB2b2lkIHI3NzgwcnBfb3V0Yl9wKHU4IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCiB7CiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDg4Nzk2bChwb3J0LCAwKSk7Ci0JZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCWN0cmxfb3V0Yih2YWx1ZSwgcG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCisJZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKIAkJY3RybF9vdXRiKHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydDJhZHIocG9ydCkpOworCQljdHJsX291dGIodmFsdWUsIHBvcnQpOwogCiAJY3RybF9kZWxheSgpOwogfQogCiB2b2lkIHI3NzgwcnBfb3V0dyh1MTYgdmFsdWUsIHVuc2lnbmVkIGxvbmcgcG9ydCkKIHsKLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJY3RybF9vdXR3KHZhbHVlLCBwb3J0KTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwlpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSkKIAkJY3RybF9vdXR3KHZhbHVlLCBwY2lfaW9hZGRyKHBvcnQpKTsKIAllbHNlCi0JCW1heWJlYmFkaW8ocG9ydCk7CisJCWN0cmxfb3V0dyh2YWx1ZSwgcG9ydCk7CiB9CiAKIHZvaWQgcjc3ODBycF9vdXRsKHUzMiB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQogewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQljdHJsX291dGwodmFsdWUsIHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQogCQljdHJsX291dGwodmFsdWUsIHBjaV9pb2FkZHIocG9ydCkpOwogCWVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKKwkJY3RybF9vdXRsKHZhbHVlLCBwb3J0KTsKIH0KIAogdm9pZCByNzc4MHJwX2luc2IodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCkBAIC0xODMsMTYgKzEzMCwxMyBAQAogCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQ4ODc5NmwocG9ydCwgMCk7CiAJCXdoaWxlIChjb3VudC0tKQogCQkJKmJ1ZisrID0gKnAgJiAweGZmOwotCX0gZWxzZSBpZiAoUFhTRUcocG9ydCkpIHsKLQkJd2hpbGUgKGNvdW50LS0pCi0JCQkqYnVmKysgPSAqKHZvbGF0aWxlIHU4ICopcG9ydDsKLQl9IGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7CisJfSBlbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKSB7CiAJCXZvbGF0aWxlIHU4ICpicCA9ICh2b2xhdGlsZSB1OCAqKXBjaV9pb2FkZHIocG9ydCk7CiAKIAkJd2hpbGUgKGNvdW50LS0pCiAJCQkqYnVmKysgPSAqYnA7CiAJfSBlbHNlIHsKLQkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0MmFkcihwb3J0KTsKKwkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0OwogCQl3aGlsZSAoY291bnQtLSkKIAkJCSpidWYrKyA9ICpwICYgMHhmZjsKIAl9CkBAIC0yMDUsMzAgKzE0OSwyNiBAQAogCiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDg4Nzk2bChwb3J0LCAxKTsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0OwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdTE2ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCi0JCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDJhZHIocG9ydCk7CisJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDsKIAogCXdoaWxlIChjb3VudC0tKQogCQkqYnVmKysgPSAqcDsKKworCWZsdXNoX2RjYWNoZV9hbGwoKTsKIH0KIAogdm9pZCByNzc4MHJwX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICpkc3QsIHVuc2lnbmVkIGxvbmcgY291bnQpCiB7Ci0JdTMyICpidWYgPSBkc3Q7Ci0KLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkgeworCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKSB7CiAJCXZvbGF0aWxlIHUzMiAqcCA9ICh2b2xhdGlsZSB1MzIgKilwY2lfaW9hZGRyKHBvcnQpOworCQl1MzIgKmJ1ZiA9IGRzdDsKIAogCQl3aGlsZSAoY291bnQtLSkKIAkJCSpidWYrKyA9ICpwOwotCX0gZWxzZQotCQltYXliZWJhZGlvKHBvcnQpOworCX0KIH0KIAogdm9pZCByNzc4MHJwX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQpAQCAtMjQwLDE5ICsxODAsMTQgQEAKIAkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0ODg3OTZsKHBvcnQsIDApOwogCQl3aGlsZSAoY291bnQtLSkKIAkJCSpwID0gKmJ1ZisrOwotCX0gZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCXdoaWxlIChjb3VudC0tKQotCQkJY3RybF9vdXRiKCpidWYrKywgcG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKKwl9IGVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpIHsKIAkJdm9sYXRpbGUgdTggKmJwID0gKHZvbGF0aWxlIHU4ICopcGNpX2lvYWRkcihwb3J0KTsKIAogCQl3aGlsZSAoY291bnQtLSkKIAkJCSpicCA9ICpidWYrKzsKLQl9IGVsc2UgewotCQlwID0gKHZvbGF0aWxlIHUxNiAqKXBvcnQyYWRyKHBvcnQpOworCX0gZWxzZQogCQl3aGlsZSAoY291bnQtLSkKLQkJCSpwID0gKmJ1ZisrOwotCX0KKwkJCWN0cmxfb3V0YigqYnVmKyssIHBvcnQpOwogfQogCiB2b2lkIHI3NzgwcnBfb3V0c3codW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICpzcmMsIHVuc2lnbmVkIGxvbmcgY291bnQpCkBAIC0yNjIsNDAgKzE5NywzNyBAQAogCiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDg4Nzk2bChwb3J0LCAxKTsKLQllbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1MTYgKilwb3J0OwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQorCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkpCiAJCXAgPSAodm9sYXRpbGUgdTE2ICopcGNpX2lvYWRkcihwb3J0KTsKIAllbHNlCi0JCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDJhZHIocG9ydCk7CisJCXAgPSAodm9sYXRpbGUgdTE2ICopcG9ydDsKIAogCXdoaWxlIChjb3VudC0tKQogCQkqcCA9ICpidWYrKzsKKworCWZsdXNoX2RjYWNoZV9hbGwoKTsKIH0KIAogdm9pZCByNzc4MHJwX291dHNsKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqc3JjLCB1bnNpZ25lZCBsb25nIGNvdW50KQogewogCWNvbnN0IHUzMiAqYnVmID0gc3JjOworCXUzMiAqcDsKIAotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7Ci0JCXZvbGF0aWxlIHUzMiAqcCA9ICh2b2xhdGlsZSB1MzIgKilwY2lfaW9hZGRyKHBvcnQpOworCWlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQorCQlwID0gKHUzMiAqKXBjaV9pb2FkZHIocG9ydCk7CisJZWxzZQorCQlwID0gKHUzMiAqKXBvcnQ7CiAKLQkJd2hpbGUgKGNvdW50LS0pCi0JCQkqcCA9ICpidWYrKzsKLQl9IGVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKKwl3aGlsZSAoY291bnQtLSkKKwkJY3RybF9vdXRsKCpidWYrKywgKHVuc2lnbmVkIGxvbmcpcCk7CiB9CiAKIHZvaWQgX19pb21lbSAqcjc3ODBycF9pb3BvcnRfbWFwKHVuc2lnbmVkIGxvbmcgcG9ydCwgdW5zaWduZWQgaW50IHNpemUpCiB7CiAJaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCiAJCXJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDg4Nzk2bChwb3J0LCBzaXplID4gMSk7Ci0JZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCXJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKKwllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpKQogCQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBjaV9pb2FkZHIocG9ydCk7CiAKLQlyZXR1cm4gKHZvaWQgX19pb21lbSAqKXBvcnQyYWRyKHBvcnQpOworCXJldHVybiAodm9pZCBfX2lvbWVtICopcG9ydDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwMGEyNS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgUmVuZXNhcyBTb2x1dGlvbnMgSElHSExBTkRFUiBSNzc4MFJQLTEgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgPGFzbS9yNzc4MHJwL3I3NzgwcnAuaD4KLQotLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlnZXIvU3VuIHBhdHRlcm4gKi8KLXZvaWQgaGVhcnRiZWF0X3I3NzgwcnAodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQQV9PQkxFRDsKLQlzdGF0aWMgdW5zaWduZWQgYml0ID0gMCwgdXAgPSAxOwotCXVuc2lnbmVkIGJpdF9wb3NbXSA9IHsyLCAxLCAwLCAzLCA2LCA1LCA0LCA3fTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpCi0JCXJldHVybjsKLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LCBmKGludCktPjExMAotCSAqLwotCXBlcmlvZCA9IDExMCAtICgoMzAwIDw8IEZTSElGVCkvKChhdmVucnVuWzBdLzUpICsgKDM8PEZTSElGVCkpKTsKLQotCSpwID0gMSA8PCBiaXRfcG9zW2JpdF07Ci0JaWYgKHVwKQotCQlpZiAoYml0ID09IDcpIHsKLQkJCWJpdC0tOwotCQkJdXAgPSAwOwotCQl9IGVsc2UKLQkJCWJpdCsrOwotCWVsc2UgaWYgKGJpdCA9PSAwKQotCQl1cCA9IDE7Ci0JZWxzZQotCQliaXQtLTsKLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcjc3ODBycC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKaW5kZXggOWY4OWM4ZC4uMGQ3NGRiOSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9yNzc4MHJwL3NldHVwLmMKQEAgLTIsNyArMiw3IEBACiAgKiBhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3I3NzgwcnAvc2V0dXAuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMiBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KLSAqIENvcHlyaWdodCAoQykgMjAwNSwgMjAwNiBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDUgLSAyMDA3IFBhdWwgTXVuZHQKICAqCiAgKiBSZW5lc2FzIFNvbHV0aW9ucyBIaWdobGFuZGVyIFI3NzgwUlAtMSBTdXBwb3J0LgogICoKQEAgLTEyLDEyICsxMiwxMiBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9yNzc4MHJwLmg+CiAjaW5jbHVkZSA8YXNtL2Nsb2NrLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLWV4dGVybiB2b2lkIGhlYXJ0YmVhdF9yNzc4MHJwKHZvaWQpOwogZXh0ZXJuIHZvaWQgaW5pdF9yNzc4MHJwX0lSUSh2b2lkKTsKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBtNjY1OTZfdXNiX2hvc3RfcmVzb3VyY2VzW10gPSB7CkBAIC00NiwxNCArNDYsMTQgQEAKIAogc3RhdGljIHN0cnVjdCByZXNvdXJjZSBjZl9pZGVfcmVzb3VyY2VzW10gPSB7CiAJWzBdID0gewotCQkuc3RhcnQJPSAweDFmMCwKLQkJLmVuZAk9IDB4MWYwICsgOCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKKwkJLnN0YXJ0CT0gUEFfQVJFQTVfSU8gKyAweDEwMDAsCisJCS5lbmQJPSBQQV9BUkVBNV9JTyArIDB4MTAwMCArIDB4MDggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKIAl9LAogCVsxXSA9IHsKLQkJLnN0YXJ0CT0gMHgxZjAgKyAweDIwNiwKLQkJLmVuZAk9IDB4MWYwICsgOCArIDB4MjA2ICsgOCwKLQkJLmZsYWdzCT0gSU9SRVNPVVJDRV9JTywKKwkJLnN0YXJ0CT0gUEFfQVJFQTVfSU8gKyAweDgwYywKKwkJLmVuZAk9IFBBX0FSRUE1X0lPICsgMHg4MGMgKyAweDE2IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCiAJfSwKIAlbMl0gPSB7CiAjaWZkZWYgQ09ORklHX1NIX1I3NzgwTVAKQEAgLTY1LDE2ICs2NSw0NCBAQAogCX0sCiB9OwogCitzdGF0aWMgc3RydWN0IHBhdGFfcGxhdGZvcm1faW5mbyBwYXRhX2luZm8gPSB7CisJLmlvcG9ydF9zaGlmdAk9IDEsCit9OworCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjZl9pZGVfZGV2aWNlICA9IHsKIAkubmFtZQkJPSAicGF0YV9wbGF0Zm9ybSIsCiAJLmlkCQk9IC0xLAogCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjZl9pZGVfcmVzb3VyY2VzKSwKIAkucmVzb3VyY2UJPSBjZl9pZGVfcmVzb3VyY2VzLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBhdGFfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgaGVhcnRiZWF0X2JpdF9wb3NbXSA9IHsgMiwgMSwgMCwgMywgNiwgNSwgNCwgNyB9OworCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGhlYXJ0YmVhdF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFBBX09CTEVELAorCQkuZW5kCT0gUEFfT0JMRUQgKyBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9iaXRfcG9zKSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoZWFydGJlYXRfZGV2aWNlID0geworCS5uYW1lCQk9ICJoZWFydGJlYXQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9IGhlYXJ0YmVhdF9iaXRfcG9zLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCiB9OwogCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcjc3ODBycF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKIAkmbTY2NTk2X3VzYl9ob3N0X2RldmljZSwKIAkmY2ZfaWRlX2RldmljZSwKKwkmaGVhcnRiZWF0X2RldmljZSwKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IHI3NzgwcnBfZGV2aWNlc19zZXR1cCh2b2lkKQpAQCAtMTQ4LDcgKzE3Niw3IEBACiAjaWZuZGVmIENPTkZJR19TSF9SNzc4ME1QCiAJY3RybF9vdXR3KDB4MDAwMSwgUEFfU0RQT1cpOwkvKiBTRCBQb3dlciBPTiAqLwogI2VuZGlmCi0JY3RybF9vdXR3KGN0cmxfaW53KFBBX0lWRFJDVEwpIHwgMHgwMTAwLCBQQV9JVkRSQ1RMKTsJLyogU2kxMzExMiAqLworCWN0cmxfb3V0dyhjdHJsX2ludyhQQV9JVkRSQ1RMKSB8IDB4MDEsIFBBX0lWRFJDVEwpOwkvKiBTaTEzMTEyICovCiAKIAlwbV9wb3dlcl9vZmYgPSByNzc4MHJwX3Bvd2VyX29mZjsKIH0KQEAgLTE4NSw4ICsyMTMsNSBAQAogCiAJLm12X2lvcG9ydF9tYXAJCT0gcjc3ODBycF9pb3BvcnRfbWFwLAogCS5tdl9pbml0X2lycQkJPSBpbml0X3I3NzgwcnBfSVJRLAotI2lmZGVmIENPTkZJR19IRUFSVEJFQVQKLQkubXZfaGVhcnRiZWF0CQk9IGhlYXJ0YmVhdF9yNzc4MHJwLAotI2VuZGlmCiB9OwogQUxJQVNfTVYocjc3ODBycCkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9NYWtlZmlsZQppbmRleCA2ODZmYzllLi4wZDRjNzVhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL01ha2VmaWxlCkBAIC0yLDUgKzIsNCBAQAogIyBNYWtlZmlsZSBmb3IgdGhlIFJUUzc3NTFSMkQgc3BlY2lmaWMgcGFydHMgb2YgdGhlIGtlcm5lbAogIwogCi1vYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi1vYmotJChDT05GSUdfSEVBUlRCRUFUKSArPSBsZWQubworb2JqLXkJIDo9IHNldHVwLm8gaXJxLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pby5jIGIvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lvLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyNTA3YTguLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lvLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwMSAgSWFuIGRhIFNpbHZhLCBKZXJlbXkgU2llZ2VsCi0gKiBCYXNlZCBsYXJnZWx5IG9uIGlvX3NlLmMuCi0gKgotICogSS9PIHJvdXRpbmUgZm9yIFJlbmVzYXMgVGVjaG5vbG9neSBzYWxlcyBSVFM3NzUxUjJELgotICoKLSAqIEluaXRpYWwgdmVyc2lvbiBvbmx5IHRvIHN1cHBvcnQgTEFOIGFjY2Vzczsgc29tZQotICogcGxhY2Vob2xkZXIgY29kZSBmcm9tIGlvX3J0czc3NTFyMmQuYyBsZWZ0IGluIHdpdGggdGhlCi0gKiBleHBlY3RhdGlvbiBvZiBsYXRlciBTdXBlcklPIGFuZCBQQ01DSUEgYWNjZXNzLgotICovCi0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wY2kuaD4KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGFzbS9ydHM3NzUxcjJkLmg+Ci0jaW5jbHVkZSA8YXNtL2FkZHJzcGFjZS5oPgotCi0vKgotICogVGhlIDc3NTFSIFJUUzc3NTFSMkQgdXNlcyB0aGUgYnVpbHQtaW4gUENJIGNvbnRyb2xsZXIgKFBDSUMpCi0gKiBvZiB0aGUgNzc1MVIgcHJvY2Vzc29yLCBhbmQgaGFzIGEgU3VwZXJJTyBhY2Nlc3NpYmxlIHZpYSB0aGUgUENJLgotICogVGhlIGJvYXJkIGFsc28gaW5jbHVkZXMgYSBQQ01DSUEgY29udHJvbGxlciBvbiBpdHMgbWVtb3J5IGJ1cywKLSAqIGxpa2UgdGhlIG90aGVyIFNvbHV0aW9uIEVuZ2luZSBib2FyZHMuCi0gKi8KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHBvcnQyYWRyKHVuc2lnbmVkIGludCBwb3J0KQotewotCWlmICgoMHgxZjAgPD0gcG9ydCAmJiBwb3J0IDwgMHgxZjgpIHx8IHBvcnQgPT0gMHgzZjYpCi0JCWlmIChwb3J0ID09IDB4M2Y2KQotCQkJcmV0dXJuIChQQV9BUkVBNV9JTyArIDB4ODBjKTsKLQkJZWxzZQotCQkJcmV0dXJuIChQQV9BUkVBNV9JTyArIDB4MTAwMCArICgocG9ydC0weDFmMCkgPDwgMSkpOwotCWVsc2UKLQkJbWF5YmViYWRpbygodW5zaWduZWQgbG9uZylwb3J0KTsKLQotCXJldHVybiBwb3J0OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgcG9ydDg4Nzk2bCh1bnNpZ25lZCBpbnQgcG9ydCwgaW50IGZsYWcpCi17Ci0JdW5zaWduZWQgbG9uZyBhZGRyOwotCi0JaWYgKGZsYWcpCi0JCWFkZHIgPSBQQV9BWDg4Nzk2TCArICgocG9ydCAtIEFYODg3OTZMX0lPX0JBU0UpIDw8IDEpOwotCWVsc2UKLQkJYWRkciA9IFBBX0FYODg3OTZMICsgKChwb3J0IC0gQVg4ODc5NkxfSU9fQkFTRSkgPDwgMSkgKyAweDEwMDA7Ci0KLQlyZXR1cm4gYWRkcjsKLX0KLQotLyogVGhlIDc3NTFSIFJUUzc3NTFSMkQgc2VlbXMgdG8gaGF2ZSBldmVyeXRoaW5nIGhvb2tlZCAqLwotLyogdXAgcHJldHR5IG5vcm1hbGx5IChub3RoaW5nIG9uIGhpZ2gtYnl0ZXMgb25seS4uLikgc28gdGhpcyAqLwotLyogc2hvdWxkbid0IGJlIG5lZWRlZCAqLwotc3RhdGljIGlubGluZSBpbnQgc2hpZnRlZF9wb3J0KHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQkvKiBGb3IgSURFIHJlZ2lzdGVycywgdmFsdWUgaXMgbm90IHNoaWZ0ZWQgKi8KLQlpZiAoKDB4MWYwIDw9IHBvcnQgJiYgcG9ydCA8IDB4MWY4KSB8fCBwb3J0ID09IDB4M2Y2KQotCQlyZXR1cm4gMDsKLQllbHNlCi0JCXJldHVybiAxOwotfQotCi0jaWYgZGVmaW5lZChDT05GSUdfTkUyMDAwKSB8fCBkZWZpbmVkKENPTkZJR19ORTIwMDBfTU9EVUxFKQotI2RlZmluZSBDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpIFwKLSAgKChwb3J0ID49IEFYODg3OTZMX0lPX0JBU0UpICYmIChwb3J0IDwgKEFYODg3OTZMX0lPX0JBU0UrMHgyMCkpKQotI2Vsc2UKLSNkZWZpbmUgQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSAoMCkKLSNlbmRpZgotCi0vKgotICogR2VuZXJhbCBvdXRsaW5lOiByZW1hcCByZWFsbHkgbG93IHN0dWZmIFtldmVudHVhbGx5XSB0byBTdXBlcklPLAotICogc3R1ZmYgaW4gUENJIElPIHNwYWNlIChhdCBvciBhYm92ZSB3aW5kb3cgYXQgcGNpLmg6UENJQklPU19NSU5fSU8pCi0gKiBpcyBtYXBwZWQgdGhyb3VnaCB0aGUgUENJIElPIHdpbmRvdy4gIFN0dWZmIHdpdGggaGlnaCBiaXRzIChQWFNFRykKLSAqIHNob3VsZCBiZSB3YXkgYmV5b25kIHRoZSB3aW5kb3csIGFuZCBpcyB1c2VkICB3L28gdHJhbnNsYXRpb24gZm9yCi0gKiBjb21wYXRpYmlsaXR5LgotICovCi11bnNpZ25lZCBjaGFyIHJ0czc3NTFyMmRfaW5iKHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJcmV0dXJuICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDg4Nzk2bChwb3J0LCAwKSkgJiAweGZmOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQlyZXR1cm4gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JZWxzZQotCQlyZXR1cm4gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSAmIDB4ZmYpOwotfQotCi11bnNpZ25lZCBjaGFyIHJ0czc3NTFyMmRfaW5iX3AodW5zaWduZWQgbG9uZyBwb3J0KQotewotCXVuc2lnbmVkIGNoYXIgdjsKLQotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQl2ID0gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDApKSAmIDB4ZmY7Ci0gICAgICAgIGVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQl2ID0gKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJdiA9ICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JZWxzZQotCQl2ID0gKCoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSAmIDB4ZmYpOwotCi0JY3RybF9kZWxheSgpOwotCi0JcmV0dXJuIHY7Ci19Ci0KLXVuc2lnbmVkIHNob3J0IHJ0czc3NTFyMmRfaW53KHVuc2lnbmVkIGxvbmcgcG9ydCkKLXsKLQlpZiAoQ0hFQ0tfQVg4ODc5NkxfUE9SVChwb3J0KSkKLQkJbWF5YmViYWRpbyhwb3J0KTsKLSAgICAgICAgZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwY2lfaW9hZGRyKHBvcnQpOwotCWVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQotCXJldHVybiAwOwotfQotCi11bnNpZ25lZCBpbnQgcnRzNzc1MXIyZF9pbmwodW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJcmV0dXJuICoodm9sYXRpbGUgdW5zaWduZWQgbG9uZyAqKXBvcnQ7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCXJldHVybiAqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwY2lfaW9hZGRyKHBvcnQpOwotCWVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKLQotCXJldHVybiAwOwotfQotCi12b2lkIHJ0czc3NTFyMmRfb3V0Yih1bnNpZ25lZCBjaGFyIHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpCi17Ci0JaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCi0JCSooKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDg4Nzk2bChwb3J0LCAwKSkgPSB2YWx1ZTsKLSAgICAgICAgZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBjaGFyICopcGNpX2lvYWRkcihwb3J0KSA9IHZhbHVlOwotCWVsc2UKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQyYWRyKHBvcnQpID0gdmFsdWU7Ci19Ci0KLXZvaWQgcnRzNzc1MXIyZF9vdXRiX3AodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQkqKCh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ4ODc5NmwocG9ydCwgMCkpID0gdmFsdWU7Ci0gICAgICAgIGVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKilwb3J0ID0gdmFsdWU7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKXBjaV9pb2FkZHIocG9ydCkgPSB2YWx1ZTsKLQllbHNlCi0JCSoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0MmFkcihwb3J0KSA9IHZhbHVlOwotCi0JY3RybF9kZWxheSgpOwotfQotCi12b2lkIHJ0czc3NTFyMmRfb3V0dyh1bnNpZ25lZCBzaG9ydCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQgPSB2YWx1ZTsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCkgPSB2YWx1ZTsKLQllbHNlCi0JCW1heWJlYmFkaW8ocG9ydCk7Ci19Ci0KLXZvaWQgcnRzNzc1MXIyZF9vdXRsKHVuc2lnbmVkIGludCB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotICAgICAgICBlbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJKih2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopcG9ydCA9IHZhbHVlOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKQotCQkqKHZvbGF0aWxlIHVuc2lnbmVkIGxvbmcgKilwY2lfaW9hZGRyKHBvcnQpID0gdmFsdWU7Ci0JZWxzZQotCQltYXliZWJhZGlvKHBvcnQpOwotfQotCi12b2lkIHJ0czc3NTFyMmRfaW5zYih1bnNpZ25lZCBsb25nIHBvcnQsIHZvaWQgKmFkZHIsIHVuc2lnbmVkIGxvbmcgY291bnQpCi17Ci0JdW5zaWduZWQgbG9uZyBhID0gKHVuc2lnbmVkIGxvbmcpYWRkcjsKLQl2b2xhdGlsZSBfX3U4ICpicDsKLQl2b2xhdGlsZSBfX3UxNiAqcDsKLQotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKSB7Ci0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDApOwotCQl3aGlsZSAoY291bnQtLSkKLQkJCWN0cmxfb3V0YigqcCAmIDB4ZmYsIGErKyk7Ci0JfSBlbHNlIGlmIChQWFNFRyhwb3J0KSkKLQkJd2hpbGUgKGNvdW50LS0pCi0JCQljdHJsX291dGIoY3RybF9pbmIocG9ydCksIGErKyk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKLQkJYnAgPSAoX191OCAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJY3RybF9vdXRiKCpicCwgYSsrKTsKLQl9IGVsc2UgewotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJY3RybF9vdXRiKCpwICYgMHhmZiwgYSsrKTsKLQl9Ci19Ci0KLXZvaWQgcnRzNzc1MXIyZF9pbnN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGEgPSAodW5zaWduZWQgbG9uZylhZGRyOwotCXZvbGF0aWxlIF9fdTE2ICpwOwotCi0JaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCi0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDEpOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JZWxzZQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0Jd2hpbGUgKGNvdW50LS0pCi0JCWN0cmxfb3V0dygqcCwgYSsrKTsKLX0KLQotdm9pZCBydHM3NzUxcjJkX2luc2wodW5zaWduZWQgbG9uZyBwb3J0LCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0KLQkJd2hpbGUgKGNvdW50LS0pIHsKLQkJCWN0cmxfb3V0bChjdHJsX2lubChwY2lfaW9hZGRyKHBvcnQpKSwgYSk7Ci0JCQlhICs9IDQ7Ci0JCX0KLQl9IGVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKLX0KLQotdm9pZCBydHM3NzUxcjJkX291dHNiKHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGEgPSAodW5zaWduZWQgbG9uZylhZGRyOwotCXZvbGF0aWxlIF9fdTggKmJwOwotCXZvbGF0aWxlIF9fdTE2ICpwOwotCi0JaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpIHsKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBvcnQ4ODc5NmwocG9ydCwgMCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJKnAgPSBjdHJsX2luYihhKyspOwotCX0gZWxzZSBpZiAoUFhTRUcocG9ydCkpCi0JCXdoaWxlIChjb3VudC0tKQotCQkJY3RybF9vdXRiKGErKywgcG9ydCk7Ci0JZWxzZSBpZiAoaXNfcGNpX2lvYWRkcihwb3J0KSB8fCBzaGlmdGVkX3BvcnQocG9ydCkpIHsKLQkJYnAgPSAoX191OCAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJKmJwID0gY3RybF9pbmIoYSsrKTsKLQl9IGVsc2UgewotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0JCXdoaWxlIChjb3VudC0tKQotCQkJKnAgPSBjdHJsX2luYihhKyspOwotCX0KLX0KLQotdm9pZCBydHM3NzUxcjJkX291dHN3KHVuc2lnbmVkIGxvbmcgcG9ydCwgY29uc3Qgdm9pZCAqYWRkciwgdW5zaWduZWQgbG9uZyBjb3VudCkKLXsKLQl1bnNpZ25lZCBsb25nIGEgPSAodW5zaWduZWQgbG9uZylhZGRyOwotCXZvbGF0aWxlIF9fdTE2ICpwOwotCi0JaWYgKENIRUNLX0FYODg3OTZMX1BPUlQocG9ydCkpCi0JCXAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilwb3J0ODg3OTZsKHBvcnQsIDEpOwotCWVsc2UgaWYgKFBYU0VHKHBvcnQpKQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDsKLQllbHNlIGlmIChpc19wY2lfaW9hZGRyKHBvcnQpIHx8IHNoaWZ0ZWRfcG9ydChwb3J0KSkKLQkJcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKXBjaV9pb2FkZHIocG9ydCk7Ci0JZWxzZQotCQlwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopcG9ydDJhZHIocG9ydCk7Ci0KLQl3aGlsZSAoY291bnQtLSkgewotCQljdHJsX291dHcoKnAsIGEpOwotCQlhICs9IDI7Ci0JfQotfQotCi12b2lkIHJ0czc3NTFyMmRfb3V0c2wodW5zaWduZWQgbG9uZyBwb3J0LCBjb25zdCB2b2lkICphZGRyLCB1bnNpZ25lZCBsb25nIGNvdW50KQotewotCWlmIChDSEVDS19BWDg4Nzk2TF9QT1JUKHBvcnQpKQotCQltYXliZWJhZGlvKHBvcnQpOwotCWVsc2UgaWYgKGlzX3BjaV9pb2FkZHIocG9ydCkgfHwgc2hpZnRlZF9wb3J0KHBvcnQpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgYSA9ICh1bnNpZ25lZCBsb25nKWFkZHI7Ci0KLQkJd2hpbGUgKGNvdW50LS0pIHsKLQkJCWN0cmxfb3V0bChjdHJsX2lubChhKSwgcGNpX2lvYWRkcihwb3J0KSk7Ci0JCQlhICs9IDQ7Ci0JCX0KLQl9IGVsc2UKLQkJbWF5YmViYWRpbyhwb3J0KTsKLX0KLQotdW5zaWduZWQgbG9uZyBydHM3NzUxcjJkX2lzYV9wb3J0MmFkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpCi17Ci0JcmV0dXJuIHBvcnQyYWRyKG9mZnNldCk7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMgYi9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMKaW5kZXggY2IwZWIyMC4uMGJhZTkwNCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9pcnEuYwpAQCAtOSw3ICs5LDkgQEAKICAqIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLiAyMDAyLgogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KIApAQCAtMjIsNzkgKzI0LDMxIEBACiBleHRlcm4gaW50IHZveWFnZXJneF9pcnFfZGVtdXgoaW50IGlycSk7CiBleHRlcm4gdm9pZCBzZXR1cF92b3lhZ2VyZ3hfaXJxKHZvaWQpOwogCi1zdGF0aWMgdm9pZCBlbmFibGVfcnRzNzc1MXIyZF9pcnEodW5zaWduZWQgaW50IGlycSk7Ci1zdGF0aWMgdm9pZCBkaXNhYmxlX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpOwotCi0vKiBzaHV0ZG93biBpcyBzYW1lIGFzICJkaXNhYmxlIiAqLwotI2RlZmluZSBzaHV0ZG93bl9ydHM3NzUxcjJkX2lycSBkaXNhYmxlX3J0czc3NTFyMmRfaXJxCi0KLXN0YXRpYyB2b2lkIGFja19ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLXN0YXRpYyB2b2lkIGVuZF9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKLQotc3RhdGljIHVuc2lnbmVkIGludCBzdGFydHVwX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCitzdGF0aWMgdm9pZCBlbmFibGVfcnRzNzc1MXIyZF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLQllbmFibGVfcnRzNzc1MXIyZF9pcnEoaXJxKTsKLQlyZXR1cm4gMDsgLyogbmV2ZXIgYW55dGhpbmcgcGVuZGluZyAqLworCS8qIFNldCBwcmlvcml0eSBpbiBJUFIgYmFjayB0byBvcmlnaW5hbCB2YWx1ZSAqLworCWN0cmxfb3V0dyhjdHJsX2ludyhJUkxDTlRSMSkgfCAoMSA8PCBtYXNrX3Bvc1tpcnFdKSwgSVJMQ05UUjEpOwogfQogCiBzdGF0aWMgdm9pZCBkaXNhYmxlX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JdW5zaWduZWQgc2hvcnQgdmFsOwotCXVuc2lnbmVkIHNob3J0IG1hc2sgPSAweGZmZmYgXiAoMHgwMDAxIDw8IG1hc2tfcG9zW2lycV0pOwotCiAJLyogU2V0IHRoZSBwcmlvcml0eSBpbiBJUFIgdG8gMCAqLwotCXZhbCA9IGN0cmxfaW53KElSTENOVFIxKTsKLQl2YWwgJj0gbWFzazsKLQljdHJsX291dHcodmFsLCBJUkxDTlRSMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuYWJsZV9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCXVuc2lnbmVkIHNob3J0IHZhbDsKLQl1bnNpZ25lZCBzaG9ydCB2YWx1ZSA9ICgweDAwMDEgPDwgbWFza19wb3NbaXJxXSk7Ci0KLQkvKiBTZXQgcHJpb3JpdHkgaW4gSVBSIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgKi8KLQl2YWwgPSBjdHJsX2ludyhJUkxDTlRSMSk7Ci0JdmFsIHw9IHZhbHVlOwotCWN0cmxfb3V0dyh2YWwsIElSTENOVFIxKTsKKwljdHJsX291dHcoY3RybF9pbncoSVJMQ05UUjEpICYgKDB4ZmZmZiBeICgxIDw8IG1hc2tfcG9zW2lycV0pKSwKKwkJICBJUkxDTlRSMSk7CiB9CiAKIGludCBydHM3NzUxcjJkX2lycV9kZW11eChpbnQgaXJxKQogewotCWludCBkZW11eF9pcnE7Ci0KLQlkZW11eF9pcnEgPSB2b3lhZ2VyZ3hfaXJxX2RlbXV4KGlycSk7Ci0JcmV0dXJuIGRlbXV4X2lycTsKKwlyZXR1cm4gdm95YWdlcmd4X2lycV9kZW11eChpcnEpOwogfQogCi1zdGF0aWMgdm9pZCBhY2tfcnRzNzc1MXIyZF9pcnEodW5zaWduZWQgaW50IGlycSkKLXsKLQlkaXNhYmxlX3J0czc3NTFyMmRfaXJxKGlycSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9ydHM3NzUxcjJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQotewotCWlmICghKGlycV9kZXNjW2lycV0uc3RhdHVzICYgKElSUV9ESVNBQkxFRHxJUlFfSU5QUk9HUkVTUykpKQotCQllbmFibGVfcnRzNzc1MXIyZF9pcnEoaXJxKTsKLX0KLQotc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBydHM3NzUxcjJkX2lycV90eXBlID0gewotCS50eXBlbmFtZSA9ICJSVFM3NzUxUjJEIElSUSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX3J0czc3NTFyMmRfaXJxLAotCS5zaHV0ZG93biA9IHNodXRkb3duX3J0czc3NTFyMmRfaXJxLAotCS5lbmFibGUgPSBlbmFibGVfcnRzNzc1MXIyZF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX3J0czc3NTFyMmRfaXJxLAotCS5hY2sgPSBhY2tfcnRzNzc1MXIyZF9pcnEsCi0JLmVuZCA9IGVuZF9ydHM3NzUxcjJkX2lycSwKK3N0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgcnRzNzc1MXIyZF9pcnFfY2hpcCBfX3JlYWRfbW9zdGx5ID0geworCS5uYW1lCQk9ICJydHM3NzUxcjJkIiwKKwkubWFzawkJPSBkaXNhYmxlX3J0czc3NTFyMmRfaXJxLAorCS51bm1hc2sJCT0gZW5hYmxlX3J0czc3NTFyMmRfaXJxLAorCS5tYXNrX2Fjawk9IGRpc2FibGVfcnRzNzc1MXIyZF9pcnEsCiB9OwogCi1zdGF0aWMgdm9pZCBtYWtlX3J0czc3NTFyMmRfaXJxKHVuc2lnbmVkIGludCBpcnEpCi17Ci0JZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7Ci0JaXJxX2Rlc2NbaXJxXS5jaGlwID0gJnJ0czc3NTFyMmRfaXJxX3R5cGU7Ci0JZGlzYWJsZV9ydHM3NzUxcjJkX2lycShpcnEpOwotfQotCiAvKgogICogSW5pdGlhbGl6ZSBJUlEgc2V0dGluZwogICovCkBAIC0xMTksOCArNzMsMTIgQEAKIAkgKiBJUkwxND1FeHRlbnRpb24gIzMKIAkgKi8KIAotCWZvciAoaT0wOyBpPDE1OyBpKyspCi0JCW1ha2VfcnRzNzc1MXIyZF9pcnEoaSk7CisJZm9yIChpPTA7IGk8MTU7IGkrKykgeworCQlkaXNhYmxlX2lycV9ub3N5bmMoaSk7CisJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGksICZydHM3NzUxcjJkX2lycV9jaGlwLAorCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKKwkJZW5hYmxlX3J0czc3NTFyMmRfaXJxKGkpOworCX0KIAogCXNldHVwX3ZveWFnZXJneF9pcnEoKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTA5ZjU0OC4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvcmVuZXNhcy9ydHM3NzUxcjJkL2xlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSBBdG9tIENyZWF0ZSBFbmdpbmVlcmluZyBDby4sIEx0ZC4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgUmVuZXNhcyBUZWNobm9sb2d5IFNhbGVzIFJUUzc3NTFSMkQgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLSNpbmNsdWRlIDxsaW51eC9pby5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KLQotLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlnZXIvU3VuIHBhdHRlcm4gKi8KLXZvaWQgaGVhcnRiZWF0X3J0czc3NTFyMmQodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKilQQV9PVVRQT1JUOwotCXN0YXRpYyB1bnNpZ25lZCBiaXQgPSAwLCB1cCA9IDE7Ci0KLQljbnQgKz0gMTsKLQlpZiAoY250IDwgcGVyaW9kKQotCQlyZXR1cm47Ci0KLQljbnQgPSAwOwotCi0JLyogR28gdGhyb3VnaCB0aGUgcG9pbnRzIChyb3VnaGx5ISk6Ci0JICogZigwKT0xMCwgZigxKT0xNiwgZigyKT0yMCwgZig1KT0zNSwgZihpbnQpLT4xMTAKLQkgKi8KLQlwZXJpb2QgPSAxMTAgLSAoKDMwMCA8PCBGU0hJRlQpLygoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSk7Ci0KLQkqcCA9IDEgPDwgYml0OwotCWlmICh1cCkKLQkJaWYgKGJpdCA9PSA3KSB7Ci0JCQliaXQtLTsKLQkJCXVwID0gMDsKLQkJfSBlbHNlCi0JCQliaXQrKzsKLQllbHNlIGlmIChiaXQgPT0gMCkKLQkJdXAgPSAxOwotCWVsc2UKLQkJYml0LS07Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCmluZGV4IDVjMDQyZDMuLjQ0YjQyMDggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3JlbmVzYXMvcnRzNzc1MXIyZC9zZXR1cC5jCkBAIC0xLDggKzEsOCBAQAogLyoKICAqIFJlbmVzYXMgVGVjaG5vbG9neSBTYWxlcyBSVFM3NzUxUjJEIFN1cHBvcnQuCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDAyIEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgotICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNiBQYXVsIE11bmR0CisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgLSAyMDA2IEF0b20gQ3JlYXRlIEVuZ2luZWVyaW5nIENvLiwgTHRkLgorICogQ29weXJpZ2h0IChDKSAyMDA0IC0gMjAwNyBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKQEAgLTEwLDMzICsxMCwxMyBAQAogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BhdGFfcGxhdGZvcm0uaD4KICNpbmNsdWRlIDxsaW51eC9zZXJpYWxfODI1MC5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8YXNtL21hY2h2ZWMuaD4KLSNpbmNsdWRlIDxhc20vbWFjaC9ydHM3NzUxcjJkLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8YXNtL3J0czc3NTFyMmQuaD4KICNpbmNsdWRlIDxhc20vdm95YWdlcmd4Lmg+Ci0KLWV4dGVybiB2b2lkIGhlYXJ0YmVhdF9ydHM3NzUxcjJkKHZvaWQpOwotZXh0ZXJuIHZvaWQgaW5pdF9ydHM3NzUxcjJkX0lSUSh2b2lkKTsKLWV4dGVybiBpbnQgcnRzNzc1MXIyZF9pcnFfZGVtdXgoaW50IGlycSk7Ci0KLWV4dGVybiB2b2lkICp2b3lhZ2VyZ3hfY29uc2lzdGVudF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgZG1hX2FkZHJfdCAqLCBnZnBfdCk7Ci1leHRlcm4gaW50IHZveWFnZXJneF9jb25zaXN0ZW50X2ZyZWUoc3RydWN0IGRldmljZSAqLCBzaXplX3QsIHZvaWQgKiwgZG1hX2FkZHJfdCk7Ci0KLXN0YXRpYyBzdHJ1Y3QgcGxhdF9zZXJpYWw4MjUwX3BvcnQgdWFydF9wbGF0Zm9ybV9kYXRhW10gPSB7Ci0JewotCQkubWVtYmFzZQk9ICh2b2lkICopVk9ZQUdFUl9VQVJUX0JBU0UsCi0JCS5tYXBiYXNlCT0gVk9ZQUdFUl9VQVJUX0JBU0UsCi0JCS5pb3R5cGUJCT0gVVBJT19NRU0sCi0JCS5pcnEJCT0gVk9ZQUdFUl9VQVJUMF9JUlEsCi0JCS5mbGFncwkJPSBVUEZfQk9PVF9BVVRPQ09ORiwKLQkJLnJlZ3NoaWZ0CT0gMiwKLQkJLnVhcnRjbGsJPSAoOTYwMCAqIDE2KSwKLQl9LCB7Ci0JCS5mbGFncwkJPSAwLAotCX0sCi19OworI2luY2x1ZGUgPGFzbS9pby5oPgogCiBzdGF0aWMgdm9pZCBfX2luaXQgdm95YWdlcmd4X3NlcmlhbF9pbml0KHZvaWQpCiB7CkBAIC00NSwzMiArMjUsOTYgQEAKIAkvKgogCSAqIEdQSU8gQ29udHJvbAogCSAqLwotCXZhbCA9IGlubChHUElPX01VWF9ISUdIKTsKKwl2YWwgPSByZWFkbCgodm9pZCBfX2lvbWVtICopR1BJT19NVVhfSElHSCk7CiAJdmFsIHw9IDB4MDAwMDFmZTA7Ci0Jb3V0bCh2YWwsIEdQSU9fTVVYX0hJR0gpOworCXdyaXRlbCh2YWwsICh2b2lkIF9faW9tZW0gKilHUElPX01VWF9ISUdIKTsKIAogCS8qCiAJICogUG93ZXIgTW9kZSBHYXRlCiAJICovCi0JdmFsID0gaW5sKFBPV0VSX01PREUwX0dBVEUpOworCXZhbCA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilQT1dFUl9NT0RFMF9HQVRFKTsKIAl2YWwgfD0gKFBPV0VSX01PREUwX0dBVEVfVTAgfCBQT1dFUl9NT0RFMF9HQVRFX1UxKTsKLQlvdXRsKHZhbCwgUE9XRVJfTU9ERTBfR0FURSk7CisJd3JpdGVsKHZhbCwgKHZvaWQgX19pb21lbSAqKVBPV0VSX01PREUwX0dBVEUpOwogCi0JdmFsID0gaW5sKFBPV0VSX01PREUxX0dBVEUpOworCXZhbCA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilQT1dFUl9NT0RFMV9HQVRFKTsKIAl2YWwgfD0gKFBPV0VSX01PREUxX0dBVEVfVTAgfCBQT1dFUl9NT0RFMV9HQVRFX1UxKTsKLQlvdXRsKHZhbCwgUE9XRVJfTU9ERTFfR0FURSk7CisJd3JpdGVsKHZhbCwgKHZvaWQgX19pb21lbSAqKVBPV0VSX01PREUxX0dBVEUpOwogfQogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGNmX2lkZV9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFBBX0FSRUE1X0lPICsgMHgxMDAwLAorCQkuZW5kCT0gUEFfQVJFQTVfSU8gKyAweDEwMDAgKyAweDA4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKKwlbMV0gPSB7CisJCS5zdGFydAk9IFBBX0FSRUE1X0lPICsgMHg4MGMsCisJCS5lbmQJPSBQQV9BUkVBNV9JTyArIDB4ODBjICsgMHgxNiAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCisJWzJdID0geworI2lmZGVmIENPTkZJR19SVFM3NzUxUjJEX1JFVjExCisJCS5zdGFydAk9IDEsCisjZWxzZQorCQkuc3RhcnQJPSAyLAorI2VuZGlmCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfSVJRLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBhdGFfcGxhdGZvcm1faW5mbyBwYXRhX2luZm8gPSB7CisJLmlvcG9ydF9zaGlmdAk9IDEsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBjZl9pZGVfZGV2aWNlICA9IHsKKwkubmFtZQkJPSAicGF0YV9wbGF0Zm9ybSIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShjZl9pZGVfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBjZl9pZGVfcmVzb3VyY2VzLAorCS5kZXYJPSB7CisJCS5wbGF0Zm9ybV9kYXRhCT0gJnBhdGFfaW5mbywKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0X3NlcmlhbDgyNTBfcG9ydCB1YXJ0X3BsYXRmb3JtX2RhdGFbXSA9IHsKKwl7CisJCS5tZW1iYXNlCT0gKHZvaWQgX19pb21lbSAqKVZPWUFHRVJfVUFSVF9CQVNFLAorCQkubWFwYmFzZQk9IFZPWUFHRVJfVUFSVF9CQVNFLAorCQkuaW90eXBlCQk9IFVQSU9fTUVNLAorCQkuaXJxCQk9IFZPWUFHRVJfVUFSVDBfSVJRLAorCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYgfCBVUEZfU0tJUF9URVNULAorCQkucmVnc2hpZnQJPSAyLAorCQkudWFydGNsawk9ICg5NjAwICogMTYpLAorCX0KK307CisKIHN0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIHVhcnRfZGV2aWNlID0gewogCS5uYW1lCQk9ICJzZXJpYWw4MjUwIiwKLQkuaWQJCT0gLTEsCisJLmlkCQk9IFBMQVQ4MjUwX0RFVl9QTEFURk9STSwKIAkuZGV2CQk9IHsKIAkJLnBsYXRmb3JtX2RhdGEJPSB1YXJ0X3BsYXRmb3JtX2RhdGEsCiAJfSwKIH07CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGVhcnRiZWF0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUEFfT1VUUE9SVCwKKwkJLmVuZAk9IFBBX09VVFBPUlQgKyA4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhlYXJ0YmVhdF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImhlYXJ0YmVhdCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKwogc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnJ0czc3NTFyMmRfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CiAJJnVhcnRfZGV2aWNlLAorCSZoZWFydGJlYXRfZGV2aWNlLAorCSZjZl9pZGVfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgcnRzNzc1MXIyZF9kZXZpY2VzX3NldHVwKHZvaWQpCkBAIC03OCw2ICsxMjIsNyBAQAogCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhydHM3NzUxcjJkX2RldmljZXMsCiAJCQkJICAgIEFSUkFZX1NJWkUocnRzNzc1MXIyZF9kZXZpY2VzKSk7CiB9CitfX2luaXRjYWxsKHJ0czc3NTFyMmRfZGV2aWNlc19zZXR1cCk7CiAKIHN0YXRpYyB2b2lkIHJ0czc3NTFyMmRfcG93ZXJfb2ZmKHZvaWQpCiB7CkBAIC04OSwxNCArMTM0LDE3IEBACiAgKi8KIHN0YXRpYyB2b2lkIF9faW5pdCBydHM3NzUxcjJkX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCiB7Ci0JZGV2aWNlX2luaXRjYWxsKHJ0czc3NTFyMmRfZGV2aWNlc19zZXR1cCk7CisJdTE2IHZlciA9IGN0cmxfaW53KFBBX1ZFUlJFRyk7CisKKwlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgUlRTNzc1MVIyRCBzdXBwb3J0LlxuIik7CisKKwlwcmludGsoS0VSTl9JTkZPICJGUEdBIHZlcnNpb246JWQgKHJldmlzaW9uOiVkKVxuIiwKKwkJCQkJKHZlciA+PiA0KSAmIDB4ZiwgdmVyICYgMHhmKTsKIAogCWN0cmxfb3V0dygweDAwMDAsIFBBX09VVFBPUlQpOwogCXBtX3Bvd2VyX29mZiA9IHJ0czc3NTFyMmRfcG93ZXJfb2ZmOwogCiAJdm95YWdlcmd4X3NlcmlhbF9pbml0KCk7Ci0KLQlwcmludGsoS0VSTl9JTkZPICJSZW5lc2FzIFRlY2hub2xvZ3kgU2FsZXMgUlRTNzc1MVIyRCBzdXBwb3J0LlxuIik7CiB9CiAKIC8qCkBAIC0xMDcsMzEgKzE1NSw3IEBACiAJLm12X3NldHVwCQk9IHJ0czc3NTFyMmRfc2V0dXAsCiAJLm12X25yX2lycXMJCT0gNzIsCiAKLQkubXZfaW5iCQkJPSBydHM3NzUxcjJkX2luYiwKLQkubXZfaW53CQkJPSBydHM3NzUxcjJkX2ludywKLQkubXZfaW5sCQkJPSBydHM3NzUxcjJkX2lubCwKLQkubXZfb3V0YgkJPSBydHM3NzUxcjJkX291dGIsCi0JLm12X291dHcJCT0gcnRzNzc1MXIyZF9vdXR3LAotCS5tdl9vdXRsCQk9IHJ0czc3NTFyMmRfb3V0bCwKLQotCS5tdl9pbmJfcAkJPSBydHM3NzUxcjJkX2luYl9wLAotCS5tdl9pbndfcAkJPSBydHM3NzUxcjJkX2ludywKLQkubXZfaW5sX3AJCT0gcnRzNzc1MXIyZF9pbmwsCi0JLm12X291dGJfcAkJPSBydHM3NzUxcjJkX291dGJfcCwKLQkubXZfb3V0d19wCQk9IHJ0czc3NTFyMmRfb3V0dywKLQkubXZfb3V0bF9wCQk9IHJ0czc3NTFyMmRfb3V0bCwKLQotCS5tdl9pbnNiCQk9IHJ0czc3NTFyMmRfaW5zYiwKLQkubXZfaW5zdwkJPSBydHM3NzUxcjJkX2luc3csCi0JLm12X2luc2wJCT0gcnRzNzc1MXIyZF9pbnNsLAotCS5tdl9vdXRzYgkJPSBydHM3NzUxcjJkX291dHNiLAotCS5tdl9vdXRzdwkJPSBydHM3NzUxcjJkX291dHN3LAotCS5tdl9vdXRzbAkJPSBydHM3NzUxcjJkX291dHNsLAotCiAJLm12X2luaXRfaXJxCQk9IGluaXRfcnRzNzc1MXIyZF9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0X3J0czc3NTFyMmQsCi0jZW5kaWYKIAkubXZfaXJxX2RlbXV4CQk9IHJ0czc3NTFyMmRfaXJxX2RlbXV4LAogCiAjaWZkZWYgQ09ORklHX1VTQl9TTTUwMQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvTWFrZWZpbGUKaW5kZXggNjM5NTBmNGYuLjYzZTdlZDYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9NYWtlZmlsZQpAQCAtMyw1ICszLDMgQEAKICMKIAogb2JqLXkJIDo9IHNldHVwLm8gaW8ubyBpcnEubwotb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkgKz0gbGVkLm8KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmNzk0NjAuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDU3ICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2tlcm5lbC9sZWRfc2UuYwotICoKLSAqIENvcHlyaWdodCAoQykgMjAwMCBTdHVhcnQgTWVuZWZ5IDxzdHVhcnQubWVuZWZ5QHN0LmNvbT4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogVGhpcyBmaWxlIGNvbnRhaW5zIFNvbHV0aW9uIEVuZ2luZSBzcGVjaWZpYyBMRUQgY29kZS4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvY29uZmlnLmg+Ci0jaW5jbHVkZSA8YXNtL3NlNzIwNi5oPgotCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlkZXIvU3VuIHBhdHRlcm4gKi8KLXZvaWQgaGVhcnRiZWF0X3NlKHZvaWQpCi17Ci0Jc3RhdGljIHVuc2lnbmVkIGludCBjbnQgPSAwLCBwZXJpb2QgPSAwOwotCXZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0KilQQV9MRUQ7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCAoMzAwPDxGU0hJRlQpLwotCQkJICgoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSApOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cD0wOwotCQl9IGVsc2UgewotCQkJYml0ICsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGJpdCA9PSAwKSB7Ci0JCQliaXQrKzsKLQkJCXVwPTE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDE8PChiaXQrOCk7Ci0KLX0KLSNlbmRpZiAvKiBDT05GSUdfSEVBUlRCRUFUICovCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MjA2L3NldHVwLmMKaW5kZXggMGY0MmU5MS4uY2E3MTQ4NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzIwNi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYwpAQCAtMyw2ICszLDcgQEAKICAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzcyMDYvc2V0dXAuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwNiAgWW9zaGlub3JpIFNhdG8KKyAqIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAogICoKICAqIEhpdGFjaGkgNzIwNiBTb2x1dGlvbkVuZ2luZSBTdXBwb3J0LgogICoKQEAgLTM0LDE1ICszNSwzNyBAQAogCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCiB9OwogCitzdGF0aWMgdW5zaWduZWQgY2hhciBoZWFydGJlYXRfYml0X3Bvc1tdID0geyA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGVhcnRiZWF0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUEFfTEVELAorCQkuZW5kCT0gUEFfTEVEICsgQVJSQVlfU0laRShoZWFydGJlYXRfYml0X3BvcykgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGVhcnRiZWF0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGVhcnRiZWF0IiwKKwkuaWQJCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBoZWFydGJlYXRfYml0X3BvcywKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNlNzIwNl9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc21jOTF4X2RldmljZSwKKwkmaGVhcnRiZWF0X2RldmljZSwKK307CisKIHN0YXRpYyBpbnQgX19pbml0IHNlNzIwNl9kZXZpY2VzX3NldHVwKHZvaWQpCiB7Ci0JcmV0dXJuIHBsYXRmb3JtX2RldmljZV9yZWdpc3Rlcigmc21jOTF4X2RldmljZSk7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlNzIwNl9kZXZpY2VzLCBBUlJBWV9TSVpFKHNlNzIwNl9kZXZpY2VzKSk7CiB9Ci0KIF9faW5pdGNhbGwoc2U3MjA2X2RldmljZXNfc2V0dXApOwogCi12b2lkIGhlYXJ0YmVhdF9zZSh2b2lkKTsKLQogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCkBAIC03Miw4ICs5NSw1IEBACiAJLm12X291dHNsCQk9IHNlNzIwNl9vdXRzbCwKIAogCS5tdl9pbml0X2lycQkJPSBpbml0X3NlNzIwNl9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0X3NlLAotI2VuZGlmCiB9OwogQUxJQVNfTVYoc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9NYWtlZmlsZQppbmRleCAwZmJkNGY0Li40NjI0NzM2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvTWFrZWZpbGUKQEAgLTMsNSArMywzIEBACiAjCiAKIG9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8KLQotb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkgKz0gbGVkLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzAwL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDAzYmI3Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9sZWQuYwotICoKLSAqIERlcml2ZWQgZnJvbSBsaW51eC9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2xlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgPHN0dWFydC5tZW5lZnlAc3QuY29tPgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgU29sdXRpb24gRW5naW5lIHNwZWNpZmljIExFRCBjb2RlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZTczMDAuaD4KLQotLyogQ3ljbGUgdGhlIExFRCdzIGluIHRoZSBjbGFzaWMgS25pZ2h0cmlkZXIvU3VuIHBhdHRlcm4gKi8KLXZvaWQgaGVhcnRiZWF0XzczMDBzZSh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBQQV9MRUQ7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCgzMDAgPDwgRlNISUZUKSAvICgoYXZlbnJ1blswXSAvIDUpICsgKDMgPDwgRlNISUZUKSkpOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQliaXQrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChiaXQgPT0gMCkgewotCQkJYml0Kys7Ci0JCQl1cCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDEgPDwgKGJpdCArIDgpOwotCi19Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYwppbmRleCA2ZjA4MmE3Mi4uZjE5NjA5NSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzMwMC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMDAvc2V0dXAuYwpAQCAtNiwxNCArNiw0MyBAQAogICogU0gtTW9iaWxlIFNvbHV0aW9uRW5naW5lIDczMDAgU3VwcG9ydC4KICAqCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9zZTczMDAuaD4KIAotdm9pZCBoZWFydGJlYXRfNzMwMHNlKHZvaWQpOwogdm9pZCBpbml0XzczMDBzZV9JUlEodm9pZCk7CiAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYXJ0YmVhdF9iaXRfcG9zW10gPSB7IDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBQQV9MRUQsCisJCS5lbmQJPSBQQV9MRUQgKyBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9iaXRfcG9zKSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoZWFydGJlYXRfZGV2aWNlID0geworCS5uYW1lCQk9ICJoZWFydGJlYXQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9IGhlYXJ0YmVhdF9iaXRfcG9zLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2U3MzAwX2RldmljZXNbXSBfX2luaXRkYXRhID0geworCSZoZWFydGJlYXRfZGV2aWNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgc2U3MzAwX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2U3MzAwX2RldmljZXMsIEFSUkFZX1NJWkUoc2U3MzAwX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2U3MzAwX2RldmljZXNfc2V0dXApOworCiAvKgogICogVGhlIE1hY2hpbmUgVmVjdG9yCiAgKi8KQEAgLTQyLDggKzcxLDUgQEAKIAkubXZfb3V0c2wgPSBzaDczMDBzZV9vdXRzbCwKIAogCS5tdl9pbml0X2lycSA9IGluaXRfNzMwMHNlX0lSUSwKLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdCA9IGhlYXJ0YmVhdF83MzAwc2UsCi0jZW5kaWYKIH07CiBBTElBU19NVig3MzAwc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9NYWtlZmlsZSBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL01ha2VmaWxlCmluZGV4IDhmNjM4ODYuLmU3YzA5OTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL01ha2VmaWxlCkBAIC0zLDUgKzMsMyBAQAogIwogCiBvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCi0KLW9iai0kKENPTkZJR19IRUFSVEJFQVQpICs9IGxlZC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjcyZTlhLi4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2xlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIGFyY2gvc2gvYm9hcmRzL3NlLzczMTgwL2xlZC5jCi0gKgotICogRGVyaXZlZCBmcm9tIGFyY2gvc2gvYm9hcmRzL3NlLzc3MHgvbGVkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDAgU3R1YXJ0IE1lbmVmeSA8c3R1YXJ0Lm1lbmVmeUBzdC5jb20+Ci0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBTb2x1dGlvbiBFbmdpbmUgc3BlY2lmaWMgTEVEIGNvZGUuCi0gKi8KLQotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvc2U3MzE4MC5oPgotCi0vKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwotdm9pZCBoZWFydGJlYXRfNzMxODBzZSh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqcCA9ICh2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKSBQQV9MRUQ7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCgzMDAgPDwgRlNISUZUKSAvICgoYXZlbnJ1blswXSAvIDUpICsgKDMgPDwgRlNISUZUKSkpOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cCA9IDA7Ci0JCX0gZWxzZSB7Ci0JCQliaXQrKzsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmIChiaXQgPT0gMCkgewotCQkJYml0Kys7Ci0JCQl1cCA9IDE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDEgPDwgKGJpdCArIExFRF9TSElGVCk7Ci0KLX0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzE4MC9zZXR1cC5jCmluZGV4IGIzOGVmNTAuLjkxMWNlMWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczMTgwL3NldHVwLmMKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzMxODAvc2V0dXAuYwpAQCAtMTAsMTMgKzEwLDM5IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9zZTczMTgwLmg+CiAjaW5jbHVkZSA8YXNtL2lycS5oPgogCi12b2lkIGhlYXJ0YmVhdF83MzE4MHNlKHZvaWQpOwogdm9pZCBpbml0XzczMTgwc2VfSVJRKHZvaWQpOwogCitzdGF0aWMgc3RydWN0IHJlc291cmNlIGhlYXJ0YmVhdF9yZXNvdXJjZXNbXSA9IHsKKwlbMF0gPSB7CisJCS5zdGFydAk9IFBBX0xFRCwKKwkJLmVuZAk9IFBBX0xFRCArIDggLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGVhcnRiZWF0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGVhcnRiZWF0IiwKKwkuaWQJCT0gLTEsCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2U3MzE4MF9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmaGVhcnRiZWF0X2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNlNzMxODBfZGV2aWNlc19zZXR1cCh2b2lkKQoreworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDczNDNzZV9wbGF0Zm9ybV9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNoNzM0M3NlX3BsYXRmb3JtX2RldmljZXMpKTsKK30KK19faW5pdGNhbGwoc2U3MzE4MF9kZXZpY2VzX3NldHVwKTsKKwogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCkBAIC00Niw4ICs3Miw1IEBACiAKIAkubXZfaW5pdF9pcnEgPSBpbml0XzczMTgwc2VfSVJRLAogCS5tdl9pcnFfZGVtdXggPSBzaG1zZV9pcnFfZGVtdXgsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQgPSBoZWFydGJlYXRfNzMxODBzZSwKLSNlbmRpZgogfTsKIEFMSUFTX01WKDczMTgwc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9NYWtlZmlsZQppbmRleCA0MjkxMDY5Li4zMDI0Nzk2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvTWFrZWZpbGUKQEAgLTMsNSArMywzIEBACiAjCiAKIG9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8KLQotb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkgKz0gbGVkLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvbGVkLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL2xlZC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjM5ZTE5Li4wMDAwMDAwCi0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvbGVkLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9sZWQuYwotICoKLSAqLwotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8YXNtL21hY2gvc2U3MzQzLmg+Ci0KLS8qIEN5Y2xlIHRoZSBMRUQncyBpbiB0aGUgY2xhc2ljIEtuaWdodHJpZGVyL1N1biBwYXR0ZXJuICovCi12b2lkIGhlYXJ0YmVhdF83MzQzc2Uodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKnAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikgUEFfTEVEOwotCXN0YXRpYyB1bnNpZ25lZCBiaXQgPSAwLCB1cCA9IDE7Ci0KLQljbnQgKz0gMTsKLQlpZiAoY250IDwgcGVyaW9kKSB7Ci0JCXJldHVybjsKLQl9Ci0KLQljbnQgPSAwOwotCi0JLyogR28gdGhyb3VnaCB0aGUgcG9pbnRzIChyb3VnaGx5ISk6Ci0JICogZigwKT0xMCwgZigxKT0xNiwgZigyKT0yMCwgZig1KT0zNSxmKGluZiktPjExMAotCSAqLwotCXBlcmlvZCA9IDExMCAtICgoMzAwIDw8IEZTSElGVCkgLyAoKGF2ZW5ydW5bMF0gLyA1KSArICgzIDw8IEZTSElGVCkpKTsKLQotCWlmICh1cCkgewotCQlpZiAoYml0ID09IDcpIHsKLQkJCWJpdC0tOwotCQkJdXAgPSAwOwotCQl9IGVsc2UgewotCQkJYml0Kys7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYml0ID09IDApIHsKLQkJCWJpdCsrOwotCQkJdXAgPSAxOwotCQl9IGVsc2UgewotCQkJYml0LS07Ci0JCX0KLQl9Ci0JKnAgPSAxIDw8IChiaXQgKyBMRURfU0hJRlQpOwotCi19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMgYi9hcmNoL3NoL2JvYXJkcy9zZS83MzQzL3NldHVwLmMKaW5kZXggYzdkMTdmZS4uM2ZkYjE2ZiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzM0My9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzczNDMvc2V0dXAuYwpAQCAtNCw3ICs0LDYgQEAKICNpbmNsdWRlIDxhc20vbWFjaC9zZTczNDMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAKLXZvaWQgaGVhcnRiZWF0XzczNDNzZSh2b2lkKTsKIHZvaWQgaW5pdF83MzQzc2VfSVJRKHZvaWQpOwogCiBzdGF0aWMgc3RydWN0IHJlc291cmNlIHNtYzkxeF9yZXNvdXJjZXNbXSA9IHsKQEAgLTMxLDE0ICszMCwzMCBAQAogCS5yZXNvdXJjZQk9IHNtYzkxeF9yZXNvdXJjZXMsCiB9OwogCi1zdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc21jOTF4X3BsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0geworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBQQV9MRUQsCisJCS5lbmQJPSBQQV9MRUQgKyA4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhlYXJ0YmVhdF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImhlYXJ0YmVhdCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoNzM0M3NlX3BsYXRmb3JtX2RldmljZXNbXSBfX2luaXRkYXRhID0gewogCSZzbWM5MXhfZGV2aWNlLAorCSZoZWFydGJlYXRfZGV2aWNlLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgc2g3MzQzc2VfZGV2aWNlc19zZXR1cCh2b2lkKQogewotCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzbWM5MXhfcGxhdGZvcm1fZGV2aWNlcywKLQkJCQkgICAgQVJSQVlfU0laRShzbWM5MXhfcGxhdGZvcm1fZGV2aWNlcykpOworCXJldHVybiBwbGF0Zm9ybV9hZGRfZGV2aWNlcyhzaDczNDNzZV9wbGF0Zm9ybV9kZXZpY2VzLAorCQkJCSAgICBBUlJBWV9TSVpFKHNoNzM0M3NlX3BsYXRmb3JtX2RldmljZXMpKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IHNoNzM0M3NlX3NldHVwKGNoYXIgKipjbWRsaW5lX3ApCkBAIC03Niw4ICs5MSw1IEBACiAKIAkubXZfaW5pdF9pcnEgPSBpbml0XzczNDNzZV9JUlEsCiAJLm12X2lycV9kZW11eCA9IHNobXNlX2lycV9kZW11eCwKLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdCA9IGhlYXJ0YmVhdF83MzQzc2UsCi0jZW5kaWYKIH07CiBBTElBU19NVig3MzQzc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9NYWtlZmlsZQppbmRleCA5YTUwMzVmLi44ZTYyNGIwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvTWFrZWZpbGUKQEAgLTMsNCArMywzIEBACiAjCiAKIG9iai15CSA6PSBzZXR1cC5vIGlvLm8gaXJxLm8KLW9iai0kKENPTkZJR19IRUFSVEJFQVQpICs9IGxlZC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9pcnEuYwppbmRleCBmY2Q3Y2Q3Li4zMDdjYTVkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2lycS5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKQEAgLTIsNTYgKzIsOTYgQEAKICAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvaXJxLmMKICAqCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDAgIEthenVtb3RvIEtvamltYQorICogQ29weXJpZ2h0IChDKSAyMDA2ICBOb2J1aGlybyBJd2FtYXRzdQogICoKICAqIEhpdGFjaGkgU29sdXRpb25FbmdpbmUgU3VwcG9ydC4KICAqCiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NlLmg+CiAKKy8qIAorICogSWYgdGhlIHByb2JsZW0gb2YgbWFrZV9pcHJfaXJxIGlzIHNvbHZlZCwgCisgKiB0aGlzIGNvZGUgd2lsbCBiZWNvbWUgdW5uZWNlc3NhcnkuIDotKSAKKyAqLworc3RhdGljIHZvaWQgc2U3NzB4X2Rpc2FibGVfaXByX2lycSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcHJfZGF0YSAqcCA9IGdldF9pcnFfY2hpcF9kYXRhKGlycSk7CisKKwljdHJsX291dHcoY3RybF9pbncocC0+YWRkcikgJiAoMHhmZmZmIF4gKDB4ZiA8PCBwLT5zaGlmdCkpLCBwLT5hZGRyKTsKK30KKworc3RhdGljIHZvaWQgc2U3NzB4X2VuYWJsZV9pcHJfaXJxKHVuc2lnbmVkIGludCBpcnEpCit7CisJc3RydWN0IGlwcl9kYXRhICpwID0gZ2V0X2lycV9jaGlwX2RhdGEoaXJxKTsKKworCWN0cmxfb3V0dyhjdHJsX2ludyhwLT5hZGRyKSB8IChwLT5wcmlvcml0eSA8PCBwLT5zaGlmdCksIHAtPmFkZHIpOworfQorCitzdGF0aWMgc3RydWN0IGlycV9jaGlwIHNlNzcweF9pcnFfY2hpcCA9IHsKKwkubmFtZSAgICAgICAgICAgPSAiTVM3NzB4U0UtRlBHQSIsCisJLm1hc2sgICAgICAgICAgID0gc2U3NzB4X2Rpc2FibGVfaXByX2lycSwKKwkudW5tYXNrICAgICAgICAgPSBzZTc3MHhfZW5hYmxlX2lwcl9pcnEsCisJLm1hc2tfYWNrICAgICAgID0gc2U3NzB4X2Rpc2FibGVfaXByX2lycSwKK307CisKK3ZvaWQgbWFrZV9zZTc3MHhfaXJxKHN0cnVjdCBpcHJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgeworCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOworCQlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKwkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmc2U3NzB4X2lycV9jaGlwLAorCQkJaGFuZGxlX2xldmVsX2lycSwgImxldmVsIik7CisJCXNldF9pcnFfY2hpcF9kYXRhKGlycSwgJnRhYmxlW2ldKTsKKwkJc2U3NzB4X2VuYWJsZV9pcHJfaXJxKGlycSk7CisJfQorfQorCiBzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNlNzcweF9pcHJfbWFwW10gPSB7CiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA1KQogCS8qIFRoaXMgaXMgZGVmYXVsdCB2YWx1ZSAqLwotCXsgMHhmLTB4MiwgQkNSX0lMQ1JBLCAyLCAweDIgfSwKLQl7IDB4Zi0weGEsIEJDUl9JTENSQSwgMSwgMHhhIH0sCi0JeyAweGYtMHg1LCBCQ1JfSUxDUkIsIDAsIDB4NSB9LAotCXsgMHhmLTB4OCwgQkNSX0lMQ1JDLCAxLCAweDggfSwKLQl7IDB4Zi0weGMsIEJDUl9JTENSQywgMCwgMHhjIH0sCi0JeyAweGYtMHhlLCBCQ1JfSUxDUkQsIDMsIDB4ZSB9LAotCXsgMHhmLTB4MywgQkNSX0lMQ1JELCAxLCAweDMgfSwgLyogTEFOICovCi0JeyAweGYtMHhkLCBCQ1JfSUxDUkUsIDIsIDB4ZCB9LAotCXsgMHhmLTB4OSwgQkNSX0lMQ1JFLCAxLCAweDkgfSwKLQl7IDB4Zi0weDEsIEJDUl9JTENSRSwgMCwgMHgxIH0sCi0JeyAweGYtMHhmLCBCQ1JfSUxDUkYsIDMsIDB4ZiB9LAotCXsgMHhmLTB4YiwgQkNSX0lMQ1JGLCAxLCAweGIgfSwKLQl7IDB4Zi0weDcsIEJDUl9JTENSRywgMywgMHg3IH0sCi0JeyAweGYtMHg2LCBCQ1JfSUxDUkcsIDIsIDB4NiB9LAotCXsgMHhmLTB4NCwgQkNSX0lMQ1JHLCAxLCAweDQgfSwKKwl7IDB4Zi0weDIsIDAsIDgsICAweDIgLCBCQ1JfSUxDUkF9LAorCXsgMHhmLTB4YSwgMCwgNCwgIDB4YSAsIEJDUl9JTENSQX0sCisJeyAweGYtMHg1LCAwLCAwLCAgMHg1ICwgQkNSX0lMQ1JCfSwKKwl7IDB4Zi0weDgsIDAsIDQsICAweDggLCBCQ1JfSUxDUkN9LAorCXsgMHhmLTB4YywgMCwgMCwgIDB4YyAsIEJDUl9JTENSQ30sCisJeyAweGYtMHhlLCAwLCAxMiwgMHhlICwgQkNSX0lMQ1JEfSwKKwl7IDB4Zi0weDMsIDAsIDQsICAweDMgLCBCQ1JfSUxDUkR9LCAvKiBMQU4gKi8KKwl7IDB4Zi0weGQsIDAsIDgsICAweGQgLCBCQ1JfSUxDUkV9LAorCXsgMHhmLTB4OSwgMCwgNCwgIDB4OSAsIEJDUl9JTENSRX0sCisJeyAweGYtMHgxLCAwLCAwLCAgMHgxICwgQkNSX0lMQ1JFfSwKKwl7IDB4Zi0weGYsIDAsIDEyLCAweGYgLCBCQ1JfSUxDUkZ9LAorCXsgMHhmLTB4YiwgMCwgNCwgIDB4YiAsIEJDUl9JTENSRn0sCisJeyAweGYtMHg3LCAwLCAxMiwgMHg3ICwgQkNSX0lMQ1JHfSwKKwl7IDB4Zi0weDYsIDAsIDgsICAweDYgLCBCQ1JfSUxDUkd9LAorCXsgMHhmLTB4NCwgMCwgNCwgIDB4NCAsIEJDUl9JTENSR30sCiAjZWxzZQotCXsgMTQsIEJDUl9JTENSQSwgMiwgMHgwZi0xNCB9LAotCXsgMTIsIEJDUl9JTENSQSwgMSwgMHgwZi0xMiB9LAotCXsgIDgsIEJDUl9JTENSQiwgMSwgMHgwZi0gOCB9LAotCXsgIDYsIEJDUl9JTENSQywgMywgMHgwZi0gNiB9LAotCXsgIDUsIEJDUl9JTENSQywgMiwgMHgwZi0gNSB9LAotCXsgIDQsIEJDUl9JTENSQywgMSwgMHgwZi0gNCB9LAotCXsgIDMsIEJDUl9JTENSQywgMCwgMHgwZi0gMyB9LAotCXsgIDEsIEJDUl9JTENSRCwgMywgMHgwZi0gMSB9LAotCi0JeyAxMCwgQkNSX0lMQ1JELCAxLCAweDBmLTEwIH0sIC8qIExBTiAqLwotCi0JeyAgMCwgQkNSX0lMQ1JFLCAzLCAweDBmLSAwIH0sIC8qIFBDSVJRMyAqLwotCXsgMTEsIEJDUl9JTENSRSwgMiwgMHgwZi0xMSB9LCAvKiBQQ0lSUTIgKi8KLQl7ICA5LCBCQ1JfSUxDUkUsIDEsIDB4MGYtIDkgfSwgLyogUENJUlExICovCi0JeyAgNywgQkNSX0lMQ1JFLCAwLCAweDBmLSA3IH0sIC8qIFBDSVJRMCAqLwotCisJeyAxNCwgMCwgIDgsIDB4MGYtMTQgLEJDUl9JTENSQX0sCisJeyAxMiwgMCwgIDQsIDB4MGYtMTIgLEJDUl9JTENSQX0sCisJeyAgOCwgMCwgIDQsIDB4MGYtIDggLEJDUl9JTENSQn0sCisJeyAgNiwgMCwgMTIsIDB4MGYtIDYgLEJDUl9JTENSQ30sCisJeyAgNSwgMCwgIDgsIDB4MGYtIDUgLEJDUl9JTENSQ30sCisJeyAgNCwgMCwgIDQsIDB4MGYtIDQgLEJDUl9JTENSQ30sCisJeyAgMywgMCwgIDAsIDB4MGYtIDMgLEJDUl9JTENSQ30sCisJeyAgMSwgMCwgMTIsIDB4MGYtIDEgLEJDUl9JTENSRH0sCisJLyogU1QgTklDICovCisJeyAxMCwgMCwgIDQsIDB4MGYtMTAgLEJDUl9JTENSRH0sIAkvKiBMQU4gKi8KKwkvKiBNUlNIUEMgSVJRcyBzZXR0aW5nICovCisJeyAgMCwgMCwgMTIsIDB4MGYtIDAgLEJDUl9JTENSRX0sCS8qIFBDSVJRMyAqLworCXsgMTEsIDAsICA4LCAweDBmLTExICxCQ1JfSUxDUkV9LCAJLyogUENJUlEyICovCisJeyAgOSwgMCwgIDQsIDB4MGYtIDkgLEJDUl9JTENSRX0sIAkvKiBQQ0lSUTEgKi8KKwl7ICA3LCAwLCAgMCwgMHgwZi0gNyAsQkNSX0lMQ1JFfSwgCS8qIFBDSVJRMCAqLwogCS8qICMyLCAjMTMgYXJlIGFsbG9jYXRlZCBmb3IgU0xPVCBJUlEgIzEgYW5kICMyIChmb3Igbm93KSAqLwogCS8qIE5PVEU6ICMyIGFuZCAjMTMgYXJlIG5vdCB1c2VkIG9uIFBDICovCi0JeyAxMywgQkNSX0lMQ1JHLCAxLCAweDBmLTEzIH0sIC8qIFNMT1RJUlEyICovCi0JeyAgMiwgQkNSX0lMQ1JHLCAwLCAweDBmLSAyIH0sIC8qIFNMT1RJUlExICovCisJeyAxMywgMCwgIDQsIDB4MGYtMTMgLEJDUl9JTENSR30sIAkvKiBTTE9USVJRMiAqLworCXsgIDIsIDAsICAwLCAweDBmLSAyICxCQ1JfSUxDUkd9LCAJLyogU0xPVElSUTEgKi8KICNlbmRpZgogfTsKIApAQCAtODEsNSArMTIxLDUgQEAKIAljdHJsX291dHcoMCwgQkNSX0lMQ1JGKTsKIAljdHJsX291dHcoMCwgQkNSX0lMQ1JHKTsKICNlbmRpZgotCW1ha2VfaXByX2lycShzZTc3MHhfaXByX21hcCwgQVJSQVlfU0laRShzZTc3MHhfaXByX21hcCkpOworCW1ha2Vfc2U3NzB4X2lycShzZTc3MHhfaXByX21hcCwgQVJSQVlfU0laRShzZTc3MHhfaXByX21hcCkpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5M2RkODMuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L2xlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgPHN0dWFydC5tZW5lZnlAc3QuY29tPgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgU29sdXRpb24gRW5naW5lIHNwZWNpZmljIExFRCBjb2RlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGFzbS9zZS5oPgotCi0vKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwotdm9pZCBoZWFydGJlYXRfc2Uodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqIHAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKVBBX0xFRDsKLQlzdGF0aWMgdW5zaWduZWQgYml0ID0gMCwgdXAgPSAxOwotCi0JY250ICs9IDE7Ci0JaWYgKGNudCA8IHBlcmlvZCkgewotCQlyZXR1cm47Ci0JfQotCi0JY250ID0gMDsKLQotCS8qIEdvIHRocm91Z2ggdGhlIHBvaW50cyAocm91Z2hseSEpOgotCSAqIGYoMCk9MTAsIGYoMSk9MTYsIGYoMik9MjAsIGYoNSk9MzUsZihpbmYpLT4xMTAKLQkgKi8KLQlwZXJpb2QgPSAxMTAgLSAoICgzMDA8PEZTSElGVCkvCi0JCQkgKChhdmVucnVuWzBdLzUpICsgKDM8PEZTSElGVCkpICk7Ci0KLQlpZiAodXApIHsKLQkJaWYgKGJpdCA9PSA3KSB7Ci0JCQliaXQtLTsKLQkJCXVwPTA7Ci0JCX0gZWxzZSB7Ci0JCQliaXQgKys7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYml0ID09IDApIHsKLQkJCWJpdCsrOwotCQkJdXA9MTsKLQkJfSBlbHNlIHsKLQkJCWJpdC0tOwotCQl9Ci0JfQotCSpwID0gMTw8KGJpdCs4KTsKLQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzcweC9zZXR1cC5jCmluZGV4IGExZDUxZDUuLjQ1Y2JjMzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzB4L3NldHVwLmMKQEAgLTEsNSArMSw0IEBACi0vKiAkSWQ6IHNldHVwLmMsdiAxLjEuMi40IDIwMDIvMDMvMDIgMjE6NTc6MDcgbGV0aGFsIEV4cCAkCi0gKgorLyoKICAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NlLzc3MHgvc2V0dXAuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCAgS2F6dW1vdG8gS29qaW1hCkBAIC04LDEyICs3LDEyIEBACiAgKgogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9tYWNodmVjLmg+CiAjaW5jbHVkZSA8YXNtL3NlLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3NtYzM3YzkzeC5oPgogCi12b2lkIGhlYXJ0YmVhdF9zZSh2b2lkKTsKIHZvaWQgaW5pdF9zZV9JUlEodm9pZCk7CiAKIC8qCkBAIC0zNiwxMSArMzUsNiBAQAogCXNtc2NfY29uZmlnKEFDVElWQVRFX0lOREVYLCAweDAxKTsKIAlzbXNjX2NvbmZpZyhJUlFfU0VMRUNUX0lOREVYLCA2KTsgLyogSVJRNiAqLwogCi0JLyogSURFMSAqLwotCXNtc2NfY29uZmlnKENVUlJFTlRfTEROX0lOREVYLCBMRE5fSURFMSk7Ci0Jc21zY19jb25maWcoQUNUSVZBVEVfSU5ERVgsIDB4MDEpOwotCXNtc2NfY29uZmlnKElSUV9TRUxFQ1RfSU5ERVgsIDE0KTsgLyogSVJRMTQgKi8KLQogCS8qIEFVWElPIChHUElPKTogdG8gdXNlIElERTEgKi8KIAlzbXNjX2NvbmZpZyhDVVJSRU5UX0xETl9JTkRFWCwgTEROX0FVWElPKTsKIAlzbXNjX2NvbmZpZyhHUElPNDZfSU5ERVgsIDB4MDApOyAvKiBuSU9ST1AgKi8KQEAgLTY5LDYgKzYzLDM2IEBACiAJb3V0Yl9wKENPTkZJR19FWElULCBDT05GSUdfUE9SVCk7CiB9CiAKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGhlYXJ0YmVhdF9iaXRfcG9zW10gPSB7IDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUgfTsKKworc3RhdGljIHN0cnVjdCByZXNvdXJjZSBoZWFydGJlYXRfcmVzb3VyY2VzW10gPSB7CisJWzBdID0geworCQkuc3RhcnQJPSBQQV9MRUQsCisJCS5lbmQJPSBQQV9MRUQgKyBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9iaXRfcG9zKSAtIDEsCisJCS5mbGFncwk9IElPUkVTT1VSQ0VfTUVNLAorCX0sCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSBoZWFydGJlYXRfZGV2aWNlID0geworCS5uYW1lCQk9ICJoZWFydGJlYXQiLAorCS5pZAkJPSAtMSwKKwkuZGV2CT0geworCQkucGxhdGZvcm1fZGF0YQk9IGhlYXJ0YmVhdF9iaXRfcG9zLAorCX0sCisJLm51bV9yZXNvdXJjZXMJPSBBUlJBWV9TSVpFKGhlYXJ0YmVhdF9yZXNvdXJjZXMpLAorCS5yZXNvdXJjZQk9IGhlYXJ0YmVhdF9yZXNvdXJjZXMsCit9OworCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZSAqc2VfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmhlYXJ0YmVhdF9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzZV9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlX2RldmljZXMsIEFSUkFZX1NJWkUoc2VfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzZV9kZXZpY2VzX3NldHVwKTsKKwogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCkBAIC0xMDcsOCArMTMxLDUgQEAKIAkubXZfb3V0c2wJCT0gc2Vfb3V0c2wsCiAKIAkubXZfaW5pdF9pcnEJCT0gaW5pdF9zZV9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0X3NlLAotI2VuZGlmCiB9OwogQUxJQVNfTVYoc2UpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL01ha2VmaWxlIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9NYWtlZmlsZQppbmRleCAxODg5MDBjLi5kYmMyOWYzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvTWFrZWZpbGUKQEAgLTUsNCArNSwzIEBACiBvYmoteQkgOj0gc2V0dXAubyBpby5vIGlycS5vCiAKIG9iai0kKENPTkZJR19QQ0kpICs9IHBjaS5vCi1vYmotJChDT05GSUdfSEVBUlRCRUFUKSArPSBsZWQubwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9sZWQuYyBiL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvbGVkLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNDE5NGQuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9sZWQuYworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8qCi0gKiBsaW51eC9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL2xlZC5jCi0gKgotICogQ29weXJpZ2h0IChDKSAyMDAwIFN0dWFydCBNZW5lZnkgPHN0dWFydC5tZW5lZnlAc3QuY29tPgotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBUaGlzIGZpbGUgY29udGFpbnMgU29sdXRpb24gRW5naW5lIHNwZWNpZmljIExFRCBjb2RlLgotICovCi0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxhc20vc2U3NzUxLmg+Ci0KLS8qIEN5Y2xlIHRoZSBMRUQncyBpbiB0aGUgY2xhc2ljIEtuaWdodHJpZGVyL1N1biBwYXR0ZXJuICovCi12b2lkIGhlYXJ0YmVhdF83NzUxc2Uodm9pZCkKLXsKLQlzdGF0aWMgdW5zaWduZWQgaW50IGNudCA9IDAsIHBlcmlvZCA9IDA7Ci0Jdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqIHAgPSAodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQqKVBBX0xFRDsKLQlzdGF0aWMgdW5zaWduZWQgYml0ID0gMCwgdXAgPSAxOwotCi0JY250ICs9IDE7Ci0JaWYgKGNudCA8IHBlcmlvZCkgewotCQlyZXR1cm47Ci0JfQotCi0JY250ID0gMDsKLQotCS8qIEdvIHRocm91Z2ggdGhlIHBvaW50cyAocm91Z2hseSEpOgotCSAqIGYoMCk9MTAsIGYoMSk9MTYsIGYoMik9MjAsIGYoNSk9MzUsZihpbmYpLT4xMTAKLQkgKi8KLQlwZXJpb2QgPSAxMTAgLSAoICgzMDA8PEZTSElGVCkvCi0JCQkgKChhdmVucnVuWzBdLzUpICsgKDM8PEZTSElGVCkpICk7Ci0KLQlpZiAodXApIHsKLQkJaWYgKGJpdCA9PSA3KSB7Ci0JCQliaXQtLTsKLQkJCXVwPTA7Ci0JCX0gZWxzZSB7Ci0JCQliaXQgKys7Ci0JCX0KLQl9IGVsc2UgewotCQlpZiAoYml0ID09IDApIHsKLQkJCWJpdCsrOwotCQkJdXA9MTsKLQkJfSBlbHNlIHsKLQkJCWJpdC0tOwotCQl9Ci0JfQotCSpwID0gMTw8KGJpdCs4KTsKLQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2UvNzc1MS9zZXR1cC5jCmluZGV4IGY3ZTFkZDMuLmUzZmVhZTYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NlLzc3NTEvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zZS83NzUxL3NldHVwLmMKQEAgLTksMTEgKzksMTEgQEAKICAqIElhbiBkYSBTaWx2YSBhbmQgSmVyZW15IFNpZWdlbCwgMjAwMS4KICAqLwogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgogI2luY2x1ZGUgPGFzbS9zZTc3NTEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotdm9pZCBoZWFydGJlYXRfNzc1MXNlKHZvaWQpOwogdm9pZCBpbml0Xzc3NTFzZV9JUlEodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfU0hfS0dEQgpAQCAtMTYxLDExICsxNjEsNDAgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfU0hfS0dEQiAqLwogCitzdGF0aWMgdW5zaWduZWQgY2hhciBoZWFydGJlYXRfYml0X3Bvc1tdID0geyA4LCA5LCAxMCwgMTEsIDEyLCAxMywgMTQsIDE1IH07CisKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGVhcnRiZWF0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gUEFfTEVELAorCQkuZW5kCT0gUEFfTEVEICsgQVJSQVlfU0laRShoZWFydGJlYXRfYml0X3BvcykgLSAxLAorCQkuZmxhZ3MJPSBJT1JFU09VUkNFX01FTSwKKwl9LAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgaGVhcnRiZWF0X2RldmljZSA9IHsKKwkubmFtZQkJPSAiaGVhcnRiZWF0IiwKKwkuaWQJCT0gLTEsCisJLmRldgk9IHsKKwkJLnBsYXRmb3JtX2RhdGEJPSBoZWFydGJlYXRfYml0X3BvcywKKwl9LAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNlNzc1MV9kZXZpY2VzW10gX19pbml0ZGF0YSA9IHsKKwkmc21jOTF4X2RldmljZSwKKwkmaGVhcnRiZWF0X2RldmljZSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHNlNzc1MV9kZXZpY2VzX3NldHVwKHZvaWQpCit7CisJcmV0dXJuIHBsYXRmb3JtX2FkZF9kZXZpY2VzKHNlNzc1MV9kZXZpY2VzLCBBUlJBWV9TSVpFKHNlNzc1MV9kZXZpY2VzKSk7Cit9CitfX2luaXRjYWxsKHNlNzc1MV9kZXZpY2VzX3NldHVwKTsKIAogLyoKICAqIFRoZSBNYWNoaW5lIFZlY3RvcgogICovCi0KIHN0cnVjdCBzaF9tYWNoaW5lX3ZlY3RvciBtdl83NzUxc2UgX19pbml0bXYgPSB7CiAJLm12X25hbWUJCT0gIjc3NTEgU29sdXRpb25FbmdpbmUiLAogCS5tdl9zZXR1cAkJPSBzaDc3NTFzZV9zZXR1cCwKQEAgLTE4OSw4ICsyMTgsNSBAQAogCS5tdl9vdXRzbAkJPSBzaDc3NTFzZV9vdXRzbCwKIAogCS5tdl9pbml0X2lycQkJPSBpbml0Xzc3NTFzZV9JUlEsCi0jaWZkZWYgQ09ORklHX0hFQVJUQkVBVAotCS5tdl9oZWFydGJlYXQJCT0gaGVhcnRiZWF0Xzc3NTFzZSwKLSNlbmRpZgogfTsKIEFMSUFTX01WKDc3NTFzZSkKZGlmZiAtLWdpdCBhL2FyY2gvc2gvYm9hcmRzL3NoMDMvTWFrZWZpbGUgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL01ha2VmaWxlCmluZGV4IDMyMWJlNTAuLjQwMDMwNmEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NoMDMvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9NYWtlZmlsZQpAQCAtMyw0ICszLDMgQEAKICMKIAogb2JqLXkJIDo9IHNldHVwLm8gcnRjLm8KLW9iai0kKENPTkZJR19IRUFSVEJFQVQpICs9IGxlZC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaDAzL2xlZC5jIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9sZWQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4NTYyYS4uMDAwMDAwMAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaDAzL2xlZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLyoKLSAqIGxpbnV4L2FyY2gvc2gvYm9hcmRzL3NoMDMvbGVkLmMKLSAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQgIFNhaXRvLksgSW50ZXJmYWNlIENvcnBvcmF0aW9uLgotICoKLSAqIFRoaXMgZmlsZSBjb250YWlucyBJbnRlcmZhY2UgQ1RQL1BDSS1TSDAzIHNwZWNpZmljIExFRCBjb2RlLgotICovCi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotCi0vKiBDeWNsZSB0aGUgTEVEJ3MgaW4gdGhlIGNsYXNpYyBLbmlnaHRyaWRlci9TdW4gcGF0dGVybiAqLwotdm9pZCBoZWFydGJlYXRfc2gwMyh2b2lkKQotewotCXN0YXRpYyB1bnNpZ25lZCBpbnQgY250ID0gMCwgcGVyaW9kID0gMDsKLQl2b2xhdGlsZSB1bnNpZ25lZCBjaGFyKiBwID0gKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIqKTB4YTA4MDAwMDA7Ci0Jc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKLQotCWNudCArPSAxOwotCWlmIChjbnQgPCBwZXJpb2QpIHsKLQkJcmV0dXJuOwotCX0KLQotCWNudCA9IDA7Ci0KLQkvKiBHbyB0aHJvdWdoIHRoZSBwb2ludHMgKHJvdWdobHkhKToKLQkgKiBmKDApPTEwLCBmKDEpPTE2LCBmKDIpPTIwLCBmKDUpPTM1LGYoaW5mKS0+MTEwCi0JICovCi0JcGVyaW9kID0gMTEwIC0gKCAoMzAwPDxGU0hJRlQpLwotCQkJICgoYXZlbnJ1blswXS81KSArICgzPDxGU0hJRlQpKSApOwotCi0JaWYgKHVwKSB7Ci0JCWlmIChiaXQgPT0gNykgewotCQkJYml0LS07Ci0JCQl1cD0wOwotCQl9IGVsc2UgewotCQkJYml0ICsrOwotCQl9Ci0JfSBlbHNlIHsKLQkJaWYgKGJpdCA9PSAwKSB7Ci0JCQliaXQrKzsKLQkJCXVwPTE7Ci0JCX0gZWxzZSB7Ci0JCQliaXQtLTsKLQkJfQotCX0KLQkqcCA9IDE8PGJpdDsKLQotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2gwMy9zZXR1cC5jCmluZGV4IDVhZDFlMTkuLmMwNjljNDQgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvYm9hcmRzL3NoMDMvc2V0dXAuYworKysgYi9hcmNoL3NoL2JvYXJkcy9zaDAzL3NldHVwLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgPGFzbS9ydGMuaD4KICNpbmNsdWRlIDxhc20vc2gwMy9pby5oPgpAQCAtNDgsMTUgKzQ5LDM2IEBACiAJYm9hcmRfdGltZV9pbml0ID0gc2gwM190aW1lX2luaXQ7CiB9CiAKK3N0YXRpYyBzdHJ1Y3QgcmVzb3VyY2UgaGVhcnRiZWF0X3Jlc291cmNlc1tdID0geworCVswXSA9IHsKKwkJLnN0YXJ0CT0gMHhhMDgwMDAwMCwKKwkJLmVuZAk9IDB4YTA4MDAwMDAgKyA4IC0gMSwKKwkJLmZsYWdzCT0gSU9SRVNPVVJDRV9NRU0sCisJfSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlIGhlYXJ0YmVhdF9kZXZpY2UgPSB7CisJLm5hbWUJCT0gImhlYXJ0YmVhdCIsCisJLmlkCQk9IC0xLAorCS5udW1fcmVzb3VyY2VzCT0gQVJSQVlfU0laRShoZWFydGJlYXRfcmVzb3VyY2VzKSwKKwkucmVzb3VyY2UJPSBoZWFydGJlYXRfcmVzb3VyY2VzLAorfTsKKworc3RhdGljIHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnNoMDNfZGV2aWNlc1tdIF9faW5pdGRhdGEgPSB7CisJJmhlYXJ0YmVhdF9kZXZpY2UsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzaDAzX2RldmljZXNfc2V0dXAodm9pZCkKK3sKKwlyZXR1cm4gcGxhdGZvcm1fYWRkX2RldmljZXMoc2gwM19kZXZpY2VzLCBBUlJBWV9TSVpFKHNoMDNfZGV2aWNlcykpOworfQorX19pbml0Y2FsbChzaDAzX2RldmljZXNfc2V0dXApOworCiBzdHJ1Y3Qgc2hfbWFjaGluZV92ZWN0b3IgbXZfc2gwMyBfX2luaXRtdiA9IHsKIAkubXZfbmFtZQkJPSAiSW50ZXJmYWNlIChDVFAvUENJLVNIMDMpIiwKIAkubXZfc2V0dXAJCT0gc2gwM19zZXR1cCwKIAkubXZfbnJfaXJxcwkJPSA0OCwKIAkubXZfaW9wb3J0X21hcAkJPSBzaDAzX2lvcG9ydF9tYXAsCiAJLm12X2luaXRfaXJxCQk9IGluaXRfc2gwM19JUlEsCi0KLSNpZmRlZiBDT05GSUdfSEVBUlRCRUFUCi0JLm12X2hlYXJ0YmVhdAkJPSBoZWFydGJlYXRfc2gwMywKLSNlbmRpZgogfTsKIEFMSUFTX01WKHNoMDMpCmRpZmYgLS1naXQgYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jIGIvYXJjaC9zaC9ib2FyZHMvc2htaW4vc2V0dXAuYwppbmRleCBhMzFhMWQxLi40YTlkZjRhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2JvYXJkcy9zaG1pbi9zZXR1cC5jCisrKyBiL2FyY2gvc2gvYm9hcmRzL3NobWluL3NldHVwLmMKQEAgLTEyLDEyICsxMiwyMiBAQAogI2luY2x1ZGUgPGFzbS9pcnEuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAotI2RlZmluZSBQRkNfUEhDUgkweGE0MDAwMTBlCisjZGVmaW5lIFBGQ19QSENSCTB4YTQwMDAxMGVVTAorI2RlZmluZSBJTlRDX0lDUjEJMHhhNDAwMDAxMFVMCisjZGVmaW5lIElOVENfSVBSQwkweGE0MDAwMDE2VUwKKworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaG1pbl9pcHJfbWFwW10gPSB7CisJeyAuaXJxPTMyLCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0gMCwgLnByaW9yaXR5PTAgfSwKKwl7IC5pcnE9MzMsIC5hZGRyPUlOVENfSVBSQywgLnNoaWZ0PSA0LCAucHJpb3JpdHk9MCB9LAorCXsgLmlycT0zNCwgLmFkZHI9SU5UQ19JUFJDLCAuc2hpZnQ9IDgsIC5wcmlvcml0eT04IH0sCisJeyAuaXJxPTM1LCAuYWRkcj1JTlRDX0lQUkMsIC5zaGlmdD0xMiwgLnByaW9yaXR5PTAgfSwKK307CiAKIHN0YXRpYyB2b2lkIF9faW5pdCBpbml0X3NobWluX2lycSh2b2lkKQogewogCWN0cmxfb3V0dygweDJhMDAsIFBGQ19QSENSKTsJLy8gSVJRMC0zPUlSUQogCWN0cmxfb3V0dygweDBhYWEsIElOVENfSUNSMSk7CS8vIElSUTAtMz1JUlEtbW9kZSxMb3ctYWN0aXZlLgorCW1ha2VfaXByX2lycShzaG1pbl9pcHJfbWFwLCBBUlJBWV9TSVpFKHNobWluX2lwcl9tYXApKTsKIH0KIAogc3RhdGljIHZvaWQgX19pb21lbSAqc2htaW5faW9wb3J0X21hcCh1bnNpZ25lZCBsb25nIHBvcnQsIHVuc2lnbmVkIGludCBzaXplKQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jIGIvYXJjaC9zaC9jY2hpcHMvdm95YWdlcmd4L2lycS5jCmluZGV4IGY3ZWE3MDAuLjcwZjEyOTAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9pcnEuYworKysgYi9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvaXJxLmMKQEAgLTI4LDIxICsyOCwyMSBAQAogCXVuc2lnbmVkIGxvbmcgdmFsOwogCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGlycSAtIFZPWUFHRVJfSVJRX0JBU0UpOwogCi0gICAgCXByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSVseFxuIiwgaXJxLCBtYXNrKTsKLSAgICAgICAgdmFsID0gaW5sKFZPWUFHRVJfSU5UX01BU0spOwotICAgICAgICB2YWwgJj0gfm1hc2s7Ci0gICAgICAgIG91dGwodmFsLCBWT1lBR0VSX0lOVF9NQVNLKTsKKwlwcl9kZWJ1ZygiZGlzYWJsZV92b3lhZ2VyZ3hfaXJxKCVkKTogbWFzaz0leFxuIiwgaXJxLCBtYXNrKTsKKwl2YWwgPSByZWFkbCgodm9pZCBfX2lvbWVtICopVk9ZQUdFUl9JTlRfTUFTSyk7CisJdmFsICY9IH5tYXNrOworCXdyaXRlbCh2YWwsICh2b2lkIF9faW9tZW0gKilWT1lBR0VSX0lOVF9NQVNLKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX3ZveWFnZXJneF9pcnEodW5zaWduZWQgaW50IGlycSkKIHsKLSAgICAgICAgdW5zaWduZWQgbG9uZyB2YWw7Ci0gICAgICAgIHVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGlycSAtIFZPWUFHRVJfSVJRX0JBU0UpOworCXVuc2lnbmVkIGxvbmcgdmFsOworCXVuc2lnbmVkIGxvbmcgbWFzayA9IDEgPDwgKGlycSAtIFZPWUFHRVJfSVJRX0JBU0UpOwogCi0gICAgICAgIHByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSVseFxuIiwgaXJxLCBtYXNrKTsKLSAgICAgICAgdmFsID0gaW5sKFZPWUFHRVJfSU5UX01BU0spOwotICAgICAgICB2YWwgfD0gbWFzazsKLSAgICAgICAgb3V0bCh2YWwsIFZPWUFHRVJfSU5UX01BU0spOworCXByX2RlYnVnKCJkaXNhYmxlX3ZveWFnZXJneF9pcnEoJWQpOiBtYXNrPSV4XG4iLCBpcnEsIG1hc2spOworCXZhbCA9IHJlYWRsKCh2b2lkIF9faW9tZW0gKilWT1lBR0VSX0lOVF9NQVNLKTsKKwl2YWwgfD0gbWFzazsKKwl3cml0ZWwodmFsLCAodm9pZCBfX2lvbWVtICopVk9ZQUdFUl9JTlRfTUFTSyk7CiB9CiAKIHN0YXRpYyB2b2lkIG1hc2tfYW5kX2Fja192b3lhZ2VyZ3godW5zaWduZWQgaW50IGlycSkKQEAgLTY4LDIwICs2OCwyMCBAQAogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIHZveWFnZXJneF9pcnFfdHlwZSA9IHsKLQkudHlwZW5hbWUgPSAiVk9ZQUdFUkdYLUlSUSIsCi0JLnN0YXJ0dXAgPSBzdGFydHVwX3ZveWFnZXJneF9pcnEsCi0JLnNodXRkb3duID0gc2h1dGRvd25fdm95YWdlcmd4X2lycSwKLQkuZW5hYmxlID0gZW5hYmxlX3ZveWFnZXJneF9pcnEsCi0JLmRpc2FibGUgPSBkaXNhYmxlX3ZveWFnZXJneF9pcnEsCi0JLmFjayA9IG1hc2tfYW5kX2Fja192b3lhZ2VyZ3gsCi0JLmVuZCA9IGVuZF92b3lhZ2VyZ3hfaXJxLAorCS50eXBlbmFtZQk9ICJWT1lBR0VSR1gtSVJRIiwKKwkuc3RhcnR1cAk9IHN0YXJ0dXBfdm95YWdlcmd4X2lycSwKKwkuc2h1dGRvd24JPSBzaHV0ZG93bl92b3lhZ2VyZ3hfaXJxLAorCS5lbmFibGUJCT0gZW5hYmxlX3ZveWFnZXJneF9pcnEsCisJLmRpc2FibGUJPSBkaXNhYmxlX3ZveWFnZXJneF9pcnEsCisJLmFjawkJPSBtYXNrX2FuZF9hY2tfdm95YWdlcmd4LAorCS5lbmQJCT0gZW5kX3ZveWFnZXJneF9pcnEsCiB9OwogCiBzdGF0aWMgaXJxcmV0dXJuX3Qgdm95YWdlcmd4X2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpCiB7CiAJcHJpbnRrKEtFUk5fSU5GTwogCSAgICAgICAiVm95YWdlckdYOiBzcHVyaW91cyBpbnRlcnJ1cHQsIHN0YXR1czogMHgleFxuIiwKLQkgICAgICAgCQlpbmwoSU5UX1NUQVRVUykpOworCQkJKHVuc2lnbmVkIGludClyZWFkbCgodm9pZCBfX2lvbWVtICopSU5UX1NUQVRVUykpOwogCXJldHVybiBJUlFfSEFORExFRDsKIH0KIApAQCAtOTMsMTMgKzkzLDEzIEBACiB2b2lkIHZveWFnZXJneF9yZWdpc3Rlcl9pcnFfZGVtdXgoaW50IGlycSwKIAkJaW50ICgqZGVtdXgpKGludCBpcnEsIHZvaWQgKmRldiksIHZvaWQgKmRldikKIHsKLSAgICAJdm95YWdlcmd4X2RlbXV4W2lycSAtIFZPWUFHRVJfSVJRX0JBU0VdLmZ1bmMgPSBkZW11eDsKLSAgICAJdm95YWdlcmd4X2RlbXV4W2lycSAtIFZPWUFHRVJfSVJRX0JBU0VdLmRldiA9IGRldjsKKwl2b3lhZ2VyZ3hfZGVtdXhbaXJxIC0gVk9ZQUdFUl9JUlFfQkFTRV0uZnVuYyA9IGRlbXV4OworCXZveWFnZXJneF9kZW11eFtpcnEgLSBWT1lBR0VSX0lSUV9CQVNFXS5kZXYgPSBkZXY7CiB9CiAKIHZvaWQgdm95YWdlcmd4X3VucmVnaXN0ZXJfaXJxX2RlbXV4KGludCBpcnEpCiB7Ci0gICAgCXZveWFnZXJneF9kZW11eFtpcnEgLSBWT1lBR0VSX0lSUV9CQVNFXS5mdW5jID0gMDsKKwl2b3lhZ2VyZ3hfZGVtdXhbaXJxIC0gVk9ZQUdFUl9JUlFfQkFTRV0uZnVuYyA9IDA7CiB9CiAKIGludCB2b3lhZ2VyZ3hfaXJxX2RlbXV4KGludCBpcnEpCkBAIC0xMDcsMzEgKzEwNywyNSBAQAogCiAJaWYgKGlycSA9PSBJUlFfVk9ZQUdFUiApIHsKIAkJdW5zaWduZWQgbG9uZyBpID0gMCwgYml0IF9fYXR0cmlidXRlX18gKCh1bnVzZWQpKTsKLQkJdW5zaWduZWQgbG9uZyB2YWwgID0gaW5sKElOVF9TVEFUVVMpOwotI2lmIDEKLQkJaWYgKCB2YWwgJiAoIDEgPDwgMSApKXsKKwkJdW5zaWduZWQgbG9uZyB2YWwgID0gcmVhZGwoKHZvaWQgX19pb21lbSAqKUlOVF9TVEFUVVMpOworCisJCWlmICh2YWwgJiAoMSA8PCAxKSkKIAkJCWkgPSAxOwotCQl9IGVsc2UgaWYgKCB2YWwgJiAoIDEgPDwgMiApKXsKKwkJZWxzZSBpZiAodmFsICYgKDEgPDwgMikpCiAJCQlpID0gMjsKLQkJfSBlbHNlIGlmICggdmFsICYgKCAxIDw8IDYgKSl7CisJCWVsc2UgaWYgKHZhbCAmICgxIDw8IDYpKQogCQkJaSA9IDY7Ci0JCX0gZWxzZSBpZiggdmFsICYgKCAxIDw8IDEwICkpeworCQllbHNlIGlmICh2YWwgJiAoMSA8PCAxMCkpCiAJCQlpID0gMTA7Ci0JCX0gZWxzZSBpZiggdmFsICYgKCAxIDw8IDExICkpeworCQllbHNlIGlmICh2YWwgJiAoMSA8PCAxMSkpCiAJCQlpID0gMTE7Ci0JCX0gZWxzZSBpZiggdmFsICYgKCAxIDw8IDEyICkpeworCQllbHNlIGlmICh2YWwgJiAoMSA8PCAxMikpCiAJCQlpID0gMTI7Ci0JCX0gZWxzZSBpZiggdmFsICYgKCAxIDw8IDE3ICkpeworCQllbHNlIGlmICh2YWwgJiAoMSA8PCAxNykpCiAJCQlpID0gMTc7Ci0JCX0gZWxzZSB7CisJCWVsc2UKIAkJCXByaW50aygiVW5leHBlY3RlZCBJUlEgaXJxID0gJWQgc3RhdHVzID0gMHglMDhseFxuIiwgaXJxLCB2YWwpOwotCQl9Ci0JCXByX2RlYnVnKCJ2b3lhZ2VyZ3hfaXJxX2RlbXV4ICVsZFxuIiwgaSk7Ci0jZWxzZQotCQlmb3IgKGJpdCA9IDEsIGkgPSAwIDsgaSA8IFZPWUFHRVJfSVJRX05VTSA7IGJpdCA8PD0gMSwgaSsrKQotCQkJaWYgKHZhbCAmIGJpdCkKLQkJCQlicmVhazsKLSNlbmRpZgorCQlwcl9kZWJ1Zygidm95YWdlcmd4X2lycV9kZW11eCAlZCBcbiIsIGkpOwogICAgIAkgICAgCWlmIChpIDwgVk9ZQUdFUl9JUlFfTlVNKSB7CiAJCQlpcnEgPSBWT1lBR0VSX0lSUV9CQVNFICsgaTsKICAgICAJICAgIAkJaWYgKHZveWFnZXJneF9kZW11eFtpXS5mdW5jICE9IDApCmRpZmYgLS1naXQgYS9hcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvc2V0dXAuYyBiL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9zZXR1cC5jCmluZGV4IDY2YjJmZWQuLjMzZjAzMDIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9zZXR1cC5jCisrKyBiL2FyY2gvc2gvY2NoaXBzL3ZveWFnZXJneC9zZXR1cC5jCkBAIC0xOSw3ICsxOSw3IEBACiB7CiAJdW5zaWduZWQgbG9uZyB2YWw7CiAKLQl2YWwgPSBpbmwoRFJBTV9DVFJMKTsKKwl2YWwgPSByZWFkbCgodm9pZCBfX2lvbWVtICopRFJBTV9DVFJMKTsKIAl2YWwgfD0gKERSQU1fQ1RSTF9DUFVfQ09MVU1OX1NJWkVfMjU2CXwKIAkJRFJBTV9DVFJMX0NQVV9BQ1RJVkVfUFJFQ0hBUkdFCXwKIAkJRFJBTV9DVFJMX0NQVV9SRVNFVAkJfApAQCAtMjksNyArMjksNyBAQAogCQlEUkFNX0NUUkxfQUNUSVZFX1BSRUNIQVJHRQl8CiAJCURSQU1fQ1RSTF9SRVNFVAkJCXwKIAkJRFJBTV9DVFJMX1JFTUFJTl9BQ1RJVkUpOwotCW91dGwodmFsLCBEUkFNX0NUUkwpOworCXdyaXRlbCh2YWwsICh2b2lkIF9faW9tZW0gKilEUkFNX0NUUkwpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3MvcnRzNzc1MXIyZF9kZWZjb25maWcKaW5kZXggMDk5ZTk4Zi4uZGI2YTAyZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9jb25maWdzL3J0czc3NTFyMmRfZGVmY29uZmlnCisrKyBiL2FyY2gvc2gvY29uZmlncy9ydHM3NzUxcjJkX2RlZmNvbmZpZwpAQCAtMSwxNSArMSwyMSBAQAogIwogIyBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBtYWtlIGNvbmZpZzogZG9uJ3QgZWRpdAotIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjE4Ci0jIFR1ZSBPY3QgIDMgMTE6Mzg6MzYgMjAwNgorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjIwCisjIFRodSBGZWIgMTUgMTc6MTc6MjkgMjAwNwogIwogQ09ORklHX1NVUEVSSD15CiBDT05GSUdfUldTRU1fR0VORVJJQ19TUElOTE9DSz15CiBDT05GSUdfR0VORVJJQ19GSU5EX05FWFRfQklUPXkKIENPTkZJR19HRU5FUklDX0hXRUlHSFQ9eQogQ09ORklHX0dFTkVSSUNfSEFSRElSUVM9eQorQ09ORklHX0dFTkVSSUNfSEFSRElSUVNfTk9fX0RPX0lSUT15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKKyMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0zMyw4ICszOSw4IEBACiAjIENPTkZJR19VVFNfTlMgaXMgbm90IHNldAogIyBDT05GSUdfQVVESVQgaXMgbm90IHNldAogIyBDT05GSUdfSUtDT05GSUcgaXMgbm90IHNldAorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAotQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVEw9eQogQ09ORklHX0VNQkVEREVEPXkKQEAgLTk3LDEwICsxMDMsOCBAQAogIyBDT05GSUdfU0hfNzMxODBfU09MVVRJT05fRU5HSU5FIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIXzc3NTFfU1lTVEVNSCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9IUDZYWCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9FQzMxMDQgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU0FUVVJOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX0RSRUFNQ0FTVCBpcyBub3Qgc2V0Ci0jIENPTkZJR19TSF9CSUdTVVIgaXMgbm90IHNldAogIyBDT05GSUdfU0hfTVBDMTIxMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TSDAzIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NFQ1VSRUVER0U1NDEwIGlzIG5vdCBzZXQKQEAgLTExMyw2ICsxMTcsOSBAQAogIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF9BU0RBUDMxMCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKIAogIwpAQCAtMTI0LDYgKzEzMSwxMiBAQAogIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0CiAjCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKworIworIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKIAogIwogIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CkBAIC0xNTksMTIgKzE3MiwxNCBAQAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAogCiAjCiAjIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0xNzQsNiArMTg5LDkgQEAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDQwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTE4Myw2ICsyMDEsNyBAQAogIyBDT05GSUdfU1BBUlNFTUVNX1NUQVRJQyBpcyBub3Qgc2V0CiBDT05GSUdfU1BMSVRfUFRMT0NLX0NQVVM9NAogIyBDT05GSUdfUkVTT1VSQ0VTXzY0QklUIGlzIG5vdCBzZXQKK0NPTkZJR19aT05FX0RNQV9GTEFHPTAKIAogIwogIyBDYWNoZSBjb25maWd1cmF0aW9uCkBAIC0xOTUsMTEgKzIxNCwxNCBAQAogIyBQcm9jZXNzb3IgZmVhdHVyZXMKICMKIENPTkZJR19DUFVfTElUVExFX0VORElBTj15CisjIENPTkZJR19DUFVfQklHX0VORElBTiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfRlBVPXkKICMgQ09ORklHX1NIX0RTUCBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVE9SRV9RVUVVRVMgaXMgbm90IHNldAogQ09ORklHX0NQVV9IQVNfSU5URVZUPXkKK0NPTkZJR19DUFVfSEFTX0lQUl9JUlE9eQogQ09ORklHX0NQVV9IQVNfU1JfUkI9eQorQ09ORklHX0NQVV9IQVNfUFRFQT15CiAKICMKICMgVGltZXIgc3VwcG9ydApAQCAtMjEwLDYgKzIzMiw4IEBACiAjIFJUUzc3NTFSMkQgb3B0aW9ucwogIwogQ09ORklHX1JUUzc3NTFSMkRfUkVWMTE9eQorQ09ORklHX1NIX1RJTUVSX0lSUT0xNgorIyBDT05GSUdfTk9fSURMRV9IWiBpcyBub3Qgc2V0CiBDT05GSUdfU0hfUENMS19GUkVRPTYwMDAwMDAwCiAKICMKQEAgLTIzMiwxMCArMjU2LDE2IEBACiBDT05GSUdfSEVBUlRCRUFUPXkKIAogIworIyBBZGRpdGlvbmFsIFN1cGVySCBEZXZpY2UgRHJpdmVycworIworIyBDT05GSUdfUFVTSF9TV0lUQ0ggaXMgbm90IHNldAorCisjCiAjIEtlcm5lbCBmZWF0dXJlcwogIwogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKIENPTkZJR19IWl8yNTA9eQorIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMDAgaXMgbm90IHNldAogQ09ORklHX0haPTI1MAogIyBDT05GSUdfS0VYRUMgaXMgbm90IHNldApAQCAtMjUxLDcgKzI4MSw3IEBACiBDT05GSUdfQk9PVF9MSU5LX09GRlNFVD0weDAwODAwMDAwCiAjIENPTkZJR19VQkNfV0FLRVVQIGlzIG5vdCBzZXQKIENPTkZJR19DTURMSU5FX0JPT0w9eQotQ09ORklHX0NNRExJTkU9Im1lbT02NE0gY29uc29sZT10dHlTQzAsMTE1MjAwIHJvb3Q9L2Rldi9oZGExIgorQ09ORklHX0NNRExJTkU9ImNvbnNvbGU9dHR5U0MwLDExNTIwMCByb290PS9kZXYvc2RhMSIKIAogIwogIyBCdXMgb3B0aW9ucwpAQCAtMjYwLDcgKzI5MCw2IEBACiBDT05GSUdfU0hfUENJRE1BX05PTkNPSEVSRU5UPXkKIENPTkZJR19QQ0lfQVVUTz15CiBDT05GSUdfUENJX0FVVE9fVVBEQVRFX1JFU09VUkNFUz15Ci0jIENPTkZJR19QQ0lfTVVMVElUSFJFQURfUFJPQkUgaXMgbm90IHNldAogCiAjCiAjIFBDQ0FSRCAoUENNQ0lBL0NhcmRCdXMpIHN1cHBvcnQKQEAgLTMwMiw2ICszMzEsNyBAQAogQ09ORklHX1hGUk09eQogIyBDT05GSUdfWEZSTV9VU0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGUk1fU1VCX1BPTElDWSBpcyBub3Qgc2V0CisjIENPTkZJR19YRlJNX01JR1JBVEUgaXMgbm90IHNldAogIyBDT05GSUdfTkVUX0tFWSBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVD15CiAjIENPTkZJR19JUF9NVUxUSUNBU1QgaXMgbm90IHNldApAQCAtMzE5LDExICszNDksMTMgQEAKICMgQ09ORklHX0lORVRfVFVOTkVMIGlzIG5vdCBzZXQKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UUkFOU1BPUlQ9eQogQ09ORklHX0lORVRfWEZSTV9NT0RFX1RVTk5FTD15CitDT05GSUdfSU5FVF9YRlJNX01PREVfQkVFVD15CiBDT05GSUdfSU5FVF9ESUFHPXkKIENPTkZJR19JTkVUX1RDUF9ESUFHPXkKICMgQ09ORklHX1RDUF9DT05HX0FEVkFOQ0VEIGlzIG5vdCBzZXQKIENPTkZJR19UQ1BfQ09OR19DVUJJQz15CiBDT05GSUdfREVGQVVMVF9UQ1BfQ09ORz0iY3ViaWMiCisjIENPTkZJR19UQ1BfTUQ1U0lHIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQVjYgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfWEZSTV9UVU5ORUwgaXMgbm90IHNldAogIyBDT05GSUdfSU5FVDZfVFVOTkVMIGlzIG5vdCBzZXQKQEAgLTM4MCw3ICs0MTIsNyBAQAogIwogQ09ORklHX1NUQU5EQUxPTkU9eQogQ09ORklHX1BSRVZFTlRfRklSTVdBUkVfQlVJTEQ9eQotIyBDT05GSUdfRldfTE9BREVSIGlzIG5vdCBzZXQKK0NPTkZJR19GV19MT0FERVI9bQogIyBDT05GSUdfU1lTX0hZUEVSVklTT1IgaXMgbm90IHNldAogCiAjCkBAIC00MjIsNDQgKzQ1NCwxNDUgQEAKICMgQ09ORklHX0FUQV9PVkVSX0VUSCBpcyBub3Qgc2V0CiAKICMKKyMgTWlzYyBkZXZpY2VzCisjCisjIENPTkZJR19TR0lfSU9DNCBpcyBub3Qgc2V0CisjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAorCisjCiAjIEFUQS9BVEFQSS9NRk0vUkxMIHN1cHBvcnQKICMKLUNPTkZJR19JREU9eQotQ09ORklHX0lERV9NQVhfSFdJRlM9NAotQ09ORklHX0JMS19ERVZfSURFPXkKLQotIwotIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKLSMKLSMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSURFRElTSz15Ci0jIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0Ci0jIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAotIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAotIyBDT05GSUdfSURFX1RBU0tfSU9DVEwgaXMgbm90IHNldAotCi0jCi0jIElERSBjaGlwc2V0IHN1cHBvcnQvYnVnZml4ZXMKLSMKLUNPTkZJR19JREVfR0VORVJJQz15Ci0jIENPTkZJR19CTEtfREVWX0lERVBDSSBpcyBub3Qgc2V0Ci0jIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAorIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKIAogIwogIyBTQ1NJIGRldmljZSBzdXBwb3J0CiAjCiAjIENPTkZJR19SQUlEX0FUVFJTIGlzIG5vdCBzZXQKLSMgQ09ORklHX1NDU0kgaXMgbm90IHNldAorQ09ORklHX1NDU0k9eQorIyBDT05GSUdfU0NTSV9UR1QgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ORVRMSU5LIGlzIG5vdCBzZXQKK0NPTkZJR19TQ1NJX1BST0NfRlM9eQorCisjCisjIFNDU0kgc3VwcG9ydCB0eXBlIChkaXNrLCB0YXBlLCBDRC1ST00pCisjCitDT05GSUdfQkxLX0RFVl9TRD15CisjIENPTkZJR19DSFJfREVWX1NUIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfT1NTVCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX1NSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0cgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TQ0ggaXMgbm90IHNldAorCisjCisjIFNvbWUgU0NTSSBkZXZpY2VzIChlLmcuIENEIGp1a2Vib3gpIHN1cHBvcnQgbXVsdGlwbGUgTFVOcworIworIyBDT05GSUdfU0NTSV9NVUxUSV9MVU4gaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9DT05TVEFOVFMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9MT0dHSU5HIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0NBTl9BU1lOQyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBUcmFuc3BvcnRzCisjCisjIENPTkZJR19TQ1NJX1NQSV9BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0ZDX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVNDU0lfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TQVNfTElCU0FTIGlzIG5vdCBzZXQKKworIworIyBTQ1NJIGxvdy1sZXZlbCBkcml2ZXJzCisjCisjIENPTkZJR19JU0NTSV9UQ1AgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl8zV19YWFhYX1JBSUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV8zV185WFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUNBUkQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9BQUNSQUlEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDN1hYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzdYWFhfT0xEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQUlDNzlYWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0FJQzk0WFggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9EUFRfSTJPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQVJDTVNSIGlzIG5vdCBzZXQKKyMgQ09ORklHX01FR0FSQUlEX05FV0dFTiBpcyBub3Qgc2V0CisjIENPTkZJR19NRUdBUkFJRF9MRUdBQ1kgaXMgbm90IHNldAorIyBDT05GSUdfTUVHQVJBSURfU0FTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSFBUSU9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfRE1YMzE5MUQgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GVVRVUkVfRE9NQUlOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSVBTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JVElPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfSU5JQTEwMCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NURVggaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TWU01M0M4WFhfMiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lQUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1FMT0dJQ18xMjgwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfUUxBX0lTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTFBGQyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzk1eCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0RDMzkwVCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX05TUDMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9TUlAgaXMgbm90IHNldAogCiAjCiAjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwogIwotIyBDT05GSUdfQVRBIGlzIG5vdCBzZXQKK0NPTkZJR19BVEE9eQorIyBDT05GSUdfQVRBX05PTlNUQU5EQVJEIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfQUhDSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NWVyBpcyBub3Qgc2V0CisjIENPTkZJR19BVEFfUElJWCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX01WIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NBVEFfTlYgaXMgbm90IHNldAorIyBDT05GSUdfUERDX0FETUEgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9RU1RPUiBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1BST01JU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TWDQgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9TSUwyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1VMSSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19TQVRBX1ZJVEVTU0UgaXMgbm90IHNldAorIyBDT05GSUdfU0FUQV9JTklDMTYyWCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FMSSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FNRCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0FSVE9QIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQVRJSVhQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ01ENjRYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTIwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1M1NTMwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfQ1lQUkVTUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX0VGQVIgaXMgbm90IHNldAorIyBDT05GSUdfQVRBX0dFTkVSSUMgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzNjYgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzN1ggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9IUFQzWDJOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSFBUM1gzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjFYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSVQ4MjEzIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfSk1JQ1JPTiBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1RSSUZMRVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9NQVJWRUxMIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTVBJSVggaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PTERQSUlYIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfTkVUQ0VMTCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX05TODc0MTAgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9PUFRJIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfT1BUSURNQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1BEQ19PTEQgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9SQURJU1lTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfUloxMDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0MxMjAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBVEFfU0VSVkVSV09SS1MgaXMgbm90IHNldAorIyBDT05GSUdfUEFUQV9QREMyMDI3WCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJTDY4MCBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1NJUyBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1ZJQSBpcyBub3Qgc2V0CisjIENPTkZJR19QQVRBX1dJTkJPTkQgaXMgbm90IHNldAorQ09ORklHX1BBVEFfUExBVEZPUk09eQogCiAjCiAjIE11bHRpLWRldmljZSBzdXBwb3J0IChSQUlEIGFuZCBMVk0pCkBAIC00NzAsNiArNjAzLDkgQEAKICMgRnVzaW9uIE1QVCBkZXZpY2Ugc3VwcG9ydAogIwogIyBDT05GSUdfRlVTSU9OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TUEkgaXMgbm90IHNldAorIyBDT05GSUdfRlVTSU9OX0ZDIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZVU0lPTl9TQVMgaXMgbm90IHNldAogCiAjCiAjIElFRUUgMTM5NCAoRmlyZVdpcmUpIHN1cHBvcnQKQEAgLTU0MCw2ICs2NzYsNyBAQAogIyBDT05GSUdfU1VOREFOQ0UgaXMgbm90IHNldAogIyBDT05GSUdfVExBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19WSUFfUkhJTkUgaXMgbm90IHNldAorIyBDT05GSUdfU0M5MjAzMSBpcyBub3Qgc2V0CiAKICMKICMgRXRoZXJuZXQgKDEwMDAgTWJpdCkKQEAgLTU1OSwxNCArNjk2LDE3IEBACiAjIENPTkZJR19USUdPTjMgaXMgbm90IHNldAogIyBDT05GSUdfQk5YMiBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEEzWFhYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDEgaXMgbm90IHNldAogCiAjCiAjIEV0aGVybmV0ICgxMDAwMCBNYml0KQogIwogIyBDT05GSUdfQ0hFTFNJT19UMSBpcyBub3Qgc2V0CisjIENPTkZJR19DSEVMU0lPX1QzIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CiAjIENPTkZJR19NWVJJMTBHRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRYRU5fTklDIGlzIG5vdCBzZXQKIAogIwogIyBUb2tlbiBSaW5nIGRldmljZXMKQEAgLTYxMSw2ICs3NTEsNyBAQAogIyBDT05GSUdfSElQUEkgaXMgbm90IHNldAogIyBDT05GSUdfUFBQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMSVAgaXMgbm90IHNldAorIyBDT05GSUdfTkVUX0ZDIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIQVBFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19ORVRDT05TT0xFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFBPTEwgaXMgbm90IHNldApAQCAtNjQ2LDE0ICs3ODcsMjMgQEAKICMKICMgU2VyaWFsIGRyaXZlcnMKICMKLSMgQ09ORklHX1NFUklBTF84MjUwIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MD15CisjIENPTkZJR19TRVJJQUxfODI1MF9DT05TT0xFIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfODI1MF9QQ0k9eQorQ09ORklHX1NFUklBTF84MjUwX05SX1VBUlRTPTQKK0NPTkZJR19TRVJJQUxfODI1MF9SVU5USU1FX1VBUlRTPTQKKyMgQ09ORklHX1NFUklBTF84MjUwX0VYVEVOREVEIGlzIG5vdCBzZXQKIAogIwogIyBOb24tODI1MCBzZXJpYWwgcG9ydCBzdXBwb3J0CiAjCi0jIENPTkZJR19TRVJJQUxfU0hfU0NJIGlzIG5vdCBzZXQKK0NPTkZJR19TRVJJQUxfU0hfU0NJPXkKK0NPTkZJR19TRVJJQUxfU0hfU0NJX05SX1VBUlRTPTEKK0NPTkZJR19TRVJJQUxfU0hfU0NJX0NPTlNPTEU9eQorQ09ORklHX1NFUklBTF9DT1JFPXkKK0NPTkZJR19TRVJJQUxfQ09SRV9DT05TT0xFPXkKICMgQ09ORklHX1NFUklBTF9KU00gaXMgbm90IHNldAotIyBDT05GSUdfVU5JWDk4X1BUWVMgaXMgbm90IHNldAorQ09ORklHX1VOSVg5OF9QVFlTPXkKIENPTkZJR19MRUdBQ1lfUFRZUz15CiBDT05GSUdfTEVHQUNZX1BUWV9DT1VOVD0yNTYKIApAQCAtNjcxLDEwICs4MjEsNiBAQAogIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0CiAjIENPTkZJR19BUFBMSUNPTSBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19EUk0gaXMgbm90IHNldAogIyBDT05GSUdfUkFXX0RSSVZFUiBpcyBub3Qgc2V0CiAKQEAgLTY4Miw3ICs4MjgsNiBAQAogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTY5OCw2ICs4NDMsNyBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CkBAIC03MDYsMTggKzg1MiwxNCBAQAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKQEAgLTc1OSw3ICs5MDEsNiBAQAogQ09ORklHX1NORF9NUFU0MDFfVUFSVD1tCiBDT05GSUdfU05EX09QTDNfTElCPW0KIENPTkZJR19TTkRfQUM5N19DT0RFQz1tCi1DT05GSUdfU05EX0FDOTdfQlVTPW0KICMgQ09ORklHX1NORF9EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTVRQQVYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1NFUklBTF9VMTY1NTAgaXMgbm90IHNldApAQCAtNzgyLDYgKzkyMywxOCBAQAogIyBDT05GSUdfU05EX0NNSVBDSSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfQ1M0MjgxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9DUzQ2WFggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0RBUkxBMjAgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0dJTkEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfTEFZTEEyMCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfREFSTEEyNCBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfR0lOQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9MQVlMQTI0IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NT05BIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9NSUEgaXMgbm90IHNldAorIyBDT05GSUdfU05EX0VDSE8zRyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09JTyBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPREogaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKQEAgLTgwMSw2ICs5NTQsNyBAQAogIyBDT05GSUdfU05EX01JWEFSVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfTk0yNTYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1BDWEhSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9SSVBUSURFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9STUUzMiBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfUk1FOTYgaXMgbm90IHNldAogIyBDT05GSUdfU05EX1JNRTk2NTIgaXMgbm90IHNldApAQCAtODEzLDE3ICs5NjcsMjIgQEAKICMgQ09ORklHX1NORF9BQzk3X1BPV0VSX1NBVkUgaXMgbm90IHNldAogCiAjCisjIFNvQyBhdWRpbyBzdXBwb3J0CisjCisjIENPTkZJR19TTkRfU09DIGlzIG5vdCBzZXQKKworIwogIyBPcGVuIFNvdW5kIFN5c3RlbQogIwogQ09ORklHX1NPVU5EX1BSSU1FPW0KLSMgQ09ORklHX09TU19PQlNPTEVURV9EUklWRVIgaXMgbm90IHNldAorIyBDT05GSUdfT0JTT0xFVEVfT1NTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX0JUODc4IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NPVU5EX0VTMTM3MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9JQ0ggaXMgbm90IHNldAogIyBDT05GSUdfU09VTkRfVFJJREVOVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EQ0xBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TT1VORF9NU05EUElOIGlzIG5vdCBzZXQKICMgQ09ORklHX1NPVU5EX1ZJQTgyQ1hYWCBpcyBub3Qgc2V0CitDT05GSUdfQUM5N19CVVM9bQogCiAjCiAjIFVTQiBzdXBwb3J0CkBAIC04NzIsNyArMTAzMSwyOSBAQAogIwogIyBSZWFsIFRpbWUgQ2xvY2sKICMKLSMgQ09ORklHX1JUQ19DTEFTUyBpcyBub3Qgc2V0CitDT05GSUdfUlRDX0xJQj15CitDT05GSUdfUlRDX0NMQVNTPXkKK0NPTkZJR19SVENfSENUT1NZUz15CitDT05GSUdfUlRDX0hDVE9TWVNfREVWSUNFPSJydGMwIgorIyBDT05GSUdfUlRDX0RFQlVHIGlzIG5vdCBzZXQKKworIworIyBSVEMgaW50ZXJmYWNlcworIworQ09ORklHX1JUQ19JTlRGX1NZU0ZTPXkKK0NPTkZJR19SVENfSU5URl9QUk9DPXkKK0NPTkZJR19SVENfSU5URl9ERVY9eQorIyBDT05GSUdfUlRDX0lOVEZfREVWX1VJRV9FTVVMIGlzIG5vdCBzZXQKKworIworIyBSVEMgZHJpdmVycworIworIyBDT05GSUdfUlRDX0RSVl9EUzE1NTMgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9EUzE3NDIgaXMgbm90IHNldAorIyBDT05GSUdfUlRDX0RSVl9NNDhUODYgaXMgbm90IHNldAorQ09ORklHX1JUQ19EUlZfU0g9eQorIyBDT05GSUdfUlRDX0RSVl9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX1JUQ19EUlZfVjMwMjAgaXMgbm90IHNldAogCiAjCiAjIERNQSBFbmdpbmUgc3VwcG9ydApAQCAtODg4LDE2ICsxMDY5LDI2IEBACiAjCiAKICMKKyMgQXV4aWxpYXJ5IERpc3BsYXkgc3VwcG9ydAorIworCisjCisjIFZpcnR1YWxpemF0aW9uCisjCisKKyMKICMgRmlsZSBzeXN0ZW1zCiAjCiBDT05GSUdfRVhUMl9GUz15CiAjIENPTkZJR19FWFQyX0ZTX1hBVFRSIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDJfRlNfWElQIGlzIG5vdCBzZXQKICMgQ09ORklHX0VYVDNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfRVhUNERFVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19SRUlTRVJGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19KRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRlNfUE9TSVhfQUNMIGlzIG5vdCBzZXQKICMgQ09ORklHX1hGU19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19HRlMyX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX09DRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19NSU5JWF9GUz15CiAjIENPTkZJR19ST01GU19GUyBpcyBub3Qgc2V0CkBAIC05MzIsNyArMTEyMyw4IEBACiBDT05GSUdfUFJPQ19LQ09SRT15CiBDT05GSUdfUFJPQ19TWVNDVEw9eQogQ09ORklHX1NZU0ZTPXkKLSMgQ09ORklHX1RNUEZTIGlzIG5vdCBzZXQKK0NPTkZJR19UTVBGUz15CisjIENPTkZJR19UTVBGU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfSFVHRVRMQkZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hVR0VUTEJfUEFHRSBpcyBub3Qgc2V0CiBDT05GSUdfUkFNRlM9eQpAQCAtMTAxOCw2ICsxMjEwLDExIEBACiAjIENPTkZJR19OTFNfVVRGOCBpcyBub3Qgc2V0CiAKICMKKyMgRGlzdHJpYnV0ZWQgTG9jayBNYW5hZ2VyCisjCisjIENPTkZJR19ETE0gaXMgbm90IHNldAorCisjCiAjIFByb2ZpbGluZyBzdXBwb3J0CiAjCiBDT05GSUdfUFJPRklMSU5HPXkKQEAgLTEwMjYsMTYgKzEyMjMsMjAgQEAKICMKICMgS2VybmVsIGhhY2tpbmcKICMKK0NPTkZJR19UUkFDRV9JUlFGTEFHU19TVVBQT1JUPXkKICMgQ09ORklHX1BSSU5US19USU1FIGlzIG5vdCBzZXQKIENPTkZJR19FTkFCTEVfTVVTVF9DSEVDSz15CiAjIENPTkZJR19NQUdJQ19TWVNSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19VTlVTRURfU1lNQk9MUyBpcyBub3Qgc2V0CisjIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19IRUFERVJTX0NIRUNLIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0tFUk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfTE9HX0JVRl9TSElGVD0xNAogIyBDT05GSUdfREVCVUdfQlVHVkVSQk9TRSBpcyBub3Qgc2V0Ci0jIENPTkZJR19ERUJVR19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TVEFOREFSRF9CSU9TIGlzIG5vdCBzZXQKLSMgQ09ORklHX0VBUkxZX1NDSUZfQ09OU09MRSBpcyBub3Qgc2V0CitDT05GSUdfRUFSTFlfU0NJRl9DT05TT0xFPXkKK0NPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEVfUE9SVD0weGZmZTgwMDAwCitDT05GSUdfRUFSTFlfUFJJTlRLPXkKICMgQ09ORklHX0tHREIgaXMgbm90IHNldAogCiAjCkBAIC0xMDUyLDggKzEyNTMsMTEgQEAKICMKICMgTGlicmFyeSByb3V0aW5lcwogIworQ09ORklHX0JJVFJFVkVSU0U9eQogIyBDT05GSUdfQ1JDX0NDSVRUIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSQzE2IGlzIG5vdCBzZXQKIENPTkZJR19DUkMzMj15CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1BMSVNUPXkKK0NPTkZJR19IQVNfSU9NRU09eQorQ09ORklHX0hBU19JT1BPUlQ9eQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9jb25maWdzL3NlNzc1MF9kZWZjb25maWcgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZwppbmRleCA1ZDM1N2Q2Li40ZTZlNzdmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZworKysgYi9hcmNoL3NoL2NvbmZpZ3Mvc2U3NzUwX2RlZmNvbmZpZwpAQCAtMSw3ICsxLDcgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4xOAotIyBUdWUgT2N0ICAzIDExOjQ5OjAxIDIwMDYKKyMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yMC1yYzIKKyMgVGh1IERlYyAyOCAyMzoxNTo0OSAyMDA2CiAjCiBDT05GSUdfU1VQRVJIPXkKIENPTkZJR19SV1NFTV9HRU5FUklDX1NQSU5MT0NLPXkKQEAgLTEwLDYgKzEwLDExIEBACiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CiBDT05GSUdfR0VORVJJQ19JUlFfUFJPQkU9eQogQ09ORklHX0dFTkVSSUNfQ0FMSUJSQVRFX0RFTEFZPXkKKyMgQ09ORklHX0dFTkVSSUNfVElNRSBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19MT0NLREVQX1NVUFBPUlQ9eQorIyBDT05GSUdfQVJDSF9IQVNfSUxPRzJfVTMyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSQ0hfSEFTX0lMT0cyX1U2NCBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCiAjCkBAIC0zNSw2ICs0MCw3IEBACiAjIENPTkZJR19BVURJVCBpcyBub3Qgc2V0CiBDT05GSUdfSUtDT05GSUc9eQogQ09ORklHX0lLQ09ORklHX1BST0M9eQorQ09ORklHX1NZU0ZTX0RFUFJFQ0FURUQ9eQogIyBDT05GSUdfUkVMQVkgaXMgbm90IHNldAogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKICMgQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFIGlzIG5vdCBzZXQKQEAgLTExNiw2ICsxMjIsOCBAQAogIyBDT05GSUdfU0hfTEFORElTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9USVRBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9TSE1JTiBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83MjA2X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CisjIENPTkZJR19TSF83NjE5X1NPTFVUSU9OX0VOR0lORSBpcyBub3Qgc2V0CiAjIENPTkZJR19TSF9VTktOT1dOIGlzIG5vdCBzZXQKIAogIwpAQCAtMTI3LDYgKzEzNSwxMiBAQAogIyBTSC0yIFByb2Nlc3NvciBTdXBwb3J0CiAjCiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc2MDQgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5IGlzIG5vdCBzZXQKKworIworIyBTSC0yQSBQcm9jZXNzb3IgU3VwcG9ydAorIworIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MjA2IGlzIG5vdCBzZXQKIAogIwogIyBTSC0zIFByb2Nlc3NvciBTdXBwb3J0CkBAIC0xNjIsMTIgKzE3NiwxNCBAQAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzcwIGlzIG5vdCBzZXQKICMgQ09ORklHX0NQVV9TVUJUWVBFX1NINzc4MCBpcyBub3Qgc2V0CisjIENPTkZJR19DUFVfU1VCVFlQRV9TSDc3ODUgaXMgbm90IHNldAogCiAjCiAjIFNINEFMLURTUCBQcm9jZXNzb3IgU3VwcG9ydAogIwogIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3MzE4MCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUFVfU1VCVFlQRV9TSDczNDMgaXMgbm90IHNldAorIyBDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzIyIGlzIG5vdCBzZXQKIAogIwogIyBNZW1vcnkgbWFuYWdlbWVudCBvcHRpb25zCkBAIC0xNzcsNiArMTkzLDkgQEAKIENPTkZJR19NRU1PUllfU1RBUlQ9MHgwYzAwMDAwMAogQ09ORklHX01FTU9SWV9TSVpFPTB4MDIwMDAwMDAKIENPTkZJR19WU1lTQ0FMTD15CitDT05GSUdfUEFHRV9TSVpFXzRLQj15CisjIENPTkZJR19QQUdFX1NJWkVfOEtCIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BBR0VfU0laRV82NEtCIGlzIG5vdCBzZXQKIENPTkZJR19TRUxFQ1RfTUVNT1JZX01PREVMPXkKIENPTkZJR19GTEFUTUVNX01BTlVBTD15CiAjIENPTkZJR19ESVNDT05USUdNRU1fTUFOVUFMIGlzIG5vdCBzZXQKQEAgLTIwMiwxNyArMjIxLDIyIEBACiAjIFByb2Nlc3NvciBmZWF0dXJlcwogIwogQ09ORklHX0NQVV9MSVRUTEVfRU5ESUFOPXkKKyMgQ09ORklHX0NQVV9CSUdfRU5ESUFOIGlzIG5vdCBzZXQKIENPTkZJR19TSF9GUFU9eQogIyBDT05GSUdfU0hfRFNQIGlzIG5vdCBzZXQKICMgQ09ORklHX1NIX1NUT1JFX1FVRVVFUyBpcyBub3Qgc2V0CiBDT05GSUdfQ1BVX0hBU19JTlRFVlQ9eQorQ09ORklHX0NQVV9IQVNfSVBSX0lSUT15CiBDT05GSUdfQ1BVX0hBU19TUl9SQj15CitDT05GSUdfQ1BVX0hBU19QVEVBPXkKIAogIwogIyBUaW1lciBzdXBwb3J0CiAjCiBDT05GSUdfU0hfVE1VPXkKLUNPTkZJR19TSF9QQ0xLX0ZSRVE9NTAwMDAwMDAKK0NPTkZJR19TSF9USU1FUl9JUlE9MTYKKyMgQ09ORklHX05PX0lETEVfSFogaXMgbm90IHNldAorQ09ORklHX1NIX1BDTEtfRlJFUT0zMzMzMzMzMwogCiAjCiAjIENQVSBGcmVxdWVuY3kgc2NhbGluZwpAQCAtMjMxLDEwICsyNTUsMTYgQEAKIENPTkZJR19IRUFSVEJFQVQ9eQogCiAjCisjIEFkZGl0aW9uYWwgU3VwZXJIIERldmljZSBEcml2ZXJzCisjCisjIENPTkZJR19QVVNIX1NXSVRDSCBpcyBub3Qgc2V0CisKKyMKICMgS2VybmVsIGZlYXR1cmVzCiAjCiAjIENPTkZJR19IWl8xMDAgaXMgbm90IHNldAogQ09ORklHX0haXzI1MD15CisjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwMCBpcyBub3Qgc2V0CiBDT05GSUdfSFo9MjUwCiAjIENPTkZJR19LRVhFQyBpcyBub3Qgc2V0CkBAIC0yNDksOCArMjc5LDcgQEAKIENPTkZJR19aRVJPX1BBR0VfT0ZGU0VUPTB4MDAwMDEwMDAKIENPTkZJR19CT09UX0xJTktfT0ZGU0VUPTB4MDA4MDAwMDAKICMgQ09ORklHX1VCQ19XQUtFVVAgaXMgbm90IHNldAotQ09ORklHX0NNRExJTkVfQk9PTD15Ci1DT05GSUdfQ01ETElORT0iY29uc29sZT10dHlTQzEsMzg0MDAgcm9vdD0vZGV2L25mcyBpcD1ib290cCIKKyMgQ09ORklHX0NNRExJTkVfQk9PTCBpcyBub3Qgc2V0CiAKICMKICMgQnVzIG9wdGlvbnMKQEAgLTMxMywxMSArMzQyLDEzIEBACiAjIENPTkZJR19JTkVUX1RVTk5FTCBpcyBub3Qgc2V0CiBDT05GSUdfSU5FVF9YRlJNX01PREVfVFJBTlNQT1JUPXkKIENPTkZJR19JTkVUX1hGUk1fTU9ERV9UVU5ORUw9eQorQ09ORklHX0lORVRfWEZSTV9NT0RFX0JFRVQ9eQogQ09ORklHX0lORVRfRElBRz15CiBDT05GSUdfSU5FVF9UQ1BfRElBRz15CiAjIENPTkZJR19UQ1BfQ09OR19BRFZBTkNFRCBpcyBub3Qgc2V0CiBDT05GSUdfVENQX0NPTkdfQ1VCSUM9eQogQ09ORklHX0RFRkFVTFRfVENQX0NPTkc9ImN1YmljIgorIyBDT05GSUdfVENQX01ENVNJRyBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFY2IGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1hGUk1fVFVOTkVMIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORVQ2X1RVTk5FTCBpcyBub3Qgc2V0CkBAIC00ODAsMTYgKzUxMSw3OSBAQAogIyBDT05GSUdfQVRBX09WRVJfRVRIIGlzIG5vdCBzZXQKIAogIworIyBNaXNjIGRldmljZXMKKyMKKyMgQ09ORklHX1RJRk1fQ09SRSBpcyBub3Qgc2V0CisKKyMKICMgQVRBL0FUQVBJL01GTS9STEwgc3VwcG9ydAogIwotIyBDT05GSUdfSURFIGlzIG5vdCBzZXQKK0NPTkZJR19JREU9eQorQ09ORklHX0lERV9NQVhfSFdJRlM9NAorQ09ORklHX0JMS19ERVZfSURFPXkKKworIworIyBQbGVhc2Ugc2VlIERvY3VtZW50YXRpb24vaWRlLnR4dCBmb3IgaGVscC9pbmZvIG9uIElERSBkcml2ZXMKKyMKKyMgQ09ORklHX0JMS19ERVZfSURFX1NBVEEgaXMgbm90IHNldAorQ09ORklHX0JMS19ERVZfSURFRElTSz15CisjIENPTkZJR19JREVESVNLX01VTFRJX01PREUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVDRCBpcyBub3Qgc2V0CisjIENPTkZJR19CTEtfREVWX0lERVRBUEUgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVGTE9QUFkgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9JREVTQ1NJIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERV9UQVNLX0lPQ1RMIGlzIG5vdCBzZXQKKworIworIyBJREUgY2hpcHNldCBzdXBwb3J0L2J1Z2ZpeGVzCisjCisjIENPTkZJR19JREVfR0VORVJJQyBpcyBub3Qgc2V0CisjIENPTkZJR19JREVfQVJNIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSURFRE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lERURNQV9BVVRPIGlzIG5vdCBzZXQKKyMgQ09ORklHX0JMS19ERVZfSEQgaXMgbm90IHNldAogCiAjCiAjIFNDU0kgZGV2aWNlIHN1cHBvcnQKICMKICMgQ09ORklHX1JBSURfQVRUUlMgaXMgbm90IHNldAotIyBDT05GSUdfU0NTSSBpcyBub3Qgc2V0CitDT05GSUdfU0NTST15CisjIENPTkZJR19TQ1NJX1RHVCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX05FVExJTksgaXMgbm90IHNldAorQ09ORklHX1NDU0lfUFJPQ19GUz15CisKKyMKKyMgU0NTSSBzdXBwb3J0IHR5cGUgKGRpc2ssIHRhcGUsIENELVJPTSkKKyMKKyMgQ09ORklHX0JMS19ERVZfU0QgaXMgbm90IHNldAorIyBDT05GSUdfQ0hSX0RFVl9TVCBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX09TU1QgaXMgbm90IHNldAorIyBDT05GSUdfQkxLX0RFVl9TUiBpcyBub3Qgc2V0CisjIENPTkZJR19DSFJfREVWX1NHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NIUl9ERVZfU0NIIGlzIG5vdCBzZXQKKworIworIyBTb21lIFNDU0kgZGV2aWNlcyAoZS5nLiBDRCBqdWtlYm94KSBzdXBwb3J0IG11bHRpcGxlIExVTnMKKyMKKyMgQ09ORklHX1NDU0lfTVVMVElfTFVOIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfQ09OU1RBTlRTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfTE9HR0lORyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX1NDQU5fQVNZTkMgaXMgbm90IHNldAorCisjCisjIFNDU0kgVHJhbnNwb3J0cworIworIyBDT05GSUdfU0NTSV9TUElfQVRUUlMgaXMgbm90IHNldAorIyBDT05GSUdfU0NTSV9GQ19BVFRSUyBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX0lTQ1NJX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0FUVFJTIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfU0FTX0xJQlNBUyBpcyBub3Qgc2V0CisKKyMKKyMgU0NTSSBsb3ctbGV2ZWwgZHJpdmVycworIworIyBDT05GSUdfSVNDU0lfVENQIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfREVCVUcgaXMgbm90IHNldAogCiAjCiAjIFNlcmlhbCBBVEEgKHByb2QpIGFuZCBQYXJhbGxlbCBBVEEgKGV4cGVyaW1lbnRhbCkgZHJpdmVycwpAQCAtNjMzLDE3ICs3MjcsMTIgQEAKICMgQ09ORklHX0dFTl9SVEMgaXMgbm90IHNldAogIyBDT05GSUdfRFRMSyBpcyBub3Qgc2V0CiAjIENPTkZJR19SMzk2NCBpcyBub3Qgc2V0Ci0KLSMKLSMgRnRhcGUsIHRoZSBmbG9wcHkgdGFwZSBkZXZpY2UgZHJpdmVyCi0jCiAjIENPTkZJR19SQVdfRFJJVkVSIGlzIG5vdCBzZXQKIAogIwogIyBUUE0gZGV2aWNlcwogIwogIyBDT05GSUdfVENHX1RQTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19URUxDTE9DSyBpcyBub3Qgc2V0CiAKICMKICMgSTJDIHN1cHBvcnQKQEAgLTY1OSw2ICs3NDgsNyBAQAogIwogIyBEYWxsYXMncyAxLXdpcmUgYnVzCiAjCisjIENPTkZJR19XMSBpcyBub3Qgc2V0CiAKICMKICMgSGFyZHdhcmUgTW9uaXRvcmluZyBzdXBwb3J0CkBAIC02NjcsMTggKzc1NywxNCBAQAogIyBDT05GSUdfSFdNT05fVklEIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQUJJVFVHVVJVIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfRjcxODA1RiBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19WVDEyMTEgaXMgbm90IHNldAogIyBDT05GSUdfSFdNT05fREVCVUdfQ0hJUCBpcyBub3Qgc2V0CiAKICMKLSMgTWlzYyBkZXZpY2VzCi0jCi0KLSMKICMgTXVsdGltZWRpYSBkZXZpY2VzCiAjCiAjIENPTkZJR19WSURFT19ERVYgaXMgbm90IHNldAotQ09ORklHX1ZJREVPX1Y0TDI9eQogCiAjCiAjIERpZ2l0YWwgVmlkZW8gQnJvYWRjYXN0aW5nIERldmljZXMKQEAgLTc1OCwxNCArODQ0LDIwIEBACiAjCiAKICMKKyMgVmlydHVhbGl6YXRpb24KKyMKKworIwogIyBGaWxlIHN5c3RlbXMKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfRVhUM19GUyBpcyBub3Qgc2V0CisjIENPTkZJR19FWFQ0REVWX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1JFSVNFUkZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0pGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19GU19QT1NJWF9BQ0wgaXMgbm90IHNldAogIyBDT05GSUdfWEZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX0dGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfT0NGUzJfRlMgaXMgbm90IHNldAogIyBDT05GSUdfTUlOSVhfRlMgaXMgbm90IHNldAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldApAQCAtODE0LDcgKzkwNiw2IEBACiAjIENPTkZJR19CRUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JGU19GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FRlNfRlMgaXMgbm90IHNldAotIyBDT05GSUdfSkZGU19GUyBpcyBub3Qgc2V0CiBDT05GSUdfSkZGUzJfRlM9eQogQ09ORklHX0pGRlMyX0ZTX0RFQlVHPTAKIENPTkZJR19KRkZTMl9GU19XUklURUJVRkZFUj15CkBAIC04NzUsNiArOTY2LDExIEBACiAjIENPTkZJR19OTFMgaXMgbm90IHNldAogCiAjCisjIERpc3RyaWJ1dGVkIExvY2sgTWFuYWdlcgorIworIyBDT05GSUdfRExNIGlzIG5vdCBzZXQKKworIwogIyBQcm9maWxpbmcgc3VwcG9ydAogIwogIyBDT05GSUdfUFJPRklMSU5HIGlzIG5vdCBzZXQKQEAgLTg4MiwxNCArOTc4LDE2IEBACiAjCiAjIEtlcm5lbCBoYWNraW5nCiAjCitDT05GSUdfVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVD15CiAjIENPTkZJR19QUklOVEtfVElNRSBpcyBub3Qgc2V0Ci1DT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0s9eQorIyBDT05GSUdfRU5BQkxFX01VU1RfQ0hFQ0sgaXMgbm90IHNldAogIyBDT05GSUdfTUFHSUNfU1lTUlEgaXMgbm90IHNldAogIyBDT05GSUdfVU5VU0VEX1NZTUJPTFMgaXMgbm90IHNldAorIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAorIyBDT05GSUdfSEVBREVSU19DSEVDSyBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19LRVJORUwgaXMgbm90IHNldAogQ09ORklHX0xPR19CVUZfU0hJRlQ9MTQKICMgQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgaXMgbm90IHNldAotIyBDT05GSUdfREVCVUdfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19FQVJMWV9TQ0lGX0NPTlNPTEUgaXMgbm90IHNldAogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC05MDgsNiArMTAwNiw3IEBACiAjCiAjIExpYnJhcnkgcm91dGluZXMKICMKK0NPTkZJR19CSVRSRVZFUlNFPXkKICMgQ09ORklHX0NSQ19DQ0lUVCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUkMxNiBpcyBub3Qgc2V0CiBDT05GSUdfQ1JDMzI9eQpAQCAtOTE1LDMgKzEwMTQsNCBAQAogQ09ORklHX1pMSUJfSU5GTEFURT15CiBDT05GSUdfWkxJQl9ERUZMQVRFPXkKIENPTkZJR19QTElTVD15CitDT05GSUdfSU9NQVBfQ09QWT15CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvTWFrZWZpbGUgYi9hcmNoL3NoL2RyaXZlcnMvTWFrZWZpbGUKaW5kZXggYmYxOGRiZi4uNmNiOTI2NyAxMDA2NDQKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL01ha2VmaWxlCisrKyBiL2FyY2gvc2gvZHJpdmVycy9NYWtlZmlsZQpAQCAtNiwzICs2LDQgQEAKIG9iai0kKENPTkZJR19TSF9ETUEpCQkrPSBkbWEvCiBvYmotJChDT05GSUdfU1VQRVJIWVdBWSkJKz0gc3VwZXJoeXdheS8KIG9iai0kKENPTkZJR19QVVNIX1NXSVRDSCkJKz0gcHVzaC1zd2l0Y2gubworb2JqLSQoQ09ORklHX0hFQVJUQkVBVCkJCSs9IGhlYXJ0YmVhdC5vCmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jIGIvYXJjaC9zaC9kcml2ZXJzL2RtYS9kbWEtc2guYwppbmRleCBmNjM3MjFlLi4wNmVkMDYwIDEwMDY0NAotLS0gYS9hcmNoL3NoL2RyaXZlcnMvZG1hL2RtYS1zaC5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9kbWEvZG1hLXNoLmMKQEAgLTE5LDM0ICsxOSwyNiBAQAogI2luY2x1ZGUgPGFzbS9pby5oPgogI2luY2x1ZGUgImRtYS1zaC5oIgogCi0KLQotI2lmZGVmIENPTkZJR19DUFVfU0g0Ci1zdGF0aWMgc3RydWN0IGlwcl9kYXRhIGRtYWVfaXByX21hcFtdID0gewotCXsgRE1BRV9JUlEsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAotfTsKK3N0YXRpYyBpbnQgZG10ZV9pcnFfbWFwW10gPSB7CisJRE1URTBfSVJRLAorCURNVEUxX0lSUSwKKwlETVRFMl9JUlEsCisJRE1URTNfSVJRLAorI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzc1MVIpIHx8CVwKKyAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3NjApICB8fAlcCisgICAgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzgwKQorCURNVEU0X0lSUSwKKwlETVRFNV9JUlEsCisJRE1URTZfSVJRLAorCURNVEU3X0lSUSwgICAgCiAjZW5kaWYKLXN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgZG10ZV9pcHJfbWFwW10gPSB7Ci0JLyoKLQkgKiBOb3JtYWxseSB3ZSBjb3VsZCBqdXN0IGRvIERNVEUwX0lSUSArIGNoYW4gb3V0cmlnaHQsIHRob3VnaCBpbiB0aGUKLQkgKiBjYXNlIG9mIHRoZSA3NzUxUiwgdGhlIERNVEUgSVJRcyBmb3IgY2hhbm5lbHMgPiA0IHN0YXJ0IHJpZ2h0IGFib3ZlCi0JICogdGhlIFNDSUYKLQkgKi8KLQl7IERNVEUwX0lSUSArIDAsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAotCXsgRE1URTBfSVJRICsgMSwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCi0JeyBETVRFMF9JUlEgKyAyLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKLQl7IERNVEUwX0lSUSArIDMsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAotCXsgRE1URTRfSVJRICsgMCwgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCi0JeyBETVRFNF9JUlEgKyAxLCBETUFfSVBSX0FERFIsIERNQV9JUFJfUE9TLCBETUFfUFJJT1JJVFkgfSwKLQl7IERNVEU0X0lSUSArIDIsIERNQV9JUFJfQUREUiwgRE1BX0lQUl9QT1MsIERNQV9QUklPUklUWSB9LAotCXsgRE1URTRfSVJRICsgMywgRE1BX0lQUl9BRERSLCBETUFfSVBSX1BPUywgRE1BX1BSSU9SSVRZIH0sCiB9OwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBnZXRfZG10ZV9pcnEodW5zaWduZWQgaW50IGNoYW4pCiB7CiAJdW5zaWduZWQgaW50IGlycSA9IDA7Ci0JaWYgKGNoYW4gPCBBUlJBWV9TSVpFKGRtdGVfaXByX21hcCkpCi0JCWlycSA9IGRtdGVfaXByX21hcFtjaGFuXS5pcnE7CisJaWYgKGNoYW4gPCBBUlJBWV9TSVpFKGRtdGVfaXJxX21hcCkpCisJCWlycSA9IGRtdGVfaXJxX21hcFtjaGFuXTsKIAlyZXR1cm4gaXJxOwogfQogCkBAIC0xMDMsNyArOTUsNyBAQAogCWZyZWVfaXJxKGdldF9kbXRlX2lycShjaGFuLT5jaGFuKSwgY2hhbik7CiB9CiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBzaF9kbWFjX2NvbmZpZ3VyZV9jaGFubmVsKHN0cnVjdCBkbWFfY2hhbm5lbCAqY2hhbiwgdW5zaWduZWQgbG9uZyBjaGNyKQogewogCWlmICghY2hjcikKQEAgLTExOSw2ICsxMTEsNyBAQAogCWN0cmxfb3V0bChjaGNyLCBDSENSW2NoYW4tPmNoYW5dKTsKIAogCWNoYW4tPmZsYWdzIHw9IERNQV9DT05GSUdVUkVEOworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzaF9kbWFjX2VuYWJsZV9kbWEoc3RydWN0IGRtYV9jaGFubmVsICpjaGFuKQpAQCAtMjYyLDE3ICsyNTUsMTEgQEAKIAlpbnQgaTsKIAogI2lmZGVmIENPTkZJR19DUFVfU0g0Ci0JbWFrZV9pcHJfaXJxKGRtYWVfaXByX21hcCwgQVJSQVlfU0laRShkbWFlX2lwcl9tYXApKTsKIAlpID0gcmVxdWVzdF9pcnEoRE1BRV9JUlEsIGRtYV9lcnIsIElSUUZfRElTQUJMRUQsICJETUFDIEFkZHJlc3MgRXJyb3IiLCAwKTsKIAlpZiAodW5saWtlbHkoaSA8IDApKQogCQlyZXR1cm4gaTsKICNlbmRpZgogCi0JaSA9IGluZm8tPm5yX2NoYW5uZWxzOwotCWlmIChpID4gQVJSQVlfU0laRShkbXRlX2lwcl9tYXApKQotCQlpID0gQVJSQVlfU0laRShkbXRlX2lwcl9tYXApOwotCW1ha2VfaXByX2lycShkbXRlX2lwcl9tYXAsIGkpOwotCiAJLyoKIAkgKiBJbml0aWFsaXplIERNQU9SLCBhbmQgY2xlYW4gdXAgYW55IGVycm9yIGZsYWdzIHRoYXQgbWF5IGhhdmUKIAkgKiBiZWVuIHNldC4KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9oZWFydGJlYXQuYyBiL2FyY2gvc2gvZHJpdmVycy9oZWFydGJlYXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzU5Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9kcml2ZXJzL2hlYXJ0YmVhdC5jCkBAIC0wLDAgKzEsMTMyIEBACisvKgorICogR2VuZXJpYyBoZWFydGJlYXQgZHJpdmVyIGZvciByZWd1bGFyIExFRCBiYW5rcworICoKKyAqIENvcHlyaWdodCAoQykgMjAwNyAgUGF1bCBNdW5kdAorICoKKyAqIE1vc3QgU0ggcmVmZXJlbmNlIGJvYXJkcyBpbmNsdWRlIGEgbnVtYmVyIG9mIGluZGl2aWR1YWwgTEVEcyB0aGF0IGNhbgorICogYmUgaW5kZXBlbmRlbnRseSBjb250cm9sbGVkIChlaXRoZXIgdmlhIGEgcHJlLWRlZmluZWQgaGFyZHdhcmUKKyAqIGZ1bmN0aW9uIG9yIHZpYSB0aGUgTEVEIGNsYXNzLCBpZiBkZXNpcmVkIC0tIHRoZSBoYXJkd2FyZSB0ZW5kcyB0bworICogZW5jYXBzdWxhdGUgc29tZSBvZiB0aGUgc2FtZSAidHJpZ2dlcnMiIHRoYXQgdGhlIExFRCBjbGFzcyBzdXBwb3J0cywKKyAqIHNvIHRoZXJlJ3Mgbm90IHRvbyBtdWNoIHZhbHVlIGluIGl0KS4KKyAqCisgKiBBZGRpdGlvbmFsbHksIG1vc3Qgb2YgdGhlc2UgYm9hcmRzIGFsc28gaGF2ZSBhIExFRCBiYW5rIHRoYXQgd2UndmUKKyAqIHRyYWRpdGlvbmFsbHkgdXNlZCBmb3Igc3Ryb2JpbmcgdGhlIGxvYWQgYXZlcmFnZS4gVGhpcyB1c2UgY2FzZSBpcworICogaGFuZGxlZCBieSB0aGlzIGRyaXZlciwgcmF0aGVyIHRoYW4gZ2l2aW5nIGVhY2ggTEVEIGJpdCBwb3NpdGlvbiBpdHMKKyAqIG93biBzdHJ1Y3QgZGV2aWNlLgorICoKKyAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgKiBMaWNlbnNlLiAgU2VlIHRoZSBmaWxlICJDT1BZSU5HIiBpbiB0aGUgbWFpbiBkaXJlY3Rvcnkgb2YgdGhpcyBhcmNoaXZlCisgKiBmb3IgbW9yZSBkZXRhaWxzLgorICovCisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgorCisjZGVmaW5lIERSVl9OQU1FICJoZWFydGJlYXQiCisjZGVmaW5lIERSVl9WRVJTSU9OICIwLjEuMCIKKworc3RydWN0IGhlYXJ0YmVhdF9kYXRhIHsKKwl2b2lkIF9faW9tZW0gKmJhc2U7CisJdW5zaWduZWQgY2hhciBiaXRfcG9zWzhdOworCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworfTsKKworc3RhdGljIHZvaWQgaGVhcnRiZWF0X3RpbWVyKHVuc2lnbmVkIGxvbmcgZGF0YSkKK3sKKwlzdHJ1Y3QgaGVhcnRiZWF0X2RhdGEgKmhkID0gKHN0cnVjdCBoZWFydGJlYXRfZGF0YSAqKWRhdGE7CisJc3RhdGljIHVuc2lnbmVkIGJpdCA9IDAsIHVwID0gMTsKKworCWN0cmxfb3V0dygxIDw8IGhkLT5iaXRfcG9zW2JpdF0sICh1bnNpZ25lZCBsb25nKWhkLT5iYXNlKTsKKwlpZiAodXApCisJCWlmIChiaXQgPT0gKEFSUkFZX1NJWkUoaGQtPmJpdF9wb3MpIC0gMSkpIHsKKwkJCWJpdC0tOworCQkJdXAgPSAwOworCQl9IGVsc2UKKwkJCWJpdCsrOworCWVsc2UgaWYgKGJpdCA9PSAwKQorCQl1cCA9IDE7CisJZWxzZQorCQliaXQtLTsKKworCW1vZF90aW1lcigmaGQtPnRpbWVyLCBqaWZmaWVzICsgKDExMCAtICgoMzAwIDw8IEZTSElGVCkgLworCQkJKChhdmVucnVuWzBdIC8gNSkgKyAoMyA8PCBGU0hJRlQpKSkpKTsKK30KKworc3RhdGljIGludCBoZWFydGJlYXRfZHJ2X3Byb2JlKHN0cnVjdCBwbGF0Zm9ybV9kZXZpY2UgKnBkZXYpCit7CisJc3RydWN0IHJlc291cmNlICpyZXM7CisJc3RydWN0IGhlYXJ0YmVhdF9kYXRhICpoZDsKKworCWlmICh1bmxpa2VseShwZGV2LT5udW1fcmVzb3VyY2VzICE9IDEpKSB7CisJCWRldl9lcnIoJnBkZXYtPmRldiwgImludmFsaWQgbnVtYmVyIG9mIHJlc291cmNlc1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJlcyA9IHBsYXRmb3JtX2dldF9yZXNvdXJjZShwZGV2LCBJT1JFU09VUkNFX01FTSwgMCk7CisJaWYgKHVubGlrZWx5KHJlcyA9PSBOVUxMKSkgeworCQlkZXZfZXJyKCZwZGV2LT5kZXYsICJpbnZhbGlkIHJlc291cmNlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaGQgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgaGVhcnRiZWF0X2RhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAodW5saWtlbHkoIWhkKSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlpZiAocGRldi0+ZGV2LnBsYXRmb3JtX2RhdGEpIHsKKwkJbWVtY3B5KGhkLT5iaXRfcG9zLCBwZGV2LT5kZXYucGxhdGZvcm1fZGF0YSwKKwkJICAgICAgIEFSUkFZX1NJWkUoaGQtPmJpdF9wb3MpKTsKKwl9IGVsc2UgeworCQlpbnQgaTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShoZC0+Yml0X3Bvcyk7IGkrKykKKwkJCWhkLT5iaXRfcG9zW2ldID0gaTsKKwl9CisKKwloZC0+YmFzZSA9ICh2b2lkIF9faW9tZW0gKilyZXMtPnN0YXJ0OworCisJc2V0dXBfdGltZXIoJmhkLT50aW1lciwgaGVhcnRiZWF0X3RpbWVyLCAodW5zaWduZWQgbG9uZyloZCk7CisJcGxhdGZvcm1fc2V0X2RydmRhdGEocGRldiwgaGQpOworCisJcmV0dXJuIG1vZF90aW1lcigmaGQtPnRpbWVyLCBqaWZmaWVzICsgMSk7Cit9CisKK3N0YXRpYyBpbnQgaGVhcnRiZWF0X2Rydl9yZW1vdmUoc3RydWN0IHBsYXRmb3JtX2RldmljZSAqcGRldikKK3sKKwlzdHJ1Y3QgaGVhcnRiZWF0X2RhdGEgKmhkID0gcGxhdGZvcm1fZ2V0X2RydmRhdGEocGRldik7CisKKwlkZWxfdGltZXJfc3luYygmaGQtPnRpbWVyKTsKKworCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIE5VTEwpOworCisJa2ZyZWUoaGQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZHJpdmVyIGhlYXJ0YmVhdF9kcml2ZXIgPSB7CisJLnByb2JlCQk9IGhlYXJ0YmVhdF9kcnZfcHJvYmUsCisJLnJlbW92ZQkJPSBoZWFydGJlYXRfZHJ2X3JlbW92ZSwKKwkuZHJpdmVyCQk9IHsKKwkJLm5hbWUJPSBEUlZfTkFNRSwKKwl9LAorfTsKKworc3RhdGljIGludCBfX2luaXQgaGVhcnRiZWF0X2luaXQodm9pZCkKK3sKKwlwcmludGsoS0VSTl9OT1RJQ0UgRFJWX05BTUUgIjogdmVyc2lvbiAlcyBsb2FkZWRcbiIsIERSVl9WRVJTSU9OKTsKKwlyZXR1cm4gcGxhdGZvcm1fZHJpdmVyX3JlZ2lzdGVyKCZoZWFydGJlYXRfZHJpdmVyKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IGhlYXJ0YmVhdF9leGl0KHZvaWQpCit7CisJcGxhdGZvcm1fZHJpdmVyX3VucmVnaXN0ZXIoJmhlYXJ0YmVhdF9kcml2ZXIpOworfQorbW9kdWxlX2luaXQoaGVhcnRiZWF0X2luaXQpOworbW9kdWxlX2V4aXQoaGVhcnRiZWF0X2V4aXQpOworCitNT0RVTEVfVkVSU0lPTihEUlZfVkVSU0lPTik7CitNT0RVTEVfQVVUSE9SKCJQYXVsIE11bmR0Iik7CitNT0RVTEVfTElDRU5TRSgiR1BMdjIiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvTWFrZWZpbGUgYi9hcmNoL3NoL2RyaXZlcnMvcGNpL01ha2VmaWxlCmluZGV4IDllMDBjYjguLmNjOGQwZDAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvTWFrZWZpbGUKKysrIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9NYWtlZmlsZQpAQCAtMTIsNyArMTIsNiBAQAogb2JqLSQoQ09ORklHX1NIX0RSRUFNQ0FTVCkJCSs9IG9wcy1kcmVhbWNhc3QubyBmaXh1cHMtZHJlYW1jYXN0Lm8gXAogCQkJCQkgICBkbWEtZHJlYW1jYXN0Lm8KIG9iai0kKENPTkZJR19TSF9TRUNVUkVFREdFNTQxMCkJCSs9IG9wcy1zbmFwZ2Vhci5vCi1vYmotJChDT05GSUdfU0hfQklHU1VSKQkJCSs9IG9wcy1iaWdzdXIubwogb2JqLSQoQ09ORklHX1NIX1JUUzc3NTFSMkQpCQkrPSBvcHMtcnRzNzc1MXIyZC5vIGZpeHVwcy1ydHM3NzUxcjJkLm8KIG9iai0kKENPTkZJR19TSF9TSDAzKQkJCSs9IG9wcy1zaDAzLm8gZml4dXBzLXNoMDMubwogb2JqLSQoQ09ORklHX1NIX1I3NzgwUlApCQkrPSBvcHMtcjc3ODBycC5vIGZpeHVwcy1yNzc4MHJwLm8KZGlmZiAtLWdpdCBhL2FyY2gvc2gvZHJpdmVycy9wY2kvb3BzLWJpZ3N1ci5jIGIvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtYmlnc3VyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMzFiZTcuLjAwMDAwMDAKLS0tIGEvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtYmlnc3VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogbGludXgvYXJjaC9zaC9kcml2ZXJzL3BjaS9vcHMtYmlnc3VyLmMKLSAqCi0gKiBCeSBEdXN0aW4gTWNJbnRpcmUgKGR1c3RpbkBzZW5zb3JpYS5jb20pIChjKTIwMDEKLSAqCi0gKiBQb3J0ZWQgdG8gbmV3IEFQSSBieSBQYXVsIE11bmR0IDxsZXRoYWxAbGludXgtc2gub3JnPi4KLSAqCi0gKiBNYXkgYmUgY29waWVkIG9yIG1vZGlmaWVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCi0gKiBMaWNlbnNlLiAgU2VlIGxpbnV4L0NPUFlJTkcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gKgotICogUENJIGluaXRpYWxpemF0aW9uIGZvciB0aGUgSGl0YWNoaSBCaWcgU3VyIEV2YWx1YXRpb24gQm9hcmQKLSAqLwotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgotI2luY2x1ZGUgPGFzbS9pby5oPgotI2luY2x1ZGUgInBjaS1zaDQuaCIKLSNpbmNsdWRlIDxhc20vYmlnc3VyL2JpZ3N1ci5oPgotCi0jZGVmaW5lIEJJR1NVUl9QQ0lfSU8JMHg0MDAwCi0jZGVmaW5lIEJJR1NVUl9QQ0lfTUVNCTB4ZmQwMDAwMDAKLQotc3RhdGljIHN0cnVjdCByZXNvdXJjZSBzaDc3NTFfaW9fcmVzb3VyY2UgPSB7Ci0JLm5hbWUJCT0gIlNINzc1MSBJTyIsCi0JLnN0YXJ0CQk9IEJJR1NVUl9QQ0lfSU8sCi0JLmVuZAkJPSBCSUdTVVJfUENJX0lPICsgKDY0KjEwMjQpIC0gMSwKLQkuZmxhZ3MJCT0gSU9SRVNPVVJDRV9JTywKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgcmVzb3VyY2Ugc2g3NzUxX21lbV9yZXNvdXJjZSA9IHsKLQkubmFtZQkJPSAiU0g3NzUxIG1lbSIsCi0JLnN0YXJ0CQk9IEJJR1NVUl9QQ0lfTUVNLAotCS5lbmQJCT0gQklHU1VSX1BDSV9NRU0gKyAoNjQqMTAyNCoxMDI0KSAtIDEsCi0JLmZsYWdzCQk9IElPUkVTT1VSQ0VfTUVNLAotfTsKLQotZXh0ZXJuIHN0cnVjdCBwY2lfb3BzIHNoNzc1MV9wY2lfb3BzOwotCi1zdHJ1Y3QgcGNpX2NoYW5uZWwgYm9hcmRfcGNpX2NoYW5uZWxzW10gPSB7Ci0JeyAmc2g0X3BjaV9vcHMsICZzaDc3NTFfaW9fcmVzb3VyY2UsICZzaDc3NTFfbWVtX3Jlc291cmNlLCAwLCAweGZmIH0sCi0JeyAwLCB9Ci19OwotCi1zdGF0aWMgc3RydWN0IHNoNF9wY2lfYWRkcmVzc19tYXAgc2g3NzUxX3BjaV9tYXAgPSB7Ci0JLndpbmRvdzAJPSB7Ci0JCS5iYXNlCT0gU0g3NzUxX0NTM19CQVNFX0FERFIsCi0JCS5zaXplCT0gQklHU1VSX0xTUjBfU0laRSwKLQl9LAotCi0JLndpbmRvdzEJPSB7Ci0JCS5iYXNlCT0gU0g3NzUxX0NTM19CQVNFX0FERFIsCi0JCS5zaXplCT0gQklHU1VSX0xTUjFfU0laRSwKLQl9LAotfTsKLQotLyoKLSAqIEluaXRpYWxpemUgdGhlIEJpZyBTdXIgUENJIGludGVyZmFjZQotICogU2V0dXAgaGFyZHdhcmUgdG8gYmUgQ2VudHJhbCBGdW50aW9uCi0gKiBDb3B5IHRoZSBCU1IgcmVncyB0byB0aGUgUENJIGludGVyZmFjZQotICogU2V0dXAgUENJIHdpbmRvd3MgaW50byBsb2NhbCBSQU0KLSAqLwotaW50IF9faW5pdCBwY2liaW9zX2luaXRfcGxhdGZvcm0odm9pZCkKLXsKLQlyZXR1cm4gc2g3NzUxX3BjaWNfaW5pdCgmc2g3NzUxX3BjaV9tYXApOwotfQotCi1pbnQgX19pbml0IHBjaWJpb3NfbWFwX3BsYXRmb3JtX2lycShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgdTggc2xvdCwgdTggcGluKQotewotCS8qCi0JICogVGhlIEJpZyBTdXIgY2FuIGJlIHVzZWQgaW4gYSBDUENJIGNoYXNzaXMsIGJ1dCB0aGUgU0g3NzUxIFBDSQotCSAqIGludGVyZmFjZSBpcyBvbiB0aGUgd3JvbmcgZW5kIG9mIHRoZSBib2FyZCBzbyB0aGF0IGl0IGNhbiBhbHNvCi0JICogc3VwcG9ydCBhIFYzMjAgQ1BJIGludGVyZmFjZSBjaGlwLi4uICBUaGVyZWZvciB0aGUgSVJRIG1hcHBpbmcgaXMKLQkgKiBzb21ld2hhdCB1c2UgZGVwZW5kZW50Li4uIEknbCBhc3N1bWUgYSBsaW5lYXIgbWFwIGZvciBub3csIGkuZS4KLQkgKiBJTlRBPXNsb3QwLHBpbjAuLi4gSU5URD1zbG90MyxwaW4wLi4uCi0JICovCi0JaW50IGlycSA9IChzbG90ICsgcGluLTEpICUgNCArIEJJR1NVUl9TSDc3NTFfUENJX0lSUV9CQVNFOwotCi0JUENJREJHKDIsICJQQ0k6IE1hcHBpbmcgQmlnIFN1ciBJUlEgZm9yIHNsb3QgJWQsIHBpbiAlYyB0byBpcnEgJWRcbiIsCi0JICAgICAgIHNsb3QsIHBpbi0xKydBJywgaXJxKTsKLQotCXJldHVybiBpcnE7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3NoL2RyaXZlcnMvcGNpL3BjaS1zaDc3NTEuYyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5jCmluZGV4IDg1ZTFlZTIuLjlkZGZmNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5jCisrKyBiL2FyY2gvc2gvZHJpdmVycy9wY2kvcGNpLXNoNzc1MS5jCkBAIC0xNTcsMTUgKzE1Nyw2IEBACiAJCSBQQ0lCSU9TX01JTl9JTywgKDY0IDw8IDEwKSwKIAkJIFNINzc1MV9QQ0lfSU9fQkFTRSArIFBDSUJJT1NfTUlOX0lPKTsKIAotCS8qCi0JICogWFhYOiBGb3Igbm93LCBsZWF2ZSB0aGlzIGJvYXJkLXNwZWNpZmljLiBJbiB0aGUgZXZlbnQgd2UgaGF2ZSBvdGhlcgotCSAqIGJvYXJkcyB0aGF0IG5lZWQgdG8gZG8gc2ltaWxhciB3b3JrLCB0aGlzIGNhbiBiZSB3cmFwcGVkLgotCSAqLwotI2lmZGVmIENPTkZJR19TSF9CSUdTVVIKLQliaWdzdXJfcG9ydF9tYXAoUENJQklPU19NSU5fSU8sICg2NCA8PCAxMCksCi0JCQlTSDc3NTFfUENJX0lPX0JBU0UgKyBQQ0lCSU9TX01JTl9JTywgMCk7Ci0jZW5kaWYKLQogCS8qIE1ha2Ugc3VyZSB0aGUgTVNCJ3Mgb2YgSU8gd2luZG93IGFyZSBzZXQgdG8gYWNjZXNzIFBDSSBzcGFjZQogCSAqIGNvcnJlY3RseSAqLwogCXdvcmQgPSBQQ0lCSU9TX01JTl9JTyAmIFNINF9QQ0lJT0JSX01BU0s7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCmluZGV4IDJmNmQyYmMuLmZmMzBkN2YgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCisrKyBiL2FyY2gvc2gva2VybmVsL01ha2VmaWxlCkBAIC02LDcgKzYsOCBAQAogCiBvYmoteQk6PSBwcm9jZXNzLm8gc2lnbmFsLm8gdHJhcHMubyBpcnEubyBcCiAJcHRyYWNlLm8gc2V0dXAubyB0aW1lLm8gc3lzX3NoLm8gc2VtYXBob3JlLm8gXAotCWlvLm8gaW9fZ2VuZXJpYy5vIHNoX2tzeW1zLm8gc3lzY2FsbHMubworCWlvLm8gaW9fZ2VuZXJpYy5vIHNoX2tzeW1zLm8gc3lzY2FsbHMubyBcCisJZGVidWd0cmFwcy5vCiAKIG9iai15CQkJCSs9IGNwdS8gdGltZXJzLwogb2JqLSQoQ09ORklHX1ZTWVNDQUxMKQkJKz0gdnN5c2NhbGwvCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L2luaXQuYwppbmRleCA0ODEyMTc2Li40YjMzOWE2IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvaW5pdC5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9pbml0LmMKQEAgLTMsNyArMyw3IEBACiAgKgogICogQ1BVIGluaXQgY29kZQogICoKLSAqIENvcHlyaWdodCAoQykgMjAwMiwgMjAwMyAgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNiAgUGF1bCBNdW5kdAogICogQ29weXJpZ2h0IChDKSAyMDAzICBSaWNoYXJkIEN1cm5vdwogICoKICAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCkBAIC0xMiw2ICsxMiw4IEBACiAgKi8KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgpAQCAtNDYsNyArNDgsNyBAQAogewogCXVuc2lnbmVkIGxvbmcgY2NyLCBmbGFnczsKIAotCWlmIChjcHVfZGF0YS0+dHlwZSA9PSBDUFVfU0hfTk9ORSkKKwlpZiAoY3VycmVudF9jcHVfZGF0YS50eXBlID09IENQVV9TSF9OT05FKQogCQlwYW5pYygiVW5rbm93biBDUFUiKTsKIAogCWp1bXBfdG9fUDIoKTsKQEAgLTY2LDcgKzY4LDcgQEAKIAlpZiAoY2NyICYgQ0NSX0NBQ0hFX0VOQUJMRSkgewogCQl1bnNpZ25lZCBsb25nIHdheXMsIHdheXNpemUsIGFkZHJzdGFydDsKIAotCQl3YXlzaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzOworCQl3YXlzaXplID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0czsKIAogI2lmZGVmIENDUl9DQUNIRV9PUkEKIAkJLyoKQEAgLTc3LDcgKzc5LDcgQEAKIAkJCXdheXNpemUgPj49IDE7CiAjZW5kaWYKIAotCQl3YXlzaXplIDw8PSBjcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0OworCQl3YXlzaXplIDw8PSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdDsKIAogI2lmZGVmIENDUl9DQUNIRV9FTU9ERQogCQkvKiBJZiBFTU9ERSBpcyBub3Qgc2V0LCB3ZSBvbmx5IGhhdmUgMSB3YXkgdG8gZmx1c2guICovCkBAIC04NSw3ICs4Nyw3IEBACiAJCQl3YXlzID0gMTsKIAkJZWxzZQogI2VuZGlmCi0JCQl3YXlzID0gY3B1X2RhdGEtPmRjYWNoZS53YXlzOworCQkJd2F5cyA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXM7CiAKIAkJYWRkcnN0YXJ0ID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWTsKIAkJZG8gewpAQCAtOTMsMTAgKzk1LDEwIEBACiAKIAkJCWZvciAoYWRkciA9IGFkZHJzdGFydDsKIAkJCSAgICAgYWRkciA8IGFkZHJzdGFydCArIHdheXNpemU7Ci0JCQkgICAgIGFkZHIgKz0gY3B1X2RhdGEtPmRjYWNoZS5saW5lc3opCisJCQkgICAgIGFkZHIgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6KQogCQkJCWN0cmxfb3V0bCgwLCBhZGRyKTsKIAotCQkJYWRkcnN0YXJ0ICs9IGNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3I7CisJCQlhZGRyc3RhcnQgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3I7CiAJCX0gd2hpbGUgKC0td2F5cyk7CiAJfQogCkBAIC0xMDgsNyArMTEwLDcgQEAKIAogI2lmZGVmIENDUl9DQUNIRV9FTU9ERQogCS8qIEZvcmNlIEVNT0RFIGlmIHBvc3NpYmxlICovCi0JaWYgKGNwdV9kYXRhLT5kY2FjaGUud2F5cyA+IDEpCisJaWYgKGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPiAxKQogCQlmbGFncyB8PSBDQ1JfQ0FDSEVfRU1PREU7CiAJZWxzZQogCQlmbGFncyAmPSB+Q0NSX0NBQ0hFX0VNT0RFOwpAQCAtMTI1LDEwICsxMjcsMTAgQEAKICNpZmRlZiBDT05GSUdfU0hfT0NSQU0KIAkvKiBUdXJuIG9uIE9DUkFNIC0tIGhhbHZlIHRoZSBPQyAqLwogCWZsYWdzIHw9IENDUl9DQUNIRV9PUkE7Ci0JY3B1X2RhdGEtPmRjYWNoZS5zZXRzID4+PSAxOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgPj49IDE7CiAKLQljcHVfZGF0YS0+ZGNhY2hlLndheV9zaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzICoKLQkJCQkgICAgY3B1X2RhdGEtPmRjYWNoZS5saW5lc3o7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X3NpemUgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzICoKKwkJCQkgICAgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6OwogI2VuZGlmCiAKIAljdHJsX291dGwoZmxhZ3MsIENDUik7CkBAIC0xNzAsNyArMTcyLDcgQEAKIAogCS8qIElmIHRoZSBEU1AgYml0IGlzIHN0aWxsIHNldCwgdGhpcyBDUFUgaGFzIGEgRFNQICovCiAJaWYgKHNyICYgU1JfRFNQKQotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19EU1A7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19EU1A7CiAKIAkvKiBOb3cgdGhhdCB3ZSd2ZSBkZXRlcm1pbmVkIHRoZSBEU1Agc3RhdHVzLCBjbGVhciB0aGUgRFNQIGJpdC4gKi8KIAlyZWxlYXNlX2RzcCgpOwpAQCAtMjAyLDIyICsyMDQsMjggQEAKIAljYWNoZV9pbml0KCk7CiAKIAlzaG1fYWxpZ25fbWFzayA9IG1heF90KHVuc2lnbmVkIGxvbmcsCi0JCQkgICAgICAgY3B1X2RhdGEtPmRjYWNoZS53YXlfc2l6ZSAtIDEsCisJCQkgICAgICAgY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X3NpemUgLSAxLAogCQkJICAgICAgIFBBR0VfU0laRSAtIDEpOwogCiAJLyogRGlzYWJsZSB0aGUgRlBVICovCiAJaWYgKGZwdV9kaXNhYmxlZCkgewogCQlwcmludGsoIkZQVSBEaXNhYmxlZFxuIik7Ci0JCWNwdV9kYXRhLT5mbGFncyAmPSB+Q1BVX0hBU19GUFU7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJj0gfkNQVV9IQVNfRlBVOwogCQlkaXNhYmxlX2ZwdSgpOwogCX0KIAogCS8qIEZQVSBpbml0aWFsaXphdGlvbiAqLwotCWlmICgoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19GUFUpKSB7CisJaWYgKChjdXJyZW50X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19GUFUpKSB7CiAJCWNsZWFyX3RocmVhZF9mbGFnKFRJRl9VU0VERlBVKTsKIAkJY2xlYXJfdXNlZF9tYXRoKCk7CiAJfQogCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBwZXItQ1BVIEFTSUQgY2FjaGUgdmVyeSBlYXJseSwgc2luY2UgdGhlCisJICogVExCIGZsdXNoaW5nIHJvdXRpbmVzIGRlcGVuZCBvbiB0aGlzIGJlaW5nIHNldHVwLgorCSAqLworCWN1cnJlbnRfY3B1X2RhdGEuYXNpZF9jYWNoZSA9IE5PX0NPTlRFWFQ7CisKICNpZmRlZiBDT05GSUdfU0hfRFNQCiAJLyogUHJvYmUgZm9yIERTUCAqLwogCWRzcF9pbml0KCk7CkBAIC0yMjUsNyArMjMzLDcgQEAKIAkvKiBEaXNhYmxlIHRoZSBEU1AgKi8KIAlpZiAoZHNwX2Rpc2FibGVkKSB7CiAJCXByaW50aygiRFNQIERpc2FibGVkXG4iKTsKLQkJY3B1X2RhdGEtPmZsYWdzICY9IH5DUFVfSEFTX0RTUDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyAmPSB+Q1BVX0hBU19EU1A7CiAJCXJlbGVhc2VfZHNwKCk7CiAJfQogI2VuZGlmCkBAIC0yNDAsNCArMjQ4LDMgQEAKIAl1YmNfd2FrZXVwKCk7CiAjZW5kaWYKIH0KLQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9pcnEvaXByLmMKaW5kZXggMzVlYjU3NS4uMjEwMjgwYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L2lycS9pcHIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvaXJxL2lwci5jCkBAIC00MywxNiArNDMsMjkgQEAKIAkubWFza19hY2sJPSBkaXNhYmxlX2lwcl9pcnEsCiB9OwogCit1bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpIF9fYXR0cmlidXRlX18gKCh3ZWFrKSk7Cit1bnNpZ25lZCBpbnQgbWFwX2lwcmlkeF90b19hZGRyKGludCBpZHgpCit7CisJcmV0dXJuIDA7Cit9CisKIHZvaWQgbWFrZV9pcHJfaXJxKHN0cnVjdCBpcHJfZGF0YSAqdGFibGUsIHVuc2lnbmVkIGludCBucl9pcnFzKQogewogCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IG5yX2lycXM7IGkrKykgewogCQl1bnNpZ25lZCBpbnQgaXJxID0gdGFibGVbaV0uaXJxOwotCQl0YWJsZVtpXS5hZGRyID0gbWFwX2lwcmlkeF90b19hZGRyKHRhYmxlW2ldLmlwcl9pZHgpOworCisJCWlmICghaXJxKQorCQkJaXJxID0gdGFibGVbaV0uaXJxID0gaTsKKwogCQkvKiBjb3VsZCB0aGUgSVBSIGluZGV4IGJlIG1hcHBlZCwgaWYgbm90IHdlIGlnbm9yZSB0aGlzICovCi0JCWlmICh0YWJsZVtpXS5hZGRyID09IDApCi0JCQljb250aW51ZTsKKwkJaWYgKCF0YWJsZVtpXS5hZGRyKSB7CisJCQl0YWJsZVtpXS5hZGRyID0gbWFwX2lwcmlkeF90b19hZGRyKHRhYmxlW2ldLmlwcl9pZHgpOworCQkJaWYgKCF0YWJsZVtpXS5hZGRyKQorCQkJCWNvbnRpbnVlOworCQl9CisKIAkJZGlzYWJsZV9pcnFfbm9zeW5jKGlycSk7CiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlwcl9pcnFfY2hpcCwKIAkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUwppbmRleCBkNTFmYTVlOS4uN2Y3ZDI5MiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9lbnRyeS5TCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvZW50cnkuUwpAQCAtMTc4LDEyICsxNzgsMTAgQEAKIDg6CS5sb25nCWRvX2V4Y2VwdGlvbl9lcnJvcgogCQogdHJhcF9lbnRyeToKLQkvKiB2ZXJib3NlIEJVRyB0cmFwYSBlbnRyeSBjaGVjayAqLwotCW1vdgkjMHgzZSxyOAotCWNtcC9nZQlyOCxyOQotCWJmL3MJMWYKLQkgYWRkCSMtMHgxMCxyOQotCWFkZAkjMHgxMCxyOQorCW1vdgkjMHgzMCxyOAorCWNtcC9nZQlyOCxyOQkJISB2ZWN0b3IgMHgyMC0weDJmIGlzIHN5c3RlbWNhbGwKKwlidAkxZgorCWFkZAkjLTB4MTAscjkJISBjb252ZXJ0IFNIMiB0byBTSDMvNCBBQkkKIDE6CQogCXNobGwyCXI5CQkJISBUUkEKIAltb3YJI09GRl9UUkEscjgKQEAgLTIwNiw3ICsyMDQsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKIAkvKiBVbndpbmQgdGhlIHN0YWNrIGFuZCBqbXAgdG8gdGhlIGRlYnVnIGVudHJ5ICovCi1kZWJ1Z19rZXJuZWxfZnc6CitFTlRSWShzaF9iaW9zX2hhbmRsZXIpCiAJbW92CXIxNSxyMAogCWFkZAkjKDIyLTQpKjQtNCxyMAogCWxkYy5sCUByMCssZ2JyCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3Byb2JlLmMKaW5kZXggYmE1MjdkOS4uMTA4ZTgxYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9wcm9iZS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvcHJvYmUuYwpAQCAtMTgsMjcgKzE4LDI3IEBACiBpbnQgX19pbml0IGRldGVjdF9jcHVfYW5kX2NhY2hlX3N5c3RlbSh2b2lkKQogewogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzYwNCkKLQljcHVfZGF0YS0+dHlwZQkJCT0gQ1BVX1NINzYwNDsKLQljcHVfZGF0YS0+ZGNhY2hlLndheXMJCT0gNDsKLQljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyCT0gKDE8PDEwKTsKLQljcHVfZGF0YS0+ZGNhY2hlLnNldHMJCT0gNjQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7Ci0JY3B1X2RhdGEtPmRjYWNoZS5mbGFncwkJPSAwOworCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYwNDsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTApOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMJCT0gNjQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfc2hpZnQJPSA0OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5mbGFncwkJPSAwOwogI2VsaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NjE5KQotCWNwdV9kYXRhLT50eXBlCQkJPSBDUFVfU0g3NjE5OwotCWNwdV9kYXRhLT5kY2FjaGUud2F5cwkJPSA0OwotCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTIpOwotCWNwdV9kYXRhLT5kY2FjaGUuc2V0cwkJPSAyNTY7Ci0JY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdAk9IDQ7Ci0JY3B1X2RhdGEtPmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7Ci0JY3B1X2RhdGEtPmRjYWNoZS5mbGFncwkJPSAwOworCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzYxOTsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMTw8MTIpOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMJCT0gMjU2OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X3NoaWZ0CT0gNDsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZmxhZ3MJCT0gMDsKICNlbmRpZgogCS8qCiAJICogU0gtMiBkb2Vzbid0IGhhdmUgc2VwYXJhdGUgY2FjaGVzCiAJICovCi0JY3B1X2RhdGEtPmRjYWNoZS5mbGFncyB8PSBTSF9DQUNIRV9DT01CSU5FRDsKLQljcHVfZGF0YS0+aWNhY2hlID0gY3B1X2RhdGEtPmRjYWNoZTsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5mbGFncyB8PSBTSF9DQUNIRV9DT01CSU5FRDsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMi9zZXR1cC1zaDc2MTkuYwppbmRleCA3OTI4M2U2Li5mODNmZjhhIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyL3NldHVwLXNoNzYxOS5jCisrKyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDIvc2V0dXAtc2g3NjE5LmMKQEAgLTUyLDQyICs1MiwzOCBAQAogfQogX19pbml0Y2FsbChzaDc2MTlfZGV2aWNlc19zZXR1cCk7CiAKLSNkZWZpbmUgSU5UQ19JUFJDICAgICAgMHhmODA4MDAwMFVMCi0jZGVmaW5lIElOVENfSVBSRCAgICAgIDB4ZjgwODAwMDJVTAotCi0jZGVmaW5lIENNSTBfSVJRICAgICAgIDg2Ci0KLSNkZWZpbmUgU0NJRjBfRVJJX0lSUSAgODgKLSNkZWZpbmUgU0NJRjBfUlhJX0lSUSAgODkKLSNkZWZpbmUgU0NJRjBfQlJJX0lSUSAgOTAKLSNkZWZpbmUgU0NJRjBfVFhJX0lSUSAgOTEKLQotI2RlZmluZSBTQ0lGMV9FUklfSVJRICA5MgotI2RlZmluZSBTQ0lGMV9SWElfSVJRICA5MwotI2RlZmluZSBTQ0lGMV9CUklfSVJRICA5NAotI2RlZmluZSBTQ0lGMV9UWElfSVJRICA5NQotCi0jZGVmaW5lIFNDSUYyX0JSSV9JUlEgIDk2Ci0jZGVmaW5lIFNDSUYyX0VSSV9JUlEgIDk3Ci0jZGVmaW5lIFNDSUYyX1JYSV9JUlEgIDk4Ci0jZGVmaW5lIFNDSUYyX1RYSV9JUlEgIDk5Ci0KIHN0YXRpYyBzdHJ1Y3QgaXByX2RhdGEgc2g3NjE5X2lwcl9tYXBbXSA9IHsKLQl7IENNSTBfSVJRLCAgICAgIElOVENfSVBSQywgMSwgMiB9LAotCXsgU0NJRjBfRVJJX0lSUSwgSU5UQ19JUFJELCAzLCAzIH0sCi0JeyBTQ0lGMF9SWElfSVJRLCBJTlRDX0lQUkQsIDMsIDMgfSwKLQl7IFNDSUYwX0JSSV9JUlEsIElOVENfSVBSRCwgMywgMyB9LAotCXsgU0NJRjBfVFhJX0lSUSwgSU5UQ19JUFJELCAzLCAzIH0sCi0JeyBTQ0lGMV9FUklfSVJRLCBJTlRDX0lQUkQsIDIsIDMgfSwKLQl7IFNDSUYxX1JYSV9JUlEsIElOVENfSVBSRCwgMiwgMyB9LAotCXsgU0NJRjFfQlJJX0lSUSwgSU5UQ19JUFJELCAyLCAzIH0sCi0JeyBTQ0lGMV9UWElfSVJRLCBJTlRDX0lQUkQsIDIsIDMgfSwKLQl7IFNDSUYyX0VSSV9JUlEsIElOVENfSVBSRCwgMSwgMyB9LAotCXsgU0NJRjJfUlhJX0lSUSwgSU5UQ19JUFJELCAxLCAzIH0sCi0JeyBTQ0lGMl9CUklfSVJRLCBJTlRDX0lQUkQsIDEsIDMgfSwKLQl7IFNDSUYyX1RYSV9JUlEsIElOVENfSVBSRCwgMSwgMyB9LAorCXsgODYsIDAsICA0LCAyIH0sCS8qIENNSTAgKi8KKwl7IDg4LCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9FUkkgKi8KKwl7IDg5LCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9SWEkgKi8KKwl7IDkwLCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9CUkkgKi8KKwl7IDkxLCAxLCAxMiwgMyB9LAkvKiBTQ0lGMF9UWEkgKi8KKwl7IDkyLCAxLCAgOCwgMyB9LAkvKiBTQ0lGMV9FUkkgKi8KKwl7IDkzLCAxLCAgOCwgMyB9LAkvKiBTQ0lGMV9SWEkgKi8KKwl7IDk0LCAxLCAgOCwgMyB9LAkvKiBTQ0lGMV9CUkkgKi8KKwl7IDk1LCAxLCAgOCwgMyB9LAkvKiBTQ0lGMV9UWEkgKi8KKwl7IDk2LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9FUkkgKi8KKwl7IDk3LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9SWEkgKi8KKwl7IDk4LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9CUkkgKi8KKwl7IDk5LCAxLCAgNCwgMyB9LAkvKiBTQ0lGMl9UWEkgKi8KIH07CiAKK3N0YXRpYyB1bnNpZ25lZCBpbnQgaXByX29mZnNldHNbXSA9IHsKKwkweGY4MDgwMDAwLAkvKiBJUFJDICovCisJMHhmODA4MDAwMiwJLyogSVBSRCAqLworCTB4ZjgwODAwMDQsCS8qIElQUkUgKi8KKwkweGY4MDgwMDA2LAkvKiBJUFJGICovCisJMHhmODA4MDAwOCwJLyogSVBSRyAqLworfTsKKworLyogZ2l2ZW4gdGhlIElQUiBpbmRleCByZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhlIElQUiByZWdpc3RlciAqLwordW5zaWduZWQgaW50IG1hcF9pcHJpZHhfdG9fYWRkcihpbnQgaWR4KQoreworCWlmICh1bmxpa2VseShpZHggPj0gQVJSQVlfU0laRShpcHJfb2Zmc2V0cykpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKK30KKwogdm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKHZvaWQpCiB7CiAJbWFrZV9pcHJfaXJxKHNoNzYxOV9pcHJfbWFwLCBBUlJBWV9TSVpFKHNoNzYxOV9pcHJfbWFwKSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9wcm9iZS5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvcHJvYmUuYwppbmRleCA4N2M2YzA1NC4uNDI2ZjZkYiAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvcHJvYmUuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gyYS9wcm9iZS5jCkBAIC0xNywxNCArMTcsMTQgQEAKIGludCBfX2luaXQgZGV0ZWN0X2NwdV9hbmRfY2FjaGVfc3lzdGVtKHZvaWQpCiB7CiAJLyogSnVzdCBTSDcyMDYgZm9yIG5vdyAuLiAqLwotCWNwdV9kYXRhLT50eXBlCQkJPSBDUFVfU0g3MjA2OworCWN1cnJlbnRfY3B1X2RhdGEudHlwZQkJCT0gQ1BVX1NINzIwNjsKIAotCWNwdV9kYXRhLT5kY2FjaGUud2F5cwkJPSA0OwotCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMSk7Ci0JY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IDEyODsKLQljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0CT0gNDsKLQljcHVfZGF0YS0+ZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKLQljcHVfZGF0YS0+ZGNhY2hlLmZsYWdzCQk9IDA7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cwkJPSA0OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9pbmNyCT0gKDEgPDwgMTEpOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMJCT0gMTI4OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X3NoaWZ0CT0gNDsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZmxhZ3MJCT0gMDsKIAogCS8qCiAJICogVGhlIGljYWNoZSBpcyB0aGUgc2FtZSBhcyB0aGUgZGNhY2hlIGFzIGZhciBhcyB0aGlzIHNldHVwIGlzCkBAIC0zMiw3ICszMiw3IEBACiAJICogbGFja3MgdGhlIFUgYml0IHRoYXQgdGhlIGRjYWNoZSBoYXMsIG5vbmUgb2YgdGhpcyBoYXMgYW55IGJlYXJpbmcKIAkgKiBvbiB0aGUgY2FjaGUgaW5mby4KIAkgKi8KLQljcHVfZGF0YS0+aWNhY2hlCQk9IGNwdV9kYXRhLT5kY2FjaGU7CisJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUJCT0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGU7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDJhL3NldHVwLXNoNzIwNi5jIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKaW5kZXggNGI2MGZjYy4uNGVkOTExMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMmEvc2V0dXAtc2g3MjA2LmMKQEAgLTU3LDU1ICs1Nyw1MiBAQAogfQogX19pbml0Y2FsbChzaDcyMDZfZGV2aWNlc19zZXR1cCk7CiAKLSNkZWZpbmUgSU5UQ19JUFIwOCAgICAgMHhmZmZlMGMwNFVMCi0jZGVmaW5lIElOVENfSVBSMDkgICAgIDB4ZmZmZTBjMDZVTAotI2RlZmluZSBJTlRDX0lQUjE0ICAgICAweGZmZmUwYzEwVUwKLQotI2RlZmluZSBDTUkwX0lSUSAgICAgICAxNDAKLQotI2RlZmluZSBNVFUxX1RHSTFBICAgICAxNjQKLQotI2RlZmluZSBTQ0lGMF9CUklfSVJRICAyNDAKLSNkZWZpbmUgU0NJRjBfRVJJX0lSUSAgMjQxCi0jZGVmaW5lIFNDSUYwX1JYSV9JUlEgIDI0MgotI2RlZmluZSBTQ0lGMF9UWElfSVJRICAyNDMKLQotI2RlZmluZSBTQ0lGMV9CUklfSVJRICAyNDQKLSNkZWZpbmUgU0NJRjFfRVJJX0lSUSAgMjQ1Ci0jZGVmaW5lIFNDSUYxX1JYSV9JUlEgIDI0NgotI2RlZmluZSBTQ0lGMV9UWElfSVJRICAyNDcKLQotI2RlZmluZSBTQ0lGMl9CUklfSVJRICAyNDgKLSNkZWZpbmUgU0NJRjJfRVJJX0lSUSAgMjQ5Ci0jZGVmaW5lIFNDSUYyX1JYSV9JUlEgIDI1MAotI2RlZmluZSBTQ0lGMl9UWElfSVJRICAyNTEKLQotI2RlZmluZSBTQ0lGM19CUklfSVJRICAyNTIKLSNkZWZpbmUgU0NJRjNfRVJJX0lSUSAgMjUzCi0jZGVmaW5lIFNDSUYzX1JYSV9JUlEgIDI1NAotI2RlZmluZSBTQ0lGM19UWElfSVJRICAyNTUKLQogc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDcyMDZfaXByX21hcFtdID0gewotCXsgQ01JMF9JUlEsICAgICAgSU5UQ19JUFIwOCwgMywgMiB9LAotCXsgTVRVMl9UR0kxQSwgICAgSU5UQ19JUFIwOSwgMSwgMiB9LAotCXsgU0NJRjBfRVJJX0lSUSwgSU5UQ19JUFIxNCwgMywgMyB9LAotCXsgU0NJRjBfUlhJX0lSUSwgSU5UQ19JUFIxNCwgMywgMyB9LAotCXsgU0NJRjBfQlJJX0lSUSwgSU5UQ19JUFIxNCwgMywgMyB9LAotCXsgU0NJRjBfVFhJX0lSUSwgSU5UQ19JUFIxNCwgMywgMyB9LAotCXsgU0NJRjFfRVJJX0lSUSwgSU5UQ19JUFIxNCwgMiwgMyB9LAotCXsgU0NJRjFfUlhJX0lSUSwgSU5UQ19JUFIxNCwgMiwgMyB9LAotCXsgU0NJRjFfQlJJX0lSUSwgSU5UQ19JUFIxNCwgMiwgMyB9LAotCXsgU0NJRjFfVFhJX0lSUSwgSU5UQ19JUFIxNCwgMiwgMyB9LAotCXsgU0NJRjJfRVJJX0lSUSwgSU5UQ19JUFIxNCwgMSwgMyB9LAotCXsgU0NJRjJfUlhJX0lSUSwgSU5UQ19JUFIxNCwgMSwgMyB9LAotCXsgU0NJRjJfQlJJX0lSUSwgSU5UQ19JUFIxNCwgMSwgMyB9LAotCXsgU0NJRjJfVFhJX0lSUSwgSU5UQ19JUFIxNCwgMSwgMyB9LAotCXsgU0NJRjNfRVJJX0lSUSwgSU5UQ19JUFIxNCwgMCwgMyB9LAotCXsgU0NJRjNfUlhJX0lSUSwgSU5UQ19JUFIxNCwgMCwgMyB9LAotCXsgU0NJRjNfQlJJX0lSUSwgSU5UQ19JUFIxNCwgMCwgMyB9LAotCXsgU0NJRjNfVFhJX0lSUSwgSU5UQ19JUFIxNCwgMCwgMyB9LAorCXsgMTQwLCAgNywgMTIsIDIgfSwJLyogQ01JMCAqLworCXsgMTY0LCAgOCwgIDQsIDIgfSwJLyogTVRVMl9UR0kxQSAqLworCXsgMjQwLCAxMywgMTIsIDMgfSwJLyogU0NJRjBfQlJJICovCisJeyAyNDEsIDEzLCAxMiwgMyB9LAkvKiBTQ0lGMF9FUkkgKi8KKwl7IDI0MiwgMTMsIDEyLCAzIH0sCS8qIFNDSUYwX1JYSSAqLworCXsgMjQzLCAxMywgMTIsIDMgfSwJLyogU0NJRjBfVFhJICovCisJeyAyNDQsIDEzLCAgOCwgMyB9LAkvKiBTQ0lGMV9CUkkgKi8KKwl7IDI0NSwgMTMsICA4LCAzIH0sCS8qIFNDSUYxX0VSSSAqLworCXsgMjQ2LCAxMywgIDgsIDMgfSwJLyogU0NJRjFfUlhJICovCisJeyAyNDcsIDEzLCAgOCwgMyB9LAkvKiBTQ0lGMV9UWEkgKi8KKwl7IDI0OCwgMTMsICA0LCAzIH0sCS8qIFNDSUYyX0JSSSAqLworCXsgMjQ5LCAxMywgIDQsIDMgfSwJLyogU0NJRjJfRVJJICovCisJeyAyNTAsIDEzLCAgNCwgMyB9LAkvKiBTQ0lGMl9SWEkgKi8KKwl7IDI1MSwgMTMsICA0LCAzIH0sCS8qIFNDSUYyX1RYSSAqLworCXsgMjUyLCAxMywgIDAsIDMgfSwJLyogU0NJRjNfQlJJICovCisJeyAyNTMsIDEzLCAgMCwgMyB9LAkvKiBTQ0lGM19FUkkgKi8KKwl7IDI1NCwgMTMsICAwLCAzIH0sCS8qIFNDSUYzX1JYSSAqLworCXsgMjU1LCAxMywgIDAsIDMgfSwJLyogU0NJRjNfVFhJICovCiB9OwogCitzdGF0aWMgdW5zaWduZWQgaW50IGlwcl9vZmZzZXRzW10gPSB7CisJMHhmZmZlMDgxOCwJLyogSVBSMDEgKi8KKwkweGZmZmUwODFhLAkvKiBJUFIwMiAqLworCTAsCQkvKiB1bnVzZWQgKi8KKwkwLAkJLyogdW51c2VkICovCisJMHhmZmZlMDgyMCwJLyogSVBSMDUgKi8KKwkweGZmZmUwYzAwLAkvKiBJUFIwNiAqLworCTB4ZmZmZTBjMDIsCS8qIElQUjA3ICovCisJMHhmZmZlMGMwNCwJLyogSVBSMDggKi8KKwkweGZmZmUwYzA2LAkvKiBJUFIwOSAqLworCTB4ZmZmZTBjMDgsCS8qIElQUjEwICovCisJMHhmZmZlMGMwYSwJLyogSVBSMTEgKi8KKwkweGZmZmUwYzBjLAkvKiBJUFIxMiAqLworCTB4ZmZmZTBjMGUsCS8qIElQUjEzICovCisJMHhmZmZlMGMxMCwJLyogSVBSMTQgKi8KK307CisKKy8qIGdpdmVuIHRoZSBJUFIgaW5kZXggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBJUFIgcmVnaXN0ZXIgKi8KK3Vuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkKK3sKKwlpZiAodW5saWtlbHkoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKSkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGlwcl9vZmZzZXRzW2lkeF07Cit9CisKIHZvaWQgX19pbml0IGluaXRfSVJRX2lwcih2b2lkKQogewogCW1ha2VfaXByX2lycShzaDcyMDZfaXByX21hcCwgQVJSQVlfU0laRShzaDcyMDZfaXByX21hcCkpOwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9lbnRyeS5TCmluZGV4IDhjMGRjMjcuLmMxOTIwNWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvZW50cnkuUworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL2VudHJ5LlMKQEAgLTEzLDEwICsxMyw4IEBACiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogI2luY2x1ZGUgPGFzbS90aHJlYWRfaW5mby5oPgotI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vY3B1L21tdV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KLSNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KIAogISBOT1RFOgogISBHTlUgYXMgKGFzIG9mIDIuOS4xKSBjaGFuZ2VzIGJmL3MgaW50byBidC9zIGFuZCBicmEsIHdoZW4gdGhlIGFkZHJlc3MKQEAgLTEzOCwxNCArMTM2LDI5IEBACiAKIGNhbGxfZHBmOgogCW1vdi5sCTFmLCByMAotIAltb3YubAlAcjAsIHI2CQkhIGFkZHJlc3MKKwltb3YJcjUsIHI4CisJbW92LmwJQHIwLCByNgorCW1vdglyNiwgcjkKKwltb3YubAkyZiwgcjAKKwlzdHMJcHIsIHIxMAorCWpzcglAcjAKKwkgbW92CXIxNSwgcjQKKwkhCisJdHN0CXIwLCByMAorCWJmL3MJMGYKKwkgbGRzCXIxMCwgcHIKKwlydHMKKwkgbm9wCiswOglzdGkKIAltb3YubAkzZiwgcjAKLQorCW1vdglyOSwgcjYKKwltb3YJcjgsIHI1CiAJam1wCUByMAotIAkgbW92CXIxNSwgcjQJCSEgcmVncworCSBtb3YJcjE1LCByNAogCiAJLmFsaWduIDIKIDE6CS5sb25nCU1NVV9URUEKKzI6CS5sb25nCV9fZG9fcGFnZV9mYXVsdAogMzoJLmxvbmcJZG9fcGFnZV9mYXVsdAogCiAJLmFsaWduCTIKQEAgLTE3Myw3ICsxODYsNyBAQAogCiAjaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKIAkvKiBVbndpbmQgdGhlIHN0YWNrIGFuZCBqbXAgdG8gdGhlIGRlYnVnIGVudHJ5ICovCi1kZWJ1Z19rZXJuZWxfZnc6CitFTlRSWShzaF9iaW9zX2hhbmRsZXIpCiAJbW92LmwJQHIxNSssIHIwCiAJbW92LmwJQHIxNSssIHIxCiAJbW92LmwJQHIxNSssIHIyCkBAIC0zMzIsMTc1ICszNDUsOSBAQAogIQogIQogCi0vKiBUaGlzIGNvZGUgbWFrZXMgc29tZSBhc3N1bXB0aW9ucyB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgotICogTWFrZSBzdXJlIHRoZXkgYXJlIHN0aWwgdHJ1ZS4gKi8KLSNpZiBQVFJTX1BFUl9QR0QgIT0gUFRSU19QRVJfUFRFCi0jZXJyb3IgUEdEIGFuZCBQVEUgc2l6ZXMgZG9uJ3QgbWF0Y2gKLSNlbmRpZgotCi0vKiBnYXMgZG9lc24ndCBmbGFnIGltcG9zc2libGUgdmFsdWVzIGZvciBtb3YgI2ltbWVkaWF0ZSBhcyBhbiBlcnJvciAqLwotI2lmIChfUEFHRV9QUkVTRU5UID4+IDIpID4gMHg3ZgotI2Vycm9yIGNhbm5vdCBsb2FkIFBBR0VfUFJFU0VOVCBhcyBhbiBpbW1lZGlhdGUKLSNlbmRpZgotI2lmIF9QQUdFX0RJUlRZID4gMHg3ZgotI2Vycm9yIGNhbm5vdCBsb2FkIFBBR0VfRElSVFkgYXMgYW4gaW1tZWRpYXRlCi0jZW5kaWYKLSNpZiAoX1BBR0VfUFJFU0VOVCA8PCAyKSAhPSBfUEFHRV9BQ0NFU1NFRAotI2Vycm9yIGNhbm5vdCBkZXJpdmUgUEFHRV9BQ0NFU1NFRCBmcm9tIFBBR0VfUFJFU0VOVAotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KQotI2RlZmluZSBsZG1tdXB0ZWgocikJbW92LmwJOGYsIHIKLSNlbHNlCi0jZGVmaW5lIGxkbW11cHRlaChyKQltb3YJI01NVV9QVEVILCByCi0jZW5kaWYKLQogCS5iYWxpZ24gCTEwMjQsMCwxMDI0CiB0bGJfbWlzczoKLSNpZmRlZiBDT1VOVF9FWENFUFRJT05TCi0JISBJbmNyZW1lbnQgdGhlIGNvdW50cwotCW1vdi5sCTlmLCBrMQotCW1vdi5sCUBrMSwgazIKLQlhZGQJIzEsIGsyCi0JbW92LmwJazIsIEBrMQotI2VuZGlmCi0KLQkhIGswIHNjcmF0Y2gKLQkhIGsxIHBnZCBhbmQgcHRlIHBvaW50ZXJzCi0JISBrMiBmYXVsdGluZyBhZGRyZXNzCi0JISBrMyBwZ2QgYW5kIHB0ZSBpbmRleCBtYXNrcwotCSEgazQgc2hpZnQKLQotCSEgTG9hZCB1cCB0aGUgcGdkIGVudHJ5IChrMSkKLQotCWxkbW11cHRlaChrMCkJCQkhICA5IExTIChsYXRlbmN5PTIpCU1NVV9QVEVICi0KLQltb3Yudwk0ZiwgazMJCQkhICA4IExTIChsYXRlbmN5PTIpCShQVFJTX1BFUl9QR0QtMSkgPDwgMgotCW1vdgkjLShQR0RJUl9TSElGVC0yKSwgazQJISAgNiBFWAotCi0JbW92LmwJQChNTVVfVEVBLU1NVV9QVEVILGswKSwgazIJISAxOCBMUyAobGF0ZW5jeT0yKQotCi0JbW92LmwJQChNTVVfVFRCLU1NVV9QVEVILGswKSwgazEJISAxOCBMUyAobGF0ZW5jeT0yKQotCi0JbW92CWsyLCBrMAkJCSEgICA1IE1UIChsYXRlbmN5PTApCi0Jc2hsZAlrNCwgazAJCQkhICA5OSBFWAotCi0JYW5kCWszLCBrMAkJCSEgIDc4IEVYCi0KLQltb3YubAlAKGswLCBrMSksIGsxCQkhICAyMSBMUyAobGF0ZW5jeT0yKQotCW1vdgkjLShQQUdFX1NISUZULTIpLCBrNAkhICAgNiBFWAotCi0JISBMb2FkIHVwIHRoZSBwdGUgZW50cnkgKGsyKQotCi0JbW92CWsyLCBrMAkJCSEgICA1IE1UIChsYXRlbmN5PTApCi0Jc2hsZAlrNCwgazAJCQkhICA5OSBFWAotCi0JdHN0CWsxLCBrMQkJCSEgIDg2IE1UCi0KLQlidAkyMGYJCQkhIDExMCBCUgotCi0JYW5kCWszLCBrMAkJCSEgIDc4IEVYCi0JbW92LncJNWYsIGs0CQkJISAgIDggTFMgKGxhdGVuY3k9MikJX1BBR0VfUFJFU0VOVAotCi0JbW92LmwJQChrMCwgazEpLCBrMgkJISAgMjEgTFMgKGxhdGVuY3k9MikKLQlhZGQJazAsIGsxCQkJISAgNDkgRVgKLQotI2lmZGVmIENPTkZJR19DUFVfSEFTX1BURUEKLQkhIFRlc3QgdGhlIGVudHJ5IGZvciBwcmVzZW50IGFuZCBfUEFHRV9BQ0NFU1NFRAotCi0JbW92CSMtMjgsIGszCQkhICAgNiBFWAotCW1vdglrMiwgazAJCQkhICAgNSBNVCAobGF0ZW5jeT0wKQotCi0JdHN0CWs0LCBrMgkJCSEgIDY4IE1UCi0Jc2hsZAlrMywgazAJCQkhICA5OSBFWAotCi0JYnQJMjBmCQkJISAxMTAgQlIKLQotCSEgU2V0IFBURUEgcmVnaXN0ZXIKLQkhIE1NVV9QVEVBID0gKChwdGV2YWwgPj4gMjgpICYgMHhlKSB8IChwdGV2YWwgJiAweDEpCi0JIQotCSEgazA9cHRlPj4yOCwgazE9cHRlKiwgazI9cHRlLCBrMz08dW51c2VkPiwgazQ9X1BBR0VfUFJFU0VOVAotCi0JYW5kCSMweGUsIGswCQkhICA3OSBFWAotCi0JbW92CWswLCBrMwkJCSEgICA1IE1UIChsYXRlbmN5PTApCi0JbW92CWsyLCBrMAkJCSEgICA1IE1UIChsYXRlbmN5PTApCi0KLQlhbmQJIzEsIGswCQkJISAgNzkgRVgKLQotCW9yCWswLCBrMwkJCSEgIDgyIEVYCi0KLQlsZG1tdXB0ZWgoazApCQkJISAgIDkgTFMgKGxhdGVuY3k9MikKLQlzaGxsMglrNAkJCSEgMTAxIEVYCQlfUEFHRV9BQ0NFU1NFRAotCi0JdHN0CWs0LCBrMgkJCSEgIDY4IE1UCi0KLQltb3YubAlrMywgQChNTVVfUFRFQS1NTVVfUFRFSCxrMCkJISAyNyBMUwotCi0JbW92LmwJN2YsIGszCQkJISAgIDkgTFMgKGxhdGVuY3k9MikJX1BBR0VfRkxBR1NfSEFSRFdBUkVfTUFTSwotCi0JISBrMD1NTVVfUFRFSCwgazE9cHRlKiwgazI9cHRlLCBrMz1fUEFHRV9GTEFHU19IQVJEV0FSRSwgazQ9X1BBR0VfQUNDRVNTRUQKLSNlbHNlCi0KLQkhIFRlc3QgdGhlIGVudHJ5IGZvciBwcmVzZW50IGFuZCBfUEFHRV9BQ0NFU1NFRAotCi0JbW92LmwJN2YsIGszCQkJISAgIDkgTFMgKGxhdGVuY3k9MikJX1BBR0VfRkxBR1NfSEFSRFdBUkVfTUFTSwotCXRzdAlrNCwgazIJCQkhICA2OCBNVAotCi0Jc2hsbDIJazQJCQkhIDEwMSBFWAkJX1BBR0VfQUNDRVNTRUQKLQlsZG1tdXB0ZWgoazApCQkJISAgIDkgTFMgKGxhdGVuY3k9MikKLQotCWJ0CTIwZgkJCSEgMTEwIEJSCi0JdHN0CWs0LCBrMgkJCSEgIDY4IE1UCi0KLQkhIGswPU1NVV9QVEVILCBrMT1wdGUqLCBrMj1wdGUsIGszPV9QQUdFX0ZMQUdTX0hBUkRXQVJFLCBrND1fUEFHRV9BQ0NFU1NFRAotCi0jZW5kaWYKLQotCSEgU2V0IHVwIHRoZSBlbnRyeQotCi0JYW5kCWsyLCBrMwkJCSEgIDc4IEVYCi0JYnQvcwkxMGYJCQkhIDEwOCBCUgotCi0JIG1vdi5sCWszLCBAKE1NVV9QVEVMLU1NVV9QVEVILGswKQkhIDI3IExTCi0KLQlsZHRsYgkJCQkhIDEyOCBDTwotCi0JISBBdCBsZWFzdCBvbmUgaW5zdHJ1Y3Rpb24gYmV0d2VlbiBsZHRsYiBhbmQgcnRlCi0Jbm9wCQkJCSEgMTE5IE5PUAotCi0JcnRlCQkJCSEgMTI2IENPCi0KLQkgbm9wCQkJCSEgMTE5IE5PUAotCi0KLTEwOglvcglrNCwgazIJCQkhICA4MiBFWAotCi0JbGR0bGIJCQkJISAxMjggQ08KLQotCSEgQXQgbGVhc3Qgb25lIGluc3RydWN0aW9uIGJldHdlZW4gbGR0bGIgYW5kIHJ0ZQotCW1vdi5sCWsyLCBAazEJCQkhICAyNyBMUwotCi0JcnRlCQkJCSEgMTI2IENPCi0KLQkhIE5vdGUgd2UgY2Fubm90IGV4ZWN1dGUgbW92IGhlcmUsIGJlY2F1c2UgaXQgaXMgZXhlY3V0ZWQgYWZ0ZXIKLQkhIHJlc3RvcmluZyBTU1IsIHNvIHdvdWxkIGJlIGV4ZWN1dGVkIGluIHVzZXIgc3BhY2UuCi0JIG5vcAkJCQkhIDExOSBOT1AKLQotCi0JLmFsaWduIDUKLQkhIE9uY2UgY2FjaGUgbGluZSBpZiBwb3NzaWJsZS4uLgotMToJLmxvbmcJc3dhcHBlcl9wZ19kaXIKLTQ6CS5zaG9ydAkoUFRSU19QRVJfUEdELTEpIDw8IDIKLTU6CS5zaG9ydAlfUEFHRV9QUkVTRU5UCi03OgkubG9uZwlfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLCi04OgkubG9uZwlNTVVfUFRFSAotI2lmZGVmIENPVU5UX0VYQ0VQVElPTlMKLTk6CS5sb25nCWV4Y2VwdGlvbl9jb3VudF9taXNzCi0jZW5kaWYKLQotCSEgRWl0aGVyIHBnZCBvciBwdGUgbm90IHByZXNlbnQKLTIwOgltb3YubAkxZiwgazIKKwltb3YubAkxZiwgazIKIAltb3YubAk0ZiwgazMKIAlicmEJaGFuZGxlX2V4Y2VwdGlvbgogCSBtb3YubAlAazIsIGsyCkBAIC02NTEsMTUgKzQ5OCw2IEBACiAJYmYJaW50ZXJydXB0X2V4Y2VwdGlvbgogCXNobHIyCXI4CiAJc2hscglyOAotCi0jaWZkZWYgQ09VTlRfRVhDRVBUSU9OUwotCW1vdi5sCTVmLCByOQotCWFkZAlyOCwgcjkKLQltb3YubAlAcjksIHIxMAotCWFkZAkjMSwgcjEwCi0JbW92LmwJcjEwLCBAcjkKLSNlbmRpZgotCiAJbW92LmwJNGYsIHI5CiAJYWRkCXI4LCByOQogCW1vdi5sCUByOSwgcjkKQEAgLTY3Myw5ICs1MTEsNiBAQAogMjoJLmxvbmcJMHgwMDAwODBmMAkhIEZEPTEsIElNQVNLPTE1CiAzOgkubG9uZwkweGNmZmZmZmZmCSEgUkI9MCwgQkw9MAogNDoJLmxvbmcJZXhjZXB0aW9uX2hhbmRsaW5nX3RhYmxlCi0jaWZkZWYgQ09VTlRfRVhDRVBUSU9OUwotNToJLmxvbmcJZXhjZXB0aW9uX2NvdW50X3RhYmxlCi0jZW5kaWYKIAogaW50ZXJydXB0X2V4Y2VwdGlvbjoKIAltb3YubAkxZiwgcjkKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvcHJvYmUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvcHJvYmUuYwppbmRleCBlNjcwOTg4Li44MjFiMGFiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3Byb2JlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9wcm9iZS5jCkBAIC01MCw0MSArNTAsNDEgQEAKIAogCWJhY2tfdG9fUDEoKTsKIAotCWNwdV9kYXRhLT5kY2FjaGUud2F5cwkJPSA0OwotCWNwdV9kYXRhLT5kY2FjaGUuZW50cnlfc2hpZnQJPSA0OwotCWNwdV9kYXRhLT5kY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOwotCWNwdV9kYXRhLT5kY2FjaGUuZmxhZ3MJCT0gMDsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzCQk9IDQ7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfc2hpZnQJPSA0OworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5mbGFncwkJPSAwOwogCiAJLyoKIAkgKiA3NzA5QS83NzI5IGhhcyAxNksgY2FjaGUgKDI1Ni1lbnRyeSksIHdoaWxlIDc3MDIgaGFzIG9ubHkKIAkgKiAySyhkaXJlY3QpIDc3MDIgaXMgbm90IHN1cHBvcnRlZCAoeWV0KQogCSAqLwogCWlmIChkYXRhMCA9PSBkYXRhMSAmJiBkYXRhMiA9PSBkYXRhMykgewkvKiBTaGFkb3cgKi8KLQkJY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jcgk9ICgxIDw8IDExKTsKLQkJY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9tYXNrCT0gMHg3ZjA7Ci0JCWNwdV9kYXRhLT5kY2FjaGUuc2V0cwkJPSAxMjg7Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzcwODsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMSk7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X21hc2sJPSAweDdmMDsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cwkJPSAxMjg7CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3MDg7CiAKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfTU1VX1BBR0VfQVNTT0M7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19NTVVfUEFHRV9BU1NPQzsKIAl9IGVsc2UgewkJCQkvKiA3NzA5QSBvciA3NzI5ICAqLwotCQljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyCT0gKDEgPDwgMTIpOwotCQljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X21hc2sJPSAweGZmMDsKLQkJY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IDI1NjsKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzI5OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcgk9ICgxIDw8IDEyKTsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfbWFzawk9IDB4ZmYwOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzCQk9IDI1NjsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzcyOTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TVUJUWVBFX1NINzcwNikKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzA2OworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzA2OwogI2VuZGlmCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzEwKQotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3MTA7CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3MTA7CiAjZW5kaWYKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDUpCi0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzcwNTsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzcwNTsKIAogI2lmIGRlZmluZWQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQotCQljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyCT0gKDEgPDwgMTMpOwotCQljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X21hc2sJPSAweDFmZjA7Ci0JCWNwdV9kYXRhLT5kY2FjaGUuc2V0cwkJPSA1MTI7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9pbmNyCT0gKDEgPDwgMTMpOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9tYXNrCT0gMHgxZmYwOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzCQk9IDUxMjsKIAkJY3RybF9vdXRsKENDUl9DQUNIRV8zMktCLCBDQ1IzKTsKICNlbHNlCiAJCWN0cmxfb3V0bChDQ1JfQ0FDSEVfMTZLQiwgQ0NSMyk7CkBAIC05NSw4ICs5NSw4IEBACiAJLyoKIAkgKiBTSC0zIGRvZXNuJ3QgaGF2ZSBzZXBhcmF0ZSBjYWNoZXMKIAkgKi8KLQljcHVfZGF0YS0+ZGNhY2hlLmZsYWdzIHw9IFNIX0NBQ0hFX0NPTUJJTkVEOwotCWNwdV9kYXRhLT5pY2FjaGUgPSBjcHVfZGF0YS0+ZGNhY2hlOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmZsYWdzIHw9IFNIX0NBQ0hFX0NPTUJJTkVEOworCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGU7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA5LmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2gzL3NldHVwLXNoNzcwOS5jCmluZGV4IGZmNDNlZjIuLmRjOWIyMTEgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDMvc2V0dXAtc2g3NzA5LmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoMy9zZXR1cC1zaDc3MDkuYwpAQCAtNTEsMyArNTEsMjQgQEAKIAkJCQkgICAgQVJSQVlfU0laRShzaDc3MDlfZGV2aWNlcykpOwogfQogX19pbml0Y2FsbChzaDc3MDlfZGV2aWNlc19zZXR1cCk7CisKKyNkZWZpbmUgSVBSeChBLE4pIC5hZGRyPUEsIC5zaGlmdD0wKk4qLTEKKyNkZWZpbmUgSVBSQShOKQlJUFJ4KDB4ZmZmZmZlZTJVTCxOKQorI2RlZmluZSBJUFJCKE4pCUlQUngoMHhmZmZmZmVlNFVMLE4pCisjZGVmaW5lIElQUkUoTikJSVBSeCgweGE0MDAwMDFhVUwsTikKKworc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3MDlfaXByX21hcFtdID0geworCVsxNl0JCT0geyBJUFJBKDE1LTEyKSwgMiB9LCAvKiBUTVUgVFVOSTAgKi8KKwlbMTddCQk9IHsgSVBSQSgxMS04KSwgIDQgfSwgLyogVE1VIFRVTkkxICovCisJWzIyXQkJPSB7IElQUkEoMy0wKSwgICAyIH0sIC8qIFJUQyBDVUkgKi8KKwlbMjMgLi4uIDI2XQk9IHsgSVBSQig3LTQpLCAgIDMgfSwgLyogU0NJICovCisJWzI3XQkJPSB7IElQUkIoMTUtMTIpLCAyIH0sIC8qIFdEVCBJVEkgKi8KKwlbNDggLi4uIDUxXQk9IHsgSVBSRSgxNS0xMiksIDcgfSwgLyogRE1BICovCisJWzUyIC4uLiA1NV0JPSB7IElQUkUoMTEtOCksICAzIH0sIC8qIElSREEgKi8KKwlbNTYgLi4uIDU5XQk9IHsgSVBSRSg3LTQpLCAgIDMgfSwgLyogU0NJRiAqLworfTsKKwordm9pZCBfX2luaXQgaW5pdF9JUlFfaXByKCkKK3sKKwltYWtlX2lwcl9pcnEoc2g3NzA5X2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzA5X2lwcl9tYXApKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvcHJvYmUuYwppbmRleCA5MDMxYTIyLi45ZDI4Yzg4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3Byb2JlLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9wcm9iZS5jCkBAIC0xMCwxMSArMTAsMTAgQEAKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KLQogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9pby5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vY2FjaGUuaD4KLSNpbmNsdWRlIDxhc20vaW8uaD4KIAogaW50IF9faW5pdCBkZXRlY3RfY3B1X2FuZF9jYWNoZV9zeXN0ZW0odm9pZCkKIHsKQEAgLTM2LDIwICszNSwyMCBAQAogCS8qCiAJICogU2V0dXAgc29tZSBzYW5lIFNILTQgZGVmYXVsdHMgZm9yIHRoZSBpY2FjaGUKIAkgKi8KLQljcHVfZGF0YS0+aWNhY2hlLndheV9pbmNyCT0gKDEgPDwgMTMpOwotCWNwdV9kYXRhLT5pY2FjaGUuZW50cnlfc2hpZnQJPSA1OwotCWNwdV9kYXRhLT5pY2FjaGUuc2V0cwkJPSAyNTY7Ci0JY3B1X2RhdGEtPmljYWNoZS53YXlzCQk9IDE7Ci0JY3B1X2RhdGEtPmljYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7CisJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxMyk7CisJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUuZW50cnlfc2hpZnQJPSA1OworCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLnNldHMJCT0gMjU2OworCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMJCT0gMTsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZS5saW5lc3oJCT0gTDFfQ0FDSEVfQllURVM7CiAKIAkvKgogCSAqIEFuZCBhZ2FpbiBmb3IgdGhlIGRjYWNoZSAuLgogCSAqLwotCWNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3IJPSAoMSA8PCAxNCk7Ci0JY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9zaGlmdAk9IDU7Ci0JY3B1X2RhdGEtPmRjYWNoZS5zZXRzCQk9IDUxMjsKLQljcHVfZGF0YS0+ZGNhY2hlLndheXMJCT0gMTsKLQljcHVfZGF0YS0+ZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfaW5jcgk9ICgxIDw8IDE0KTsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9zaGlmdAk9IDU7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cwkJPSA1MTI7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cwkJPSAxOworCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKIAogCS8qCiAJICogU2V0dXAgc29tZSBnZW5lcmljIGZsYWdzIHdlIGNhbiBwcm9iZQpAQCAtNTcsMTYgKzU2LDE2IEBACiAJICovCiAJaWYgKCgocHZyID4+IDE2KSAmIDB4ZmYpID09IDB4MTApIHsKIAkJaWYgKChjdnIgJiAweDAyMDAwMDAwKSA9PSAwKQotCQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfTDJfQ0FDSEU7CisJCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfTDJfQ0FDSEU7CiAJCWlmICgoY3ZyICYgMHgxMDAwMDAwMCkgPT0gMCkKLQkJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0RTUDsKKwkJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19EU1A7CiAKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfTExTQzsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CiAJfQogCiAJLyogRlBVIGRldGVjdGlvbiB3b3JrcyBmb3IgZXZlcnlvbmUgKi8KIAlpZiAoKGN2ciAmIDB4MjAwMDAwMDApID09IDEpCi0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKIAogCS8qIE1hc2sgb2ZmIHRoZSB1cHBlciBjaGlwIElEICovCiAJcHZyICY9IDB4ZmZmZjsKQEAgLTc3LDE1MSArNzYsMTUxIEBACiAJICovCiAJc3dpdGNoIChwdnIpIHsKIAljYXNlIDB4MjA1OgotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3NTA7Ci0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX1AyX0ZMVVNIX0JVRyB8IENQVV9IQVNfRlBVIHwKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzc1MDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX1AyX0ZMVVNIX0JVRyB8IENQVV9IQVNfRlBVIHwKIAkJCQkgICBDUFVfSEFTX1BFUkZfQ09VTlRFUjsKIAkJYnJlYWs7CiAJY2FzZSAweDIwNjoKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzUwUzsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfUDJfRkxVU0hfQlVHIHwgQ1BVX0hBU19GUFUgfAorCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzUwUzsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX1AyX0ZMVVNIX0JVRyB8IENQVV9IQVNfRlBVIHwKIAkJCQkgICBDUFVfSEFTX1BFUkZfQ09VTlRFUjsKIAkJYnJlYWs7CiAJY2FzZSAweDExMDA6Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc1MTsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfRlBVOworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzUxOworCQljdXJyZW50X2NwdV9kYXRhLmZsYWdzIHw9IENQVV9IQVNfRlBVOwogCQlicmVhazsKIAljYXNlIDB4MjAwMDoKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3MzE4MDsKLQkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gNDsKLQkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gNDsKLQkJY3B1X2RhdGEtPmZsYWdzIHw9IENQVV9IQVNfTExTQzsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzMxODA7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CiAJCWJyZWFrOwogCWNhc2UgMHgyMDAxOgogCWNhc2UgMHgyMDA0OgotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3NzA7Ci0JCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDQ7Ci0JCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDQ7CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDc3NzA7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKIAotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX0xMU0M7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX0xMU0M7CiAJCWJyZWFrOwogCWNhc2UgMHgyMDA2OgogCWNhc2UgMHgyMDBBOgogCQlpZiAocHJyID09IDB4NjEpCi0JCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3ODE7CisJCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzgxOwogCQllbHNlCi0JCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3ODA7CisJCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzgwOwogCi0JCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDQ7Ci0JCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDQ7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSA0OworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKIAotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX1BFUkZfQ09VTlRFUiB8CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19GUFUgfCBDUFVfSEFTX1BFUkZfQ09VTlRFUiB8CiAJCQkJICAgQ1BVX0hBU19MTFNDOwogCQlicmVhazsKIAljYXNlIDB4MzAwMDoKIAljYXNlIDB4MzAwMzoKIAljYXNlIDB4MzAwOToKLQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3MzQzOwotCQljcHVfZGF0YS0+aWNhY2hlLndheXMgPSA0OwotCQljcHVfZGF0YS0+ZGNhY2hlLndheXMgPSA0OwotCQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3MzQzOworCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlzID0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDQ7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOwogCQlicmVhazsKIAljYXNlIDB4MzAwODoKIAkJaWYgKHByciA9PSAweGEwKSB7Ci0JCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3MjI7Ci0JCQljcHVfZGF0YS0+aWNhY2hlLndheXMgPSA0OwotCQkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gNDsKLQkJCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0xMU0M7CisJCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzIyOworCQkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDQ7CisJCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gNDsKKwkJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19MTFNDOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMHg4MDAwOgotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TVDQwUkE7Ci0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NUNDBSQTsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKIAkJYnJlYWs7CiAJY2FzZSAweDgxMDA6Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NUNDBHWDE7Ci0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NUNDBHWDE7CisJCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19GUFU7CiAJCWJyZWFrOwogCWNhc2UgMHg3MDA6Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINF81MDE7Ci0JCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDI7Ci0JCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDI7CisJCWN1cnJlbnRfY3B1X2RhdGEudHlwZSA9IENQVV9TSDRfNTAxOworCQljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlzID0gMjsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDI7CiAJCWJyZWFrOwogCWNhc2UgMHg2MDA6Ci0JCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINF8yMDI7Ci0JCWNwdV9kYXRhLT5pY2FjaGUud2F5cyA9IDI7Ci0JCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDI7Ci0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKKwkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINF8yMDI7CisJCWN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXMgPSAyOworCQljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID0gMjsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKIAkJYnJlYWs7CiAJY2FzZSAweDUwMCAuLi4gMHg1MDE6CiAJCXN3aXRjaCAocHJyKSB7CiAJCWNhc2UgMHgxMDoKLQkJCWNwdV9kYXRhLT50eXBlID0gQ1BVX1NINzc1MFI7CisJCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0g3NzUwUjsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTE6Ci0JCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSDc3NTFSOworCQkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzc1MVI7CiAJCQlicmVhazsKIAkJY2FzZSAweDUwIC4uLiAweDVmOgotCQkJY3B1X2RhdGEtPnR5cGUgPSBDUFVfU0g3NzYwOworCQkJY3VycmVudF9jcHVfZGF0YS50eXBlID0gQ1BVX1NINzc2MDsKIAkJCWJyZWFrOwogCQl9CiAKLQkJY3B1X2RhdGEtPmljYWNoZS53YXlzID0gMjsKLQkJY3B1X2RhdGEtPmRjYWNoZS53YXlzID0gMjsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDI7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMgPSAyOwogCi0JCWNwdV9kYXRhLT5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKKwkJY3VycmVudF9jcHVfZGF0YS5mbGFncyB8PSBDUFVfSEFTX0ZQVTsKIAogCQlicmVhazsKIAlkZWZhdWx0OgotCQljcHVfZGF0YS0+dHlwZSA9IENQVV9TSF9OT05FOworCQljdXJyZW50X2NwdV9kYXRhLnR5cGUgPSBDUFVfU0hfTk9ORTsKIAkJYnJlYWs7CiAJfQogCiAjaWZkZWYgQ09ORklHX1NIX0RJUkVDVF9NQVBQRUQKLQljcHVfZGF0YS0+aWNhY2hlLndheXMgPSAxOwotCWNwdV9kYXRhLT5kY2FjaGUud2F5cyA9IDE7CisJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cyA9IDE7CisJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5cyA9IDE7CiAjZW5kaWYKIAogI2lmZGVmIENPTkZJR19DUFVfSEFTX1BURUEKLQljcHVfZGF0YS0+ZmxhZ3MgfD0gQ1BVX0hBU19QVEVBOworCWN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgfD0gQ1BVX0hBU19QVEVBOwogI2VuZGlmCiAKIAkvKgogCSAqIE9uIGFueXRoaW5nIHRoYXQncyBub3QgYSBkaXJlY3QtbWFwcGVkIGNhY2hlLCBsb29rIHRvIHRoZSBDVlIKIAkgKiBmb3IgSS9ELWNhY2hlIHNwZWNpZmljcy4KIAkgKi8KLQlpZiAoY3B1X2RhdGEtPmljYWNoZS53YXlzID4gMSkgeworCWlmIChjdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlzID4gMSkgewogCQlzaXplID0gc2l6ZXNbKGN2ciA+PiAyMCkgJiAweGZdOwotCQljcHVfZGF0YS0+aWNhY2hlLndheV9pbmNyCT0gKHNpemUgPj4gMSk7Ci0JCWNwdV9kYXRhLT5pY2FjaGUuc2V0cwkJPSAoc2l6ZSA+PiA2KTsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5X2luY3IJPSAoc2l6ZSA+PiAxKTsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUuc2V0cwkJPSAoc2l6ZSA+PiA2KTsKIAogCX0KIAogCS8qIFNldHVwIHRoZSByZXN0IG9mIHRoZSBJLWNhY2hlIGluZm8gKi8KLQljcHVfZGF0YS0+aWNhY2hlLmVudHJ5X21hc2sgPSBjcHVfZGF0YS0+aWNhY2hlLndheV9pbmNyIC0KLQkJCQkgICAgICBjcHVfZGF0YS0+aWNhY2hlLmxpbmVzejsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZS5lbnRyeV9tYXNrID0gY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5X2luY3IgLQorCQkJCSAgICAgIGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLmxpbmVzejsKIAotCWNwdV9kYXRhLT5pY2FjaGUud2F5X3NpemUgPSBjcHVfZGF0YS0+aWNhY2hlLnNldHMgKgotCQkJCSAgICBjcHVfZGF0YS0+aWNhY2hlLmxpbmVzejsKKwljdXJyZW50X2NwdV9kYXRhLmljYWNoZS53YXlfc2l6ZSA9IGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLnNldHMgKgorCQkJCSAgICBjdXJyZW50X2NwdV9kYXRhLmljYWNoZS5saW5lc3o7CiAKIAkvKiBBbmQgdGhlIHJlc3Qgb2YgdGhlIEQtY2FjaGUgKi8KLQlpZiAoY3B1X2RhdGEtPmRjYWNoZS53YXlzID4gMSkgeworCWlmIChjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzID4gMSkgewogCQlzaXplID0gc2l6ZXNbKGN2ciA+PiAxNikgJiAweGZdOwotCQljcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyCT0gKHNpemUgPj4gMSk7Ci0JCWNwdV9kYXRhLT5kY2FjaGUuc2V0cwkJPSAoc2l6ZSA+PiA2KTsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IJPSAoc2l6ZSA+PiAxKTsKKwkJY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuc2V0cwkJPSAoc2l6ZSA+PiA2KTsKIAl9CiAKLQljcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X21hc2sgPSBjcHVfZGF0YS0+ZGNhY2hlLndheV9pbmNyIC0KLQkJCQkgICAgICBjcHVfZGF0YS0+ZGNhY2hlLmxpbmVzejsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9tYXNrID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3IgLQorCQkJCSAgICAgIGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmxpbmVzejsKIAotCWNwdV9kYXRhLT5kY2FjaGUud2F5X3NpemUgPSBjcHVfZGF0YS0+ZGNhY2hlLnNldHMgKgotCQkJCSAgICBjcHVfZGF0YS0+ZGNhY2hlLmxpbmVzejsKKwljdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfc2l6ZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMgKgorCQkJCSAgICBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3o7CiAKIAkvKgogCSAqIFNldHVwIHRoZSBMMiBjYWNoZSBkZXNjCiAJICoKIAkgKiBTSC00QSdzIGhhdmUgYW4gb3B0aW9uYWwgUElQVCBMMi4KIAkgKi8KLQlpZiAoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19MMl9DQUNIRSkgeworCWlmIChjdXJyZW50X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19MMl9DQUNIRSkgewogCQkvKgogCQkgKiBTaXplIGNhbGN1bGF0aW9uIGlzIG11Y2ggbW9yZSBzZW5zaWJsZQogCQkgKiB0aGFuIGl0IGlzIGZvciB0aGUgTDEuCkBAIC0yMzIsMTYgKzIzMSwyMiBAQAogCiAJCUJVR19PTighc2l6ZSk7CiAKLQkJY3B1X2RhdGEtPnNjYWNoZS53YXlfaW5jcgk9ICgxIDw8IDE2KTsKLQkJY3B1X2RhdGEtPnNjYWNoZS5lbnRyeV9zaGlmdAk9IDU7Ci0JCWNwdV9kYXRhLT5zY2FjaGUud2F5cwkJPSA0OwotCQljcHVfZGF0YS0+c2NhY2hlLmxpbmVzegkJPSBMMV9DQUNIRV9CWVRFUzsKLQkJY3B1X2RhdGEtPnNjYWNoZS5lbnRyeV9tYXNrCT0KLQkJCShjcHVfZGF0YS0+c2NhY2hlLndheV9pbmNyIC0gY3B1X2RhdGEtPnNjYWNoZS5saW5lc3opOwotCQljcHVfZGF0YS0+c2NhY2hlLnNldHMJCT0gc2l6ZSAvCi0JCQkoY3B1X2RhdGEtPnNjYWNoZS5saW5lc3ogKiBjcHVfZGF0YS0+c2NhY2hlLndheXMpOwotCQljcHVfZGF0YS0+c2NhY2hlLndheV9zaXplCT0KLQkJCShjcHVfZGF0YS0+c2NhY2hlLnNldHMgKiBjcHVfZGF0YS0+c2NhY2hlLmxpbmVzeik7CisJCWN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheV9pbmNyCT0gKDEgPDwgMTYpOworCQljdXJyZW50X2NwdV9kYXRhLnNjYWNoZS5lbnRyeV9zaGlmdAk9IDU7CisJCWN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheXMJCT0gNDsKKwkJY3VycmVudF9jcHVfZGF0YS5zY2FjaGUubGluZXN6CQk9IEwxX0NBQ0hFX0JZVEVTOworCisJCWN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLmVudHJ5X21hc2sJPQorCQkJKGN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLndheV9pbmNyIC0KKwkJCSBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS5saW5lc3opOworCisJCWN1cnJlbnRfY3B1X2RhdGEuc2NhY2hlLnNldHMJCT0gc2l6ZSAvCisJCQkoY3VycmVudF9jcHVfZGF0YS5zY2FjaGUubGluZXN6ICoKKwkJCSBjdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXlzKTsKKworCQljdXJyZW50X2NwdV9kYXRhLnNjYWNoZS53YXlfc2l6ZQk9CisJCQkoY3VycmVudF9jcHVfZGF0YS5zY2FjaGUuc2V0cyAqCisJCQkgY3VycmVudF9jcHVfZGF0YS5zY2FjaGUubGluZXN6KTsKIAl9CiAKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc1MC5jCmluZGV4IGNiYWMyNzYuLjZmOGY0NTggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzUwLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NTAuYwpAQCAtNDYsMTEgKzQ2LDEzIEBACiAKIHN0YXRpYyBzdHJ1Y3QgcGxhdF9zY2lfcG9ydCBzY2lfcGxhdGZvcm1fZGF0YVtdID0gewogCXsKKyNpZm5kZWYgQ09ORklHX1NIX1JUUzc3NTFSMkQKIAkJLm1hcGJhc2UJPSAweGZmZTAwMDAwLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS50eXBlCQk9IFBPUlRfU0NJLAogCQkuaXJxcwkJPSB7IDIzLCAyNCwgMjUsIDAgfSwKIAl9LCB7CisjZW5kaWYKIAkJLm1hcGJhc2UJPSAweGZmZTgwMDAwLAogCQkuZmxhZ3MJCT0gVVBGX0JPT1RfQVVUT0NPTkYsCiAJCS50eXBlCQk9IFBPUlRfU0NJRiwKQEAgLTEwMSw3ICsxMDMsNyBAQAogCXsgMzUsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTEgKi8KIAl7IDM2LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEUyICovCiAJeyAzNywgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFMyAqLwotCXsgMjgsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1BRSAqLworCXsgMzgsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1BRSAqLwogfTsKIAogc3RhdGljIHN0cnVjdCBpcHJfZGF0YSBzaDc3NTFfaXByX21hcFtdID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYyBiL2FyY2gvc2gva2VybmVsL2NwdS9zaDQvc2V0dXAtc2g3NzYwLmMKaW5kZXggMDdlNTM3Ny4uYjdjNzAyOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvY3B1L3NoNC9zZXR1cC1zaDc3NjAuYworKysgYi9hcmNoL3NoL2tlcm5lbC9jcHUvc2g0L3NldHVwLXNoNzc2MC5jCkBAIC01MiwxNyArNTIsMTEgQEAKIH0KIF9faW5pdGNhbGwoc2g3NzYwX2RldmljZXNfc2V0dXApOwogCi0vKgotICogU0g3NzYwIElOVEMyLVN0eWxlIGludGVycnVwdHMsIHZlY3RvcnMgSVJRNDgtMTExIElOVEVWVCAweDgwMC0weEZFMAotICovCiBzdGF0aWMgc3RydWN0IGludGMyX2RhdGEgaW50YzJfaXJxX3RhYmxlW10gPSB7Ci0JLyogSU5UUFJJTzAgfCBJTlRNU0swICovCiAJezQ4LCAgMCwgMjgsIDAsIDMxLCAgM30sCS8qIElSUSA0ICovCiAJezQ5LCAgMCwgMjQsIDAsIDMwLCAgM30sCS8qIElSUSAzICovCiAJezUwLCAgMCwgMjAsIDAsIDI5LCAgM30sCS8qIElSUSAyICovCiAJezUxLCAgMCwgMTYsIDAsIDI4LCAgM30sCS8qIElSUSAxICovCi0JLyogNTItNTUgKElOVEVWVCAweDg4MC0weDhFMCkgdW51c2VkL3Jlc2VydmVkICovCi0JLyogSU5UUFJJTzQgfCBJTlRNU0swICovCiAJezU2LCAgNCwgMjgsIDAsIDI1LCAgM30sCS8qIEhDQU4yX0NIQU4wICovCiAJezU3LCAgNCwgMjQsIDAsIDI0LCAgM30sCS8qIEhDQU4yX0NIQU4xICovCiAJezU4LCAgNCwgMjAsIDAsIDIzLCAgM30sCS8qIEkyU19DSEFOMCAgICovCkBAIC03MSwxOCArNjUsMTUgQEAKIAl7NjEsICA0LCAgOCwgMCwgMjAsICAzfSwJLyogQUM5N19DSEFOMSAgKi8KIAl7NjIsICA0LCAgNCwgMCwgMTksICAzfSwJLyogSTJDX0NIQU4wICAgKi8KIAl7NjMsICA0LCAgMCwgMCwgMTgsICAzfSwJLyogSTJDX0NIQU4xICAgKi8KLQkvKiBJTlRQUklPOCB8IElOVE1TSzAgKi8KIAl7NTIsICA4LCAxNiwgMCwgMTEsICAzfSwJLyogU0NJRjBfRVJJX0lSUSAqLwogCXs1MywgIDgsIDE2LCAwLCAxMCwgIDN9LAkvKiBTQ0lGMF9SWElfSVJRICovCiAJezU0LCAgOCwgMTYsIDAsICA5LCAgM30sCS8qIFNDSUYwX0JSSV9JUlEgKi8KIAl7NTUsICA4LCAxNiwgMCwgIDgsICAzfSwJLyogU0NJRjBfVFhJX0lSUSAqLwogCXs2NCwgIDgsIDI4LCAwLCAxNywgIDN9LAkvKiBVU0JISV9JUlEgKi8KIAl7NjUsICA4LCAyNCwgMCwgMTYsICAzfSwJLyogTENEQyAgICAgICovCi0JLyogNjYsIDY3IHVudXNlZCAqLwogCXs2OCwgIDgsIDIwLCAwLCAxNCwgMTN9LAkvKiBETUFCUkdJMF9JUlEgKi8KIAl7NjksICA4LCAyMCwgMCwgMTMsIDEzfSwJLyogRE1BQlJHSTFfSVJRICovCiAJezcwLCAgOCwgMjAsIDAsIDEyLCAxM30sCS8qIERNQUJSR0kyX0lSUSAqLwotCS8qIDcxIHVudXNlZCAqLwogCXs3MiwgIDgsIDEyLCAwLCAgNywgIDN9LAkvKiBTQ0lGMV9FUklfSVJRICovCiAJezczLCAgOCwgMTIsIDAsICA2LCAgM30sCS8qIFNDSUYxX1JYSV9JUlEgKi8KIAl7NzQsICA4LCAxMiwgMCwgIDUsICAzfSwJLyogU0NJRjFfQlJJX0lSUSAqLwpAQCAtOTEsMjYgKzgyLDcxIEBACiAJezc3LCAgOCwgIDgsIDAsICAyLCAgM30sCS8qIFNDSUYyX1JYSV9JUlEgKi8KIAl7NzgsICA4LCAgOCwgMCwgIDEsICAzfSwJLyogU0NJRjJfQlJJX0lSUSAqLwogCXs3OSwgIDgsICA4LCAwLCAgMCwgIDN9LAkvKiBTQ0lGMl9UWElfSVJRICovCi0JLyogICAgICAgICAgfCBJTlRNU0s0ICovCiAJezgwLCAgOCwgIDQsIDQsIDIzLCAgM30sCS8qIFNJTV9FUkkgKi8KIAl7ODEsICA4LCAgNCwgNCwgMjIsICAzfSwJLyogU0lNX1JYSSAqLwogCXs4MiwgIDgsICA0LCA0LCAyMSwgIDN9LAkvKiBTSU1fVFhJICovCiAJezgzLCAgOCwgIDQsIDQsIDIwLCAgM30sCS8qIFNJTV9URUkgKi8KIAl7ODQsICA4LCAgMCwgNCwgMTksICAzfSwJLyogSFNQSUkgKi8KLQkvKiBJTlRQUklPQyB8IElOVE1TSzQgKi8KLQkvKiA4NS04NyB1bnVzZWQvcmVzZXJ2ZWQgKi8KIAl7ODgsIDEyLCAyMCwgNCwgMTgsICAzfSwJLyogTU1DSTAgKi8KIAl7ODksIDEyLCAyMCwgNCwgMTcsICAzfSwJLyogTU1DSTEgKi8KIAl7OTAsIDEyLCAyMCwgNCwgMTYsICAzfSwJLyogTU1DSTIgKi8KIAl7OTEsIDEyLCAyMCwgNCwgMTUsICAzfSwJLyogTU1DSTMgKi8KLQl7OTIsIDEyLCAxMiwgNCwgIDYsICAzfSwJLyogTUZJICh1bnN1cmUsIGJ1Zz8gaW4gbXkgNzc2MCBtYW51YWwqLwotCS8qIDkzLTEwNyByZXNlcnZlZC91bmRvY3VtZW50ZWQgKi8KKwl7OTIsIDEyLCAxMiwgNCwgIDYsICAzfSwJLyogTUZJICovCiAJezEwOCwxMiwgIDQsIDQsICAxLCAgM30sCS8qIEFEQyAgKi8KIAl7MTA5LDEyLCAgMCwgNCwgIDAsICAzfSwJLyogQ01USSAqLwotCS8qIDExMC0xMTEgcmVzZXJ2ZWQvdW51c2VkICovCiB9OwogCitzdGF0aWMgc3RydWN0IGlwcl9kYXRhIHNoNzc2MF9pcHJfbWFwW10gPSB7CisJLyogSVJRLCBJUFItaWR4LCBzaGlmdCwgcHJpb3JpdHkgKi8KKwl7IDE2LCAwLCAxMiwgMiB9LCAvKiBUTVUwIFRVTkkqLworCXsgMTcsIDAsICA4LCAyIH0sIC8qIFRNVTEgVFVOSSAqLworCXsgMTgsIDAsICA0LCAyIH0sIC8qIFRNVTIgVFVOSSAqLworCXsgMTksIDAsICA0LCAyIH0sIC8qIFRNVTIgVElQQ0kgKi8KKwl7IDI3LCAxLCAxMiwgMiB9LCAvKiBXRFQgSVRJICovCisJeyAyOCwgMSwgIDgsIDIgfSwgLyogUkVGIFJDTUkgKi8KKwl7IDI5LCAxLCAgOCwgMiB9LCAvKiBSRUYgUk9WSSAqLworCXsgMzIsIDIsICAwLCA3IH0sIC8qIEhVREkgKi8KKwl7IDMzLCAyLCAxMiwgNyB9LCAvKiBHUElPSSAqLworCXsgMzQsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTAgKi8KKwl7IDM1LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEUxICovCisJeyAzNiwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFMiAqLworCXsgMzcsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTMgKi8KKwl7IDM4LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNQUUgKi8KKwl7IDQ0LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU0ICovCisJeyA0NSwgMiwgIDgsIDcgfSwgLyogRE1BQyBETVRFNSAqLworCXsgNDYsIDIsICA4LCA3IH0sIC8qIERNQUMgRE1URTYgKi8KKwl7IDQ3LCAyLCAgOCwgNyB9LCAvKiBETUFDIERNVEU3ICovCisvKiB0aGVzZSBoZXJlIGFyZSBvbmx5IHZhbGlkIGlmIElOVENfSUNSIGJpdCA3IGlzIHNldCB0byAxIQorICogWFhYOiBtYXliZSBDT05GSUdfU0hfSVJMTU9ERSBzeW1ib2w/IFNINzc1MSBjb3VsZCB1c2UgaXQgdG9vICovCisjaWYgMAorCXsgIDIsIDMsIDEyLCAzIH0sIC8qIElSTDAgKi8KKwl7ICA1LCAzLCAgOCwgMyB9LCAvKiBJUkwxICovCisJeyAgOCwgMywgIDQsIDMgfSwgLyogSVJMMiAqLworCXsgMTEsIDMsICAwLCAzIH0sIC8qIElSTDMgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaXByX29mZnNldHNbXSA9IHsKKwkweGZmZDAwMDA0VUwsCS8qIDA6IElQUkEgKi8KKwkweGZmZDAwMDA4VUwsCS8qIDE6IElQUkIgKi8KKwkweGZmZDAwMDBjVUwsCS8qIDI6IElQUkMgKi8KKwkweGZmZDAwMDEwVUwsCS8qIDM6IElQUkQgKi8KK307CisKKy8qIGdpdmVuIHRoZSBJUFIgaW5kZXggcmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBJUFIgcmVnaXN0ZXIgKi8KK3Vuc2lnbmVkIGludCBtYXBfaXByaWR4X3RvX2FkZHIoaW50IGlkeCkKK3sKKwlpZiAoaWR4ID49IEFSUkFZX1NJWkUoaXByX29mZnNldHMpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gaXByX29mZnNldHNbaWR4XTsKK30KKwogdm9pZCBfX2luaXQgaW5pdF9JUlFfaW50YzIodm9pZCkKIHsKIAltYWtlX2ludGMyX2lycShpbnRjMl9pcnFfdGFibGUsIEFSUkFZX1NJWkUoaW50YzJfaXJxX3RhYmxlKSk7CiB9CisKK3ZvaWQgX19pbml0ICBpbml0X0lSUV9pcHIodm9pZCkKK3sKKwltYWtlX2lwcl9pcnEoc2g3NzYwX2lwcl9tYXAsIEFSUkFZX1NJWkUoc2g3NzYwX2lwcl9tYXApKTsKK30KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2RlYnVndHJhcHMuUyBiL2FyY2gvc2gva2VybmVsL2RlYnVndHJhcHMuUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2I2Njc0Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9zaC9rZXJuZWwvZGVidWd0cmFwcy5TCkBAIC0wLDAgKzEsNDEgQEAKKy8qCisgKiBhcmNoL3NoL2tlcm5lbC9kZWJ1Z3RyYXBzLlMKKyAqCisgKiBEZWJ1ZyB0cmFwIGp1bXAgdGFibGVzIGZvciBTdXBlckgKKyAqCisgKiAgQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CisgKgorICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKKyAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKKyAqIGZvciBtb3JlIGRldGFpbHMuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zeXMuaD4KKyNpbmNsdWRlIDxsaW51eC9saW5rYWdlLmg+CisKKyNpZiAhZGVmaW5lZChDT05GSUdfU0hfS0dEQikKKyNkZWZpbmUga2dkYl9oYW5kbGVfZXhjZXB0aW9uCWRlYnVnX3RyYXBfaGFuZGxlcgorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKKyNkZWZpbmUgc2hfYmlvc19oYW5kbGVyCQlkZWJ1Z190cmFwX2hhbmRsZXIKKyNlbmRpZgorCisJLmRhdGEKKworRU5UUlkoZGVidWdfdHJhcF90YWJsZSkKKwkubG9uZyBkZWJ1Z190cmFwX2hhbmRsZXIJLyogMHgzMCAqLworCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDMxICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4MzIgKi8KKwkubG9uZyBkZWJ1Z190cmFwX2hhbmRsZXIJLyogMHgzMyAqLworCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDM0ICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4MzUgKi8KKwkubG9uZyBkZWJ1Z190cmFwX2hhbmRsZXIJLyogMHgzNiAqLworCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDM3ICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4MzggKi8KKwkubG9uZyBkZWJ1Z190cmFwX2hhbmRsZXIJLyogMHgzOSAqLworCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDNhICovCisJLmxvbmcgZGVidWdfdHJhcF9oYW5kbGVyCS8qIDB4M2IgKi8KKwkubG9uZyBrZ2RiX2hhbmRsZV9leGNlcHRpb24JLyogMHgzYyAqLworCS5sb25nIGRlYnVnX3RyYXBfaGFuZGxlcgkvKiAweDNkICovCisJLmxvbmcgYnVnX3RyYXBfaGFuZGxlcgkJLyogMHgzZSAqLworCS5sb25nIHNoX2Jpb3NfaGFuZGxlcgkJLyogMHgzZiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvZWFybHlfcHJpbnRrLmMgYi9hcmNoL3NoL2tlcm5lbC9lYXJseV9wcmludGsuYwppbmRleCA1NjBiOTFjLi45MDQ4YzAzIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9lYXJseV9wcmludGsuYworKysgYi9hcmNoL3NoL2tlcm5lbC9lYXJseV9wcmludGsuYwpAQCAtMTA2LDEyICsxMDYsMzIgQEAKIH07CiAKICNpZiBkZWZpbmVkKENPTkZJR19DUFVfU0g0KSAmJiAhZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykKKyNkZWZpbmUgREVGQVVMVF9CQVVEIDExNTIwMAogLyoKICAqIFNpbXBsZSBTQ0lGIGluaXQsIHByaW1hcmlseSBhaW1lZCBhdCBTSDc3NTAgYW5kIG90aGVyIHNpbWlsYXIgU0gtNAogICogZGV2aWNlcyB0aGF0IGFyZW4ndCB1c2luZyBzaC1pcGwrZy4KICAqLwotc3RhdGljIHZvaWQgc2NpZl9zZXJjb25faW5pdChpbnQgYmF1ZCkKK3N0YXRpYyB2b2lkIHNjaWZfc2VyY29uX2luaXQoY2hhciAqcykKIHsKKwl1bnNpZ25lZCBiYXVkID0gREVGQVVMVF9CQVVEOworCWNoYXIgKmU7CisKKwlpZiAoKnMgPT0gJywnKQorCQkrK3M7CisKKwlpZiAoKnMpIHsKKwkJLyogaWdub3JlIGlvcG9ydC9kZXZpY2UgbmFtZSAqLworCQlzICs9IHN0cmNzcG4ocywgIiwiKTsKKwkJaWYgKCpzID09ICcsJykKKwkJCXMrKzsKKwl9CisKKwlpZiAoKnMpIHsKKwkJYmF1ZCA9IHNpbXBsZV9zdHJ0b3VsKHMsICZlLCAwKTsKKwkJaWYgKGJhdWQgPT0gMCB8fCBzID09IGUpCisJCQliYXVkID0gREVGQVVMVF9CQVVEOworCX0KKwogCWN0cmxfb3V0dygwLCBzY2lmX3BvcnQubWFwYmFzZSArIDgpOwogCWN0cmxfb3V0dygwLCBzY2lmX3BvcnQubWFwYmFzZSk7CiAKQEAgLTE2Nyw3ICsxODcsNyBAQAogCQllYXJseV9jb25zb2xlID0gJnNjaWZfY29uc29sZTsKIAogI2lmIGRlZmluZWQoQ09ORklHX0NQVV9TSDQpICYmICFkZWZpbmVkKENPTkZJR19TSF9TVEFOREFSRF9CSU9TKQotCQlzY2lmX3NlcmNvbl9pbml0KDExNTIwMCk7CisJCXNjaWZfc2VyY29uX2luaXQoYnVmICsgNik7CiAjZW5kaWYKIAl9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL2VudHJ5LWNvbW1vbi5TIGIvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMKaW5kZXggZmMyNzlhZS4uYWI0ZWJiOCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMKKysrIGIvYXJjaC9zaC9rZXJuZWwvZW50cnktY29tbW9uLlMKQEAgLTU0LDc5ICs1NCwyNCBAQAogIyAgZGVmaW5lIHJlc3VtZV9rZXJuZWwJCV9fcmVzdG9yZV9hbGwKICNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykgfHwgZGVmaW5lZChDT05GSUdfU0hfS0dEQikKLSEgSGFuZGxlIGtlcm5lbCBkZWJ1ZyBpZiBlaXRoZXIga2dkYiAoU1cpIG9yIGdkYi1zdHViIChGVykgaXMgcHJlc2VudC4KLSEgSWYgYm90aCBhcmUgY29uZmlndXJlZCwgaGFuZGxlIHRoZSBkZWJ1ZyB0cmFwcyAoYnJlYWtwb2ludHMpIGluIFNXLAotISBidXQgc3RpbGwgYWxsb3cgQklPUyB0cmFwcyB0byBGVy4KLQotCS5hbGlnbgkyCi1kZWJ1Z19rZXJuZWw6Ci0jaWYgZGVmaW5lZChDT05GSUdfU0hfU1RBTkRBUkRfQklPUykgJiYgZGVmaW5lZChDT05GSUdfU0hfS0dEQikKLQkvKiBGb3JjZSBCSU9TIGNhbGwgdG8gRlcgKGRlYnVnX3RyYXAgcHV0IFRSQSBpbiByOCkgKi8KLQltb3YJcjgscjAKLQlzaGxyMglyMAotCWNtcC9lcQkjMHgzZixyMAotCWJ0CWRlYnVnX2tlcm5lbF9mdwotI2VuZGlmIC8qIENPTkZJR19TSF9TVEFOREFSRF9CSU9TICYmIENPTkZJR19TSF9LR0RCICovCi0KLWRlYnVnX2VudGVyOgkJCi0jaWYgZGVmaW5lZChDT05GSUdfU0hfS0dEQikKLQkvKiBKdW1wIHRvIGtnZGIsIHBhc3Mgc3RhY2tlZCByZWdzIGFzIGFyZyAqLwotZGVidWdfa2VybmVsX3N3OgotCW1vdi5sCTNmLCByMAotCWptcAlAcjAKLQkgbW92CXIxNSwgcjQKLQkuYWxpZ24JMgotMzoJLmxvbmcJa2dkYl9oYW5kbGVfZXhjZXB0aW9uCi0jZW5kaWYgLyogQ09ORklHX1NIX0tHREIgKi8KLSNpZmRlZiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUwotCWJyYQlkZWJ1Z19rZXJuZWxfZncKLQkgbm9wCi0jZW5kaWYKLSNlbmRpZiAvKiBDT05GSUdfU0hfU1RBTkRBUkRfQklPUyB8fCBDT05GSUdfU0hfS0dEQiAqLwotCi0JLmFsaWduCTIKLWRlYnVnX3RyYXA6CQotI2lmIGRlZmluZWQoQ09ORklHX1NIX1NUQU5EQVJEX0JJT1MpIHx8IGRlZmluZWQoQ09ORklHX1NIX0tHREIpCi0JbW92CXI4LCByMAotCXNobHIyCXIwCi0JY21wL2VxCSMweDNmLCByMAkJISBzaF9iaW9zKCkgdHJhcAotCWJmCTFmCi0jaWZkZWYgQ09ORklHX1NIX0tHREIKLQljbXAvZXEJIzB4ZmYsIHIwCQkhIFhYWDogS0dEQiB0cmFwLCBmaXggZm9yIFNILTIuCi0JYmYJMWYKLSNlbmRpZgotCW1vdgkjT0ZGX1NSLCByMAotCW1vdi5sCUAocjAscjE1KSwgcjAJCSEgZ2V0IHN0YXR1cyByZWdpc3RlcgotCXNobGwJcjAKLQlzaGxsCXIwCQkJISBrZXJuZWwgc3BhY2U/Ci0JYnQvcwlkZWJ1Z19rZXJuZWwKLTE6Ci0jZW5kaWYKLQkgbW92LmwJQHIxNSwgcjAJCSEgUmVzdG9yZSBSMCB2YWx1ZQotCW1vdi5sCTFmLCByOAotCWptcAlAcjgKLQkgbm9wCiAKIAkuYWxpZ24JMgogRU5UUlkoZXhjZXB0aW9uX2Vycm9yKQogCSEKICNpZmRlZiBDT05GSUdfVFJBQ0VfSVJRRkxBR1MKLQltb3YubAkzZiwgcjAKKwltb3YubAkyZiwgcjAKIAlqc3IJQHIwCiAJIG5vcAogI2VuZGlmCiAJc3RpCi0JbW92LmwJMmYsIHIwCisJbW92LmwJMWYsIHIwCiAJam1wCUByMAogCSBub3AKIAotIQogCS5hbGlnbgkyCi0xOgkubG9uZwlicmVha19wb2ludF90cmFwX3NvZnR3YXJlCi0yOgkubG9uZwlkb19leGNlcHRpb25fZXJyb3IKKzE6CS5sb25nCWRvX2V4Y2VwdGlvbl9lcnJvcgogI2lmZGVmIENPTkZJR19UUkFDRV9JUlFGTEFHUwotMzoJLmxvbmcJdHJhY2VfaGFyZGlycXNfb24KKzI6CS5sb25nCXRyYWNlX2hhcmRpcnFzX29uCiAjZW5kaWYKIAogCS5hbGlnbgkyCkBAIC0zMzEsMTYgKzI3NiwzMSBAQAogMToJLmxvbmcJcmVzdG9yZV9hbGwKIAogCS5hbGlnbgkyCi1ub3Rfc3lzY2FsbF90cmE6CQotCWJyYQlkZWJ1Z190cmFwCi0JIG5vcAotCi0JLmFsaWduCTIKIHN5c2NhbGxfYmFkc3lzOgkJCSEgQmFkIHN5c2NhbGwgbnVtYmVyCiAJbW92CSMtRU5PU1lTLCByMAogCWJyYQlyZXN1bWVfdXNlcnNwYWNlCiAJIG1vdi5sCXIwLCBAKE9GRl9SMCxyMTUpCSEgUmV0dXJuIHZhbHVlCi0JCisKKy8qCisgKiBUaGUgbWFpbiBkZWJ1ZyB0cmFwIGhhbmRsZXIuCisgKgorICogcjg9VFJBIChub3QgdGhlIHRyYXAgbnVtYmVyISkKKyAqCisgKiBOb3RlOiBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgdHJhcGEgdmFsdWUgaXMgbGVmdCBpbiBpdHMgb3JpZ2luYWwKKyAqIGZvcm0gKHdpdGhvdXQgdGhlIHNobHIyIHNoaWZ0KSBzbyB0aGUgY2FsY3VsYXRpb24gZm9yIHRoZSBqdW1wCisgKiBjYWxsIHRhYmxlIG9mZnNldCByZW1haW5zIGEgc2ltcGxlIGluIHBsYWNlIG1hc2suCisgKi8KK2RlYnVnX3RyYXA6CisJbW92CXI4LCByMAorCWFuZAkjKDB4ZiA8PCAyKSwgcjAKKwltb3YubAkxZiwgcjgKKwlhZGQJcjAsIHI4CisJbW92LmwJQHI4LCByOAorCWptcAlAcjgKKwkgbm9wCisKKwkuYWxpZ24JMgorMToJLmxvbmcJZGVidWdfdHJhcF90YWJsZQogCiAvKgogICogU3lzY2FsbCBpbnRlcmZhY2U6CkBAIC0zNDgsMTcgKzMwOCwxOSBAQAogICoJU3lzY2FsbCAjOiBSMwogICoJQXJndW1lbnRzICMwIHRvICMzOiBSNC0tUjcKICAqCUFyZ3VtZW50cyAjNCB0byAjNjogUjAsIFIxLCBSMgotICoJVFJBOiAobnVtYmVyIG9mIGFyZ3VtZW50cyArIDB4MTApIHggNAorICoJVFJBOiAobnVtYmVyIG9mIGFyZ3VtZW50cyArIEFCSSByZXZpc2lvbikgeCA0CiAgKgogICogVGhpcyBjb2RlIGFsc28gaGFuZGxlcyBkZWxlZ2F0aW5nIG90aGVyIHRyYXBzIHRvIHRoZSBCSU9TL2dkYiBzdHViCiAgKiBhY2NvcmRpbmcgdG86CiAgKgogICogVHJhcCBudW1iZXIKLSAqIChUUkE+PjIpIAkgICAgUHVycG9zZQotICogLS0tLS0tLS0gCSAgICAtLS0tLS0tCi0gKiAweDAtMHhmICAJICAgIG9sZCBzeXNjYWxsIEFCSQotICogMHgxMC0weDFmICAJICAgIG5ldyBzeXNjYWxsIEFCSQotICogMHgyMC0weGZmICAJICAgIGRlbGVnYXRlZCB0aHJvdWdoIGRlYnVnX3RyYXAgdG8gQklPUy9nZGIgc3R1Yi4KKyAqIChUUkE+PjIpCVB1cnBvc2UKKyAqIC0tLS0tLS0tCS0tLS0tLS0KKyAqIDB4MDAtMHgwZglvcmlnaW5hbCBTSC0zLzQgc3lzY2FsbCBBQkkgKG5vdCBpbiBnZW5lcmFsIHVzZSkuCisgKiAweDEwLTB4MWYJZ2VuZXJhbCBTSC0zLzQgc3lzY2FsbCBBQkkuCisgKiAweDIwLTB4MmYJc3lzY2FsbCBBQkkgZm9yIFNILTIgcGFydHMuCisgKiAweDMwLTB4M2YJZGVidWcgdHJhcHMgdXNlZCBieSB0aGUga2VybmVsLgorICogMHg0MC0weGZmCU5vdCBzdXBwb3J0ZWQgYnkgYWxsIHBhcnRzLCBzbyBsZWZ0IHVuaGFuZGxlZC4KICAqCiAgKiBOb3RlOiBXaGVuIHdlJ3JlIGZpcnN0IGNhbGxlZCwgdGhlIFRSQSB2YWx1ZSBtdXN0IGJlIHNoaWZ0ZWQKICAqIHJpZ2h0IDIgYml0cyBpbiBvcmRlciB0byBnZXQgdGhlIHZhbHVlIHRoYXQgd2FzIHVzZWQgYXMgdGhlICJ0cmFwYSIKQEAgLTM3NSwxNyArMzM3LDIyIEBACiAJIG5vcAogCS5hbGlnbgkyCiAxOgkubG9uZwlzY2hlZHVsZV90YWlsCi0JIQorCisvKgorICogVGhlIHBvb3JseSBuYW1lZCBtYWluIHRyYXBhIGRlY29kZSBhbmQgZGlzcGF0Y2ggcm91dGluZSwgZm9yCisgKiBzeXN0ZW0gY2FsbHMgYW5kIGRlYnVnIHRyYXBzIHRocm91Z2ggdGhlaXIgcmVzcGVjdGl2ZSBqdW1wIHRhYmxlcy4KKyAqLwogRU5UUlkoc3lzdGVtX2NhbGwpCiAjaWYgIWRlZmluZWQoQ09ORklHX0NQVV9TSDIpCiAJbW92LmwJMWYsIHI5CiAJbW92LmwJQHI5LCByOAkJISBSZWFkIGZyb20gVFJBIChUcmFwIEFkZHJlc3MpIFJlZ2lzdGVyCiAjZW5kaWYKLQkhCi0JISBJcyB0aGUgdHJhcCBhcmd1bWVudCA+PSAweDIwPyAoVFJBIHdpbGwgYmUgPj0gMHg4MCkKLQltb3YJIzB4N2YsIHI5CisJLyoKKwkgKiBDaGVjayB0aGUgdHJhcCB0eXBlCisJICovCisJbW92CSMoKDB4MjAgPDwgMikgLSAxKSwgcjkKIAljbXAvaGkJcjksIHI4Ci0JYnQvcwlub3Rfc3lzY2FsbF90cmEKKwlidC9zCWRlYnVnX3RyYXAJCSEgaXQncyBhIGRlYnVnIHRyYXAuLgogCSBtb3YJI09GRl9UUkEsIHI5CiAJYWRkCXIxNSwgcjkKIAltb3YubAlyOCwgQHI5CQkJISBzZXQgVFJBIHZhbHVlIHRvIHRyYQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jIGIvYXJjaC9zaC9rZXJuZWwvaW9fZ2VuZXJpYy5jCmluZGV4IDI4ZWM3NDguLjY2NjI2YzAgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL2lvX2dlbmVyaWMuYworKysgYi9hcmNoL3NoL2tlcm5lbC9pb19nZW5lcmljLmMKQEAgLTEsOSArMSw4IEBACi0vKiAkSWQ6IGlvX2dlbmVyaWMuYyx2IDEuMiAyMDAzLzA1LzA0IDE5OjI5OjUzIGxldGhhbCBFeHAgJAotICoKLSAqIGxpbnV4L2FyY2gvc2gva2VybmVsL2lvX2dlbmVyaWMuYworLyoKKyAqIGFyY2gvc2gva2VybmVsL2lvX2dlbmVyaWMuYwogICoKICAqIENvcHlyaWdodCAoQykgMjAwMCAgTmlpYmUgWXV0YWthCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDUgIFBhdWwgTXVuZHQKKyAqIENvcHlyaWdodCAoQykgMjAwNSAtIDIwMDcgUGF1bCBNdW5kdAogICoKICAqIEdlbmVyaWMgSS9PIHJvdXRpbmUuIFRoZXNlIGNhbiBiZSB1c2VkIHdoZXJlIGEgbWFjaGluZSBzcGVjaWZpYyB2ZXJzaW9uCiAgKiBpcyBub3QgcmVxdWlyZWQuCkBAIC0xMyw4ICsxMiw5IEBACiAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+CisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vbWFjaHZlYy5oPgorI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKICNpZmRlZiBDT05GSUdfQ1BVX1NIMwogLyogU0gzIGhhcyBhIFBDTUNJQSBidWcgdGhhdCBuZWVkcyBhIGR1bW15IHJlYWQgZnJvbSBhcmVhIDYgZm9yIGEKQEAgLTk2LDYgKzk2LDcgQEAKIAl3aGlsZSAoY291bnQtLSkKIAkJKmJ1ZisrID0gKnBvcnRfYWRkcjsKIAorCWZsdXNoX2RjYWNoZV9hbGwoKTsKIAlkdW1teV9yZWFkKCk7CiB9CiAKQEAgLTE3MCw2ICsxNzEsNyBAQAogCXdoaWxlIChjb3VudC0tKQogCQkqcG9ydF9hZGRyID0gKmJ1ZisrOwogCisJZmx1c2hfZGNhY2hlX2FsbCgpOwogCWR1bW15X3JlYWQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwva2dkYl9zdHViLmMgYi9hcmNoL3NoL2tlcm5lbC9rZ2RiX3N0dWIuYwppbmRleCA5YzYzMTVmLi5kODkyN2Q4IDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9rZ2RiX3N0dWIuYworKysgYi9hcmNoL3NoL2tlcm5lbC9rZ2RiX3N0dWIuYwpAQCAtMTMyMyw4ICsxMzIzLDExIEBACiB9CiAKIC8qIFRoZXJlIGhhcyBiZWVuIGFuIGV4Y2VwdGlvbiwgbW9zdCBsaWtlbHkgYSBicmVha3BvaW50LiAqLwotdm9pZCBrZ2RiX2hhbmRsZV9leGNlcHRpb24oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCithc21saW5rYWdlIHZvaWQga2dkYl9oYW5kbGVfZXhjZXB0aW9uKHVuc2lnbmVkIGxvbmcgcjQsIHVuc2lnbmVkIGxvbmcgcjUsCisJCQkJICAgICAgdW5zaWduZWQgbG9uZyByNiwgdW5zaWduZWQgbG9uZyByNywKKwkJCQkgICAgICBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCWludCBleGNlcF9jb2RlLCB2YnJfdmFsOwogCWludCBjb3VudDsKIAlpbnQgdHJhcGFfdmFsdWUgPSBjdHJsX2lubChUUkEpOwpAQCAtMTM2OCw4ICsxMzcxLDYgQEAKIAogCXZicl92YWwgPSB0cmFwX3JlZ2lzdGVycy52YnI7CiAJYXNtKCJsZGMgJTAsIHZiciI6IDoiciIodmJyX3ZhbCkpOwotCi0JcmV0dXJuOwogfQogCiAvKiBUcmlnZ2VyIGEgYnJlYWtwb2ludCBieSBmdW5jdGlvbiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jIGIvYXJjaC9zaC9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IDQ4NmMwNmUuLjlkNmE0MzggMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3Byb2Nlc3MuYworKysgYi9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKQEAgLTEsNDIgKzEsMzAgQEAKLS8qICRJZDogcHJvY2Vzcy5jLHYgMS4yOCAyMDA0LzA1LzA1IDE2OjU0OjIzIGxldGhhbCBFeHAgJAorLyoKKyAqIGFyY2gvc2gva2VybmVsL3Byb2Nlc3MuYwogICoKLSAqICBsaW51eC9hcmNoL3NoL2tlcm5lbC9wcm9jZXNzLmMKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIHByb2Nlc3MgaGFuZGxpbmcuLgogICoKICAqICBDb3B5cmlnaHQgKEMpIDE5OTUgIExpbnVzIFRvcnZhbGRzCiAgKgogICogIFN1cGVySCB2ZXJzaW9uOiAgQ29weXJpZ2h0IChDKSAxOTk5LCAyMDAwICBOaWliZSBZdXRha2EgJiBLYXogS29qaW1hCiAgKgkJICAgICBDb3B5cmlnaHQgKEMpIDIwMDYgTGluZW8gU29sdXRpb25zIEluYy4gc3VwcG9ydCBTSDRBIFVCQworICoJCSAgICAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNiAgUGF1bCBNdW5kdAogICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgaGFuZGxlcyB0aGUgYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBwYXJ0cyBvZiBwcm9jZXNzIGhhbmRsaW5nLi4KLSAqLwotCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KICNpbmNsdWRlIDxsaW51eC9lbGZjb3JlLmg+Ci0jaW5jbHVkZSA8bGludXgvYS5vdXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcG0uaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tleGVjLmg+Ci0KLSNpbmNsdWRlIDxhc20vaW8uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9lbGYuaD4KICNpbmNsdWRlIDxhc20vdWJjLmg+CiAKLXN0YXRpYyBpbnQgaGx0X2NvdW50ZXI9MDsKLQorc3RhdGljIGludCBobHRfY291bnRlcjsKIGludCB1YmNfdXNlcmNudCA9IDA7CiAKICNkZWZpbmUgSEFSRF9JRExFX1RJTUVPVVQgKEhaIC8gMykKIAogdm9pZCAoKnBtX2lkbGUpKHZvaWQpOwotCiB2b2lkICgqcG1fcG93ZXJfb2ZmKSh2b2lkKTsKIEVYUE9SVF9TWU1CT0wocG1fcG93ZXJfb2ZmKTsKIApAQCAtNDQsMTQgKzMyLDEyIEBACiB7CiAJaGx0X2NvdW50ZXIrKzsKIH0KLQogRVhQT1JUX1NZTUJPTChkaXNhYmxlX2hsdCk7CiAKIHZvaWQgZW5hYmxlX2hsdCh2b2lkKQogewogCWhsdF9jb3VudGVyLS07CiB9Ci0KIEVYUE9SVF9TWU1CT0woZW5hYmxlX2hsdCk7CiAKIHZvaWQgZGVmYXVsdF9pZGxlKHZvaWQpCkBAIC0xNTIsMTkgKzEzOCwyMSBAQAogCSIuYWxpZ24gMlxuXHQiCiAJIjE6LmxvbmcgZG9fZXhpdCIpOwogCisvKiBEb24ndCB1c2UgdGhpcyBpbiBCTD0xKGNsaSkuICBPciBlbHNlLCBDUFUgcmVzZXRzISAqLwogaW50IGtlcm5lbF90aHJlYWQoaW50ICgqZm4pKHZvaWQgKiksIHZvaWQgKiBhcmcsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCi17CS8qIERvbid0IHVzZSB0aGlzIGluIEJMPTEoY2xpKS4gIE9yIGVsc2UsIENQVSByZXNldHMhICovCit7CiAJc3RydWN0IHB0X3JlZ3MgcmVnczsKIAogCW1lbXNldCgmcmVncywgMCwgc2l6ZW9mKHJlZ3MpKTsKLQlyZWdzLnJlZ3NbNF0gPSAodW5zaWduZWQgbG9uZykgYXJnOwotCXJlZ3MucmVnc1s1XSA9ICh1bnNpZ25lZCBsb25nKSBmbjsKKwlyZWdzLnJlZ3NbNF0gPSAodW5zaWduZWQgbG9uZylhcmc7CisJcmVncy5yZWdzWzVdID0gKHVuc2lnbmVkIGxvbmcpZm47CiAKLQlyZWdzLnBjID0gKHVuc2lnbmVkIGxvbmcpIGtlcm5lbF90aHJlYWRfaGVscGVyOworCXJlZ3MucGMgPSAodW5zaWduZWQgbG9uZylrZXJuZWxfdGhyZWFkX2hlbHBlcjsKIAlyZWdzLnNyID0gKDEgPDwgMzApOwogCiAJLyogT2ssIGNyZWF0ZSB0aGUgbmV3IHByb2Nlc3MuLiAqLwotCXJldHVybiBkb19mb3JrKGZsYWdzIHwgQ0xPTkVfVk0gfCBDTE9ORV9VTlRSQUNFRCwgMCwgJnJlZ3MsIDAsIE5VTEwsIE5VTEwpOworCXJldHVybiBkb19mb3JrKGZsYWdzIHwgQ0xPTkVfVk0gfCBDTE9ORV9VTlRSQUNFRCwgMCwKKwkJICAgICAgICZyZWdzLCAwLCBOVUxMLCBOVUxMKTsKIH0KIAogLyoKQEAgLTIxMSwyMSArMTk5LDIwIEBACiAJcmV0dXJuIGZwdmFsaWQ7CiB9CiAKLS8qIAorLyoKICAqIENhcHR1cmUgdGhlIHVzZXIgc3BhY2UgcmVnaXN0ZXJzIGlmIHRoZSB0YXNrIGlzIG5vdCBydW5uaW5nIChpbiB1c2VyIHNwYWNlKQogICovCiBpbnQgZHVtcF90YXNrX3JlZ3Moc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGVsZl9ncmVnc2V0X3QgKnJlZ3MpCiB7CiAJc3RydWN0IHB0X3JlZ3MgcHRyZWdzOwotCQorCiAJcHRyZWdzID0gKnRhc2tfcHRfcmVncyh0c2spOwogCWVsZl9jb3JlX2NvcHlfcmVncyhyZWdzLCAmcHRyZWdzKTsKIAogCXJldHVybiAxOwogfQogCi1pbnQKLWR1bXBfdGFza19mcHUgKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBlbGZfZnByZWdzZXRfdCAqZnB1KQoraW50IGR1bXBfdGFza19mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIGVsZl9mcHJlZ3NldF90ICpmcHUpCiB7CiAJaW50IGZwdmFsaWQgPSAwOwogCkBAIC0yNjMsMTIgKzI1MCwxNCBAQAogCQljaGlsZHJlZ3MtPnJlZ3NbMTVdID0gdXNwOwogCQl0aS0+YWRkcl9saW1pdCA9IFVTRVJfRFM7CiAJfSBlbHNlIHsKLQkJY2hpbGRyZWdzLT5yZWdzWzE1XSA9ICh1bnNpZ25lZCBsb25nKXRhc2tfc3RhY2tfcGFnZShwKSArIFRIUkVBRF9TSVpFOworCQljaGlsZHJlZ3MtPnJlZ3NbMTVdID0gKHVuc2lnbmVkIGxvbmcpdGFza19zdGFja19wYWdlKHApICsKKwkJCQkJCQlUSFJFQURfU0laRTsKIAkJdGktPmFkZHJfbGltaXQgPSBLRVJORUxfRFM7CiAJfQotICAgICAgICBpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TRVRUTFMpIHsKKworICAgICAgICBpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9TRVRUTFMpCiAJCWNoaWxkcmVncy0+Z2JyID0gY2hpbGRyZWdzLT5yZWdzWzBdOwotCX0KKwogCWNoaWxkcmVncy0+cmVnc1swXSA9IDA7IC8qIFNldCByZXR1cm4gdmFsdWUgZm9yIGNoaWxkICovCiAKIAlwLT50aHJlYWQuc3AgPSAodW5zaWduZWQgbG9uZykgY2hpbGRyZWdzOwpAQCAtMjgwLDggKzI2OSw3IEBACiB9CiAKIC8qIFRyYWNpbmcgYnkgdXNlciBicmVhayBjb250cm9sbGVyLiAgKi8KLXN0YXRpYyB2b2lkCi11YmNfc2V0X3RyYWNpbmcoaW50IGFzaWQsIHVuc2lnbmVkIGxvbmcgcGMpCitzdGF0aWMgdm9pZCB1YmNfc2V0X3RyYWNpbmcoaW50IGFzaWQsIHVuc2lnbmVkIGxvbmcgcGMpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINEEpCiAJdW5zaWduZWQgbG9uZyB2YWw7CkBAIC0yOTcsNyArMjg1LDcgQEAKIAl2YWwgPSAoVUJDX0NSUl9SRVMgfCBVQkNfQ1JSX1BDQiB8IFVCQ19DUlJfQklFKTsKIAljdHJsX291dGwodmFsLCBVQkNfQ1JSMCk7CiAKLQkvKiBSZWFkIFVCQyByZWdpc3RlciB0aGF0IHdlIHdyaXRlZCBsYXN0LiBGb3IgY2hla2tpbmcgVUJDIFJlZ2lzdGVyIGNoYW5nZWQgKi8KKwkvKiBSZWFkIFVCQyByZWdpc3RlciB0aGF0IHdlIHdyb3RlIGxhc3QsIGZvciBjaGVja2luZyB1cGRhdGUgKi8KIAl2YWwgPSBjdHJsX2lubChVQkNfQ1JSMCk7CiAKICNlbHNlCS8qIENPTkZJR19DUFVfU0g0QSAqLwpAQCAtMzA1LDEzICsyOTMsMTQgQEAKIAogI2lmZGVmIENPTkZJR19NTVUKIAkvKiBXZSBkb24ndCBoYXZlIGFueSBBU0lEIHNldHRpbmdzIGZvciB0aGUgU0gtMiEgKi8KLQlpZiAoY3B1X2RhdGEtPnR5cGUgIT0gQ1BVX1NINzYwNCkKKwlpZiAoY3VycmVudF9jcHVfZGF0YS50eXBlICE9IENQVV9TSDc2MDQpCiAJCWN0cmxfb3V0Yihhc2lkLCBVQkNfQkFTUkEpOwogI2VuZGlmCiAKIAljdHJsX291dGwoMCwgVUJDX0JBTVJBKTsKIAotCWlmIChjcHVfZGF0YS0+dHlwZSA9PSBDUFVfU0g3NzI5IHx8IGNwdV9kYXRhLT50eXBlID09IENQVV9TSDc3MTApIHsKKwlpZiAoY3VycmVudF9jcHVfZGF0YS50eXBlID09IENQVV9TSDc3MjkgfHwKKwkgICAgY3VycmVudF9jcHVfZGF0YS50eXBlID09IENQVV9TSDc3MTApIHsKIAkJY3RybF9vdXR3KEJCUl9JTlNUIHwgQkJSX1JFQUQgfCBCQlJfQ1BVLCBVQkNfQkJSQSk7CiAJCWN0cmxfb3V0bChCUkNSX1BDQkEgfCBCUkNSX1BDVEUsIFVCQ19CUkNSKTsKIAl9IGVsc2UgewpAQCAtMzI1LDcgKzMxNCw4IEBACiAgKglzd2l0Y2hfdG8oeCx5KSBzaG91bGQgc3dpdGNoIHRhc2tzIGZyb20geCB0byB5LgogICoKICAqLwotc3RydWN0IHRhc2tfc3RydWN0ICpfX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3N0cnVjdCB0YXNrX3N0cnVjdCAqX19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKICNpZiBkZWZpbmVkKENPTkZJR19TSF9GUFUpCiAJdW5sYXp5X2ZwdShwcmV2LCB0YXNrX3B0X3JlZ3MocHJldikpOwpAQCAtMzU0LDcgKzM0NCw3IEBACiAjaWZkZWYgQ09ORklHX01NVQogCS8qCiAJICogUmVzdG9yZSB0aGUga2VybmVsIG1vZGUgcmVnaXN0ZXIKLQkgKiAgIAlrNyAocjdfYmFuazEpCisJICoJazcgKHI3X2JhbmsxKQogCSAqLwogCWFzbSB2b2xhdGlsZSgibGRjCSUwLCByN19iYW5rIgogCQkgICAgIDogLyogbm8gb3V0cHV0ICovCkBAIC0zNjcsNyArMzU3LDcgQEAKIAllbHNlIGlmIChuZXh0LT50aHJlYWQudWJjX3BjICYmIG5leHQtPm1tKSB7CiAJCWludCBhc2lkID0gMDsKICNpZmRlZiBDT05GSUdfTU1VCi0JCWFzaWQgfD0gbmV4dC0+bW0tPmNvbnRleHQuaWQgJiBNTVVfQ09OVEVYVF9BU0lEX01BU0s7CisJCWFzaWQgfD0gY3B1X2FzaWQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBuZXh0LT5tbSk7CiAjZW5kaWYKIAkJdWJjX3NldF90cmFjaW5nKGFzaWQsIG5leHQtPnRocmVhZC51YmNfcGMpOwogCX0gZWxzZSB7CkBAIC00MDUsNyArMzk1LDggQEAKIAlpZiAoIW5ld3NwKQogCQluZXdzcCA9IHJlZ3MtPnJlZ3NbMTVdOwogCXJldHVybiBkb19mb3JrKGNsb25lX2ZsYWdzLCBuZXdzcCwgcmVncywgMCwKLQkJCShpbnQgX191c2VyICopcGFyZW50X3RpZHB0ciwgKGludCBfX3VzZXIgKiljaGlsZF90aWRwdHIpOworCQkJKGludCBfX3VzZXIgKilwYXJlbnRfdGlkcHRyLAorCQkJKGludCBfX3VzZXIgKiljaGlsZF90aWRwdHIpOwogfQogCiAvKgpAQCAtNDkzLDkgKzQ4NCwyNyBAQAogCWZvcmNlX3NpZyhTSUdUUkFQLCBjdXJyZW50KTsKIH0KIAotYXNtbGlua2FnZSB2b2lkIGJyZWFrX3BvaW50X3RyYXBfc29mdHdhcmUodW5zaWduZWQgbG9uZyByNCwgdW5zaWduZWQgbG9uZyByNSwKLQkJCQkJICB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAotCQkJCQkgIHN0cnVjdCBwdF9yZWdzIF9fcmVncykKKy8qCisgKiBHZW5lcmljIHRyYXAgaGFuZGxlci4KKyAqLworYXNtbGlua2FnZSB2b2lkIGRlYnVnX3RyYXBfaGFuZGxlcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkJCSAgIHVuc2lnbmVkIGxvbmcgcjYsIHVuc2lnbmVkIGxvbmcgcjcsCisJCQkJICAgc3RydWN0IHB0X3JlZ3MgX19yZWdzKQoreworCXN0cnVjdCBwdF9yZWdzICpyZWdzID0gUkVMT0NfSElERSgmX19yZWdzLCAwKTsKKworCS8qIFJld2luZCAqLworCXJlZ3MtPnBjIC09IDI7CisKKwlmb3JjZV9zaWcoU0lHVFJBUCwgY3VycmVudCk7Cit9CisKKy8qCisgKiBTcGVjaWFsIGhhbmRsZXIgZm9yIEJVRygpIHRyYXBzLgorICovCithc21saW5rYWdlIHZvaWQgYnVnX3RyYXBfaGFuZGxlcih1bnNpZ25lZCBsb25nIHI0LCB1bnNpZ25lZCBsb25nIHI1LAorCQkJCSB1bnNpZ25lZCBsb25nIHI2LCB1bnNpZ25lZCBsb25nIHI3LAorCQkJCSBzdHJ1Y3QgcHRfcmVncyBfX3JlZ3MpCiB7CiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBSRUxPQ19ISURFKCZfX3JlZ3MsIDApOwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jIGIvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYwppbmRleCBkNmI4MTdhLi45ODgwMmFiIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gvc2gva2VybmVsL3NldHVwLmMKQEAgLTEsMTQgKzEsMTEgQEAKIC8qCi0gKiAgbGludXgvYXJjaC9zaC9rZXJuZWwvc2V0dXAuYworICogYXJjaC9zaC9rZXJuZWwvc2V0dXAuYworICoKKyAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGluaXRpYWxpemF0aW9uCiAgKgogICogIENvcHlyaWdodCAoQykgMTk5OSAgTmlpYmUgWXV0YWthCi0gKiAgQ29weXJpZ2h0IChDKSAyMDAyLCAyMDAzICBQYXVsIE11bmR0CisgKiAgQ29weXJpZ2h0IChDKSAyMDAyIC0gMjAwNiBQYXVsIE11bmR0CiAgKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIGluaXRpYWxpemF0aW9uCi0gKi8KLQogI2luY2x1ZGUgPGxpbnV4L3NjcmVlbl9pbmZvLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgpAQCAtMzk1LDkgKzM5Miw5IEBACiAJW0NQVV9TSF9OT05FXQk9ICJVbmtub3duIgogfTsKIAotY29uc3QgY2hhciAqZ2V0X2NwdV9zdWJ0eXBlKHZvaWQpCitjb25zdCBjaGFyICpnZXRfY3B1X3N1YnR5cGUoc3RydWN0IHNoX2NwdWluZm8gKmMpCiB7Ci0JcmV0dXJuIGNwdV9uYW1lW2Jvb3RfY3B1X2RhdGEudHlwZV07CisJcmV0dXJuIGNwdV9uYW1lW2MtPnR5cGVdOwogfQogCiAjaWZkZWYgQ09ORklHX1BST0NfRlMKQEAgLTQwNywxOSArNDA0LDE5IEBACiAJInB0ZWEiLCAibGxzYyIsICJsMiIsIE5VTEwKIH07CiAKLXN0YXRpYyB2b2lkIHNob3dfY3B1ZmxhZ3Moc3RydWN0IHNlcV9maWxlICptKQorc3RhdGljIHZvaWQgc2hvd19jcHVmbGFncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBzaF9jcHVpbmZvICpjKQogewogCXVuc2lnbmVkIGxvbmcgaTsKIAogCXNlcV9wcmludGYobSwgImNwdSBmbGFnc1x0OiIpOwogCi0JaWYgKCFjcHVfZGF0YS0+ZmxhZ3MpIHsKKwlpZiAoIWMtPmZsYWdzKSB7CiAJCXNlcV9wcmludGYobSwgIiAlc1xuIiwgY3B1X2ZsYWdzWzBdKTsKIAkJcmV0dXJuOwogCX0KIAogCWZvciAoaSA9IDA7IGNwdV9mbGFnc1tpXTsgaSsrKQotCQlpZiAoKGNwdV9kYXRhLT5mbGFncyAmICgxIDw8IGkpKSkKKwkJaWYgKChjLT5mbGFncyAmICgxIDw8IGkpKSkKIAkJCXNlcV9wcmludGYobSwgIiAlcyIsIGNwdV9mbGFnc1tpKzFdKTsKIAogCXNlcV9wcmludGYobSwgIlxuIik7CkBAIC00NDEsMTYgKzQzOCwyMCBAQAogICovCiBzdGF0aWMgaW50IHNob3dfY3B1aW5mbyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0JdW5zaWduZWQgaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlzdHJ1Y3Qgc2hfY3B1aW5mbyAqYyA9IHY7CisJdW5zaWduZWQgaW50IGNwdSA9IGMgLSBjcHVfZGF0YTsKIAotCWlmICghY3B1ICYmIGNwdV9vbmxpbmUoY3B1KSkKKwlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY3B1ID09IDApCiAJCXNlcV9wcmludGYobSwgIm1hY2hpbmVcdFx0OiAlc1xuIiwgZ2V0X3N5c3RlbV90eXBlKCkpOwogCiAJc2VxX3ByaW50ZihtLCAicHJvY2Vzc29yXHQ6ICVkXG4iLCBjcHUpOwogCXNlcV9wcmludGYobSwgImNwdSBmYW1pbHlcdDogJXNcbiIsIGluaXRfdXRzbmFtZSgpLT5tYWNoaW5lKTsKLQlzZXFfcHJpbnRmKG0sICJjcHUgdHlwZVx0OiAlc1xuIiwgZ2V0X2NwdV9zdWJ0eXBlKCkpOworCXNlcV9wcmludGYobSwgImNwdSB0eXBlXHQ6ICVzXG4iLCBnZXRfY3B1X3N1YnR5cGUoYykpOwogCi0Jc2hvd19jcHVmbGFncyhtKTsKKwlzaG93X2NwdWZsYWdzKG0sIGMpOwogCiAJc2VxX3ByaW50ZihtLCAiY2FjaGUgdHlwZVx0OiAiKTsKIApAQCAtNDU5LDIyICs0NjAsMjIgQEAKIAkgKiB1bmlmaWVkIGNhY2hlIG9uIHRoZSBTSC0yIGFuZCBTSC0zLCBhcyB3ZWxsIGFzIHRoZSBoYXJ2YXJkCiAJICogc3R5bGUgY2FjaGUgb24gdGhlIFNILTQuCiAJICovCi0JaWYgKGJvb3RfY3B1X2RhdGEuaWNhY2hlLmZsYWdzICYgU0hfQ0FDSEVfQ09NQklORUQpIHsKKwlpZiAoYy0+aWNhY2hlLmZsYWdzICYgU0hfQ0FDSEVfQ09NQklORUQpIHsKIAkJc2VxX3ByaW50ZihtLCAidW5pZmllZFxuIik7Ci0JCXNob3dfY2FjaGVpbmZvKG0sICJjYWNoZSIsIGJvb3RfY3B1X2RhdGEuaWNhY2hlKTsKKwkJc2hvd19jYWNoZWluZm8obSwgImNhY2hlIiwgYy0+aWNhY2hlKTsKIAl9IGVsc2UgewogCQlzZXFfcHJpbnRmKG0sICJzcGxpdCAoaGFydmFyZClcbiIpOwotCQlzaG93X2NhY2hlaW5mbyhtLCAiaWNhY2hlIiwgYm9vdF9jcHVfZGF0YS5pY2FjaGUpOwotCQlzaG93X2NhY2hlaW5mbyhtLCAiZGNhY2hlIiwgYm9vdF9jcHVfZGF0YS5kY2FjaGUpOworCQlzaG93X2NhY2hlaW5mbyhtLCAiaWNhY2hlIiwgYy0+aWNhY2hlKTsKKwkJc2hvd19jYWNoZWluZm8obSwgImRjYWNoZSIsIGMtPmRjYWNoZSk7CiAJfQogCiAJLyogT3B0aW9uYWwgc2Vjb25kYXJ5IGNhY2hlICovCi0JaWYgKGJvb3RfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX0wyX0NBQ0hFKQotCQlzaG93X2NhY2hlaW5mbyhtLCAic2NhY2hlIiwgYm9vdF9jcHVfZGF0YS5zY2FjaGUpOworCWlmIChjLT5mbGFncyAmIENQVV9IQVNfTDJfQ0FDSEUpCisJCXNob3dfY2FjaGVpbmZvKG0sICJzY2FjaGUiLCBjLT5zY2FjaGUpOwogCiAJc2VxX3ByaW50ZihtLCAiYm9nb21pcHNcdDogJWx1LiUwMmx1XG4iLAotCQkgICAgIGJvb3RfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5Lyg1MDAwMDAvSFopLAotCQkgICAgIChib290X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeS8oNTAwMC9IWikpICUgMTAwKTsKKwkJICAgICBjLT5sb29wc19wZXJfamlmZnkvKDUwMDAwMC9IWiksCisJCSAgICAgKGMtPmxvb3BzX3Blcl9qaWZmeS8oNTAwMC9IWikpICUgMTAwKTsKIAogCXJldHVybiBzaG93X2Nsb2NrcyhtKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMgYi9hcmNoL3NoL2tlcm5lbC9zaF9rc3ltcy5jCmluZGV4IGU2MTA2MjMuLmZlMWIyNzYgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gva2VybmVsL3NoX2tzeW1zLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2hfa3N5bXMuYwpAQCAtMTA1LDcgKzEwNSw2IEBACiBFWFBPUlRfU1lNQk9MKGNsZWFyX3VzZXJfcGFnZSk7CiAjZW5kaWYKIAotRVhQT1JUX1NZTUJPTChmbHVzaF90bGJfcGFnZSk7CiBFWFBPUlRfU1lNQk9MKF9fZG93bl90cnlsb2NrKTsKIAogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvc2gva2VybmVsL3NpZ25hbC5jIGIvYXJjaC9zaC9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMzc5Yzg4Yi4uMzJmMTBhMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9rZXJuZWwvc2lnbmFsLmMKKysrIGIvYXJjaC9zaC9rZXJuZWwvc2lnbmFsLmMKQEAgLTEyNyw3ICsxMjcsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAotCWlmICghKGNwdV9kYXRhLT5mbGFncyAmIENQVV9IQVNfRlBVKSkKKwlpZiAoIShjdXJyZW50X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19GUFUpKQogCQlyZXR1cm4gMDsKIAogCXNldF91c2VkX21hdGgoKTsKQEAgLTE0MCw3ICsxNDAsNyBAQAogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrID0gY3VycmVudDsKIAotCWlmICghKGNwdV9kYXRhLT5mbGFncyAmIENQVV9IQVNfRlBVKSkKKwlpZiAoIShjdXJyZW50X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19GUFUpKQogCQlyZXR1cm4gMDsKIAogCWlmICghdXNlZF9tYXRoKCkpIHsKQEAgLTE4MSw3ICsxODEsNyBAQAogI3VuZGVmIENPUFkKIAogI2lmZGVmIENPTkZJR19TSF9GUFUKLQlpZiAoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19GUFUpIHsKKwlpZiAoY3VycmVudF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfRlBVKSB7CiAJCWludCBvd25lZF9mcDsKIAkJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjdXJyZW50OwogCmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TIGIvYXJjaC9zaC9rZXJuZWwvc3lzY2FsbHMuUwppbmRleCBjYTgxOTc2Li4zOGZjOGNkIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC9zeXNjYWxscy5TCisrKyBiL2FyY2gvc2gva2VybmVsL3N5c2NhbGxzLlMKQEAgLTMxOSwxNSArMzE5LDE1IEBACiAJLmxvbmcgc3lzX21xX2dldHNldGF0dHIKIAkubG9uZyBzeXNfa2V4ZWNfbG9hZAogCS5sb25nIHN5c193YWl0aWQKLQkubG9uZyBzeXNfbmlfc3lzY2FsbAkJLyogMjg1ICovCi0JLmxvbmcgc3lzX2FkZF9rZXkKKwkubG9uZyBzeXNfYWRkX2tleQkJLyogMjg1ICovCiAJLmxvbmcgc3lzX3JlcXVlc3Rfa2V5CiAJLmxvbmcgc3lzX2tleWN0bAogCS5sb25nIHN5c19pb3ByaW9fc2V0Ci0JLmxvbmcgc3lzX2lvcHJpb19nZXQJCS8qIDI5MCAqLwotCS5sb25nIHN5c19pbm90aWZ5X2luaXQKKwkubG9uZyBzeXNfaW9wcmlvX2dldAorCS5sb25nIHN5c19pbm90aWZ5X2luaXQJCS8qIDI5MCAqLwogCS5sb25nIHN5c19pbm90aWZ5X2FkZF93YXRjaAogCS5sb25nIHN5c19pbm90aWZ5X3JtX3dhdGNoCisJLmxvbmcgc3lzX25pX3N5c2NhbGwKIAkubG9uZyBzeXNfbWlncmF0ZV9wYWdlcwogCS5sb25nIHN5c19vcGVuYXQJCS8qIDI5NSAqLwogCS5sb25nIHN5c19ta2RpcmF0CmRpZmYgLS1naXQgYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jIGIvYXJjaC9zaC9rZXJuZWwvdHJhcHMuYwppbmRleCBlYzExMDE1Li5lOWYxNjhmIDEwMDY0NAotLS0gYS9hcmNoL3NoL2tlcm5lbC90cmFwcy5jCisrKyBiL2FyY2gvc2gva2VybmVsL3RyYXBzLmMKQEAgLTE1NiwxMyArMTU2LDEzIEBACiB7CiB9CiAjZW5kaWYgLyogQ09ORklHX0RFQlVHX0JVR1ZFUkJPU0UgKi8KLSNlbmRpZiAvKiBDT05GSUdfQlVHICovCiAKIHZvaWQgaGFuZGxlX0JVRyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKIHsKIAlkb19idWdfdmVyYm9zZShyZWdzKTsKIAlkaWUoIktlcm5lbCBCVUciLCByZWdzLCBUUkFQQV9CVUdfT1BDT0RFICYgMHhmZik7CiB9CisjZW5kaWYgLyogQ09ORklHX0JVRyAqLwogCiAvKgogICogaGFuZGxlIGFuIGluc3RydWN0aW9uIHRoYXQgZG9lcyBhbiB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBieSBlbXVsYXRpbmcgdGhlCkBAIC02NDEsNyArNjQxLDcgQEAKIAkgKiBTYWZlIGd1YXJkIGlmIERTUCBtb2RlIGlzIGFscmVhZHkgZW5hYmxlZCBvciB3ZSdyZSBsYWNraW5nCiAJICogdGhlIERTUCBhbHRvZ2V0aGVyLgogCSAqLwotCWlmICghKGNwdV9kYXRhLT5mbGFncyAmIENQVV9IQVNfRFNQKSB8fCAocmVncy0+c3IgJiBTUl9EU1ApKQorCWlmICghKGN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX0RTUCkgfHwgKHJlZ3MtPnNyICYgU1JfRFNQKSkKIAkJcmV0dXJuIDA7CiAKIAlnZXRfdXNlcihpbnN0LCAoKHVuc2lnbmVkIHNob3J0ICopIHJlZ3MtPnBjKSk7CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL0tjb25maWcgYi9hcmNoL3NoL21tL0tjb25maWcKaW5kZXggMjlmNGVlMy4uNmIwZDI4YSAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9LY29uZmlnCisrKyBiL2FyY2gvc2gvbW0vS2NvbmZpZwpAQCAtMjAsNyArMjAsNyBAQAogCWJvb2wKIAlzZWxlY3QgQ1BVX0hBU19JTlRFVlQKIAlzZWxlY3QgQ1BVX0hBU19TUl9SQgotCXNlbGVjdCBDUFVfSEFTX1BURUEgaWYgIUNQVV9TVUJUWVBFX1NUNDAKKwlzZWxlY3QgQ1BVX0hBU19QVEVBIGlmICghQ1BVX1NVQlRZUEVfU1Q0MCAmJiAhQ1BVX1NINEEpIHx8IENQVV9TSFgyCiAKIGNvbmZpZyBDUFVfU0g0QQogCWJvb2wKQEAgLTcyLDYgKzcyLDcgQEAKIGNvbmZpZyBDUFVfU1VCVFlQRV9TSDc3MDYKIAlib29sICJTdXBwb3J0IFNINzcwNiBwcm9jZXNzb3IiCiAJc2VsZWN0IENQVV9TSDMKKwlzZWxlY3QgQ1BVX0hBU19JUFJfSVJRCiAJaGVscAogCSAgU2VsZWN0IFNINzcwNiBpZiB5b3UgaGF2ZSBhIDEzMyBNaHogU0gtMyBIRDY0MTc3MDYgQ1BVLgogCkBAIC05Miw2ICs5Myw3IEBACiBjb25maWcgQ1BVX1NVQlRZUEVfU0g3NzA5CiAJYm9vbCAiU3VwcG9ydCBTSDc3MDkgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0gzCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCXNlbGVjdCBDUFVfSEFTX1BJTlRfSVJRCiAJaGVscAogCSAgU2VsZWN0IFNINzcwOSBpZiB5b3UgaGF2ZSBhICA4MCBNaHogU0gtMyBIRDY0MTc3MDkgQ1BVLgpAQCAtMTQ5LDYgKzE1MSw3IEBACiAJYm9vbCAiU3VwcG9ydCBTSDc3NjAgcHJvY2Vzc29yIgogCXNlbGVjdCBDUFVfU0g0CiAJc2VsZWN0IENQVV9IQVNfSU5UQzJfSVJRCisJc2VsZWN0IENQVV9IQVNfSVBSX0lSUQogCiBjb25maWcgQ1BVX1NVQlRZUEVfU0g0XzIwMgogCWJvb2wgIlN1cHBvcnQgU0g0LTIwMiBwcm9jZXNzb3IiCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2NhY2hlLWRlYnVnZnMuYyBiL2FyY2gvc2gvbW0vY2FjaGUtZGVidWdmcy5jCmluZGV4IDkwOWRjZmEuLmRlNmQyYzkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUtZGVidWdmcy5jCisrKyBiL2FyY2gvc2gvbW0vY2FjaGUtZGVidWdmcy5jCkBAIC00NiwxMCArNDYsMTAgQEAKIAogCWlmIChjYWNoZV90eXBlID09IENBQ0hFX1RZUEVfRENBQ0hFKSB7CiAJCWJhc2UgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZOwotCQljYWNoZSA9ICZjcHVfZGF0YS0+ZGNhY2hlOworCQljYWNoZSA9ICZjdXJyZW50X2NwdV9kYXRhLmRjYWNoZTsKIAl9IGVsc2UgewogCQliYXNlID0gQ0FDSEVfSUNfQUREUkVTU19BUlJBWTsKLQkJY2FjaGUgPSAmY3B1X2RhdGEtPmljYWNoZTsKKwkJY2FjaGUgPSAmY3VycmVudF9jcHVfZGF0YS5pY2FjaGU7CiAJfQogCiAJLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtc2gzLmMgYi9hcmNoL3NoL21tL2NhY2hlLXNoMy5jCmluZGV4IDgzODczMWYuLjZkMWRiZWMgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUtc2gzLmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDMuYwpAQCAtNDQsMTEgKzQ0LDExIEBACiAKIAlmb3IgKHYgPSBiZWdpbjsgdiA8IGVuZDsgdis9TDFfQ0FDSEVfQllURVMpIHsKIAkJdW5zaWduZWQgbG9uZyBhZGRyc3RhcnQgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZOwotCQlmb3IgKGogPSAwOyBqIDwgY3B1X2RhdGEtPmRjYWNoZS53YXlzOyBqKyspIHsKKwkJZm9yIChqID0gMDsgaiA8IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXM7IGorKykgewogCQkJdW5zaWduZWQgbG9uZyBkYXRhLCBhZGRyLCBwOwogCiAJCQlwID0gX19wYSh2KTsKLQkJCWFkZHIgPSBhZGRyc3RhcnQgfCAodiAmIGNwdV9kYXRhLT5kY2FjaGUuZW50cnlfbWFzayk7CisJCQlhZGRyID0gYWRkcnN0YXJ0IHwgKHYgJiBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9tYXNrKTsKIAkJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJCWRhdGEgPSBjdHJsX2lubChhZGRyKTsKIApAQCAtNjAsNyArNjAsNyBAQAogCQkJCWJyZWFrOwogCQkJfQogCQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQkJYWRkcnN0YXJ0ICs9IGNwdV9kYXRhLT5kY2FjaGUud2F5X2luY3I7CisJCQlhZGRyc3RhcnQgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3I7CiAJCX0KIAl9CiB9CkBAIC04NSw3ICs4NSw3IEBACiAKIAkJZGF0YSA9ICh2ICYgMHhmZmZmZmMwMCk7IC8qIF9WaXJ0dWFsXyBhZGRyZXNzLCB+VSwgflYgKi8KIAkJYWRkciA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVkgfAotCQkJKHYgJiBjcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X21hc2spIHwgU0hfQ0FDSEVfQVNTT0M7CisJCQkodiAmIGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X21hc2spIHwgU0hfQ0FDSEVfQVNTT0M7CiAJCWN0cmxfb3V0bChkYXRhLCBhZGRyKTsKIAl9CiB9CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2NhY2hlLXNoNC5jIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDQuYwppbmRleCBjNjk1NTE1Li5lMGNkNGI3IDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL2NhY2hlLXNoNC5jCisrKyBiL2FyY2gvc2gvbW0vY2FjaGUtc2g0LmMKQEAgLTU0LDIxICs1NCwyMSBAQAogCQljdHJsX2lubChDQ05fQ1ZSKSwKIAkJY3RybF9pbmwoQ0NOX1BSUikpOwogCXByaW50aygiSS1jYWNoZSA6IG5fd2F5cz0lZCBuX3NldHM9JWQgd2F5X2luY3I9JWRcbiIsCi0JCWNwdV9kYXRhLT5pY2FjaGUud2F5cywKLQkJY3B1X2RhdGEtPmljYWNoZS5zZXRzLAotCQljcHVfZGF0YS0+aWNhY2hlLndheV9pbmNyKTsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5cywKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUuc2V0cywKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUud2F5X2luY3IpOwogCXByaW50aygiSS1jYWNoZSA6IGVudHJ5X21hc2s9MHglMDh4IGFsaWFzX21hc2s9MHglMDh4IG5fYWxpYXNlcz0lZFxuIiwKLQkJY3B1X2RhdGEtPmljYWNoZS5lbnRyeV9tYXNrLAotCQljcHVfZGF0YS0+aWNhY2hlLmFsaWFzX21hc2ssCi0JCWNwdV9kYXRhLT5pY2FjaGUubl9hbGlhc2VzKTsKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUuZW50cnlfbWFzaywKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUuYWxpYXNfbWFzaywKKwkJY3VycmVudF9jcHVfZGF0YS5pY2FjaGUubl9hbGlhc2VzKTsKIAlwcmludGsoIkQtY2FjaGUgOiBuX3dheXM9JWQgbl9zZXRzPSVkIHdheV9pbmNyPSVkXG4iLAotCQljcHVfZGF0YS0+ZGNhY2hlLndheXMsCi0JCWNwdV9kYXRhLT5kY2FjaGUuc2V0cywKLQkJY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jcik7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXMsCisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHMsCisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9pbmNyKTsKIAlwcmludGsoIkQtY2FjaGUgOiBlbnRyeV9tYXNrPTB4JTA4eCBhbGlhc19tYXNrPTB4JTA4eCBuX2FsaWFzZXM9JWRcbiIsCi0JCWNwdV9kYXRhLT5kY2FjaGUuZW50cnlfbWFzaywKLQkJY3B1X2RhdGEtPmRjYWNoZS5hbGlhc19tYXNrLAotCQljcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlcyk7CisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X21hc2ssCisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmFsaWFzX21hc2ssCisJCWN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlcyk7CiAKIAlpZiAoIV9fZmx1c2hfZGNhY2hlX3NlZ21lbnRfZm4pCiAJCXBhbmljKCJ1bmtub3duIG51bWJlciBvZiBjYWNoZSB3YXlzXG4iKTsKQEAgLTg3LDEwICs4NywxMCBAQAogewogCWludCBpOwogCi0JY29tcHV0ZV9hbGlhcygmY3B1X2RhdGEtPmljYWNoZSk7Ci0JY29tcHV0ZV9hbGlhcygmY3B1X2RhdGEtPmRjYWNoZSk7CisJY29tcHV0ZV9hbGlhcygmY3VycmVudF9jcHVfZGF0YS5pY2FjaGUpOworCWNvbXB1dGVfYWxpYXMoJmN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlKTsKIAotCXN3aXRjaCAoY3B1X2RhdGEtPmRjYWNoZS53YXlzKSB7CisJc3dpdGNoIChjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzKSB7CiAJY2FzZSAxOgogCQlfX2ZsdXNoX2RjYWNoZV9zZWdtZW50X2ZuID0gX19mbHVzaF9kY2FjaGVfc2VnbWVudF8xd2F5OwogCQlicmVhazsKQEAgLTExMCw3ICsxMTAsNyBAQAogCWlmIChpb3JlbWFwX3BhZ2VfcmFuZ2UoUDNTRUcsIFAzU0VHICsgKFBBR0VfU0laRSAqIDQpLCAwLCBQQUdFX0tFUk5FTCkpCiAJCXBhbmljKCIlcyBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKIAotCWZvciAoaSA9IDA7IGkgPCBjcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlczsgaSsrKQorCWZvciAoaSA9IDA7IGkgPCBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5uX2FsaWFzZXM7IGkrKykKIAkJbXV0ZXhfaW5pdCgmcDNtYXBfbXV0ZXhbaV0pOwogfQogCkBAIC0yMDAsMTMgKzIwMCwxNCBAQAogCQkgICAgIDogLyogbm8gb3V0cHV0ICovCiAJCSAgICAgOiAibSIgKF9fbSh2KSkpOwogCi0JaW5kZXggPSBDQUNIRV9JQ19BRERSRVNTX0FSUkFZIHwgKHYgJiBjcHVfZGF0YS0+aWNhY2hlLmVudHJ5X21hc2spOworCWluZGV4ID0gQ0FDSEVfSUNfQUREUkVTU19BUlJBWSB8CisJCQkodiAmIGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLmVudHJ5X21hc2spOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCWp1bXBfdG9fUDIoKTsKIAotCWZvciAoaSA9IDA7IGkgPCBjcHVfZGF0YS0+aWNhY2hlLndheXM7Ci0JICAgICBpKyssIGluZGV4ICs9IGNwdV9kYXRhLT5pY2FjaGUud2F5X2luY3IpCisJZm9yIChpID0gMDsgaSA8IGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheXM7CisJICAgICBpKyssIGluZGV4ICs9IGN1cnJlbnRfY3B1X2RhdGEuaWNhY2hlLndheV9pbmNyKQogCQljdHJsX291dGwoMCwgaW5kZXgpOwkvKiBDbGVhciBvdXQgVmFsaWQtYml0ICovCiAKIAliYWNrX3RvX1AxKCk7CkBAIC0yMjMsNyArMjI0LDcgQEAKIAkgKiBBbGwgdHlwZXMgb2YgU0gtNCByZXF1aXJlIFBDIHRvIGJlIGluIFAyIHRvIG9wZXJhdGUgb24gdGhlIEktY2FjaGUuCiAJICogU29tZSB0eXBlcyBvZiBTSC00IHJlcXVpcmUgUEMgdG8gYmUgaW4gUDIgdG8gb3BlcmF0ZSBvbiB0aGUgRC1jYWNoZS4KIAkgKi8KLQlpZiAoKGNwdV9kYXRhLT5mbGFncyAmIENQVV9IQVNfUDJfRkxVU0hfQlVHKSB8fAorCWlmICgoY3VycmVudF9jcHVfZGF0YS5mbGFncyAmIENQVV9IQVNfUDJfRkxVU0hfQlVHKSB8fAogCSAgICAoc3RhcnQgPCBDQUNIRV9PQ19BRERSRVNTX0FSUkFZKSkKIAkJZXhlY19vZmZzZXQgPSAweDIwMDAwMDAwOwogCkBAIC0yMzYsMTYgKzIzNywyNiBAQAogLyoKICAqIFdyaXRlIGJhY2sgJiBpbnZhbGlkYXRlIHRoZSBELWNhY2hlIG9mIHRoZSBwYWdlLgogICogKFRvIGF2b2lkICJhbGlhcyIgaXNzdWVzKQorICoKKyAqIFRoaXMgdXNlcyBhIGxhenkgd3JpdGUtYmFjayBvbiBVUCwgd2hpY2ggaXMgZXhwbGljaXRseQorICogZGlzYWJsZWQgb24gU01QLgogICovCiB2b2lkIGZsdXNoX2RjYWNoZV9wYWdlKHN0cnVjdCBwYWdlICpwYWdlKQogewotCWlmICh0ZXN0X2JpdChQR19tYXBwZWQsICZwYWdlLT5mbGFncykpIHsKKyNpZm5kZWYgQ09ORklHX1NNUAorCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCisJaWYgKG1hcHBpbmcgJiYgIW1hcHBpbmdfbWFwcGVkKG1hcHBpbmcpKQorCQlzZXRfYml0KFBHX2RjYWNoZV9kaXJ0eSwgJnBhZ2UtPmZsYWdzKTsKKwllbHNlCisjZW5kaWYKKwl7CiAJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IFBIWVNBRERSKHBhZ2VfYWRkcmVzcyhwYWdlKSk7CiAJCXVuc2lnbmVkIGxvbmcgYWRkciA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7CiAJCWludCBpLCBuOwogCiAJCS8qIExvb3AgYWxsIHRoZSBELWNhY2hlICovCi0JCW4gPSBjcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlczsKKwkJbiA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlczsKIAkJZm9yIChpID0gMDsgaSA8IG47IGkrKywgYWRkciArPSA0MDk2KQogCQkJZmx1c2hfY2FjaGVfNDA5NihhZGRyLCBwaHlzKTsKIAl9CkBAIC0yNzcsNyArMjg4LDcgQEAKIAogdm9pZCBmbHVzaF9kY2FjaGVfYWxsKHZvaWQpCiB7Ci0JKCpfX2ZsdXNoX2RjYWNoZV9zZWdtZW50X2ZuKSgwVUwsIGNwdV9kYXRhLT5kY2FjaGUud2F5X3NpemUpOworCSgqX19mbHVzaF9kY2FjaGVfc2VnbWVudF9mbikoMFVMLCBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlfc2l6ZSk7CiAJd21iKCk7CiB9CiAKQEAgLTI5MSw4ICszMDIsOCBAQAogCQkJICAgICB1bnNpZ25lZCBsb25nIGVuZCkKIHsKIAl1bnNpZ25lZCBsb25nIGQgPSAwLCBwID0gc3RhcnQgJiBQQUdFX01BU0s7Ci0JdW5zaWduZWQgbG9uZyBhbGlhc19tYXNrID0gY3B1X2RhdGEtPmRjYWNoZS5hbGlhc19tYXNrOwotCXVuc2lnbmVkIGxvbmcgbl9hbGlhc2VzID0gY3B1X2RhdGEtPmRjYWNoZS5uX2FsaWFzZXM7CisJdW5zaWduZWQgbG9uZyBhbGlhc19tYXNrID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuYWxpYXNfbWFzazsKKwl1bnNpZ25lZCBsb25nIG5fYWxpYXNlcyA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlczsKIAl1bnNpZ25lZCBsb25nIHNlbGVjdF9iaXQ7CiAJdW5zaWduZWQgbG9uZyBhbGxfYWxpYXNlc19tYXNrOwogCXVuc2lnbmVkIGxvbmcgYWRkcl9vZmZzZXQ7CkBAIC0zNzksNyArMzkwLDcgQEAKIAkgKiBJZiBjYWNoZSBpcyBvbmx5IDRrLXBlci13YXksIHRoZXJlIGFyZSBuZXZlciBhbnkgJ2FsaWFzZXMnLiAgU2luY2UKIAkgKiB0aGUgY2FjaGUgaXMgcGh5c2ljYWxseSB0YWdnZWQsIHRoZSBkYXRhIGNhbiBqdXN0IGJlIGxlZnQgaW4gdGhlcmUuCiAJICovCi0JaWYgKGNwdV9kYXRhLT5kY2FjaGUubl9hbGlhc2VzID09IDApCisJaWYgKGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLm5fYWxpYXNlcyA9PSAwKQogCQlyZXR1cm47CiAKIAkvKgpAQCAtNDE2LDcgKzQyNyw3IEBACiAJdW5zaWduZWQgbG9uZyBwaHlzID0gcGZuIDw8IFBBR0VfU0hJRlQ7CiAJdW5zaWduZWQgaW50IGFsaWFzX21hc2s7CiAKLQlhbGlhc19tYXNrID0gY3B1X2RhdGEtPmRjYWNoZS5hbGlhc19tYXNrOworCWFsaWFzX21hc2sgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5hbGlhc19tYXNrOwogCiAJLyogV2Ugb25seSBuZWVkIHRvIGZsdXNoIEQtY2FjaGUgd2hlbiB3ZSBoYXZlIGFsaWFzICovCiAJaWYgKChhZGRyZXNzXnBoeXMpICYgYWxpYXNfbWFzaykgewpAQCAtNDMwLDcgKzQ0MSw3IEBACiAJCQlwaHlzKTsKIAl9CiAKLQlhbGlhc19tYXNrID0gY3B1X2RhdGEtPmljYWNoZS5hbGlhc19tYXNrOworCWFsaWFzX21hc2sgPSBjdXJyZW50X2NwdV9kYXRhLmljYWNoZS5hbGlhc19tYXNrOwogCWlmICh2bWEtPnZtX2ZsYWdzICYgVk1fRVhFQykgewogCQkvKgogCQkgKiBFdmljdCBlbnRyaWVzIGZyb20gdGhlIHBvcnRpb24gb2YgdGhlIGNhY2hlIGZyb20gd2hpY2ggY29kZQpAQCAtNDYyLDcgKzQ3Myw3IEBACiAJICogSWYgY2FjaGUgaXMgb25seSA0ay1wZXItd2F5LCB0aGVyZSBhcmUgbmV2ZXIgYW55ICdhbGlhc2VzJy4gIFNpbmNlCiAJICogdGhlIGNhY2hlIGlzIHBoeXNpY2FsbHkgdGFnZ2VkLCB0aGUgZGF0YSBjYW4ganVzdCBiZSBsZWZ0IGluIHRoZXJlLgogCSAqLwotCWlmIChjcHVfZGF0YS0+ZGNhY2hlLm5fYWxpYXNlcyA9PSAwKQorCWlmIChjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5uX2FsaWFzZXMgPT0gMCkKIAkJcmV0dXJuOwogCiAJLyoKQEAgLTUyMyw3ICs1MzQsNyBAQAogCXVuc2lnbmVkIGxvbmcgYSwgZWEsIHA7CiAJdW5zaWduZWQgbG9uZyB0ZW1wX3BjOwogCi0JZGNhY2hlID0gJmNwdV9kYXRhLT5kY2FjaGU7CisJZGNhY2hlID0gJmN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlOwogCS8qIFdyaXRlIHRoaXMgd2F5IGZvciBiZXR0ZXIgYXNzZW1ibHkuICovCiAJd2F5X2NvdW50ID0gZGNhY2hlLT53YXlzOwogCXdheV9pbmNyID0gZGNhY2hlLT53YXlfaW5jcjsKQEAgLTU5OCw3ICs2MDksNyBAQAogCWJhc2VfYWRkciA9ICgoYmFzZV9hZGRyID4+IDE2KSA8PCAxNik7CiAJYmFzZV9hZGRyIHw9IHN0YXJ0OwogCi0JZGNhY2hlID0gJmNwdV9kYXRhLT5kY2FjaGU7CisJZGNhY2hlID0gJmN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlOwogCWxpbmVzeiA9IGRjYWNoZS0+bGluZXN6OwogCXdheV9pbmNyID0gZGNhY2hlLT53YXlfaW5jcjsKIAl3YXlfc2l6ZSA9IGRjYWNoZS0+d2F5X3NpemU7CkBAIC02NDAsNyArNjUxLDcgQEAKIAliYXNlX2FkZHIgPSAoKGJhc2VfYWRkciA+PiAxNikgPDwgMTYpOwogCWJhc2VfYWRkciB8PSBzdGFydDsKIAotCWRjYWNoZSA9ICZjcHVfZGF0YS0+ZGNhY2hlOworCWRjYWNoZSA9ICZjdXJyZW50X2NwdV9kYXRhLmRjYWNoZTsKIAlsaW5lc3ogPSBkY2FjaGUtPmxpbmVzejsKIAl3YXlfaW5jciA9IGRjYWNoZS0+d2F5X2luY3I7CiAJd2F5X3NpemUgPSBkY2FjaGUtPndheV9zaXplOwpAQCAtNjk5LDcgKzcxMCw3IEBACiAJYmFzZV9hZGRyID0gKChiYXNlX2FkZHIgPj4gMTYpIDw8IDE2KTsKIAliYXNlX2FkZHIgfD0gc3RhcnQ7CiAKLQlkY2FjaGUgPSAmY3B1X2RhdGEtPmRjYWNoZTsKKwlkY2FjaGUgPSAmY3VycmVudF9jcHVfZGF0YS5kY2FjaGU7CiAJbGluZXN6ID0gZGNhY2hlLT5saW5lc3o7CiAJd2F5X2luY3IgPSBkY2FjaGUtPndheV9pbmNyOwogCXdheV9zaXplID0gZGNhY2hlLT53YXlfc2l6ZTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vY2FjaGUtc2g3NzA1LmMgYi9hcmNoL3NoL21tL2NhY2hlLXNoNzcwNS5jCmluZGV4IDA0NWFiZGYuLjMxZjhkZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vY2FjaGUtc2g3NzA1LmMKKysrIGIvYXJjaC9zaC9tbS9jYWNoZS1zaDc3MDUuYwpAQCAtMywxMSArMywxMSBAQAogICoKICAqIENvcHlyaWdodCAoQykgMTk5OSwgMjAwMCAgTmlpYmUgWXV0YWthCiAgKiBDb3B5cmlnaHQgKEMpIDIwMDQgIEFsZXggU29uZworICogQ29weXJpZ2h0IChDKSAyMDA2ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgogICovCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L21tYW4uaD4KQEAgLTMyLDkgKzMyLDkgQEAKIHsKIAl1bnNpZ25lZCBsb25nIHdheXMsIHdheXNpemUsIGFkZHJzdGFydDsKIAotCXdheXMgPSBjcHVfZGF0YS0+ZGNhY2hlLndheXM7Ci0Jd2F5c2l6ZSA9IGNwdV9kYXRhLT5kY2FjaGUuc2V0czsKLQl3YXlzaXplIDw8PSBjcHVfZGF0YS0+ZGNhY2hlLmVudHJ5X3NoaWZ0OworCXdheXMgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS53YXlzOworCXdheXNpemUgPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5zZXRzOworCXdheXNpemUgPDw9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLmVudHJ5X3NoaWZ0OwogCiAJYWRkcnN0YXJ0ID0gQ0FDSEVfT0NfQUREUkVTU19BUlJBWTsKIApAQCAtNDMsNyArNDMsNyBAQAogCiAJCWZvciAoYWRkciA9IGFkZHJzdGFydDsKIAkJICAgICBhZGRyIDwgYWRkcnN0YXJ0ICsgd2F5c2l6ZTsKLQkJICAgICBhZGRyICs9IGNwdV9kYXRhLT5kY2FjaGUubGluZXN6KSB7CisJCSAgICAgYWRkciArPSBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5saW5lc3opIHsKIAkJCXVuc2lnbmVkIGxvbmcgZGF0YTsKIAkJCWludCB2ID0gU0hfQ0FDSEVfVVBEQVRFRCB8IFNIX0NBQ0hFX1ZBTElEOwogCkBAIC01MSwxMCArNTEsOSBAQAogCiAJCQlpZiAoKGRhdGEgJiB2KSA9PSB2KQogCQkJCWN0cmxfb3V0bChkYXRhICYgfnYsIGFkZHIpOwotCiAJCX0KIAotCQlhZGRyc3RhcnQgKz0gY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jcjsKKwkJYWRkcnN0YXJ0ICs9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9pbmNyOwogCX0gd2hpbGUgKC0td2F5cyk7CiB9CiAKQEAgLTk0LDkgKzkzLDkgQEAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJanVtcF90b19QMigpOwogCi0Jd2F5cyA9IGNwdV9kYXRhLT5kY2FjaGUud2F5czsKLQl3YXlzaXplID0gY3B1X2RhdGEtPmRjYWNoZS5zZXRzOwotCXdheXNpemUgPDw9IGNwdV9kYXRhLT5kY2FjaGUuZW50cnlfc2hpZnQ7CisJd2F5cyA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheXM7CisJd2F5c2l6ZSA9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLnNldHM7CisJd2F5c2l6ZSA8PD0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUuZW50cnlfc2hpZnQ7CiAKIAlhZGRyc3RhcnQgPSBDQUNIRV9PQ19BRERSRVNTX0FSUkFZOwogCkBAIC0xMDUsNyArMTA0LDcgQEAKIAogCQlmb3IgKGFkZHIgPSBhZGRyc3RhcnQ7CiAJCSAgICAgYWRkciA8IGFkZHJzdGFydCArIHdheXNpemU7Ci0JCSAgICAgYWRkciArPSBjcHVfZGF0YS0+ZGNhY2hlLmxpbmVzeikgeworCQkgICAgIGFkZHIgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUubGluZXN6KSB7CiAJCQl1bnNpZ25lZCBsb25nIGRhdGE7CiAKIAkJCWRhdGEgPSBjdHJsX2lubChhZGRyKSAmICgweDFmZmZmQzAwIHwgU0hfQ0FDSEVfVkFMSUQpOwpAQCAtMTE1LDcgKzExNCw3IEBACiAJCQl9CiAJCX0KIAotCQlhZGRyc3RhcnQgKz0gY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jcjsKKwkJYWRkcnN0YXJ0ICs9IGN1cnJlbnRfY3B1X2RhdGEuZGNhY2hlLndheV9pbmNyOwogCX0gd2hpbGUgKC0td2F5cyk7CiAKIAliYWNrX3RvX1AxKCk7CkBAIC0xMjgsNyArMTI3LDExIEBACiAgKi8KIHZvaWQgZmx1c2hfZGNhY2hlX3BhZ2Uoc3RydWN0IHBhZ2UgKnBhZ2UpCiB7Ci0JaWYgKHRlc3RfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKSkKKwlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IHBhZ2VfbWFwcGluZyhwYWdlKTsKKworCWlmIChtYXBwaW5nICYmICFtYXBwaW5nX21hcHBlZChtYXBwaW5nKSkKKwkJc2V0X2JpdChQR19kY2FjaGVfZGlydHksICZwYWdlLT5mbGFncyk7CisJZWxzZQogCQlfX2ZsdXNoX2RjYWNoZV9wYWdlKFBIWVNBRERSKHBhZ2VfYWRkcmVzcyhwYWdlKSkpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2ZhdWx0LmMgYi9hcmNoL3NoL21tL2ZhdWx0LmMKaW5kZXggNzE2ZWJmNS4uZmE1ZDdmMCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9mYXVsdC5jCisrKyBiL2FyY2gvc2gvbW0vZmF1bHQuYwpAQCAtMTcsNiArMTcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL2tnZGIuaD4KIAogZXh0ZXJuIHZvaWQgZGllKGNvbnN0IGNoYXIgKixzdHJ1Y3QgcHRfcmVncyAqLGxvbmcpOwpAQCAtMjI0LDMgKzIyNSw4OSBAQAogCWlmICghdXNlcl9tb2RlKHJlZ3MpKQogCQlnb3RvIG5vX2NvbnRleHQ7CiB9CisKKyNpZmRlZiBDT05GSUdfU0hfU1RPUkVfUVVFVUVTCisvKgorICogVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBmb3IgdGhlIFNILTQgc3RvcmUgcXVldWVzLCBhcyBwYWdlcyBmb3IgdGhpcworICogc3BhY2Ugc3RpbGwgbmVlZCB0byBiZSBmYXVsdGVkIGluIGJlZm9yZSBpdCdzIHBvc3NpYmxlIHRvIGZsdXNoIHRoZQorICogc3RvcmUgcXVldWUgY2FjaGUgZm9yIHdyaXRlb3V0IHRvIHRoZSByZW1hcHBlZCByZWdpb24uCisgKi8KKyNkZWZpbmUgUDNfQUREUl9NQVgJCShQNFNFR19TVE9SRV9RVUUgKyAweDA0MDAwMDAwKQorI2Vsc2UKKyNkZWZpbmUgUDNfQUREUl9NQVgJCVA0U0VHCisjZW5kaWYKKworLyoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK2FzbWxpbmthZ2UgaW50IF9fa3Byb2JlcyBfX2RvX3BhZ2VfZmF1bHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJCSB1bnNpZ25lZCBsb25nIHdyaXRlYWNjZXNzLAorCQkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQoreworCXBnZF90ICpwZ2Q7CisJcHVkX3QgKnB1ZDsKKwlwbWRfdCAqcG1kOworCXB0ZV90ICpwdGU7CisJcHRlX3QgZW50cnk7CisJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSBjdXJyZW50LT5tbTsKKwlzcGlubG9ja190ICpwdGw7CisJaW50IHJldCA9IDE7CisKKyNpZmRlZiBDT05GSUdfU0hfS0dEQgorCWlmIChrZ2RiX25vZmF1bHQgJiYga2dkYl9idXNfZXJyX2hvb2spCisJCWtnZGJfYnVzX2Vycl9ob29rKCk7CisjZW5kaWYKKworCS8qCisJICogV2UgZG9uJ3QgdGFrZSBwYWdlIGZhdWx0cyBmb3IgUDEsIFAyLCBhbmQgcGFydHMgb2YgUDQsIHRoZXNlCisJICogYXJlIGFsd2F5cyBtYXBwZWQsIHdoZXRoZXIgaXQgYmUgZHVlIHRvIGxlZ2FjeSBiZWhhdmlvdXIgaW4KKwkgKiAyOS1iaXQgbW9kZSwgb3IgZHVlIHRvIFBNQiBjb25maWd1cmF0aW9uIGluIDMyLWJpdCBtb2RlLgorCSAqLworCWlmIChhZGRyZXNzID49IFAzU0VHICYmIGFkZHJlc3MgPCBQM19BRERSX01BWCkgeworCQlwZ2QgPSBwZ2Rfb2Zmc2V0X2soYWRkcmVzcyk7CisJCW1tID0gTlVMTDsKKwl9IGVsc2UgeworCQlpZiAodW5saWtlbHkoYWRkcmVzcyA+PSBUQVNLX1NJWkUgfHwgIW1tKSkKKwkJCXJldHVybiAxOworCisJCXBnZCA9IHBnZF9vZmZzZXQobW0sIGFkZHJlc3MpOworCX0KKworCXB1ZCA9IHB1ZF9vZmZzZXQocGdkLCBhZGRyZXNzKTsKKwlpZiAocHVkX25vbmVfb3JfY2xlYXJfYmFkKHB1ZCkpCisJCXJldHVybiAxOworCXBtZCA9IHBtZF9vZmZzZXQocHVkLCBhZGRyZXNzKTsKKwlpZiAocG1kX25vbmVfb3JfY2xlYXJfYmFkKHBtZCkpCisJCXJldHVybiAxOworCisJaWYgKG1tKQorCQlwdGUgPSBwdGVfb2Zmc2V0X21hcF9sb2NrKG1tLCBwbWQsIGFkZHJlc3MsICZwdGwpOworCWVsc2UKKwkJcHRlID0gcHRlX29mZnNldF9rZXJuZWwocG1kLCBhZGRyZXNzKTsKKworCWVudHJ5ID0gKnB0ZTsKKwlpZiAodW5saWtlbHkocHRlX25vbmUoZW50cnkpIHx8IHB0ZV9ub3RfcHJlc2VudChlbnRyeSkpKQorCQlnb3RvIHVubG9jazsKKwlpZiAodW5saWtlbHkod3JpdGVhY2Nlc3MgJiYgIXB0ZV93cml0ZShlbnRyeSkpKQorCQlnb3RvIHVubG9jazsKKworCWlmICh3cml0ZWFjY2VzcykKKwkJZW50cnkgPSBwdGVfbWtkaXJ0eShlbnRyeSk7CisJZW50cnkgPSBwdGVfbWt5b3VuZyhlbnRyeSk7CisKKyNpZmRlZiBDT05GSUdfQ1BVX1NINAorCS8qCisJICogSVRMQiBpcyBub3QgYWZmZWN0ZWQgYnkgImxkdGxiIiBpbnN0cnVjdGlvbi4KKwkgKiBTbywgd2UgbmVlZCB0byBmbHVzaCB0aGUgZW50cnkgYnkgb3Vyc2VsdmVzLgorCSAqLworCWxvY2FsX2ZsdXNoX3RsYl9vbmUoZ2V0X2FzaWQoKSwgYWRkcmVzcyAmIFBBR0VfTUFTSyk7CisjZW5kaWYKKworCXNldF9wdGUocHRlLCBlbnRyeSk7CisJdXBkYXRlX21tdV9jYWNoZShOVUxMLCBhZGRyZXNzLCBlbnRyeSk7CisJcmV0ID0gMDsKK3VubG9jazoKKwlpZiAobW0pCisJCXB0ZV91bm1hcF91bmxvY2socHRlLCBwdGwpOworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL2luaXQuYyBiL2FyY2gvc2gvbW0vaW5pdC5jCmluZGV4IGJmMGMyNjMuLmFlOTU3YTkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vaW5pdC5jCisrKyBiL2FyY2gvc2gvbW0vaW5pdC5jCkBAIC0zOSwxMSArMzksNiBAQAogREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF07CiAKLS8qCi0gKiBDYWNoZSBvZiBNTVUgY29udGV4dCBsYXN0IHVzZWQuCi0gKi8KLXVuc2lnbmVkIGxvbmcgbW11X2NvbnRleHRfY2FjaGUgPSBOT19DT05URVhUOwotCiAjaWZkZWYgQ09ORklHX01NVQogLyogSXQnZCBiZSBnb29kIGlmIHRoZXNlIGxpbmVzIHdlcmUgaW4gdGhlIHN0YW5kYXJkIGhlYWRlciBmaWxlLiAqLwogI2RlZmluZSBTVEFSVF9QRk4JKE5PREVfREFUQSgwKS0+YmRhdGEtPm5vZGVfYm9vdF9zdGFydCA+PiBQQUdFX1NISUZUKQpAQCAtMTExLDcgKzEwNiw3IEBACiAKIAlzZXRfcHRlKHB0ZSwgcGZuX3B0ZShwaHlzID4+IFBBR0VfU0hJRlQsIHByb3QpKTsKIAotCV9fZmx1c2hfdGxiX3BhZ2UoZ2V0X2FzaWQoKSwgYWRkcik7CisJZmx1c2hfdGxiX29uZShnZXRfYXNpZCgpLCBhZGRyKTsKIH0KIAogLyoKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vaW9yZW1hcC5jIGIvYXJjaC9zaC9tbS9pb3JlbWFwLmMKaW5kZXggOTBiNDk0YS4uYmUwM2Q3NCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9pb3JlbWFwLmMKKysrIGIvYXJjaC9zaC9tbS9pb3JlbWFwLmMKQEAgLTQ1LDEyICs0NSw2IEBACiAJCXJldHVybiBOVUxMOwogCiAJLyoKLQkgKiBEb24ndCByZW1hcCB0aGUgbG93IFBDSS9JU0EgYXJlYSwgaXQncyBhbHdheXMgbWFwcGVkLi4KLQkgKi8KLQlpZiAocGh5c19hZGRyID49IDB4QTAwMDAgJiYgbGFzdF9hZGRyIDwgMHgxMDAwMDApCi0JCXJldHVybiAodm9pZCBfX2lvbWVtICopcGh5c190b192aXJ0KHBoeXNfYWRkcik7Ci0KLQkvKgogCSAqIElmIHdlJ3JlIG9uIGFuIFNINzc1MSBvciBTSDc3ODAgUENJIGNvbnRyb2xsZXIsIFBDSSBtZW1vcnkgaXMKIAkgKiBtYXBwZWQgYXQgdGhlIGVuZCBvZiB0aGUgYWRkcmVzcyBzcGFjZSAodHlwaWNhbGx5IDB4ZmQwMDAwMDApCiAJICogaW4gYSBub24tdHJhbnNsYXRhYmxlIGFyZWEsIHNvIG1hcHBpbmcgdGhyb3VnaCBwYWdlIHRhYmxlcyBmb3IKZGlmZiAtLWdpdCBhL2FyY2gvc2gvbW0vcGctc2g0LmMgYi9hcmNoL3NoL21tL3BnLXNoNC5jCmluZGV4IDNmOThkMmEuLjk2OWVmZWNlIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL3BnLXNoNC5jCisrKyBiL2FyY2gvc2gvbW0vcGctc2g0LmMKQEAgLTEzLDcgKzEzLDcgQEAKIAogZXh0ZXJuIHN0cnVjdCBtdXRleCBwM21hcF9tdXRleFtdOwogCi0jZGVmaW5lIENBQ0hFX0FMSUFTIChjcHVfZGF0YS0+ZGNhY2hlLmFsaWFzX21hc2spCisjZGVmaW5lIENBQ0hFX0FMSUFTIChjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5hbGlhc19tYXNrKQogCiAvKgogICogY2xlYXJfdXNlcl9wYWdlCkBAIC0yMyw3ICsyMyw2IEBACiAgKi8KIHZvaWQgY2xlYXJfdXNlcl9wYWdlKHZvaWQgKnRvLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHN0cnVjdCBwYWdlICpwYWdlKQogewotCV9fc2V0X2JpdChQR19tYXBwZWQsICZwYWdlLT5mbGFncyk7CiAJaWYgKCgoYWRkcmVzcyBeICh1bnNpZ25lZCBsb25nKXRvKSAmIENBQ0hFX0FMSUFTKSA9PSAwKQogCQljbGVhcl9wYWdlKHRvKTsKIAllbHNlIHsKQEAgLTQwLDcgKzM5LDcgQEAKIAkJbXV0ZXhfbG9jaygmcDNtYXBfbXV0ZXhbKGFkZHJlc3MgJiBDQUNIRV9BTElBUyk+PjEyXSk7CiAJCXNldF9wdGUocHRlLCBlbnRyeSk7CiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJX19mbHVzaF90bGJfcGFnZShnZXRfYXNpZCgpLCBwM19hZGRyKTsKKwkJZmx1c2hfdGxiX29uZShnZXRfYXNpZCgpLCBwM19hZGRyKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQl1cGRhdGVfbW11X2NhY2hlKE5VTEwsIHAzX2FkZHIsIGVudHJ5KTsKIAkJX19jbGVhcl91c2VyX3BhZ2UoKHZvaWQgKilwM19hZGRyLCB0byk7CkBAIC01OSw3ICs1OCw2IEBACiB2b2lkIGNvcHlfdXNlcl9wYWdlKHZvaWQgKnRvLCB2b2lkICpmcm9tLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MsCiAJCSAgICBzdHJ1Y3QgcGFnZSAqcGFnZSkKIHsKLQlfX3NldF9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpOwogCWlmICgoKGFkZHJlc3MgXiAodW5zaWduZWQgbG9uZyl0bykgJiBDQUNIRV9BTElBUykgPT0gMCkKIAkJY29weV9wYWdlKHRvLCBmcm9tKTsKIAllbHNlIHsKQEAgLTc2LDcgKzc0LDcgQEAKIAkJbXV0ZXhfbG9jaygmcDNtYXBfbXV0ZXhbKGFkZHJlc3MgJiBDQUNIRV9BTElBUyk+PjEyXSk7CiAJCXNldF9wdGUocHRlLCBlbnRyeSk7CiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQkJX19mbHVzaF90bGJfcGFnZShnZXRfYXNpZCgpLCBwM19hZGRyKTsKKwkJZmx1c2hfdGxiX29uZShnZXRfYXNpZCgpLCBwM19hZGRyKTsKIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCQl1cGRhdGVfbW11X2NhY2hlKE5VTEwsIHAzX2FkZHIsIGVudHJ5KTsKIAkJX19jb3B5X3VzZXJfcGFnZSgodm9pZCAqKXAzX2FkZHIsIGZyb20sIHRvKTsKQEAgLTg0LDIzICs4MiwzIEBACiAJCW11dGV4X3VubG9jaygmcDNtYXBfbXV0ZXhbKGFkZHJlc3MgJiBDQUNIRV9BTElBUyk+PjEyXSk7CiAJfQogfQotCi0vKgotICogRm9yIFNILTQsIHdlIGhhdmUgb3VyIG93biBpbXBsZW1lbnRhdGlvbiBmb3IgcHRlcF9nZXRfYW5kX2NsZWFyCi0gKi8KLWlubGluZSBwdGVfdCBwdGVwX2dldF9hbmRfY2xlYXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwgcHRlX3QgKnB0ZXApCi17Ci0JcHRlX3QgcHRlID0gKnB0ZXA7Ci0KLQlwdGVfY2xlYXIobW0sIGFkZHIsIHB0ZXApOwotCWlmICghcHRlX25vdF9wcmVzZW50KHB0ZSkpIHsKLQkJdW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKHB0ZSk7Ci0JCWlmIChwZm5fdmFsaWQocGZuKSkgewotCQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwZm5fdG9fcGFnZShwZm4pOwotCQkJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmcgPSBwYWdlX21hcHBpbmcocGFnZSk7Ci0JCQlpZiAoIW1hcHBpbmcgfHwgIW1hcHBpbmdfd3JpdGFibHlfbWFwcGVkKG1hcHBpbmcpKQotCQkJCV9fY2xlYXJfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKTsKLQkJfQotCX0KLQlyZXR1cm4gcHRlOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC9zaC9tbS9wZy1zaDc3MDUuYyBiL2FyY2gvc2gvbW0vcGctc2g3NzA1LmMKaW5kZXggZmY5ZWNlOS4uODg3YWI5ZCAxMDA2NDQKLS0tIGEvYXJjaC9zaC9tbS9wZy1zaDc3MDUuYworKysgYi9hcmNoL3NoL21tL3BnLXNoNzcwNS5jCkBAIC03LDkgKzcsNyBAQAogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCi0gKgogICovCi0KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvbW1hbi5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC00NSwxMyArNDMsMTMgQEAKIAogCQlwID0gX19wYShwMV9iZWdpbik7CiAKLQkgICAgICAgIHdheXMgPSBjcHVfZGF0YS0+ZGNhY2hlLndheXM7CisJICAgICAgICB3YXlzID0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5czsKIAkJYWRkciA9IENBQ0hFX09DX0FERFJFU1NfQVJSQVk7CiAKIAkJZG8gewogCQkJdW5zaWduZWQgbG9uZyBkYXRhOwogCi0JCQlhZGRyIHw9ICh2ICYgY3B1X2RhdGEtPmRjYWNoZS5lbnRyeV9tYXNrKTsKKwkJCWFkZHIgfD0gKHYgJiBjdXJyZW50X2NwdV9kYXRhLmRjYWNoZS5lbnRyeV9tYXNrKTsKIAogCQkJZGF0YSA9IGN0cmxfaW5sKGFkZHIpOwogCQkJaWYgKChkYXRhICYgQ0FDSEVfUEhZU0FERFJfTUFTSykgPT0KQEAgLTYwLDcgKzU4LDcgQEAKIAkJCQljdHJsX291dGwoZGF0YSwgYWRkcik7CiAJCQl9CiAKLQkJCWFkZHIgKz0gY3B1X2RhdGEtPmRjYWNoZS53YXlfaW5jcjsKKwkJCWFkZHIgKz0gY3VycmVudF9jcHVfZGF0YS5kY2FjaGUud2F5X2luY3I7CiAJCX0gd2hpbGUgKC0td2F5cyk7CiAKIAkJcDFfYmVnaW4gKz0gTDFfQ0FDSEVfQllURVM7CkBAIC03Niw3ICs3NCw2IEBACiB7CiAJc3RydWN0IHBhZ2UgKnBhZ2UgPSB2aXJ0X3RvX3BhZ2UodG8pOwogCi0JX19zZXRfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKTsKIAlpZiAoKChhZGRyZXNzIF4gKHVuc2lnbmVkIGxvbmcpdG8pICYgQ0FDSEVfQUxJQVMpID09IDApIHsKIAkJY2xlYXJfcGFnZSh0byk7CiAJCV9fZmx1c2hfd2JhY2tfcmVnaW9uKHRvLCBQQUdFX1NJWkUpOwpAQCAtOTUsMTIgKzkyLDExIEBACiAgKiBAZnJvbTogUDEgYWRkcmVzcwogICogQGFkZHJlc3M6IFUwIGFkZHJlc3MgdG8gYmUgbWFwcGVkCiAgKi8KLXZvaWQgY29weV91c2VyX3BhZ2Uodm9pZCAqdG8sIHZvaWQgKmZyb20sIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgc3RydWN0IHBhZ2UgKnBnKQordm9pZCBjb3B5X3VzZXJfcGFnZSh2b2lkICp0bywgdm9pZCAqZnJvbSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAorCQkgICAgc3RydWN0IHBhZ2UgKnBnKQogewogCXN0cnVjdCBwYWdlICpwYWdlID0gdmlydF90b19wYWdlKHRvKTsKIAotCi0JX19zZXRfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKTsKIAlpZiAoKChhZGRyZXNzIF4gKHVuc2lnbmVkIGxvbmcpdG8pICYgQ0FDSEVfQUxJQVMpID09IDApIHsKIAkJY29weV9wYWdlKHRvLCBmcm9tKTsKIAkJX19mbHVzaF93YmFja19yZWdpb24odG8sIFBBR0VfU0laRSk7CkBAIC0xMTIsMjYgKzEwOCwzIEBACiAJCV9fZmx1c2hfd2JhY2tfcmVnaW9uKHRvLCBQQUdFX1NJWkUpOwogCX0KIH0KLQotLyoKLSAqIEZvciBTSDc3MDUsIHdlIGhhdmUgb3VyIG93biBpbXBsZW1lbnRhdGlvbiBmb3IgcHRlcF9nZXRfYW5kX2NsZWFyCi0gKiBDb3BpZWQgZnJvbSBwZy1zaDQuYwotICovCi1pbmxpbmUgcHRlX3QgcHRlcF9nZXRfYW5kX2NsZWFyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBsb25nIGFkZHIsIHB0ZV90ICpwdGVwKQotewotCXB0ZV90IHB0ZSA9ICpwdGVwOwotCi0JcHRlX2NsZWFyKG1tLCBhZGRyLCBwdGVwKTsKLQlpZiAoIXB0ZV9ub3RfcHJlc2VudChwdGUpKSB7Ci0JCXVuc2lnbmVkIGxvbmcgcGZuID0gcHRlX3BmbihwdGUpOwotCQlpZiAocGZuX3ZhbGlkKHBmbikpIHsKLQkJCXN0cnVjdCBwYWdlICpwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKLQkJCXN0cnVjdCBhZGRyZXNzX3NwYWNlICptYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOwotCQkJaWYgKCFtYXBwaW5nIHx8ICFtYXBwaW5nX3dyaXRhYmx5X21hcHBlZChtYXBwaW5nKSkKLQkJCQlfX2NsZWFyX2JpdChQR19tYXBwZWQsICZwYWdlLT5mbGFncyk7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gcHRlOwotfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL3RsYi1mbHVzaC5jIGIvYXJjaC9zaC9tbS90bGItZmx1c2guYwppbmRleCA3M2VjN2Y2Li5kMmY3YjRhIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL3RsYi1mbHVzaC5jCisrKyBiL2FyY2gvc2gvbW0vdGxiLWZsdXNoLmMKQEAgLTIsMjQgKzIsMjggQEAKICAqIFRMQiBmbHVzaGluZyBvcGVyYXRpb25zIGZvciBTSCB3aXRoIGFuIE1NVS4KICAqCiAgKiAgQ29weXJpZ2h0IChDKSAxOTk5ICBOaWliZSBZdXRha2EKLSAqICBDb3B5cmlnaHQgKEMpIDIwMDMgIFBhdWwgTXVuZHQKKyAqICBDb3B5cmlnaHQgKEMpIDIwMDMgLSAyMDA2ICBQYXVsIE11bmR0CiAgKgogICogVGhpcyBmaWxlIGlzIHN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKICAqIExpY2Vuc2UuICBTZWUgdGhlIGZpbGUgIkNPUFlJTkciIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICAqIGZvciBtb3JlIGRldGFpbHMuCiAgKi8KICNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CisjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KIAotdm9pZCBmbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBwYWdlKQordm9pZCBsb2NhbF9mbHVzaF90bGJfcGFnZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBwYWdlKQogewotCWlmICh2bWEtPnZtX21tICYmIHZtYS0+dm1fbW0tPmNvbnRleHQuaWQgIT0gTk9fQ09OVEVYVCkgeworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAodm1hLT52bV9tbSAmJiBjcHVfY29udGV4dChjcHUsIHZtYS0+dm1fbW0pICE9IE5PX0NPTlRFWFQpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAkJdW5zaWduZWQgbG9uZyBhc2lkOwogCQl1bnNpZ25lZCBsb25nIHNhdmVkX2FzaWQgPSBNTVVfTk9fQVNJRDsKIAotCQlhc2lkID0gdm1hLT52bV9tbS0+Y29udGV4dC5pZCAmIE1NVV9DT05URVhUX0FTSURfTUFTSzsKKwkJYXNpZCA9IGNwdV9hc2lkKGNwdSwgdm1hLT52bV9tbSk7CiAJCXBhZ2UgJj0gUEFHRV9NQVNLOwogCiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKQEAgLTI3LDMzICszMSwzNCBAQAogCQkJc2F2ZWRfYXNpZCA9IGdldF9hc2lkKCk7CiAJCQlzZXRfYXNpZChhc2lkKTsKIAkJfQotCQlfX2ZsdXNoX3RsYl9wYWdlKGFzaWQsIHBhZ2UpOworCQlsb2NhbF9mbHVzaF90bGJfb25lKGFzaWQsIHBhZ2UpOwogCQlpZiAoc2F2ZWRfYXNpZCAhPSBNTVVfTk9fQVNJRCkKIAkJCXNldF9hc2lkKHNhdmVkX2FzaWQpOwogCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAJfQogfQogCi12b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKLQkJICAgICB1bnNpZ25lZCBsb25nIGVuZCkKK3ZvaWQgbG9jYWxfZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJICAgdW5zaWduZWQgbG9uZyBlbmQpCiB7CiAJc3RydWN0IG1tX3N0cnVjdCAqbW0gPSB2bWEtPnZtX21tOworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAobW0tPmNvbnRleHQuaWQgIT0gTk9fQ09OVEVYVCkgeworCWlmIChjcHVfY29udGV4dChjcHUsIG1tKSAhPSBOT19DT05URVhUKSB7CiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJCWludCBzaXplOwogCiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAkJc2l6ZSA9IChlbmQgLSBzdGFydCArIChQQUdFX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVDsKIAkJaWYgKHNpemUgPiAoTU1VX05UTEJfRU5UUklFUy80KSkgeyAvKiBUb28gbWFueSBUTEIgdG8gZmx1c2ggKi8KLQkJCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKKwkJCWNwdV9jb250ZXh0KGNwdSwgbW0pID0gTk9fQ09OVEVYVDsKIAkJCWlmIChtbSA9PSBjdXJyZW50LT5tbSkKLQkJCQlhY3RpdmF0ZV9jb250ZXh0KG1tKTsKKwkJCQlhY3RpdmF0ZV9jb250ZXh0KG1tLCBjcHUpOwogCQl9IGVsc2UgewogCQkJdW5zaWduZWQgbG9uZyBhc2lkOwogCQkJdW5zaWduZWQgbG9uZyBzYXZlZF9hc2lkID0gTU1VX05PX0FTSUQ7CiAKLQkJCWFzaWQgPSBtbS0+Y29udGV4dC5pZCAmIE1NVV9DT05URVhUX0FTSURfTUFTSzsKKwkJCWFzaWQgPSBjcHVfYXNpZChjcHUsIG1tKTsKIAkJCXN0YXJ0ICY9IFBBR0VfTUFTSzsKIAkJCWVuZCArPSAoUEFHRV9TSVpFIC0gMSk7CiAJCQllbmQgJj0gUEFHRV9NQVNLOwpAQCAtNjIsNyArNjcsNyBAQAogCQkJCXNldF9hc2lkKGFzaWQpOwogCQkJfQogCQkJd2hpbGUgKHN0YXJ0IDwgZW5kKSB7Ci0JCQkJX19mbHVzaF90bGJfcGFnZShhc2lkLCBzdGFydCk7CisJCQkJbG9jYWxfZmx1c2hfdGxiX29uZShhc2lkLCBzdGFydCk7CiAJCQkJc3RhcnQgKz0gUEFHRV9TSVpFOwogCQkJfQogCQkJaWYgKHNhdmVkX2FzaWQgIT0gTU1VX05PX0FTSUQpCkBAIC03MiwyNiArNzcsMjcgQEAKIAl9CiB9CiAKLXZvaWQgZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKK3ZvaWQgbG9jYWxfZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKIHsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHNpemU7CiAKIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJc2l6ZSA9IChlbmQgLSBzdGFydCArIChQQUdFX1NJWkUgLSAxKSkgPj4gUEFHRV9TSElGVDsKIAlpZiAoc2l6ZSA+IChNTVVfTlRMQl9FTlRSSUVTLzQpKSB7IC8qIFRvbyBtYW55IFRMQiB0byBmbHVzaCAqLwotCQlmbHVzaF90bGJfYWxsKCk7CisJCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKTsKIAl9IGVsc2UgewogCQl1bnNpZ25lZCBsb25nIGFzaWQ7CiAJCXVuc2lnbmVkIGxvbmcgc2F2ZWRfYXNpZCA9IGdldF9hc2lkKCk7CiAKLQkJYXNpZCA9IGluaXRfbW0uY29udGV4dC5pZCAmIE1NVV9DT05URVhUX0FTSURfTUFTSzsKKwkJYXNpZCA9IGNwdV9hc2lkKGNwdSwgJmluaXRfbW0pOwogCQlzdGFydCAmPSBQQUdFX01BU0s7CiAJCWVuZCArPSAoUEFHRV9TSVpFIC0gMSk7CiAJCWVuZCAmPSBQQUdFX01BU0s7CiAJCXNldF9hc2lkKGFzaWQpOwogCQl3aGlsZSAoc3RhcnQgPCBlbmQpIHsKLQkJCV9fZmx1c2hfdGxiX3BhZ2UoYXNpZCwgc3RhcnQpOworCQkJbG9jYWxfZmx1c2hfdGxiX29uZShhc2lkLCBzdGFydCk7CiAJCQlzdGFydCArPSBQQUdFX1NJWkU7CiAJCX0KIAkJc2V0X2FzaWQoc2F2ZWRfYXNpZCk7CkBAIC05OSwyMiArMTA1LDI0IEBACiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQogCi12b2lkIGZsdXNoX3RsYl9tbShzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3ZvaWQgbG9jYWxfZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogeworCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKIAkvKiBJbnZhbGlkYXRlIGFsbCBUTEIgb2YgdGhpcyBwcm9jZXNzLiAqLwogCS8qIEluc3RlYWQgb2YgaW52YWxpZGF0aW5nIGVhY2ggVExCLCB3ZSBnZXQgbmV3IE1NVSBjb250ZXh0LiAqLwotCWlmIChtbS0+Y29udGV4dC5pZCAhPSBOT19DT05URVhUKSB7CisJaWYgKGNwdV9jb250ZXh0KGNwdSwgbW0pICE9IE5PX0NPTlRFWFQpIHsKIAkJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKKwkJY3B1X2NvbnRleHQoY3B1LCBtbSkgPSBOT19DT05URVhUOwogCQlpZiAobW0gPT0gY3VycmVudC0+bW0pCi0JCQlhY3RpdmF0ZV9jb250ZXh0KG1tKTsKKwkJCWFjdGl2YXRlX2NvbnRleHQobW0sIGNwdSk7CiAJCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAl9CiB9CiAKLXZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQordm9pZCBsb2NhbF9mbHVzaF90bGJfYWxsKHZvaWQpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFncywgc3RhdHVzOwogCkBAIC0xMzIsMyArMTQwLDU0IEBACiAJY3RybF9iYXJyaWVyKCk7CiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogfQorCit2b2lkIHVwZGF0ZV9tbXVfY2FjaGUoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgcHRlKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBwdGV2YWw7CisJdW5zaWduZWQgbG9uZyB2cG47CisJc3RydWN0IHBhZ2UgKnBhZ2U7CisJdW5zaWduZWQgbG9uZyBwZm4gPSBwdGVfcGZuKHB0ZSk7CisJc3RydWN0IGFkZHJlc3Nfc3BhY2UgKm1hcHBpbmc7CisKKwlpZiAoIXBmbl92YWxpZChwZm4pKQorCQlyZXR1cm47CisKKwlwYWdlID0gcGZuX3RvX3BhZ2UocGZuKTsKKwltYXBwaW5nID0gcGFnZV9tYXBwaW5nKHBhZ2UpOworCWlmIChtYXBwaW5nKSB7CisJCXVuc2lnbmVkIGxvbmcgcGh5cyA9IHB0ZV92YWwocHRlKSAmIFBURV9QSFlTX01BU0s7CisJCWludCBkaXJ0eSA9IHRlc3RfYW5kX2NsZWFyX2JpdChQR19kY2FjaGVfZGlydHksICZwYWdlLT5mbGFncyk7CisKKwkJaWYgKGRpcnR5KQorCQkJX19mbHVzaF93YmFja19yZWdpb24oKHZvaWQgKilQMVNFR0FERFIocGh5cyksCisJCQkJCSAgICAgUEFHRV9TSVpFKTsKKwl9CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwkvKiBTZXQgUFRFSCByZWdpc3RlciAqLworCXZwbiA9IChhZGRyZXNzICYgTU1VX1ZQTl9NQVNLKSB8IGdldF9hc2lkKCk7CisJY3RybF9vdXRsKHZwbiwgTU1VX1BURUgpOworCisJcHRldmFsID0gcHRlX3ZhbChwdGUpOworCisjaWZkZWYgQ09ORklHX0NQVV9IQVNfUFRFQQorCS8qIFNldCBQVEVBIHJlZ2lzdGVyICovCisJLyogVE9ETzogbWFrZSB0aGlzIGxvb2sgbGVzcyBoYWNreSAqLworCWN0cmxfb3V0bCgoKHB0ZXZhbCA+PiAyOCkgJiAweGUpIHwgKHB0ZXZhbCAmIDB4MSksIE1NVV9QVEVBKTsKKyNlbmRpZgorCisJLyogU2V0IFBURUwgcmVnaXN0ZXIgKi8KKwlwdGV2YWwgJj0gX1BBR0VfRkxBR1NfSEFSRFdBUkVfTUFTSzsgLyogZHJvcCBzb2Z0d2FyZSBmbGFncyAqLworI2lmIGRlZmluZWQoQ09ORklHX1NIX1dSSVRFVEhST1VHSCkgJiYgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkKKwlwdGV2YWwgfD0gX1BBR0VfV1Q7CisjZW5kaWYKKwkvKiBjb252ZW5pZW50bHksIHdlIHdhbnQgYWxsIHRoZSBzb2Z0d2FyZSBmbGFncyB0byBiZSAwIGFueXdheSAqLworCWN0cmxfb3V0bChwdGV2YWwsIE1NVV9QVEVMKTsKKworCS8qIExvYWQgdGhlIFRMQiAqLworCWFzbSB2b2xhdGlsZSgibGR0bGIiOiAvKiBubyBvdXRwdXQgKi8gOiAvKiBubyBpbnB1dCAqLyA6ICJtZW1vcnkiKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL3RsYi1ub21tdS5jIGIvYXJjaC9zaC9tbS90bGItbm9tbXUuYwppbmRleCBlNTVjZmVhLi4xY2NjYTdjIDEwMDY0NAotLS0gYS9hcmNoL3NoL21tL3RsYi1ub21tdS5jCisrKyBiL2FyY2gvc2gvbW0vdGxiLW5vbW11LmMKQEAgLTEzLDM5ICsxMywzMyBAQAogLyoKICAqIE5vdGhpbmcgdG9vIHRlcnJpYmx5IGV4Y2l0aW5nIGhlcmUgLi4KICAqLwotCi12b2lkIGZsdXNoX3RsYih2b2lkKQordm9pZCBsb2NhbF9mbHVzaF90bGJfYWxsKHZvaWQpCiB7CiAJQlVHKCk7CiB9CiAKLXZvaWQgZmx1c2hfdGxiX2FsbCh2b2lkKQordm9pZCBsb2NhbF9mbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pCiB7CiAJQlVHKCk7CiB9CiAKLXZvaWQgZmx1c2hfdGxiX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCUJVRygpOwotfQotCi12b2lkIGZsdXNoX3RsYl9yYW5nZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBzdGFydCwKK3ZvaWQgbG9jYWxfZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCUJVRygpOwogfQogCi12b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBhZ2UpCit2b2lkIGxvY2FsX2ZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBhZ2UpCiB7CiAJQlVHKCk7CiB9CiAKLXZvaWQgX19mbHVzaF90bGJfcGFnZSh1bnNpZ25lZCBsb25nIGFzaWQsIHVuc2lnbmVkIGxvbmcgcGFnZSkKK3ZvaWQgbG9jYWxfZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nIGFzaWQsIHVuc2lnbmVkIGxvbmcgcGFnZSkKIHsKIAlCVUcoKTsKIH0KIAotdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQordm9pZCBsb2NhbF9mbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCUJVRygpOwogfQpAQCAtNTUsNCArNDksMyBAQAogewogCUJVRygpOwogfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL3RsYi1zaDMuYyBiL2FyY2gvc2gvbW0vdGxiLXNoMy5jCmluZGV4IDQ2YjA5ZTIuLmU1ZTc2ZWIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vdGxiLXNoMy5jCisrKyBiL2FyY2gvc2gvbW0vdGxiLXNoMy5jCkBAIC04LDcxICs4LDExIEBACiAgKgogICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKLXZvaWQgdXBkYXRlX21tdV9jYWNoZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgcHRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBwdGV2YWw7Ci0JdW5zaWduZWQgbG9uZyB2cG47Ci0KLQkvKiBQdHJhY2UgbWF5IGNhbGwgdGhpcyByb3V0aW5lLiAqLwotCWlmICh2bWEgJiYgY3VycmVudC0+YWN0aXZlX21tICE9IHZtYS0+dm1fbW0pCi0JCXJldHVybjsKLQotI2lmIGRlZmluZWQoQ09ORklHX1NINzcwNV9DQUNIRV8zMktCKQotCXsKLQkJc3RydWN0IHBhZ2UgKnBhZ2UgPSBwdGVfcGFnZShwdGUpOwotCQl1bnNpZ25lZCBsb25nIHBmbiA9IHB0ZV9wZm4ocHRlKTsKLQotCQlpZiAocGZuX3ZhbGlkKHBmbikgJiYgIXRlc3RfYml0KFBHX21hcHBlZCwgJnBhZ2UtPmZsYWdzKSkgewotCQkJdW5zaWduZWQgbG9uZyBwaHlzID0gcHRlX3ZhbChwdGUpICYgUFRFX1BIWVNfTUFTSzsKLQotCQkJX19mbHVzaF93YmFja19yZWdpb24oKHZvaWQgKilQMVNFR0FERFIocGh5cyksCi0JCQkJCSAgICAgUEFHRV9TSVpFKTsKLQkJCV9fc2V0X2JpdChQR19tYXBwZWQsICZwYWdlLT5mbGFncyk7Ci0JCX0KLQl9Ci0jZW5kaWYKLQotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQotCS8qIFNldCBQVEVIIHJlZ2lzdGVyICovCi0JdnBuID0gKGFkZHJlc3MgJiBNTVVfVlBOX01BU0spIHwgZ2V0X2FzaWQoKTsKLQljdHJsX291dGwodnBuLCBNTVVfUFRFSCk7Ci0KLQlwdGV2YWwgPSBwdGVfdmFsKHB0ZSk7Ci0KLQkvKiBTZXQgUFRFTCByZWdpc3RlciAqLwotCXB0ZXZhbCAmPSBfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLOyAvKiBkcm9wIHNvZnR3YXJlIGZsYWdzICovCi0JLyogY29udmVuaWVudGx5LCB3ZSB3YW50IGFsbCB0aGUgc29mdHdhcmUgZmxhZ3MgdG8gYmUgMCBhbnl3YXkgKi8KLQljdHJsX291dGwocHRldmFsLCBNTVVfUFRFTCk7Ci0KLQkvKiBMb2FkIHRoZSBUTEIgKi8KLQlhc20gdm9sYXRpbGUoImxkdGxiIjogLyogbm8gb3V0cHV0ICovIDogLyogbm8gaW5wdXQgKi8gOiAibWVtb3J5Iik7Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi12b2lkIF9fZmx1c2hfdGxiX3BhZ2UodW5zaWduZWQgbG9uZyBhc2lkLCB1bnNpZ25lZCBsb25nIHBhZ2UpCit2b2lkIGxvY2FsX2ZsdXNoX3RsYl9vbmUodW5zaWduZWQgbG9uZyBhc2lkLCB1bnNpZ25lZCBsb25nIHBhZ2UpCiB7CiAJdW5zaWduZWQgbG9uZyBhZGRyLCBkYXRhOwogCWludCBpLCB3YXlzID0gTU1VX05UTEJfV0FZUzsKQEAgLTg2LDcgKzI2LDcgQEAKIAlhZGRyID0gTU1VX1RMQl9BRERSRVNTX0FSUkFZIHwgKHBhZ2UgJiAweDFGMDAwKTsKIAlkYXRhID0gKHBhZ2UgJiAweGZmZmUwMDAwKSB8IGFzaWQ7IC8qIFZBTElEIGJpdCBpcyBvZmYgKi8KIAotCWlmICgoY3B1X2RhdGEtPmZsYWdzICYgQ1BVX0hBU19NTVVfUEFHRV9BU1NPQykpIHsKKwlpZiAoKGN1cnJlbnRfY3B1X2RhdGEuZmxhZ3MgJiBDUFVfSEFTX01NVV9QQUdFX0FTU09DKSkgewogCQlhZGRyIHw9IE1NVV9QQUdFX0FTU09DX0JJVDsKIAkJd2F5cyA9IDE7CS8qIHdlIGFscmVhZHkga25vdyB0aGUgd2F5IC4uICovCiAJfQpAQCAtOTQsNCArMzQsMyBAQAogCWZvciAoaSA9IDA7IGkgPCB3YXlzOyBpKyspCiAJCWN0cmxfb3V0bChkYXRhLCBhZGRyICsgKGkgPDwgOCkpOwogfQotCmRpZmYgLS1naXQgYS9hcmNoL3NoL21tL3RsYi1zaDQuYyBiL2FyY2gvc2gvbW0vdGxiLXNoNC5jCmluZGV4IDgxMmIyZDUuLjIyMWU3MDkgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvbW0vdGxiLXNoNC5jCisrKyBiL2FyY2gvc2gvbW0vdGxiLXNoNC5jCkBAIC04LDc2ICs4LDExIEBACiAgKgogICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgotI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+Ci0jaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KLSNpbmNsdWRlIDxsaW51eC9zbXAuaD4KLSNpbmNsdWRlIDxsaW51eC9zbXBfbG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgotCisjaW5jbHVkZSA8bGludXgvaW8uaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2lvLmg+Ci0jaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KLSNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgogI2luY2x1ZGUgPGFzbS9tbXVfY29udGV4dC5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAKLXZvaWQgdXBkYXRlX21tdV9jYWNoZShzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKiB2bWEsCi0JCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgcHRlX3QgcHRlKQotewotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JdW5zaWduZWQgbG9uZyBwdGV2YWw7Ci0JdW5zaWduZWQgbG9uZyB2cG47Ci0Jc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyBwZm47Ci0KLQkvKiBQdHJhY2UgbWF5IGNhbGwgdGhpcyByb3V0aW5lLiAqLwotCWlmICh2bWEgJiYgY3VycmVudC0+YWN0aXZlX21tICE9IHZtYS0+dm1fbW0pCi0JCXJldHVybjsKLQotCXBmbiA9IHB0ZV9wZm4ocHRlKTsKLQlpZiAocGZuX3ZhbGlkKHBmbikpIHsKLQkJcGFnZSA9IHBmbl90b19wYWdlKHBmbik7Ci0JCWlmICghdGVzdF9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpKSB7Ci0JCQl1bnNpZ25lZCBsb25nIHBoeXMgPSBwdGVfdmFsKHB0ZSkgJiBQVEVfUEhZU19NQVNLOwotCQkJX19mbHVzaF93YmFja19yZWdpb24oKHZvaWQgKilQMVNFR0FERFIocGh5cyksIFBBR0VfU0laRSk7Ci0JCQlfX3NldF9iaXQoUEdfbWFwcGVkLCAmcGFnZS0+ZmxhZ3MpOwotCQl9Ci0JfQotCi0JbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCi0JLyogU2V0IFBURUggcmVnaXN0ZXIgKi8KLQl2cG4gPSAoYWRkcmVzcyAmIE1NVV9WUE5fTUFTSykgfCBnZXRfYXNpZCgpOwotCWN0cmxfb3V0bCh2cG4sIE1NVV9QVEVIKTsKLQotCXB0ZXZhbCA9IHB0ZV92YWwocHRlKTsKLQotCS8qIFNldCBQVEVBIHJlZ2lzdGVyICovCi0JaWYgKGNwdV9kYXRhLT5mbGFncyAmIENQVV9IQVNfUFRFQSkKLQkJLyogVE9ETzogbWFrZSB0aGlzIGxvb2sgbGVzcyBoYWNreSAqLwotCQljdHJsX291dGwoKChwdGV2YWwgPj4gMjgpICYgMHhlKSB8IChwdGV2YWwgJiAweDEpLCBNTVVfUFRFQSk7Ci0KLQkvKiBTZXQgUFRFTCByZWdpc3RlciAqLwotCXB0ZXZhbCAmPSBfUEFHRV9GTEFHU19IQVJEV0FSRV9NQVNLOyAvKiBkcm9wIHNvZnR3YXJlIGZsYWdzICovCi0jaWZkZWYgQ09ORklHX1NIX1dSSVRFVEhST1VHSAotCXB0ZXZhbCB8PSBfUEFHRV9XVDsKLSNlbmRpZgotCS8qIGNvbnZlbmllbnRseSwgd2Ugd2FudCBhbGwgdGhlIHNvZnR3YXJlIGZsYWdzIHRvIGJlIDAgYW55d2F5ICovCi0JY3RybF9vdXRsKHB0ZXZhbCwgTU1VX1BURUwpOwotCi0JLyogTG9hZCB0aGUgVExCICovCi0JYXNtIHZvbGF0aWxlKCJsZHRsYiI6IC8qIG5vIG91dHB1dCAqLyA6IC8qIG5vIGlucHV0ICovIDogIm1lbW9yeSIpOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLX0KLQotdm9pZCBfX2ZsdXNoX3RsYl9wYWdlKHVuc2lnbmVkIGxvbmcgYXNpZCwgdW5zaWduZWQgbG9uZyBwYWdlKQordm9pZCBsb2NhbF9mbHVzaF90bGJfb25lKHVuc2lnbmVkIGxvbmcgYXNpZCwgdW5zaWduZWQgbG9uZyBwYWdlKQogewogCXVuc2lnbmVkIGxvbmcgYWRkciwgZGF0YTsKIApAQCAtOTMsNCArMjgsMyBAQAogCWN0cmxfb3V0bChkYXRhLCBhZGRyKTsKIAliYWNrX3RvX1AxKCk7CiB9Ci0KZGlmZiAtLWdpdCBhL2FyY2gvc2gvb3Byb2ZpbGUvb3BfbW9kZWxfc2g3NzUwLmMgYi9hcmNoL3NoL29wcm9maWxlL29wX21vZGVsX3NoNzc1MC5jCmluZGV4IDAxMDRlNDQuLmViZWU3ZTIgMTAwNjQ0Ci0tLSBhL2FyY2gvc2gvb3Byb2ZpbGUvb3BfbW9kZWxfc2g3NzUwLmMKKysrIGIvYXJjaC9zaC9vcHJvZmlsZS9vcF9tb2RlbF9zaDc3NTAuYwpAQCAtMjU5LDcgKzI1OSw3IEBACiAKIGludCBfX2luaXQgb3Byb2ZpbGVfYXJjaF9pbml0KHN0cnVjdCBvcHJvZmlsZV9vcGVyYXRpb25zICoqb3BzKQogewotCWlmICghKGNwdV9kYXRhLT5mbGFncyAmIENQVV9IQVNfUEVSRl9DT1VOVEVSKSkKKwlpZiAoIShjdXJyZW50X2NwdV9kYXRhLmZsYWdzICYgQ1BVX0hBU19QRVJGX0NPVU5URVIpKQogCQlyZXR1cm4gLUVOT0RFVjsKIAogCXNoNzc1MF9wZXJmX2NvdW50ZXJfb3BzLmNwdV90eXBlID0gKGNoYXIgKilnZXRfY3B1X3N1YnR5cGUoKTsKZGlmZiAtLWdpdCBhL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcyBiL2FyY2gvc2gvdG9vbHMvbWFjaC10eXBlcwppbmRleCAwNTcxNzU1Li40ZmUwZjk0IDEwMDY0NAotLS0gYS9hcmNoL3NoL3Rvb2xzL21hY2gtdHlwZXMKKysrIGIvYXJjaC9zaC90b29scy9tYWNoLXR5cGVzCkBAIC0xNiw3ICsxNiw2IEBACiBIRDY0NDY1CQkJSEQ2NDQ2NQogU0FUVVJOCQkJU0hfU0FUVVJOCiBEUkVBTUNBU1QJCVNIX0RSRUFNQ0FTVAotQklHU1VSCQkJU0hfQklHU1VSCiBNUEMxMjExCQkJU0hfTVBDMTIxMQogU05BUEdFQVIJCVNIX1NFQ1VSRUVER0U1NDEwCiBIUzc3NTFSVk9JUAkJU0hfSFM3NzUxUlZPSVAKZGlmZiAtLWdpdCBhL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYyBiL2FyY2gvdW0vb3MtTGludXgvc2lnaW8uYwppbmRleCA5MjVhNjUyLi5iMmUxZmQ4IDEwMDY0NAotLS0gYS9hcmNoL3VtL29zLUxpbnV4L3NpZ2lvLmMKKysrIGIvYXJjaC91bS9vcy1MaW51eC9zaWdpby5jCkBAIC05NywyMCArOTcsMjIgQEAKIAogc3RhdGljIGludCBuZWVkX3BvbGwoc3RydWN0IHBvbGxmZHMgKnBvbGxzLCBpbnQgbikKIHsKLQlpZihuIDw9IHBvbGxzLT5zaXplKXsKLQkJcG9sbHMtPnVzZWQgPSBuOworCXN0cnVjdCBwb2xsZmQgKm5ldzsKKworCWlmKG4gPD0gcG9sbHMtPnNpemUpCiAJCXJldHVybiAwOwotCX0KLQlrZnJlZShwb2xscy0+cG9sbCk7Ci0JcG9sbHMtPnBvbGwgPSB1bV9rbWFsbG9jX2F0b21pYyhuICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKLQlpZihwb2xscy0+cG9sbCA9PSBOVUxMKXsKKworCW5ldyA9IHVtX2ttYWxsb2NfYXRvbWljKG4gKiBzaXplb2Yoc3RydWN0IHBvbGxmZCkpOworCWlmKG5ldyA9PSBOVUxMKXsKIAkJcHJpbnRrKCJuZWVkX3BvbGwgOiBmYWlsZWQgdG8gYWxsb2NhdGUgbmV3IHBvbGxmZHNcbiIpOwotCQlwb2xscy0+c2l6ZSA9IDA7Ci0JCXBvbGxzLT51c2VkID0gMDsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQorCisJbWVtY3B5KG5ldywgcG9sbHMtPnBvbGwsIHBvbGxzLT51c2VkICogc2l6ZW9mKHN0cnVjdCBwb2xsZmQpKTsKKwlrZnJlZShwb2xscy0+cG9sbCk7CisKKwlwb2xscy0+cG9sbCA9IG5ldzsKIAlwb2xscy0+c2l6ZSA9IG47Ci0JcG9sbHMtPnVzZWQgPSBuOwogCXJldHVybiAwOwogfQogCkBAIC0xNzEsMTUgKzE3MywxNSBAQAogCQkJZ290byBvdXQ7CiAJfQogCi0JbiA9IGN1cnJlbnRfcG9sbC51c2VkICsgMTsKLQllcnIgPSBuZWVkX3BvbGwoJm5leHRfcG9sbCwgbik7CisJbiA9IGN1cnJlbnRfcG9sbC51c2VkOworCWVyciA9IG5lZWRfcG9sbCgmbmV4dF9wb2xsLCBuICsgMSk7CiAJaWYoZXJyKQogCQlnb3RvIG91dDsKIAotCWZvcihpID0gMDsgaSA8IGN1cnJlbnRfcG9sbC51c2VkOyBpKyspCi0JCW5leHRfcG9sbC5wb2xsW2ldID0gY3VycmVudF9wb2xsLnBvbGxbaV07Ci0KLQluZXh0X3BvbGwucG9sbFtuIC0gMV0gPSAqcDsKKwltZW1jcHkobmV4dF9wb2xsLnBvbGwsIGN1cnJlbnRfcG9sbC5wb2xsLAorCSAgICAgICBjdXJyZW50X3BvbGwudXNlZCAqIHNpemVvZihzdHJ1Y3QgcG9sbGZkKSk7CisJbmV4dF9wb2xsLnBvbGxbbl0gPSAqcDsKKwluZXh0X3BvbGwudXNlZCA9IG4gKyAxOwogCXVwZGF0ZV90aHJlYWQoKTsKICBvdXQ6CiAJc2lnaW9fdW5sb2NrKCk7CkBAIC0yMTQsNiArMjE2LDcgQEAKIAkJaWYocC0+ZmQgIT0gZmQpCiAJCQluZXh0X3BvbGwucG9sbFtuKytdID0gKnA7CiAJfQorCW5leHRfcG9sbC51c2VkID0gY3VycmVudF9wb2xsLnVzZWQgLSAxOwogCiAJdXBkYXRlX3RocmVhZCgpOwogIG91dDoKQEAgLTMzMSwxMCArMzM0LDkgQEAKIAogCXNpZ2lvX2xvY2soKTsKIAllcnIgPSBuZWVkX3BvbGwoJmFsbF9zaWdpb19mZHMsIGFsbF9zaWdpb19mZHMudXNlZCArIDEpOwotCWlmKGVycil7Ci0JCXByaW50aygibWF5YmVfc2lnaW9fYnJva2VuIC0gZmFpbGVkIHRvIGFkZCBwb2xsZmRcbiIpOworCWlmKGVycikKIAkJZ290byBvdXQ7Ci0JfQorCiAJYWxsX3NpZ2lvX2Zkcy5wb2xsW2FsbF9zaWdpb19mZHMudXNlZCsrXSA9CiAJCSgoc3RydWN0IHBvbGxmZCkgeyAuZmQgIAk9IGZkLAogCQkJCSAgIC5ldmVudHMgCT0gcmVhZCA/IFBPTExJTiA6IFBPTExPVVQsCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9LY29uZmlnIGIvYXJjaC94ODZfNjQvS2NvbmZpZwppbmRleCA3OTgyY2JjLi41NmViMTRjIDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9LY29uZmlnCisrKyBiL2FyY2gveDg2XzY0L0tjb25maWcKQEAgLTI0LDYgKzI0LDE0IEBACiAJYm9vbAogCWRlZmF1bHQgeQogCitjb25maWcgR0VORVJJQ19USU1FCisJYm9vbAorCWRlZmF1bHQgeQorCitjb25maWcgR0VORVJJQ19USU1FX1ZTWVNDQUxMCisJYm9vbAorCWRlZmF1bHQgeQorCiBjb25maWcgWk9ORV9ETUEzMgogCWJvb2wKIAlkZWZhdWx0IHkKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveDg2XzY0L2tlcm5lbC9NYWtlZmlsZQppbmRleCBhZTM5OTQ1Li5iYjQ3ZTg2IDEwMDY0NAotLS0gYS9hcmNoL3g4Nl82NC9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL01ha2VmaWxlCkBAIC04LDcgKzgsNyBAQAogCQlwdHJhY2UubyB0aW1lLm8gaW9wb3J0Lm8gbGR0Lm8gc2V0dXAubyBpODI1OS5vIHN5c194ODZfNjQubyBcCiAJCXg4NjY0X2tzeW1zLm8gaTM4Ny5vIHN5c2NhbGwubyB2c3lzY2FsbC5vIFwKIAkJc2V0dXA2NC5vIGJvb3RmbGFnLm8gZTgyMC5vIHJlYm9vdC5vIHF1aXJrcy5vIGk4MjM3Lm8gXAotCQlwY2ktZG1hLm8gcGNpLW5vbW11Lm8gYWx0ZXJuYXRpdmUubworCQlwY2ktZG1hLm8gcGNpLW5vbW11Lm8gYWx0ZXJuYXRpdmUubyBocGV0Lm8gdHNjLm8KIAogb2JqLSQoQ09ORklHX1NUQUNLVFJBQ0UpCSs9IHN0YWNrdHJhY2Uubwogb2JqLSQoQ09ORklHX1g4Nl9NQ0UpCQkrPSBtY2UubyB0aGVybV90aHJvdC5vCkBAIC0xOSw3ICsxOSw3IEBACiBvYmotJChDT05GSUdfWDg2X01TUikJCSs9IG1zci5vCiBvYmotJChDT05GSUdfTUlDUk9DT0RFKQkJKz0gbWljcm9jb2RlLm8KIG9iai0kKENPTkZJR19YODZfQ1BVSUQpCQkrPSBjcHVpZC5vCi1vYmotJChDT05GSUdfU01QKQkJKz0gc21wLm8gc21wYm9vdC5vIHRyYW1wb2xpbmUubworb2JqLSQoQ09ORklHX1NNUCkJCSs9IHNtcC5vIHNtcGJvb3QubyB0cmFtcG9saW5lLm8gdHNjX3N5bmMubwogb2JqLXkJCQkJKz0gYXBpYy5vICBubWkubwogb2JqLXkJCQkJKz0gaW9fYXBpYy5vIG1wcGFyc2UubyBcCiAJCWdlbmFwaWMubyBnZW5hcGljX2NsdXN0ZXIubyBnZW5hcGljX2ZsYXQubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9hcGljLmMKaW5kZXggMTI0YjJkMi4uNzIzNDE3ZCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2FwaWMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvYXBpYy5jCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8YXNtL2lkbGUuaD4KICNpbmNsdWRlIDxhc20vcHJvdG8uaD4KICNpbmNsdWRlIDxhc20vdGltZXguaD4KKyNpbmNsdWRlIDxhc20vaHBldC5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAKIGludCBhcGljX21hcHBlZDsKQEAgLTc2Myw3ICs3NjQsNyBAQAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAogCS8qIHdhaXQgZm9yIGlycSBzbGljZSAqLwotIAlpZiAodnh0aW1lLmhwZXRfYWRkcmVzcyAmJiBocGV0X3VzZV90aW1lcikgeworIAlpZiAoaHBldF9hZGRyZXNzICYmIGhwZXRfdXNlX3RpbWVyKSB7CiAgCQlpbnQgdHJpZ2dlciA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApOwogIAkJd2hpbGUgKGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKSA+PSB0cmlnZ2VyKQogIAkJCS8qIGRvIG5vdGhpbmcgKi8gOwpAQCAtNzg1LDcgKzc4Niw3IEBACiAJLyogVHVybiBvZmYgUElUIGludGVycnVwdCBpZiB3ZSB1c2UgQVBJQyB0aW1lciBhcyBtYWluIHRpbWVyLgogCSAgIE9ubHkgd29ya3Mgd2l0aCB0aGUgUE0gdGltZXIgcmlnaHQgbm93CiAJICAgVEJEIGZpeCBpdCBmb3IgSFBFVCB0b28uICovCi0JaWYgKHZ4dGltZS5tb2RlID09IFZYVElNRV9QTVRNUiAmJgorCWlmICgocG10bXJfaW9wb3J0ICE9IDApICYmCiAJCXNtcF9wcm9jZXNzb3JfaWQoKSA9PSBib290X2NwdV9pZCAmJgogCQlhcGljX3J1bnNfbWFpbl90aW1lciA9PSAxICYmCiAJCSFjcHVfaXNzZXQoYm9vdF9jcHVfaWQsIHRpbWVyX2ludGVycnVwdF9icm9hZGNhc3RfaXBpX21hc2spKSB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHktcXVpcmtzLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvZWFybHktcXVpcmtzLmMKaW5kZXggYmQzMGQxMy4uODA0N2VhOCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2Vhcmx5LXF1aXJrcy5jCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9lYXJseS1xdWlya3MuYwpAQCAtNTMsNyArNTMsOSBAQAogCQlyZXR1cm47CiAKIAludmlkaWFfaHBldF9kZXRlY3RlZCA9IDA7Ci0JYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19IUEVULCBudmlkaWFfaHBldF9jaGVjayk7CisJaWYgKGFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfSFBFVCwgbnZpZGlhX2hwZXRfY2hlY2spKQorCQlyZXR1cm47CisKIAlpZiAobnZpZGlhX2hwZXRfZGV0ZWN0ZWQgPT0gMCkgewogCQlhY3BpX3NraXBfdGltZXJfb3ZlcnJpZGUgPSAxOwogCQlwcmludGsoS0VSTl9JTkZPICJOdmlkaWEgYm9hcmQgIgpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2hwZXQuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ocGV0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVhMGVkZAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC9ocGV0LmMKQEAgLTAsMCArMSw1MTEgQEAKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorI2luY2x1ZGUgPGxpbnV4L2FjcGkuaD4KKyNpbmNsdWRlIDxsaW51eC9ocGV0Lmg+CisjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KKyNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KKyNpbmNsdWRlIDxhc20vdGltZXguaD4KKyNpbmNsdWRlIDxhc20vaHBldC5oPgorCitpbnQgbm9ocGV0IF9faW5pdGRhdGE7CisKK3Vuc2lnbmVkIGxvbmcgaHBldF9hZGRyZXNzOwordW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsJLyogZnNlY3MgLyBIUEVUIGNsb2NrICovCit1bnNpZ25lZCBsb25nIGhwZXRfdGljazsJLyogSFBFVCBjbG9ja3MgLyBpbnRlcnJ1cHQgKi8KKworaW50IGhwZXRfdXNlX3RpbWVyOwkJLyogVXNlIGNvdW50ZXIgb2YgaHBldCBmb3IgdGltZSBrZWVwaW5nLAorCQkJCSAqIG90aGVyd2lzZSBQSVQKKwkJCQkgKi8KKworI2lmZGVmCUNPTkZJR19IUEVUCitzdGF0aWMgX19pbml0IGludCBsYXRlX2hwZXRfaW5pdCh2b2lkKQoreworCXN0cnVjdCBocGV0X2RhdGEJaGQ7CisJdW5zaWduZWQgaW50IAkJbnRpbWVyOworCisJaWYgKCFocGV0X2FkZHJlc3MpCisgICAgICAgIAlyZXR1cm4gMDsKKworCW1lbXNldCgmaGQsIDAsIHNpemVvZihoZCkpOworCisJbnRpbWVyID0gaHBldF9yZWFkbChIUEVUX0lEKTsKKwludGltZXIgPSAobnRpbWVyICYgSFBFVF9JRF9OVU1CRVIpID4+IEhQRVRfSURfTlVNQkVSX1NISUZUOworCW50aW1lcisrOworCisJLyoKKwkgKiBSZWdpc3RlciB3aXRoIGRyaXZlci4KKwkgKiBUaW1lcjAgYW5kIFRpbWVyMSBpcyB1c2VkIGJ5IHBsYXRmb3JtLgorCSAqLworCWhkLmhkX3BoeXNfYWRkcmVzcyA9IGhwZXRfYWRkcmVzczsKKwloZC5oZF9hZGRyZXNzID0gKHZvaWQgX19pb21lbSAqKWZpeF90b192aXJ0KEZJWF9IUEVUX0JBU0UpOworCWhkLmhkX25pcnFzID0gbnRpbWVyOworCWhkLmhkX2ZsYWdzID0gSFBFVF9EQVRBX1BMQVRGT1JNOworCWhwZXRfcmVzZXJ2ZV90aW1lcigmaGQsIDApOworI2lmZGVmCUNPTkZJR19IUEVUX0VNVUxBVEVfUlRDCisJaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7CisjZW5kaWYKKwloZC5oZF9pcnFbMF0gPSBIUEVUX0xFR0FDWV84MjU0OworCWhkLmhkX2lycVsxXSA9IEhQRVRfTEVHQUNZX1JUQzsKKwlpZiAobnRpbWVyID4gMikgeworCQlzdHJ1Y3QgaHBldAkJKmhwZXQ7CisJCXN0cnVjdCBocGV0X3RpbWVyCSp0aW1lcjsKKwkJaW50CQkJaTsKKworCQlocGV0ID0gKHN0cnVjdCBocGV0ICopIGZpeF90b192aXJ0KEZJWF9IUEVUX0JBU0UpOworCQl0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsKKwkJZm9yIChpID0gMjsgaSA8IG50aW1lcjsgdGltZXIrKywgaSsrKQorCQkJaGQuaGRfaXJxW2ldID0gKHRpbWVyLT5ocGV0X2NvbmZpZyAmCisJCQkJCVRuX0lOVF9ST1VURV9DTkZfTUFTSykgPj4KKwkJCQlUbl9JTlRfUk9VVEVfQ05GX1NISUZUOworCisJfQorCisJaHBldF9hbGxvYygmaGQpOworCXJldHVybiAwOworfQorZnNfaW5pdGNhbGwobGF0ZV9ocGV0X2luaXQpOworI2VuZGlmCisKK2ludCBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKHVuc2lnbmVkIGxvbmcgdGljaykKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnOworCisvKgorICogU3RvcCB0aGUgdGltZXJzIGFuZCByZXNldCB0aGUgbWFpbiBjb3VudGVyLgorICovCisKKwljZmcgPSBocGV0X3JlYWRsKEhQRVRfQ0ZHKTsKKwljZmcgJj0gfihIUEVUX0NGR19FTkFCTEUgfCBIUEVUX0NGR19MRUdBQ1kpOworCWhwZXRfd3JpdGVsKGNmZywgSFBFVF9DRkcpOworCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUik7CisJaHBldF93cml0ZWwoMCwgSFBFVF9DT1VOVEVSICsgNCk7CisKKy8qCisgKiBTZXQgdXAgdGltZXIgMCwgYXMgcGVyaW9kaWMgd2l0aCBmaXJzdCBpbnRlcnJ1cHQgdG8gaGFwcGVuIGF0IGhwZXRfdGljaywKKyAqIGFuZCBwZXJpb2QgYWxzbyBocGV0X3RpY2suCisgKi8KKwlpZiAoaHBldF91c2VfdGltZXIpIHsKKwkJaHBldF93cml0ZWwoSFBFVF9UTl9FTkFCTEUgfCBIUEVUX1ROX1BFUklPRElDIHwgSFBFVF9UTl9TRVRWQUwgfAorCQkgICAgSFBFVF9UTl8zMkJJVCwgSFBFVF9UMF9DRkcpOworCQlocGV0X3dyaXRlbChocGV0X3RpY2ssIEhQRVRfVDBfQ01QKTsgLyogbmV4dCBpbnRlcnJ1cHQgKi8KKwkJaHBldF93cml0ZWwoaHBldF90aWNrLCBIUEVUX1QwX0NNUCk7IC8qIHBlcmlvZCAqLworCQljZmcgfD0gSFBFVF9DRkdfTEVHQUNZOworCX0KKy8qCisgKiBHbyEKKyAqLworCisJY2ZnIHw9IEhQRVRfQ0ZHX0VOQUJMRTsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKKworCXJldHVybiAwOworfQorCitpbnQgaHBldF9hcmNoX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgaWQ7CisKKwlpZiAoIWhwZXRfYWRkcmVzcykKKwkJcmV0dXJuIC0xOworCXNldF9maXhtYXBfbm9jYWNoZShGSVhfSFBFVF9CQVNFLCBocGV0X2FkZHJlc3MpOworCV9fc2V0X2ZpeG1hcChWU1lTQ0FMTF9IUEVULCBocGV0X2FkZHJlc3MsIFBBR0VfS0VSTkVMX1ZTWVNDQUxMX05PQ0FDSEUpOworCisvKgorICogUmVhZCB0aGUgcGVyaW9kLCBjb21wdXRlIHRpY2sgYW5kIHF1b3RpZW50LgorICovCisKKwlpZCA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7CisKKwlpZiAoIShpZCAmIEhQRVRfSURfVkVORE9SKSB8fCAhKGlkICYgSFBFVF9JRF9OVU1CRVIpKQorCQlyZXR1cm4gLTE7CisKKwlocGV0X3BlcmlvZCA9IGhwZXRfcmVhZGwoSFBFVF9QRVJJT0QpOworCWlmIChocGV0X3BlcmlvZCA8IDEwMDAwMCB8fCBocGV0X3BlcmlvZCA+IDEwMDAwMDAwMCkKKwkJcmV0dXJuIC0xOworCisJaHBldF90aWNrID0gKEZTRUNfUEVSX1RJQ0sgKyBocGV0X3BlcmlvZCAvIDIpIC8gaHBldF9wZXJpb2Q7CisKKwlocGV0X3VzZV90aW1lciA9IChpZCAmIEhQRVRfSURfTEVHU1VQKTsKKworCXJldHVybiBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljayk7Cit9CisKK2ludCBocGV0X3JlZW5hYmxlKHZvaWQpCit7CisJcmV0dXJuIGhwZXRfdGltZXJfc3RvcF9zZXRfZ28oaHBldF90aWNrKTsKK30KKworLyoKKyAqIGNhbGlicmF0ZV90c2MoKSBjYWxpYnJhdGVzIHRoZSBwcm9jZXNzb3IgVFNDIGluIGEgdmVyeSBzaW1wbGUgd2F5LCBjb21wYXJpbmcKKyAqIGl0IHRvIHRoZSBIUEVUIHRpbWVyIG9mIGtub3duIGZyZXF1ZW5jeS4KKyAqLworCisjZGVmaW5lIFRJQ0tfQ09VTlQgMTAwMDAwMDAwCisjZGVmaW5lIFRJQ0tfTUlOICAgNTAwMAorCisvKgorICogU29tZSBwbGF0Zm9ybXMgdGFrZSBwZXJpb2RpYyBTTUkgaW50ZXJydXB0cyB3aXRoIDVtcyBkdXJhdGlvbi4gTWFrZSBzdXJlIG5vbmUKKyAqIG9jY3VycyBiZXR3ZWVuIHRoZSByZWFkcyBvZiB0aGUgaHBldCAmIFRTQy4KKyAqLworc3RhdGljIHZvaWQgX19pbml0IHJlYWRfaHBldF90c2MoaW50ICpocGV0LCBpbnQgKnRzYykKK3sKKwlpbnQgdHNjMSwgdHNjMiwgaHBldDE7CisKKwlkbyB7CisJCXRzYzEgPSBnZXRfY3ljbGVzX3N5bmMoKTsKKwkJaHBldDEgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJCXRzYzIgPSBnZXRfY3ljbGVzX3N5bmMoKTsKKwl9IHdoaWxlICh0c2MyIC0gdHNjMSA+IFRJQ0tfTUlOKTsKKwkqaHBldCA9IGhwZXQxOworCSp0c2MgPSB0c2MyOworfQorCit1bnNpZ25lZCBpbnQgX19pbml0IGhwZXRfY2FsaWJyYXRlX3RzYyh2b2lkKQoreworCWludCB0c2Nfc3RhcnQsIGhwZXRfc3RhcnQ7CisJaW50IHRzY19ub3csIGhwZXRfbm93OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlyZWFkX2hwZXRfdHNjKCZocGV0X3N0YXJ0LCAmdHNjX3N0YXJ0KTsKKworCWRvIHsKKwkJbG9jYWxfaXJxX2Rpc2FibGUoKTsKKwkJcmVhZF9ocGV0X3RzYygmaHBldF9ub3csICZ0c2Nfbm93KTsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCX0gd2hpbGUgKCh0c2Nfbm93IC0gdHNjX3N0YXJ0KSA8IFRJQ0tfQ09VTlQgJiYKKwkJKGhwZXRfbm93IC0gaHBldF9zdGFydCkgPCBUSUNLX0NPVU5UKTsKKworCXJldHVybiAodHNjX25vdyAtIHRzY19zdGFydCkgKiAxMDAwMDAwMDAwTAorCQkvICgoaHBldF9ub3cgLSBocGV0X3N0YXJ0KSAqIGhwZXRfcGVyaW9kIC8gMTAwMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfSFBFVF9FTVVMQVRFX1JUQworLyogSFBFVCBpbiBMZWdhY3lSZXBsYWNlbWVudCBNb2RlIGVhdHMgdXAgUlRDIGludGVycnVwdCBsaW5lLiBXaGVuLCBIUEVUCisgKiBpcyBlbmFibGVkLCB3ZSBzdXBwb3J0IFJUQyBpbnRlcnJ1cHQgZnVuY3Rpb25hbGl0eSBpbiBzb2Z0d2FyZS4KKyAqIFJUQyBoYXMgMyBraW5kcyBvZiBpbnRlcnJ1cHRzOgorICogMSkgVXBkYXRlIEludGVycnVwdCAtIGdlbmVyYXRlIGFuIGludGVycnVwdCwgZXZlcnkgc2VjLCB3aGVuIFJUQyBjbG9jaworICogICAgaXMgdXBkYXRlZAorICogMikgQWxhcm0gSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0IGF0IGEgc3BlY2lmaWMgdGltZSBvZiBkYXkKKyAqIDMpIFBlcmlvZGljIEludGVycnVwdCAtIGdlbmVyYXRlIHBlcmlvZGljIGludGVycnVwdCwgd2l0aCBmcmVxdWVuY2llcworICogICAgMkh6LTgxOTJIeiAoMkh6LTY0SHogZm9yIG5vbi1yb290IHVzZXIpIChhbGwgZnJlcXMgaW4gcG93ZXJzIG9mIDIpCisgKiAoMSkgYW5kICgyKSBhYm92ZSBhcmUgaW1wbGVtZW50ZWQgdXNpbmcgcG9sbGluZyBhdCBhIGZyZXF1ZW5jeSBvZgorICogNjQgSHouIFRoZSBleGFjdCBmcmVxdWVuY3kgaXMgYSB0cmFkZW9mZiBiZXR3ZWVuIGFjY3VyYWN5IGFuZCBpbnRlcnJ1cHQKKyAqIG92ZXJoZWFkLiAoREVGQVVMVF9SVENfSU5UX0ZSRVEpCisgKiBGb3IgKDMpLCB3ZSB1c2UgaW50ZXJydXB0cyBhdCA2NEh6IG9yIHVzZXIgc3BlY2lmaWVkIHBlcmlvZGljCisgKiBmcmVxdWVuY3ksIHdoaWNoZXZlciBpcyBoaWdoZXIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9ydGMuaD4KKworI2RlZmluZSBERUZBVUxUX1JUQ19JTlRfRlJFUSAJNjQKKyNkZWZpbmUgUlRDX05VTV9JTlRTIAkJMQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBVSUVfb247CitzdGF0aWMgdW5zaWduZWQgbG9uZyBwcmV2X3VwZGF0ZV9zZWM7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIEFJRV9vbjsKK3N0YXRpYyBzdHJ1Y3QgcnRjX3RpbWUgYWxhcm1fdGltZTsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX29uOworc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIFBJRV9jb3VudDsKKworc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9ydGNfaW50X2ZyZXE7IC8qIFJUQyBpbnRlcnJ1cHQgZnJlcXVlbmN5ICovCitzdGF0aWMgdW5zaWduZWQgaW50IGhwZXRfdDFfY21wOyAvKiBjYWNoZWQgY29tcGFyYXRvciByZWdpc3RlciAqLworCitpbnQgaXNfaHBldF9lbmFibGVkKHZvaWQpCit7CisJcmV0dXJuIGhwZXRfYWRkcmVzcyAhPSAwOworfQorCisvKgorICogVGltZXIgMSBmb3IgUlRDLCB3ZSBkbyBub3QgdXNlIHBlcmlvZGljIGludGVycnVwdCBmZWF0dXJlLAorICogZXZlbiBpZiBIUEVUIHN1cHBvcnRzIHBlcmlvZGljIGludGVycnVwdHMgb24gVGltZXIgMS4KKyAqIFRoZSByZWFzb24gYmVpbmcsIHRvIHNldCB1cCBhIHBlcmlvZGljIGludGVycnVwdCBpbiBIUEVULCB3ZSBuZWVkIHRvCisgKiBzdG9wIHRoZSBtYWluIGNvdW50ZXIuIEFuZCBpZiB3ZSBkbyB0aGF0IGV2ZXJ5dGltZSBzb21lb25lIGRpYWJsZXMvZW5hYmxlcworICogUlRDLCB3ZSB3aWxsIGhhdmUgYWR2ZXJzZSBlZmZlY3Qgb24gbWFpbiBrZXJuZWwgdGltZXIgcnVubmluZyBvbiBUaW1lciAwLgorICogU28sIGZvciB0aGUgdGltZSBiZWluZywgc2ltdWxhdGUgdGhlIHBlcmlvZGljIGludGVycnVwdCBpbiBzb2Z0d2FyZS4KKyAqCisgKiBocGV0X3J0Y190aW1lcl9pbml0KCkgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgZHVyaW5nIHN1YnNlcXVlbnQKKyAqIGludGVydXBwdHMgcmVpbml0IGhhcHBlbnMgdGhyb3VnaCBocGV0X3J0Y190aW1lcl9yZWluaXQoKS4KKyAqLworaW50IGhwZXRfcnRjX3RpbWVyX2luaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCS8qCisJICogU2V0IHRoZSBjb3VudGVyIDEgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0cy4KKwkgKi8KKwlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKKwllbHNlCisJCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljbnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7CisJY250ICs9ICgoaHBldF90aWNrKkhaKS9ocGV0X3J0Y19pbnRfZnJlcSk7CisJaHBldF93cml0ZWwoY250LCBIUEVUX1QxX0NNUCk7CisJaHBldF90MV9jbXAgPSBjbnQ7CisKKwljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ0ZHKTsKKwljZmcgJj0gfkhQRVRfVE5fUEVSSU9ESUM7CisJY2ZnIHw9IEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl8zMkJJVDsKKwlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDFfQ0ZHKTsKKworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgdm9pZCBocGV0X3J0Y190aW1lcl9yZWluaXQodm9pZCkKK3sKKwl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQsIHRpY2tzX3Blcl9pbnQsIGxvc3RfaW50czsKKworCWlmICh1bmxpa2VseSghKFBJRV9vbiB8IEFJRV9vbiB8IFVJRV9vbikpKSB7CisJCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOworCQljZmcgJj0gfkhQRVRfVE5fRU5BQkxFOworCQlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDFfQ0ZHKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChQSUVfb24gJiYgKFBJRV9mcmVxID4gREVGQVVMVF9SVENfSU5UX0ZSRVEpKQorCQlocGV0X3J0Y19pbnRfZnJlcSA9IFBJRV9mcmVxOworCWVsc2UKKwkJaHBldF9ydGNfaW50X2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKKworCS8qIEl0IGlzIG1vcmUgYWNjdXJhdGUgdG8gdXNlIHRoZSBjb21wYXJhdG9yIHZhbHVlIHRoYW4gY3VycmVudCBjb3VudC4qLworCXRpY2tzX3Blcl9pbnQgPSBocGV0X3RpY2sgKiBIWiAvIGhwZXRfcnRjX2ludF9mcmVxOworCWhwZXRfdDFfY21wICs9IHRpY2tzX3Blcl9pbnQ7CisJaHBldF93cml0ZWwoaHBldF90MV9jbXAsIEhQRVRfVDFfQ01QKTsKKworCS8qCisJICogSWYgdGhlIGludGVycnVwdCBoYW5kbGVyIHdhcyBkZWxheWVkIHRvbyBsb25nLCB0aGUgd3JpdGUgYWJvdmUgdHJpZXMKKwkgKiB0byBzY2hlZHVsZSB0aGUgbmV4dCBpbnRlcnJ1cHQgaW4gdGhlIHBhc3QgYW5kIHRoZSBoYXJkd2FyZSB3b3VsZAorCSAqIG5vdCBpbnRlcnJ1cHQgdW50aWwgdGhlIGNvdW50ZXIgaGFkIHdyYXBwZWQgYXJvdW5kLgorCSAqIFNvIHdlIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgY29tcGFyYXRvciB3YXNuJ3Qgc2V0IHRvIGEgcGFzdCB0aW1lLgorCSAqLworCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKKwlpZiAodW5saWtlbHkoKGludCkoY250IC0gaHBldF90MV9jbXApID4gMCkpIHsKKwkJbG9zdF9pbnRzID0gKGNudCAtIGhwZXRfdDFfY21wKSAvIHRpY2tzX3Blcl9pbnQgKyAxOworCQkvKiBNYWtlIHN1cmUgdGhhdCwgZXZlbiB3aXRoIHRoZSB0aW1lIG5lZWRlZCB0byBleGVjdXRlCisJCSAqIHRoaXMgY29kZSwgdGhlIG5leHQgc2NoZWR1bGVkIGludGVycnVwdCBoYXMgYmVlbiBtb3ZlZAorCQkgKiBiYWNrIHRvIHRoZSBmdXR1cmU6ICovCisJCWxvc3RfaW50cysrOworCisJCWhwZXRfdDFfY21wICs9IGxvc3RfaW50cyAqIHRpY2tzX3Blcl9pbnQ7CisJCWhwZXRfd3JpdGVsKGhwZXRfdDFfY21wLCBIUEVUX1QxX0NNUCk7CisKKwkJaWYgKFBJRV9vbikKKwkJCVBJRV9jb3VudCArPSBsb3N0X2ludHM7CisKKwkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKKwkJCXByaW50ayhLRVJOX1dBUk5JTkcgInJ0YzogbG9zdCBzb21lIGludGVycnVwdHMgYXQgJWxkSHouXG4iLAorCQkJICAgICAgIGhwZXRfcnRjX2ludF9mcmVxKTsKKwl9Cit9CisKKy8qCisgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgZnJvbSBydGMgZHJpdmVyLgorICogUmV0dXJuIDAgaWYgSFBFVCBpcyBub3QgYmVpbmcgdXNlZC4KKyAqIE90aGVyd2lzZSBkbyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgYW5kIHJldHVybiAxLgorICovCitpbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCit7CisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoYml0X21hc2sgJiBSVENfVUlFKQorCQlVSUVfb24gPSAwOworCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpCisJCVBJRV9vbiA9IDA7CisJaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkKKwkJQUlFX29uID0gMDsKKworCXJldHVybiAxOworfQorCitpbnQgaHBldF9zZXRfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzaykKK3sKKwlpbnQgdGltZXJfaW5pdF9yZXFkID0gMDsKKworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJaWYgKCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkKKwkJdGltZXJfaW5pdF9yZXFkID0gMTsKKworCWlmIChiaXRfbWFzayAmIFJUQ19VSUUpIHsKKwkJVUlFX29uID0gMTsKKwl9CisJaWYgKGJpdF9tYXNrICYgUlRDX1BJRSkgeworCQlQSUVfb24gPSAxOworCQlQSUVfY291bnQgPSAwOworCX0KKwlpZiAoYml0X21hc2sgJiBSVENfQUlFKSB7CisJCUFJRV9vbiA9IDE7CisJfQorCisJaWYgKHRpbWVyX2luaXRfcmVxZCkKKwkJaHBldF9ydGNfdGltZXJfaW5pdCgpOworCisJcmV0dXJuIDE7Cit9CisKK2ludCBocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwgdW5zaWduZWQgY2hhciBzZWMpCit7CisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlhbGFybV90aW1lLnRtX2hvdXIgPSBocnM7CisJYWxhcm1fdGltZS50bV9taW4gPSBtaW47CisJYWxhcm1fdGltZS50bV9zZWMgPSBzZWM7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhwZXRfc2V0X3BlcmlvZGljX2ZyZXEodW5zaWduZWQgbG9uZyBmcmVxKQoreworCWlmICghaXNfaHBldF9lbmFibGVkKCkpCisJCXJldHVybiAwOworCisJUElFX2ZyZXEgPSBmcmVxOworCVBJRV9jb3VudCA9IDA7CisKKwlyZXR1cm4gMTsKK30KKworaW50IGhwZXRfcnRjX2Ryb3BwZWRfaXJxKHZvaWQpCit7CisJaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHJ0Y190aW1lIGN1cnJfdGltZTsKKwl1bnNpZ25lZCBsb25nIHJ0Y19pbnRfZmxhZyA9IDA7CisJaW50IGNhbGxfcnRjX2ludGVycnVwdCA9IDA7CisKKwlocGV0X3J0Y190aW1lcl9yZWluaXQoKTsKKworCWlmIChVSUVfb24gfCBBSUVfb24pIHsKKwkJcnRjX2dldF9ydGNfdGltZSgmY3Vycl90aW1lKTsKKwl9CisJaWYgKFVJRV9vbikgeworCQlpZiAoY3Vycl90aW1lLnRtX3NlYyAhPSBwcmV2X3VwZGF0ZV9zZWMpIHsKKwkJCS8qIFNldCB1cGRhdGUgaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KKwkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7CisJCQlydGNfaW50X2ZsYWcgPSBSVENfVUY7CisJCQlwcmV2X3VwZGF0ZV9zZWMgPSBjdXJyX3RpbWUudG1fc2VjOworCQl9CisJfQorCWlmIChQSUVfb24pIHsKKwkJUElFX2NvdW50Kys7CisJCWlmIChQSUVfY291bnQgPj0gaHBldF9ydGNfaW50X2ZyZXEvUElFX2ZyZXEpIHsKKwkJCS8qIFNldCBwZXJpb2RpYyBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLworCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKKwkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfUEY7CisJCQlQSUVfY291bnQgPSAwOworCQl9CisJfQorCWlmIChBSUVfb24pIHsKKwkJaWYgKChjdXJyX3RpbWUudG1fc2VjID09IGFsYXJtX3RpbWUudG1fc2VjKSAmJgorCQkgICAgKGN1cnJfdGltZS50bV9taW4gPT0gYWxhcm1fdGltZS50bV9taW4pICYmCisJCSAgICAoY3Vycl90aW1lLnRtX2hvdXIgPT0gYWxhcm1fdGltZS50bV9ob3VyKSkgeworCQkJLyogU2V0IGFsYXJtIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCisJCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOworCQkJcnRjX2ludF9mbGFnIHw9IFJUQ19BRjsKKwkJfQorCX0KKwlpZiAoY2FsbF9ydGNfaW50ZXJydXB0KSB7CisJCXJ0Y19pbnRfZmxhZyB8PSAoUlRDX0lSUUYgfCAoUlRDX05VTV9JTlRTIDw8IDgpKTsKKwkJcnRjX2ludGVycnVwdChydGNfaW50X2ZsYWcsIGRldl9pZCk7CisJfQorCXJldHVybiBJUlFfSEFORExFRDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IF9faW5pdCBub2hwZXRfc2V0dXAoY2hhciAqcykKK3sKKwlub2hwZXQgPSAxOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub2hwZXQiLCBub2hwZXRfc2V0dXApOworCisjZGVmaW5lIEhQRVRfTUFTSwkweEZGRkZGRkZGCisjZGVmaW5lIEhQRVRfU0hJRlQJMjIKKworLyogRlNFQyA9IDEwXi0xNSBOU0VDID0gMTBeLTkgKi8KKyNkZWZpbmUgRlNFQ19QRVJfTlNFQwkxMDAwMDAwCisKK3N0YXRpYyB2b2lkICpocGV0X3B0cjsKKworc3RhdGljIGN5Y2xlX3QgcmVhZF9ocGV0KHZvaWQpCit7CisJcmV0dXJuIChjeWNsZV90KXJlYWRsKGhwZXRfcHRyKTsKK30KKworc3RhdGljIGN5Y2xlX3QgX192c3lzY2FsbF9mbiB2cmVhZF9ocGV0KHZvaWQpCit7CisJcmV0dXJuIHJlYWRsKCh2b2lkIF9faW9tZW0gKilmaXhfdG9fdmlydChWU1lTQ0FMTF9IUEVUKSArIDB4ZjApOworfQorCitzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2tzb3VyY2VfaHBldCA9IHsKKwkubmFtZQkJPSAiaHBldCIsCisJLnJhdGluZwkJPSAyNTAsCisJLnJlYWQJCT0gcmVhZF9ocGV0LAorCS5tYXNrCQk9IChjeWNsZV90KUhQRVRfTUFTSywKKwkubXVsdAkJPSAwLCAvKiBzZXQgYmVsb3cgKi8KKwkuc2hpZnQJCT0gSFBFVF9TSElGVCwKKwkuZmxhZ3MJCT0gQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMsCisJLnZyZWFkCQk9IHZyZWFkX2hwZXQsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBpbml0X2hwZXRfY2xvY2tzb3VyY2Uodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGhwZXRfcGVyaW9kOworCXZvaWQgX19pb21lbSAqaHBldF9iYXNlOworCXU2NCB0bXA7CisKKwlpZiAoIWhwZXRfYWRkcmVzcykKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGhwZXQgYWRkcmVzczogKi8KKwlocGV0X2Jhc2UgPSBpb3JlbWFwX25vY2FjaGUoaHBldF9hZGRyZXNzLCBIUEVUX01NQVBfU0laRSk7CisJaHBldF9wdHIgPSBocGV0X2Jhc2UgKyBIUEVUX0NPVU5URVI7CisKKwkvKiBjYWxjdWxhdGUgdGhlIGZyZXF1ZW5jeTogKi8KKwlocGV0X3BlcmlvZCA9IHJlYWRsKGhwZXRfYmFzZSArIEhQRVRfUEVSSU9EKTsKKworCS8qCisJICogaHBldCBwZXJpb2QgaXMgaW4gZmVtdG8gc2Vjb25kcyBwZXIgY3ljbGUKKwkgKiBzbyB3ZSBuZWVkIHRvIGNvbnZlcnQgdGhpcyB0byBucy9jeWMgdW5pdHMKKwkgKiBhcHJveGltYXRlZCBieSBtdWx0LzJec2hpZnQKKwkgKgorCSAqICBmc2VjL2N5YyAqIDFuc2VjLzEwMDAwMDBmc2VjID0gbnNlYy9jeWMgPSBtdWx0LzJec2hpZnQKKwkgKiAgZnNlYy9jeWMgKiAxbnMvMTAwMDAwMGZzZWMgKiAyXnNoaWZ0ID0gbXVsdAorCSAqICBmc2VjL2N5YyAqIDJec2hpZnQgKiAxbnNlYy8xMDAwMDAwZnNlYyA9IG11bHQKKwkgKiAgKGZzZWMvY3ljIDw8IHNoaWZ0KS8xMDAwMDAwID0gbXVsdAorCSAqICAoaHBldF9wZXJpb2QgPDwgc2hpZnQpL0ZTRUNfUEVSX05TRUMgPSBtdWx0CisJICovCisJdG1wID0gKHU2NClocGV0X3BlcmlvZCA8PCBIUEVUX1NISUZUOworCWRvX2Rpdih0bXAsIEZTRUNfUEVSX05TRUMpOworCWNsb2Nrc291cmNlX2hwZXQubXVsdCA9ICh1MzIpdG1wOworCisJcmV0dXJuIGNsb2Nrc291cmNlX3JlZ2lzdGVyKCZjbG9ja3NvdXJjZV9ocGV0KTsKK30KKworbW9kdWxlX2luaXQoaW5pdF9ocGV0X2Nsb2Nrc291cmNlKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9pODI1OS5jIGIvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKaW5kZXggZDczYzc5ZS4uMDFlMmNmMCAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL2k4MjU5LmMKQEAgLTEwMyw2ICsxMDMsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcCBpODI1OUFfY2hpcCA9IHsKIAkubmFtZQkJPSAiWFQtUElDIiwKIAkubWFzawkJPSBkaXNhYmxlXzgyNTlBX2lycSwKKwkuZGlzYWJsZQk9IGRpc2FibGVfODI1OUFfaXJxLAogCS51bm1hc2sJCT0gZW5hYmxlXzgyNTlBX2lycSwKIAkubWFza19hY2sJPSBtYXNrX2FuZF9hY2tfODI1OUEsCiB9OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9pb19hcGljLmMKaW5kZXggNTY2ZTY0ZC4uOTUwNjgyZiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL2lvX2FwaWMuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvaW9fYXBpYy5jCkBAIC04MTAsMTEgKzgxMCw5IEBACiAJCQl0cmlnZ2VyID09IElPQVBJQ19MRVZFTCkKIAkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaXJxLCAmaW9hcGljX2NoaXAsCiAJCQkJCSAgICAgIGhhbmRsZV9mYXN0ZW9pX2lycSwgImZhc3Rlb2kiKTsKLQllbHNlIHsKLQkJaXJxX2Rlc2NbaXJxXS5zdGF0dXMgfD0gSVJRX0RFTEFZRURfRElTQUJMRTsKKwllbHNlCiAJCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmlvYXBpY19jaGlwLAogCQkJCQkgICAgICBoYW5kbGVfZWRnZV9pcnEsICJlZGdlIik7Ci0JfQogfQogc3RhdGljIHZvaWQgX19pbml0IHNldHVwX0lPX0FQSUNfaXJxKGludCBhcGljLCBpbnQgcGluLCBpbnQgaWR4LCBpbnQgaXJxKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODZfNjQva2VybmVsL3BtdGltZXIuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC9wbXRpbWVyLmMKaW5kZXggNzU1NDQ1OC4uYWU4ZjkxMiAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3BtdGltZXIuYworKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvcG10aW1lci5jCkBAIC0yNCwxNSArMjQsNiBAQAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KICNpbmNsdWRlIDxhc20vdnN5c2NhbGwuaD4KIAotLyogVGhlIEkvTyBwb3J0IHRoZSBQTVRNUiByZXNpZGVzIGF0LgotICogVGhlIGxvY2F0aW9uIGlzIGRldGVjdGVkIGR1cmluZyBzZXR1cF9hcmNoKCksCi0gKiBpbiBhcmNoL2kzODYva2VybmVsL2FjcGkvYm9vdC5jICovCi11MzIgcG10bXJfaW9wb3J0IF9fcmVhZF9tb3N0bHk7Ci0KLS8qIHZhbHVlIG9mIHRoZSBQb3dlciB0aW1lciBhdCBsYXN0IHRpbWVyIGludGVycnVwdCAqLwotc3RhdGljIHUzMiBvZmZzZXRfZGVsYXk7Ci1zdGF0aWMgdTMyIGxhc3RfcG10bXJfdGljazsKLQogI2RlZmluZSBBQ1BJX1BNX01BU0sgMHhGRkZGRkYgLyogbGltaXQgaXQgdG8gMjQgYml0cyAqLwogCiBzdGF0aWMgaW5saW5lIHUzMiBjeWMydXModTMyIGN5Y2xlcykKQEAgLTQ4LDM4ICszOSw2IEBACiAJcmV0dXJuIChjeWNsZXMgPj4gMTApOwogfQogCi1pbnQgcG10aW1lcl9tYXJrX29mZnNldCh2b2lkKQotewotCXN0YXRpYyBpbnQgZmlyc3RfcnVuID0gMTsKLQl1bnNpZ25lZCBsb25nIHRzYzsKLQl1MzIgbG9zdDsKLQotCXUzMiB0aWNrID0gaW5sKHBtdG1yX2lvcG9ydCk7Ci0JdTMyIGRlbHRhOwotCi0JZGVsdGEgPSBjeWMydXMoKHRpY2sgLSBsYXN0X3BtdG1yX3RpY2spICYgQUNQSV9QTV9NQVNLKTsKLQotCWxhc3RfcG10bXJfdGljayA9IHRpY2s7Ci0JbW9ub3RvbmljX2Jhc2UgKz0gZGVsdGEgKiBOU0VDX1BFUl9VU0VDOwotCi0JZGVsdGEgKz0gb2Zmc2V0X2RlbGF5OwotCi0JbG9zdCA9IGRlbHRhIC8gKFVTRUNfUEVSX1NFQyAvIEhaKTsKLQlvZmZzZXRfZGVsYXkgPSBkZWx0YSAlIChVU0VDX1BFUl9TRUMgLyBIWik7Ci0KLQlyZHRzY2xsKHRzYyk7Ci0Jdnh0aW1lLmxhc3RfdHNjID0gdHNjIC0gb2Zmc2V0X2RlbGF5ICogKHU2NCljcHVfa2h6IC8gMTAwMDsKLQotCS8qIGRvbid0IGNhbGN1bGF0ZSBkZWxheSBmb3IgZmlyc3QgcnVuLAotCSAgIG9yIGlmIHdlJ3ZlIGdvdCBsZXNzIHRoZW4gYSB0aWNrICovCi0JaWYgKGZpcnN0X3J1biB8fCAobG9zdCA8IDEpKSB7Ci0JCWZpcnN0X3J1biA9IDA7Ci0JCW9mZnNldF9kZWxheSA9IDA7Ci0JfQotCi0JcmV0dXJuIGxvc3QgLSAxOwotfQotCiBzdGF0aWMgdW5zaWduZWQgcG10aW1lcl93YWl0X3RpY2sodm9pZCkKIHsKIAl1MzIgYSwgYjsKQEAgLTEwMSwyMyArNjAsNiBAQAogCX0gd2hpbGUgKGN5YzJ1cyhiIC0gYSkgPCB1cyk7CiB9CiAKLXZvaWQgcG10aW1lcl9yZXN1bWUodm9pZCkKLXsKLQlsYXN0X3BtdG1yX3RpY2sgPSBpbmwocG10bXJfaW9wb3J0KTsKLX0KLQotdW5zaWduZWQgaW50IGRvX2dldHRpbWVvZmZzZXRfcG0odm9pZCkKLXsKLQl1MzIgbm93LCBvZmZzZXQsIGRlbHRhID0gMDsKLQotCW9mZnNldCA9IGxhc3RfcG10bXJfdGljazsKLQlub3cgPSBpbmwocG10bXJfaW9wb3J0KTsKLQlkZWx0YSA9IChub3cgLSBvZmZzZXQpICYgQUNQSV9QTV9NQVNLOwotCi0JcmV0dXJuIG9mZnNldF9kZWxheSArIGN5YzJ1cyhkZWx0YSk7Ci19Ci0KLQogc3RhdGljIGludCBfX2luaXQgbm9wbXRpbWVyX3NldHVwKGNoYXIgKnMpCiB7CiAJcG10bXJfaW9wb3J0ID0gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvc21wYm9vdC5jCmluZGV4IGRhZjE5MzMuLjM1NDQzNzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3NtcGJvb3QuYwpAQCAtMTQ4LDIxNyArMTQ4LDYgQEAKIAlwcmludF9jcHVfaW5mbyhjKTsKIH0KIAotLyoKLSAqIE5ldyBGdW5reSBUU0Mgc3luYyBhbGdvcml0aG0gYm9ycm93ZWQgZnJvbSBJQTY0LgotICogTWFpbiBhZHZhbnRhZ2UgaXMgdGhhdCBpdCBkb2Vzbid0IHJlc2V0IHRoZSBUU0NzIGZ1bGx5IGFuZAotICogaW4gZ2VuZXJhbCBsb29rcyBtb3JlIHJvYnVzdCBhbmQgaXQgd29ya3MgYmV0dGVyIHRoYW4gbXkgZWFybGllcgotICogYXR0ZW1wdHMuIEkgYmVsaWV2ZSBpdCB3YXMgd3JpdHRlbiBieSBEYXZpZCBNb3NiZXJnZXIuIFNvbWUgbWlub3IKLSAqIGFkanVzdG1lbnRzIGZvciB4ODYtNjQgYnkgbWUgLUFLCi0gKgotICogT3JpZ2luYWwgY29tbWVudCByZXByb2R1Y2VkIGJlbG93LgotICoKLSAqIFN5bmNocm9uaXplIFRTQyBvZiB0aGUgY3VycmVudCAoc2xhdmUpIENQVSB3aXRoIHRoZSBUU0Mgb2YgdGhlCi0gKiBNQVNURVIgQ1BVIChub3JtYWxseSB0aGUgdGltZS1rZWVwZXIgQ1BVKS4gIFdlIHVzZSBhIGNsb3NlZCBsb29wIHRvCi0gKiBlbGltaW5hdGUgdGhlIHBvc3NpYmlsaXR5IG9mIHVuYWNjb3VudGVkLWZvciBlcnJvcnMgKHN1Y2ggYXMKLSAqIGdldHRpbmcgYSBtYWNoaW5lIGNoZWNrIGluIHRoZSBtaWRkbGUgb2YgYSBjYWxpYnJhdGlvbiBzdGVwKS4gIFRoZQotICogYmFzaWMgaWRlYSBpcyBmb3IgdGhlIHNsYXZlIHRvIGFzayB0aGUgbWFzdGVyIHdoYXQgaXRjIHZhbHVlIGl0IGhhcwotICogYW5kIHRvIHJlYWQgaXRzIG93biBpdGMgYmVmb3JlIGFuZCBhZnRlciB0aGUgbWFzdGVyIHJlc3BvbmRzLiAgRWFjaAotICogaXRlcmF0aW9uIGdpdmVzIHVzIHRocmVlIHRpbWVzdGFtcHM6Ci0gKgotICoJc2xhdmUJCW1hc3RlcgotICoKLSAqCXQwIC0tLVwKLSAqICAgICAgICAgICAgIC0tLVwKLSAqCQkgICAtLS0+Ci0gKgkJCXRtCi0gKgkJICAgLy0tLQotICoJICAgICAgIC8tLS0KLSAqCXQxIDwtLS0KLSAqCi0gKgotICogVGhlIGdvYWwgaXMgdG8gYWRqdXN0IHRoZSBzbGF2ZSdzIFRTQyBzdWNoIHRoYXQgdG0gZmFsbHMgZXhhY3RseQotICogaGFsZi13YXkgYmV0d2VlbiB0MCBhbmQgdDEuICBJZiB3ZSBhY2hpZXZlIHRoaXMsIHRoZSBjbG9ja3MgYXJlCi0gKiBzeW5jaHJvbml6ZWQgcHJvdmlkZWQgdGhlIGludGVyY29ubmVjdCBiZXR3ZWVuIHRoZSBzbGF2ZSBhbmQgdGhlCi0gKiBtYXN0ZXIgaXMgc3ltbWV0cmljLiAgRXZlbiBpZiB0aGUgaW50ZXJjb25uZWN0IHdlcmUgYXN5bW1ldHJpYywgd2UKLSAqIHdvdWxkIHN0aWxsIGtub3cgdGhhdCB0aGUgc3luY2hyb25pemF0aW9uIGVycm9yIGlzIHNtYWxsZXIgdGhhbiB0aGUKLSAqIHJvdW5kdHJpcCBsYXRlbmN5ICh0MCAtIHQxKS4KLSAqCi0gKiBXaGVuIHRoZSBpbnRlcmNvbm5lY3QgaXMgcXVpZXQgYW5kIHN5bW1ldHJpYywgdGhpcyBsZXRzIHVzCi0gKiBzeW5jaHJvbml6ZSB0aGUgVFNDIHRvIHdpdGhpbiBvbmUgb3IgdHdvIGN5Y2xlcy4gIEhvd2V2ZXIsIHdlIGNhbgotICogb25seSAqZ3VhcmFudGVlKiB0aGF0IHRoZSBzeW5jaHJvbml6YXRpb24gaXMgYWNjdXJhdGUgdG8gd2l0aGluIGEKLSAqIHJvdW5kLXRyaXAgdGltZSwgd2hpY2ggaXMgdHlwaWNhbGx5IGluIHRoZSByYW5nZSBvZiBzZXZlcmFsIGh1bmRyZWQKLSAqIGN5Y2xlcyAoZS5nLiwgfjUwMCBjeWNsZXMpLiAgSW4gcHJhY3RpY2UsIHRoaXMgbWVhbnMgdGhhdCB0aGUgVFNDcwotICogYXJlIHVzdWFsbHkgYWxtb3N0IHBlcmZlY3RseSBzeW5jaHJvbml6ZWQsIGJ1dCB3ZSBzaG91bGRuJ3QgYXNzdW1lCi0gKiB0aGF0IHRoZSBhY2N1cmFjeSBpcyBtdWNoIGJldHRlciB0aGFuIGhhbGYgYSBtaWNybyBzZWNvbmQgb3Igc28uCi0gKgotICogW3RoZXJlIGFyZSBvdGhlciBlcnJvcnMgbGlrZSB0aGUgbGF0ZW5jeSBvZiBSRFRTQyBhbmQgb2YgdGhlCi0gKiBXUk1TUi4gVGhlc2UgY2FuIGFsc28gYWNjb3VudCB0byBodW5kcmVkcyBvZiBjeWNsZXMuIFNvIGl0J3MKLSAqIHByb2JhYmx5IHdvcnNlLiBJdCBjbGFpbXMgMTUzIGN5Y2xlcyBlcnJvciBvbiBhIGR1YWwgT3B0ZXJvbiwKLSAqIGJ1dCBJIHN1c3BlY3QgdGhlIG51bWJlcnMgYXJlIGFjdHVhbGx5IHNvbWV3aGF0IHdvcnNlIC1BS10KLSAqLwotCi0jZGVmaW5lIE1BU1RFUgkwCi0jZGVmaW5lIFNMQVZFCShTTVBfQ0FDSEVfQllURVMvOCkKLQotLyogSW50ZW50aW9uYWxseSBkb24ndCB1c2UgY3B1X3JlbGF4KCkgd2hpbGUgVFNDIHN5bmNocm9uaXphdGlvbgotICAgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGdvIGludG8gZnVua3kgcG93ZXIgc2F2ZSBtb2RpIG9yIGNhdXNlCi0gICBoeXBlcnZpc29ycyB0byBzY2hlZHVsZSB1cyBhd2F5LiAgR29pbmcgdG8gc2xlZXAgd291bGQgbGlrZWx5IGFmZmVjdAotICAgbGF0ZW5jeSBhbmQgbG93IGxhdGVuY3kgaXMgdGhlIHByaW1hcnkgb2JqZWN0aXZlIGhlcmUuIC1BSyAqLwotI2RlZmluZSBub19jcHVfcmVsYXgoKSBiYXJyaWVyKCkKLQotc3RhdGljIF9fY3B1aW5pdGRhdGEgREVGSU5FX1NQSU5MT0NLKHRzY19zeW5jX2xvY2spOwotc3RhdGljIHZvbGF0aWxlIF9fY3B1aW5pdGRhdGEgdW5zaWduZWQgbG9uZyBnb1tTTEFWRSArIDFdOwotc3RhdGljIGludCBub3RzY3N5bmMgX19jcHVpbml0ZGF0YTsKLQotI3VuZGVmIERFQlVHX1RTQ19TWU5DCi0KLSNkZWZpbmUgTlVNX1JPVU5EUwk2NAkvKiBtYWdpYyB2YWx1ZSAqLwotI2RlZmluZSBOVU1fSVRFUlMJNQkvKiBsaWtld2lzZSAqLwotCi0vKiBDYWxsYmFjayBvbiBib290IENQVSAqLwotc3RhdGljIF9fY3B1aW5pdCB2b2lkIHN5bmNfbWFzdGVyKHZvaWQgKmFyZykKLXsKLQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpOwotCi0JZ29bTUFTVEVSXSA9IDA7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JewotCQlmb3IgKGkgPSAwOyBpIDwgTlVNX1JPVU5EUypOVU1fSVRFUlM7ICsraSkgewotCQkJd2hpbGUgKCFnb1tNQVNURVJdKQotCQkJCW5vX2NwdV9yZWxheCgpOwotCQkJZ29bTUFTVEVSXSA9IDA7Ci0JCQlyZHRzY2xsKGdvW1NMQVZFXSk7Ci0JCX0KLQl9Ci0JbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotfQotCi0vKgotICogUmV0dXJuIHRoZSBudW1iZXIgb2YgY3ljbGVzIGJ5IHdoaWNoIG91ciB0c2MgZGlmZmVycyBmcm9tIHRoZSB0c2MKLSAqIG9uIHRoZSBtYXN0ZXIgKHRpbWUta2VlcGVyKSBDUFUuICBBIHBvc2l0aXZlIG51bWJlciBpbmRpY2F0ZXMgb3VyCi0gKiB0c2MgaXMgYWhlYWQgb2YgdGhlIG1hc3RlciwgbmVnYXRpdmUgdGhhdCBpdCBpcyBiZWhpbmQuCi0gKi8KLXN0YXRpYyBpbmxpbmUgbG9uZwotZ2V0X2RlbHRhKGxvbmcgKnJ0LCBsb25nICptYXN0ZXIpCi17Ci0JdW5zaWduZWQgbG9uZyBiZXN0X3QwID0gMCwgYmVzdF90MSA9IH4wVUwsIGJlc3RfdG0gPSAwOwotCXVuc2lnbmVkIGxvbmcgdGNlbnRlciwgdDAsIHQxLCB0bTsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPCBOVU1fSVRFUlM7ICsraSkgewotCQlyZHRzY2xsKHQwKTsKLQkJZ29bTUFTVEVSXSA9IDE7Ci0JCXdoaWxlICghKHRtID0gZ29bU0xBVkVdKSkKLQkJCW5vX2NwdV9yZWxheCgpOwotCQlnb1tTTEFWRV0gPSAwOwotCQlyZHRzY2xsKHQxKTsKLQotCQlpZiAodDEgLSB0MCA8IGJlc3RfdDEgLSBiZXN0X3QwKQotCQkJYmVzdF90MCA9IHQwLCBiZXN0X3QxID0gdDEsIGJlc3RfdG0gPSB0bTsKLQl9Ci0KLQkqcnQgPSBiZXN0X3QxIC0gYmVzdF90MDsKLQkqbWFzdGVyID0gYmVzdF90bSAtIGJlc3RfdDA7Ci0KLQkvKiBhdmVyYWdlIGJlc3RfdDAgYW5kIGJlc3RfdDEgd2l0aG91dCBvdmVyZmxvdzogKi8KLQl0Y2VudGVyID0gKGJlc3RfdDAvMiArIGJlc3RfdDEvMik7Ci0JaWYgKGJlc3RfdDAgJSAyICsgYmVzdF90MSAlIDIgPT0gMikKLQkJKyt0Y2VudGVyOwotCXJldHVybiB0Y2VudGVyIC0gYmVzdF90bTsKLX0KLQotc3RhdGljIF9fY3B1aW5pdCB2b2lkIHN5bmNfdHNjKHVuc2lnbmVkIGludCBtYXN0ZXIpCi17Ci0JaW50IGksIGRvbmUgPSAwOwotCWxvbmcgZGVsdGEsIGFkaiwgYWRqdXN0X2xhdGVuY3kgPSAwOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIHJ0LCBtYXN0ZXJfdGltZV9zdGFtcCwgYm91bmQ7Ci0jaWZkZWYgREVCVUdfVFNDX1NZTkMKLQlzdGF0aWMgc3RydWN0IHN5bmNkZWJ1ZyB7Ci0JCWxvbmcgcnQ7CS8qIHJvdW5kdHJpcCB0aW1lICovCi0JCWxvbmcgbWFzdGVyOwkvKiBtYXN0ZXIncyB0aW1lc3RhbXAgKi8KLQkJbG9uZyBkaWZmOwkvKiBkaWZmZXJlbmNlIGJldHdlZW4gbWlkcG9pbnQgYW5kIG1hc3RlcidzIHRpbWVzdGFtcCAqLwotCQlsb25nIGxhdDsJLyogZXN0aW1hdGUgb2YgdHNjIGFkanVzdG1lbnQgbGF0ZW5jeSAqLwotCX0gdFtOVU1fUk9VTkRTXSBfX2NwdWluaXRkYXRhOwotI2VuZGlmCi0KLQlwcmludGsoS0VSTl9JTkZPICJDUFUgJWQ6IFN5bmNpbmcgVFNDIHRvIENQVSAldS5cbiIsCi0JCXNtcF9wcm9jZXNzb3JfaWQoKSwgbWFzdGVyKTsKLQotCWdvW01BU1RFUl0gPSAxOwotCi0JLyogSXQgaXMgZGFuZ2Vyb3VzIHRvIGJyb2FkY2FzdCBJUEkgYXMgY3B1cyBhcmUgY29taW5nIHVwLAotCSAqIGFzIHRoZXkgbWF5IG5vdCBiZSByZWFkeSB0byBhY2NlcHQgdGhlbS4gIFNvIHNpbmNlCi0JICogd2Ugb25seSBuZWVkIHRvIHNlbmQgdGhlIGlwaSB0byB0aGUgYm9vdCBjcHUgZGlyZWN0Ci0JICogdGhlIG1lc3NhZ2UsIGFuZCBhdm9pZCB0aGUgcmFjZS4KLQkgKi8KLQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUobWFzdGVyLCBzeW5jX21hc3RlciwgTlVMTCwgMSwgMCk7Ci0KLQl3aGlsZSAoZ29bTUFTVEVSXSkJLyogd2FpdCBmb3IgbWFzdGVyIHRvIGJlIHJlYWR5ICovCi0JCW5vX2NwdV9yZWxheCgpOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJnRzY19zeW5jX2xvY2ssIGZsYWdzKTsKLQl7Ci0JCWZvciAoaSA9IDA7IGkgPCBOVU1fUk9VTkRTOyArK2kpIHsKLQkJCWRlbHRhID0gZ2V0X2RlbHRhKCZydCwgJm1hc3Rlcl90aW1lX3N0YW1wKTsKLQkJCWlmIChkZWx0YSA9PSAwKSB7Ci0JCQkJZG9uZSA9IDE7CS8qIGxldCdzIGxvY2sgb24gdG8gdGhpcy4uLiAqLwotCQkJCWJvdW5kID0gcnQ7Ci0JCQl9Ci0KLQkJCWlmICghZG9uZSkgewotCQkJCXVuc2lnbmVkIGxvbmcgdDsKLQkJCQlpZiAoaSA+IDApIHsKLQkJCQkJYWRqdXN0X2xhdGVuY3kgKz0gLWRlbHRhOwotCQkJCQlhZGogPSAtZGVsdGEgKyBhZGp1c3RfbGF0ZW5jeS80OwotCQkJCX0gZWxzZQotCQkJCQlhZGogPSAtZGVsdGE7Ci0KLQkJCQlyZHRzY2xsKHQpOwotCQkJCXdybXNybChNU1JfSUEzMl9UU0MsIHQgKyBhZGopOwotCQkJfQotI2lmZGVmIERFQlVHX1RTQ19TWU5DCi0JCQl0W2ldLnJ0ID0gcnQ7Ci0JCQl0W2ldLm1hc3RlciA9IG1hc3Rlcl90aW1lX3N0YW1wOwotCQkJdFtpXS5kaWZmID0gZGVsdGE7Ci0JCQl0W2ldLmxhdCA9IGFkanVzdF9sYXRlbmN5LzQ7Ci0jZW5kaWYKLQkJfQotCX0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0c2Nfc3luY19sb2NrLCBmbGFncyk7Ci0KLSNpZmRlZiBERUJVR19UU0NfU1lOQwotCWZvciAoaSA9IDA7IGkgPCBOVU1fUk9VTkRTOyArK2kpCi0JCXByaW50aygicnQ9JTVsZCBtYXN0ZXI9JTVsZCBkaWZmPSU1bGQgYWRqbGF0PSU1bGRcbiIsCi0JCSAgICAgICB0W2ldLnJ0LCB0W2ldLm1hc3RlciwgdFtpXS5kaWZmLCB0W2ldLmxhdCk7Ci0jZW5kaWYKLQotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgIkNQVSAlZDogc3luY2hyb25pemVkIFRTQyB3aXRoIENQVSAldSAobGFzdCBkaWZmICVsZCBjeWNsZXMsICIKLQkgICAgICAgIm1heGVyciAlbHUgY3ljbGVzKVxuIiwKLQkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpLCBtYXN0ZXIsIGRlbHRhLCBydCk7Ci19Ci0KLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCB0c2Nfc3luY193YWl0KHZvaWQpCi17Ci0JLyoKLQkgKiBXaGVuIHRoZSBDUFUgaGFzIHN5bmNocm9uaXplZCBUU0NzIGFzc3VtZSB0aGUgQklPUwotICAJICogb3IgdGhlIGhhcmR3YXJlIGFscmVhZHkgc3luY2VkLiAgT3RoZXJ3aXNlIHdlIGNvdWxkCi0JICogbWVzcyB1cCBhIHBvc3NpYmxlIHBlcmZlY3Qgc3luY2hyb25pemF0aW9uIHdpdGggYQotCSAqIG5vdC1xdWl0ZS1wZXJmZWN0IGFsZ29yaXRobS4KLQkgKi8KLQlpZiAobm90c2NzeW5jIHx8ICFjcHVfaGFzX3RzYyB8fCAhdW5zeW5jaHJvbml6ZWRfdHNjKCkpCi0JCXJldHVybjsKLQlzeW5jX3RzYygwKTsKLX0KLQotc3RhdGljIF9faW5pdCBpbnQgbm90c2NzeW5jX3NldHVwKGNoYXIgKnMpCi17Ci0Jbm90c2NzeW5jID0gMTsKLQlyZXR1cm4gMTsKLX0KLV9fc2V0dXAoIm5vdHNjc3luYyIsIG5vdHNjc3luY19zZXR1cCk7Ci0KIHN0YXRpYyBhdG9taWNfdCBpbml0X2RlYXNzZXJ0ZWQgX19jcHVpbml0ZGF0YTsKIAogLyoKQEAgLTU0Niw2ICszMzUsMTEgQEAKIAkvKiBvdGhlcndpc2UgZ2NjIHdpbGwgbW92ZSB1cCB0aGUgc21wX3Byb2Nlc3Nvcl9pZCBiZWZvcmUgdGhlIGNwdV9pbml0ICovCiAJYmFycmllcigpOwogCisJLyoKKyAgCSAqIENoZWNrIFRTQyBzeW5jIGZpcnN0OgorIAkgKi8KKwljaGVja190c2Nfc3luY190YXJnZXQoKTsKKwogCURwcmludGsoImNwdSAlZDogc2V0dGluZyB1cCBhcGljIGNsb2NrXG4iLCBzbXBfcHJvY2Vzc29yX2lkKCkpOyAJCiAJc2V0dXBfc2Vjb25kYXJ5X0FQSUNfY2xvY2soKTsKIApAQCAtNTY1LDE0ICszNTksNiBAQAogCSAqLwogCXNldF9jcHVfc2libGluZ19tYXAoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAotCS8qIAotICAJICogV2FpdCBmb3IgVFNDIHN5bmMgdG8gbm90IHNjaGVkdWxlIHRoaW5ncyBiZWZvcmUuCi0JICogV2Ugc3RpbGwgcHJvY2VzcyBpbnRlcnJ1cHRzLCB3aGljaCBjb3VsZCBzZWUgYW4gaW5jb25zaXN0ZW50Ci0JICogdGltZSBpbiB0aGF0IHdpbmRvdyB1bmZvcnR1bmF0ZWx5LiAKLQkgKiBEbyB0aGlzIGhlcmUgYmVjYXVzZSBUU0Mgc3luYyBoYXMgZ2xvYmFsIHVucHJvdGVjdGVkIHN0YXRlLgotIAkgKi8KLQl0c2Nfc3luY193YWl0KCk7Ci0KIAkvKgogCSAqIFdlIG5lZWQgdG8gaG9sZCBjYWxsX2xvY2ssIHNvIHRoZXJlIGlzIG5vIGluY29uc2lzdGVuY3kKIAkgKiBiZXR3ZWVuIHRoZSB0aW1lIHNtcF9jYWxsX2Z1bmN0aW9uKCkgZGV0ZXJtaW5lcyBudW1iZXIgb2YKQEAgLTU5Miw2ICszNzgsNyBAQAogCWNwdV9zZXQoc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHVfb25saW5lX21hcCk7CiAJcGVyX2NwdShjcHVfc3RhdGUsIHNtcF9wcm9jZXNzb3JfaWQoKSkgPSBDUFVfT05MSU5FOwogCXNwaW5fdW5sb2NrKCZ2ZWN0b3JfbG9jayk7CisKIAl1bmxvY2tfaXBpX2NhbGxfbG9jaygpOwogCiAJY3B1X2lkbGUoKTsKQEAgLTExNjgsNiArOTU1LDExIEBACiAJLyogVW5sZWFzaCB0aGUgQ1BVISAqLwogCURwcmludGsoIndhaXRpbmcgZm9yIGNwdSAlZFxuIiwgY3B1KTsKIAorCS8qCisgIAkgKiBNYWtlIHN1cmUgYW5kIGNoZWNrIFRTQyBzeW5jOgorIAkgKi8KKwljaGVja190c2Nfc3luY19zb3VyY2UoY3B1KTsKKwogCXdoaWxlICghY3B1X2lzc2V0KGNwdSwgY3B1X29ubGluZV9tYXApKQogCQljcHVfcmVsYXgoKTsKIApAQCAtMTE5MCw3ICs5ODIsNiBAQAogCXNtcF9jbGVhbnVwX2Jvb3QoKTsKIAlzZXR1cF9pb2FwaWNfZGVzdCgpOwogCWNoZWNrX25taV93YXRjaGRvZygpOwotCXRpbWVfaW5pdF9ndG9kKCk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdGltZS5jCmluZGV4IDNjYzY4ODYuLmE4N2M1MTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC90aW1lLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RpbWUuYwpAQCAtNDIsMTAgKzQyLDggQEAKICNpbmNsdWRlIDxsaW51eC9jcHVmcmVxLmg+CiAjaW5jbHVkZSA8bGludXgvaHBldC5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL2hwZXQuaD4KIAotI2lmZGVmIENPTkZJR19DUFVfRlJFUQotc3RhdGljIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKTsKLSNlbmRpZgogZXh0ZXJuIHZvaWQgaTgyNTRfdGltZXJfcmVzdW1lKHZvaWQpOwogZXh0ZXJuIGludCB1c2luZ19hcGljX3RpbWVyOwogCkBAIC01NSwxMjggKzUzLDcgQEAKIEVYUE9SVF9TWU1CT0wocnRjX2xvY2spOwogREVGSU5FX1NQSU5MT0NLKGk4MjUzX2xvY2spOwogCi1pbnQgbm9ocGV0IF9faW5pdGRhdGEgPSAwOwotc3RhdGljIGludCBub3RzYyBfX2luaXRkYXRhID0gMDsKLQotI2RlZmluZSBVU0VDX1BFUl9USUNLIChVU0VDX1BFUl9TRUMgLyBIWikKLSNkZWZpbmUgTlNFQ19QRVJfVElDSyAoTlNFQ19QRVJfU0VDIC8gSFopCi0jZGVmaW5lIEZTRUNfUEVSX1RJQ0sgKEZTRUNfUEVSX1NFQyAvIEhaKQotCi0jZGVmaW5lIE5TX1NDQUxFCTEwIC8qIDJeMTAsIGNhcmVmdWxseSBjaG9zZW4gKi8KLSNkZWZpbmUgVVNfU0NBTEUJMzIgLyogMl4zMiwgYXJiaXRyYWxyaWx5IGNob3NlbiAqLwotCi11bnNpZ25lZCBpbnQgY3B1X2toejsJCQkJCS8qIFRTQyBjbG9ja3MgLyB1c2VjLCBub3QgdXNlZCBoZXJlICovCi1FWFBPUlRfU1lNQk9MKGNwdV9raHopOwotc3RhdGljIHVuc2lnbmVkIGxvbmcgaHBldF9wZXJpb2Q7CQkJLyogZnNlY3MgLyBIUEVUIGNsb2NrICovCi11bnNpZ25lZCBsb25nIGhwZXRfdGljazsJCQkJLyogSFBFVCBjbG9ja3MgLyBpbnRlcnJ1cHQgKi8KLWludCBocGV0X3VzZV90aW1lcjsJCQkJLyogVXNlIGNvdW50ZXIgb2YgaHBldCBmb3IgdGltZSBrZWVwaW5nLCBvdGhlcndpc2UgUElUICovCi11bnNpZ25lZCBsb25nIHZ4dGltZV9oeiA9IFBJVF9USUNLX1JBVEU7Ci1pbnQgcmVwb3J0X2xvc3RfdGlja3M7CQkJCS8qIGNvbW1hbmQgbGluZSBvcHRpb24gKi8KLXVuc2lnbmVkIGxvbmcgbG9uZyBtb25vdG9uaWNfYmFzZTsKLQotc3RydWN0IHZ4dGltZV9kYXRhIF9fdnh0aW1lIF9fc2VjdGlvbl92eHRpbWU7CS8qIGZvciB2c3lzY2FsbHMgKi8KLQogdm9sYXRpbGUgdW5zaWduZWQgbG9uZyBfX2ppZmZpZXMgX19zZWN0aW9uX2ppZmZpZXMgPSBJTklUSUFMX0pJRkZJRVM7Ci1zdHJ1Y3QgdGltZXNwZWMgX194dGltZSBfX3NlY3Rpb25feHRpbWU7Ci1zdHJ1Y3QgdGltZXpvbmUgX19zeXNfdHogX19zZWN0aW9uX3N5c190ejsKLQotLyoKLSAqIGRvX2dldHRpbWVvZmZzZXQoKSByZXR1cm5zIG1pY3Jvc2Vjb25kcyBzaW5jZSBsYXN0IHRpbWVyIGludGVycnVwdCB3YXMKLSAqIHRyaWdnZXJlZCBieSBoYXJkd2FyZS4gQSBtZW1vcnkgcmVhZCBvZiBIUEVUIGlzIHNsb3dlciB0aGFuIGEgcmVnaXN0ZXIgcmVhZAotICogb2YgVFNDLCBidXQgbXVjaCBtb3JlIHJlbGlhYmxlLiBJdCdzIGFsc28gc3luY2hyb25pemVkIHRvIHRoZSB0aW1lcgotICogaW50ZXJydXB0LiBOb3RlIHRoYXQgZG9fZ2V0dGltZW9mZnNldCgpIG1heSByZXR1cm4gbW9yZSB0aGFuIGhwZXRfdGljaywgaWYgYQotICogdGltZXIgaW50ZXJydXB0IGhhcyBoYXBwZW5lZCBhbHJlYWR5LCBidXQgdnh0aW1lLnRyaWdnZXIgd2Fzbid0IHVwZGF0ZWQgeWV0LgotICogVGhpcyBpcyBub3QgYSBwcm9ibGVtLCBiZWNhdXNlIGppZmZpZXMgaGFzbid0IHVwZGF0ZWQgZWl0aGVyLiBUaGV5IGFyZSBib3VuZAotICogdG9nZXRoZXIgYnkgeHRpbWVfbG9jay4KLSAqLwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCBkb19nZXR0aW1lb2Zmc2V0X3RzYyh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgdDsKLQl1bnNpZ25lZCBsb25nIHg7Ci0JdCA9IGdldF9jeWNsZXNfc3luYygpOwotCWlmICh0IDwgdnh0aW1lLmxhc3RfdHNjKSAKLQkJdCA9IHZ4dGltZS5sYXN0X3RzYzsgLyogaGFjayAqLwotCXggPSAoKHQgLSB2eHRpbWUubGFzdF90c2MpICogdnh0aW1lLnRzY19xdW90KSA+PiBVU19TQ0FMRTsKLQlyZXR1cm4geDsKLX0KLQotc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZG9fZ2V0dGltZW9mZnNldF9ocGV0KHZvaWQpCi17Ci0JLyogY2FwIGNvdW50ZXIgcmVhZCB0byBvbmUgdGljayB0byBhdm9pZCBpbmNvbnNpc3RlbmNpZXMgKi8KLQl1bnNpZ25lZCBsb25nIGNvdW50ZXIgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUikgLSB2eHRpbWUubGFzdDsKLQlyZXR1cm4gKG1pbihjb3VudGVyLGhwZXRfdGljaykgKiB2eHRpbWUucXVvdCkgPj4gVVNfU0NBTEU7Ci19Ci0KLXVuc2lnbmVkIGludCAoKmRvX2dldHRpbWVvZmZzZXQpKHZvaWQpID0gZG9fZ2V0dGltZW9mZnNldF90c2M7Ci0KLS8qCi0gKiBUaGlzIHZlcnNpb24gb2YgZ2V0dGltZW9mZGF5KCkgaGFzIG1pY3Jvc2Vjb25kIHJlc29sdXRpb24gYW5kIGJldHRlciB0aGFuCi0gKiBtaWNyb3NlY29uZCBwcmVjaXNpb24sIGFzIHdlJ3JlIHVzaW5nIGF0IGxlYXN0IGEgMTAgTUh6ICh1c3VhbGx5IDE0LjMxODE4Ci0gKiBNSHopIEhQRVQgdGltZXIuCi0gKi8KLQotdm9pZCBkb19nZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2KQotewotCXVuc2lnbmVkIGxvbmcgc2VxOwotIAl1bnNpZ25lZCBpbnQgc2VjLCB1c2VjOwotCi0JZG8gewotCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKLQotCQlzZWMgPSB4dGltZS50dl9zZWM7Ci0JCXVzZWMgPSB4dGltZS50dl9uc2VjIC8gTlNFQ19QRVJfVVNFQzsKLQotCQkvKiBpMzg2IGRvZXMgc29tZSBjb3JyZWN0aW9uIGhlcmUgdG8ga2VlcCB0aGUgY2xvY2sgCi0JCSAgIG1vbm90b25vdXMgZXZlbiB3aGVuIG50cGQgaXMgZml4aW5nIGRyaWZ0LgotCQkgICBCdXQgdGhleSBkaWRuJ3Qgd29yayBmb3IgbWUsIHRoZXJlIGlzIGEgbm9uIG1vbm90b25pYwotCQkgICBjbG9jayBhbnl3YXlzIHdpdGggbnRwLgotCQkgICBJIGRyb3BwZWQgYWxsIGNvcnJlY3Rpb25zIG5vdyB1bnRpbCBhIHJlYWwgc29sdXRpb24gY2FuCi0JCSAgIGJlIGZvdW5kLiBOb3RlIHdoZW4geW91IGZpeCBpdCBoZXJlIHlvdSBuZWVkIHRvIGRvIHRoZSBzYW1lCi0JCSAgIGluIGFyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jIGFuZCBleHBvcnQgYWxsIG5lZWRlZAotCQkgICB2YXJpYWJsZXMgaW4gdm1saW51eC5sZHMuIC1BSyAqLyAKLQkJdXNlYyArPSBkb19nZXR0aW1lb2Zmc2V0KCk7Ci0KLQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKLQotCXR2LT50dl9zZWMgPSBzZWMgKyB1c2VjIC8gVVNFQ19QRVJfU0VDOwotCXR2LT50dl91c2VjID0gdXNlYyAlIFVTRUNfUEVSX1NFQzsKLX0KLQotRVhQT1JUX1NZTUJPTChkb19nZXR0aW1lb2ZkYXkpOwotCi0vKgotICogc2V0dGltZW9mZGF5KCkgZmlyc3QgdW5kb2VzIHRoZSBjb3JyZWN0aW9uIHRoYXQgZ2V0dGltZW9mZGF5IHdvdWxkIGRvCi0gKiBvbiB0aGUgdGltZSwgYW5kIHRoZW4gc2F2ZXMgaXQuIFRoaXMgaXMgdWdseSwgYnV0IGhhcyBiZWVuIGxpa2UgdGhpcyBmb3IKLSAqIGFnZXMgYWxyZWFkeS4KLSAqLwotCi1pbnQgZG9fc2V0dGltZW9mZGF5KHN0cnVjdCB0aW1lc3BlYyAqdHYpCi17Ci0JdGltZV90IHd0bV9zZWMsIHNlYyA9IHR2LT50dl9zZWM7Ci0JbG9uZyB3dG1fbnNlYywgbnNlYyA9IHR2LT50dl9uc2VjOwotCi0JaWYgKCh1bnNpZ25lZCBsb25nKXR2LT50dl9uc2VjID49IE5TRUNfUEVSX1NFQykKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQl3cml0ZV9zZXFsb2NrX2lycSgmeHRpbWVfbG9jayk7Ci0KLQluc2VjIC09IGRvX2dldHRpbWVvZmZzZXQoKSAqIE5TRUNfUEVSX1VTRUM7Ci0KLQl3dG1fc2VjICA9IHdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYyArICh4dGltZS50dl9zZWMgLSBzZWMpOwotCXd0bV9uc2VjID0gd2FsbF90b19tb25vdG9uaWMudHZfbnNlYyArICh4dGltZS50dl9uc2VjIC0gbnNlYyk7Ci0KLQlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmeHRpbWUsIHNlYywgbnNlYyk7Ci0Jc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJndhbGxfdG9fbW9ub3RvbmljLCB3dG1fc2VjLCB3dG1fbnNlYyk7Ci0KLQludHBfY2xlYXIoKTsKLQotCXdyaXRlX3NlcXVubG9ja19pcnEoJnh0aW1lX2xvY2spOwotCWNsb2NrX3dhc19zZXQoKTsKLQlyZXR1cm4gMDsKLX0KLQotRVhQT1JUX1NZTUJPTChkb19zZXR0aW1lb2ZkYXkpOwogCiB1bnNpZ25lZCBsb25nIHByb2ZpbGVfcGMoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCiB7CkBAIC0yNjcsODQgKzE0NCw5IEBACiB9CiAKIAotLyogbW9ub3RvbmljX2Nsb2NrKCk6IHJldHVybnMgIyBvZiBuYW5vc2Vjb25kcyBwYXNzZWQgc2luY2UgdGltZV9pbml0KCkKLSAqCQlOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzIHJlcXVpcmVkIHRvIHJldHVybiBhY2N1cmF0ZQotICoJCXRpbWUgZXZlbiBpbiB0aGUgYWJzZW5jZSBvZiBtdWx0aXBsZSB0aW1lciB0aWNrcy4KLSAqLwotc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgY3ljbGVzXzJfbnModW5zaWduZWQgbG9uZyBsb25nIGN5Yyk7Ci11bnNpZ25lZCBsb25nIGxvbmcgbW9ub3RvbmljX2Nsb2NrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBzZXE7Ci0gCXUzMiBsYXN0X29mZnNldCwgdGhpc19vZmZzZXQsIG9mZnNldDsKLQl1bnNpZ25lZCBsb25nIGxvbmcgYmFzZTsKLQotCWlmICh2eHRpbWUubW9kZSA9PSBWWFRJTUVfSFBFVCkgewotCQlkbyB7Ci0JCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKLQotCQkJbGFzdF9vZmZzZXQgPSB2eHRpbWUubGFzdDsKLQkJCWJhc2UgPSBtb25vdG9uaWNfYmFzZTsKLQkJCXRoaXNfb2Zmc2V0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKLQkJb2Zmc2V0ID0gKHRoaXNfb2Zmc2V0IC0gbGFzdF9vZmZzZXQpOwotCQlvZmZzZXQgKj0gTlNFQ19QRVJfVElDSyAvIGhwZXRfdGljazsKLQl9IGVsc2UgewotCQlkbyB7Ci0JCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKLQotCQkJbGFzdF9vZmZzZXQgPSB2eHRpbWUubGFzdF90c2M7Ci0JCQliYXNlID0gbW9ub3RvbmljX2Jhc2U7Ci0JCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwotCQl0aGlzX29mZnNldCA9IGdldF9jeWNsZXNfc3luYygpOwotCQlvZmZzZXQgPSBjeWNsZXNfMl9ucyh0aGlzX29mZnNldCAtIGxhc3Rfb2Zmc2V0KTsKLQl9Ci0JcmV0dXJuIGJhc2UgKyBvZmZzZXQ7Ci19Ci1FWFBPUlRfU1lNQk9MKG1vbm90b25pY19jbG9jayk7Ci0KLXN0YXRpYyBub2lubGluZSB2b2lkIGhhbmRsZV9sb3N0X3RpY2tzKGludCBsb3N0KQotewotCXN0YXRpYyBsb25nIGxvc3RfY291bnQ7Ci0Jc3RhdGljIGludCB3YXJuZWQ7Ci0JaWYgKHJlcG9ydF9sb3N0X3RpY2tzKSB7Ci0JCXByaW50ayhLRVJOX1dBUk5JTkcgInRpbWUuYzogTG9zdCAlZCB0aW1lciB0aWNrKHMpISAiLCBsb3N0KTsKLQkJcHJpbnRfc3ltYm9sKCJyaXAgJXMpXG4iLCBnZXRfaXJxX3JlZ3MoKS0+cmlwKTsKLQl9Ci0KLQlpZiAobG9zdF9jb3VudCA9PSAxMDAwICYmICF3YXJuZWQpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAid2FybmluZzogbWFueSBsb3N0IHRpY2tzLlxuIgotCQkgICAgICAgS0VSTl9XQVJOSU5HICJZb3VyIHRpbWUgc291cmNlIHNlZW1zIHRvIGJlIGluc3RhYmxlIG9yICIKLQkJICAgCQkic29tZSBkcml2ZXIgaXMgaG9nZ2luZyBpbnRlcnVwdHNcbiIpOwotCQlwcmludF9zeW1ib2woInJpcCAlc1xuIiwgZ2V0X2lycV9yZWdzKCktPnJpcCk7Ci0JCWlmICh2eHRpbWUubW9kZSA9PSBWWFRJTUVfVFNDICYmIHZ4dGltZS5ocGV0X2FkZHJlc3MpIHsKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgIkZhbGxpbmcgYmFjayB0byBIUEVUXG4iKTsKLQkJCWlmIChocGV0X3VzZV90aW1lcikKLQkJCQl2eHRpbWUubGFzdCA9IGhwZXRfcmVhZGwoSFBFVF9UMF9DTVApIC0gCi0JCQkJCQkJaHBldF90aWNrOwotCQkJZWxzZQotCQkJCXZ4dGltZS5sYXN0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCQkJdnh0aW1lLm1vZGUgPSBWWFRJTUVfSFBFVDsKLQkJCWRvX2dldHRpbWVvZmZzZXQgPSBkb19nZXR0aW1lb2Zmc2V0X2hwZXQ7Ci0JCX0KLQkJLyogZWxzZSBzaG91bGQgZmFsbCBiYWNrIHRvIFBJVCwgYnV0IGNvZGUgbWlzc2luZy4gKi8KLQkJd2FybmVkID0gMTsKLQl9IGVsc2UKLQkJbG9zdF9jb3VudCsrOwotCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRCi0JLyogSW4gc29tZSBjYXNlcyB0aGUgQ1BVIGNhbiBjaGFuZ2UgZnJlcXVlbmN5IHdpdGhvdXQgdXMgbm90aWNpbmcKLQkgICBHaXZlIGNwdWZyZXEgYSBjaGFuZ2UgdG8gY2F0Y2ggdXAuICovCi0JaWYgKChsb3N0X2NvdW50KzEpICUgMjUgPT0gMCkKLQkJY3B1ZnJlcV9kZWxheWVkX2dldCgpOwotI2VuZGlmCi19Ci0KIHZvaWQgbWFpbl90aW1lcl9oYW5kbGVyKHZvaWQpCiB7CiAJc3RhdGljIHVuc2lnbmVkIGxvbmcgcnRjX3VwZGF0ZSA9IDA7Ci0JdW5zaWduZWQgbG9uZyB0c2M7Ci0JaW50IGRlbGF5ID0gMCwgb2Zmc2V0ID0gMCwgbG9zdCA9IDA7Ci0KIC8qCiAgKiBIZXJlIHdlIGFyZSBpbiB0aGUgdGltZXIgaXJxIGhhbmRsZXIuIFdlIGhhdmUgaXJxcyBsb2NhbGx5IGRpc2FibGVkIChzbyB3ZQogICogZG9uJ3QgbmVlZCBzcGluX2xvY2tfaXJxc2F2ZSgpKSBidXQgd2UgZG9uJ3Qga25vdyBpZiB0aGUgdGltZXJfYmggaXMgcnVubmluZwpAQCAtMzU0LDcyICsxNTYsMTEgQEAKIAogCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOwogCi0JaWYgKHZ4dGltZS5ocGV0X2FkZHJlc3MpCi0JCW9mZnNldCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQotCWlmIChocGV0X3VzZV90aW1lcikgewotCQkvKiBpZiB3ZSdyZSB1c2luZyB0aGUgaHBldCB0aW1lciBmdW5jdGlvbmFsaXR5LAotCQkgKiB3ZSBjYW4gbW9yZSBhY2N1cmF0ZWx5IGtub3cgdGhlIGNvdW50ZXIgdmFsdWUKLQkJICogd2hlbiB0aGUgdGltZXIgaW50ZXJydXB0IG9jY3VyZWQuCi0JCSAqLwotCQlvZmZzZXQgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKSAtIGhwZXRfdGljazsKLQkJZGVsYXkgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUikgLSBvZmZzZXQ7Ci0JfSBlbHNlIGlmICghcG10bXJfaW9wb3J0KSB7Ci0JCXNwaW5fbG9jaygmaTgyNTNfbG9jayk7Ci0JCW91dGJfcCgweDAwLCAweDQzKTsKLQkJZGVsYXkgPSBpbmJfcCgweDQwKTsKLQkJZGVsYXkgfD0gaW5iKDB4NDApIDw8IDg7Ci0JCXNwaW5fdW5sb2NrKCZpODI1M19sb2NrKTsKLQkJZGVsYXkgPSBMQVRDSCAtIDEgLSBkZWxheTsKLQl9Ci0KLQl0c2MgPSBnZXRfY3ljbGVzX3N5bmMoKTsKLQotCWlmICh2eHRpbWUubW9kZSA9PSBWWFRJTUVfSFBFVCkgewotCQlpZiAob2Zmc2V0IC0gdnh0aW1lLmxhc3QgPiBocGV0X3RpY2spIHsKLQkJCWxvc3QgPSAob2Zmc2V0IC0gdnh0aW1lLmxhc3QpIC8gaHBldF90aWNrIC0gMTsKLQkJfQotCi0JCW1vbm90b25pY19iYXNlICs9IAotCQkJKG9mZnNldCAtIHZ4dGltZS5sYXN0KSAqIE5TRUNfUEVSX1RJQ0sgLyBocGV0X3RpY2s7Ci0KLQkJdnh0aW1lLmxhc3QgPSBvZmZzZXQ7Ci0jaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgotCX0gZWxzZSBpZiAodnh0aW1lLm1vZGUgPT0gVlhUSU1FX1BNVE1SKSB7Ci0JCWxvc3QgPSBwbXRpbWVyX21hcmtfb2Zmc2V0KCk7Ci0jZW5kaWYKLQl9IGVsc2UgewotCQlvZmZzZXQgPSAoKCh0c2MgLSB2eHRpbWUubGFzdF90c2MpICoKLQkJCSAgIHZ4dGltZS50c2NfcXVvdCkgPj4gVVNfU0NBTEUpIC0gVVNFQ19QRVJfVElDSzsKLQotCQlpZiAob2Zmc2V0IDwgMCkKLQkJCW9mZnNldCA9IDA7Ci0KLQkJaWYgKG9mZnNldCA+IFVTRUNfUEVSX1RJQ0spIHsKLQkJCWxvc3QgPSBvZmZzZXQgLyBVU0VDX1BFUl9USUNLOwotCQkJb2Zmc2V0ICU9IFVTRUNfUEVSX1RJQ0s7Ci0JCX0KLQotCQltb25vdG9uaWNfYmFzZSArPSBjeWNsZXNfMl9ucyh0c2MgLSB2eHRpbWUubGFzdF90c2MpOwotCi0JCXZ4dGltZS5sYXN0X3RzYyA9IHRzYyAtIHZ4dGltZS5xdW90ICogZGVsYXkgLyB2eHRpbWUudHNjX3F1b3Q7Ci0KLQkJaWYgKCgoKHRzYyAtIHZ4dGltZS5sYXN0X3RzYykgKgotCQkgICAgICB2eHRpbWUudHNjX3F1b3QpID4+IFVTX1NDQUxFKSA8IG9mZnNldCkKLQkJCXZ4dGltZS5sYXN0X3RzYyA9IHRzYyAtCi0JCQkJKCgobG9uZykgb2Zmc2V0IDw8IFVTX1NDQUxFKSAvIHZ4dGltZS50c2NfcXVvdCkgLSAxOwotCX0KLQotCWlmIChsb3N0ID4gMCkKLQkJaGFuZGxlX2xvc3RfdGlja3MobG9zdCk7Ci0JZWxzZQotCQlsb3N0ID0gMDsKLQogLyoKICAqIERvIHRoZSB0aW1lciBzdHVmZi4KICAqLwogCi0JZG9fdGltZXIobG9zdCArIDEpOworCWRvX3RpbWVyKDEpOwogI2lmbmRlZiBDT05GSUdfU01QCiAJdXBkYXRlX3Byb2Nlc3NfdGltZXModXNlcl9tb2RlKGdldF9pcnFfcmVncygpKSk7CiAjZW5kaWYKQEAgLTQ2MCw0MCArMjAxLDYgQEAKIAlyZXR1cm4gSVJRX0hBTkRMRUQ7CiB9CiAKLXN0YXRpYyB1bnNpZ25lZCBpbnQgY3ljMm5zX3NjYWxlIF9fcmVhZF9tb3N0bHk7Ci0KLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfY3ljMm5zX3NjYWxlKHVuc2lnbmVkIGxvbmcgY3B1X2toeikKLXsKLQljeWMybnNfc2NhbGUgPSAoTlNFQ19QRVJfTVNFQyA8PCBOU19TQ0FMRSkgLyBjcHVfa2h6OwotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfMl9ucyh1bnNpZ25lZCBsb25nIGxvbmcgY3ljKQotewotCXJldHVybiAoY3ljICogY3ljMm5zX3NjYWxlKSA+PiBOU19TQ0FMRTsKLX0KLQotdW5zaWduZWQgbG9uZyBsb25nIHNjaGVkX2Nsb2NrKHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBhID0gMDsKLQotI2lmIDAKLQkvKiBEb24ndCBkbyBhIEhQRVQgcmVhZCBoZXJlLiBVc2luZyBUU0MgYWx3YXlzIGlzIG11Y2ggZmFzdGVyCi0JICAgYW5kIEhQRVQgbWF5IG5vdCBiZSBtYXBwZWQgeWV0IHdoZW4gdGhlIHNjaGVkdWxlciBmaXJzdCBydW5zLgotICAgICAgICAgICBEaXNhZHZhbnRhZ2UgaXMgYSBzbWFsbCBkcmlmdCBiZXR3ZWVuIENQVXMgaW4gc29tZSBjb25maWd1cmF0aW9ucywKLQkgICBidXQgdGhhdCBzaG91bGQgYmUgdG9sZXJhYmxlLiAqLwotCWlmIChfX3Z4dGltZS5tb2RlID09IFZYVElNRV9IUEVUKQotCQlyZXR1cm4gKGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKSAqIHZ4dGltZS5xdW90KSA+PiBVU19TQ0FMRTsKLSNlbmRpZgotCi0JLyogQ291bGQgZG8gQ1BVIGNvcmUgc3luYyBoZXJlLiBPcHRlcm9uIGNhbiBleGVjdXRlIHJkdHNjIHNwZWN1bGF0aXZlbHksCi0JICAgd2hpY2ggbWVhbnMgaXQgaXMgbm90IGNvbXBsZXRlbHkgZXhhY3QgYW5kIG1heSBub3QgYmUgbW9ub3Rvbm91cyBiZXR3ZWVuCi0JICAgQ1BVcy4gQnV0IHRoZSBlcnJvcnMgc2hvdWxkIGJlIHRvbyBzbWFsbCB0byBtYXR0ZXIgZm9yIHNjaGVkdWxpbmcKLQkgICBwdXJwb3Nlcy4gKi8KLQotCXJkdHNjbGwoYSk7Ci0JcmV0dXJuIGN5Y2xlc18yX25zKGEpOwotfQotCiBzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfY21vc190aW1lKHZvaWQpCiB7CiAJdW5zaWduZWQgaW50IHllYXIsIG1vbiwgZGF5LCBob3VyLCBtaW4sIHNlYzsKQEAgLTU0NSwxNjQgKzI1Miw2IEBACiAJcmV0dXJuIG1rdGltZSh5ZWFyLCBtb24sIGRheSwgaG91ciwgbWluLCBzZWMpOwogfQogCi0jaWZkZWYgQ09ORklHX0NQVV9GUkVRCi0KLS8qIEZyZXF1ZW5jeSBzY2FsaW5nIHN1cHBvcnQuIEFkanVzdCB0aGUgVFNDIGJhc2VkIHRpbWVyIHdoZW4gdGhlIGNwdSBmcmVxdWVuY3kKLSAgIGNoYW5nZXMuCi0gICAKLSAgIFJFRC1QRU46IE9uIFNNUCB3ZSBhc3N1bWUgYWxsIENQVXMgcnVuIHdpdGggdGhlIHNhbWUgZnJlcXVlbmN5LiAgSXQncwotICAgbm90IHRoYXQgaW1wb3J0YW50IGJlY2F1c2UgY3VycmVudCBPcHRlcm9uIHNldHVwcyBkbyBub3Qgc3VwcG9ydAotICAgc2NhbGluZyBvbiBTTVAgYW55cm9hZHMuCi0KLSAgIFNob3VsZCBmaXggdXAgbGFzdF90c2MgdG9vLiBDdXJyZW50bHkgZ2V0dGltZW9mZGF5IGluIHRoZQotICAgZmlyc3QgdGljayBhZnRlciB0aGUgY2hhbmdlIHdpbGwgYmUgc2xpZ2h0bHkgd3JvbmcuICovCi0KLSNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KLQotc3RhdGljIHVuc2lnbmVkIGludCBjcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Ci1zdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfaW5pdCA9IDA7Ci1zdGF0aWMgc3RydWN0IHdvcmtfc3RydWN0IGNwdWZyZXFfZGVsYXllZF9nZXRfd29yazsKLQotc3RhdGljIHZvaWQgaGFuZGxlX2NwdWZyZXFfZGVsYXllZF9nZXQoc3RydWN0IHdvcmtfc3RydWN0ICp2KQotewotCXVuc2lnbmVkIGludCBjcHU7Ci0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKLQkJY3B1ZnJlcV9nZXQoY3B1KTsKLQl9Ci0JY3B1ZnJlcV9kZWxheWVkX2lzc2NoZWQgPSAwOwotfQotCi0vKiBpZiB3ZSBub3RpY2UgbG9zdCB0aWNrcywgc2NoZWR1bGUgYSBjYWxsIHRvIGNwdWZyZXFfZ2V0KCkgYXMgaXQgdHJpZXMKLSAqIHRvIHZlcmlmeSB0aGUgQ1BVIGZyZXF1ZW5jeSB0aGUgdGltaW5nIGNvcmUgdGhpbmtzIHRoZSBDUFUgaXMgcnVubmluZwotICogYXQgaXMgc3RpbGwgY29ycmVjdC4KLSAqLwotc3RhdGljIHZvaWQgY3B1ZnJlcV9kZWxheWVkX2dldCh2b2lkKQotewotCXN0YXRpYyBpbnQgd2FybmVkOwotCWlmIChjcHVmcmVxX2luaXQgJiYgIWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkKSB7Ci0JCWNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMTsKLQkJaWYgKCF3YXJuZWQpIHsKLQkJCXdhcm5lZCA9IDE7Ci0JCQlwcmludGsoS0VSTl9ERUJVRyAKLQkiTG9zaW5nIHNvbWUgdGlja3MuLi4gY2hlY2tpbmcgaWYgQ1BVIGZyZXF1ZW5jeSBjaGFuZ2VkLlxuIik7Ci0JCX0KLQkJc2NoZWR1bGVfd29yaygmY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrKTsKLQl9Ci19Ci0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgIHJlZl9mcmVxID0gMDsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeV9yZWYgPSAwOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfa2h6X3JlZiA9IDA7Ci0KLXN0YXRpYyBpbnQgdGltZV9jcHVmcmVxX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAotCQkJCSB2b2lkICpkYXRhKQotewotICAgICAgICBzdHJ1Y3QgY3B1ZnJlcV9mcmVxcyAqZnJlcSA9IGRhdGE7Ci0JdW5zaWduZWQgbG9uZyAqbHBqLCBkdW1teTsKLQotCWlmIChjcHVfaGFzKCZjcHVfZGF0YVtmcmVxLT5jcHVdLCBYODZfRkVBVFVSRV9DT05TVEFOVF9UU0MpKQotCQlyZXR1cm4gMDsKLQotCWxwaiA9ICZkdW1teTsKLQlpZiAoIShmcmVxLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKQotI2lmZGVmIENPTkZJR19TTVAKLQkJbHBqID0gJmNwdV9kYXRhW2ZyZXEtPmNwdV0ubG9vcHNfcGVyX2ppZmZ5OwotI2Vsc2UKLQkJbHBqID0gJmJvb3RfY3B1X2RhdGEubG9vcHNfcGVyX2ppZmZ5OwotI2VuZGlmCi0KLQlpZiAoIXJlZl9mcmVxKSB7Ci0JCXJlZl9mcmVxID0gZnJlcS0+b2xkOwotCQlsb29wc19wZXJfamlmZnlfcmVmID0gKmxwajsKLQkJY3B1X2toel9yZWYgPSBjcHVfa2h6OwotCX0KLSAgICAgICAgaWYgKCh2YWwgPT0gQ1BVRlJFUV9QUkVDSEFOR0UgICYmIGZyZXEtPm9sZCA8IGZyZXEtPm5ldykgfHwKLSAgICAgICAgICAgICh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFICYmIGZyZXEtPm9sZCA+IGZyZXEtPm5ldykgfHwKLQkgICAgKHZhbCA9PSBDUFVGUkVRX1JFU1VNRUNIQU5HRSkpIHsKLSAgICAgICAgICAgICAgICAqbHBqID0KLQkJY3B1ZnJlcV9zY2FsZShsb29wc19wZXJfamlmZnlfcmVmLCByZWZfZnJlcSwgZnJlcS0+bmV3KTsKLQotCQljcHVfa2h6ID0gY3B1ZnJlcV9zY2FsZShjcHVfa2h6X3JlZiwgcmVmX2ZyZXEsIGZyZXEtPm5ldyk7Ci0JCWlmICghKGZyZXEtPmZsYWdzICYgQ1BVRlJFUV9DT05TVF9MT09QUykpCi0JCQl2eHRpbWUudHNjX3F1b3QgPSAoVVNFQ19QRVJfTVNFQyA8PCBVU19TQ0FMRSkgLyBjcHVfa2h6OwotCX0KLQkKLQlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHpfcmVmKTsKLQotCXJldHVybiAwOwotfQotIAotc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayB0aW1lX2NwdWZyZXFfbm90aWZpZXJfYmxvY2sgPSB7Ci0gICAgICAgICAubm90aWZpZXJfY2FsbCAgPSB0aW1lX2NwdWZyZXFfbm90aWZpZXIKLX07Ci0KLXN0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfdHNjKHZvaWQpCi17Ci0JSU5JVF9XT1JLKCZjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcmssIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0KTsKLQlpZiAoIWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKLQkJCQkgICAgICAgQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKSkKLQkJY3B1ZnJlcV9pbml0ID0gMTsKLQlyZXR1cm4gMDsKLX0KLQotY29yZV9pbml0Y2FsbChjcHVmcmVxX3RzYyk7Ci0KLSNlbmRpZgotCi0vKgotICogY2FsaWJyYXRlX3RzYygpIGNhbGlicmF0ZXMgdGhlIHByb2Nlc3NvciBUU0MgaW4gYSB2ZXJ5IHNpbXBsZSB3YXksIGNvbXBhcmluZwotICogaXQgdG8gdGhlIEhQRVQgdGltZXIgb2Yga25vd24gZnJlcXVlbmN5LgotICovCi0KLSNkZWZpbmUgVElDS19DT1VOVCAxMDAwMDAwMDAKLSNkZWZpbmUgVElDS19NSU4gICA1MDAwCi0jZGVmaW5lIE1BWF9SRUFEX1JFVFJJRVMgNQotCi0vKgotICogU29tZSBwbGF0Zm9ybXMgdGFrZSBwZXJpb2RpYyBTTUkgaW50ZXJydXB0cyB3aXRoIDVtcyBkdXJhdGlvbi4gTWFrZSBzdXJlIG5vbmUKLSAqIG9jY3VycyBiZXR3ZWVuIHRoZSByZWFkcyBvZiB0aGUgaHBldCAmIFRTQy4KLSAqLwotc3RhdGljIHZvaWQgX19pbml0IHJlYWRfaHBldF90c2MoaW50ICpocGV0LCBpbnQgKnRzYykKLXsKLQlpbnQgdHNjMSwgdHNjMiwgaHBldDEsIHJldHJpZXMgPSAwOwotCXN0YXRpYyBpbnQgbXNnOwotCi0JZG8gewotCQl0c2MxID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0JCWhwZXQxID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotCQl0c2MyID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0JfSB3aGlsZSAodHNjMiAtIHRzYzEgPiBUSUNLX01JTiAmJiByZXRyaWVzKysgPCBNQVhfUkVBRF9SRVRSSUVTKTsKLQlpZiAocmV0cmllcyA+PSBNQVhfUkVBRF9SRVRSSUVTICYmICFtc2crKykKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgImhwZXQuYzogZXhjZWVkZWQgbWF4IHJldHJpZXMgdG8gcmVhZCBIUEVUICYgVFNDXG4iKTsKLQkqaHBldCA9IGhwZXQxOwotCSp0c2MgPSB0c2MyOwotfQotCi0KLXN0YXRpYyB1bnNpZ25lZCBpbnQgX19pbml0IGhwZXRfY2FsaWJyYXRlX3RzYyh2b2lkKQotewotCWludCB0c2Nfc3RhcnQsIGhwZXRfc3RhcnQ7Ci0JaW50IHRzY19ub3csIGhwZXRfbm93OwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JbG9jYWxfaXJxX2Rpc2FibGUoKTsKLQotCXJlYWRfaHBldF90c2MoJmhwZXRfc3RhcnQsICZ0c2Nfc3RhcnQpOwotCi0JZG8gewotCQlsb2NhbF9pcnFfZGlzYWJsZSgpOwotCQlyZWFkX2hwZXRfdHNjKCZocGV0X25vdywgJnRzY19ub3cpOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0JfSB3aGlsZSAoKHRzY19ub3cgLSB0c2Nfc3RhcnQpIDwgVElDS19DT1VOVCAmJgotCQkgKGhwZXRfbm93IC0gaHBldF9zdGFydCkgPCBUSUNLX0NPVU5UKTsKLQotCXJldHVybiAodHNjX25vdyAtIHRzY19zdGFydCkgKiAxMDAwMDAwMDAwTAotCQkvICgoaHBldF9ub3cgLSBocGV0X3N0YXJ0KSAqIGhwZXRfcGVyaW9kIC8gMTAwMCk7Ci19Ci0KIAogLyoKICAqIHBpdF9jYWxpYnJhdGVfdHNjKCkgdXNlcyB0aGUgc3BlYWtlciBvdXRwdXQgKGNoYW5uZWwgMikgb2YKQEAgLTczMywxMjQgKzI4Miw2IEBACiAJcmV0dXJuIChlbmQgLSBzdGFydCkgLyA1MDsKIH0KIAotI2lmZGVmCUNPTkZJR19IUEVUCi1zdGF0aWMgX19pbml0IGludCBsYXRlX2hwZXRfaW5pdCh2b2lkKQotewotCXN0cnVjdCBocGV0X2RhdGEJaGQ7Ci0JdW5zaWduZWQgaW50IAkJbnRpbWVyOwotCi0JaWYgKCF2eHRpbWUuaHBldF9hZGRyZXNzKQotICAgICAgICAJcmV0dXJuIDA7Ci0KLQltZW1zZXQoJmhkLCAwLCBzaXplb2YgKGhkKSk7Ci0KLQludGltZXIgPSBocGV0X3JlYWRsKEhQRVRfSUQpOwotCW50aW1lciA9IChudGltZXIgJiBIUEVUX0lEX05VTUJFUikgPj4gSFBFVF9JRF9OVU1CRVJfU0hJRlQ7Ci0JbnRpbWVyKys7Ci0KLQkvKgotCSAqIFJlZ2lzdGVyIHdpdGggZHJpdmVyLgotCSAqIFRpbWVyMCBhbmQgVGltZXIxIGlzIHVzZWQgYnkgcGxhdGZvcm0uCi0JICovCi0JaGQuaGRfcGh5c19hZGRyZXNzID0gdnh0aW1lLmhwZXRfYWRkcmVzczsKLQloZC5oZF9hZGRyZXNzID0gKHZvaWQgX19pb21lbSAqKWZpeF90b192aXJ0KEZJWF9IUEVUX0JBU0UpOwotCWhkLmhkX25pcnFzID0gbnRpbWVyOwotCWhkLmhkX2ZsYWdzID0gSFBFVF9EQVRBX1BMQVRGT1JNOwotCWhwZXRfcmVzZXJ2ZV90aW1lcigmaGQsIDApOwotI2lmZGVmCUNPTkZJR19IUEVUX0VNVUxBVEVfUlRDCi0JaHBldF9yZXNlcnZlX3RpbWVyKCZoZCwgMSk7Ci0jZW5kaWYKLQloZC5oZF9pcnFbMF0gPSBIUEVUX0xFR0FDWV84MjU0OwotCWhkLmhkX2lycVsxXSA9IEhQRVRfTEVHQUNZX1JUQzsKLQlpZiAobnRpbWVyID4gMikgewotCQlzdHJ1Y3QgaHBldAkJKmhwZXQ7Ci0JCXN0cnVjdCBocGV0X3RpbWVyCSp0aW1lcjsKLQkJaW50CQkJaTsKLQotCQlocGV0ID0gKHN0cnVjdCBocGV0ICopIGZpeF90b192aXJ0KEZJWF9IUEVUX0JBU0UpOwotCQl0aW1lciA9ICZocGV0LT5ocGV0X3RpbWVyc1syXTsKLQkJZm9yIChpID0gMjsgaSA8IG50aW1lcjsgdGltZXIrKywgaSsrKQotCQkJaGQuaGRfaXJxW2ldID0gKHRpbWVyLT5ocGV0X2NvbmZpZyAmCi0JCQkJCVRuX0lOVF9ST1VURV9DTkZfTUFTSykgPj4KLQkJCQlUbl9JTlRfUk9VVEVfQ05GX1NISUZUOwotCi0JfQotCi0JaHBldF9hbGxvYygmaGQpOwotCXJldHVybiAwOwotfQotZnNfaW5pdGNhbGwobGF0ZV9ocGV0X2luaXQpOwotI2VuZGlmCi0KLXN0YXRpYyBpbnQgaHBldF90aW1lcl9zdG9wX3NldF9nbyh1bnNpZ25lZCBsb25nIHRpY2spCi17Ci0JdW5zaWduZWQgaW50IGNmZzsKLQotLyoKLSAqIFN0b3AgdGhlIHRpbWVycyBhbmQgcmVzZXQgdGhlIG1haW4gY291bnRlci4KLSAqLwotCi0JY2ZnID0gaHBldF9yZWFkbChIUEVUX0NGRyk7Ci0JY2ZnICY9IH4oSFBFVF9DRkdfRU5BQkxFIHwgSFBFVF9DRkdfTEVHQUNZKTsKLQlocGV0X3dyaXRlbChjZmcsIEhQRVRfQ0ZHKTsKLQlocGV0X3dyaXRlbCgwLCBIUEVUX0NPVU5URVIpOwotCWhwZXRfd3JpdGVsKDAsIEhQRVRfQ09VTlRFUiArIDQpOwotCi0vKgotICogU2V0IHVwIHRpbWVyIDAsIGFzIHBlcmlvZGljIHdpdGggZmlyc3QgaW50ZXJydXB0IHRvIGhhcHBlbiBhdCBocGV0X3RpY2ssCi0gKiBhbmQgcGVyaW9kIGFsc28gaHBldF90aWNrLgotICovCi0JaWYgKGhwZXRfdXNlX3RpbWVyKSB7Ci0JCWhwZXRfd3JpdGVsKEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl9QRVJJT0RJQyB8IEhQRVRfVE5fU0VUVkFMIHwKLQkJICAgIEhQRVRfVE5fMzJCSVQsIEhQRVRfVDBfQ0ZHKTsKLQkJaHBldF93cml0ZWwoaHBldF90aWNrLCBIUEVUX1QwX0NNUCk7IC8qIG5leHQgaW50ZXJydXB0ICovCi0JCWhwZXRfd3JpdGVsKGhwZXRfdGljaywgSFBFVF9UMF9DTVApOyAvKiBwZXJpb2QgKi8KLQkJY2ZnIHw9IEhQRVRfQ0ZHX0xFR0FDWTsKLQl9Ci0vKgotICogR28hCi0gKi8KLQotCWNmZyB8PSBIUEVUX0NGR19FTkFCTEU7Ci0JaHBldF93cml0ZWwoY2ZnLCBIUEVUX0NGRyk7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBocGV0X2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgaWQ7Ci0KLQlpZiAoIXZ4dGltZS5ocGV0X2FkZHJlc3MpCi0JCXJldHVybiAtMTsKLQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0hQRVRfQkFTRSwgdnh0aW1lLmhwZXRfYWRkcmVzcyk7Ci0JX19zZXRfZml4bWFwKFZTWVNDQUxMX0hQRVQsIHZ4dGltZS5ocGV0X2FkZHJlc3MsIFBBR0VfS0VSTkVMX1ZTWVNDQUxMX05PQ0FDSEUpOwotCi0vKgotICogUmVhZCB0aGUgcGVyaW9kLCBjb21wdXRlIHRpY2sgYW5kIHF1b3RpZW50LgotICovCi0KLQlpZCA9IGhwZXRfcmVhZGwoSFBFVF9JRCk7Ci0KLQlpZiAoIShpZCAmIEhQRVRfSURfVkVORE9SKSB8fCAhKGlkICYgSFBFVF9JRF9OVU1CRVIpKQotCQlyZXR1cm4gLTE7Ci0KLQlocGV0X3BlcmlvZCA9IGhwZXRfcmVhZGwoSFBFVF9QRVJJT0QpOwotCWlmIChocGV0X3BlcmlvZCA8IDEwMDAwMCB8fCBocGV0X3BlcmlvZCA+IDEwMDAwMDAwMCkKLQkJcmV0dXJuIC0xOwotCi0JaHBldF90aWNrID0gKEZTRUNfUEVSX1RJQ0sgKyBocGV0X3BlcmlvZCAvIDIpIC8gaHBldF9wZXJpb2Q7Ci0KLQlocGV0X3VzZV90aW1lciA9IChpZCAmIEhQRVRfSURfTEVHU1VQKTsKLQotCXJldHVybiBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljayk7Ci19Ci0KLXN0YXRpYyBpbnQgaHBldF9yZWVuYWJsZSh2b2lkKQotewotCXJldHVybiBocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKGhwZXRfdGljayk7Ci19Ci0KICNkZWZpbmUgUElUX01PREUgMHg0MwogI2RlZmluZSBQSVRfQ0gwICAweDQwCiAKQEAgLTg3OCw3ICszMDksNyBAQAogdm9pZCBfX2luaXQgc3RvcF90aW1lcl9pbnRlcnJ1cHQodm9pZCkKIHsKIAljaGFyICpuYW1lOwotCWlmICh2eHRpbWUuaHBldF9hZGRyZXNzKSB7CisJaWYgKGhwZXRfYWRkcmVzcykgewogCQluYW1lID0gIkhQRVQiOwogCQlocGV0X3RpbWVyX3N0b3Bfc2V0X2dvKDApOwogCX0gZWxzZSB7CkBAIC04ODgsMTIgKzMxOSw2IEBACiAJcHJpbnRrKEtFUk5fSU5GTyAidGltZXI6ICVzIGludGVycnVwdCBzdG9wcGVkLlxuIiwgbmFtZSk7CiB9CiAKLWludCBfX2luaXQgdGltZV9zZXR1cChjaGFyICpzdHIpCi17Ci0JcmVwb3J0X2xvc3RfdGlja3MgPSAxOwotCXJldHVybiAxOwotfQotCiBzdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEwID0gewogCXRpbWVyX2ludGVycnVwdCwgSVJRRl9ESVNBQkxFRCwgQ1BVX01BU0tfTk9ORSwgInRpbWVyIiwgTlVMTCwgTlVMTAogfTsKQEAgLTkwMSwxMjQgKzMyNiw0MSBAQAogdm9pZCBfX2luaXQgdGltZV9pbml0KHZvaWQpCiB7CiAJaWYgKG5vaHBldCkKLQkJdnh0aW1lLmhwZXRfYWRkcmVzcyA9IDA7Ci0KKwkJaHBldF9hZGRyZXNzID0gMDsKIAl4dGltZS50dl9zZWMgPSBnZXRfY21vc190aW1lKCk7CiAJeHRpbWUudHZfbnNlYyA9IDA7CiAKIAlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCiAJICAgICAgICAgICAgICAgICAgICAgICAgLXh0aW1lLnR2X3NlYywgLXh0aW1lLnR2X25zZWMpOwogCi0JaWYgKCFocGV0X2luaXQoKSkKLSAgICAgICAgICAgICAgICB2eHRpbWVfaHogPSAoRlNFQ19QRVJfU0VDICsgaHBldF9wZXJpb2QgLyAyKSAvIGhwZXRfcGVyaW9kOwotCWVsc2UKLQkJdnh0aW1lLmhwZXRfYWRkcmVzcyA9IDA7CisJaWYgKGhwZXRfYXJjaF9pbml0KCkpCisJCWhwZXRfYWRkcmVzcyA9IDA7CiAKIAlpZiAoaHBldF91c2VfdGltZXIpIHsKIAkJLyogc2V0IHRpY2tfbnNlYyB0byB1c2UgdGhlIHByb3BlciByYXRlIGZvciBIUEVUICovCiAJICAJdGlja19uc2VjID0gVElDS19OU0VDX0hQRVQ7CiAJCWNwdV9raHogPSBocGV0X2NhbGlicmF0ZV90c2MoKTsKIAkJdGltZW5hbWUgPSAiSFBFVCI7Ci0jaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgotCX0gZWxzZSBpZiAocG10bXJfaW9wb3J0ICYmICF2eHRpbWUuaHBldF9hZGRyZXNzKSB7Ci0JCXZ4dGltZV9oeiA9IFBNX1RJTUVSX0ZSRVFVRU5DWTsKLQkJdGltZW5hbWUgPSAiUE0iOwotCQlwaXRfaW5pdCgpOwotCQljcHVfa2h6ID0gcGl0X2NhbGlicmF0ZV90c2MoKTsKLSNlbmRpZgogCX0gZWxzZSB7CiAJCXBpdF9pbml0KCk7CiAJCWNwdV9raHogPSBwaXRfY2FsaWJyYXRlX3RzYygpOwogCQl0aW1lbmFtZSA9ICJQSVQiOwogCX0KIAotCXZ4dGltZS5tb2RlID0gVlhUSU1FX1RTQzsKLQl2eHRpbWUucXVvdCA9IChVU0VDX1BFUl9TRUMgPDwgVVNfU0NBTEUpIC8gdnh0aW1lX2h6OwotCXZ4dGltZS50c2NfcXVvdCA9IChVU0VDX1BFUl9NU0VDIDw8IFVTX1NDQUxFKSAvIGNwdV9raHo7Ci0Jdnh0aW1lLmxhc3RfdHNjID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0Jc2V0X2N5YzJuc19zY2FsZShjcHVfa2h6KTsKLQlzZXR1cF9pcnEoMCwgJmlycTApOwotCi0jaWZuZGVmIENPTkZJR19TTVAKLQl0aW1lX2luaXRfZ3RvZCgpOwotI2VuZGlmCi19Ci0KLS8qCi0gKiBNYWtlIGFuIGVkdWNhdGVkIGd1ZXNzIGlmIHRoZSBUU0MgaXMgdHJ1c3R3b3J0aHkgYW5kIHN5bmNocm9uaXplZAotICogb3ZlciBhbGwgQ1BVcy4KLSAqLwotX19jcHVpbml0IGludCB1bnN5bmNocm9uaXplZF90c2Modm9pZCkKLXsKLSNpZmRlZiBDT05GSUdfU01QCi0JaWYgKGFwaWNfaXNfY2x1c3RlcmVkX2JveCgpKQotCQlyZXR1cm4gMTsKLSNlbmRpZgotCS8qIE1vc3QgaW50ZWwgc3lzdGVtcyBoYXZlIHN5bmNocm9uaXplZCBUU0NzIGV4Y2VwdCBmb3IKLQkgICBtdWx0aSBub2RlIHN5c3RlbXMgKi8KLSAJaWYgKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0lOVEVMKSB7Ci0jaWZkZWYgQ09ORklHX0FDUEkKLQkJLyogQnV0IFRTQyBkb2Vzbid0IHRpY2sgaW4gQzMgc28gZG9uJ3QgdXNlIGl0IHRoZXJlICovCi0JCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5sZW5ndGggPiAwICYmIGFjcGlfZ2JsX0ZBRFQuQzNsYXRlbmN5IDwgMTAwMCkKLQkJCXJldHVybiAxOwotI2VuZGlmCi0gCQlyZXR1cm4gMDsKLQl9Ci0KLSAJLyogQXNzdW1lIG11bHRpIHNvY2tldCBzeXN0ZW1zIGFyZSBub3Qgc3luY2hyb25pemVkICovCi0gCXJldHVybiBudW1fcHJlc2VudF9jcHVzKCkgPiAxOwotfQotCi0vKgotICogRGVjaWRlIHdoYXQgbW9kZSBnZXR0aW1lb2ZkYXkgc2hvdWxkIHVzZS4KLSAqLwotdm9pZCB0aW1lX2luaXRfZ3RvZCh2b2lkKQotewotCWNoYXIgKnRpbWV0eXBlOwotCiAJaWYgKHVuc3luY2hyb25pemVkX3RzYygpKQotCQlub3RzYyA9IDE7CisJCW1hcmtfdHNjX3Vuc3RhYmxlKCk7CiAKLSAJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX1JEVFNDUCkpCisJaWYgKGNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX1JEVFNDUCkpCiAJCXZnZXRjcHVfbW9kZSA9IFZHRVRDUFVfUkRUU0NQOwogCWVsc2UKIAkJdmdldGNwdV9tb2RlID0gVkdFVENQVV9MU0w7CiAKLQlpZiAodnh0aW1lLmhwZXRfYWRkcmVzcyAmJiBub3RzYykgewotCQl0aW1ldHlwZSA9IGhwZXRfdXNlX3RpbWVyID8gIkhQRVQiIDogIlBJVC9IUEVUIjsKLQkJaWYgKGhwZXRfdXNlX3RpbWVyKQotCQkJdnh0aW1lLmxhc3QgPSBocGV0X3JlYWRsKEhQRVRfVDBfQ01QKSAtIGhwZXRfdGljazsKLQkJZWxzZQotCQkJdnh0aW1lLmxhc3QgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0JCXZ4dGltZS5tb2RlID0gVlhUSU1FX0hQRVQ7Ci0JCWRvX2dldHRpbWVvZmZzZXQgPSBkb19nZXR0aW1lb2Zmc2V0X2hwZXQ7Ci0jaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgotCS8qIFVzaW5nIFBNIGZvciBnZXR0aW1lb2ZkYXkgaXMgcXVpdGUgc2xvdywgYnV0IHdlIGhhdmUgbm8gb3RoZXIKLQkgICBjaG9pY2UgYmVjYXVzZSB0aGUgVFNDIGlzIHRvbyB1bnJlbGlhYmxlIG9uIHNvbWUgc3lzdGVtcy4gKi8KLQl9IGVsc2UgaWYgKHBtdG1yX2lvcG9ydCAmJiAhdnh0aW1lLmhwZXRfYWRkcmVzcyAmJiBub3RzYykgewotCQl0aW1ldHlwZSA9ICJQTSI7Ci0JCWRvX2dldHRpbWVvZmZzZXQgPSBkb19nZXR0aW1lb2Zmc2V0X3BtOwotCQl2eHRpbWUubW9kZSA9IFZYVElNRV9QTVRNUjsKLQkJc3lzY3RsX3ZzeXNjYWxsID0gMDsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRGlzYWJsaW5nIHZzeXNjYWxsIGR1ZSB0byB1c2Ugb2YgUE0gdGltZXJcbiIpOwotI2VuZGlmCi0JfSBlbHNlIHsKLQkJdGltZXR5cGUgPSBocGV0X3VzZV90aW1lciA/ICJIUEVUL1RTQyIgOiAiUElUL1RTQyI7Ci0JCXZ4dGltZS5tb2RlID0gVlhUSU1FX1RTQzsKLQl9Ci0KLQlwcmludGsoS0VSTl9JTkZPICJ0aW1lLmM6IFVzaW5nICVsZC4lMDZsZCBNSHogV0FMTCAlcyBHVE9EICVzIHRpbWVyLlxuIiwKLQkgICAgICAgdnh0aW1lX2h6IC8gMTAwMDAwMCwgdnh0aW1lX2h6ICUgMTAwMDAwMCwgdGltZW5hbWUsIHRpbWV0eXBlKTsKKwlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHopOwogCXByaW50ayhLRVJOX0lORk8gInRpbWUuYzogRGV0ZWN0ZWQgJWQuJTAzZCBNSHogcHJvY2Vzc29yLlxuIiwKIAkJY3B1X2toeiAvIDEwMDAsIGNwdV9raHogJSAxMDAwKTsKLQl2eHRpbWUucXVvdCA9IChVU0VDX1BFUl9TRUMgPDwgVVNfU0NBTEUpIC8gdnh0aW1lX2h6OwotCXZ4dGltZS50c2NfcXVvdCA9IChVU0VDX1BFUl9NU0VDIDw8IFVTX1NDQUxFKSAvIGNwdV9raHo7Ci0Jdnh0aW1lLmxhc3RfdHNjID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0KLQlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHopOworCXNldHVwX2lycSgwLCAmaXJxMCk7CiB9CiAKLV9fc2V0dXAoInJlcG9ydF9sb3N0X3RpY2tzIiwgdGltZV9zZXR1cCk7CiAKIHN0YXRpYyBsb25nIGNsb2NrX2Ntb3NfZGlmZjsKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHNsZWVwX3N0YXJ0OwpAQCAtMTA1NSw3ICszOTcsNyBAQAogCQlzbGVlcF9sZW5ndGggPSAwOwogCQljdGltZSA9IHNsZWVwX3N0YXJ0OwogCX0KLQlpZiAodnh0aW1lLmhwZXRfYWRkcmVzcykKKwlpZiAoaHBldF9hZGRyZXNzKQogCQlocGV0X3JlZW5hYmxlKCk7CiAJZWxzZQogCQlpODI1NF90aW1lcl9yZXN1bWUoKTsKQEAgLTEwNjQsMjAgKzQwNiw4IEBACiAJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLGZsYWdzKTsKIAl4dGltZS50dl9zZWMgPSBzZWM7CiAJeHRpbWUudHZfbnNlYyA9IDA7Ci0JaWYgKHZ4dGltZS5tb2RlID09IFZYVElNRV9IUEVUKSB7Ci0JCWlmIChocGV0X3VzZV90aW1lcikKLQkJCXZ4dGltZS5sYXN0ID0gaHBldF9yZWFkbChIUEVUX1QwX0NNUCkgLSBocGV0X3RpY2s7Ci0JCWVsc2UKLQkJCXZ4dGltZS5sYXN0ID0gaHBldF9yZWFkbChIUEVUX0NPVU5URVIpOwotI2lmZGVmIENPTkZJR19YODZfUE1fVElNRVIKLQl9IGVsc2UgaWYgKHZ4dGltZS5tb2RlID09IFZYVElNRV9QTVRNUikgewotCQlwbXRpbWVyX3Jlc3VtZSgpOwotI2VuZGlmCi0JfSBlbHNlCi0JCXZ4dGltZS5sYXN0X3RzYyA9IGdldF9jeWNsZXNfc3luYygpOwotCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLGZsYWdzKTsKIAlqaWZmaWVzICs9IHNsZWVwX2xlbmd0aDsKLQltb25vdG9uaWNfYmFzZSArPSBzbGVlcF9sZW5ndGggKiAoTlNFQ19QRVJfU0VDL0haKTsKKwl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jayxmbGFncyk7CiAJdG91Y2hfc29mdGxvY2t1cF93YXRjaGRvZygpOwogCXJldHVybiAwOwogfQpAQCAtMTEwMywyNzAgKzQzMywzIEBACiB9CiAKIGRldmljZV9pbml0Y2FsbCh0aW1lX2luaXRfZGV2aWNlKTsKLQotI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCi0vKiBIUEVUIGluIExlZ2FjeVJlcGxhY2VtZW50IE1vZGUgZWF0cyB1cCBSVEMgaW50ZXJydXB0IGxpbmUuIFdoZW4sIEhQRVQKLSAqIGlzIGVuYWJsZWQsIHdlIHN1cHBvcnQgUlRDIGludGVycnVwdCBmdW5jdGlvbmFsaXR5IGluIHNvZnR3YXJlLgotICogUlRDIGhhcyAzIGtpbmRzIG9mIGludGVycnVwdHM6Ci0gKiAxKSBVcGRhdGUgSW50ZXJydXB0IC0gZ2VuZXJhdGUgYW4gaW50ZXJydXB0LCBldmVyeSBzZWMsIHdoZW4gUlRDIGNsb2NrCi0gKiAgICBpcyB1cGRhdGVkCi0gKiAyKSBBbGFybSBJbnRlcnJ1cHQgLSBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQgYXQgYSBzcGVjaWZpYyB0aW1lIG9mIGRheQotICogMykgUGVyaW9kaWMgSW50ZXJydXB0IC0gZ2VuZXJhdGUgcGVyaW9kaWMgaW50ZXJydXB0LCB3aXRoIGZyZXF1ZW5jaWVzCi0gKiAgICAySHotODE5Mkh6ICgySHotNjRIeiBmb3Igbm9uLXJvb3QgdXNlcikgKGFsbCBmcmVxcyBpbiBwb3dlcnMgb2YgMikKLSAqICgxKSBhbmQgKDIpIGFib3ZlIGFyZSBpbXBsZW1lbnRlZCB1c2luZyBwb2xsaW5nIGF0IGEgZnJlcXVlbmN5IG9mCi0gKiA2NCBIei4gVGhlIGV4YWN0IGZyZXF1ZW5jeSBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gYWNjdXJhY3kgYW5kIGludGVycnVwdAotICogb3ZlcmhlYWQuIChERUZBVUxUX1JUQ19JTlRfRlJFUSkKLSAqIEZvciAoMyksIHdlIHVzZSBpbnRlcnJ1cHRzIGF0IDY0SHogb3IgdXNlciBzcGVjaWZpZWQgcGVyaW9kaWMKLSAqIGZyZXF1ZW5jeSwgd2hpY2hldmVyIGlzIGhpZ2hlci4KLSAqLwotI2luY2x1ZGUgPGxpbnV4L3J0Yy5oPgotCi0jZGVmaW5lIERFRkFVTFRfUlRDX0lOVF9GUkVRIAk2NAotI2RlZmluZSBSVENfTlVNX0lOVFMgCQkxCi0KLXN0YXRpYyB1bnNpZ25lZCBsb25nIFVJRV9vbjsKLXN0YXRpYyB1bnNpZ25lZCBsb25nIHByZXZfdXBkYXRlX3NlYzsKLQotc3RhdGljIHVuc2lnbmVkIGxvbmcgQUlFX29uOwotc3RhdGljIHN0cnVjdCBydGNfdGltZSBhbGFybV90aW1lOwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfb247Ci1zdGF0aWMgdW5zaWduZWQgbG9uZyBQSUVfZnJlcSA9IERFRkFVTFRfUlRDX0lOVF9GUkVROwotc3RhdGljIHVuc2lnbmVkIGxvbmcgUElFX2NvdW50OwotCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBocGV0X3J0Y19pbnRfZnJlcTsgLyogUlRDIGludGVycnVwdCBmcmVxdWVuY3kgKi8KLXN0YXRpYyB1bnNpZ25lZCBpbnQgaHBldF90MV9jbXA7IC8qIGNhY2hlZCBjb21wYXJhdG9yIHJlZ2lzdGVyICovCi0KLWludCBpc19ocGV0X2VuYWJsZWQodm9pZCkKLXsKLQlyZXR1cm4gdnh0aW1lLmhwZXRfYWRkcmVzcyAhPSAwOwotfQotCi0vKgotICogVGltZXIgMSBmb3IgUlRDLCB3ZSBkbyBub3QgdXNlIHBlcmlvZGljIGludGVycnVwdCBmZWF0dXJlLAotICogZXZlbiBpZiBIUEVUIHN1cHBvcnRzIHBlcmlvZGljIGludGVycnVwdHMgb24gVGltZXIgMS4KLSAqIFRoZSByZWFzb24gYmVpbmcsIHRvIHNldCB1cCBhIHBlcmlvZGljIGludGVycnVwdCBpbiBIUEVULCB3ZSBuZWVkIHRvCi0gKiBzdG9wIHRoZSBtYWluIGNvdW50ZXIuIEFuZCBpZiB3ZSBkbyB0aGF0IGV2ZXJ5dGltZSBzb21lb25lIGRpYWJsZXMvZW5hYmxlcwotICogUlRDLCB3ZSB3aWxsIGhhdmUgYWR2ZXJzZSBlZmZlY3Qgb24gbWFpbiBrZXJuZWwgdGltZXIgcnVubmluZyBvbiBUaW1lciAwLgotICogU28sIGZvciB0aGUgdGltZSBiZWluZywgc2ltdWxhdGUgdGhlIHBlcmlvZGljIGludGVycnVwdCBpbiBzb2Z0d2FyZS4KLSAqCi0gKiBocGV0X3J0Y190aW1lcl9pbml0KCkgaXMgY2FsbGVkIGZvciB0aGUgZmlyc3QgdGltZSBhbmQgZHVyaW5nIHN1YnNlcXVlbnQKLSAqIGludGVydXBwdHMgcmVpbml0IGhhcHBlbnMgdGhyb3VnaCBocGV0X3J0Y190aW1lcl9yZWluaXQoKS4KLSAqLwotaW50IGhwZXRfcnRjX3RpbWVyX2luaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQ7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCS8qCi0JICogU2V0IHRoZSBjb3VudGVyIDEgYW5kIGVuYWJsZSB0aGUgaW50ZXJydXB0cy4KLQkgKi8KLQlpZiAoUElFX29uICYmIChQSUVfZnJlcSA+IERFRkFVTFRfUlRDX0lOVF9GUkVRKSkKLQkJaHBldF9ydGNfaW50X2ZyZXEgPSBQSUVfZnJlcTsKLQllbHNlCi0JCWhwZXRfcnRjX2ludF9mcmVxID0gREVGQVVMVF9SVENfSU5UX0ZSRVE7Ci0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0KLQljbnQgPSBocGV0X3JlYWRsKEhQRVRfQ09VTlRFUik7Ci0JY250ICs9ICgoaHBldF90aWNrKkhaKS9ocGV0X3J0Y19pbnRfZnJlcSk7Ci0JaHBldF93cml0ZWwoY250LCBIUEVUX1QxX0NNUCk7Ci0JaHBldF90MV9jbXAgPSBjbnQ7Ci0KLQljZmcgPSBocGV0X3JlYWRsKEhQRVRfVDFfQ0ZHKTsKLQljZmcgJj0gfkhQRVRfVE5fUEVSSU9ESUM7Ci0JY2ZnIHw9IEhQRVRfVE5fRU5BQkxFIHwgSFBFVF9UTl8zMkJJVDsKLQlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDFfQ0ZHKTsKLQotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQotCXJldHVybiAxOwotfQotCi1zdGF0aWMgdm9pZCBocGV0X3J0Y190aW1lcl9yZWluaXQodm9pZCkKLXsKLQl1bnNpZ25lZCBpbnQgY2ZnLCBjbnQsIHRpY2tzX3Blcl9pbnQsIGxvc3RfaW50czsKLQotCWlmICh1bmxpa2VseSghKFBJRV9vbiB8IEFJRV9vbiB8IFVJRV9vbikpKSB7Ci0JCWNmZyA9IGhwZXRfcmVhZGwoSFBFVF9UMV9DRkcpOwotCQljZmcgJj0gfkhQRVRfVE5fRU5BQkxFOwotCQlocGV0X3dyaXRlbChjZmcsIEhQRVRfVDFfQ0ZHKTsKLQkJcmV0dXJuOwotCX0KLQotCWlmIChQSUVfb24gJiYgKFBJRV9mcmVxID4gREVGQVVMVF9SVENfSU5UX0ZSRVEpKQotCQlocGV0X3J0Y19pbnRfZnJlcSA9IFBJRV9mcmVxOwotCWVsc2UKLQkJaHBldF9ydGNfaW50X2ZyZXEgPSBERUZBVUxUX1JUQ19JTlRfRlJFUTsKLQotCS8qIEl0IGlzIG1vcmUgYWNjdXJhdGUgdG8gdXNlIHRoZSBjb21wYXJhdG9yIHZhbHVlIHRoYW4gY3VycmVudCBjb3VudC4qLwotCXRpY2tzX3Blcl9pbnQgPSBocGV0X3RpY2sgKiBIWiAvIGhwZXRfcnRjX2ludF9mcmVxOwotCWhwZXRfdDFfY21wICs9IHRpY2tzX3Blcl9pbnQ7Ci0JaHBldF93cml0ZWwoaHBldF90MV9jbXAsIEhQRVRfVDFfQ01QKTsKLQotCS8qCi0JICogSWYgdGhlIGludGVycnVwdCBoYW5kbGVyIHdhcyBkZWxheWVkIHRvbyBsb25nLCB0aGUgd3JpdGUgYWJvdmUgdHJpZXMKLQkgKiB0byBzY2hlZHVsZSB0aGUgbmV4dCBpbnRlcnJ1cHQgaW4gdGhlIHBhc3QgYW5kIHRoZSBoYXJkd2FyZSB3b3VsZAotCSAqIG5vdCBpbnRlcnJ1cHQgdW50aWwgdGhlIGNvdW50ZXIgaGFkIHdyYXBwZWQgYXJvdW5kLgotCSAqIFNvIHdlIGhhdmUgdG8gY2hlY2sgdGhhdCB0aGUgY29tcGFyYXRvciB3YXNuJ3Qgc2V0IHRvIGEgcGFzdCB0aW1lLgotCSAqLwotCWNudCA9IGhwZXRfcmVhZGwoSFBFVF9DT1VOVEVSKTsKLQlpZiAodW5saWtlbHkoKGludCkoY250IC0gaHBldF90MV9jbXApID4gMCkpIHsKLQkJbG9zdF9pbnRzID0gKGNudCAtIGhwZXRfdDFfY21wKSAvIHRpY2tzX3Blcl9pbnQgKyAxOwotCQkvKiBNYWtlIHN1cmUgdGhhdCwgZXZlbiB3aXRoIHRoZSB0aW1lIG5lZWRlZCB0byBleGVjdXRlCi0JCSAqIHRoaXMgY29kZSwgdGhlIG5leHQgc2NoZWR1bGVkIGludGVycnVwdCBoYXMgYmVlbiBtb3ZlZAotCQkgKiBiYWNrIHRvIHRoZSBmdXR1cmU6ICovCi0JCWxvc3RfaW50cysrOwotCi0JCWhwZXRfdDFfY21wICs9IGxvc3RfaW50cyAqIHRpY2tzX3Blcl9pbnQ7Ci0JCWhwZXRfd3JpdGVsKGhwZXRfdDFfY21wLCBIUEVUX1QxX0NNUCk7Ci0KLQkJaWYgKFBJRV9vbikKLQkJCVBJRV9jb3VudCArPSBsb3N0X2ludHM7Ci0KLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX1dBUk5JTkcgInJ0YzogbG9zdCBzb21lIGludGVycnVwdHMgYXQgJWxkSHouXG4iLAotCQkJICAgICAgIGhwZXRfcnRjX2ludF9mcmVxKTsKLQl9Ci19Ci0KLS8qCi0gKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBjYWxsZWQgZnJvbSBydGMgZHJpdmVyLgotICogUmV0dXJuIDAgaWYgSFBFVCBpcyBub3QgYmVpbmcgdXNlZC4KLSAqIE90aGVyd2lzZSBkbyB0aGUgbmVjZXNzYXJ5IGNoYW5nZXMgYW5kIHJldHVybiAxLgotICovCi1pbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoYml0X21hc2sgJiBSVENfVUlFKQotCQlVSUVfb24gPSAwOwotCWlmIChiaXRfbWFzayAmIFJUQ19QSUUpCi0JCVBJRV9vbiA9IDA7Ci0JaWYgKGJpdF9tYXNrICYgUlRDX0FJRSkKLQkJQUlFX29uID0gMDsKLQotCXJldHVybiAxOwotfQotCi1pbnQgaHBldF9zZXRfcnRjX2lycV9iaXQodW5zaWduZWQgbG9uZyBiaXRfbWFzaykKLXsKLQlpbnQgdGltZXJfaW5pdF9yZXFkID0gMDsKLQotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JaWYgKCEoUElFX29uIHwgQUlFX29uIHwgVUlFX29uKSkKLQkJdGltZXJfaW5pdF9yZXFkID0gMTsKLQotCWlmIChiaXRfbWFzayAmIFJUQ19VSUUpIHsKLQkJVUlFX29uID0gMTsKLQl9Ci0JaWYgKGJpdF9tYXNrICYgUlRDX1BJRSkgewotCQlQSUVfb24gPSAxOwotCQlQSUVfY291bnQgPSAwOwotCX0KLQlpZiAoYml0X21hc2sgJiBSVENfQUlFKSB7Ci0JCUFJRV9vbiA9IDE7Ci0JfQotCi0JaWYgKHRpbWVyX2luaXRfcmVxZCkKLQkJaHBldF9ydGNfdGltZXJfaW5pdCgpOwotCi0JcmV0dXJuIDE7Ci19Ci0KLWludCBocGV0X3NldF9hbGFybV90aW1lKHVuc2lnbmVkIGNoYXIgaHJzLCB1bnNpZ25lZCBjaGFyIG1pbiwgdW5zaWduZWQgY2hhciBzZWMpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlhbGFybV90aW1lLnRtX2hvdXIgPSBocnM7Ci0JYWxhcm1fdGltZS50bV9taW4gPSBtaW47Ci0JYWxhcm1fdGltZS50bV9zZWMgPSBzZWM7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfc2V0X3BlcmlvZGljX2ZyZXEodW5zaWduZWQgbG9uZyBmcmVxKQotewotCWlmICghaXNfaHBldF9lbmFibGVkKCkpCi0JCXJldHVybiAwOwotCi0JUElFX2ZyZXEgPSBmcmVxOwotCVBJRV9jb3VudCA9IDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaW50IGhwZXRfcnRjX2Ryb3BwZWRfaXJxKHZvaWQpCi17Ci0JaWYgKCFpc19ocGV0X2VuYWJsZWQoKSkKLQkJcmV0dXJuIDA7Ci0KLQlyZXR1cm4gMTsKLX0KLQotaXJxcmV0dXJuX3QgaHBldF9ydGNfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCi17Ci0Jc3RydWN0IHJ0Y190aW1lIGN1cnJfdGltZTsKLQl1bnNpZ25lZCBsb25nIHJ0Y19pbnRfZmxhZyA9IDA7Ci0JaW50IGNhbGxfcnRjX2ludGVycnVwdCA9IDA7Ci0KLQlocGV0X3J0Y190aW1lcl9yZWluaXQoKTsKLQotCWlmIChVSUVfb24gfCBBSUVfb24pIHsKLQkJcnRjX2dldF9ydGNfdGltZSgmY3Vycl90aW1lKTsKLQl9Ci0JaWYgKFVJRV9vbikgewotCQlpZiAoY3Vycl90aW1lLnRtX3NlYyAhPSBwcmV2X3VwZGF0ZV9zZWMpIHsKLQkJCS8qIFNldCB1cGRhdGUgaW50IGluZm8sIGNhbGwgcmVhbCBydGMgaW50IHJvdXRpbmUgKi8KLQkJCWNhbGxfcnRjX2ludGVycnVwdCA9IDE7Ci0JCQlydGNfaW50X2ZsYWcgPSBSVENfVUY7Ci0JCQlwcmV2X3VwZGF0ZV9zZWMgPSBjdXJyX3RpbWUudG1fc2VjOwotCQl9Ci0JfQotCWlmIChQSUVfb24pIHsKLQkJUElFX2NvdW50Kys7Ci0JCWlmIChQSUVfY291bnQgPj0gaHBldF9ydGNfaW50X2ZyZXEvUElFX2ZyZXEpIHsKLQkJCS8qIFNldCBwZXJpb2RpYyBpbnQgaW5mbywgY2FsbCByZWFsIHJ0YyBpbnQgcm91dGluZSAqLwotCQkJY2FsbF9ydGNfaW50ZXJydXB0ID0gMTsKLQkJCXJ0Y19pbnRfZmxhZyB8PSBSVENfUEY7Ci0JCQlQSUVfY291bnQgPSAwOwotCQl9Ci0JfQotCWlmIChBSUVfb24pIHsKLQkJaWYgKChjdXJyX3RpbWUudG1fc2VjID09IGFsYXJtX3RpbWUudG1fc2VjKSAmJgotCQkgICAgKGN1cnJfdGltZS50bV9taW4gPT0gYWxhcm1fdGltZS50bV9taW4pICYmCi0JCSAgICAoY3Vycl90aW1lLnRtX2hvdXIgPT0gYWxhcm1fdGltZS50bV9ob3VyKSkgewotCQkJLyogU2V0IGFsYXJtIGludCBpbmZvLCBjYWxsIHJlYWwgcnRjIGludCByb3V0aW5lICovCi0JCQljYWxsX3J0Y19pbnRlcnJ1cHQgPSAxOwotCQkJcnRjX2ludF9mbGFnIHw9IFJUQ19BRjsKLQkJfQotCX0KLQlpZiAoY2FsbF9ydGNfaW50ZXJydXB0KSB7Ci0JCXJ0Y19pbnRfZmxhZyB8PSAoUlRDX0lSUUYgfCAoUlRDX05VTV9JTlRTIDw8IDgpKTsKLQkJcnRjX2ludGVycnVwdChydGNfaW50X2ZsYWcsIGRldl9pZCk7Ci0JfQotCXJldHVybiBJUlFfSEFORExFRDsKLX0KLSNlbmRpZgotCi1zdGF0aWMgaW50IF9faW5pdCBub2hwZXRfc2V0dXAoY2hhciAqcykgCi17IAotCW5vaHBldCA9IDE7Ci0JcmV0dXJuIDE7Ci19IAotCi1fX3NldHVwKCJub2hwZXQiLCBub2hwZXRfc2V0dXApOwotCi1pbnQgX19pbml0IG5vdHNjX3NldHVwKGNoYXIgKnMpCi17Ci0Jbm90c2MgPSAxOwotCXJldHVybiAxOwotfQotCi1fX3NldHVwKCJub3RzYyIsIG5vdHNjX3NldHVwKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC90c2MuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90c2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTU4MzE4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3RzYy5jCkBAIC0wLDAgKzEsMjI2IEBACisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdWZyZXEuaD4KKworI2luY2x1ZGUgPGFzbS90aW1leC5oPgorCitzdGF0aWMgaW50IG5vdHNjIF9faW5pdGRhdGEgPSAwOworCit1bnNpZ25lZCBpbnQgY3B1X2toejsJCS8qIFRTQyBjbG9ja3MgLyB1c2VjLCBub3QgdXNlZCBoZXJlICovCitFWFBPUlRfU1lNQk9MKGNwdV9raHopOworCitzdGF0aWMgdW5zaWduZWQgaW50IGN5YzJuc19zY2FsZSBfX3JlYWRfbW9zdGx5OworCit2b2lkIHNldF9jeWMybnNfc2NhbGUodW5zaWduZWQgbG9uZyBraHopCit7CisJY3ljMm5zX3NjYWxlID0gKE5TRUNfUEVSX01TRUMgPDwgTlNfU0NBTEUpIC8ga2h6OworfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc18yX25zKHVuc2lnbmVkIGxvbmcgbG9uZyBjeWMpCit7CisJcmV0dXJuIChjeWMgKiBjeWMybnNfc2NhbGUpID4+IE5TX1NDQUxFOworfQorCit1bnNpZ25lZCBsb25nIGxvbmcgc2NoZWRfY2xvY2sodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGEgPSAwOworCisJLyogQ291bGQgZG8gQ1BVIGNvcmUgc3luYyBoZXJlLiBPcHRlcm9uIGNhbiBleGVjdXRlIHJkdHNjIHNwZWN1bGF0aXZlbHksCisJICogd2hpY2ggbWVhbnMgaXQgaXMgbm90IGNvbXBsZXRlbHkgZXhhY3QgYW5kIG1heSBub3QgYmUgbW9ub3Rvbm91cworCSAqIGJldHdlZW4gQ1BVcy4gQnV0IHRoZSBlcnJvcnMgc2hvdWxkIGJlIHRvbyBzbWFsbCB0byBtYXR0ZXIgZm9yCisJICogc2NoZWR1bGluZyBwdXJwb3Nlcy4KKwkgKi8KKworCXJkdHNjbGwoYSk7CisJcmV0dXJuIGN5Y2xlc18yX25zKGEpOworfQorCitzdGF0aWMgaW50IHRzY191bnN0YWJsZTsKKworc3RhdGljIGlubGluZSBpbnQgY2hlY2tfdHNjX3Vuc3RhYmxlKHZvaWQpCit7CisJcmV0dXJuIHRzY191bnN0YWJsZTsKK30KKyNpZmRlZiBDT05GSUdfQ1BVX0ZSRVEKKworLyogRnJlcXVlbmN5IHNjYWxpbmcgc3VwcG9ydC4gQWRqdXN0IHRoZSBUU0MgYmFzZWQgdGltZXIgd2hlbiB0aGUgY3B1IGZyZXF1ZW5jeQorICogY2hhbmdlcy4KKyAqCisgKiBSRUQtUEVOOiBPbiBTTVAgd2UgYXNzdW1lIGFsbCBDUFVzIHJ1biB3aXRoIHRoZSBzYW1lIGZyZXF1ZW5jeS4gIEl0J3MKKyAqIG5vdCB0aGF0IGltcG9ydGFudCBiZWNhdXNlIGN1cnJlbnQgT3B0ZXJvbiBzZXR1cHMgZG8gbm90IHN1cHBvcnQKKyAqIHNjYWxpbmcgb24gU01QIGFueXJvYWRzLgorICoKKyAqIFNob3VsZCBmaXggdXAgbGFzdF90c2MgdG9vLiBDdXJyZW50bHkgZ2V0dGltZW9mZGF5IGluIHRoZQorICogZmlyc3QgdGljayBhZnRlciB0aGUgY2hhbmdlIHdpbGwgYmUgc2xpZ2h0bHkgd3JvbmcuCisgKi8KKworI2luY2x1ZGUgPGxpbnV4L3dvcmtxdWV1ZS5oPgorCitzdGF0aWMgdW5zaWduZWQgaW50IGNwdWZyZXFfZGVsYXllZF9pc3NjaGVkID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgY3B1ZnJlcV9pbml0ID0gMDsKK3N0YXRpYyBzdHJ1Y3Qgd29ya19zdHJ1Y3QgY3B1ZnJlcV9kZWxheWVkX2dldF93b3JrOworCitzdGF0aWMgdm9pZCBoYW5kbGVfY3B1ZnJlcV9kZWxheWVkX2dldChzdHJ1Y3Qgd29ya19zdHJ1Y3QgKnYpCit7CisJdW5zaWduZWQgaW50IGNwdTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQljcHVmcmVxX2dldChjcHUpOworCX0KKwljcHVmcmVxX2RlbGF5ZWRfaXNzY2hlZCA9IDA7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgIHJlZl9mcmVxID0gMDsKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGxvb3BzX3Blcl9qaWZmeV9yZWYgPSAwOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyBjcHVfa2h6X3JlZiA9IDA7CisKK3N0YXRpYyBpbnQgdGltZV9jcHVmcmVxX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsIHVuc2lnbmVkIGxvbmcgdmFsLAorCQkJCSB2b2lkICpkYXRhKQoreworCXN0cnVjdCBjcHVmcmVxX2ZyZXFzICpmcmVxID0gZGF0YTsKKwl1bnNpZ25lZCBsb25nICpscGosIGR1bW15OworCisJaWYgKGNwdV9oYXMoJmNwdV9kYXRhW2ZyZXEtPmNwdV0sIFg4Nl9GRUFUVVJFX0NPTlNUQU5UX1RTQykpCisJCXJldHVybiAwOworCisJbHBqID0gJmR1bW15OworCWlmICghKGZyZXEtPmZsYWdzICYgQ1BVRlJFUV9DT05TVF9MT09QUykpCisjaWZkZWYgQ09ORklHX1NNUAorCQlscGogPSAmY3B1X2RhdGFbZnJlcS0+Y3B1XS5sb29wc19wZXJfamlmZnk7CisjZWxzZQorCQlscGogPSAmYm9vdF9jcHVfZGF0YS5sb29wc19wZXJfamlmZnk7CisjZW5kaWYKKworCWlmICghcmVmX2ZyZXEpIHsKKwkJcmVmX2ZyZXEgPSBmcmVxLT5vbGQ7CisJCWxvb3BzX3Blcl9qaWZmeV9yZWYgPSAqbHBqOworCQljcHVfa2h6X3JlZiA9IGNwdV9raHo7CisJfQorCWlmICgodmFsID09IENQVUZSRVFfUFJFQ0hBTkdFICAmJiBmcmVxLT5vbGQgPCBmcmVxLT5uZXcpIHx8CisJCSh2YWwgPT0gQ1BVRlJFUV9QT1NUQ0hBTkdFICYmIGZyZXEtPm9sZCA+IGZyZXEtPm5ldykgfHwKKwkJKHZhbCA9PSBDUFVGUkVRX1JFU1VNRUNIQU5HRSkpIHsKKwkJKmxwaiA9CisJCWNwdWZyZXFfc2NhbGUobG9vcHNfcGVyX2ppZmZ5X3JlZiwgcmVmX2ZyZXEsIGZyZXEtPm5ldyk7CisKKwkJY3B1X2toeiA9IGNwdWZyZXFfc2NhbGUoY3B1X2toel9yZWYsIHJlZl9mcmVxLCBmcmVxLT5uZXcpOworCQlpZiAoIShmcmVxLT5mbGFncyAmIENQVUZSRVFfQ09OU1RfTE9PUFMpKQorCQkJbWFya190c2NfdW5zdGFibGUoKTsKKwl9CisKKwlzZXRfY3ljMm5zX3NjYWxlKGNwdV9raHpfcmVmKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jayA9IHsKKwkubm90aWZpZXJfY2FsbCAgPSB0aW1lX2NwdWZyZXFfbm90aWZpZXIKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNwdWZyZXFfdHNjKHZvaWQpCit7CisJSU5JVF9XT1JLKCZjcHVmcmVxX2RlbGF5ZWRfZ2V0X3dvcmssIGhhbmRsZV9jcHVmcmVxX2RlbGF5ZWRfZ2V0KTsKKwlpZiAoIWNwdWZyZXFfcmVnaXN0ZXJfbm90aWZpZXIoJnRpbWVfY3B1ZnJlcV9ub3RpZmllcl9ibG9jaywKKwkJCQkgICAgICAgQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKSkKKwkJY3B1ZnJlcV9pbml0ID0gMTsKKwlyZXR1cm4gMDsKK30KKworY29yZV9pbml0Y2FsbChjcHVmcmVxX3RzYyk7CisKKyNlbmRpZgorCitzdGF0aWMgaW50IHRzY191bnN0YWJsZSA9IDA7CisKKy8qCisgKiBNYWtlIGFuIGVkdWNhdGVkIGd1ZXNzIGlmIHRoZSBUU0MgaXMgdHJ1c3R3b3J0aHkgYW5kIHN5bmNocm9uaXplZAorICogb3ZlciBhbGwgQ1BVcy4KKyAqLworX19jcHVpbml0IGludCB1bnN5bmNocm9uaXplZF90c2Modm9pZCkKK3sKKwlpZiAodHNjX3Vuc3RhYmxlKQorCQlyZXR1cm4gMTsKKworI2lmZGVmIENPTkZJR19TTVAKKwlpZiAoYXBpY19pc19jbHVzdGVyZWRfYm94KCkpCisJCXJldHVybiAxOworI2VuZGlmCisJLyogTW9zdCBpbnRlbCBzeXN0ZW1zIGhhdmUgc3luY2hyb25pemVkIFRTQ3MgZXhjZXB0IGZvcgorCSAgIG11bHRpIG5vZGUgc3lzdGVtcyAqLworIAlpZiAoYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfSU5URUwpIHsKKyNpZmRlZiBDT05GSUdfQUNQSQorCQkvKiBCdXQgVFNDIGRvZXNuJ3QgdGljayBpbiBDMyBzbyBkb24ndCB1c2UgaXQgdGhlcmUgKi8KKwkJaWYgKGFjcGlfZ2JsX0ZBRFQuaGVhZGVyLmxlbmd0aCA+IDAgJiYgYWNwaV9nYmxfRkFEVC5DM2xhdGVuY3kgPCAxMDAwKQorCQkJcmV0dXJuIDE7CisjZW5kaWYKKyAJCXJldHVybiAwOworCX0KKworIAkvKiBBc3N1bWUgbXVsdGkgc29ja2V0IHN5c3RlbXMgYXJlIG5vdCBzeW5jaHJvbml6ZWQgKi8KKyAJcmV0dXJuIG51bV9wcmVzZW50X2NwdXMoKSA+IDE7Cit9CisKK2ludCBfX2luaXQgbm90c2Nfc2V0dXAoY2hhciAqcykKK3sKKwlub3RzYyA9IDE7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoIm5vdHNjIiwgbm90c2Nfc2V0dXApOworCisKKy8qIGNsb2NrIHNvdXJjZSBjb2RlOiAqLworc3RhdGljIGN5Y2xlX3QgcmVhZF90c2Modm9pZCkKK3sKKwljeWNsZV90IHJldCA9IChjeWNsZV90KWdldF9jeWNsZXNfc3luYygpOworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBjeWNsZV90IF9fdnN5c2NhbGxfZm4gdnJlYWRfdHNjKHZvaWQpCit7CisJY3ljbGVfdCByZXQgPSAoY3ljbGVfdClnZXRfY3ljbGVzX3N5bmMoKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlIGNsb2Nrc291cmNlX3RzYyA9IHsKKwkubmFtZQkJCT0gInRzYyIsCisJLnJhdGluZwkJCT0gMzAwLAorCS5yZWFkCQkJPSByZWFkX3RzYywKKwkubWFzawkJCT0gQ0xPQ0tTT1VSQ0VfTUFTSyg2NCksCisJLnNoaWZ0CQkJPSAyMiwKKwkuZmxhZ3MJCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTIHwKKwkJCQkgIENMT0NLX1NPVVJDRV9NVVNUX1ZFUklGWSwKKwkudnJlYWQJCQk9IHZyZWFkX3RzYywKK307CisKK3ZvaWQgbWFya190c2NfdW5zdGFibGUodm9pZCkKK3sKKwlpZiAoIXRzY191bnN0YWJsZSkgeworCQl0c2NfdW5zdGFibGUgPSAxOworCQkvKiBDaGFuZ2Ugb25seSB0aGUgcmF0aW5nLCB3aGVuIG5vdCByZWdpc3RlcmVkICovCisJCWlmIChjbG9ja3NvdXJjZV90c2MubXVsdCkKKwkJCWNsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoJmNsb2Nrc291cmNlX3RzYywgMCk7CisJCWVsc2UKKwkJCWNsb2Nrc291cmNlX3RzYy5yYXRpbmcgPSAwOworCX0KK30KK0VYUE9SVF9TWU1CT0xfR1BMKG1hcmtfdHNjX3Vuc3RhYmxlKTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90c2NfY2xvY2tzb3VyY2Uodm9pZCkKK3sKKwlpZiAoIW5vdHNjKSB7CisJCWNsb2Nrc291cmNlX3RzYy5tdWx0ID0gY2xvY2tzb3VyY2Vfa2h6Mm11bHQoY3B1X2toeiwKKwkJCQkJCQljbG9ja3NvdXJjZV90c2Muc2hpZnQpOworCQlpZiAoY2hlY2tfdHNjX3Vuc3RhYmxlKCkpCisJCQljbG9ja3NvdXJjZV90c2MucmF0aW5nID0gMDsKKworCQlyZXR1cm4gY2xvY2tzb3VyY2VfcmVnaXN0ZXIoJmNsb2Nrc291cmNlX3RzYyk7CisJfQorCXJldHVybiAwOworfQorCittb2R1bGVfaW5pdChpbml0X3RzY19jbG9ja3NvdXJjZSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdHNjX3N5bmMuYyBiL2FyY2gveDg2XzY0L2tlcm5lbC90c2Nfc3luYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNGYwZGIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Nl82NC9rZXJuZWwvdHNjX3N5bmMuYwpAQCAtMCwwICsxLDE4NyBAQAorLyoKKyAqIGFyY2gveDg2XzY0L2tlcm5lbC90c2Nfc3luYy5jOiBjaGVjayBUU0Mgc3luY2hyb25pemF0aW9uLgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqCisgKiBXZSBjaGVjayB3aGV0aGVyIGFsbCBib290IENQVXMgaGF2ZSB0aGVpciBUU0MncyBzeW5jaHJvbml6ZWQsCisgKiBwcmludCBhIHdhcm5pbmcgaWYgbm90IGFuZCB0dXJuIG9mZiB0aGUgVFNDIGNsb2NrLXNvdXJjZS4KKyAqCisgKiBUaGUgd2FycC1jaGVjayBpcyBwb2ludC10by1wb2ludCBiZXR3ZWVuIHR3byBDUFVzLCB0aGUgQ1BVCisgKiBpbml0aWF0aW5nIHRoZSBib290dXAgaXMgdGhlICdzb3VyY2UgQ1BVJywgdGhlIGZyZXNobHkgYm9vdGluZworICogQ1BVIGlzIHRoZSAndGFyZ2V0IENQVScuCisgKgorICogT25seSB0d28gQ1BVcyBtYXkgcGFydGljaXBhdGUgLSB0aGV5IGNhbiBlbnRlciBpbiBhbnkgb3JkZXIuCisgKiAoIFRoZSBzZXJpYWwgbmF0dXJlIG9mIHRoZSBib290IGxvZ2ljIGFuZCB0aGUgQ1BVIGhvdHBsdWcgbG9jaworICogICBwcm90ZWN0cyBhZ2FpbnN0IG1vcmUgdGhhbiAyIENQVXMgZW50ZXJpbmcgdGhpcyBjb2RlLiApCisgKi8KKyNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9ubWkuaD4KKyNpbmNsdWRlIDxhc20vdHNjLmg+CisKKy8qCisgKiBFbnRyeS9leGl0IGNvdW50ZXJzIHRoYXQgbWFrZSBzdXJlIHRoYXQgYm90aCBDUFVzCisgKiBydW4gdGhlIG1lYXN1cmVtZW50IGNvZGUgYXQgb25jZToKKyAqLworc3RhdGljIF9fY3B1aW5pdGRhdGEgYXRvbWljX3Qgc3RhcnRfY291bnQ7CitzdGF0aWMgX19jcHVpbml0ZGF0YSBhdG9taWNfdCBzdG9wX2NvdW50OworCisvKgorICogV2UgdXNlIGEgcmF3IHNwaW5sb2NrIGluIHRoaXMgZXhjZXB0aW9uYWwgY2FzZSwgYmVjYXVzZQorICogd2Ugd2FudCB0byBoYXZlIHRoZSBmYXN0ZXN0LCBpbmxpbmVkLCBub24tZGVidWcgdmVyc2lvbgorICogb2YgYSBjcml0aWNhbCBzZWN0aW9uLCB0byBiZSBhYmxlIHRvIHByb3ZlIFRTQyB0aW1lLXdhcnBzOgorICovCitzdGF0aWMgX19jcHVpbml0ZGF0YSByYXdfc3BpbmxvY2tfdCBzeW5jX2xvY2sgPSBfX1JBV19TUElOX0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgX19jcHVpbml0ZGF0YSBjeWNsZXNfdCBsYXN0X3RzYzsKK3N0YXRpYyBfX2NwdWluaXRkYXRhIGN5Y2xlc190IG1heF93YXJwOworc3RhdGljIF9fY3B1aW5pdGRhdGEgaW50IG5yX3dhcnBzOworCisvKgorICogVFNDLXdhcnAgbWVhc3VyZW1lbnQgbG9vcCBydW5uaW5nIG9uIGJvdGggQ1BVczoKKyAqLworc3RhdGljIF9fY3B1aW5pdCB2b2lkIGNoZWNrX3RzY193YXJwKHZvaWQpCit7CisJY3ljbGVzX3Qgc3RhcnQsIG5vdywgcHJldiwgZW5kOworCWludCBpOworCisJc3RhcnQgPSBnZXRfY3ljbGVzX3N5bmMoKTsKKwkvKgorCSAqIFRoZSBtZWFzdXJlbWVudCBydW5zIGZvciAyMCBtc2VjczoKKwkgKi8KKwllbmQgPSBzdGFydCArIGNwdV9raHogKiAyMFVMTDsKKwlub3cgPSBzdGFydDsKKworCWZvciAoaSA9IDA7IDsgaSsrKSB7CisJCS8qCisJCSAqIFdlIHRha2UgdGhlIGdsb2JhbCBsb2NrLCBtZWFzdXJlIFRTQywgc2F2ZSB0aGUKKwkJICogcHJldmlvdXMgVFNDIHRoYXQgd2FzIG1lYXN1cmVkIChwb3NzaWJseSBvbgorCQkgKiBhbm90aGVyIENQVSkgYW5kIHVwZGF0ZSB0aGUgcHJldmlvdXMgVFNDIHRpbWVzdGFtcC4KKwkJICovCisJCV9fcmF3X3NwaW5fbG9jaygmc3luY19sb2NrKTsKKwkJcHJldiA9IGxhc3RfdHNjOworCQlub3cgPSBnZXRfY3ljbGVzX3N5bmMoKTsKKwkJbGFzdF90c2MgPSBub3c7CisJCV9fcmF3X3NwaW5fdW5sb2NrKCZzeW5jX2xvY2spOworCisJCS8qCisJCSAqIEJlIG5pY2UgZXZlcnkgbm93IGFuZCB0aGVuIChhbmQgYWxzbyBjaGVjayB3aGV0aGVyCisJCSAqIG1lYXN1cmVtZW50IGlzIGRvbmUgW3dlIGFsc28gaW5zZXJ0IGEgMTAwIG1pbGxpb24KKwkJICogbG9vcHMgc2FmZXR5IGV4aXQsIHNvIHdlIGRvbnQgbG9jayB1cCBpbiBjYXNlIHRoZQorCQkgKiBUU0MgcmVhZG91dCBpcyB0b3RhbGx5IGJyb2tlbl0pOgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KCEoaSAmIDcpKSkgeworCQkJaWYgKG5vdyA+IGVuZCB8fCBpID4gMTAwMDAwMDAwKQorCQkJCWJyZWFrOworCQkJY3B1X3JlbGF4KCk7CisJCQl0b3VjaF9ubWlfd2F0Y2hkb2coKTsKKwkJfQorCQkvKgorCQkgKiBPdXRzaWRlIHRoZSBjcml0aWNhbCBzZWN0aW9uIHdlIGNhbiBub3cgc2VlIHdoZXRoZXIKKwkJICogd2Ugc2F3IGEgdGltZS13YXJwIG9mIHRoZSBUU0MgZ29pbmcgYmFja3dhcmRzOgorCQkgKi8KKwkJaWYgKHVubGlrZWx5KHByZXYgPiBub3cpKSB7CisJCQlfX3Jhd19zcGluX2xvY2soJnN5bmNfbG9jayk7CisJCQltYXhfd2FycCA9IG1heChtYXhfd2FycCwgcHJldiAtIG5vdyk7CisJCQlucl93YXJwcysrOworCQkJX19yYXdfc3Bpbl91bmxvY2soJnN5bmNfbG9jayk7CisJCX0KKworCX0KK30KKworLyoKKyAqIFNvdXJjZSBDUFUgY2FsbHMgaW50byB0aGlzIC0gaXQgd2FpdHMgZm9yIHRoZSBmcmVzaGx5IGJvb3RlZAorICogdGFyZ2V0IENQVSB0byBhcnJpdmUgYW5kIHRoZW4gc3RhcnRzIHRoZSBtZWFzdXJlbWVudDoKKyAqLwordm9pZCBfX2NwdWluaXQgY2hlY2tfdHNjX3N5bmNfc291cmNlKGludCBjcHUpCit7CisJaW50IGNwdXMgPSAyOworCisJLyoKKwkgKiBObyBuZWVkIHRvIGNoZWNrIGlmIHdlIGFscmVhZHkga25vdyB0aGF0IHRoZSBUU0MgaXMgbm90CisJICogc3luY2hyb25pemVkOgorCSAqLworCWlmICh1bnN5bmNocm9uaXplZF90c2MoKSkKKwkJcmV0dXJuOworCisJcHJpbnRrKEtFUk5fSU5GTyAiY2hlY2tpbmcgVFNDIHN5bmNocm9uaXphdGlvbiBbQ1BVIyVkIC0+IENQVSMlZF06IiwKKwkJCSAgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHUpOworCisJLyoKKwkgKiBSZXNldCBpdCAtIGluIGNhc2UgdGhpcyBpcyBhIHNlY29uZCBib290dXA6CisJICovCisJYXRvbWljX3NldCgmc3RvcF9jb3VudCwgMCk7CisKKwkvKgorCSAqIFdhaXQgZm9yIHRoZSB0YXJnZXQgdG8gYXJyaXZlOgorCSAqLworCXdoaWxlIChhdG9taWNfcmVhZCgmc3RhcnRfY291bnQpICE9IGNwdXMtMSkKKwkJY3B1X3JlbGF4KCk7CisJLyoKKwkgKiBUcmlnZ2VyIHRoZSB0YXJnZXQgdG8gY29udGludWUgaW50byB0aGUgbWVhc3VyZW1lbnQgdG9vOgorCSAqLworCWF0b21pY19pbmMoJnN0YXJ0X2NvdW50KTsKKworCWNoZWNrX3RzY193YXJwKCk7CisKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnN0b3BfY291bnQpICE9IGNwdXMtMSkKKwkJY3B1X3JlbGF4KCk7CisKKwkvKgorCSAqIFJlc2V0IGl0IC0ganVzdCBpbiBjYXNlIHdlIGJvb3QgYW5vdGhlciBDUFUgbGF0ZXI6CisJICovCisJYXRvbWljX3NldCgmc3RhcnRfY291bnQsIDApOworCisJaWYgKG5yX3dhcnBzKSB7CisJCXByaW50aygiXG4iKTsKKwkJcHJpbnRrKEtFUk5fV0FSTklORyAiTWVhc3VyZWQgJUxkIGN5Y2xlcyBUU0Mgd2FycCBiZXR3ZWVuIENQVXMsIgorCQkJCSAgICAiIHR1cm5pbmcgb2ZmIFRTQyBjbG9jay5cbiIsIG1heF93YXJwKTsKKwkJbWFya190c2NfdW5zdGFibGUoKTsKKwkJbnJfd2FycHMgPSAwOworCQltYXhfd2FycCA9IDA7CisJCWxhc3RfdHNjID0gMDsKKwl9IGVsc2UgeworCQlwcmludGsoIiBwYXNzZWQuXG4iKTsKKwl9CisKKwkvKgorCSAqIExldCB0aGUgdGFyZ2V0IGNvbnRpbnVlIHdpdGggdGhlIGJvb3R1cDoKKwkgKi8KKwlhdG9taWNfaW5jKCZzdG9wX2NvdW50KTsKK30KKworLyoKKyAqIEZyZXNobHkgYm9vdGVkIENQVXMgY2FsbCBpbnRvIHRoaXM6CisgKi8KK3ZvaWQgX19jcHVpbml0IGNoZWNrX3RzY19zeW5jX3RhcmdldCh2b2lkKQoreworCWludCBjcHVzID0gMjsKKworCWlmICh1bnN5bmNocm9uaXplZF90c2MoKSkKKwkJcmV0dXJuOworCisJLyoKKwkgKiBSZWdpc3RlciB0aGlzIENQVSdzIHBhcnRpY2lwYXRpb24gYW5kIHdhaXQgZm9yIHRoZQorCSAqIHNvdXJjZSBDUFUgdG8gc3RhcnQgdGhlIG1lYXN1cmVtZW50OgorCSAqLworCWF0b21pY19pbmMoJnN0YXJ0X2NvdW50KTsKKwl3aGlsZSAoYXRvbWljX3JlYWQoJnN0YXJ0X2NvdW50KSAhPSBjcHVzKQorCQljcHVfcmVsYXgoKTsKKworCWNoZWNrX3RzY193YXJwKCk7CisKKwkvKgorCSAqIE9rLCB3ZSBhcmUgZG9uZToKKwkgKi8KKwlhdG9taWNfaW5jKCZzdG9wX2NvdW50KTsKKworCS8qCisJICogV2FpdCBmb3IgdGhlIHNvdXJjZSBDUFUgdG8gcHJpbnQgc3R1ZmY6CisJICovCisJd2hpbGUgKGF0b21pY19yZWFkKCZzdG9wX2NvdW50KSAhPSBjcHVzKQorCQljcHVfcmVsYXgoKTsKK30KKyN1bmRlZiBOUl9MT09QUworCmRpZmYgLS1naXQgYS9hcmNoL3g4Nl82NC9rZXJuZWwvdm1saW51eC5sZHMuUyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCmluZGV4IGMzNjBjNDIuLmI3MzIxMmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCisrKyBiL2FyY2gveDg2XzY0L2tlcm5lbC92bWxpbnV4Lmxkcy5TCkBAIC04OCwzMSArODgsMjUgQEAKICAgX192c3lzY2FsbF8wID0gVlNZU0NBTExfVklSVF9BRERSOwogCiAgIC4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKLSAgLnh0aW1lX2xvY2sgOiBBVChWTE9BRCgueHRpbWVfbG9jaykpIHsgKigueHRpbWVfbG9jaykgfQotICB4dGltZV9sb2NrID0gVlZJUlQoLnh0aW1lX2xvY2spOwotCi0gIC52eHRpbWUgOiBBVChWTE9BRCgudnh0aW1lKSkgeyAqKC52eHRpbWUpIH0KLSAgdnh0aW1lID0gVlZJUlQoLnZ4dGltZSk7CisgIC52c3lzY2FsbF9mbiA6IEFUKFZMT0FEKC52c3lzY2FsbF9mbikpIHsgKigudnN5c2NhbGxfZm4pIH0KKyAgLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworICAudnN5c2NhbGxfZ3RvZF9kYXRhIDogQVQoVkxPQUQoLnZzeXNjYWxsX2d0b2RfZGF0YSkpCisJCXsgKigudnN5c2NhbGxfZ3RvZF9kYXRhKSB9CisgIHZzeXNjYWxsX2d0b2RfZGF0YSA9IFZWSVJUKC52c3lzY2FsbF9ndG9kX2RhdGEpOwogCiAgIC52Z2V0Y3B1X21vZGUgOiBBVChWTE9BRCgudmdldGNwdV9tb2RlKSkgeyAqKC52Z2V0Y3B1X21vZGUpIH0KICAgdmdldGNwdV9tb2RlID0gVlZJUlQoLnZnZXRjcHVfbW9kZSk7CiAKLSAgLnN5c190eiA6IEFUKFZMT0FEKC5zeXNfdHopKSB7ICooLnN5c190eikgfQotICBzeXNfdHogPSBWVklSVCguc3lzX3R6KTsKLQotICAuc3lzY3RsX3ZzeXNjYWxsIDogQVQoVkxPQUQoLnN5c2N0bF92c3lzY2FsbCkpIHsgKiguc3lzY3RsX3ZzeXNjYWxsKSB9Ci0gIHN5c2N0bF92c3lzY2FsbCA9IFZWSVJUKC5zeXNjdGxfdnN5c2NhbGwpOwotCi0gIC54dGltZSA6IEFUKFZMT0FEKC54dGltZSkpIHsgKigueHRpbWUpIH0KLSAgeHRpbWUgPSBWVklSVCgueHRpbWUpOwotCiAgIC4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKICAgLmppZmZpZXMgOiBBVChWTE9BRCguamlmZmllcykpIHsgKiguamlmZmllcykgfQogICBqaWZmaWVzID0gVlZJUlQoLmppZmZpZXMpOwogCi0gIC52c3lzY2FsbF8xIEFERFIoLnZzeXNjYWxsXzApICsgMTAyNDogQVQoVkxPQUQoLnZzeXNjYWxsXzEpKSB7ICooLnZzeXNjYWxsXzEpIH0KLSAgLnZzeXNjYWxsXzIgQUREUigudnN5c2NhbGxfMCkgKyAyMDQ4OiBBVChWTE9BRCgudnN5c2NhbGxfMikpIHsgKigudnN5c2NhbGxfMikgfQotICAudnN5c2NhbGxfMyBBRERSKC52c3lzY2FsbF8wKSArIDMwNzI6IEFUKFZMT0FEKC52c3lzY2FsbF8zKSkgeyAqKC52c3lzY2FsbF8zKSB9CisgIC52c3lzY2FsbF8xIEFERFIoLnZzeXNjYWxsXzApICsgMTAyNDogQVQoVkxPQUQoLnZzeXNjYWxsXzEpKQorCQl7ICooLnZzeXNjYWxsXzEpIH0KKyAgLnZzeXNjYWxsXzIgQUREUigudnN5c2NhbGxfMCkgKyAyMDQ4OiBBVChWTE9BRCgudnN5c2NhbGxfMikpCisJCXsgKigudnN5c2NhbGxfMikgfQorICAudnN5c2NhbGxfMyBBRERSKC52c3lzY2FsbF8wKSArIDMwNzI6IEFUKFZMT0FEKC52c3lzY2FsbF8zKSkKKwkJeyAqKC52c3lzY2FsbF8zKSB9CiAKICAgLiA9IFZTWVNDQUxMX1ZJUlRfQUREUiArIDQwOTY7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2XzY0L2tlcm5lbC92c3lzY2FsbC5jIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKaW5kZXggMzEzZGM2YS4uMTgwZmY5MSAxMDA2NDQKLS0tIGEvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKKysrIGIvYXJjaC94ODZfNjQva2VybmVsL3ZzeXNjYWxsLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvamlmZmllcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2N0bC5oPgorI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvZ2V0Y3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CkBAIC0zNCw2ICszNSw3IEBACiAjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGFnZS5oPgorI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KICNpbmNsdWRlIDxhc20vZml4bWFwLmg+CiAjaW5jbHVkZSA8YXNtL2Vycm5vLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC00NCw1NiArNDYsNDEgQEAKICNkZWZpbmUgX192c3lzY2FsbChucikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCxfX3NlY3Rpb25fXygiLnZzeXNjYWxsXyIgI25yKSkpCiAjZGVmaW5lIF9fc3lzY2FsbF9jbG9iYmVyICJyMTEiLCJyY3giLCJtZW1vcnkiCiAKLWludCBfX3N5c2N0bF92c3lzY2FsbCBfX3NlY3Rpb25fc3lzY3RsX3ZzeXNjYWxsID0gMTsKLXNlcWxvY2tfdCBfX3h0aW1lX2xvY2sgX19zZWN0aW9uX3h0aW1lX2xvY2sgPSBTRVFMT0NLX1VOTE9DS0VEOworc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YV90IHsKKwlzZXFsb2NrX3QgbG9jazsKKwlpbnQgc3lzY3RsX2VuYWJsZWQ7CisJc3RydWN0IHRpbWV2YWwgd2FsbF90aW1lX3R2OworCXN0cnVjdCB0aW1lem9uZSBzeXNfdHo7CisJY3ljbGVfdCBvZmZzZXRfYmFzZTsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgY2xvY2s7Cit9OwogaW50IF9fdmdldGNwdV9tb2RlIF9fc2VjdGlvbl92Z2V0Y3B1X21vZGU7CiAKLSNpbmNsdWRlIDxhc20vdW5pc3RkLmg+Ci0KLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCB0aW1ldmFsX25vcm1hbGl6ZShzdHJ1Y3QgdGltZXZhbCAqIHR2KQorc3RydWN0IHZzeXNjYWxsX2d0b2RfZGF0YV90IF9fdnN5c2NhbGxfZ3RvZF9kYXRhIF9fc2VjdGlvbl92c3lzY2FsbF9ndG9kX2RhdGEgPQogewotCXRpbWVfdCBfX3NlYzsKKwkubG9jayA9IFNFUUxPQ0tfVU5MT0NLRUQsCisJLnN5c2N0bF9lbmFibGVkID0gMSwKK307CiAKLQlfX3NlYyA9IHR2LT50dl91c2VjIC8gMTAwMDAwMDsKLQlpZiAoX19zZWMpIHsKLQkJdHYtPnR2X3VzZWMgJT0gMTAwMDAwMDsKLQkJdHYtPnR2X3NlYyArPSBfX3NlYzsKLQl9Cit2b2lkIHVwZGF0ZV92c3lzY2FsbChzdHJ1Y3QgdGltZXNwZWMgKndhbGxfdGltZSwgc3RydWN0IGNsb2Nrc291cmNlICpjbG9jaykKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ2c3lzY2FsbF9ndG9kX2RhdGEubG9jaywgZmxhZ3MpOworCS8qIGNvcHkgdnN5c2NhbGwgZGF0YSAqLworCXZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jayA9ICpjbG9jazsKKwl2c3lzY2FsbF9ndG9kX2RhdGEud2FsbF90aW1lX3R2LnR2X3NlYyA9IHdhbGxfdGltZS0+dHZfc2VjOworCXZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RpbWVfdHYudHZfdXNlYyA9IHdhbGxfdGltZS0+dHZfbnNlYy8xMDAwOworCXZzeXNjYWxsX2d0b2RfZGF0YS5zeXNfdHogPSBzeXNfdHo7CisJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnZzeXNjYWxsX2d0b2RfZGF0YS5sb2NrLCBmbGFncyk7CiB9CiAKLXN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBkb192Z2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICogdHYpCi17Ci0JbG9uZyBzZXF1ZW5jZSwgdDsKLQl1bnNpZ25lZCBsb25nIHNlYywgdXNlYzsKLQotCWRvIHsKLQkJc2VxdWVuY2UgPSByZWFkX3NlcWJlZ2luKCZfX3h0aW1lX2xvY2spOwotCQkKLQkJc2VjID0gX194dGltZS50dl9zZWM7Ci0JCXVzZWMgPSBfX3h0aW1lLnR2X25zZWMgLyAxMDAwOwotCi0JCWlmIChfX3Z4dGltZS5tb2RlICE9IFZYVElNRV9IUEVUKSB7Ci0JCQl0ID0gZ2V0X2N5Y2xlc19zeW5jKCk7Ci0JCQlpZiAodCA8IF9fdnh0aW1lLmxhc3RfdHNjKQotCQkJCXQgPSBfX3Z4dGltZS5sYXN0X3RzYzsKLQkJCXVzZWMgKz0gKCh0IC0gX192eHRpbWUubGFzdF90c2MpICoKLQkJCQkgX192eHRpbWUudHNjX3F1b3QpID4+IDMyOwotCQkJLyogU2VlIGNvbW1lbnQgaW4geDg2XzY0IGRvX2dldHRpbWVvZmRheS4gKi8KLQkJfSBlbHNlIHsKLQkJCXVzZWMgKz0gKChyZWFkbCgodm9pZCBfX2lvbWVtICopCi0JCQkJICAgZml4X3RvX3ZpcnQoVlNZU0NBTExfSFBFVCkgKyAweGYwKSAtCi0JCQkJICBfX3Z4dGltZS5sYXN0KSAqIF9fdnh0aW1lLnF1b3QpID4+IDMyOwotCQl9Ci0JfSB3aGlsZSAocmVhZF9zZXFyZXRyeSgmX194dGltZV9sb2NrLCBzZXF1ZW5jZSkpOwotCi0JdHYtPnR2X3NlYyA9IHNlYyArIHVzZWMgLyAxMDAwMDAwOwotCXR2LT50dl91c2VjID0gdXNlYyAlIDEwMDAwMDA7Ci19Ci0KLS8qIFJFRC1QRU4gbWF5IHdhbnQgdG8gcmVhZGQgc2VxIGxvY2tpbmcsIGJ1dCB0aGVuIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgd3JpdGUtb25jZS4gKi8KKy8qIFJFRC1QRU4gbWF5IHdhbnQgdG8gcmVhZGQgc2VxIGxvY2tpbmcsIGJ1dCB0aGVuIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUKKyAqIHdyaXRlLW9uY2UuCisgKi8KIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBkb19nZXRfdHooc3RydWN0IHRpbWV6b25lICogdHopCiB7Ci0JKnR6ID0gX19zeXNfdHo7CisJKnR6ID0gX192c3lzY2FsbF9ndG9kX2RhdGEuc3lzX3R6OwogfQogCiBzdGF0aWMgX19hbHdheXNfaW5saW5lIGludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnR2LCBzdHJ1Y3QgdGltZXpvbmUgKnR6KQpAQCAtMTAxLDcgKzg4LDggQEAKIAlpbnQgcmV0OwogCWFzbSB2b2xhdGlsZSgidnN5c2MyOiBzeXNjYWxsIgogCQk6ICI9YSIgKHJldCkKLQkJOiAiMCIgKF9fTlJfZ2V0dGltZW9mZGF5KSwiRCIgKHR2KSwiUyIgKHR6KSA6IF9fc3lzY2FsbF9jbG9iYmVyICk7CisJCTogIjAiIChfX05SX2dldHRpbWVvZmRheSksIkQiICh0diksIlMiICh0eikKKwkJOiBfX3N5c2NhbGxfY2xvYmJlciApOwogCXJldHVybiByZXQ7CiB9CiAKQEAgLTExNCwxMCArMTAyLDQ0IEBACiAJcmV0dXJuIHNlY3M7CiB9CiAKK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgdm9pZCBkb192Z2V0dGltZW9mZGF5KHN0cnVjdCB0aW1ldmFsICogdHYpCit7CisJY3ljbGVfdCBub3csIGJhc2UsIG1hc2ssIGN5Y2xlX2RlbHRhOworCXVuc2lnbmVkIGxvbmcgc2VxLCBtdWx0LCBzaGlmdCwgbnNlY19kZWx0YTsKKwljeWNsZV90ICgqdnJlYWQpKHZvaWQpOworCWRvIHsKKwkJc2VxID0gcmVhZF9zZXFiZWdpbigmX192c3lzY2FsbF9ndG9kX2RhdGEubG9jayk7CisKKwkJdnJlYWQgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay52cmVhZDsKKwkJaWYgKHVubGlrZWx5KCFfX3ZzeXNjYWxsX2d0b2RfZGF0YS5zeXNjdGxfZW5hYmxlZCB8fCAhdnJlYWQpKSB7CisJCQlnZXR0aW1lb2ZkYXkodHYsMCk7CisJCQlyZXR1cm47CisJCX0KKwkJbm93ID0gdnJlYWQoKTsKKwkJYmFzZSA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLmN5Y2xlX2xhc3Q7CisJCW1hc2sgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5tYXNrOworCQltdWx0ID0gX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2subXVsdDsKKwkJc2hpZnQgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5zaGlmdDsKKworCQkqdHYgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RpbWVfdHY7CisKKwl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZfX3ZzeXNjYWxsX2d0b2RfZGF0YS5sb2NrLCBzZXEpKTsKKworCS8qIGNhbGN1bGF0ZSBpbnRlcnZhbDogKi8KKwljeWNsZV9kZWx0YSA9IChub3cgLSBiYXNlKSAmIG1hc2s7CisJLyogY29udmVydCB0byBuc2VjczogKi8KKwluc2VjX2RlbHRhID0gKGN5Y2xlX2RlbHRhICogbXVsdCkgPj4gc2hpZnQ7CisKKwkvKiBjb252ZXJ0IHRvIHVzZWNzIGFuZCBhZGQgdG8gdGltZXNwZWM6ICovCisJdHYtPnR2X3VzZWMgKz0gbnNlY19kZWx0YSAvIE5TRUNfUEVSX1VTRUM7CisJd2hpbGUgKHR2LT50dl91c2VjID4gVVNFQ19QRVJfU0VDKSB7CisJCXR2LT50dl9zZWMgKz0gMTsKKwkJdHYtPnR2X3VzZWMgLT0gVVNFQ19QRVJfU0VDOworCX0KK30KKwogaW50IF9fdnN5c2NhbGwoMCkgdmdldHRpbWVvZmRheShzdHJ1Y3QgdGltZXZhbCAqIHR2LCBzdHJ1Y3QgdGltZXpvbmUgKiB0eikKIHsKLQlpZiAoIV9fc3lzY3RsX3ZzeXNjYWxsKQotCQlyZXR1cm4gZ2V0dGltZW9mZGF5KHR2LHR6KTsKIAlpZiAodHYpCiAJCWRvX3ZnZXR0aW1lb2ZkYXkodHYpOwogCWlmICh0eikKQEAgLTEyOSwxMSArMTUxLDExIEBACiAgKiB1bmxpa2VseSAqLwogdGltZV90IF9fdnN5c2NhbGwoMSkgdnRpbWUodGltZV90ICp0KQogewotCWlmICghX19zeXNjdGxfdnN5c2NhbGwpCisJaWYgKHVubGlrZWx5KCFfX3ZzeXNjYWxsX2d0b2RfZGF0YS5zeXNjdGxfZW5hYmxlZCkpCiAJCXJldHVybiB0aW1lX3N5c2NhbGwodCk7CiAJZWxzZSBpZiAodCkKLQkJKnQgPSBfX3h0aW1lLnR2X3NlYzsJCQotCXJldHVybiBfX3h0aW1lLnR2X3NlYzsKKwkJKnQgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RpbWVfdHYudHZfc2VjOworCXJldHVybiBfX3ZzeXNjYWxsX2d0b2RfZGF0YS53YWxsX3RpbWVfdHYudHZfc2VjOwogfQogCiAvKiBGYXN0IHdheSB0byBnZXQgY3VycmVudCBDUFUgYW5kIG5vZGUuCkBAIC0yMTAsNyArMjMyLDcgQEAKIAkJcmV0ID0gLUVOT01FTTsKIAkJZ290byBvdXQ7CiAJfQotCWlmICghc3lzY3RsX3ZzeXNjYWxsKSB7CisJaWYgKCF2c3lzY2FsbF9ndG9kX2RhdGEuc3lzY3RsX2VuYWJsZWQpIHsKIAkJd3JpdGV3KFNZU0NBTEwsIG1hcDEpOwogCQl3cml0ZXcoU1lTQ0FMTCwgbWFwMik7CiAJfSBlbHNlIHsKQEAgLTIzMiw3ICsyNTQsOCBAQAogCiBzdGF0aWMgY3RsX3RhYmxlIGtlcm5lbF90YWJsZTJbXSA9IHsKIAl7IC5jdGxfbmFtZSA9IDk5LCAucHJvY25hbWUgPSAidnN5c2NhbGw2NCIsCi0JICAuZGF0YSA9ICZzeXNjdGxfdnN5c2NhbGwsIC5tYXhsZW4gPSBzaXplb2YoaW50KSwgLm1vZGUgPSAwNjQ0LAorCSAgLmRhdGEgPSAmdnN5c2NhbGxfZ3RvZF9kYXRhLnN5c2N0bF9lbmFibGVkLCAubWF4bGVuID0gc2l6ZW9mKGludCksCisJICAubW9kZSA9IDA2NDQsCiAJICAuc3RyYXRlZ3kgPSB2c3lzY2FsbF9zeXNjdGxfbm9zdHJhdCwKIAkgIC5wcm9jX2hhbmRsZXIgPSB2c3lzY2FsbF9zeXNjdGxfY2hhbmdlIH0sCiAJe30KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9LY29uZmlnIGIvZHJpdmVycy9hY3BpL0tjb25maWcKaW5kZXggMjBlYWNjMi4uZTk0MmZmZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9hY3BpL0tjb25maWcKQEAgLTEzLDYgKzEzLDcgQEAKIAlkZXBlbmRzIG9uIElBNjQgfHwgWDg2CiAJZGVwZW5kcyBvbiBQQ0kKIAlkZXBlbmRzIG9uIFBNCisJc2VsZWN0IFBOUAogCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIEFkdmFuY2VkIENvbmZpZ3VyYXRpb24gYW5kIFBvd2VyIEludGVyZmFjZSAoQUNQSSkgc3VwcG9ydCBmb3IgCkBAIC0xMzIsMTUgKzEzMyw2IEBACiAJICBOb3RlIHRoYXQgdGhpcyBpcyBhbiByZWYuIGltcGxlbWVudGF0aW9uIG9ubHkuICBJdCBtYXkgb3IgbWF5IG5vdCB3b3JrCiAJICBmb3IgeW91ciBpbnRlZ3JhdGVkIHZpZGVvIGRldmljZS4KIAotY29uZmlnIEFDUElfSE9US0VZCi0JdHJpc3RhdGUgIkdlbmVyaWMgSG90a2V5IChFWFBFUklNRU5UQUwpIgotCWRlcGVuZHMgb24gRVhQRVJJTUVOVEFMCi0JZGVwZW5kcyBvbiBYODYKLQlkZWZhdWx0IG4KLQloZWxwCi0JICBFeHBlcmltZW50YWwgY29uc29saWRhdGVkIGhvdGtleSBkcml2ZXIuCi0JICBJZiB5b3UgYXJlIHVuc3VyZSwgc2F5IE4uCi0KIGNvbmZpZyBBQ1BJX0ZBTgogCXRyaXN0YXRlICJGYW4iCiAJZGVmYXVsdCB5CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvTWFrZWZpbGUgYi9kcml2ZXJzL2FjcGkvTWFrZWZpbGUKaW5kZXggODU2YzMyYi4uNTk1NmU5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvYWNwaS9NYWtlZmlsZQpAQCAtNDYsNyArNDYsNiBAQAogb2JqLSQoQ09ORklHX0FDUElfRE9DSykJCSs9IGRvY2subwogb2JqLSQoQ09ORklHX0FDUElfQkFZKQkJKz0gYmF5Lm8KIG9iai0kKENPTkZJR19BQ1BJX1ZJREVPKQkrPSB2aWRlby5vCi1vYmotJChDT05GSUdfQUNQSV9IT1RLRVkpCSs9IGhvdGtleS5vCiBvYmoteQkJCQkrPSBwY2lfcm9vdC5vIHBjaV9saW5rLm8gcGNpX2lycS5vIHBjaV9iaW5kLm8KIG9iai0kKENPTkZJR19BQ1BJX1BPV0VSKQkrPSBwb3dlci5vCiBvYmotJChDT05GSUdfQUNQSV9QUk9DRVNTT1IpCSs9IHByb2Nlc3Nvci5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYWMuYyBiL2RyaXZlcnMvYWNwaS9hYy5jCmluZGV4IDZkYWVhY2UuLjM3YzdkYzQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9hYy5jCkBAIC0zNSw3ICszNSw2IEBACiAjZGVmaW5lIEFDUElfQUNfQ09NUE9ORU5UCQkweDAwMDIwMDAwCiAjZGVmaW5lIEFDUElfQUNfQ0xBU1MJCQkiYWNfYWRhcHRlciIKICNkZWZpbmUgQUNQSV9BQ19ISUQgCQkJIkFDUEkwMDAzIgotI2RlZmluZSBBQ1BJX0FDX0RSSVZFUl9OQU1FCQkiQUNQSSBBQyBBZGFwdGVyIERyaXZlciIKICNkZWZpbmUgQUNQSV9BQ19ERVZJQ0VfTkFNRQkJIkFDIEFkYXB0ZXIiCiAjZGVmaW5lIEFDUElfQUNfRklMRV9TVEFURQkJInN0YXRlIgogI2RlZmluZSBBQ1BJX0FDX05PVElGWV9TVEFUVVMJCTB4ODAKQEAgLTQ0LDEwICs0MywxMCBAQAogI2RlZmluZSBBQ1BJX0FDX1NUQVRVU19VTktOT1dOCQkweEZGCiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9BQ19DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfYWMiKQorQUNQSV9NT0RVTEVfTkFNRSgiYWMiKTsKIAotICAgIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0FDX0RSSVZFUl9OQU1FKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSSBBQyBBZGFwdGVyIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBleHRlcm4gc3RydWN0IHByb2NfZGlyX2VudHJ5ICphY3BpX2xvY2tfYWNfZGlyKHZvaWQpOwpAQCAtNTgsNyArNTcsNyBAQAogc3RhdGljIGludCBhY3BpX2FjX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfYWNfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9BQ19EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJhYyIsCiAJLmNsYXNzID0gQUNQSV9BQ19DTEFTUywKIAkuaWRzID0gQUNQSV9BQ19ISUQsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYyBiL2RyaXZlcnMvYWNwaS9hY3BpX21lbWhvdHBsdWcuYwppbmRleCBjZDk0NmVkLi5jMjYxNzI2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9tZW1ob3RwbHVnLmMKKysrIGIvZHJpdmVycy9hY3BpL2FjcGlfbWVtaG90cGx1Zy5jCkBAIC0zNSwxNCArMzUsMTMgQEAKICNkZWZpbmUgQUNQSV9NRU1PUllfREVWSUNFX0NPTVBPTkVOVAkJMHgwODAwMDAwMFVMCiAjZGVmaW5lIEFDUElfTUVNT1JZX0RFVklDRV9DTEFTUwkJIm1lbW9yeSIKICNkZWZpbmUgQUNQSV9NRU1PUllfREVWSUNFX0hJRAkJCSJQTlAwQzgwIgotI2RlZmluZSBBQ1BJX01FTU9SWV9ERVZJQ0VfRFJJVkVSX05BTUUJCSJIb3RwbHVnIE1lbSBEcml2ZXIiCiAjZGVmaW5lIEFDUElfTUVNT1JZX0RFVklDRV9OQU1FCQkJIkhvdHBsdWcgTWVtIERldmljZSIKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX01FTU9SWV9ERVZJQ0VfQ09NUE9ORU5UCiAKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfbWVtb3J5IikKLSAgICBNT0RVTEVfQVVUSE9SKCJOYXZlZW4gQiBTIDxuYXZlZW4uYi5zQGludGVsLmNvbT4iKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX01FTU9SWV9ERVZJQ0VfRFJJVkVSX05BTUUpOworQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9tZW1ob3RwbHVnIik7CitNT0RVTEVfQVVUSE9SKCJOYXZlZW4gQiBTIDxuYXZlZW4uYi5zQGludGVsLmNvbT4iKTsKK01PRFVMRV9ERVNDUklQVElPTigiSG90cGx1ZyBNZW0gRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIC8qIEFDUEkgX1NUQSBtZXRob2QgdmFsdWVzICovCkBAIC02MCw3ICs1OSw3IEBACiBzdGF0aWMgaW50IGFjcGlfbWVtb3J5X2RldmljZV9zdGFydChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9tZW1vcnlfZGV2aWNlX2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfTUVNT1JZX0RFVklDRV9EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJhY3BpX21lbWhvdHBsdWciLAogCS5jbGFzcyA9IEFDUElfTUVNT1JZX0RFVklDRV9DTEFTUywKIAkuaWRzID0gQUNQSV9NRU1PUllfREVWSUNFX0hJRCwKIAkub3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jIGIvZHJpdmVycy9hY3BpL2FzdXNfYWNwaS5jCmluZGV4IDMxYWQ3MGEuLjc3MjI5OWYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9hc3VzX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvYXN1c19hY3BpLmMKQEAgLTE0MSw2ICsxNDEsNyBAQAogCQlXNUEsCQkvL1c1QQogCQlXM1YsICAgICAgICAgICAgLy9XMzAzMFYKIAkJeHhOLAkJLy9NMjQwME4sIE0zNzAwTiwgTTUyMDBOLCBNNjgwME4sIFMxMzAwTiwgUzUyMDBOCisJCUE0UywgICAgICAgICAgICAvL1o4MXNwCiAJCS8vKENlbnRyaW5vKQogCQlFTkRfTU9ERUwKIAl9IG1vZGVsOwkJLy9Nb2RlbHMgY3VycmVudGx5IHN1cHBvcnRlZApAQCAtMzk3LDcgKzM5OCwxNiBAQAogCSAuYnJpZ2h0bmVzc19zZXQgPSAiU1BMViIsCiAJIC5icmlnaHRuZXNzX2dldCA9ICJHUExWIiwKIAkgLmRpc3BsYXlfc2V0ID0gIlNEU1AiLAotCSAuZGlzcGxheV9nZXQgPSAiXFxBRFZHIn0KKwkuZGlzcGxheV9nZXQgPSAiXFxBRFZHIn0sCisKKwl7CisJCS5uYW1lICAgICAgICAgICAgICA9ICJBNFMiLAorCQkuYnJpZ2h0bmVzc19zZXQgICAgPSAiU1BMViIsCisJCS5icmlnaHRuZXNzX2dldCAgICA9ICJHUExWIiwKKwkJLm10X2J0X3N3aXRjaCAgICAgID0gIkJMRUQiLAorCQkubXRfd2xlZCAgICAgICAgICAgPSAiV0xFRCIKKwl9CisKIH07CiAKIC8qIHByb2NkaXIgd2UgdXNlICovCkBAIC00MjEsNyArNDMxLDcgQEAKIHN0YXRpYyBpbnQgYXN1c19ob3RrX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFzdXNfaG90a19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYXN1c19ob3RrX2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfSE9US19OQU1FLAorCS5uYW1lID0gImFzdXNfYWNwaSIsCiAJLmNsYXNzID0gQUNQSV9IT1RLX0NMQVNTLAogCS5pZHMgPSBBQ1BJX0hPVEtfSElELAogCS5vcHMgPSB7CkBAIC0xMTE3LDYgKzExMjcsOCBAQAogCQlyZXR1cm4gVzNWOwogCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJXNUEiLCAzKSA9PSAwKQogCQlyZXR1cm4gVzVBOworCWVsc2UgaWYgKHN0cm5jbXAobW9kZWwsICJBNFMiLCAzKSA9PSAwKQorCQlyZXR1cm4gQTRTOwogCWVsc2UKIAkJcmV0dXJuIEVORF9NT0RFTDsKIH0KQEAgLTEzNjUsMTAgKzEzNzcsNiBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCkgewotCQlwcmludGsoS0VSTl9FUlIgIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KIAlhc3VzX3Byb2NfZGlyID0gcHJvY19ta2RpcihQUk9DX0FTVVMsIGFjcGlfcm9vdF9kaXIpOwogCWlmICghYXN1c19wcm9jX2RpcikgewogCQlwcmludGsoS0VSTl9FUlIgIkFzdXMgQUNQSTogVW5hYmxlIHRvIGNyZWF0ZSAvcHJvYyBlbnRyeVxuIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jIGIvZHJpdmVycy9hY3BpL2JhdHRlcnkuYwppbmRleCAyZjQ1MjFhLi5lNjRjNzZjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF0dGVyeS5jCisrKyBiL2RyaXZlcnMvYWNwaS9iYXR0ZXJ5LmMKQEAgLTQyLDcgKzQyLDYgQEAKICNkZWZpbmUgQUNQSV9CQVRURVJZX0NPTVBPTkVOVAkJMHgwMDA0MDAwMAogI2RlZmluZSBBQ1BJX0JBVFRFUllfQ0xBU1MJCSJiYXR0ZXJ5IgogI2RlZmluZSBBQ1BJX0JBVFRFUllfSElECQkiUE5QMEMwQSIKLSNkZWZpbmUgQUNQSV9CQVRURVJZX0RSSVZFUl9OQU1FCSJBQ1BJIEJhdHRlcnkgRHJpdmVyIgogI2RlZmluZSBBQ1BJX0JBVFRFUllfREVWSUNFX05BTUUJIkJhdHRlcnkiCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9GSUxFX0lORk8JCSJpbmZvIgogI2RlZmluZSBBQ1BJX0JBVFRFUllfRklMRV9TVEFUVVMJInN0YXRlIgpAQCAtNTMsMTAgKzUyLDEwIEBACiAjZGVmaW5lIEFDUElfQkFUVEVSWV9VTklUU19BTVBTCQkibUEiCiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CQVRURVJZX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9iYXR0ZXJ5IikKK0FDUElfTU9EVUxFX05BTUUoImJhdHRlcnkiKTsKIAotICAgIE1PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX0JBVFRFUllfRFJJVkVSX05BTUUpOworTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIEJhdHRlcnkgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIGV4dGVybiBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmFjcGlfbG9ja19iYXR0ZXJ5X2Rpcih2b2lkKTsKQEAgLTY3LDcgKzY2LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9iYXR0ZXJ5X3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9iYXR0ZXJ5X2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfQkFUVEVSWV9EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJiYXR0ZXJ5IiwKIAkuY2xhc3MgPSBBQ1BJX0JBVFRFUllfQ0xBU1MsCiAJLmlkcyA9IEFDUElfQkFUVEVSWV9ISUQsCiAJLm9wcyA9IHsKQEAgLTMyNCw2ICszMjMsMTMgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgdm9pZCBhY3BpX2JhdHRlcnlfY2hlY2tfcHJlc2VudChzdHJ1Y3QgYWNwaV9iYXR0ZXJ5ICpiYXR0ZXJ5KQoreworCWlmICghYmF0dGVyeS0+ZmxhZ3MucHJlc2VudCkgeworCQlhY3BpX2JhdHRlcnlfY2hlY2soYmF0dGVyeSk7CisJfQorfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlMgSW50ZXJmYWNlICgvcHJvYykKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCkBAIC0zNDAsNiArMzQ2LDggQEAKIAlpZiAoIWJhdHRlcnkpCiAJCWdvdG8gZW5kOwogCisJYWNwaV9iYXR0ZXJ5X2NoZWNrX3ByZXNlbnQoYmF0dGVyeSk7CisKIAlpZiAoYmF0dGVyeS0+ZmxhZ3MucHJlc2VudCkKIAkJc2VxX3ByaW50ZihzZXEsICJwcmVzZW50OiAgICAgICAgICAgICAgICAgeWVzXG4iKTsKIAllbHNlIHsKQEAgLTQyNCw2ICs0MzIsOCBAQAogCWlmICghYmF0dGVyeSkKIAkJZ290byBlbmQ7CiAKKwlhY3BpX2JhdHRlcnlfY2hlY2tfcHJlc2VudChiYXR0ZXJ5KTsKKwogCWlmIChiYXR0ZXJ5LT5mbGFncy5wcmVzZW50KQogCQlzZXFfcHJpbnRmKHNlcSwgInByZXNlbnQ6ICAgICAgICAgICAgICAgICB5ZXNcbiIpOwogCWVsc2UgewpAQCAtNDk5LDYgKzUwOSw4IEBACiAJaWYgKCFiYXR0ZXJ5KQogCQlnb3RvIGVuZDsKIAorCWFjcGlfYmF0dGVyeV9jaGVja19wcmVzZW50KGJhdHRlcnkpOworCiAJaWYgKCFiYXR0ZXJ5LT5mbGFncy5wcmVzZW50KSB7CiAJCXNlcV9wcmludGYoc2VxLCAicHJlc2VudDogICAgICAgICAgICAgICAgIG5vXG4iKTsKIAkJZ290byBlbmQ7CkBAIC01MzYsNiArNTQ4LDggQEAKIAlpZiAoIWJhdHRlcnkgfHwgKGNvdW50ID4gc2l6ZW9mKGFsYXJtX3N0cmluZykgLSAxKSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwlhY3BpX2JhdHRlcnlfY2hlY2tfcHJlc2VudChiYXR0ZXJ5KTsKKwogCWlmICghYmF0dGVyeS0+ZmxhZ3MucHJlc2VudCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9iYXkuYyBiL2RyaXZlcnMvYWNwaS9iYXkuYwppbmRleCA5MTA4MmNlLi5mYjNmMzFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYmF5LmMKKysrIGIvZHJpdmVycy9hY3BpL2JheS5jCkBAIC0zMiwxMSArMzIsOSBAQAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+CiAKLSNkZWZpbmUgQUNQSV9CQVlfRFJJVkVSX05BTUUgIkFDUEkgUmVtb3ZhYmxlIERyaXZlIEJheSBEcml2ZXIiCi0KLUFDUElfTU9EVUxFX05BTUUoImJheSIpCitBQ1BJX01PRFVMRV9OQU1FKCJiYXkiKTsKIE1PRFVMRV9BVVRIT1IoIktyaXN0ZW4gQ2FybHNvbiBBY2NhcmRpIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9CQVlfRFJJVkVSX05BTUUpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIFJlbW92YWJsZSBEcml2ZSBCYXkgRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAjZGVmaW5lIEFDUElfQkFZX0NMQVNTICJiYXkiCiAjZGVmaW5lIEFDUElfQkFZX0NPTVBPTkVOVAkweDEwMDAwMDAwCkBAIC00NywxOCArNDUsNiBAQAogCWFjcGlfZ2V0X25hbWUoaCwgQUNQSV9GVUxMX1BBVEhOQU1FLCAmYnVmZmVyKTtcCiAJcHJpbnRrKEtFUk5fREVCVUcgUFJFRklYICIlczogJXNcbiIsIHByZWZpeCwgcyk7IH0KIHN0YXRpYyB2b2lkIGJheV9ub3RpZnkoYWNwaV9oYW5kbGUgaGFuZGxlLCB1MzIgZXZlbnQsIHZvaWQgKmRhdGEpOwotc3RhdGljIGludCBhY3BpX2JheV9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwotc3RhdGljIGludCBhY3BpX2JheV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKLQotc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2JheV9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX0JBWV9EUklWRVJfTkFNRSwKLQkuY2xhc3MgPSBBQ1BJX0JBWV9DTEFTUywKLQkuaWRzID0gQUNQSV9CQVlfSElELAotCS5vcHMgPSB7Ci0JCS5hZGQgPSBhY3BpX2JheV9hZGQsCi0JCS5yZW1vdmUgPSBhY3BpX2JheV9yZW1vdmUsCi0JCX0sCi19OwogCiBzdHJ1Y3QgYmF5IHsKIAlhY3BpX2hhbmRsZSBoYW5kbGU7CkBAIC0yMzQsMTQgKzIyMCw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChlamVjdF9yZW1vdmFibGVfZHJpdmUpOwogCi1zdGF0aWMgaW50IGFjcGlfYmF5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKLXsKLQliYXlfZHByaW50ayhkZXZpY2UtPmhhbmRsZSwgImFkZGluZyBiYXkgZGV2aWNlIik7Ci0Jc3RyY3B5KGFjcGlfZGV2aWNlX25hbWUoZGV2aWNlKSwgIkRvY2thYmxlIEJheSIpOwotCXN0cmNweShhY3BpX2RldmljZV9jbGFzcyhkZXZpY2UpLCAiYmF5Iik7Ci0JcmV0dXJuIDA7Ci19Ci0KIHN0YXRpYyBpbnQgYWNwaV9iYXlfYWRkX2ZzKHN0cnVjdCBiYXkgKmJheSkKIHsKIAlpbnQgcmV0OwpAQCAtMzAzLDcgKzI4MSw3IEBACiAKIAkvKiBpbml0aWFsaXplIHBsYXRmb3JtIGRldmljZSBzdHVmZiAqLwogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKEFDUElfQkFZX0NMQVNTLCBpZCwgTlVMTCwgMCk7Ci0JaWYgKHBkZXYgPT0gTlVMTCkgeworCWlmIChJU19FUlIocGRldikpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiRXJyb3IgcmVnaXN0ZXJpbmcgYmF5IGRldmljZVxuIik7CiAJCWdvdG8gYmF5X2FkZF9lcnI7CiAJfQpAQCAtMzM5LDUyICszMTcsNiBAQAogCXJldHVybiAtRU5PREVWOwogfQogCi1zdGF0aWMgaW50IGFjcGlfYmF5X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpCi17Ci0JLyoqKiBGSVhNRTogZG8gc29tZXRoaW5nIGhlcmUgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBiYXlfY3JlYXRlX2FjcGlfZGV2aWNlIC0gYWRkIG5ldyBkZXZpY2VzIHRvIGFjcGkKLSAqIEBoYW5kbGUgLSBoYW5kbGUgb2YgdGhlIGRldmljZSB0byBhZGQKLSAqCi0gKiAgVGhpcyBmdW5jdGlvbiB3aWxsIGNyZWF0ZSBhIG5ldyBhY3BpX2RldmljZSBmb3IgdGhlIGdpdmVuCi0gKiAgaGFuZGxlIGlmIG9uZSBkb2VzIG5vdCBleGlzdCBhbHJlYWR5LiAgVGhpcyBzaG91bGQgY2F1c2UKLSAqICBhY3BpIHRvIHNjYW4gZm9yIGRyaXZlcnMgZm9yIHRoZSBnaXZlbiBkZXZpY2VzLCBhbmQgY2FsbAotICogIG1hdGNoaW5nIGRyaXZlcidzIGFkZCByb3V0aW5lLgotICoKLSAqICBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWNwaV9kZXZpY2UgY29ycmVzcG9uZGluZyB0byB0aGUgaGFuZGxlLgotICovCi1zdGF0aWMgc3RydWN0IGFjcGlfZGV2aWNlICogYmF5X2NyZWF0ZV9hY3BpX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCi17Ci0Jc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UgPSBOVUxMOwotCXN0cnVjdCBhY3BpX2RldmljZSAqcGFyZW50X2RldmljZTsKLQlhY3BpX2hhbmRsZSBwYXJlbnQ7Ci0JaW50IHJldDsKLQotCWJheV9kcHJpbnRrKGhhbmRsZSwgIlRyeWluZyB0byBnZXQgZGV2aWNlIik7Ci0JaWYgKGFjcGlfYnVzX2dldF9kZXZpY2UoaGFuZGxlLCAmZGV2aWNlKSkgewotCQkvKgotCQkgKiBubyBkZXZpY2UgY3JlYXRlZCBmb3IgdGhpcyBvYmplY3QsCi0JCSAqIHNvIHdlIHNob3VsZCBjcmVhdGUgb25lLgotCQkgKi8KLQkJYmF5X2RwcmludGsoaGFuZGxlLCAiTm8gZGV2aWNlIGZvciBoYW5kbGUiKTsKLQkJYWNwaV9nZXRfcGFyZW50KGhhbmRsZSwgJnBhcmVudCk7Ci0JCWlmIChhY3BpX2J1c19nZXRfZGV2aWNlKHBhcmVudCwgJnBhcmVudF9kZXZpY2UpKQotCQkJcGFyZW50X2RldmljZSA9IE5VTEw7Ci0KLQkJcmV0ID0gYWNwaV9idXNfYWRkKCZkZXZpY2UsIHBhcmVudF9kZXZpY2UsIGhhbmRsZSwKLQkJCUFDUElfQlVTX1RZUEVfREVWSUNFKTsKLQkJaWYgKHJldCkgewotCQkJcHJfZGVidWcoImVycm9yIGFkZGluZyBidXMsICV4XG4iLAotCQkJCS1yZXQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0JcmV0dXJuIGRldmljZTsKLX0KLQogLyoqCiAgKiBiYXlfbm90aWZ5IC0gYWN0IHVwb24gYW4gYWNwaSBiYXkgbm90aWZpY2F0aW9uCiAgKiBAaGFuZGxlOiB0aGUgYmF5IGhhbmRsZQpAQCAtMzk0LDM4ICszMjYsMTkgQEAKICAqLwogc3RhdGljIHZvaWQgYmF5X25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKIHsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldjsKKwlzdHJ1Y3QgYmF5ICpiYXlfZGV2ID0gKHN0cnVjdCBiYXkgKilkYXRhOworCXN0cnVjdCBkZXZpY2UgKmRldiA9ICZiYXlfZGV2LT5wZGV2LT5kZXY7CiAKIAliYXlfZHByaW50ayhoYW5kbGUsICJCYXkgZXZlbnQiKTsKIAogCXN3aXRjaChldmVudCkgewogCWNhc2UgQUNQSV9OT1RJRllfQlVTX0NIRUNLOgotCQlwcmludGsoIkJ1cyBDaGVja1xuIik7CiAJY2FzZSBBQ1BJX05PVElGWV9ERVZJQ0VfQ0hFQ0s6Ci0JCXByaW50aygiRGV2aWNlIENoZWNrXG4iKTsKLQkJZGV2ID0gYmF5X2NyZWF0ZV9hY3BpX2RldmljZShoYW5kbGUpOwotCQlpZiAoZGV2KQotCQkJYWNwaV9idXNfZ2VuZXJhdGVfZXZlbnQoZGV2LCBldmVudCwgMCk7Ci0JCWVsc2UKLQkJCXByaW50aygiTm8gZGV2aWNlIGZvciBnZW5lcmF0aW5nIGV2ZW50XG4iKTsKLQkJLyogd291bGRuJ3QgaXQgYmUgYSBnb29kIGlkZWEgdG8ganVzdCByZXNjYW4gU0FUQQotCQkgKiByaWdodCBoZXJlPwotCQkgKi8KLQkJYnJlYWs7CiAJY2FzZSBBQ1BJX05PVElGWV9FSkVDVF9SRVFVRVNUOgotCQlwcmludGsoIkVqZWN0IHJlcXVlc3RcbiIpOwotCQlkZXYgPSBiYXlfY3JlYXRlX2FjcGlfZGV2aWNlKGhhbmRsZSk7Ci0JCWlmIChkZXYpCi0JCQlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChkZXYsIGV2ZW50LCAwKTsKLQkJZWxzZQotCQkJcHJpbnRrKCJObyBkZXZpY2UgZm9yIGdlbmVyYXRpbmcgZXZlbnRuIik7Ci0KLQkJLyogd291bGRuJ3QgaXQgYmUgYSBnb29kIGlkZWEgdG8ganVzdCBjYWxsIHRoZQotCQkgKiBlamVjdF9kZXZpY2UgaGVyZSBpZiB3ZSB3ZXJlIGEgU0FUQSBkZXZpY2U/Ci0JCSAqLworCQlrb2JqZWN0X3VldmVudCgmZGV2LT5rb2JqLCBLT0JKX0NIQU5HRSk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6Ci0JCXByaW50aygidW5rbm93biBldmVudCAlZFxuIiwgZXZlbnQpOworCQlwcmludGsoS0VSTl9FUlIgUFJFRklYICJCYXk6IHVua25vd24gZXZlbnQgJWRcbiIsIGV2ZW50KTsKIAl9CiB9CiAKQEAgLTQ1NywxMCArMzcwLDYgQEAKIAlhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9ERVZJQ0UsIEFDUElfUk9PVF9PQkpFQ1QsCiAJCUFDUElfVUlOVDMyX01BWCwgZmluZF9iYXksICZiYXlzLCBOVUxMKTsKIAotCWlmIChiYXlzKQotCQlpZiAoKGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYWNwaV9iYXlfZHJpdmVyKSA8IDApKQotCQkJcHJpbnRrKEtFUk5fRVJSICJVbmFibGUgdG8gcmVnaXN0ZXIgYmF5IGRyaXZlclxuIik7Ci0KIAlpZiAoIWJheXMpCiAJCXJldHVybiAtRU5PREVWOwogCkBAIC00ODEsOCArMzkwLDYgQEAKIAkJa2ZyZWUoYmF5LT5uYW1lKTsKIAkJa2ZyZWUoYmF5KTsKIAl9Ci0KLQlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmYWNwaV9iYXlfZHJpdmVyKTsKIH0KIAogcG9zdGNvcmVfaW5pdGNhbGwoYmF5X2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2J1cy5jIGIvZHJpdmVycy9hY3BpL2J1cy5jCmluZGV4IGJlOWE4NzguLjBjOTNjZDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9idXMuYworKysgYi9kcml2ZXJzL2FjcGkvYnVzLmMKQEAgLTM5LDcgKzM5LDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfQlVTX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9idXMiKQorQUNQSV9NT0RVTEVfTkFNRSgiYnVzIik7CiAjaWZkZWYJQ09ORklHX1g4NgogZXh0ZXJuIHZvaWQgX19pbml0IGFjcGlfcGljX3NjaV9zZXRfdHJpZ2dlcih1bnNpZ25lZCBpbnQgaXJxLCB1MTYgdHJpZ2dlcik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9idXR0b24uYyBiL2RyaXZlcnMvYWNwaS9idXR0b24uYwppbmRleCBjNzI2NjEyLi5jYjQxMTBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvYnV0dG9uLmMKKysrIGIvZHJpdmVycy9hY3BpL2J1dHRvbi5jCkBAIC0zNCw3ICszNCw2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBBQ1BJX0JVVFRPTl9DT01QT05FTlQJCTB4MDAwODAwMDAKLSNkZWZpbmUgQUNQSV9CVVRUT05fRFJJVkVSX05BTUUJCSJBQ1BJIEJ1dHRvbiBEcml2ZXIiCiAjZGVmaW5lIEFDUElfQlVUVE9OX0NMQVNTCQkiYnV0dG9uIgogI2RlZmluZSBBQ1BJX0JVVFRPTl9GSUxFX0lORk8JCSJpbmZvIgogI2RlZmluZSBBQ1BJX0JVVFRPTl9GSUxFX1NUQVRFCQkic3RhdGUiCkBAIC02MSwxMCArNjAsMTAgQEAKICNkZWZpbmUgQUNQSV9CVVRUT05fVFlQRV9MSUQJCTB4MDUKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0JVVFRPTl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfYnV0dG9uIikKK0FDUElfTU9EVUxFX05BTUUoImJ1dHRvbiIpOwogCiBNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9CVVRUT05fRFJJVkVSX05BTUUpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIEJ1dHRvbiBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIGludCBhY3BpX2J1dHRvbl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwpAQCAtNzMsNyArNzIsNyBAQAogc3RhdGljIGludCBhY3BpX2J1dHRvbl9zdGF0ZV9vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2J1dHRvbl9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX0JVVFRPTl9EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJidXR0b24iLAogCS5jbGFzcyA9IEFDUElfQlVUVE9OX0NMQVNTLAogCS5pZHMgPSAiYnV0dG9uX3Bvd2VyLGJ1dHRvbl9zbGVlcCxQTlAwQzBELFBOUDBDMEMsUE5QMEMwRSIsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9jbV9zYnMuYyBiL2RyaXZlcnMvYWNwaS9jbV9zYnMuYwppbmRleCA0YTliN2JmLi5mOWRiNGY0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvY21fc2JzLmMKKysrIGIvZHJpdmVycy9hY3BpL2NtX3Nicy5jCkBAIC0zMSw3ICszMSw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAjaW5jbHVkZSA8YWNwaS9hY3V0aWxzLmg+CiAKLUFDUElfTU9EVUxFX05BTUUoImNtX3NicyIpCitBQ1BJX01PRFVMRV9OQU1FKCJjbV9zYnMiKTsKICNkZWZpbmUgQUNQSV9BQ19DTEFTUwkJImFjX2FkYXB0ZXIiCiAjZGVmaW5lIEFDUElfQkFUVEVSWV9DTEFTUwkiYmF0dGVyeSIKICNkZWZpbmUgQUNQSV9TQlNfQ09NUE9ORU5UCTB4MDAwODAwMDAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYyBiL2RyaXZlcnMvYWNwaS9jb250YWluZXIuYwppbmRleCA2OWE2OGZkLi4wOTMwZDk0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvY29udGFpbmVyLmMKKysrIGIvZHJpdmVycy9hY3BpL2NvbnRhaW5lci5jCkBAIC0zNSw3ICszNSw2IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KICNpbmNsdWRlIDxhY3BpL2NvbnRhaW5lci5oPgogCi0jZGVmaW5lIEFDUElfQ09OVEFJTkVSX0RSSVZFUl9OQU1FCSJBQ1BJIGNvbnRhaW5lciBkcml2ZXIiCiAjZGVmaW5lIEFDUElfQ09OVEFJTkVSX0RFVklDRV9OQU1FCSJBQ1BJIGNvbnRhaW5lciBkZXZpY2UiCiAjZGVmaW5lIEFDUElfQ09OVEFJTkVSX0NMQVNTCQkiY29udGFpbmVyIgogCkBAIC00NCwxMCArNDMsMTAgQEAKIAogI2RlZmluZSBBQ1BJX0NPTlRBSU5FUl9DT01QT05FTlQJMHgwMTAwMDAwMAogI2RlZmluZSBfQ09NUE9ORU5UCQkJQUNQSV9DT05UQUlORVJfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2NvbnRhaW5lciIpCitBQ1BJX01PRFVMRV9OQU1FKCJjb250YWluZXIiKTsKIAotICAgIE1PRFVMRV9BVVRIT1IoIkFuaWwgUyBLZXNoYXZhbXVydGh5Iik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9DT05UQUlORVJfRFJJVkVSX05BTUUpOworTU9EVUxFX0FVVEhPUigiQW5pbCBTIEtlc2hhdmFtdXJ0aHkiKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSSBjb250YWluZXIgZHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKICNkZWZpbmUgQUNQSV9TVEFfUFJFU0VOVAkJKDB4MDAwMDAwMDEpCkBAIC01Niw3ICs1NSw3IEBACiBzdGF0aWMgaW50IGFjcGlfY29udGFpbmVyX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfY29udGFpbmVyX2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfQ09OVEFJTkVSX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gImNvbnRhaW5lciIsCiAJLmNsYXNzID0gQUNQSV9DT05UQUlORVJfQ0xBU1MsCiAJLmlkcyA9ICJBQ1BJMDAwNCxQTlAwQTA1LFBOUDBBMDYiLAogCS5vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGVidWcuYyBiL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCmluZGV4IGQ0OGY2NWEuLmJmNTEzZTAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCisrKyBiL2RyaXZlcnMvYWNwaS9kZWJ1Zy5jCkBAIC0xMiw3ICsxMiw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY2dsb2JhbC5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfU1lTVEVNX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiZGVidWciKQorQUNQSV9NT0RVTEVfTkFNRSgiZGVidWciKTsKIAogI2lmZGVmIE1PRFVMRV9QQVJBTV9QUkVGSVgKICN1bmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jIGIvZHJpdmVycy9hY3BpL2Rpc3BhdGNoZXIvZHNtZXRob2QuYwppbmRleCAxY2JlNjE5Li4xNjgzZTVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZGlzcGF0Y2hlci9kc21ldGhvZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9kaXNwYXRjaGVyL2RzbWV0aG9kLmMKQEAgLTIzMSwxMCArMjMxLDggQEAKIAkJICogT2J0YWluIHRoZSBtZXRob2QgbXV0ZXggaWYgbmVjZXNzYXJ5LiBEbyBub3QgYWNxdWlyZSBtdXRleCBmb3IgYQogCQkgKiByZWN1cnNpdmUgY2FsbC4KIAkJICovCi0JCWlmICghd2Fsa19zdGF0ZSB8fAotCQkgICAgIW9ial9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4Lm93bmVyX3RocmVhZCB8fAotCQkgICAgKHdhbGtfc3RhdGUtPnRocmVhZCAhPQotCQkgICAgIG9ial9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4Lm93bmVyX3RocmVhZCkpIHsKKwkJaWYgKGFjcGlfb3NfZ2V0X3RocmVhZF9pZCgpICE9CisJCSAgICBvYmpfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC5vd25lcl90aHJlYWRfaWQpIHsKIAkJCS8qCiAJCQkgKiBBY3F1aXJlIHRoZSBtZXRob2QgbXV0ZXguIFRoaXMgcmVsZWFzZXMgdGhlIGludGVycHJldGVyIGlmIHdlCiAJCQkgKiBibG9jayAoYW5kIHJlYWNxdWlyZXMgaXQgYmVmb3JlIGl0IHJldHVybnMpCkBAIC0yNDgsMTQgKzI0NiwxNCBAQAogCQkJfQogCiAJCQkvKiBVcGRhdGUgdGhlIG11dGV4IGFuZCB3YWxrIGluZm8gYW5kIHNhdmUgdGhlIG9yaWdpbmFsIHN5bmNfbGV2ZWwgKi8KKwkJCW9ial9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4Lm93bmVyX3RocmVhZF9pZCA9CisJCQkJYWNwaV9vc19nZXRfdGhyZWFkX2lkKCk7CiAKIAkJCWlmICh3YWxrX3N0YXRlKSB7CiAJCQkJb2JqX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXguCiAJCQkJICAgIG9yaWdpbmFsX3N5bmNfbGV2ZWwgPQogCQkJCSAgICB3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbDsKIAotCQkJCW9ial9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4Lm93bmVyX3RocmVhZCA9Ci0JCQkJICAgIHdhbGtfc3RhdGUtPnRocmVhZDsKIAkJCQl3YWxrX3N0YXRlLT50aHJlYWQtPmN1cnJlbnRfc3luY19sZXZlbCA9CiAJCQkJICAgIG9ial9kZXNjLT5tZXRob2Quc3luY19sZXZlbDsKIAkJCX0gZWxzZSB7CkBAIC01NjksNyArNTY3LDcgQEAKIAogCQkJYWNwaV9vc19yZWxlYXNlX211dGV4KG1ldGhvZF9kZXNjLT5tZXRob2QubXV0ZXgtPm11dGV4LgogCQkJCQkgICAgICBvc19tdXRleCk7Ci0JCQltZXRob2RfZGVzYy0+bWV0aG9kLm11dGV4LT5tdXRleC5vd25lcl90aHJlYWQgPSBOVUxMOworCQkJbWV0aG9kX2Rlc2MtPm1ldGhvZC5tdXRleC0+bXV0ZXgub3duZXJfdGhyZWFkX2lkID0gQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7CiAJCX0KIAl9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9kb2NrLmMgYi9kcml2ZXJzL2FjcGkvZG9jay5jCmluZGV4IDY4OGU4M2EuLjU0YTY5N2YgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9kb2NrLmMKKysrIGIvZHJpdmVycy9hY3BpL2RvY2suYwpAQCAtMzIsMTEgKzMyLDExIEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKLSNkZWZpbmUgQUNQSV9ET0NLX0RSSVZFUl9OQU1FICJBQ1BJIERvY2sgU3RhdGlvbiBEcml2ZXIiCisjZGVmaW5lIEFDUElfRE9DS19EUklWRVJfREVTQ1JJUFRJT04gIkFDUEkgRG9jayBTdGF0aW9uIERyaXZlciIKIAotQUNQSV9NT0RVTEVfTkFNRSgiZG9jayIpCitBQ1BJX01PRFVMRV9OQU1FKCJkb2NrIik7CiBNT0RVTEVfQVVUSE9SKCJLcmlzdGVuIENhcmxzb24gQWNjYXJkaSIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfRE9DS19EUklWRVJfTkFNRSk7CitNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9ET0NLX0RSSVZFUl9ERVNDUklQVElPTik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBzdHJ1Y3QgYXRvbWljX25vdGlmaWVyX2hlYWQgZG9ja19ub3RpZmllcl9saXN0OwpAQCAtNzQxLDcgKzc0MSw3IEBACiAJCWdvdG8gZG9ja19hZGRfZXJyOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gUFJFRklYICIlcyBcbiIsIEFDUElfRE9DS19EUklWRVJfTkFNRSk7CisJcHJpbnRrKEtFUk5fSU5GTyBQUkVGSVggIiVzIFxuIiwgQUNQSV9ET0NLX0RSSVZFUl9ERVNDUklQVElPTik7CiAKIAlyZXR1cm4gMDsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2VjLmMgYi9kcml2ZXJzL2FjcGkvZWMuYwppbmRleCA3NDNjZTI3Li5hYjY4ODgzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZWMuYworKysgYi9kcml2ZXJzL2FjcGkvZWMuYwpAQCAtMzgsMTEgKzM4LDEwIEBACiAjaW5jbHVkZSA8YWNwaS9hY3R5cGVzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9FQ19DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfZWMiKQorQUNQSV9NT0RVTEVfTkFNRSgiZWMiKTsKICNkZWZpbmUgQUNQSV9FQ19DT01QT05FTlQJCTB4MDAxMDAwMDAKICNkZWZpbmUgQUNQSV9FQ19DTEFTUwkJCSJlbWJlZGRlZF9jb250cm9sbGVyIgogI2RlZmluZSBBQ1BJX0VDX0hJRAkJCSJQTlAwQzA5IgotI2RlZmluZSBBQ1BJX0VDX0RSSVZFUl9OQU1FCQkiQUNQSSBFbWJlZGRlZCBDb250cm9sbGVyIERyaXZlciIKICNkZWZpbmUgQUNQSV9FQ19ERVZJQ0VfTkFNRQkJIkVtYmVkZGVkIENvbnRyb2xsZXIiCiAjZGVmaW5lIEFDUElfRUNfRklMRV9JTkZPCQkiaW5mbyIKICN1bmRlZiBQUkVGSVgKQEAgLTgwLDcgKzc5LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9lY19hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfZWNfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9FQ19EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJlYyIsCiAJLmNsYXNzID0gQUNQSV9FQ19DTEFTUywKIAkuaWRzID0gQUNQSV9FQ19ISUQsCiAJLm9wcyA9IHsKQEAgLTI4MCw4ICsyNzksMTAgQEAKIAltdXRleF9sb2NrKCZlYy0+bG9jayk7CiAJaWYgKGVjLT5nbG9iYWxfbG9jaykgewogCQlzdGF0dXMgPSBhY3BpX2FjcXVpcmVfZ2xvYmFsX2xvY2soQUNQSV9FQ19VREVMQVlfR0xLLCAmZ2xrKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQorCQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJCW11dGV4X3VubG9jaygmZWMtPmxvY2spOwogCQkJcmV0dXJuIC1FTk9ERVY7CisJCX0KIAl9CiAKIAkvKiBNYWtlIHN1cmUgR1BFIGlzIGVuYWJsZWQgYmVmb3JlIGRvaW5nIHRyYW5zYWN0aW9uICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXZlbnQuYyBiL2RyaXZlcnMvYWNwaS9ldmVudC5jCmluZGV4IDk1OWE4OTMuLjNiMjM1NjIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudC5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudC5jCkBAIC0xMyw3ICsxMyw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1NZU1RFTV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImV2ZW50IikKK0FDUElfTU9EVUxFX05BTUUoImV2ZW50Iik7CiAKIC8qIEdsb2JhbCB2YXJzIGZvciBoYW5kbGluZyBldmVudCBwcm9jIGVudHJ5ICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGFjcGlfc3lzdGVtX2V2ZW50X2xvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jIGIvZHJpdmVycy9hY3BpL2V2ZW50cy9ldmdwZS5jCmluZGV4IGRmYWMzZWMuLjYzNWJhNDQgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZncGUuYworKysgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2Z3BlLmMKQEAgLTYzNiwxNyArNjM2LDYgQEAKIAkJfQogCX0KIAotCWlmICghYWNwaV9nYmxfc3lzdGVtX2F3YWtlX2FuZF9ydW5uaW5nKSB7Ci0JCS8qCi0JCSAqIFdlIGp1c3Qgd29rZSB1cCBiZWNhdXNlIG9mIGEgd2FrZSBHUEUuIERpc2FibGUgYW55IGZ1cnRoZXIgR1BFcwotCQkgKiB1bnRpbCB3ZSBhcmUgZnVsbHkgdXAgYW5kIHJ1bm5pbmcgKE9ubHkgd2FrZSBHUEVzIHNob3VsZCBiZSBlbmFibGVkCi0JCSAqIGF0IHRoaXMgdGltZSwgYnV0IHdlIGp1c3QgYnJ1dGUtZm9yY2UgZGlzYWJsZSB0aGVtIGFsbC4pCi0JCSAqIDEpIFdlIG11c3QgZGlzYWJsZSB0aGlzIHBhcnRpY3VsYXIgd2FrZSBHUEUgc28gaXQgd29uJ3QgZmlyZSBhZ2FpbgotCQkgKiAyKSBXZSB3YW50IHRvIGRpc2FibGUgYWxsIHdha2UgR1BFcywgc2luY2Ugd2UgYXJlIG5vdyBhd2FrZQotCQkgKi8KLQkJKHZvaWQpYWNwaV9od19kaXNhYmxlX2FsbF9ncGVzKCk7Ci0JfQotCiAJLyoKIAkgKiBEaXNwYXRjaCB0aGUgR1BFIHRvIGVpdGhlciBhbiBpbnN0YWxsZWQgaGFuZGxlciwgb3IgdGhlIGNvbnRyb2wgbWV0aG9kCiAJICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgR1BFIChfTHh4IG9yIF9FeHgpLiBJZiBhIGhhbmRsZXIgZXhpc3RzLCB3ZSBpbnZva2UKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMgYi9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCmluZGV4IDFiNzg0ZmZlLi5kNTcyNzAwIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvZXZlbnRzL2V2bWlzYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9ldmVudHMvZXZtaXNjLmMKQEAgLTE5NiwxMiArMTk2LDExIEBACiAJCW5vdGlmeV9pbmZvLT5ub3RpZnkudmFsdWUgPSAodTE2KSBub3RpZnlfdmFsdWU7CiAJCW5vdGlmeV9pbmZvLT5ub3RpZnkuaGFuZGxlcl9vYmogPSBoYW5kbGVyX29iajsKIAotCQlzdGF0dXMgPQotCQkgICAgYWNwaV9vc19leGVjdXRlKE9TTF9OT1RJRllfSEFORExFUiwgYWNwaV9ldl9ub3RpZnlfZGlzcGF0Y2gsCi0JCQkJICAgIG5vdGlmeV9pbmZvKTsKLQkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7Ci0JCQlhY3BpX3V0X2RlbGV0ZV9nZW5lcmljX3N0YXRlKG5vdGlmeV9pbmZvKTsKLQkJfQorCQlhY3BpX2V4X3JlbGlucXVpc2hfaW50ZXJwcmV0ZXIoKTsKKworCQlhY3BpX2V2X25vdGlmeV9kaXNwYXRjaChub3RpZnlfaW5mbyk7CisKKwkJYWNwaV9leF9yZWFjcXVpcmVfaW50ZXJwcmV0ZXIoKTsKIAl9CiAKIAlpZiAoIWhhbmRsZXJfb2JqKSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLmMKaW5kZXggNjhkMjgzZi4uMWE3M2MxNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4ZHVtcC5jCisrKyBiL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leGR1bXAuYwpAQCAtMTM0LDcgKzEzNCw3IEBACiBzdGF0aWMgc3RydWN0IGFjcGlfZXhkdW1wX2luZm8gYWNwaV9leF9kdW1wX211dGV4WzVdID0gewogCXtBQ1BJX0VYRF9JTklULCBBQ1BJX0VYRF9UQUJMRV9TSVpFKGFjcGlfZXhfZHVtcF9tdXRleCksIE5VTEx9LAogCXtBQ1BJX0VYRF9VSU5UOCwgQUNQSV9FWERfT0ZGU0VUKG11dGV4LnN5bmNfbGV2ZWwpLCAiU3luYyBMZXZlbCJ9LAotCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobXV0ZXgub3duZXJfdGhyZWFkKSwgIk93bmVyIFRocmVhZCJ9LAorCXtBQ1BJX0VYRF9QT0lOVEVSLCBBQ1BJX0VYRF9PRkZTRVQobXV0ZXgub3duZXJfdGhyZWFkX2lkKSwgIk93bmVyIFRocmVhZCJ9LAogCXtBQ1BJX0VYRF9VSU5UMTYsIEFDUElfRVhEX09GRlNFVChtdXRleC5hY3F1aXNpdGlvbl9kZXB0aCksCiAJICJBY3F1aXJlIERlcHRoIn0sCiAJe0FDUElfRVhEX1BPSU5URVIsIEFDUElfRVhEX09GRlNFVChtdXRleC5vc19tdXRleCksICJPc011dGV4In0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMgYi9kcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhtdXRleC5jCmluZGV4IDUxMDFiYWQuLjRlYjg4M2IgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9leGVjdXRlci9leG11dGV4LmMKKysrIGIvZHJpdmVycy9hY3BpL2V4ZWN1dGVyL2V4bXV0ZXguYwpAQCAtNjYsMTAgKzY2LDkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi12b2lkIGFjcGlfZXhfdW5saW5rX211dGV4KHVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9ial9kZXNjKQordm9pZCBhY3BpX2V4X3VubGlua19tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpCiB7Ci0Jc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQgPSBvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkOwotCiAJaWYgKCF0aHJlYWQpIHsKIAkJcmV0dXJuOwogCX0KQEAgLTE3NCwxNiArMTczLDEzIEBACiAKIAkvKiBTdXBwb3J0IGZvciBtdWx0aXBsZSBhY3F1aXJlcyBieSB0aGUgb3duaW5nIHRocmVhZCAqLwogCi0JaWYgKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQpIHsKLQkJaWYgKG9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQtPnRocmVhZF9pZCA9PQotCQkgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT50aHJlYWRfaWQpIHsKLQkJCS8qCi0JCQkgKiBUaGUgbXV0ZXggaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRocmVhZCwganVzdCBpbmNyZW1lbnQgdGhlCi0JCQkgKiBhY3F1aXNpdGlvbiBkZXB0aAotCQkJICovCi0JCQlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgrKzsKLQkJCXJldHVybl9BQ1BJX1NUQVRVUyhBRV9PSyk7Ci0JCX0KKwlpZiAob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZF9pZCA9PSBhY3BpX29zX2dldF90aHJlYWRfaWQoKSkgeworCQkvKgorCQkgKiBUaGUgbXV0ZXggaXMgYWxyZWFkeSBvd25lZCBieSB0aGlzIHRocmVhZCwganVzdCBpbmNyZW1lbnQgdGhlCisJCSAqIGFjcXVpc2l0aW9uIGRlcHRoCisJCSAqLworCQlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGgrKzsKKwkJcmV0dXJuX0FDUElfU1RBVFVTKEFFX09LKTsKIAl9CiAKIAkvKiBBY3F1aXJlIHRoZSBtdXRleCwgd2FpdCBpZiBuZWNlc3NhcnkuIFNwZWNpYWwgY2FzZSBmb3IgR2xvYmFsIExvY2sgKi8KQEAgLTIwNiw3ICsyMDIsNyBAQAogCiAJLyogSGF2ZSB0aGUgbXV0ZXg6IHVwZGF0ZSBtdXRleCBhbmQgd2FsayBpbmZvIGFuZCBzYXZlIHRoZSBzeW5jX2xldmVsICovCiAKLQlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkID0gd2Fsa19zdGF0ZS0+dGhyZWFkOworCW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWRfaWQgPSBhY3BpX29zX2dldF90aHJlYWRfaWQoKTsKIAlvYmpfZGVzYy0+bXV0ZXguYWNxdWlzaXRpb25fZGVwdGggPSAxOwogCW9ial9kZXNjLT5tdXRleC5vcmlnaW5hbF9zeW5jX2xldmVsID0KIAkgICAgd2Fsa19zdGF0ZS0+dGhyZWFkLT5jdXJyZW50X3N5bmNfbGV2ZWw7CkBAIC0yNDYsNyArMjQyLDcgQEAKIAogCS8qIFRoZSBtdXRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IGFjcXVpcmVkIGluIG9yZGVyIHRvIHJlbGVhc2UgaXQgKi8KIAotCWlmICghb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCkgeworCWlmICghb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZF9pZCkgewogCQlBQ1BJX0VSUk9SKChBRV9JTkZPLAogCQkJICAgICJDYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdLCBub3QgYWNxdWlyZWQiLAogCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSkpKTsKQEAgLTI2NiwxNCArMjYyLDE0IEBACiAJICogVGhlIE11dGV4IGlzIG93bmVkLCBidXQgdGhpcyB0aHJlYWQgbXVzdCBiZSB0aGUgb3duZXIuCiAJICogU3BlY2lhbCBjYXNlIGZvciBHbG9iYWwgTG9jaywgYW55IHRocmVhZCBjYW4gcmVsZWFzZQogCSAqLwotCWlmICgob2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkICE9CisJaWYgKChvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkX2lkICE9CiAJICAgICB3YWxrX3N0YXRlLT50aHJlYWQtPnRocmVhZF9pZCkKIAkgICAgJiYgKG9ial9kZXNjLT5tdXRleC5vc19tdXRleCAhPSBhY3BpX2dibF9nbG9iYWxfbG9ja19tdXRleCkpIHsKIAkJQUNQSV9FUlJPUigoQUVfSU5GTywKIAkJCSAgICAiVGhyZWFkICVsWCBjYW5ub3QgcmVsZWFzZSBNdXRleCBbJTQuNHNdIGFjcXVpcmVkIGJ5IHRocmVhZCAlbFgiLAogCQkJICAgICh1bnNpZ25lZCBsb25nKXdhbGtfc3RhdGUtPnRocmVhZC0+dGhyZWFkX2lkLAogCQkJICAgIGFjcGlfdXRfZ2V0X25vZGVfbmFtZShvYmpfZGVzYy0+bXV0ZXgubm9kZSksCi0JCQkgICAgKHVuc2lnbmVkIGxvbmcpb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZC0+dGhyZWFkX2lkKSk7CisJCQkgICAgKHVuc2lnbmVkIGxvbmcpb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZF9pZCkpOwogCQlyZXR1cm5fQUNQSV9TVEFUVVMoQUVfQU1MX05PVF9PV05FUik7CiAJfQogCkBAIC0zMDAsNyArMjk2LDcgQEAKIAogCS8qIFVubGluayB0aGUgbXV0ZXggZnJvbSB0aGUgb3duZXIncyBsaXN0ICovCiAKLQlhY3BpX2V4X3VubGlua19tdXRleChvYmpfZGVzYyk7CisJYWNwaV9leF91bmxpbmtfbXV0ZXgob2JqX2Rlc2MsIHdhbGtfc3RhdGUtPnRocmVhZCk7CiAKIAkvKiBSZWxlYXNlIHRoZSBtdXRleCwgc3BlY2lhbCBjYXNlIGZvciBHbG9iYWwgTG9jayAqLwogCkBAIC0zMTIsNyArMzA4LDcgQEAKIAogCS8qIFVwZGF0ZSB0aGUgbXV0ZXggYW5kIHJlc3RvcmUgc3luY19sZXZlbCAqLwogCi0Jb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZCA9IE5VTEw7CisJb2JqX2Rlc2MtPm11dGV4Lm93bmVyX3RocmVhZF9pZCA9IEFDUElfTVVURVhfTk9UX0FDUVVJUkVEOwogCXdhbGtfc3RhdGUtPnRocmVhZC0+Y3VycmVudF9zeW5jX2xldmVsID0KIAkgICAgb2JqX2Rlc2MtPm11dGV4Lm9yaWdpbmFsX3N5bmNfbGV2ZWw7CiAKQEAgLTM2Nyw3ICszNjMsNyBAQAogCiAJCS8qIE1hcmsgbXV0ZXggdW5vd25lZCAqLwogCi0JCW9ial9kZXNjLT5tdXRleC5vd25lcl90aHJlYWQgPSBOVUxMOworCQlvYmpfZGVzYy0+bXV0ZXgub3duZXJfdGhyZWFkX2lkID0gQUNQSV9NVVRFWF9OT1RfQUNRVUlSRUQ7CiAKIAkJLyogVXBkYXRlIFRocmVhZCBzeW5jX2xldmVsIChMYXN0IG11dGV4IGlzIHRoZSBpbXBvcnRhbnQgb25lKSAqLwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvZmFuLmMgYi9kcml2ZXJzL2FjcGkvZmFuLmMKaW5kZXggYWYyMmZkZi4uZWM2NTVjNSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2Zhbi5jCisrKyBiL2RyaXZlcnMvYWNwaS9mYW4uYwpAQCAtMzYsMTQgKzM2LDEzIEBACiAKICNkZWZpbmUgQUNQSV9GQU5fQ09NUE9ORU5UCQkweDAwMjAwMDAwCiAjZGVmaW5lIEFDUElfRkFOX0NMQVNTCQkJImZhbiIKLSNkZWZpbmUgQUNQSV9GQU5fRFJJVkVSX05BTUUJCSJBQ1BJIEZhbiBEcml2ZXIiCiAjZGVmaW5lIEFDUElfRkFOX0ZJTEVfU1RBVEUJCSJzdGF0ZSIKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0ZBTl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfZmFuIikKK0FDUElfTU9EVUxFX05BTUUoImZhbiIpOwogCi0gICAgTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfRkFOX0RSSVZFUl9OQU1FKTsKK01PRFVMRV9BVVRIT1IoIlBhdWwgRGllZmVuYmF1Z2giKTsKK01PRFVMRV9ERVNDUklQVElPTigiQUNQSSBGYW4gRHJpdmVyIik7CiBNT0RVTEVfTElDRU5TRSgiR1BMIik7CiAKIHN0YXRpYyBpbnQgYWNwaV9mYW5fYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKQEAgLTUyLDcgKzUxLDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9mYW5fcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2Zhbl9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX0ZBTl9EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJmYW4iLAogCS5jbGFzcyA9IEFDUElfRkFOX0NMQVNTLAogCS5pZHMgPSAiUE5QMEMwQiIsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9nbHVlLmMgYi9kcml2ZXJzL2FjcGkvZ2x1ZS5jCmluZGV4IDdiNmM5ZmYuLjQzMzRjMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9nbHVlLmMKKysrIGIvZHJpdmVycy9hY3BpL2dsdWUuYwpAQCAtMjQxLDMgKzI0MSw2NSBAQAogfQogCiBhcmNoX2luaXRjYWxsKGluaXRfYWNwaV9kZXZpY2Vfbm90aWZ5KTsKKworCisjaWYgZGVmaW5lZChDT05GSUdfUlRDX0RSVl9DTU9TKSB8fCBkZWZpbmVkKENPTkZJR19SVENfRFJWX0NNT1NfTU9EVUxFKQorCisvKiBFdmVyeSBBQ1BJIHBsYXRmb3JtIGhhcyBhIG1jMTQ2ODE4IGNvbXBhdGlibGUgImNtb3MgcnRjIi4gIEhlcmUgd2UgZmluZAorICogaXRzIGRldmljZSBub2RlIGFuZCBwYXNzIGV4dHJhIGNvbmZpZyBkYXRhLiAgVGhpcyBoZWxwcyBpdHMgZHJpdmVyIHVzZQorICogY2FwYWJpbGl0aWVzIHRoYXQgdGhlIG5vdy1vYnNvbGV0ZSBtYzE0NjgxOCBkaWRuJ3QgaGF2ZSwgYW5kIGluZm9ybXMgaXQKKyAqIHRoYXQgdGhpcyBib2FyZCdzIFJUQyBpcyB3YWtldXAtY2FwYWJsZSAocGVyIEFDUEkgc3BlYykuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9tYzE0NjgxOHJ0Yy5oPgorCitzdGF0aWMgc3RydWN0IGNtb3NfcnRjX2JvYXJkX2luZm8gcnRjX2luZm87CisKKworLyogUE5QIGRldmljZXMgYXJlIHJlZ2lzdGVyZWQgaW4gYSBzdWJzeXNfaW5pdGNhbGwoKTsKKyAqIEFDUEkgc3BlY2lmaWVzIHRoZSBQTlAgSURzIHRvIHVzZS4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3BucC5oPgorCitzdGF0aWMgaW50IF9faW5pdCBwbnBfbWF0Y2goc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQoreworCXN0YXRpYyBjb25zdCBjaGFyICppZHNbXSA9IHsgIlBOUDBiMDAiLCAiUE5QMGIwMSIsICJQTlAwYjAyIiwgfTsKKwlzdHJ1Y3QgcG5wX2RldiAqcG5wID0gdG9fcG5wX2RldihkZXYpOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaWRzKTsgaSsrKSB7CisJCWlmIChjb21wYXJlX3BucF9pZChwbnAtPmlkLCBpZHNbaV0pICE9IDApCisJCQlyZXR1cm4gMTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlICpfX2luaXQgZ2V0X3J0Y19kZXYodm9pZCkKK3sKKwlyZXR1cm4gYnVzX2ZpbmRfZGV2aWNlKCZwbnBfYnVzX3R5cGUsIE5VTEwsIE5VTEwsIHBucF9tYXRjaCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGFjcGlfcnRjX2luaXQodm9pZCkKK3sKKwlzdHJ1Y3QgZGV2aWNlICpkZXYgPSBnZXRfcnRjX2RldigpOworCisJaWYgKGRldikgeworCQlydGNfaW5mby5ydGNfZGF5X2FsYXJtID0gYWNwaV9nYmxfRkFEVC5kYXlfYWxhcm07CisJCXJ0Y19pbmZvLnJ0Y19tb25fYWxhcm0gPSBhY3BpX2dibF9GQURULm1vbnRoX2FsYXJtOworCQlydGNfaW5mby5ydGNfY2VudHVyeSA9IGFjcGlfZ2JsX0ZBRFQuY2VudHVyeTsKKworCQkvKiBOT1RFOiAgYWNwaV9nYmxfRkFEVC0+cnRjczQgaXMgTk9UIGN1cnJlbnRseSB1c2VmdWwgKi8KKworCQlkZXYtPnBsYXRmb3JtX2RhdGEgPSAmcnRjX2luZm87CisKKwkJLyogUlRDIGFsd2F5cyB3YWtlcyBmcm9tIFMxL1MyL1MzLCBhbmQgb2Z0ZW4gUzQvU1REICovCisJCWRldmljZV9pbml0X3dha2V1cChkZXYsIDEpOworCisJCXB1dF9kZXZpY2UoZGV2KTsKKwl9IGVsc2UKKwkJcHJfZGVidWcoIkFDUEk6IFJUQyB1bmF2YWlsYWJsZT9cbiIpOworCXJldHVybiAwOworfQorLyogZG8gdGhpcyBiZXR3ZWVuIFJUQyBzdWJzeXNfaW5pdGNhbGwoKSBhbmQgcnRjX2Ntb3MgZHJpdmVyX2luaXRjYWxsKCkgKi8KK2ZzX2luaXRjYWxsKGFjcGlfcnRjX2luaXQpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9ob3RrZXkuYyBiL2RyaXZlcnMvYWNwaS9ob3RrZXkuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkZmI5Mi4uMDAwMDAwMAotLS0gYS9kcml2ZXJzL2FjcGkvaG90a2V5LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQyICswLDAgQEAKLS8qCi0gKiAgaG90a2V5LmMgLSBBQ1BJIEhvdGtleSBEcml2ZXIgKCRSZXZpc2lvbjogMC4yICQpCi0gKgotICogIENvcHlyaWdodCAoQykgMjAwNCBMdW1pbmcgWXUgPGx1bWluZy55dUBpbnRlbC5jb20+Ci0gKgotICogfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKLSAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQotICogIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdAotICogIHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KLSAqCi0gKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAotICogIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKLSAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQotICogIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KLSAqCi0gKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKLSAqICB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAotICogIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcgVVNBLgotICoKLSAqIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci0gKi8KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLSNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9rbW9kLmg+Ci0jaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KLSNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgotI2luY2x1ZGUgPGFjcGkvYWNwaV9idXMuaD4KLSNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgotCi0jZGVmaW5lIEhPVEtFWV9BQ1BJX1ZFUlNJT04gIjAuMSIKLQotI2RlZmluZSBIT1RLRVlfUFJPQyAiaG90a2V5IgotI2RlZmluZSBIT1RLRVlfRVZfQ09ORklHICAgICJldmVudF9jb25maWciCi0jZGVmaW5lIEhPVEtFWV9QTF9DT05GSUcgICAgInBvbGxfY29uZmlnIgotI2RlZmluZSBIT1RLRVlfQUNUSU9OICAgImFjdGlvbiIKLSNkZWZpbmUgSE9US0VZX0lORk8gImluZm8iCi0KLSNkZWZpbmUgQUNQSV9IT1RLX05BTUUgICAgICAgICAgIkdlbmVyaWMgSG90a2V5IERyaXZlciIKLSNkZWZpbmUgQUNQSV9IT1RLX0NMQVNTICAgICAgICAgIkhvdGtleSIKLSNkZWZpbmUgQUNQSV9IT1RLX0RFVklDRV9OQU1FICAgIkhvdGtleSIKLSNkZWZpbmUgQUNQSV9IT1RLX0hJRCAgICAgICAgICAgIlVua25vd24/IgotI2RlZmluZSBBQ1BJX0hPVEtFWV9DT01QT05FTlQgICAweDIwMDAwMDAwCi0KLSNkZWZpbmUgQUNQSV9IT1RLRVlfRVZFTlQgICAweDEKLSNkZWZpbmUgQUNQSV9IT1RLRVlfUE9MTElORyAweDIKLSNkZWZpbmUgQUNQSV9VTkRFRklORURfRVZFTlQgICAgMHhmCi0KLSNkZWZpbmUgUkVTVUxUX1NUUl9MRU4JICAgIDgwCi0KLSNkZWZpbmUgQUNUSU9OX01FVEhPRAkwCi0jZGVmaW5lIFBPTExfTUVUSE9ECTEKLQotI2RlZmluZSBJU19FVkVOVChlKSAgICAgICAJKChlKSA8PSAxMDAwMCAmJiAoZSkgPjApCi0jZGVmaW5lIElTX1BPTEwoZSkgICAgICAJKChlKSA+IDEwMDAwKQotI2RlZmluZSBJU19PVEhFUlMoZSkJCSgoZSk8PTAgfHwgKGUpPj0yMDAwMCkKLSNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICAgICAgQUNQSV9IT1RLRVlfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX2hvdGtleSIpCi0KLSAgICBNT0RVTEVfQVVUSE9SKCJsdW1pbmcueXVAaW50ZWwuY29tIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9IT1RLX05BTUUpOwotTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwotCi0vKiAgc3RhbmRhcmRpemVkIGludGVybmFsIGhvdGtleSBudW1iZXIvZXZlbnQgICovCi1lbnVtIHsKLQkvKiBWaWRlbyBFeHRlbnNpb24gZXZlbnQgKi8KLQlIS19FVkVOVF9DWUNMRV9PVVRQVVRfREVWSUNFID0gMHg4MCwKLQlIS19FVkVOVF9PVVRQVVRfREVWSUNFX1NUQVRVU19DSEFOR0UsCi0JSEtfRVZFTlRfQ1lDTEVfRElTUExBWV9PVVRQVVQsCi0JSEtfRVZFTlRfTkVYVF9ESVNQTEFZX09VVFBVVCwKLQlIS19FVkVOVF9QUkVWSU9VU19ESVNQTEFZX09VVFBVVCwKLQlIS19FVkVOVF9DWUNMRV9CUklHSFRORVNTLAotCUhLX0VWRU5UX0lOQ1JFQVNFX0JSSUdIVE5FU1MsCi0JSEtfRVZFTlRfREVDUkVBU0VfQlJJR0hUTkVTUywKLQlIS19FVkVOVF9aRVJPX0JSSUdIVE5FU1MsCi0JSEtfRVZFTlRfRElTUExBWV9ERVZJQ0VfT0ZGLAotCi0JLyogU25kIENhcmQgZXZlbnQgKi8KLQlIS19FVkVOVF9WT0xVTUVfTVVURSwKLQlIS19FVkVOVF9WT0xVTUVfSU5DTFJFQVNFLAotCUhLX0VWRU5UX1ZPTFVNRV9ERUNSRUFTRSwKLQotCS8qIHJ1bm5pbmcgc3RhdGUgY29udHJvbCAqLwotCUhLX0VWRU5UX0VOVEVSUklOR19TMywKLQlIS19FVkVOVF9FTlRFUlJJTkdfUzQsCi0JSEtfRVZFTlRfRU5URVJSSU5HX1M1LAotfTsKLQotZW51bSBjb25mX2VudHJ5X2VudW0gewotCWJ1c19oYW5kbGUgPSAwLAotCWJ1c19tZXRob2QgPSAxLAotCWFjdGlvbl9oYW5kbGUgPSAyLAotCW1ldGhvZCA9IDMsCi0JTEFTVF9DT05GX0VOVFJZCi19OwotCi0vKiAgcHJvY2RpciB3ZSB1c2UgKi8KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvdGtleV9wcm9jX2RpcjsKLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKmhvdGtleV9jb25maWc7Ci1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfcG9sbF9jb25maWc7Ci1zdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICpob3RrZXlfYWN0aW9uOwotc3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqaG90a2V5X2luZm87Ci0KLS8qIGxpbmthZ2UgZm9yIGFsbCB0eXBlIG9mIGhvdGtleSAqLwotc3RydWN0IGFjcGlfaG90a2V5X2xpbmsgewotCXN0cnVjdCBsaXN0X2hlYWQgZW50cmllczsKLQlpbnQgaG90a2V5X3R5cGU7CS8qIGV2ZW50IG9yIHBvbGxpbmcgYmFzZWQgaG90a2V5ICAqLwotCWludCBob3RrZXlfc3RhbmRhcmRfbnVtOwkvKiBzdGFuZGFyZGl6ZWQgaG90a2V5KGV2ZW50KSBudW1iZXIgKi8KLX07Ci0KLS8qIGV2ZW50IGJhc2VkIGhvdGtleSAqLwotc3RydWN0IGFjcGlfZXZlbnRfaG90a2V5IHsKLQlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGluayBob3RrZXlfbGluazsKLQlpbnQgZmxhZzsKLQlhY3BpX2hhbmRsZSBidXNfaGFuZGxlOwkvKiBidXMgdG8gaW5zdGFsbCBub3RpZnkgaGFuZGxlciAqLwotCWludCBleHRlcm5hbF9ob3RrZXlfbnVtOwkvKiBleHRlcm5hbCBob3RrZXkvZXZlbnQgbnVtYmVyICovCi0JYWNwaV9oYW5kbGUgYWN0aW9uX2hhbmRsZTsJLyogYWNwaSBoYW5kbGUgYXR0YWNoZWQgYW1sIGFjdGlvbiBtZXRob2QgKi8KLQljaGFyICphY3Rpb25fbWV0aG9kOwkvKiBhY3Rpb24gbWV0aG9kICovCi19OwotCi0vKgotICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIHBvbGwgc3RhdHVzCi0gKiAxLiBkaXJlY3R5IGNhbGwgcmVhZF94eHggbWV0aG9kLCB3aXRob3V0IGFueSBhcmd1bWVudHMgcGFzc2VkIGluCi0gKiAyLiBjYWxsIHdyaXRlX3h4eCBtZXRob2QsIHdpdGggYXJndW1lbnRzIHBhc3NlZCBpbiwgeW91IG5lZWQKLSAqIHRoZSByZXN1bHQgaXMgc2F2ZWQgaW4gYWNwaV9wb2xsaW5nX2hvdGtleS5wb2xsX3Jlc3VsdC4KLSAqIGFudGhvZXIgcmVhZCBjb21tYW5kIHRocm91Z2ggcG9sbGluZyBpbnRlcmZhY2UuCi0gKgotICovCi0KLS8qIHBvbGxpbmcgYmFzZWQgaG90a2V5ICovCi1zdHJ1Y3QgYWNwaV9wb2xsaW5nX2hvdGtleSB7Ci0Jc3RydWN0IGFjcGlfaG90a2V5X2xpbmsgaG90a2V5X2xpbms7Ci0JaW50IGZsYWc7Ci0JYWNwaV9oYW5kbGUgcG9sbF9oYW5kbGU7CS8qIGFjcGkgaGFuZGxlIGF0dGFjaGVkIHBvbGxpbmcgbWV0aG9kICovCi0JY2hhciAqcG9sbF9tZXRob2Q7CS8qIHBvbGwgbWV0aG9kICovCi0JYWNwaV9oYW5kbGUgYWN0aW9uX2hhbmRsZTsJLyogYWNwaSBoYW5kbGUgYXR0YWNoZWQgYWN0aW9uIG1ldGhvZCAqLwotCWNoYXIgKmFjdGlvbl9tZXRob2Q7CS8qIGFjdGlvbiBtZXRob2QgKi8KLQl1bmlvbiBhY3BpX29iamVjdCAqcG9sbF9yZXN1bHQ7CS8qIHBvbGxpbmdfcmVzdWx0ICovCi0Jc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwcm9jOwotfTsKLQotLyogaG90a2V5IG9iamVjdCB1bmlvbiAqLwotdW5pb24gYWNwaV9ob3RrZXkgewotCXN0cnVjdCBsaXN0X2hlYWQgZW50cmllczsKLQlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGluayBsaW5rOwotCXN0cnVjdCBhY3BpX2V2ZW50X2hvdGtleSBldmVudF9ob3RrZXk7Ci0Jc3RydWN0IGFjcGlfcG9sbGluZ19ob3RrZXkgcG9sbF9ob3RrZXk7Ci19OwotCi0vKiBob3RrZXkgb2JqZWN0IGxpc3QgKi8KLXN0cnVjdCBhY3BpX2hvdGtleV9saXN0IHsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOwotCWludCBjb3VudDsKLX07Ci0KLXN0YXRpYyBpbnQgYXV0b19ob3RrZXlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKLXN0YXRpYyBpbnQgYXV0b19ob3RrZXlfcmVtb3ZlKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlLCBpbnQgdHlwZSk7Ci0KLXN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgaG90a2V5X2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfSE9US19OQU1FLAotCS5jbGFzcyA9IEFDUElfSE9US19DTEFTUywKLQkuaWRzID0gQUNQSV9IT1RLX0hJRCwKLQkub3BzID0gewotCQkuYWRkID0gYXV0b19ob3RrZXlfYWRkLAotCQkucmVtb3ZlID0gYXV0b19ob3RrZXlfcmVtb3ZlLAotCQl9LAotfTsKLQotc3RhdGljIHZvaWQgZnJlZV9ob3RrZXlfZGV2aWNlKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpOwotc3RhdGljIHZvaWQgZnJlZV9ob3RrZXlfYnVmZmVyKHVuaW9uIGFjcGlfaG90a2V5ICprZXkpOwotc3RhdGljIHZvaWQgZnJlZV9wb2xsX2hvdGtleV9idWZmZXIodW5pb24gYWNwaV9ob3RrZXkgKmtleSk7Ci1zdGF0aWMgaW50IGhvdGtleV9vcGVuX2NvbmZpZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGhvdGtleV9wb2xsX29wZW5fY29uZmlnKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKTsKLXN0YXRpYyBzc2l6ZV90IGhvdGtleV93cml0ZV9jb25maWcoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJICAgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCi0JCQkJICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKiBkYXRhKTsKLXN0YXRpYyBpbnQgaG90a2V5X2luZm9fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgaW50IGhvdGtleV9hY3Rpb25fb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7Ci1zdGF0aWMgc3NpemVfdCBob3RrZXlfZXhlY3V0ZV9hbWxfbWV0aG9kKHN0cnVjdCBmaWxlICpmaWxlLAotCQkJCQkgY29uc3QgY2hhciBfX3VzZXIgKiBidWZmZXIsCi0JCQkJCSBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpOwotc3RhdGljIGludCBob3RrZXlfY29uZmlnX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpOwotc3RhdGljIGludCBob3RrZXlfcG9sbF9jb25maWdfc2VxX3Nob3coc3RydWN0IHNlcV9maWxlICpzZXEsIHZvaWQgKm9mZnNldCk7Ci1zdGF0aWMgaW50IGhvdGtleV9wb2xsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpOwotc3RhdGljIHVuaW9uIGFjcGlfaG90a2V5ICpnZXRfaG90a2V5X2J5X2V2ZW50KHN0cnVjdAotCQkJCQkgICAgICBhY3BpX2hvdGtleV9saXN0Ci0JCQkJCSAgICAgICpob3RrZXlfbGlzdCwgaW50IGV2ZW50KTsKLQotLyogZXZlbnQgYmFzZWQgY29uZmlnICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfY29uZmlnX2ZvcHMgPSB7Ci0JLm9wZW4gPSBob3RrZXlfb3Blbl9jb25maWcsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkud3JpdGUgPSBob3RrZXlfd3JpdGVfY29uZmlnLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLS8qIHBvbGxpbmcgYmFzZWQgY29uZmlnICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfcG9sbF9jb25maWdfZm9wcyA9IHsKLQkub3BlbiA9IGhvdGtleV9wb2xsX29wZW5fY29uZmlnLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLndyaXRlID0gaG90a2V5X3dyaXRlX2NvbmZpZywKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi0vKiBob3RrZXkgZHJpdmVyIGluZm8gKi8KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGhvdGtleV9pbmZvX2ZvcHMgPSB7Ci0JLm9wZW4gPSBob3RrZXlfaW5mb19vcGVuX2ZzLAotCS5yZWFkID0gc2VxX3JlYWQsCi0JLmxsc2VlayA9IHNlcV9sc2VlaywKLQkucmVsZWFzZSA9IHNpbmdsZV9yZWxlYXNlLAotfTsKLQotLyogYWN0aW9uICovCi1zdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBob3RrZXlfYWN0aW9uX2ZvcHMgPSB7Ci0JLm9wZW4gPSBob3RrZXlfYWN0aW9uX29wZW5fZnMsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkud3JpdGUgPSBob3RrZXlfZXhlY3V0ZV9hbWxfbWV0aG9kLAotCS5sbHNlZWsgPSBzZXFfbHNlZWssCi0JLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKLX07Ci0KLS8qIHBvbGxpbmcgcmVzdWx0cyAqLwotc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgaG90a2V5X3BvbGxpbmdfZm9wcyA9IHsKLQkub3BlbiA9IGhvdGtleV9wb2xsaW5nX29wZW5fZnMsCi0JLnJlYWQgPSBzZXFfcmVhZCwKLQkubGxzZWVrID0gc2VxX2xzZWVrLAotCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCi19OwotCi1zdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCBnbG9iYWxfaG90a2V5X2xpc3Q7CS8qIGxpbmsgYWxsIGV2IG9yIHBsIGhvdGtleSAgKi8KLXN0cnVjdCBsaXN0X2hlYWQgaG90a2V5X2VudHJpZXM7CS8qIGhlYWQgb2YgdGhlIGxpc3Qgb2YgaG90a2V5X2xpc3QgKi8KLQotc3RhdGljIGludCBob3RrZXlfaW5mb19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCi0Jc2VxX3ByaW50ZihzZXEsICJIb3RrZXkgZ2VuZXJpYyBkcml2ZXIgdmVyOiAlc1xuIiwgSE9US0VZX0FDUElfVkVSU0lPTik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBob3RrZXlfaW5mb19vcGVuX2ZzKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQotewotCXJldHVybiBzaW5nbGVfb3BlbihmaWxlLCBob3RrZXlfaW5mb19zZXFfc2hvdywgUERFKGlub2RlKS0+ZGF0YSk7Ci19Ci0KLXN0YXRpYyBjaGFyICpmb3JtYXRfcmVzdWx0KHVuaW9uIGFjcGlfb2JqZWN0ICpvYmplY3QpCi17Ci0JY2hhciAqYnVmOwotCi0JYnVmID0ga3phbGxvYyhSRVNVTFRfU1RSX0xFTiwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFidWYpCi0JCXJldHVybiBOVUxMOwotCS8qIE5vdywganVzdCBzdXBwb3J0IGludGVnZXIgdHlwZSAqLwotCWlmIChvYmplY3QtPnR5cGUgPT0gQUNQSV9UWVBFX0lOVEVHRVIpCi0JCXNwcmludGYoYnVmLCAiJWRcbiIsICh1MzIpIG9iamVjdC0+aW50ZWdlci52YWx1ZSk7Ci0JcmV0dXJuIGJ1ZjsKLX0KLQotc3RhdGljIGludCBob3RrZXlfcG9sbGluZ19zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQotewotCXN0cnVjdCBhY3BpX3BvbGxpbmdfaG90a2V5ICpwb2xsX2hvdGtleSA9IHNlcS0+cHJpdmF0ZTsKLQljaGFyICpidWY7Ci0KLQotCWlmIChwb2xsX2hvdGtleS0+cG9sbF9yZXN1bHQpIHsKLQkJYnVmID0gZm9ybWF0X3Jlc3VsdChwb2xsX2hvdGtleS0+cG9sbF9yZXN1bHQpOwotCQlpZiAoYnVmKQotCQkJc2VxX3ByaW50ZihzZXEsICIlcyIsIGJ1Zik7Ci0JCWtmcmVlKGJ1Zik7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9wb2xsaW5nX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhvdGtleV9wb2xsaW5nX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKLX0KLQotc3RhdGljIGludCBob3RrZXlfYWN0aW9uX29wZW5fZnMoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIGhvdGtleV9pbmZvX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKTsKLX0KLQotLyogTWFwcGluZyBleHRlcm5hbCBob3RrZXkgbnVtYmVyIHRvIHN0YW5kYXJkaXplZCBob3RrZXkgZXZlbnQgbnVtICovCi1zdGF0aWMgaW50IGhvdGtleV9nZXRfaW50ZXJuYWxfZXZlbnQoaW50IGV2ZW50LCBzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqbGlzdCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOwotCWludCB2YWwgPSAtMTsKLQotCi0JbGlzdF9mb3JfZWFjaChlbnRyaWVzLCBsaXN0LT5lbnRyaWVzKSB7Ci0JCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQotCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKLQkJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVAotCQkgICAgJiYga2V5LT5ldmVudF9ob3RrZXkuZXh0ZXJuYWxfaG90a2V5X251bSA9PSBldmVudCkgewotCQkJdmFsID0ga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW07Ci0JCQlicmVhazsKLQkJfQotCX0KLQotCXJldHVybiB2YWw7Ci19Ci0KLXN0YXRpYyB2b2lkCi1hY3BpX2hvdGtleV9ub3RpZnlfaGFuZGxlcihhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKLXsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7Ci0JdTMyIGludGVybmFsX2V2ZW50OwotCi0KLQlpZiAoYWNwaV9idXNfZ2V0X2RldmljZShoYW5kbGUsICZkZXZpY2UpKQotCQlyZXR1cm47Ci0KLQlpbnRlcm5hbF9ldmVudCA9IGhvdGtleV9nZXRfaW50ZXJuYWxfZXZlbnQoZXZlbnQsICZnbG9iYWxfaG90a2V5X2xpc3QpOwotCWFjcGlfYnVzX2dlbmVyYXRlX2V2ZW50KGRldmljZSwgaW50ZXJuYWxfZXZlbnQsIDApOwotCi0JcmV0dXJuOwotfQotCi0vKiBOZWVkIHRvIGludmVudCBhdXRvbWF0aWNhbGx5IGhvdGtleSBhZGQgbWV0aG9kICovCi1zdGF0aWMgaW50IGF1dG9faG90a2V5X2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSkKLXsKLQkvKiBJbXBsZW1lbnQgbWUgKi8KLQlyZXR1cm4gMDsKLX0KLQotLyogTmVlZCB0byBpbnZlbnQgYXV0b21hdGljYWxseSBob3RrZXkgcmVtb3ZlIG1ldGhvZCAqLwotc3RhdGljIGludCBhdXRvX2hvdGtleV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQotewotCS8qIEltcGxlbWVudCBtZSAqLwotCXJldHVybiAwOwotfQotCi0vKiBDcmVhdGUgYSBwcm9jIGZpbGUgZm9yIGVhY2ggcG9sbGluZyBtZXRob2QgKi8KLXN0YXRpYyBpbnQgY3JlYXRlX3BvbGxpbmdfcHJvYyh1bmlvbiBhY3BpX2hvdGtleSAqZGV2aWNlKQotewotCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcHJvYzsKLQljaGFyIHByb2NfbmFtZVs4MF07Ci0JbW9kZV90IG1vZGU7Ci0KLQltb2RlID0gU19JRlJFRyB8IFNfSVJVR08gfCBTX0lXVUdPOwotCi0Jc3ByaW50Zihwcm9jX25hbWUsICIlZCIsIGRldmljZS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKTsKLQkvKgotCSAgIHN0cmNhdChwcm9jX25hbWUsIGRldmljZS0+cG9sbF9ob3RrZXkucG9sbF9tZXRob2QpOwotCSAqLwotCXByb2MgPSBjcmVhdGVfcHJvY19lbnRyeShwcm9jX25hbWUsIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7Ci0KLQlpZiAoIXByb2MpIHsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfSBlbHNlIHsKLQkJcHJvYy0+cHJvY19mb3BzID0gJmhvdGtleV9wb2xsaW5nX2ZvcHM7Ci0JCXByb2MtPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCXByb2MtPmRhdGEgPSBkZXZpY2U7Ci0JCXByb2MtPnVpZCA9IDA7Ci0JCXByb2MtPmdpZCA9IDA7Ci0JCWRldmljZS0+cG9sbF9ob3RrZXkucHJvYyA9IHByb2M7Ci0JfQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9hZGQodW5pb24gYWNwaV9ob3RrZXkgKmRldmljZSkKLXsKLQlpbnQgc3RhdHVzID0gMDsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldiA9IE5VTEw7Ci0KLQotCWlmIChkZXZpY2UtPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQpIHsKLQkJYWNwaV9idXNfZ2V0X2RldmljZShkZXZpY2UtPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlLCAmZGV2KTsKLQkJc3RhdHVzID0gYWNwaV9pbnN0YWxsX25vdGlmeV9oYW5kbGVyKGRldi0+aGFuZGxlLAotCQkJCQkJICAgICBBQ1BJX0RFVklDRV9OT1RJRlksCi0JCQkJCQkgICAgIGFjcGlfaG90a2V5X25vdGlmeV9oYW5kbGVyLAotCQkJCQkJICAgICBkZXYpOwotCX0gZWxzZQkJCS8qIEFkZCBwb2xsaW5nIGhvdGtleSAqLwotCQljcmVhdGVfcG9sbGluZ19wcm9jKGRldmljZSk7Ci0KLQlnbG9iYWxfaG90a2V5X2xpc3QuY291bnQrKzsKLQotCWxpc3RfYWRkX3RhaWwoJmRldmljZS0+bGluay5lbnRyaWVzLCBnbG9iYWxfaG90a2V5X2xpc3QuZW50cmllcyk7Ci0KLQlyZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV9yZW1vdmUodW5pb24gYWNwaV9ob3RrZXkgKmRldmljZSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzLCAqbmV4dDsKLQotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJpZXMsIG5leHQsIGdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzKSB7Ci0JCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQotCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKLQkJaWYgKGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09Ci0JCSAgICBkZXZpY2UtPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSkgewotCQkJbGlzdF9kZWwoJmtleS0+bGluay5lbnRyaWVzKTsKLQkJCWZyZWVfaG90a2V5X2RldmljZShrZXkpOwotCQkJZ2xvYmFsX2hvdGtleV9saXN0LmNvdW50LS07Ci0JCQlicmVhazsKLQkJfQotCX0KLQlrZnJlZShkZXZpY2UpOwotCXJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IGhvdGtleV91cGRhdGUodW5pb24gYWNwaV9ob3RrZXkgKmtleSkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOwotCi0KLQlsaXN0X2Zvcl9lYWNoKGVudHJpZXMsIGdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzKSB7Ci0JCXVuaW9uIGFjcGlfaG90a2V5ICp0bXAgPQotCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKLQkJaWYgKHRtcC0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtID09Ci0JCSAgICBrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSkgewotCQkJaWYgKGtleS0+bGluay5ob3RrZXlfdHlwZSA9PSBBQ1BJX0hPVEtFWV9FVkVOVCkgewotCQkJCWZyZWVfaG90a2V5X2J1ZmZlcih0bXApOwotCQkJCXRtcC0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUgPQotCQkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5idXNfaGFuZGxlOwotCQkJCXRtcC0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0gPQotCQkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5leHRlcm5hbF9ob3RrZXlfbnVtOwotCQkJCXRtcC0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGUgPQotCQkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlOwotCQkJCXRtcC0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QgPQotCQkJCSAgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kOwotCQkJCWtmcmVlKGtleSk7Ci0JCQl9IGVsc2UgewotCQkJCS8qCi0JCQkJICAgY2hhciAgcHJvY19uYW1lWzgwXTsKLQotCQkJCSAgIHNwcmludGYocHJvY19uYW1lLCAiJWQiLCB0bXAtPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSk7Ci0JCQkJICAgc3RyY2F0KHByb2NfbmFtZSwgdG1wLT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCk7Ci0JCQkJICAgcmVtb3ZlX3Byb2NfZW50cnkocHJvY19uYW1lLGhvdGtleV9wcm9jX2Rpcik7Ci0JCQkJICovCi0JCQkJZnJlZV9wb2xsX2hvdGtleV9idWZmZXIodG1wKTsKLQkJCQl0bXAtPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlID0KLQkJCQkgICAga2V5LT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZTsKLQkJCQl0bXAtPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kID0KLQkJCQkgICAga2V5LT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZDsKLQkJCQl0bXAtPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGUgPQotCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9oYW5kbGU7Ci0JCQkJdG1wLT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kID0KLQkJCQkgICAga2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kOwotCQkJCXRtcC0+cG9sbF9ob3RrZXkucG9sbF9yZXN1bHQgPQotCQkJCSAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0OwotCQkJCS8qCi0JCQkJICAgY3JlYXRlX3BvbGxpbmdfcHJvYyh0bXApOwotCQkJCSAqLwotCQkJCWtmcmVlKGtleSk7Ci0JCQl9Ci0JCQlyZXR1cm4gMDsKLQkJCWJyZWFrOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9ERVY7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVfaG90a2V5X2RldmljZSh1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQotewotCXN0cnVjdCBhY3BpX2RldmljZSAqZGV2OwotCi0KLQlpZiAoa2V5LT5saW5rLmhvdGtleV90eXBlID09IEFDUElfSE9US0VZX0VWRU5UKSB7Ci0JCWFjcGlfYnVzX2dldF9kZXZpY2Uoa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSwgJmRldik7Ci0JCWlmIChkZXYtPmhhbmRsZSkKLQkJCWFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKGRldi0+aGFuZGxlLAotCQkJCQkJICAgQUNQSV9ERVZJQ0VfTk9USUZZLAotCQkJCQkJICAgYWNwaV9ob3RrZXlfbm90aWZ5X2hhbmRsZXIpOwotCQlmcmVlX2hvdGtleV9idWZmZXIoa2V5KTsKLQl9IGVsc2UgewotCQljaGFyIHByb2NfbmFtZVs4MF07Ci0KLQkJc3ByaW50Zihwcm9jX25hbWUsICIlZCIsIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKTsKLQkJLyoKLQkJICAgc3RyY2F0KHByb2NfbmFtZSwga2V5LT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCk7Ci0JCSAqLwotCQlyZW1vdmVfcHJvY19lbnRyeShwcm9jX25hbWUsIGhvdGtleV9wcm9jX2Rpcik7Ci0JCWZyZWVfcG9sbF9ob3RrZXlfYnVmZmVyKGtleSk7Ci0JfQotCWtmcmVlKGtleSk7Ci0JcmV0dXJuOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2hvdGtleV9idWZmZXIodW5pb24gYWNwaV9ob3RrZXkgKmtleSkKLXsKLQkvKiBrZXkgd291bGQgbmV2ZXIgYmUgbnVsbCwgYWN0aW9uIG1ldGhvZCBjb3VsZCBiZSAqLwotCWtmcmVlKGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QpOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX3BvbGxfaG90a2V5X2J1ZmZlcih1bmlvbiBhY3BpX2hvdGtleSAqa2V5KQotewotCS8qIGtleSB3b3VsZCBuZXZlciBiZSBudWxsLCBvdGhlcnMgY291bGQgYmUqLwotCWtmcmVlKGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCk7Ci0Ja2ZyZWUoa2V5LT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCk7Ci0Ja2ZyZWUoa2V5LT5wb2xsX2hvdGtleS5wb2xsX3Jlc3VsdCk7Ci19Ci1zdGF0aWMgaW50Ci1pbml0X2hvdGtleV9kZXZpY2UodW5pb24gYWNwaV9ob3RrZXkgKmtleSwgY2hhciAqKmNvbmZpZ19lbnRyeSwKLQkJICAgaW50IHN0ZF9udW0sIGludCBleHRlcm5hbF9udW0pCi17Ci0JYWNwaV9oYW5kbGUgdG1wX2hhbmRsZTsKLQlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQotCWlmIChzdGRfbnVtIDwgMCB8fCBJU19QT0xMKHN0ZF9udW0pIHx8ICFrZXkpCi0JCWdvdG8gZG9fZmFpbDsKLQotCWlmICghY29uZmlnX2VudHJ5W2J1c19oYW5kbGVdIHx8ICFjb25maWdfZW50cnlbYWN0aW9uX2hhbmRsZV0KLQkJCXx8ICFjb25maWdfZW50cnlbbWV0aG9kXSkKLQkJZ290byBkb19mYWlsOwotCi0Ja2V5LT5saW5rLmhvdGtleV90eXBlID0gQUNQSV9IT1RLRVlfRVZFTlQ7Ci0Ja2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0gPSBzdGRfbnVtOwotCWtleS0+ZXZlbnRfaG90a2V5LmZsYWcgPSAwOwotCWtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QgPSBjb25maWdfZW50cnlbbWV0aG9kXTsKLQotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShOVUxMLCBjb25maWdfZW50cnlbYnVzX2hhbmRsZV0sCi0JCQkgICAmKGtleS0+ZXZlbnRfaG90a2V5LmJ1c19oYW5kbGUpKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCWdvdG8gZG9fZmFpbF96ZXJvOwotCWtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0gPSBleHRlcm5hbF9udW07Ci0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGNvbmZpZ19lbnRyeVthY3Rpb25faGFuZGxlXSwKLQkJCSAgICAmKGtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9oYW5kbGUpKTsKLQlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCi0JCWdvdG8gZG9fZmFpbF96ZXJvOwotCXN0YXR1cyA9IGFjcGlfZ2V0X2hhbmRsZShrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCSBjb25maWdfZW50cnlbbWV0aG9kXSwgJnRtcF9oYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJZ290byBkb19mYWlsX3plcm87Ci0JcmV0dXJuIEFFX09LOwotZG9fZmFpbF96ZXJvOgotCWtleS0+ZXZlbnRfaG90a2V5LmFjdGlvbl9tZXRob2QgPSBOVUxMOwotZG9fZmFpbDoKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludAotaW5pdF9wb2xsX2hvdGtleV9kZXZpY2UodW5pb24gYWNwaV9ob3RrZXkgKmtleSwgY2hhciAqKmNvbmZpZ19lbnRyeSwKLQkJCWludCBzdGRfbnVtKQotewotCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwotCWFjcGlfaGFuZGxlIHRtcF9oYW5kbGU7Ci0KLQlpZiAoc3RkX251bSA8IDAgfHwgSVNfRVZFTlQoc3RkX251bSkgfHwgIWtleSkKLQkJZ290byBkb19mYWlsOwotCWlmICghY29uZmlnX2VudHJ5W2J1c19oYW5kbGVdIHx8IWNvbmZpZ19lbnRyeVtidXNfbWV0aG9kXSB8fAotCQkhY29uZmlnX2VudHJ5W2FjdGlvbl9oYW5kbGVdIHx8ICFjb25maWdfZW50cnlbbWV0aG9kXSkKLQkJZ290byBkb19mYWlsOwotCi0Ja2V5LT5saW5rLmhvdGtleV90eXBlID0gQUNQSV9IT1RLRVlfUE9MTElORzsKLQlrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9IHN0ZF9udW07Ci0Ja2V5LT5wb2xsX2hvdGtleS5mbGFnID0gMDsKLQlrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kID0gY29uZmlnX2VudHJ5W2J1c19tZXRob2RdOwotCWtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX21ldGhvZCA9IGNvbmZpZ19lbnRyeVttZXRob2RdOwotCi0Jc3RhdHVzID0gYWNwaV9nZXRfaGFuZGxlKE5VTEwsIGNvbmZpZ19lbnRyeVtidXNfaGFuZGxlXSwKLQkJICAgICAgJihrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlKSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlnb3RvIGRvX2ZhaWxfemVybzsKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoa2V5LT5wb2xsX2hvdGtleS5wb2xsX2hhbmRsZSwKLQkJCQkgY29uZmlnX2VudHJ5W2J1c19tZXRob2RdLCAmdG1wX2hhbmRsZSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlnb3RvIGRvX2ZhaWxfemVybzsKLQlzdGF0dXMgPQotCSAgICBhY3BpX2dldF9oYW5kbGUoTlVMTCwgY29uZmlnX2VudHJ5W2FjdGlvbl9oYW5kbGVdLAotCQkJICAgICYoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlKSk7Ci0JaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKQotCQlnb3RvIGRvX2ZhaWxfemVybzsKLQlzdGF0dXMgPSBhY3BpX2dldF9oYW5kbGUoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCSBjb25maWdfZW50cnlbbWV0aG9kXSwgJnRtcF9oYW5kbGUpOwotCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKLQkJZ290byBkb19mYWlsX3plcm87Ci0Ja2V5LT5wb2xsX2hvdGtleS5wb2xsX3Jlc3VsdCA9Ci0JICAgIGttYWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfb2JqZWN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0KQotCQlnb3RvIGRvX2ZhaWxfemVybzsKLQlyZXR1cm4gQUVfT0s7Ci0KLWRvX2ZhaWxfemVybzoKLQlrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kID0gTlVMTDsKLQlrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QgPSBOVUxMOwotZG9fZmFpbDoKLQlyZXR1cm4gLUVOT0RFVjsKLX0KLQotc3RhdGljIGludCBob3RrZXlfb3Blbl9jb25maWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIChzaW5nbGVfb3BlbgotCQkgICAgIChmaWxlLCBob3RrZXlfY29uZmlnX3NlcV9zaG93LCBQREUoaW5vZGUpLT5kYXRhKSk7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X3BvbGxfb3Blbl9jb25maWcoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCi17Ci0JcmV0dXJuIChzaW5nbGVfb3BlbgotCQkgICAgIChmaWxlLCBob3RrZXlfcG9sbF9jb25maWdfc2VxX3Nob3csIFBERShpbm9kZSktPmRhdGEpKTsKLX0KLQotc3RhdGljIGludCBob3RrZXlfY29uZmlnX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKmhvdGtleV9saXN0ID0gJmdsb2JhbF9ob3RrZXlfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOwotCWNoYXIgYnVzX25hbWVbQUNQSV9QQVRITkFNRV9NQVhdID0geyAwIH07Ci0JY2hhciBhY3Rpb25fbmFtZVtBQ1BJX1BBVEhOQU1FX01BWF0gPSB7IDAgfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVzID0geyBBQ1BJX1BBVEhOQU1FX01BWCwgYnVzX25hbWUgfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYWN0ID0geyBBQ1BJX1BBVEhOQU1FX01BWCwgYWN0aW9uX25hbWUgfTsKLQotCi0JbGlzdF9mb3JfZWFjaChlbnRyaWVzLCBob3RrZXlfbGlzdC0+ZW50cmllcykgewotCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KLQkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7Ci0JCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfRVZFTlQpIHsKLQkJCWFjcGlfZ2V0X25hbWUoa2V5LT5ldmVudF9ob3RrZXkuYnVzX2hhbmRsZSwKLQkJCQkgICAgICBBQ1BJX05BTUVfVFlQRV9NQVgsICZidXMpOwotCQkJYWNwaV9nZXRfbmFtZShrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCSAgICAgIEFDUElfTkFNRV9UWVBFX01BWCwgJmFjdCk7Ci0JCQlzZXFfcHJpbnRmKHNlcSwgIiVzOiVzOiVzOiVkOiVkXG4iLCBidXNfbmFtZSwKLQkJCQkgICBhY3Rpb25fbmFtZSwKLQkJCQkgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kLAotCQkJCSAgIGtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtLAotCQkJCSAgIGtleS0+ZXZlbnRfaG90a2V5LmV4dGVybmFsX2hvdGtleV9udW0pOwotCQl9Ci0JfQotCXNlcV9wdXRzKHNlcSwgIlxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgaG90a2V5X3BvbGxfY29uZmlnX3NlcV9zaG93KHN0cnVjdCBzZXFfZmlsZSAqc2VxLCB2b2lkICpvZmZzZXQpCi17Ci0Jc3RydWN0IGFjcGlfaG90a2V5X2xpc3QgKmhvdGtleV9saXN0ID0gJmdsb2JhbF9ob3RrZXlfbGlzdDsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOwotCWNoYXIgYnVzX25hbWVbQUNQSV9QQVRITkFNRV9NQVhdID0geyAwIH07Ci0JY2hhciBhY3Rpb25fbmFtZVtBQ1BJX1BBVEhOQU1FX01BWF0gPSB7IDAgfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYnVzID0geyBBQ1BJX1BBVEhOQU1FX01BWCwgYnVzX25hbWUgfTsKLQlzdHJ1Y3QgYWNwaV9idWZmZXIgYWN0ID0geyBBQ1BJX1BBVEhOQU1FX01BWCwgYWN0aW9uX25hbWUgfTsKLQotCi0JbGlzdF9mb3JfZWFjaChlbnRyaWVzLCBob3RrZXlfbGlzdC0+ZW50cmllcykgewotCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KLQkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7Ci0JCWlmIChrZXktPmxpbmsuaG90a2V5X3R5cGUgPT0gQUNQSV9IT1RLRVlfUE9MTElORykgewotCQkJYWNwaV9nZXRfbmFtZShrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlLAotCQkJCSAgICAgIEFDUElfTkFNRV9UWVBFX01BWCwgJmJ1cyk7Ci0JCQlhY3BpX2dldF9uYW1lKGtleS0+cG9sbF9ob3RrZXkuYWN0aW9uX2hhbmRsZSwKLQkJCQkgICAgICBBQ1BJX05BTUVfVFlQRV9NQVgsICZhY3QpOwotCQkJc2VxX3ByaW50ZihzZXEsICIlczolczolczolczolZFxuIiwgYnVzX25hbWUsCi0JCQkJICAga2V5LT5wb2xsX2hvdGtleS5wb2xsX21ldGhvZCwKLQkJCQkgICBhY3Rpb25fbmFtZSwKLQkJCQkgICBrZXktPnBvbGxfaG90a2V5LmFjdGlvbl9tZXRob2QsCi0JCQkJICAga2V5LT5saW5rLmhvdGtleV9zdGFuZGFyZF9udW0pOwotCQl9Ci0JfQotCXNlcV9wdXRzKHNlcSwgIlxuIik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQKLWdldF9wYXJtcyhjaGFyICpjb25maWdfcmVjb3JkLCBpbnQgKmNtZCwgY2hhciAqKmNvbmZpZ19lbnRyeSwKLQkgICAgICAgaW50ICppbnRlcm5hbF9ldmVudF9udW0sIGludCAqZXh0ZXJuYWxfZXZlbnRfbnVtKQotewotLyogdGhlIGZvcm1hdCBvZiAqY29uZmlnX3JlY29yZCA9Ci0gKiAiMTpcZCs6KiIgOiAiY21kOmludGVybmFsX2V2ZW50X251bSIKLSAqICJcZCs6XHcrOlx3Kzpcdys6XHcrOlxkKzpcZCsiIDoKLSAqICJjbWQ6YnVzX2hhbmRsZTpidXNfbWV0aG9kOmFjdGlvbl9oYW5kbGU6bWV0aG9kOmludGVybmFsX2V2ZW50X251bTpleHRlcm5hbF9ldmVudF9udW0iCi0gKi8KLQljaGFyICp0bXAsICp0bXAxLCBjb3VudDsKLQlpbnQgaTsKLQotCXNzY2FuZihjb25maWdfcmVjb3JkLCAiJWQiLCBjbWQpOwotCWlmICgqY21kID09IDEpIHsKLQkJaWYgKHNzY2FuZihjb25maWdfcmVjb3JkLCAiJWQ6JWQiLCBjbWQsIGludGVybmFsX2V2ZW50X251bSkgIT0KLQkJICAgIDIpCi0JCQlnb3RvIGRvX2ZhaWw7Ci0JCWVsc2UKLQkJCXJldHVybiAoNik7Ci0JfQotCXRtcCA9IHN0cmNocihjb25maWdfcmVjb3JkLCAnOicpOwotCWlmICghdG1wKQotCQlnb3RvIGRvX2ZhaWw7Ci0JdG1wKys7Ci0JZm9yIChpID0gMDsgaSA8IExBU1RfQ09ORl9FTlRSWTsgaSsrKSB7Ci0JCXRtcDEgPSBzdHJjaHIodG1wLCAnOicpOwotCQlpZiAoIXRtcDEpIHsKLQkJCWdvdG8gZG9fZmFpbDsKLQkJfQotCQljb3VudCA9IHRtcDEgLSB0bXA7Ci0JCWNvbmZpZ19lbnRyeVtpXSA9IGt6YWxsb2MoY291bnQgKyAxLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFjb25maWdfZW50cnlbaV0pCi0JCQlnb3RvIGhhbmRsZV9mYWlsdXJlOwotCQlzdHJuY3B5KGNvbmZpZ19lbnRyeVtpXSwgdG1wLCBjb3VudCk7Ci0JCXRtcCA9IHRtcDEgKyAxOwotCX0KLQlpZiAoc3NjYW5mKHRtcCwgIiVkOiVkIiwgaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW0pIDw9IDApCi0JCWdvdG8gaGFuZGxlX2ZhaWx1cmU7Ci0JaWYgKCFJU19PVEhFUlMoKmludGVybmFsX2V2ZW50X251bSkpIHsKLQkJcmV0dXJuIDY7Ci0JfQotaGFuZGxlX2ZhaWx1cmU6Ci0Jd2hpbGUgKGktLSA+IDApCi0JCWtmcmVlKGNvbmZpZ19lbnRyeVtpXSk7Ci1kb19mYWlsOgotCXJldHVybiAtMTsKLX0KLQotLyogIGNvdW50IGlzIGxlbmd0aCBmb3Igb25lIGlucHV0IHJlY29yZCAqLwotc3RhdGljIHNzaXplX3QgaG90a2V5X3dyaXRlX2NvbmZpZyhzdHJ1Y3QgZmlsZSAqZmlsZSwKLQkJCQkgICBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKLQkJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqIGRhdGEpCi17Ci0JY2hhciAqY29uZmlnX3JlY29yZCA9IE5VTEw7Ci0JY2hhciAqY29uZmlnX2VudHJ5W0xBU1RfQ09ORl9FTlRSWV07Ci0JaW50IGNtZCwgaW50ZXJuYWxfZXZlbnRfbnVtLCBleHRlcm5hbF9ldmVudF9udW07Ci0JaW50IHJldCA9IDA7Ci0JdW5pb24gYWNwaV9ob3RrZXkgKmtleSA9IGt6YWxsb2Moc2l6ZW9mKHVuaW9uIGFjcGlfaG90a2V5KSwgR0ZQX0tFUk5FTCk7Ci0KLQlpZiAoIWtleSkKLQkJcmV0dXJuIC1FTk9NRU07Ci0KLQljb25maWdfcmVjb3JkID0ga3phbGxvYyhjb3VudCArIDEsIEdGUF9LRVJORUwpOwotCWlmICghY29uZmlnX3JlY29yZCkgewotCQlrZnJlZShrZXkpOwotCQlyZXR1cm4gLUVOT01FTTsKLQl9Ci0KLQlpZiAoY29weV9mcm9tX3VzZXIoY29uZmlnX3JlY29yZCwgYnVmZmVyLCBjb3VudCkpIHsKLQkJa2ZyZWUoY29uZmlnX3JlY29yZCk7Ci0JCWtmcmVlKGtleSk7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgZGF0YVxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXQgPSBnZXRfcGFybXMoY29uZmlnX3JlY29yZCwgJmNtZCwgY29uZmlnX2VudHJ5LAotCQkgICAgICAgJmludGVybmFsX2V2ZW50X251bSwgJmV4dGVybmFsX2V2ZW50X251bSk7Ci0Ja2ZyZWUoY29uZmlnX3JlY29yZCk7Ci0JaWYgKHJldCAhPSA2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgZGF0YSBmb3JtYXQgcmV0PSVkXG4iLCByZXQpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9Ci0KLQlpZiAoY21kID09IDEpIHsKLQkJdW5pb24gYWNwaV9ob3RrZXkgKnRtcCA9IE5VTEw7Ci0JCXRtcCA9IGdldF9ob3RrZXlfYnlfZXZlbnQoJmdsb2JhbF9ob3RrZXlfbGlzdCwKLQkJCQkJICBpbnRlcm5hbF9ldmVudF9udW0pOwotCQlpZiAoIXRtcCkKLQkJCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQga2V5XG4iKTsKLQkJZWxzZQotCQkJbWVtY3B5KGtleSwgdG1wLCBzaXplb2YodW5pb24gYWNwaV9ob3RrZXkpKTsKLQkJZ290byBjb250X2NtZDsKLQl9Ci0JaWYgKElTX0VWRU5UKGludGVybmFsX2V2ZW50X251bSkpIHsKLQkJaWYgKGluaXRfaG90a2V5X2RldmljZShrZXksIGNvbmZpZ19lbnRyeSwKLQkJCWludGVybmFsX2V2ZW50X251bSwgZXh0ZXJuYWxfZXZlbnRfbnVtKSkKLQkJCWdvdG8gaW5pdF9ob3RrZXlfZmFpbDsKLQl9IGVsc2UgewotCQlpZiAoaW5pdF9wb2xsX2hvdGtleV9kZXZpY2Uoa2V5LCBjb25maWdfZW50cnksCi0JCQkgICAgICAgaW50ZXJuYWxfZXZlbnRfbnVtKSkKLQkJCWdvdG8gaW5pdF9wb2xsX2hvdGtleV9mYWlsOwotCX0KLWNvbnRfY21kOgotCXN3aXRjaCAoY21kKSB7Ci0JY2FzZSAwOgotCQlpZiAoZ2V0X2hvdGtleV9ieV9ldmVudCgmZ2xvYmFsX2hvdGtleV9saXN0LAotCQkJCWtleS0+bGluay5ob3RrZXlfc3RhbmRhcmRfbnVtKSkKLQkJCWdvdG8gZmFpbF9vdXQ7Ci0JCWVsc2UKLQkJCWhvdGtleV9hZGQoa2V5KTsKLQkJYnJlYWs7Ci0JY2FzZSAxOgotCQlob3RrZXlfcmVtb3ZlKGtleSk7Ci0JCWJyZWFrOwotCWNhc2UgMjoKLQkJLyoga2V5IGlzIGtmcmVlKCllZCBpZiBtYXRjaGVkKi8KLQkJaWYgKGhvdGtleV91cGRhdGUoa2V5KSkKLQkJCWdvdG8gZmFpbF9vdXQ7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWdvdG8gZmFpbF9vdXQ7Ci0JCWJyZWFrOwotCX0KLQlyZXR1cm4gY291bnQ7Ci0KLWluaXRfcG9sbF9ob3RrZXlfZmFpbDoJCS8qIGZhaWxlZCBpbml0X3BvbGxfaG90a2V5X2RldmljZSAqLwotCWtmcmVlKGNvbmZpZ19lbnRyeVtidXNfbWV0aG9kXSk7Ci0JY29uZmlnX2VudHJ5W2J1c19tZXRob2RdID0gTlVMTDsKLWluaXRfaG90a2V5X2ZhaWw6CQkvKiBmYWlsZWQgaW5pdF9ob3RrZXlfZGV2aWNlICovCi0Ja2ZyZWUoY29uZmlnX2VudHJ5W21ldGhvZF0pOwotZmFpbF9vdXQ6Ci0Ja2ZyZWUoY29uZmlnX2VudHJ5W2J1c19oYW5kbGVdKTsKLQlrZnJlZShjb25maWdfZW50cnlbYWN0aW9uX2hhbmRsZV0pOwotCS8qIE5vIGRvdWJsZSBmcmVlIHNpbmNlIGVsZW1lbnRzID1OVUxMIGZvciBlcnJvciBjYXNlcyAqLwotCWlmIChJU19FVkVOVChpbnRlcm5hbF9ldmVudF9udW0pKSB7Ci0JCWlmIChjb25maWdfZW50cnlbYnVzX21ldGhvZF0pCi0JCQlrZnJlZShjb25maWdfZW50cnlbYnVzX21ldGhvZF0pOwotCQlmcmVlX2hvdGtleV9idWZmZXIoa2V5KTsJLyogZnJlZXMgW21ldGhvZF0gKi8KLQl9IGVsc2UKLQkJZnJlZV9wb2xsX2hvdGtleV9idWZmZXIoa2V5KTsgIC8qIGZyZWVzIFtidXNfbWV0aG9kXStbbWV0aG9kXSAqLwotCWtmcmVlKGtleSk7Ci0JcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiaW52YWxpZCBrZXlcbiIpOwotCXJldHVybiAtRUlOVkFMOwotfQotCi0vKgotICogVGhpcyBmdW5jdGlvbiBldmFsdWF0ZXMgYW4gQUNQSSBtZXRob2QsIGdpdmVuIGFuIGludCBhcyBwYXJhbWV0ZXIsIHRoZQotICogbWV0aG9kIGlzIHNlYXJjaGVkIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhlIGhhbmRsZSwgY2FuIGJlIE5VTEwuIFRoZSBvdXRwdXQKLSAqIG9mIHRoZSBtZXRob2QgaXMgd3JpdHRlbiBpcyBvdXRwdXQsIHdoaWNoIGNhbiBhbHNvIGJlIE5VTEwKLSAqCi0gKiByZXR1cm5zIDEgaWYgd3JpdGUgaXMgc3VjY2Vzc2Z1bCwgMCBlbHNlLgotICovCi1zdGF0aWMgaW50IHdyaXRlX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLCBpbnQgdmFsLAotCQkJICBzdHJ1Y3QgYWNwaV9idWZmZXIgKm91dHB1dCkKLXsKLQlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CS8qIGxpc3Qgb2YgaW5wdXQgcGFyYW1ldGVycyAoYW4gaW50IGhlcmUpICovCi0JdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOwkvKiB0aGUgb25seSBwYXJhbSB3ZSB1c2UgKi8KLQlhY3BpX3N0YXR1cyBzdGF0dXM7Ci0KLQlwYXJhbXMuY291bnQgPSAxOwotCXBhcmFtcy5wb2ludGVyID0gJmluX29iajsKLQlpbl9vYmoudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwotCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsOwotCi0Jc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCAoY2hhciAqKW1ldGhvZCwgJnBhcmFtcywgb3V0cHV0KTsKLQotCXJldHVybiAoc3RhdHVzID09IEFFX09LKTsKLX0KLQotc3RhdGljIGludCByZWFkX2FjcGlfaW50KGFjcGlfaGFuZGxlIGhhbmRsZSwgY29uc3QgY2hhciAqbWV0aG9kLAotCQkJIHVuaW9uIGFjcGlfb2JqZWN0ICp2YWwpCi17Ci0Jc3RydWN0IGFjcGlfYnVmZmVyIG91dHB1dDsKLQl1bmlvbiBhY3BpX29iamVjdCBvdXRfb2JqOwotCWFjcGlfc3RhdHVzIHN0YXR1czsKLQotCW91dHB1dC5sZW5ndGggPSBzaXplb2Yob3V0X29iaik7Ci0Jb3V0cHV0LnBvaW50ZXIgPSAmb3V0X29iajsKLQotCXN0YXR1cyA9IGFjcGlfZXZhbHVhdGVfb2JqZWN0KGhhbmRsZSwgKGNoYXIgKiltZXRob2QsIE5VTEwsICZvdXRwdXQpOwotCWlmICh2YWwpIHsKLQkJdmFsLT5pbnRlZ2VyLnZhbHVlID0gb3V0X29iai5pbnRlZ2VyLnZhbHVlOwotCQl2YWwtPnR5cGUgPSBvdXRfb2JqLnR5cGU7Ci0JfSBlbHNlCi0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIm51bGwgdmFsIHBvaW50ZXJcbiIpOwotCXJldHVybiAoKHN0YXR1cyA9PSBBRV9PSykKLQkJICAgICAmJiAob3V0X29iai50eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSk7Ci19Ci0KLXN0YXRpYyB1bmlvbiBhY3BpX2hvdGtleSAqZ2V0X2hvdGtleV9ieV9ldmVudChzdHJ1Y3QKLQkJCQkJICAgICAgYWNwaV9ob3RrZXlfbGlzdAotCQkJCQkgICAgICAqaG90a2V5X2xpc3QsIGludCBldmVudCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzOwotCi0JbGlzdF9mb3JfZWFjaChlbnRyaWVzLCBob3RrZXlfbGlzdC0+ZW50cmllcykgewotCQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5ID0KLQkJICAgIGNvbnRhaW5lcl9vZihlbnRyaWVzLCB1bmlvbiBhY3BpX2hvdGtleSwgZW50cmllcyk7Ci0JCWlmIChrZXktPmxpbmsuaG90a2V5X3N0YW5kYXJkX251bSA9PSBldmVudCkgewotCQkJcmV0dXJuIChrZXkpOwotCQl9Ci0JfQotCXJldHVybiAoTlVMTCk7Ci19Ci0KLS8qCi0gKiB1c2VyIGNhbGwgQU1MIG1ldGhvZCBpbnRlcmZhY2U6Ci0gKiBDYWxsIGNvbnZlbnRpb246Ci0gKiBlY2hvICJldmVudF9udW06IGFyZyB0eXBlIDogdmFsdWUiCi0gKiBleGFtcGxlOiBlY2hvICIxOjE6MzAiID4gL3Byb2MvYWNwaS9hY3Rpb24KLSAqIEp1c3Qgc3VwcG9ydCAxIGludGVnZXIgYXJnIHBhc3NpbmcgdG8gQU1MIG1ldGhvZAotICovCi0KLXN0YXRpYyBzc2l6ZV90IGhvdGtleV9leGVjdXRlX2FtbF9tZXRob2Qoc3RydWN0IGZpbGUgKmZpbGUsCi0JCQkJCSBjb25zdCBjaGFyIF9fdXNlciAqIGJ1ZmZlciwKLQkJCQkJIHNpemVfdCBjb3VudCwgbG9mZl90ICogZGF0YSkKLXsKLQlzdHJ1Y3QgYWNwaV9ob3RrZXlfbGlzdCAqaG90a2V5X2xpc3QgPSAmZ2xvYmFsX2hvdGtleV9saXN0OwotCWNoYXIgKmFyZzsKLQlpbnQgZXZlbnQsIG1ldGhvZF90eXBlLCB0eXBlLCB2YWx1ZTsKLQl1bmlvbiBhY3BpX2hvdGtleSAqa2V5OwotCi0KLQlhcmcgPSBremFsbG9jKGNvdW50ICsgMSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFhcmcpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JaWYgKGNvcHlfZnJvbV91c2VyKGFyZywgYnVmZmVyLCBjb3VudCkpIHsKLQkJa2ZyZWUoYXJnKTsKLQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiSW52YWxpZCBhcmd1bWVudCAyXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JaWYgKHNzY2FuZihhcmcsICIlZDolZDolZDolZCIsICZldmVudCwgJm1ldGhvZF90eXBlLCAmdHlwZSwgJnZhbHVlKSAhPQotCSAgICA0KSB7Ci0JCWtmcmVlKGFyZyk7Ci0JCXByaW50ayhLRVJOX0VSUiBQUkVGSVggIkludmFsaWQgYXJndW1lbnQgM1xuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlrZnJlZShhcmcpOwotCWlmICh0eXBlID09IEFDUElfVFlQRV9JTlRFR0VSKSB7Ci0JCWtleSA9IGdldF9ob3RrZXlfYnlfZXZlbnQoaG90a2V5X2xpc3QsIGV2ZW50KTsKLQkJaWYgKCFrZXkpCi0JCQlnb3RvIGRvX2ZhaWw7Ci0JCWlmIChJU19FVkVOVChldmVudCkpCi0JCQl3cml0ZV9hY3BpX2ludChrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCSAgICAgICBrZXktPmV2ZW50X2hvdGtleS5hY3Rpb25fbWV0aG9kLCB2YWx1ZSwKLQkJCQkgICAgICAgTlVMTCk7Ci0JCWVsc2UgaWYgKElTX1BPTEwoZXZlbnQpKSB7Ci0JCQlpZiAobWV0aG9kX3R5cGUgPT0gUE9MTF9NRVRIT0QpCi0JCQkJcmVhZF9hY3BpX2ludChrZXktPnBvbGxfaG90a2V5LnBvbGxfaGFuZGxlLAotCQkJCQkgICAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfbWV0aG9kLAotCQkJCQkgICAgICBrZXktPnBvbGxfaG90a2V5LnBvbGxfcmVzdWx0KTsKLQkJCWVsc2UgaWYgKG1ldGhvZF90eXBlID09IEFDVElPTl9NRVRIT0QpCi0JCQkJd3JpdGVfYWNwaV9pbnQoa2V5LT5wb2xsX2hvdGtleS5hY3Rpb25faGFuZGxlLAotCQkJCQkgICAgICAga2V5LT5wb2xsX2hvdGtleS5hY3Rpb25fbWV0aG9kLAotCQkJCQkgICAgICAgdmFsdWUsIE5VTEwpOwotCQkJZWxzZQotCQkJCWdvdG8gZG9fZmFpbDsKLQotCQl9Ci0JfSBlbHNlIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTm90IHN1cHBvcnRlZFxuIik7Ci0JCXJldHVybiAtRUlOVkFMOwotCX0KLQlyZXR1cm4gY291bnQ7Ci0gICAgICBkb19mYWlsOgotCXJldHVybiAtRUlOVkFMOwotCi19Ci0KLXN0YXRpYyBpbnQgX19pbml0IGhvdGtleV9pbml0KHZvaWQpCi17Ci0JaW50IHJlc3VsdDsKLQltb2RlX3QgbW9kZSA9IFNfSUZSRUcgfCBTX0lSVUdPIHwgU19JV1VHTzsKLQotCi0JaWYgKGFjcGlfZGlzYWJsZWQpCi0JCXJldHVybiAtRU5PREVWOwotCi0JaWYgKGFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpIHsKLQkJcHJpbnRrKCJVc2luZyBzcGVjaWZpYyBob3RrZXkgZHJpdmVyXG4iKTsKLQkJcmV0dXJuIC1FTk9ERVY7Ci0JfQotCi0JaG90a2V5X3Byb2NfZGlyID0gcHJvY19ta2RpcihIT1RLRVlfUFJPQywgYWNwaV9yb290X2Rpcik7Ci0JaWYgKCFob3RrZXlfcHJvY19kaXIpIHsKLQkJcmV0dXJuICgtRU5PREVWKTsKLQl9Ci0JaG90a2V5X3Byb2NfZGlyLT5vd25lciA9IFRISVNfTU9EVUxFOwotCi0JaG90a2V5X2NvbmZpZyA9Ci0JICAgIGNyZWF0ZV9wcm9jX2VudHJ5KEhPVEtFWV9FVl9DT05GSUcsIG1vZGUsIGhvdGtleV9wcm9jX2Rpcik7Ci0JaWYgKCFob3RrZXlfY29uZmlnKSB7Ci0JCWdvdG8gZG9fZmFpbDE7Ci0JfSBlbHNlIHsKLQkJaG90a2V5X2NvbmZpZy0+cHJvY19mb3BzID0gJmhvdGtleV9jb25maWdfZm9wczsKLQkJaG90a2V5X2NvbmZpZy0+ZGF0YSA9ICZnbG9iYWxfaG90a2V5X2xpc3Q7Ci0JCWhvdGtleV9jb25maWctPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCWhvdGtleV9jb25maWctPnVpZCA9IDA7Ci0JCWhvdGtleV9jb25maWctPmdpZCA9IDA7Ci0JfQotCi0JaG90a2V5X3BvbGxfY29uZmlnID0KLQkgICAgY3JlYXRlX3Byb2NfZW50cnkoSE9US0VZX1BMX0NPTkZJRywgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKLQlpZiAoIWhvdGtleV9wb2xsX2NvbmZpZykgewotCQlnb3RvIGRvX2ZhaWwyOwotCX0gZWxzZSB7Ci0JCWhvdGtleV9wb2xsX2NvbmZpZy0+cHJvY19mb3BzID0gJmhvdGtleV9wb2xsX2NvbmZpZ19mb3BzOwotCQlob3RrZXlfcG9sbF9jb25maWctPmRhdGEgPSAmZ2xvYmFsX2hvdGtleV9saXN0OwotCQlob3RrZXlfcG9sbF9jb25maWctPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCWhvdGtleV9wb2xsX2NvbmZpZy0+dWlkID0gMDsKLQkJaG90a2V5X3BvbGxfY29uZmlnLT5naWQgPSAwOwotCX0KLQotCWhvdGtleV9hY3Rpb24gPSBjcmVhdGVfcHJvY19lbnRyeShIT1RLRVlfQUNUSU9OLCBtb2RlLCBob3RrZXlfcHJvY19kaXIpOwotCWlmICghaG90a2V5X2FjdGlvbikgewotCQlnb3RvIGRvX2ZhaWwzOwotCX0gZWxzZSB7Ci0JCWhvdGtleV9hY3Rpb24tPnByb2NfZm9wcyA9ICZob3RrZXlfYWN0aW9uX2ZvcHM7Ci0JCWhvdGtleV9hY3Rpb24tPm93bmVyID0gVEhJU19NT0RVTEU7Ci0JCWhvdGtleV9hY3Rpb24tPnVpZCA9IDA7Ci0JCWhvdGtleV9hY3Rpb24tPmdpZCA9IDA7Ci0JfQotCi0JaG90a2V5X2luZm8gPSBjcmVhdGVfcHJvY19lbnRyeShIT1RLRVlfSU5GTywgbW9kZSwgaG90a2V5X3Byb2NfZGlyKTsKLQlpZiAoIWhvdGtleV9pbmZvKSB7Ci0JCWdvdG8gZG9fZmFpbDQ7Ci0JfSBlbHNlIHsKLQkJaG90a2V5X2luZm8tPnByb2NfZm9wcyA9ICZob3RrZXlfaW5mb19mb3BzOwotCQlob3RrZXlfaW5mby0+b3duZXIgPSBUSElTX01PRFVMRTsKLQkJaG90a2V5X2luZm8tPnVpZCA9IDA7Ci0JCWhvdGtleV9pbmZvLT5naWQgPSAwOwotCX0KLQotCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmaG90a2V5X2RyaXZlcik7Ci0JaWYgKHJlc3VsdCA8IDApCi0JCWdvdG8gZG9fZmFpbDU7Ci0JZ2xvYmFsX2hvdGtleV9saXN0LmNvdW50ID0gMDsKLQlnbG9iYWxfaG90a2V5X2xpc3QuZW50cmllcyA9ICZob3RrZXlfZW50cmllczsKLQotCUlOSVRfTElTVF9IRUFEKCZob3RrZXlfZW50cmllcyk7Ci0KLQlyZXR1cm4gKDApOwotCi0gICAgICBkb19mYWlsNToKLQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfSU5GTywgaG90a2V5X3Byb2NfZGlyKTsKLSAgICAgIGRvX2ZhaWw0OgotCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9BQ1RJT04sIGhvdGtleV9wcm9jX2Rpcik7Ci0gICAgICBkb19mYWlsMzoKLQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfUExfQ09ORklHLCBob3RrZXlfcHJvY19kaXIpOwotICAgICAgZG9fZmFpbDI6Ci0JcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX0VWX0NPTkZJRywgaG90a2V5X3Byb2NfZGlyKTsKLSAgICAgIGRvX2ZhaWwxOgotCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QUk9DLCBhY3BpX3Jvb3RfZGlyKTsKLQlyZXR1cm4gKC1FTk9ERVYpOwotfQotCi1zdGF0aWMgdm9pZCBfX2V4aXQgaG90a2V5X2V4aXQodm9pZCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyaWVzLCAqbmV4dDsKLQotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGVudHJpZXMsIG5leHQsIGdsb2JhbF9ob3RrZXlfbGlzdC5lbnRyaWVzKSB7Ci0JCXVuaW9uIGFjcGlfaG90a2V5ICprZXkgPQotCQkgICAgY29udGFpbmVyX29mKGVudHJpZXMsIHVuaW9uIGFjcGlfaG90a2V5LCBlbnRyaWVzKTsKLQotCQlhY3BpX29zX3dhaXRfZXZlbnRzX2NvbXBsZXRlKE5VTEwpOwotCQlsaXN0X2RlbCgma2V5LT5saW5rLmVudHJpZXMpOwotCQlnbG9iYWxfaG90a2V5X2xpc3QuY291bnQtLTsKLQkJZnJlZV9ob3RrZXlfZGV2aWNlKGtleSk7Ci0JfQotCWFjcGlfYnVzX3VucmVnaXN0ZXJfZHJpdmVyKCZob3RrZXlfZHJpdmVyKTsKLQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfRVZfQ09ORklHLCBob3RrZXlfcHJvY19kaXIpOwotCXJlbW92ZV9wcm9jX2VudHJ5KEhPVEtFWV9QTF9DT05GSUcsIGhvdGtleV9wcm9jX2Rpcik7Ci0JcmVtb3ZlX3Byb2NfZW50cnkoSE9US0VZX0FDVElPTiwgaG90a2V5X3Byb2NfZGlyKTsKLQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfSU5GTywgaG90a2V5X3Byb2NfZGlyKTsKLQlyZW1vdmVfcHJvY19lbnRyeShIT1RLRVlfUFJPQywgYWNwaV9yb290X2Rpcik7Ci0JcmV0dXJuOwotfQotCi1tb2R1bGVfaW5pdChob3RrZXlfaW5pdCk7Ci1tb2R1bGVfZXhpdChob3RrZXlfZXhpdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvaTJjX2VjLmMgYi9kcml2ZXJzL2FjcGkvaTJjX2VjLmMKaW5kZXggNzZlYzhiNi4uYWNhYjRhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL2kyY19lYy5jCisrKyBiL2RyaXZlcnMvYWNwaS9pMmNfZWMuYwpAQCAtMjcsMTggKzI3LDE3IEBACiAjZGVmaW5lIEFDUElfRUNfSENfQ09NUE9ORU5UCTB4MDAwODAwMDAKICNkZWZpbmUgQUNQSV9FQ19IQ19DTEFTUwkiZWNfaGNfc21idXMiCiAjZGVmaW5lIEFDUElfRUNfSENfSElECQkiQUNQSTAwMDEiCi0jZGVmaW5lIEFDUElfRUNfSENfRFJJVkVSX05BTUUJIkFDUEkgRUMgSEMgc21idXMgZHJpdmVyIgogI2RlZmluZSBBQ1BJX0VDX0hDX0RFVklDRV9OQU1FCSJFQyBIQyBzbWJ1cyIKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX0VDX0hDX0NPTVBPTkVOVAogCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3NtYnVzIikKK0FDUElfTU9EVUxFX05BTUUoImkyY19lYyIpOwogCiBzdGF0aWMgaW50IGFjcGlfZWNfaGNfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIHN0YXRpYyBpbnQgYWNwaV9lY19oY19yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX2VjX2hjX2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfRUNfSENfRFJJVkVSX05BTUUsCisJLm5hbWUgPSAiaTJjX2VjIiwKIAkuY2xhc3MgPSBBQ1BJX0VDX0hDX0NMQVNTLAogCS5pZHMgPSBBQ1BJX0VDX0hDX0hJRCwKIAkub3BzID0gewpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2libV9hY3BpLmMgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwppbmRleCBjNjE0NGNhLi4xYTBlZDNkIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvaWJtX2FjcGkuYwpAQCAtNDk2LDYgKzQ5NiwxMCBAQAogCXByaW50ayhJQk1fSU5GTyAiJXMgdiVzXG4iLCBJQk1fREVTQywgSUJNX1ZFUlNJT04pOwogCXByaW50ayhJQk1fSU5GTyAiJXNcbiIsIElCTV9VUkwpOwogCisJaWYgKGlibV90aGlua3BhZF9lY19mb3VuZCkKKwkJcHJpbnRrKElCTV9JTkZPICJUaGlua1BhZCBFQyBmaXJtd2FyZSAlc1xuIiwKKwkJICAgICAgIGlibV90aGlua3BhZF9lY19mb3VuZCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtMjYxNyw3ICsyNjIxLDcgQEAKIAlpYm1faGFuZGxlX2luaXQoI29iamVjdCwgJm9iamVjdCMjX2hhbmRsZSwgKm9iamVjdCMjX3BhcmVudCwJXAogCQlvYmplY3QjI19wYXRocywgQVJSQVlfU0laRShvYmplY3QjI19wYXRocyksICZvYmplY3QjI19wYXRoKQogCi1zdGF0aWMgaW50IHNldF9pYm1fcGFyYW0oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKK3N0YXRpYyBpbnQgX19pbml0IHNldF9pYm1fcGFyYW0oY29uc3QgY2hhciAqdmFsLCBzdHJ1Y3Qga2VybmVsX3BhcmFtICprcCkKIHsKIAl1bnNpZ25lZCBpbnQgaTsKIApAQCAtMjY1OSw3ICsyNjYzLDggQEAKIAlmb3IgKGkgPSBBUlJBWV9TSVpFKGlibXMpIC0gMTsgaSA+PSAwOyBpLS0pCiAJCWlibV9leGl0KCZpYm1zW2ldKTsKIAotCXJlbW92ZV9wcm9jX2VudHJ5KElCTV9ESVIsIGFjcGlfcm9vdF9kaXIpOworCWlmIChwcm9jX2RpcikKKwkJcmVtb3ZlX3Byb2NfZW50cnkoSUJNX0RJUiwgYWNwaV9yb290X2Rpcik7CiAKIAlpZiAoaWJtX3RoaW5rcGFkX2VjX2ZvdW5kKQogCQlrZnJlZShpYm1fdGhpbmtwYWRfZWNfZm91bmQpOwpAQCAtMjY5NiwxMSArMjcwMSw2IEBACiAJaWYgKGFjcGlfZGlzYWJsZWQpCiAJCXJldHVybiAtRU5PREVWOwogCi0JaWYgKCFhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkKSB7Ci0JCXByaW50ayhJQk1fRVJSICJ1c2luZyBnZW5lcmljIGhvdGtleSBkcml2ZXJcbiIpOwotCQlyZXR1cm4gLUVOT0RFVjsKLQl9Ci0KIAkvKiBlYyBpcyByZXF1aXJlZCBiZWNhdXNlIG1hbnkgb3RoZXIgaGFuZGxlcyBhcmUgcmVsYXRpdmUgdG8gaXQgKi8KIAlJQk1fSEFORExFX0lOSVQoZWMpOwogCWlmICghZWNfaGFuZGxlKSB7CkBAIC0yNzEwLDkgKzI3MTAsNiBAQAogCiAJLyogTW9kZWxzIHdpdGggbmV3ZXIgZmlybXdhcmUgcmVwb3J0IHRoZSBFQyBpbiBETUkgKi8KIAlpYm1fdGhpbmtwYWRfZWNfZm91bmQgPSBjaGVja19kbWlfZm9yX2VjKCk7Ci0JaWYgKGlibV90aGlua3BhZF9lY19mb3VuZCkKLQkJcHJpbnRrKElCTV9JTkZPICJUaGlua1BhZCBFQyBmaXJtd2FyZSAlc1xuIiwKLQkJICAgICAgIGlibV90aGlua3BhZF9lY19mb3VuZCk7CiAKIAkvKiB0aGVzZSBoYW5kbGVzIGFyZSBub3QgcmVxdWlyZWQgKi8KIAlJQk1fSEFORExFX0lOSVQodmlkKTsKQEAgLTI3NDIsNiArMjczOSw3IEBACiAJcHJvY19kaXIgPSBwcm9jX21rZGlyKElCTV9ESVIsIGFjcGlfcm9vdF9kaXIpOwogCWlmICghcHJvY19kaXIpIHsKIAkJcHJpbnRrKElCTV9FUlIgInVuYWJsZSB0byBjcmVhdGUgcHJvYyBkaXIgJXMiLCBJQk1fRElSKTsKKwkJYWNwaV9pYm1fZXhpdCgpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAJcHJvY19kaXItPm93bmVyID0gVEhJU19NT0RVTEU7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvbnVtYS5jIGIvZHJpdmVycy9hY3BpL251bWEuYwppbmRleCA0YTlmYWZmLi44ZmNkNmExIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvbnVtYS5jCisrKyBiL2RyaXZlcnMvYWNwaS9udW1hLmMKQEAgLTMzLDcgKzMzLDcgQEAKIAogI2RlZmluZSBBQ1BJX05VTUEJMHg4MDAwMDAwMAogI2RlZmluZSBfQ09NUE9ORU5UCUFDUElfTlVNQQotQUNQSV9NT0RVTEVfTkFNRSgibnVtYSIpCitBQ1BJX01PRFVMRV9OQU1FKCJudW1hIik7CiAKIHN0YXRpYyBub2RlbWFza190IG5vZGVzX2ZvdW5kX21hcCA9IE5PREVfTUFTS19OT05FOwogI2RlZmluZSBQWE1fSU5WQUwJLTEKQEAgLTQ1LDEyICs0NSw2IEBACiBpbnQgX19jcHVpbml0ZGF0YSBub2RlX3RvX3B4bV9tYXBbTUFYX05VTU5PREVTXQogCQkJCT0geyBbMCAuLi4gTUFYX05VTU5PREVTIC0gMV0gPSBQWE1fSU5WQUwgfTsKIAotZXh0ZXJuIGludCBfX2luaXQgYWNwaV90YWJsZV9wYXJzZV9tYWR0X2ZhbWlseShjaGFyICppZCwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgbWFkdF9zaXplLAotCQkJCQkgICAgICAgaW50IGVudHJ5X2lkLAotCQkJCQkgICAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwKLQkJCQkJICAgICAgIHVuc2lnbmVkIGludCBtYXhfZW50cmllcyk7Ci0KIGludCBfX2NwdWluaXQgcHhtX3RvX25vZGUoaW50IHB4bSkKIHsKIAlpZiAocHhtIDwgMCkKQEAgLTIwOCw5ICsyMDIsOSBAQAogCiBpbnQgX19pbml0CiBhY3BpX3RhYmxlX3BhcnNlX3NyYXQoZW51bSBhY3BpX3NyYXRfdHlwZSBpZCwKLQkJICAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQorCQkgICAgICBhY3BpX3RhYmxlX2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQogewotCXJldHVybiBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KEFDUElfU0lHX1NSQVQsCisJcmV0dXJuIGFjcGlfdGFibGVfcGFyc2VfZW50cmllcyhBQ1BJX1NJR19TUkFULAogCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX3NyYXQpLCBpZCwKIAkJCQkJICAgIGhhbmRsZXIsIG1heF9lbnRyaWVzKTsKIH0KQEAgLTIyMCw5ICsyMTQsNyBAQAogCWludCByZXN1bHQ7CiAKIAkvKiBTUkFUOiBTdGF0aWMgUmVzb3VyY2UgQWZmaW5pdHkgVGFibGUgKi8KLQlyZXN1bHQgPSBhY3BpX3RhYmxlX3BhcnNlKEFDUElfU0lHX1NSQVQsIGFjcGlfcGFyc2Vfc3JhdCk7Ci0KLQlpZiAocmVzdWx0ID4gMCkgeworCWlmICghYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19TUkFULCBhY3BpX3BhcnNlX3NyYXQpKSB7CiAJCXJlc3VsdCA9IGFjcGlfdGFibGVfcGFyc2Vfc3JhdChBQ1BJX1NSQVRfVFlQRV9DUFVfQUZGSU5JVFksCiAJCQkJCSAgICAgICBhY3BpX3BhcnNlX3Byb2Nlc3Nvcl9hZmZpbml0eSwKIAkJCQkJICAgICAgIE5SX0NQVVMpOwpAQCAtMjMwLDcgKzIyMiw3IEBACiAJfQogCiAJLyogU0xJVDogU3lzdGVtIExvY2FsaXR5IEluZm9ybWF0aW9uIFRhYmxlICovCi0JcmVzdWx0ID0gYWNwaV90YWJsZV9wYXJzZShBQ1BJX1NJR19TTElULCBhY3BpX3BhcnNlX3NsaXQpOworCWFjcGlfdGFibGVfcGFyc2UoQUNQSV9TSUdfU0xJVCwgYWNwaV9wYXJzZV9zbGl0KTsKIAogCWFjcGlfbnVtYV9hcmNoX2ZpeHVwKCk7CiAJcmV0dXJuIDA7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvb3NsLmMgYi9kcml2ZXJzL2FjcGkvb3NsLmMKaW5kZXggMGY2ZjNiYy4uOTcxZWNhNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL29zbC5jCisrKyBiL2RyaXZlcnMvYWNwaS9vc2wuYwpAQCAtNDYsNyArNDYsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2VmaS5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfT1NfU0VSVklDRVMKLUFDUElfTU9EVUxFX05BTUUoIm9zbCIpCitBQ1BJX01PRFVMRV9OQU1FKCJvc2wiKTsKICNkZWZpbmUgUFJFRklYCQkiQUNQSTogIgogc3RydWN0IGFjcGlfb3NfZHBjIHsKIAlhY3BpX29zZF9leGVjX2NhbGxiYWNrIGZ1bmN0aW9uOwpAQCAtNjgsOSArNjgsNiBAQAogZXh0ZXJuIGNoYXIgbGluZV9idWZbODBdOwogI2VuZGlmCQkJCS8qRU5BQkxFX0RFQlVHR0VSICovCiAKLWludCBhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkID0gVFJVRTsKLUVYUE9SVF9TWU1CT0woYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCk7Ci0KIHN0YXRpYyB1bnNpZ25lZCBpbnQgYWNwaV9pcnFfaXJxOwogc3RhdGljIGFjcGlfb3NkX2hhbmRsZXIgYWNwaV9pcnFfaGFuZGxlcjsKIHN0YXRpYyB2b2lkICphY3BpX2lycV9jb250ZXh0OwpAQCAtMjA1LDcgKzIwMiw3IEBACiB7CiAJaWYgKHBoeXMgPiBVTE9OR19NQVgpIHsKIAkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiQ2Fubm90IG1hcCBtZW1vcnkgdGhhdCBoaWdoXG4iKTsKLQkJcmV0dXJuIDA7CisJCXJldHVybiBOVUxMOwogCX0KIAlpZiAoYWNwaV9nYmxfcGVybWFuZW50X21tYXApCiAJCS8qCkBAIC04OTAsMjYgKzg4Nyw2IEBACiB9CiAjZW5kaWYJCQkJLyogIEFDUElfRlVUVVJFX1VTQUdFICAqLwogCi0vKiBBc3N1bWVzIG5vIHVucmVhZGFibGUgaG9sZXMgaW5iZXR3ZWVuICovCi11OCBhY3BpX29zX3JlYWRhYmxlKHZvaWQgKnB0ciwgYWNwaV9zaXplIGxlbikKLXsKLSNpZiBkZWZpbmVkKF9faTM4Nl9fKSB8fCBkZWZpbmVkKF9feDg2XzY0X18pCi0JY2hhciB0bXA7Ci0JcmV0dXJuICFfX2dldF91c2VyKHRtcCwgKGNoYXIgX191c2VyICopcHRyKQotCSAgICAmJiAhX19nZXRfdXNlcih0bXAsIChjaGFyIF9fdXNlciAqKXB0ciArIGxlbiAtIDEpOwotI2VuZGlmCi0JcmV0dXJuIDE7Ci19Ci0KLSNpZmRlZiBBQ1BJX0ZVVFVSRV9VU0FHRQotdTggYWNwaV9vc193cml0YWJsZSh2b2lkICpwdHIsIGFjcGlfc2l6ZSBsZW4pCi17Ci0JLyogY291bGQgZG8gZHVtbXkgd3JpdGUgKHJhY3kpIG9yIGEga2VybmVsIHBhZ2UgdGFibGUgbG9va3VwLgotCSAgIFRoZSBsYXRlciBtYXkgYmUgZGlmZmljdWx0IGF0IGVhcmx5IGJvb3Qgd2hlbiBrbWFwIGRvZXNuJ3Qgd29yayB5ZXQuICovCi0JcmV0dXJuIDE7Ci19Ci0jZW5kaWYKLQogYWNwaV9zdGF0dXMgYWNwaV9vc19zaWduYWwodTMyIGZ1bmN0aW9uLCB2b2lkICppbmZvKQogewogCXN3aXRjaCAoZnVuY3Rpb24pIHsKQEAgLTEwMTIsMTQgKzk4OSw2IEBACiAKIF9fc2V0dXAoImFjcGlfd2FrZV9ncGVzX2Fsd2F5c19vbiIsIGFjcGlfd2FrZV9ncGVzX2Fsd2F5c19vbl9zZXR1cCk7CiAKLXN0YXRpYyBpbnQgX19pbml0IGFjcGlfaG90a2V5X3NldHVwKGNoYXIgKnN0cikKLXsKLQlhY3BpX3NwZWNpZmljX2hvdGtleV9lbmFibGVkID0gRkFMU0U7Ci0JcmV0dXJuIDE7Ci19Ci0KLV9fc2V0dXAoImFjcGlfZ2VuZXJpY19ob3RrZXkiLCBhY3BpX2hvdGtleV9zZXR1cCk7Ci0KIC8qCiAgKiBtYXhfY3N0YXRlIGlzIGRlZmluZWQgaW4gdGhlIGJhc2Uga2VybmVsIHNvIG1vZHVsZXMgY2FuCiAgKiBjaGFuZ2UgaXQgdy9vIGRlcGVuZGluZyBvbiB0aGUgc3RhdGUgb2YgdGhlIHByb2Nlc3NvciBtb2R1bGUuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2JpbmQuYyBiL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jCmluZGV4IDU1ZjU3YTYuLjAyODk2OTMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfYmluZC5jCkBAIC0zNiw3ICszNiw3IEBACiAjaW5jbHVkZSA8YWNwaS9hY3BpX2RyaXZlcnMuaD4KIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BDSV9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoInBjaV9iaW5kIikKK0FDUElfTU9EVUxFX05BTUUoInBjaV9iaW5kIik7CiAKIHN0cnVjdCBhY3BpX3BjaV9kYXRhIHsKIAlzdHJ1Y3QgYWNwaV9wY2lfaWQgaWQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2lycS5jIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwppbmRleCBmZTdkMDA3Li5kZDMxODZhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKQEAgLTM4LDcgKzM4LDcgQEAKICNpbmNsdWRlIDxhY3BpL2FjcGlfZHJpdmVycy5oPgogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfUENJX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgicGNpX2lycSIpCitBQ1BJX01PRFVMRV9OQU1FKCJwY2lfaXJxIik7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9wcnRfbGlzdCBhY3BpX3BydDsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soYWNwaV9wcnRfbG9jayk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcGNpX2xpbmsuYyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCmluZGV4IDBmNjgzYzguLmFjYzU5NDcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCisrKyBiL2RyaXZlcnMvYWNwaS9wY2lfbGluay5jCkBAIC00NCwxMCArNDQsOSBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QQ0lfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJwY2lfbGluayIpCitBQ1BJX01PRFVMRV9OQU1FKCJwY2lfbGluayIpOwogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0NMQVNTCQkicGNpX2lycV9yb3V0aW5nIgogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0hJRAkJIlBOUDBDMEYiCi0jZGVmaW5lIEFDUElfUENJX0xJTktfRFJJVkVSX05BTUUJIkFDUEkgUENJIEludGVycnVwdCBMaW5rIERyaXZlciIKICNkZWZpbmUgQUNQSV9QQ0lfTElOS19ERVZJQ0VfTkFNRQkiUENJIEludGVycnVwdCBMaW5rIgogI2RlZmluZSBBQ1BJX1BDSV9MSU5LX0ZJTEVfSU5GTwkJImluZm8iCiAjZGVmaW5lIEFDUElfUENJX0xJTktfRklMRV9TVEFUVVMJInN0YXRlIgpAQCAtNTYsNyArNTUsNyBAQAogc3RhdGljIGludCBhY3BpX3BjaV9saW5rX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfcGNpX2xpbmtfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9QQ0lfTElOS19EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJwY2lfbGluayIsCiAJLmNsYXNzID0gQUNQSV9QQ0lfTElOS19DTEFTUywKIAkuaWRzID0gQUNQSV9QQ0lfTElOS19ISUQsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfcm9vdC5jIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKaW5kZXggNGVjZjcwMS4uYWQ0MTQ1YSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9yb290LmMKQEAgLTM2LDE3ICszNiwxNiBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QQ0lfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJwY2lfcm9vdCIpCitBQ1BJX01PRFVMRV9OQU1FKCJwY2lfcm9vdCIpOwogI2RlZmluZSBBQ1BJX1BDSV9ST09UX0NMQVNTCQkicGNpX2JyaWRnZSIKICNkZWZpbmUgQUNQSV9QQ0lfUk9PVF9ISUQJCSJQTlAwQTAzIgotI2RlZmluZSBBQ1BJX1BDSV9ST09UX0RSSVZFUl9OQU1FCSJBQ1BJIFBDSSBSb290IEJyaWRnZSBEcml2ZXIiCiAjZGVmaW5lIEFDUElfUENJX1JPT1RfREVWSUNFX05BTUUJIlBDSSBSb290IEJyaWRnZSIKIHN0YXRpYyBpbnQgYWNwaV9wY2lfcm9vdF9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX3BjaV9yb290X3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogc3RhdGljIGludCBhY3BpX3BjaV9yb290X3N0YXJ0KHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3BjaV9yb290X2RyaXZlciA9IHsKLQkubmFtZSA9IEFDUElfUENJX1JPT1RfRFJJVkVSX05BTUUsCisJLm5hbWUgPSAicGNpX3Jvb3QiLAogCS5jbGFzcyA9IEFDUElfUENJX1JPT1RfQ0xBU1MsCiAJLmlkcyA9IEFDUElfUENJX1JPT1RfSElELAogCS5vcHMgPSB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcG93ZXIuYyBiL2RyaXZlcnMvYWNwaS9wb3dlci5jCmluZGV4IDAxY2UzMTEuLjFlZjMzODUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wb3dlci5jCisrKyBiL2RyaXZlcnMvYWNwaS9wb3dlci5jCkBAIC00NSwxMCArNDUsOSBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QT1dFUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfcG93ZXIiKQorQUNQSV9NT0RVTEVfTkFNRSgicG93ZXIiKTsKICNkZWZpbmUgQUNQSV9QT1dFUl9DT01QT05FTlQJCTB4MDA4MDAwMDAKICNkZWZpbmUgQUNQSV9QT1dFUl9DTEFTUwkJInBvd2VyX3Jlc291cmNlIgotI2RlZmluZSBBQ1BJX1BPV0VSX0RSSVZFUl9OQU1FCQkiQUNQSSBQb3dlciBSZXNvdXJjZSBEcml2ZXIiCiAjZGVmaW5lIEFDUElfUE9XRVJfREVWSUNFX05BTUUJCSJQb3dlciBSZXNvdXJjZSIKICNkZWZpbmUgQUNQSV9QT1dFUl9GSUxFX0lORk8JCSJpbmZvIgogI2RlZmluZSBBQ1BJX1BPV0VSX0ZJTEVfU1RBVFVTCQkic3RhdGUiCkBAIC01NywyNSArNTYsMzMgQEAKICNkZWZpbmUgQUNQSV9QT1dFUl9SRVNPVVJDRV9TVEFURV9VTktOT1dOIDB4RkYKIHN0YXRpYyBpbnQgYWNwaV9wb3dlcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwogc3RhdGljIGludCBhY3BpX3Bvd2VyX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOworc3RhdGljIGludCBhY3BpX3Bvd2VyX3Jlc3VtZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfcG93ZXJfb3Blbl9mcyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlsZSk7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wb3dlcl9kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX1BPV0VSX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gInBvd2VyIiwKIAkuY2xhc3MgPSBBQ1BJX1BPV0VSX0NMQVNTLAogCS5pZHMgPSBBQ1BJX1BPV0VSX0hJRCwKIAkub3BzID0gewogCQkuYWRkID0gYWNwaV9wb3dlcl9hZGQsCiAJCS5yZW1vdmUgPSBhY3BpX3Bvd2VyX3JlbW92ZSwKKwkJLnJlc3VtZSA9IGFjcGlfcG93ZXJfcmVzdW1lLAogCQl9LAogfTsKIAorc3RydWN0IGFjcGlfcG93ZXJfcmVmZXJlbmNlIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG5vZGU7CisJc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2U7Cit9OworCiBzdHJ1Y3QgYWNwaV9wb3dlcl9yZXNvdXJjZSB7CiAJc3RydWN0IGFjcGlfZGV2aWNlICogZGV2aWNlOwogCWFjcGlfYnVzX2lkIG5hbWU7CiAJdTMyIHN5c3RlbV9sZXZlbDsKIAl1MzIgb3JkZXI7CiAJaW50IHN0YXRlOwotCWludCByZWZlcmVuY2VzOworCXN0cnVjdCBtdXRleCByZXNvdXJjZV9sb2NrOworCXN0cnVjdCBsaXN0X2hlYWQgcmVmZXJlbmNlOwogfTsKIAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgYWNwaV9wb3dlcl9yZXNvdXJjZV9saXN0OwpAQCAtMTcxLDIyICsxNzgsNDcgQEAKIAlyZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0aWMgaW50IGFjcGlfcG93ZXJfb24oYWNwaV9oYW5kbGUgaGFuZGxlKQorc3RhdGljIGludCBhY3BpX3Bvd2VyX29uKGFjcGlfaGFuZGxlIGhhbmRsZSwgc3RydWN0IGFjcGlfZGV2aWNlICpkZXYpCiB7CiAJaW50IHJlc3VsdCA9IDA7CisJaW50IGZvdW5kID0gMDsKIAlhY3BpX3N0YXR1cyBzdGF0dXMgPSBBRV9PSzsKLQlzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSA9IE5VTEw7CiAJc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKKwlzdHJ1Y3QgYWNwaV9wb3dlcl9yZWZlcmVuY2UgKnJlZjsKIAogCiAJcmVzdWx0ID0gYWNwaV9wb3dlcl9nZXRfY29udGV4dChoYW5kbGUsICZyZXNvdXJjZSk7CiAJaWYgKHJlc3VsdCkKIAkJcmV0dXJuIHJlc3VsdDsKIAotCXJlc291cmNlLT5yZWZlcmVuY2VzKys7CisJbXV0ZXhfbG9jaygmcmVzb3VyY2UtPnJlc291cmNlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmcmVzb3VyY2UtPnJlZmVyZW5jZSkgeworCQlyZWYgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfcG93ZXJfcmVmZXJlbmNlLCBub2RlKTsKKwkJaWYgKGRldi0+aGFuZGxlID09IHJlZi0+ZGV2aWNlLT5oYW5kbGUpIHsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBbJXNdIGFscmVhZHkgcmVmZXJlbmNlZCBieSByZXNvdXJjZSBbJXNdXG4iLAorCQkJCSAgZGV2LT5wbnAuYnVzX2lkLCByZXNvdXJjZS0+bmFtZSkpOworCQkJZm91bmQgPSAxOworCQkJYnJlYWs7CisJCX0KKwl9CiAKLQlpZiAoKHJlc291cmNlLT5yZWZlcmVuY2VzID4gMSkKLQkgICAgfHwgKHJlc291cmNlLT5zdGF0ZSA9PSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09OKSkgeworCWlmICghZm91bmQpIHsKKwkJcmVmID0ga21hbGxvYyhzaXplb2YgKHN0cnVjdCBhY3BpX3Bvd2VyX3JlZmVyZW5jZSksCisJCSAgICBpcnFzX2Rpc2FibGVkKCkgPyBHRlBfQVRPTUlDIDogR0ZQX0tFUk5FTCk7CisJCWlmICghcmVmKSB7CisJCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJrbWFsbG9jKCkgZmFpbGVkXG4iKSk7CisJCQltdXRleF91bmxvY2soJnJlc291cmNlLT5yZXNvdXJjZV9sb2NrKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCWxpc3RfYWRkX3RhaWwoJnJlZi0+bm9kZSwgJnJlc291cmNlLT5yZWZlcmVuY2UpOworCQlyZWYtPmRldmljZSA9IGRldjsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiRGV2aWNlIFslc10gYWRkZWQgdG8gcmVzb3VyY2UgWyVzXSByZWZlcmVuY2VzXG4iLAorCQkJICBkZXYtPnBucC5idXNfaWQsIHJlc291cmNlLT5uYW1lKSk7CisJfQorCW11dGV4X3VubG9jaygmcmVzb3VyY2UtPnJlc291cmNlX2xvY2spOworCisJaWYgKHJlc291cmNlLT5zdGF0ZSA9PSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09OKSB7CiAJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIlJlc291cmNlIFslc10gYWxyZWFkeSBvblxuIiwKIAkJCQkgIHJlc291cmNlLT5uYW1lKSk7CiAJCXJldHVybiAwOwpAQCAtMjAzLDM4ICsyMzUsNDkgQEAKIAkJcmV0dXJuIC1FTk9FWEVDOwogCiAJLyogVXBkYXRlIHRoZSBwb3dlciByZXNvdXJjZSdzIF9kZXZpY2VfIHBvd2VyIHN0YXRlICovCi0JZGV2aWNlID0gcmVzb3VyY2UtPmRldmljZTsKIAlyZXNvdXJjZS0+ZGV2aWNlLT5wb3dlci5zdGF0ZSA9IEFDUElfU1RBVEVfRDA7CiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBbJXNdIHR1cm5lZCBvblxuIiwKIAkJCSAgcmVzb3VyY2UtPm5hbWUpKTsKLQogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFjcGlfcG93ZXJfb2ZmX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCitzdGF0aWMgaW50IGFjcGlfcG93ZXJfb2ZmX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsIHN0cnVjdCBhY3BpX2RldmljZSAqZGV2KQogewogCWludCByZXN1bHQgPSAwOwogCWFjcGlfc3RhdHVzIHN0YXR1cyA9IEFFX09LOwogCXN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CisJc3RydWN0IGFjcGlfcG93ZXJfcmVmZXJlbmNlICpyZWY7CisKIAogCXJlc3VsdCA9IGFjcGlfcG93ZXJfZ2V0X2NvbnRleHQoaGFuZGxlLCAmcmVzb3VyY2UpOwogCWlmIChyZXN1bHQpCiAJCXJldHVybiByZXN1bHQ7CiAKLQlpZiAocmVzb3VyY2UtPnJlZmVyZW5jZXMpCi0JCXJlc291cmNlLT5yZWZlcmVuY2VzLS07CisJbXV0ZXhfbG9jaygmcmVzb3VyY2UtPnJlc291cmNlX2xvY2spOworCWxpc3RfZm9yX2VhY2hfc2FmZShub2RlLCBuZXh0LCAmcmVzb3VyY2UtPnJlZmVyZW5jZSkgeworCQlyZWYgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfcG93ZXJfcmVmZXJlbmNlLCBub2RlKTsKKwkJaWYgKGRldi0+aGFuZGxlID09IHJlZi0+ZGV2aWNlLT5oYW5kbGUpIHsKKwkJCWxpc3RfZGVsKCZyZWYtPm5vZGUpOworCQkJa2ZyZWUocmVmKTsKKwkJCUFDUElfREVCVUdfUFJJTlQoKEFDUElfREJfSU5GTywgIkRldmljZSBbJXNdIHJlbW92ZWQgZnJvbSByZXNvdXJjZSBbJXNdIHJlZmVyZW5jZXNcbiIsCisJCQkgICAgZGV2LT5wbnAuYnVzX2lkLCByZXNvdXJjZS0+bmFtZSkpOworCQkJYnJlYWs7CisJCX0KKwl9CiAKLQlpZiAocmVzb3VyY2UtPnJlZmVyZW5jZXMpIHsKLQkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLAotCQkJCSAgIlJlc291cmNlIFslc10gaXMgc3RpbGwgaW4gdXNlLCBkZXJlZmVyZW5jaW5nXG4iLAotCQkJCSAgcmVzb3VyY2UtPmRldmljZS0+cG5wLmJ1c19pZCkpOworCWlmICghbGlzdF9lbXB0eSgmcmVzb3VyY2UtPnJlZmVyZW5jZSkpIHsKKwkJQUNQSV9ERUJVR19QUklOVCgoQUNQSV9EQl9JTkZPLCAiQ2Fubm90IHR1cm4gcmVzb3VyY2UgWyVzXSBvZmYgLSByZXNvdXJjZSBpcyBpbiB1c2VcbiIsCisJCSAgICByZXNvdXJjZS0+bmFtZSkpOworCQltdXRleF91bmxvY2soJnJlc291cmNlLT5yZXNvdXJjZV9sb2NrKTsKIAkJcmV0dXJuIDA7CiAJfQorCW11dGV4X3VubG9jaygmcmVzb3VyY2UtPnJlc291cmNlX2xvY2spOwogCiAJaWYgKHJlc291cmNlLT5zdGF0ZSA9PSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09GRikgewogCQlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sICJSZXNvdXJjZSBbJXNdIGFscmVhZHkgb2ZmXG4iLAotCQkJCSAgcmVzb3VyY2UtPmRldmljZS0+cG5wLmJ1c19pZCkpOworCQkJCSAgcmVzb3VyY2UtPm5hbWUpKTsKIAkJcmV0dXJuIDA7CiAJfQogCkBAIC0yNzYsNyArMzE5LDcgQEAKIAlhcmcuaW50ZWdlci52YWx1ZSA9IDE7CiAJLyogT3BlbiBwb3dlciByZXNvdXJjZSAqLwogCWZvciAoaSA9IDA7IGkgPCBkZXYtPndha2V1cC5yZXNvdXJjZXMuY291bnQ7IGkrKykgewotCQlyZXQgPSBhY3BpX3Bvd2VyX29uKGRldi0+d2FrZXVwLnJlc291cmNlcy5oYW5kbGVzW2ldKTsKKwkJcmV0ID0gYWNwaV9wb3dlcl9vbihkZXYtPndha2V1cC5yZXNvdXJjZXMuaGFuZGxlc1tpXSwgZGV2KTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVHJhbnNpdGlvbiBwb3dlciBzdGF0ZVxuIik7CiAJCQlkZXYtPndha2V1cC5mbGFncy52YWxpZCA9IDA7CkBAIC0zMjMsNyArMzY2LDcgQEAKIAogCS8qIENsb3NlIHBvd2VyIHJlc291cmNlICovCiAJZm9yIChpID0gMDsgaSA8IGRldi0+d2FrZXVwLnJlc291cmNlcy5jb3VudDsgaSsrKSB7Ci0JCXJldCA9IGFjcGlfcG93ZXJfb2ZmX2RldmljZShkZXYtPndha2V1cC5yZXNvdXJjZXMuaGFuZGxlc1tpXSk7CisJCXJldCA9IGFjcGlfcG93ZXJfb2ZmX2RldmljZShkZXYtPndha2V1cC5yZXNvdXJjZXMuaGFuZGxlc1tpXSwgZGV2KTsKIAkJaWYgKHJldCkgewogCQkJcHJpbnRrKEtFUk5fRVJSIFBSRUZJWCAiVHJhbnNpdGlvbiBwb3dlciBzdGF0ZVxuIik7CiAJCQlkZXYtPndha2V1cC5mbGFncy52YWxpZCA9IDA7CkBAIC00MDcsNyArNDUwLDcgQEAKIAkgKiAoZS5nLiBzbyB0aGUgZGV2aWNlIGRvZXNuJ3QgbG9zZSBwb3dlciB3aGlsZSB0cmFuc2l0aW9uaW5nKS4KIAkgKi8KIAlmb3IgKGkgPSAwOyBpIDwgdGwtPmNvdW50OyBpKyspIHsKLQkJcmVzdWx0ID0gYWNwaV9wb3dlcl9vbih0bC0+aGFuZGxlc1tpXSk7CisJCXJlc3VsdCA9IGFjcGlfcG93ZXJfb24odGwtPmhhbmRsZXNbaV0sIGRldmljZSk7CiAJCWlmIChyZXN1bHQpCiAJCQlnb3RvIGVuZDsKIAl9CkBAIC00MjAsNyArNDYzLDcgQEAKIAkgKiBUaGVuIHdlIGRlcmVmZXJlbmNlIGFsbCBwb3dlciByZXNvdXJjZXMgdXNlZCBpbiB0aGUgY3VycmVudCBsaXN0LgogCSAqLwogCWZvciAoaSA9IDA7IGkgPCBjbC0+Y291bnQ7IGkrKykgewotCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX29mZl9kZXZpY2UoY2wtPmhhbmRsZXNbaV0pOworCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX29mZl9kZXZpY2UoY2wtPmhhbmRsZXNbaV0sIGRldmljZSk7CiAJCWlmIChyZXN1bHQpCiAJCQlnb3RvIGVuZDsKIAl9CkBAIC00NDMsNyArNDg2LDExIEBACiAKIHN0YXRpYyBpbnQgYWNwaV9wb3dlcl9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnNlcSwgdm9pZCAqb2Zmc2V0KQogeworCWludCBjb3VudCA9IDA7CisJaW50IHJlc3VsdCA9IDA7CiAJc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpub2RlLCAqbmV4dDsKKwlzdHJ1Y3QgYWNwaV9wb3dlcl9yZWZlcmVuY2UgKnJlZjsKIAogCiAJcmVzb3VyY2UgPSBzZXEtPnByaXZhdGU7CkBAIC00NTEsNiArNDk4LDEwIEBACiAJaWYgKCFyZXNvdXJjZSkKIAkJZ290byBlbmQ7CiAKKwlyZXN1bHQgPSBhY3BpX3Bvd2VyX2dldF9zdGF0ZShyZXNvdXJjZSk7CisJaWYgKHJlc3VsdCkKKwkJZ290byBlbmQ7CisKIAlzZXFfcHV0cyhzZXEsICJzdGF0ZTogICAgICAgICAgICAgICAgICAgIik7CiAJc3dpdGNoIChyZXNvdXJjZS0+c3RhdGUpIHsKIAljYXNlIEFDUElfUE9XRVJfUkVTT1VSQ0VfU1RBVEVfT046CkBAIC00NjQsMTEgKzUxNSwxOCBAQAogCQlicmVhazsKIAl9CiAKKwltdXRleF9sb2NrKCZyZXNvdXJjZS0+cmVzb3VyY2VfbG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKG5vZGUsIG5leHQsICZyZXNvdXJjZS0+cmVmZXJlbmNlKSB7CisJCXJlZiA9IGNvbnRhaW5lcl9vZihub2RlLCBzdHJ1Y3QgYWNwaV9wb3dlcl9yZWZlcmVuY2UsIG5vZGUpOworCQljb3VudCsrOworCX0KKwltdXRleF91bmxvY2soJnJlc291cmNlLT5yZXNvdXJjZV9sb2NrKTsKKwogCXNlcV9wcmludGYoc2VxLCAic3lzdGVtIGxldmVsOiAgICAgICAgICAgIFMlZFxuIgogCQkgICAib3JkZXI6ICAgICAgICAgICAgICAgICAgICVkXG4iCiAJCSAgICJyZWZlcmVuY2UgY291bnQ6ICAgICAgICAgJWRcbiIsCiAJCSAgIHJlc291cmNlLT5zeXN0ZW1fbGV2ZWwsCi0JCSAgIHJlc291cmNlLT5vcmRlciwgcmVzb3VyY2UtPnJlZmVyZW5jZXMpOworCQkgICByZXNvdXJjZS0+b3JkZXIsIGNvdW50KTsKIAogICAgICAgZW5kOgogCXJldHVybiAwOwpAQCAtNTQxLDYgKzU5OSw4IEBACiAJCXJldHVybiAtRU5PTUVNOwogCiAJcmVzb3VyY2UtPmRldmljZSA9IGRldmljZTsKKwltdXRleF9pbml0KCZyZXNvdXJjZS0+cmVzb3VyY2VfbG9jayk7CisJSU5JVF9MSVNUX0hFQUQoJnJlc291cmNlLT5yZWZlcmVuY2UpOwogCXN0cmNweShyZXNvdXJjZS0+bmFtZSwgZGV2aWNlLT5wbnAuYnVzX2lkKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfbmFtZShkZXZpY2UpLCBBQ1BJX1BPV0VSX0RFVklDRV9OQU1FKTsKIAlzdHJjcHkoYWNwaV9kZXZpY2VfY2xhc3MoZGV2aWNlKSwgQUNQSV9QT1dFUl9DTEFTUyk7CkBAIC01ODgsNiArNjQ4LDcgQEAKIHN0YXRpYyBpbnQgYWNwaV9wb3dlcl9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQogewogCXN0cnVjdCBhY3BpX3Bvd2VyX3Jlc291cmNlICpyZXNvdXJjZSA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqbm9kZSwgKm5leHQ7CiAKIAogCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCkBAIC01OTcsMTEgKzY1OCw1NCBAQAogCiAJYWNwaV9wb3dlcl9yZW1vdmVfZnMoZGV2aWNlKTsKIAorCW11dGV4X2xvY2soJnJlc291cmNlLT5yZXNvdXJjZV9sb2NrKTsKKwlsaXN0X2Zvcl9lYWNoX3NhZmUobm9kZSwgbmV4dCwgJnJlc291cmNlLT5yZWZlcmVuY2UpIHsKKwkJc3RydWN0IGFjcGlfcG93ZXJfcmVmZXJlbmNlICpyZWYgPSBjb250YWluZXJfb2Yobm9kZSwgc3RydWN0IGFjcGlfcG93ZXJfcmVmZXJlbmNlLCBub2RlKTsKKwkJbGlzdF9kZWwoJnJlZi0+bm9kZSk7CisJCWtmcmVlKHJlZik7CisJfQorCW11dGV4X3VubG9jaygmcmVzb3VyY2UtPnJlc291cmNlX2xvY2spOworCiAJa2ZyZWUocmVzb3VyY2UpOwogCiAJcmV0dXJuIDA7CiB9CiAKK3N0YXRpYyBpbnQgYWNwaV9wb3dlcl9yZXN1bWUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpCit7CisJaW50IHJlc3VsdCA9IDA7CisJc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKnJlc291cmNlID0gTlVMTDsKKwlzdHJ1Y3QgYWNwaV9wb3dlcl9yZWZlcmVuY2UgKnJlZjsKKworCWlmICghZGV2aWNlIHx8ICFhY3BpX2RyaXZlcl9kYXRhKGRldmljZSkpCisJCXJldHVybiAtRUlOVkFMOworCisJcmVzb3VyY2UgPSAoc3RydWN0IGFjcGlfcG93ZXJfcmVzb3VyY2UgKilhY3BpX2RyaXZlcl9kYXRhKGRldmljZSk7CisKKwlyZXN1bHQgPSBhY3BpX3Bvd2VyX2dldF9zdGF0ZShyZXNvdXJjZSk7CisJaWYgKHJlc3VsdCkKKwkJcmV0dXJuIHJlc3VsdDsKKworCW11dGV4X2xvY2soJnJlc291cmNlLT5yZXNvdXJjZV9sb2NrKTsKKwlpZiAoKHJlc291cmNlLT5zdGF0ZSA9PSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09OKSAmJgorCSAgICBsaXN0X2VtcHR5KCZyZXNvdXJjZS0+cmVmZXJlbmNlKSkgeworCQltdXRleF91bmxvY2soJnJlc291cmNlLT5yZXNvdXJjZV9sb2NrKTsKKwkJcmVzdWx0ID0gYWNwaV9wb3dlcl9vZmZfZGV2aWNlKGRldmljZS0+aGFuZGxlLCBOVUxMKTsKKwkJcmV0dXJuIHJlc3VsdDsKKwl9CisKKwlpZiAoKHJlc291cmNlLT5zdGF0ZSA9PSBBQ1BJX1BPV0VSX1JFU09VUkNFX1NUQVRFX09GRikgJiYKKwkgICAgIWxpc3RfZW1wdHkoJnJlc291cmNlLT5yZWZlcmVuY2UpKSB7CisJCXJlZiA9IGNvbnRhaW5lcl9vZihyZXNvdXJjZS0+cmVmZXJlbmNlLm5leHQsIHN0cnVjdCBhY3BpX3Bvd2VyX3JlZmVyZW5jZSwgbm9kZSk7CisJCW11dGV4X3VubG9jaygmcmVzb3VyY2UtPnJlc291cmNlX2xvY2spOworCQlyZXN1bHQgPSBhY3BpX3Bvd2VyX29uKGRldmljZS0+aGFuZGxlLCByZWYtPmRldmljZSk7CisJCXJldHVybiByZXN1bHQ7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZyZXNvdXJjZS0+cmVzb3VyY2VfbG9jayk7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IGFjcGlfcG93ZXJfaW5pdCh2b2lkKQogewogCWludCByZXN1bHQgPSAwOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl9jb3JlLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwppbmRleCAwMDc5YmM1Li45OWQxNTE2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2NvcmUuYwpAQCAtNjAsNyArNjAsNiBAQAogCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAkweDAxMDAwMDAwCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NMQVNTCQkicHJvY2Vzc29yIgotI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRQkiQUNQSSBQcm9jZXNzb3IgRHJpdmVyIgogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9ERVZJQ0VfTkFNRQkiUHJvY2Vzc29yIgogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9GSUxFX0lORk8JImluZm8iCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0ZJTEVfVEhST1RUTElORwkidGhyb3R0bGluZyIKQEAgLTc0LDEwICs3MywxMCBAQAogI2RlZmluZSBBQ1BJX1NUQV9QUkVTRU5UIDB4MDAwMDAwMDEKIAogI2RlZmluZSBfQ09NUE9ORU5UCQlBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKK0FDUElfTU9EVUxFX05BTUUoInByb2Nlc3Nvcl9jb3JlIik7CiAKLSAgICBNT0RVTEVfQVVUSE9SKCJQYXVsIERpZWZlbmJhdWdoIik7Ci1NT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUpOworTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIFByb2Nlc3NvciBEcml2ZXIiKTsKIE1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKIAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9hZGQoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UpOwpAQCAtODksNyArODgsNyBAQAogc3RhdGljIGludCBhY3BpX3Byb2Nlc3Nvcl9oYW5kbGVfZWplY3Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcik7CiAKIHN0YXRpYyBzdHJ1Y3QgYWNwaV9kcml2ZXIgYWNwaV9wcm9jZXNzb3JfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUsCisJLm5hbWUgPSAicHJvY2Vzc29yIiwKIAkuY2xhc3MgPSBBQ1BJX1BST0NFU1NPUl9DTEFTUywKIAkuaWRzID0gQUNQSV9QUk9DRVNTT1JfSElELAogCS5vcHMgPSB7CkBAIC00MDQsNyArNDAzLDcgQEAKIAlpZiAobHNhcGljLT5sYXBpY19mbGFncyAmIEFDUElfTUFEVF9FTkFCTEVEKSB7CiAJCS8qIEZpcnN0IGNoZWNrIGFnYWluc3QgaWQgKi8KIAkJaWYgKGxzYXBpYy0+cHJvY2Vzc29yX2lkID09IGFjcGlfaWQpIHsKLQkJCSphcGljX2lkID0gbHNhcGljLT5pZDsKKwkJCSphcGljX2lkID0gKGxzYXBpYy0+aWQgPDwgOCkgfCBsc2FwaWMtPmVpZDsKIAkJCXJldHVybiAxOwogCQkvKiBDaGVjayBhZ2FpbnN0IG9wdGlvbmFsIHVpZCAqLwogCQl9IGVsc2UgaWYgKGVudHJ5LT5sZW5ndGggPj0gMTYgJiYKQEAgLTEwMDUsNyArMTAwNCw3IEBACiAjaWZkZWYgQ09ORklHX1NNUAogCWlmIChBQ1BJX0ZBSUxVUkUoYWNwaV9nZXRfdGFibGUoQUNQSV9TSUdfTUFEVCwgMCwKIAkJCQkoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICoqKSZtYWR0KSkpCi0JCW1hZHQgPSAwOworCQltYWR0ID0gTlVMTDsKICNlbmRpZgogCiAJYWNwaV9wcm9jZXNzb3JfZGlyID0gcHJvY19ta2RpcihBQ1BJX1BST0NFU1NPUl9DTEFTUywgYWNwaV9yb290X2Rpcik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX2lkbGUuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCmluZGV4IDZjNjc1MWIuLjYwNzczMDAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfaWRsZS5jCkBAIC0zOSw2ICszOSwyNSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZXBhcmFtLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4JLyogbmVlZF9yZXNjaGVkKCkgKi8KICNpbmNsdWRlIDxsaW51eC9sYXRlbmN5Lmg+CisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorCisvKgorICogSW5jbHVkZSB0aGUgYXBpYyBkZWZpbml0aW9ucyBmb3IgeDg2IHRvIGhhdmUgdGhlIEFQSUMgdGltZXIgcmVsYXRlZCBkZWZpbmVzCisgKiBhdmFpbGFibGUgYWxzbyBmb3IgVVAgKG9uIFNNUCBpdCBnZXRzIG1hZ2ljYWxseSBpbmNsdWRlZCB2aWEgbGludXgvc21wLmgpLgorICogYXNtL2FjcGkuaCBpcyBub3QgYW4gb3B0aW9uLCBhcyBpdCB3b3VsZCByZXF1aXJlIG1vcmUgaW5jbHVkZSBtYWdpYy4gQWxzbworICogY3JlYXRpbmcgYW4gZW1wdHkgYXNtLWlhNjQvYXBpYy5oIHdvdWxkIGp1c3QgdHJhZGUgcGVzdCB2cy4gY2hvbGVyYS4KKyAqLworI2lmZGVmIENPTkZJR19YODYKKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2VuZGlmCisKKy8qCisgKiBJbmNsdWRlIHRoZSBhcGljIGRlZmluaXRpb25zIGZvciB4ODYgdG8gaGF2ZSB0aGUgQVBJQyB0aW1lciByZWxhdGVkIGRlZmluZXMKKyAqIGF2YWlsYWJsZSBhbHNvIGZvciBVUCAob24gU01QIGl0IGdldHMgbWFnaWNhbGx5IGluY2x1ZGVkIHZpYSBsaW51eC9zbXAuaCkuCisgKi8KKyNpZmRlZiBDT05GSUdfWDg2CisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KQEAgLTQ4LDkgKzY3LDggQEAKIAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQgICAgICAgIDB4MDEwMDAwMDAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ0xBU1MgICAgICAgICAgICAicHJvY2Vzc29yIgotI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRSAgICAgICJBQ1BJIFByb2Nlc3NvciBEcml2ZXIiCiAjZGVmaW5lIF9DT01QT05FTlQgICAgICAgICAgICAgIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV9wcm9jZXNzb3IiKQorQUNQSV9NT0RVTEVfTkFNRSgicHJvY2Vzc29yX2lkbGUiKTsKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRklMRV9QT1dFUgkicG93ZXIiCiAjZGVmaW5lIFVTX1RPX1BNX1RJTUVSX1RJQ0tTKHQpCQkoKHQgKiAoUE1fVElNRVJfRlJFUVVFTkNZLzEwMDApKSAvIDEwMDApCiAjZGVmaW5lIEMyX09WRVJIRUFECQkJNAkvKiAxdXMgKDMuNTc5IHRpY2tzIHBlciB1cykgKi8KQEAgLTIzOCw2ICsyNTYsODEgQEAKIAl9CiB9CiAKKyNpZmRlZiBBUkNIX0FQSUNUSU1FUl9TVE9QU19PTl9DMworCisvKgorICogU29tZSBCSU9TIGltcGxlbWVudGF0aW9ucyBzd2l0Y2ggdG8gQzMgaW4gdGhlIHB1Ymxpc2hlZCBDMiBzdGF0ZS4KKyAqIFRoaXMgc2VlbXMgdG8gYmUgYSBjb21tb24gcHJvYmxlbSBvbiBBTUQgYm94ZW4sIGJ1dCBvdGhlciB2ZW5kb3JzCisgKiBhcmUgYWZmZWN0ZWQgdG9vLiBXZSBwaWNrIHRoZSBtb3N0IGNvbnNlcnZhdGl2ZSBhcHByb2FjaDogd2UgYXNzdW1lCisgKiB0aGF0IHRoZSBsb2NhbCBBUElDIHN0b3BzIGluIGJvdGggQzIgYW5kIEMzLgorICovCitzdGF0aWMgdm9pZCBhY3BpX3RpbWVyX2NoZWNrX3N0YXRlKGludCBzdGF0ZSwgc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCQkgICBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4KQoreworCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9wb3dlciAqcHdyID0gJnByLT5wb3dlcjsKKworCS8qCisJICogQ2hlY2ssIGlmIG9uZSBvZiB0aGUgcHJldmlvdXMgc3RhdGVzIGFscmVhZHkgbWFya2VkIHRoZSBsYXBpYworCSAqIHVuc3RhYmxlCisJICovCisJaWYgKHB3ci0+dGltZXJfYnJvYWRjYXN0X29uX3N0YXRlIDwgc3RhdGUpCisJCXJldHVybjsKKworCWlmIChjeC0+dHlwZSA+PSBBQ1BJX1NUQVRFX0MyKQorCQlwci0+cG93ZXIudGltZXJfYnJvYWRjYXN0X29uX3N0YXRlID0gc3RhdGU7Cit9CisKK3N0YXRpYyB2b2lkIGFjcGlfcHJvcGFnYXRlX3RpbWVyX2Jyb2FkY2FzdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByKQoreworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTCisJdW5zaWduZWQgbG9uZyByZWFzb247CisKKwlyZWFzb24gPSBwci0+cG93ZXIudGltZXJfYnJvYWRjYXN0X29uX3N0YXRlIDwgSU5UX01BWCA/CisJCUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OIDogQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT0ZGOworCisJY2xvY2tldmVudHNfbm90aWZ5KHJlYXNvbiwgJnByLT5pZCk7CisjZWxzZQorCWNwdW1hc2tfdCBtYXNrID0gY3B1bWFza19vZl9jcHUocHItPmlkKTsKKworCWlmIChwci0+cG93ZXIudGltZXJfYnJvYWRjYXN0X29uX3N0YXRlIDwgSU5UX01BWCkKKwkJb25fZWFjaF9jcHUoc3dpdGNoX0FQSUNfdGltZXJfdG9faXBpLCAmbWFzaywgMSwgMSk7CisJZWxzZQorCQlvbl9lYWNoX2NwdShzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIsICZtYXNrLCAxLCAxKTsKKyNlbmRpZgorfQorCisvKiBQb3dlcihDKSBTdGF0ZSB0aW1lciBicm9hZGNhc3QgY29udHJvbCAqLworc3RhdGljIHZvaWQgYWNwaV9zdGF0ZV90aW1lcl9icm9hZGNhc3Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCQkgICAgICAgc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCwKKwkJCQkgICAgICAgaW50IGJyb2FkY2FzdCkKK3sKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworCisJaW50IHN0YXRlID0gY3ggLSBwci0+cG93ZXIuc3RhdGVzOworCisJaWYgKHN0YXRlID49IHByLT5wb3dlci50aW1lcl9icm9hZGNhc3Rfb25fc3RhdGUpIHsKKwkJdW5zaWduZWQgbG9uZyByZWFzb247CisKKwkJcmVhc29uID0gYnJvYWRjYXN0ID8gIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VOVEVSIDoKKwkJCUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX0VYSVQ7CisJCWNsb2NrZXZlbnRzX25vdGlmeShyZWFzb24sICZwci0+aWQpOworCX0KKyNlbmRpZgorfQorCisjZWxzZQorCitzdGF0aWMgdm9pZCBhY3BpX3RpbWVyX2NoZWNrX3N0YXRlKGludCBzdGF0ZSwgc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwciwKKwkJCQkgICBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmNzdGF0ZSkgeyB9CitzdGF0aWMgdm9pZCBhY3BpX3Byb3BhZ2F0ZV90aW1lcl9icm9hZGNhc3Qoc3RydWN0IGFjcGlfcHJvY2Vzc29yICpwcikgeyB9CitzdGF0aWMgdm9pZCBhY3BpX3N0YXRlX3RpbWVyX2Jyb2FkY2FzdChzdHJ1Y3QgYWNwaV9wcm9jZXNzb3IgKnByLAorCQkJCSAgICAgICBzdHJ1Y3QgYWNwaV9wcm9jZXNzb3JfY3ggKmN4LAorCQkJCSAgICAgICBpbnQgYnJvYWRjYXN0KQoreworfQorCisjZW5kaWYKKwogc3RhdGljIHZvaWQgYWNwaV9wcm9jZXNzb3JfaWRsZSh2b2lkKQogewogCXN0cnVjdCBhY3BpX3Byb2Nlc3NvciAqcHIgPSBOVUxMOwpAQCAtMzgyLDYgKzQ3NSw3IEBACiAJCS8qIEdldCBzdGFydCB0aW1lICh0aWNrcykgKi8KIAkJdDEgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CiAJCS8qIEludm9rZSBDMiAqLworCQlhY3BpX3N0YXRlX3RpbWVyX2Jyb2FkY2FzdChwciwgY3gsIDEpOwogCQlhY3BpX2NzdGF0ZV9lbnRlcihjeCk7CiAJCS8qIEdldCBlbmQgdGltZSAodGlja3MpICovCiAJCXQyID0gaW5sKGFjcGlfZ2JsX0ZBRFQueHBtX3RpbWVyX2Jsb2NrLmFkZHJlc3MpOwpAQCAtMzk2LDYgKzQ5MCw3IEBACiAJCS8qIENvbXB1dGUgdGltZSAodGlja3MpIHRoYXQgd2Ugd2VyZSBhY3R1YWxseSBhc2xlZXAgKi8KIAkJc2xlZXBfdGlja3MgPQogCQkgICAgdGlja3NfZWxhcHNlZCh0MSwgdDIpIC0gY3gtPmxhdGVuY3lfdGlja3MgLSBDMl9PVkVSSEVBRDsKKwkJYWNwaV9zdGF0ZV90aW1lcl9icm9hZGNhc3QocHIsIGN4LCAwKTsKIAkJYnJlYWs7CiAKIAljYXNlIEFDUElfU1RBVEVfQzM6CkBAIC00MTcsNiArNTEyLDcgQEAKIAkJLyogR2V0IHN0YXJ0IHRpbWUgKHRpY2tzKSAqLwogCQl0MSA9IGlubChhY3BpX2dibF9GQURULnhwbV90aW1lcl9ibG9jay5hZGRyZXNzKTsKIAkJLyogSW52b2tlIEMzICovCisJCWFjcGlfc3RhdGVfdGltZXJfYnJvYWRjYXN0KHByLCBjeCwgMSk7CiAJCWFjcGlfY3N0YXRlX2VudGVyKGN4KTsKIAkJLyogR2V0IGVuZCB0aW1lICh0aWNrcykgKi8KIAkJdDIgPSBpbmwoYWNwaV9nYmxfRkFEVC54cG1fdGltZXJfYmxvY2suYWRkcmVzcyk7CkBAIC00MzYsNiArNTMyLDcgQEAKIAkJLyogQ29tcHV0ZSB0aW1lICh0aWNrcykgdGhhdCB3ZSB3ZXJlIGFjdHVhbGx5IGFzbGVlcCAqLwogCQlzbGVlcF90aWNrcyA9CiAJCSAgICB0aWNrc19lbGFwc2VkKHQxLCB0MikgLSBjeC0+bGF0ZW5jeV90aWNrcyAtIEMzX09WRVJIRUFEOworCQlhY3BpX3N0YXRlX3RpbWVyX2Jyb2FkY2FzdChwciwgY3gsIDApOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CkBAIC05MDQsMTEgKzEwMDEsNyBAQAogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCB3b3JraW5nID0gMDsKIAotI2lmZGVmIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCi0JaW50IHRpbWVyX2Jyb2FkY2FzdCA9IDA7Ci0JY3B1bWFza190IG1hc2sgPSBjcHVtYXNrX29mX2NwdShwci0+aWQpOwotCW9uX2VhY2hfY3B1KHN3aXRjaF9pcGlfdG9fQVBJQ190aW1lciwgJm1hc2ssIDEsIDEpOwotI2VuZGlmCisJcHItPnBvd2VyLnRpbWVyX2Jyb2FkY2FzdF9vbl9zdGF0ZSA9IElOVF9NQVg7CiAKIAlmb3IgKGkgPSAxOyBpIDwgQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSOyBpKyspIHsKIAkJc3RydWN0IGFjcGlfcHJvY2Vzc29yX2N4ICpjeCA9ICZwci0+cG93ZXIuc3RhdGVzW2ldOwpAQCAtOTIwLDIxICsxMDEzLDE0IEBACiAKIAkJY2FzZSBBQ1BJX1NUQVRFX0MyOgogCQkJYWNwaV9wcm9jZXNzb3JfcG93ZXJfdmVyaWZ5X2MyKGN4KTsKLSNpZmRlZiBBUkNIX0FQSUNUSU1FUl9TVE9QU19PTl9DMwotCQkJLyogU29tZSBBTUQgc3lzdGVtcyBmYWtlIEMzIGFzIEMyLCBidXQgc3RpbGwKLQkJCSAgIGhhdmUgdGltZXIgdHJvdWJsZXMgKi8KLQkJCWlmIChjeC0+dmFsaWQgJiYgCi0JCQkJYm9vdF9jcHVfZGF0YS54ODZfdmVuZG9yID09IFg4Nl9WRU5ET1JfQU1EKQotCQkJCXRpbWVyX2Jyb2FkY2FzdCsrOwotI2VuZGlmCisJCQlpZiAoY3gtPnZhbGlkKQorCQkJCWFjcGlfdGltZXJfY2hlY2tfc3RhdGUoaSwgcHIsIGN4KTsKIAkJCWJyZWFrOwogCiAJCWNhc2UgQUNQSV9TVEFURV9DMzoKIAkJCWFjcGlfcHJvY2Vzc29yX3Bvd2VyX3ZlcmlmeV9jMyhwciwgY3gpOwotI2lmZGVmIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCiAJCQlpZiAoY3gtPnZhbGlkKQotCQkJCXRpbWVyX2Jyb2FkY2FzdCsrOwotI2VuZGlmCisJCQkJYWNwaV90aW1lcl9jaGVja19zdGF0ZShpLCBwciwgY3gpOwogCQkJYnJlYWs7CiAJCX0KIApAQCAtOTQyLDEwICsxMDI4LDcgQEAKIAkJCXdvcmtpbmcrKzsKIAl9CiAKLSNpZmRlZiBBUkNIX0FQSUNUSU1FUl9TVE9QU19PTl9DMwotCWlmICh0aW1lcl9icm9hZGNhc3QpCi0JCW9uX2VhY2hfY3B1KHN3aXRjaF9BUElDX3RpbWVyX3RvX2lwaSwgJm1hc2ssIDEsIDEpOwotI2VuZGlmCisJYWNwaV9wcm9wYWdhdGVfdGltZXJfYnJvYWRjYXN0KHByKTsKIAogCXJldHVybiAod29ya2luZyk7CiB9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3BlcmZsaWIuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCmluZGV4IDA1OGYxM2MuLjJmMmU3OTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfcGVyZmxpYi5jCkBAIC00NCwxMCArNDQsOSBAQAogCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVAkweDAxMDAwMDAwCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NMQVNTCQkicHJvY2Vzc29yIgotI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9EUklWRVJfTkFNRQkiQUNQSSBQcm9jZXNzb3IgRHJpdmVyIgogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9GSUxFX1BFUkZPUk1BTkNFCSJwZXJmb3JtYW5jZSIKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3Byb2Nlc3NvciIpCitBQ1BJX01PRFVMRV9OQU1FKCJwcm9jZXNzb3JfcGVyZmxpYiIpOwogCiBzdGF0aWMgREVGSU5FX01VVEVYKHBlcmZvcm1hbmNlX211dGV4KTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Byb2Nlc3Nvcl90aGVybWFsLmMgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYwppbmRleCA0MGZlY2Q2Li4wNmU2ZjNmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYworKysgYi9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3RoZXJtYWwuYwpAQCAtNDEsOSArNDEsOCBAQAogCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NPTVBPTkVOVCAgICAgICAgMHgwMTAwMDAwMAogI2RlZmluZSBBQ1BJX1BST0NFU1NPUl9DTEFTUyAgICAgICAgICAgICJwcm9jZXNzb3IiCi0jZGVmaW5lIEFDUElfUFJPQ0VTU09SX0RSSVZFUl9OQU1FICAgICAgIkFDUEkgUHJvY2Vzc29yIERyaXZlciIKICNkZWZpbmUgX0NPTVBPTkVOVCAgICAgICAgICAgICAgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3Byb2Nlc3NvciIpCitBQ1BJX01PRFVMRV9OQU1FKCJwcm9jZXNzb3JfdGhlcm1hbCIpOwogCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGltaXQgSW50ZXJmYWNlCmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvcHJvY2Vzc29yX3Rocm90dGxpbmcuYyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCmluZGV4IDg5ZGZmMzYuLmIzMzQ4NjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCisrKyBiL2RyaXZlcnMvYWNwaS9wcm9jZXNzb3JfdGhyb3R0bGluZy5jCkBAIC00MSw5ICs0MSw4IEBACiAKICNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfQ09NUE9ORU5UICAgICAgICAweDAxMDAwMDAwCiAjZGVmaW5lIEFDUElfUFJPQ0VTU09SX0NMQVNTICAgICAgICAgICAgInByb2Nlc3NvciIKLSNkZWZpbmUgQUNQSV9QUk9DRVNTT1JfRFJJVkVSX05BTUUgICAgICAiQUNQSSBQcm9jZXNzb3IgRHJpdmVyIgogI2RlZmluZSBfQ09NUE9ORU5UICAgICAgICAgICAgICBBQ1BJX1BST0NFU1NPUl9DT01QT05FTlQKLUFDUElfTU9EVUxFX05BTUUoImFjcGlfcHJvY2Vzc29yIikKK0FDUElfTU9EVUxFX05BTUUoInByb2Nlc3Nvcl90aHJvdHRsaW5nIik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJvdHRsaW5nIENvbnRyb2wKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zYnMuYyBiL2RyaXZlcnMvYWNwaS9zYnMuYwppbmRleCBmNThmYzc0Li4xZWFiMjAzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvc2JzLmMKKysrIGIvZHJpdmVycy9hY3BpL3Nicy5jCkBAIC01OSw3ICs1OSw2IEBACiAjZGVmaW5lIEFDUElfQUNfQ0xBU1MJCQkiYWNfYWRhcHRlciIKICNkZWZpbmUgQUNQSV9CQVRURVJZX0NMQVNTCQkiYmF0dGVyeSIKICNkZWZpbmUgQUNQSV9TQlNfSElECQkJIkFDUEkwMDAyIgotI2RlZmluZSBBQ1BJX1NCU19EUklWRVJfTkFNRQkJIkFDUEkgU21hcnQgQmF0dGVyeSBTeXN0ZW0gRHJpdmVyIgogI2RlZmluZSBBQ1BJX1NCU19ERVZJQ0VfTkFNRQkJIlNtYXJ0IEJhdHRlcnkgU3lzdGVtIgogI2RlZmluZSBBQ1BJX1NCU19GSUxFX0lORk8JCSJpbmZvIgogI2RlZmluZSBBQ1BJX1NCU19GSUxFX1NUQVRFCQkic3RhdGUiCkBAIC03OCw3ICs3Nyw3IEBACiAjZGVmaW5lCU1BWF9TQlNfQkFUCQkJNAogI2RlZmluZQlNQVhfU01CVVNfRVJSCQkJMQogCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3NicyIpOworQUNQSV9NT0RVTEVfTkFNRSgic2JzIik7CiAKIE1PRFVMRV9BVVRIT1IoIlJpY2ggVG93bnNlbmQiKTsKIE1PRFVMRV9ERVNDUklQVElPTigiU21hcnQgQmF0dGVyeSBTeXN0ZW0gQUNQSSBpbnRlcmZhY2UgZHJpdmVyIik7CkBAIC0xMTAsNyArMTA5LDcgQEAKIHN0YXRpYyB2b2lkIGFjcGlfc2JzX3VwZGF0ZV9xdWV1ZSh2b2lkICpkYXRhKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3Nic19kcml2ZXIgPSB7Ci0JLm5hbWUgPSBBQ1BJX1NCU19EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJzYnMiLAogCS5jbGFzcyA9IEFDUElfU0JTX0NMQVNTLAogCS5pZHMgPSBBQ1BJX1NCU19ISUQsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9zY2FuLmMgYi9kcml2ZXJzL2FjcGkvc2Nhbi5jCmluZGV4IDY0ZjI2ZGIuLmJiMGUwZGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zY2FuLmMKKysrIGIvZHJpdmVycy9hY3BpL3NjYW4uYwpAQCAtMTEsMTMgKzExLDEyIEBACiAjaW5jbHVkZSA8YWNwaS9hY2ludGVycC5oPgkvKiBmb3IgYWNwaV9leF9laXNhX2lkX3RvX3N0cmluZygpICovCiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CVVNfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJzY2FuIikKK0FDUElfTU9EVUxFX05BTUUoInNjYW4iKTsKICNkZWZpbmUgU1RSVUNUX1RPX0lOVChzKQkoKigoaW50KikmcykpCiBleHRlcm4gc3RydWN0IGFjcGlfZGV2aWNlICphY3BpX3Jvb3Q7CiAKICNkZWZpbmUgQUNQSV9CVVNfQ0xBU1MJCQkic3lzdGVtX2J1cyIKICNkZWZpbmUgQUNQSV9CVVNfSElECQkJIkFDUElfQlVTIgotI2RlZmluZSBBQ1BJX0JVU19EUklWRVJfTkFNRQkJIkFDUEkgQnVzIERyaXZlciIKICNkZWZpbmUgQUNQSV9CVVNfREVWSUNFX05BTUUJCSJTeXN0ZW0gQnVzIgogCiBzdGF0aWMgTElTVF9IRUFEKGFjcGlfZGV2aWNlX2xpc3QpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3N5c3RlbS5jIGIvZHJpdmVycy9hY3BpL3N5c3RlbS5jCmluZGV4IDcxNDdiMGIuLjgzYThkMzAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9zeXN0ZW0uYworKysgYi9kcml2ZXJzL2FjcGkvc3lzdGVtLmMKQEAgLTMxLDE0ICszMSwxMyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9TWVNURU1fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3N5c3RlbSIpCitBQ1BJX01PRFVMRV9OQU1FKCJzeXN0ZW0iKTsKICNpZmRlZiBNT0RVTEVfUEFSQU1fUFJFRklYCiAjdW5kZWYgTU9EVUxFX1BBUkFNX1BSRUZJWAogI2VuZGlmCiAjZGVmaW5lIE1PRFVMRV9QQVJBTV9QUkVGSVggImFjcGkuIgogCiAjZGVmaW5lIEFDUElfU1lTVEVNX0NMQVNTCQkic3lzdGVtIgotI2RlZmluZSBBQ1BJX1NZU1RFTV9EUklWRVJfTkFNRQkJIkFDUEkgU3lzdGVtIERyaXZlciIKICNkZWZpbmUgQUNQSV9TWVNURU1fREVWSUNFX05BTUUJCSJTeXN0ZW0iCiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfSU5GTwkJImluZm8iCiAjZGVmaW5lIEFDUElfU1lTVEVNX0ZJTEVfRVZFTlQJCSJldmVudCIKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS90YWJsZXMuYyBiL2RyaXZlcnMvYWNwaS90YWJsZXMuYwppbmRleCA0NWJkMTczLi44NDllMmMzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzLmMKKysrIGIvZHJpdmVycy9hY3BpL3RhYmxlcy5jCkBAIC0xNjksNDAgKzE2OSw0MCBAQAogCiAKIGludCBfX2luaXQKLWFjcGlfdGFibGVfcGFyc2VfbWFkdF9mYW1pbHkoY2hhciAqaWQsCi0JCQkgICAgIHVuc2lnbmVkIGxvbmcgbWFkdF9zaXplLAorYWNwaV90YWJsZV9wYXJzZV9lbnRyaWVzKGNoYXIgKmlkLAorCQkJICAgICB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUsCiAJCQkgICAgIGludCBlbnRyeV9pZCwKLQkJCSAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwKKwkJCSAgICAgYWNwaV90YWJsZV9lbnRyeV9oYW5kbGVyIGhhbmRsZXIsCiAJCQkgICAgIHVuc2lnbmVkIGludCBtYXhfZW50cmllcykKIHsKLQlzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKm1hZHQgPSBOVUxMOworCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGVfaGVhZGVyID0gTlVMTDsKIAlzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmVudHJ5OwogCXVuc2lnbmVkIGludCBjb3VudCA9IDA7Ci0JdW5zaWduZWQgbG9uZyBtYWR0X2VuZDsKKwl1bnNpZ25lZCBsb25nIHRhYmxlX2VuZDsKIAogCWlmICghaGFuZGxlcikKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQkvKiBMb2NhdGUgdGhlIE1BRFQgKGlmIGV4aXN0cykuIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZS4gKi8KLQlhY3BpX2dldF90YWJsZShpZCwgMCwgJm1hZHQpOworCS8qIExvY2F0ZSB0aGUgdGFibGUgKGlmIGV4aXN0cykuIFRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZS4gKi8KKwlhY3BpX2dldF90YWJsZShpZCwgMCwgJnRhYmxlX2hlYWRlcik7CiAKLQlpZiAoIW1hZHQpIHsKKwlpZiAoIXRhYmxlX2hlYWRlcikgewogCQlwcmludGsoS0VSTl9XQVJOSU5HIFBSRUZJWCAiJTQuNHMgbm90IHByZXNlbnRcbiIsIGlkKTsKIAkJcmV0dXJuIC1FTk9ERVY7CiAJfQogCi0JbWFkdF9lbmQgPSAodW5zaWduZWQgbG9uZyltYWR0ICsgbWFkdC0+bGVuZ3RoOworCXRhYmxlX2VuZCA9ICh1bnNpZ25lZCBsb25nKXRhYmxlX2hlYWRlciArIHRhYmxlX2hlYWRlci0+bGVuZ3RoOwogCiAJLyogUGFyc2UgYWxsIGVudHJpZXMgbG9va2luZyBmb3IgYSBtYXRjaC4gKi8KIAogCWVudHJ5ID0gKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlciAqKQotCSAgICAoKHVuc2lnbmVkIGxvbmcpbWFkdCArIG1hZHRfc2l6ZSk7CisJICAgICgodW5zaWduZWQgbG9uZyl0YWJsZV9oZWFkZXIgKyB0YWJsZV9zaXplKTsKIAogCXdoaWxlICgoKHVuc2lnbmVkIGxvbmcpZW50cnkpICsgc2l6ZW9mKHN0cnVjdCBhY3BpX3N1YnRhYmxlX2hlYWRlcikgPAotCSAgICAgICBtYWR0X2VuZCkgeworCSAgICAgICB0YWJsZV9lbmQpIHsKIAkJaWYgKGVudHJ5LT50eXBlID09IGVudHJ5X2lkCiAJCSAgICAmJiAoIW1heF9lbnRyaWVzIHx8IGNvdW50KysgPCBtYXhfZW50cmllcykpCi0JCQlpZiAoaGFuZGxlcihlbnRyeSwgbWFkdF9lbmQpKQorCQkJaWYgKGhhbmRsZXIoZW50cnksIHRhYmxlX2VuZCkpCiAJCQkJcmV0dXJuIC1FSU5WQUw7CiAKIAkJZW50cnkgPSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICopCkBAIC0yMTgsMTMgKzIxOCwyMiBAQAogCiBpbnQgX19pbml0CiBhY3BpX3RhYmxlX3BhcnNlX21hZHQoZW51bSBhY3BpX21hZHRfdHlwZSBpZCwKLQkJICAgICAgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQorCQkgICAgICBhY3BpX3RhYmxlX2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKQogewotCXJldHVybiBhY3BpX3RhYmxlX3BhcnNlX21hZHRfZmFtaWx5KEFDUElfU0lHX01BRFQsCisJcmV0dXJuIGFjcGlfdGFibGVfcGFyc2VfZW50cmllcyhBQ1BJX1NJR19NQURULAogCQkJCQkgICAgc2l6ZW9mKHN0cnVjdCBhY3BpX3RhYmxlX21hZHQpLCBpZCwKIAkJCQkJICAgIGhhbmRsZXIsIG1heF9lbnRyaWVzKTsKIH0KIAorLyoqCisgKiBhY3BpX3RhYmxlX3BhcnNlIC0gZmluZCB0YWJsZSB3aXRoIEBpZCwgcnVuIEBoYW5kbGVyIG9uIGl0CisgKgorICogQGlkOiB0YWJsZSBpZCB0byBmaW5kCisgKiBAaGFuZGxlcjogaGFuZGxlciB0byBydW4KKyAqCisgKiBTY2FuIHRoZSBBQ1BJIFN5c3RlbSBEZXNjcmlwdG9yIFRhYmxlIChTVEQpIGZvciBhIHRhYmxlIG1hdGNoaW5nIEBpZCwKKyAqIHJ1biBAaGFuZGxlciBvbiBpdC4gIFJldHVybiAwIGlmIHRhYmxlIGZvdW5kLCByZXR1cm4gb24gaWYgbm90LgorICovCiBpbnQgX19pbml0IGFjcGlfdGFibGVfcGFyc2UoY2hhciAqaWQsIGFjcGlfdGFibGVfaGFuZGxlciBoYW5kbGVyKQogewogCXN0cnVjdCBhY3BpX3RhYmxlX2hlYWRlciAqdGFibGUgPSBOVUxMOwpAQCAtMjM0LDkgKzI0Myw5IEBACiAJYWNwaV9nZXRfdGFibGUoaWQsIDAsICZ0YWJsZSk7CiAJaWYgKHRhYmxlKSB7CiAJCWhhbmRsZXIodGFibGUpOwotCQlyZXR1cm4gMTsKLQl9IGVsc2UKIAkJcmV0dXJuIDA7CisJfSBlbHNlCisJCXJldHVybiAxOwogfQogCiAvKgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3RhYmxlcy90YnhmYWNlLmMgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYwppbmRleCA4MDc5NzhkLi40MTdlZjVmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYworKysgYi9kcml2ZXJzL2FjcGkvdGFibGVzL3RieGZhY2UuYwpAQCAtMzM4LDkgKzMzOCw5IEBACiAJaW50IGk7CiAJYWNwaV9zdGF0dXMgc3RhdHVzID0gQUVfTk9UX0VYSVNUOwogCi0JQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3VubG9hZF90YWJsZSk7CisJQUNQSV9GVU5DVElPTl9UUkFDRShhY3BpX3VubG9hZF90YWJsZV9pZCk7CiAKLQkvKiBGaW5kIHRhYmxlIGZyb20gdGhlIHJlcXVlc3RlZCB0eXBlIGxpc3QgKi8KKwkvKiBGaW5kIHRhYmxlIGluIHRoZSBnbG9iYWwgdGFibGUgbGlzdCAqLwogCWZvciAoaSA9IDA7IGkgPCBhY3BpX2dibF9yb290X3RhYmxlX2xpc3QuY291bnQ7ICsraSkgewogCQlpZiAoaWQgIT0gYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5vd25lcl9pZCkgewogCQkJY29udGludWU7CkBAIC0zNTIsOCArMzUyLDkgQEAKIAkJKiBzaW1wbHkgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIGhpZXJhcmNoeQogCQkqLwogCQlhY3BpX3RiX2RlbGV0ZV9uYW1lc3BhY2VfYnlfb3duZXIoaSk7Ci0JCWFjcGlfdGJfcmVsZWFzZV9vd25lcl9pZChpKTsKKwkJc3RhdHVzID0gYWNwaV90Yl9yZWxlYXNlX293bmVyX2lkKGkpOwogCQlhY3BpX3RiX3NldF90YWJsZV9sb2FkZWRfZmxhZyhpLCBGQUxTRSk7CisJCWJyZWFrOwogCX0KIAlyZXR1cm5fQUNQSV9TVEFUVVMoc3RhdHVzKTsKIH0KQEAgLTQwOCw3ICs0MDksNyBAQAogCQl9CiAKIAkJaWYgKCFhY3BpX2dibF9wZXJtYW5lbnRfbW1hcCkgewotCQkJYWNwaV9nYmxfcm9vdF90YWJsZV9saXN0LnRhYmxlc1tpXS5wb2ludGVyID0gMDsKKwkJCWFjcGlfZ2JsX3Jvb3RfdGFibGVfbGlzdC50YWJsZXNbaV0ucG9pbnRlciA9IE5VTEw7CiAJCX0KIAogCQlyZXR1cm4gKHN0YXR1cyk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jIGIvZHJpdmVycy9hY3BpL3RoZXJtYWwuYwppbmRleCA3MTE4YWM2Li4wYWU4YjkzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdGhlcm1hbC5jCisrKyBiL2RyaXZlcnMvYWNwaS90aGVybWFsLmMKQEAgLTQ3LDcgKzQ3LDYgQEAKIAogI2RlZmluZSBBQ1BJX1RIRVJNQUxfQ09NUE9ORU5UCQkweDA0MDAwMDAwCiAjZGVmaW5lIEFDUElfVEhFUk1BTF9DTEFTUwkJInRoZXJtYWxfem9uZSIKLSNkZWZpbmUgQUNQSV9USEVSTUFMX0RSSVZFUl9OQU1FCSJBQ1BJIFRoZXJtYWwgWm9uZSBEcml2ZXIiCiAjZGVmaW5lIEFDUElfVEhFUk1BTF9ERVZJQ0VfTkFNRQkiVGhlcm1hbCBab25lIgogI2RlZmluZSBBQ1BJX1RIRVJNQUxfRklMRV9TVEFURQkJInN0YXRlIgogI2RlZmluZSBBQ1BJX1RIRVJNQUxfRklMRV9URU1QRVJBVFVSRQkidGVtcGVyYXR1cmUiCkBAIC03MSwxMCArNzAsMTAgQEAKICNkZWZpbmUgQ0VMU0lVU19UT19LRUxWSU4odCkJKCh0KzI3MykqMTApCiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9USEVSTUFMX0NPTVBPTkVOVAotQUNQSV9NT0RVTEVfTkFNRSgiYWNwaV90aGVybWFsIikKK0FDUElfTU9EVUxFX05BTUUoInRoZXJtYWwiKTsKIAogTU9EVUxFX0FVVEhPUigiUGF1bCBEaWVmZW5iYXVnaCIpOwotTU9EVUxFX0RFU0NSSVBUSU9OKEFDUElfVEhFUk1BTF9EUklWRVJfTkFNRSk7CitNT0RVTEVfREVTQ1JJUFRJT04oIkFDUEkgVGhlcm1hbCBab25lIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgaW50IHR6cDsKQEAgLTk5LDcgKzk4LDcgQEAKIAkJCQkJICBzaXplX3QsIGxvZmZfdCAqKTsKIAogc3RhdGljIHN0cnVjdCBhY3BpX2RyaXZlciBhY3BpX3RoZXJtYWxfZHJpdmVyID0gewotCS5uYW1lID0gQUNQSV9USEVSTUFMX0RSSVZFUl9OQU1FLAorCS5uYW1lID0gInRoZXJtYWwiLAogCS5jbGFzcyA9IEFDUElfVEhFUk1BTF9DTEFTUywKIAkuaWRzID0gQUNQSV9USEVSTUFMX0hJRCwKIAkub3BzID0gewpAQCAtMjcwLDcgKzI2OSw3IEBACiAKIAlBQ1BJX0RFQlVHX1BSSU5UKChBQ1BJX0RCX0lORk8sCiAJCQkgICJQb2xsaW5nIGZyZXF1ZW5jeSBzZXQgdG8gJWx1IHNlY29uZHNcbiIsCi0JCQkgIHR6LT5wb2xsaW5nX2ZyZXF1ZW5jeSkpOworCQkJICB0ei0+cG9sbGluZ19mcmVxdWVuY3kvMTApKTsKIAogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jIGIvZHJpdmVycy9hY3BpL3Rvc2hpYmFfYWNwaS5jCmluZGV4IGQ5YjY1MWYuLmZhZjhhNTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS90b3NoaWJhX2FjcGkuYworKysgYi9kcml2ZXJzL2FjcGkvdG9zaGliYV9hY3BpLmMKQEAgLTEyNSw3ICsxMjUsNyBAQAogCXVuaW9uIGFjcGlfb2JqZWN0IGluX29ianNbMV07CiAJYWNwaV9zdGF0dXMgc3RhdHVzOwogCi0JcGFyYW1zLmNvdW50ID0gc2l6ZW9mKGluX29ianMpIC8gc2l6ZW9mKGluX29ianNbMF0pOworCXBhcmFtcy5jb3VudCA9IEFSUkFZX1NJWkUoaW5fb2Jqcyk7CiAJcGFyYW1zLnBvaW50ZXIgPSBpbl9vYmpzOwogCWluX29ianNbMF0udHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOwogCWluX29ianNbMF0uaW50ZWdlci52YWx1ZSA9IHZhbDsKQEAgLTU2MSwxMCArNTYxLDYgQEAKIAlpZiAoYWNwaV9kaXNhYmxlZCkKIAkJcmV0dXJuIC1FTk9ERVY7CiAKLQlpZiAoIWFjcGlfc3BlY2lmaWNfaG90a2V5X2VuYWJsZWQpIHsKLQkJcHJpbnRrKE1ZX0lORk8gIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KIAkvKiBzaW1wbGUgZGV2aWNlIGRldGVjdGlvbjogbG9vayBmb3IgSENJIG1ldGhvZCAqLwogCWlmIChpc192YWxpZF9hY3BpX3BhdGgoTUVUSE9EX0hDSV8xKSkKIAkJbWV0aG9kX2hjaSA9IE1FVEhPRF9IQ0lfMTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYyBiL2RyaXZlcnMvYWNwaS91dGlsaXRpZXMvdXRkZWxldGUuYwppbmRleCBmNzc3Y2ViLi42NzNhMGNhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbGl0aWVzL3V0ZGVsZXRlLmMKKysrIGIvZHJpdmVycy9hY3BpL3V0aWxpdGllcy91dGRlbGV0ZS5jCkBAIC0xNzAsNyArMTcwLDYgQEAKIAkJCWFjcGlfb3NfZGVsZXRlX211dGV4KG9iamVjdC0+bXV0ZXgub3NfbXV0ZXgpOwogCQkJYWNwaV9nYmxfZ2xvYmFsX2xvY2tfbXV0ZXggPSBOVUxMOwogCQl9IGVsc2UgewotCQkJYWNwaV9leF91bmxpbmtfbXV0ZXgob2JqZWN0KTsKIAkJCWFjcGlfb3NfZGVsZXRlX211dGV4KG9iamVjdC0+bXV0ZXgub3NfbXV0ZXgpOwogCQl9CiAJCWJyZWFrOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3V0aWxzLmMgYi9kcml2ZXJzL2FjcGkvdXRpbHMuYwppbmRleCA2OGE4MDlmLi4zNGYxNTc1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdXRpbHMuYworKysgYi9kcml2ZXJzL2FjcGkvdXRpbHMuYwpAQCAtMzEsNyArMzEsNyBAQAogI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CiAKICNkZWZpbmUgX0NPTVBPTkVOVAkJQUNQSV9CVVNfQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3V0aWxzIikKK0FDUElfTU9EVUxFX05BTUUoInV0aWxzIik7CiAKIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IEV2YWx1YXRpb24gSGVscGVycwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL3ZpZGVvLmMgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwppbmRleCBlMGI5N2FkLi5iZjUyNWNjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2FjcGkvdmlkZW8uYworKysgYi9kcml2ZXJzL2FjcGkvdmlkZW8uYwpAQCAtNDAsNyArNDAsNiBAQAogCiAjZGVmaW5lIEFDUElfVklERU9fQ09NUE9ORU5UCQkweDA4MDAwMDAwCiAjZGVmaW5lIEFDUElfVklERU9fQ0xBU1MJCSJ2aWRlbyIKLSNkZWZpbmUgQUNQSV9WSURFT19EUklWRVJfTkFNRQkJIkFDUEkgVmlkZW8gRHJpdmVyIgogI2RlZmluZSBBQ1BJX1ZJREVPX0JVU19OQU1FCQkiVmlkZW8gQnVzIgogI2RlZmluZSBBQ1BJX1ZJREVPX0RFVklDRV9OQU1FCQkiVmlkZW8gRGV2aWNlIgogI2RlZmluZSBBQ1BJX1ZJREVPX05PVElGWV9TV0lUQ0gJMHg4MApAQCAtNjUsMTcgKzY0LDE3IEBACiAjZGVmaW5lIEFDUElfVklERU9fRElTUExBWV9MQ0QJNAogCiAjZGVmaW5lIF9DT01QT05FTlQJCUFDUElfVklERU9fQ09NUE9ORU5UCi1BQ1BJX01PRFVMRV9OQU1FKCJhY3BpX3ZpZGVvIikKK0FDUElfTU9EVUxFX05BTUUoInZpZGVvIik7CiAKLSAgICBNT0RVTEVfQVVUSE9SKCJCcnVubyBEdWNyb3QiKTsKLU1PRFVMRV9ERVNDUklQVElPTihBQ1BJX1ZJREVPX0RSSVZFUl9OQU1FKTsKK01PRFVMRV9BVVRIT1IoIkJydW5vIER1Y3JvdCIpOworTU9EVUxFX0RFU0NSSVBUSU9OKCJBQ1BJIFZpZGVvIERyaXZlciIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX2FkZChzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSk7CiBzdGF0aWMgaW50IGFjcGlfdmlkZW9fYnVzX3JlbW92ZShzdHJ1Y3QgYWNwaV9kZXZpY2UgKmRldmljZSwgaW50IHR5cGUpOwogCiBzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIGFjcGlfdmlkZW9fYnVzID0gewotCS5uYW1lID0gQUNQSV9WSURFT19EUklWRVJfTkFNRSwKKwkubmFtZSA9ICJ2aWRlbyIsCiAJLmNsYXNzID0gQUNQSV9WSURFT19DTEFTUywKIAkuaWRzID0gQUNQSV9WSURFT19ISUQsCiAJLm9wcyA9IHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMgYi9kcml2ZXJzL2F0YS9saWJhdGEtY29yZS5jCmluZGV4IDI1ZDhkM2YuLjJjZjgyNTEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL2xpYmF0YS1jb3JlLmMKKysrIGIvZHJpdmVycy9hdGEvbGliYXRhLWNvcmUuYwpAQCAtMTQxMCw3ICsxNDEwLDE2IEBACiAJfQogCiAJdGYucHJvdG9jb2wgPSBBVEFfUFJPVF9QSU87Ci0JdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX1BPTExJTkc7IC8qIGZvciBwb2xsaW5nIHByZXNlbmNlIGRldGVjdGlvbiAqLworCisJLyogU29tZSBkZXZpY2VzIGNob2tlIGlmIFRGIHJlZ2lzdGVycyBjb250YWluIGdhcmJhZ2UuICBNYWtlCisJICogc3VyZSB0aG9zZSBhcmUgcHJvcGVybHkgaW5pdGlhbGl6ZWQuCisJICovCisJdGYuZmxhZ3MgfD0gQVRBX1RGTEFHX0lTQUREUiB8IEFUQV9URkxBR19ERVZJQ0U7CisKKwkvKiBEZXZpY2UgcHJlc2VuY2UgZGV0ZWN0aW9uIGlzIHVucmVsaWFibGUgb24gc29tZQorCSAqIGNvbnRyb2xsZXJzLiAgQWx3YXlzIHBvbGwgSURFTlRJRlkgaWYgYXZhaWxhYmxlLgorCSAqLworCXRmLmZsYWdzIHw9IEFUQV9URkxBR19QT0xMSU5HOwogCiAJZXJyX21hc2sgPSBhdGFfZXhlY19pbnRlcm5hbChkZXYsICZ0ZiwgTlVMTCwgRE1BX0ZST01fREVWSUNFLAogCQkJCSAgICAgaWQsIHNpemVvZihpZFswXSkgKiBBVEFfSURfV09SRFMpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYyBiL2RyaXZlcnMvYXRhL3BhdGFfbGVnYWN5LmMKaW5kZXggNDIyM2UxMC4uOThjMWZlZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9hdGEvcGF0YV9sZWdhY3kuYworKysgYi9kcml2ZXJzL2F0YS9wYXRhX2xlZ2FjeS5jCkBAIC04OSw5ICs4OSwxMCBAQAogc3RhdGljIGludCBodDY1NjBhOwkJCS8qIEhUIDY1NjBBIG9uIHByaW1hcnkgMSwgc2Vjb25kYXJ5IDIsIGJvdGggMyAqLwogc3RhdGljIGludCBodDY1NjBiOwkJCS8qIEhUIDY1NjBBIG9uIHByaW1hcnkgMSwgc2Vjb25kYXJ5IDIsIGJvdGggMyAqLwogc3RhdGljIGludCBvcHRpODJjNjExYTsJCQkvKiBPcHRpODJjNjExQSBvbiBwcmltYXJ5IDEsIHNlY29uZGFyeSAyLCBib3RoIDMgKi8KLXN0YXRpYyBpbnQgb3B0aTgyYzQ2eDsJCS8qIE9wdGkgODJjNDY1TVYgcHJlc2VudCAocHJpL3NlYyBhdXRvZGV0ZWN0KSAqLworc3RhdGljIGludCBvcHRpODJjNDZ4OwkJCS8qIE9wdGkgODJjNDY1TVYgcHJlc2VudCAocHJpL3NlYyBhdXRvZGV0ZWN0KSAqLwogc3RhdGljIGludCBhdXRvc3BlZWQ7CQkJLyogQ2hpcCBwcmVzZW50IHdoaWNoIHNub29wcyBzcGVlZCBjaGFuZ2VzICovCiBzdGF0aWMgaW50IHBpb19tYXNrID0gMHgxRjsJCS8qIFBJTyByYW5nZSBmb3IgYXV0b3NwZWVkIGRldmljZXMgKi8KK3N0YXRpYyBpbnQgaW9yZHlfbWFzayA9IDB4RkZGRkZGRkY7CS8qIFVzZSBpb3JkeSBpZiBhdmFpbGFibGUgKi8KIAogLyoqCiAgKglsZWdhY3lfc2V0X21vZGUJCS0JbW9kZSBzZXR0aW5nCkBAIC0xMTMsNiArMTE0LDcgQEAKIAlmb3IgKGkgPSAwOyBpIDwgQVRBX01BWF9ERVZJQ0VTOyBpKyspIHsKIAkJc3RydWN0IGF0YV9kZXZpY2UgKmRldiA9ICZhcC0+ZGV2aWNlW2ldOwogCQlpZiAoYXRhX2Rldl9lbmFibGVkKGRldikpIHsKKwkJCWF0YV9kZXZfcHJpbnRrKGRldiwgS0VSTl9JTkZPLCAiY29uZmlndXJlZCBmb3IgUElPXG4iKTsKIAkJCWRldi0+cGlvX21vZGUgPSBYRkVSX1BJT18wOwogCQkJZGV2LT54ZmVyX21vZGUgPSBYRkVSX1BJT18wOwogCQkJZGV2LT54ZmVyX3NoaWZ0ID0gQVRBX1NISUZUX1BJTzsKQEAgLTY5NSw2ICs2OTcsNyBAQAogCXZvaWQgX19pb21lbSAqaW9fYWRkciwgKmN0cmxfYWRkcjsKIAlpbnQgcGlvX21vZGVzID0gcGlvX21hc2s7CiAJdTMyIG1hc2sgPSAoMSA8PCBwb3J0KTsKKwl1MzIgaW9yZHkgPSAoaW9yZHlfbWFzayAmIG1hc2spID8gMDogQVRBX0ZMQUdfTk9fSU9SRFk7CiAJaW50IHJldDsKIAogCXBkZXYgPSBwbGF0Zm9ybV9kZXZpY2VfcmVnaXN0ZXJfc2ltcGxlKERSVl9OQU1FLCBucl9sZWdhY3lfaG9zdCwgTlVMTCwgMCk7CkBAIC03MTUsNiArNzE4LDcgQEAKIAlpZiAoaHQ2NTYwYSAmIG1hc2spIHsKIAkJb3BzID0gJmh0NjU2MGFfcG9ydF9vcHM7CiAJCXBpb19tb2RlcyA9IDB4MDc7CisJCWlvcmR5ID0gQVRBX0ZMQUdfTk9fSU9SRFk7CiAJfQogCWlmIChodDY1NjBiICYgbWFzaykgewogCQlvcHMgPSAmaHQ2NTYwYl9wb3J0X29wczsKQEAgLTc1MCw2ICs3NTQsNyBAQAogCQkJcHJpbnRrKEtFUk5fSU5GTyAiUERDMjAyMzAtQy8yMDYzMCBWTEIgQVRBIGNvbnRyb2xsZXIgZGV0ZWN0ZWQuXG4iKTsKIAkJCQlwaW9fbW9kZXMgPSAweDA3OwogCQkJb3BzID0gJnBkYzIwMjMwX3BvcnRfb3BzOworCQkJaW9yZHkgPSBBVEFfRkxBR19OT19JT1JEWTsKIAkJCXVkZWxheSgxMDApOwogCQkJaW5iKDB4MUY1KTsKIAkJfSBlbHNlIHsKQEAgLTc2Nyw2ICs3NzIsNyBAQAogCS8qIENoaXAgZG9lcyBtb2RlIHNldHRpbmcgYnkgY29tbWFuZCBzbm9vcGluZyAqLwogCWlmIChvcHMgPT0gJmxlZ2FjeV9wb3J0X29wcyAmJiAoYXV0b3NwZWVkICYgbWFzaykpCiAJCW9wcyA9ICZzaW1wbGVfcG9ydF9vcHM7CisKIAltZW1zZXQoJmFlLCAwLCBzaXplb2Yoc3RydWN0IGF0YV9wcm9iZV9lbnQpKTsKIAlJTklUX0xJU1RfSEVBRCgmYWUubm9kZSk7CiAJYWUuZGV2ID0gJnBkZXYtPmRldjsKQEAgLTc3Niw3ICs3ODIsNyBAQAogCWFlLnBpb19tYXNrID0gcGlvX21vZGVzOwogCWFlLmlycSA9IGlycTsKIAlhZS5pcnFfZmxhZ3MgPSAwOwotCWFlLnBvcnRfZmxhZ3MgPSBBVEFfRkxBR19TTEFWRV9QT1NTfEFUQV9GTEFHX1NSU1Q7CisJYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1N8QVRBX0ZMQUdfU1JTVHxpb3JkeTsKIAlhZS5wb3J0WzBdLmNtZF9hZGRyID0gaW9fYWRkcjsKIAlhZS5wb3J0WzBdLmFsdHN0YXR1c19hZGRyID0gY3RybF9hZGRyOwogCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBjdHJsX2FkZHI7CkBAIC05NDUsNiArOTUxLDcgQEAKIG1vZHVsZV9wYXJhbShvcHRpODJjNjExYSwgaW50LCAwKTsKIG1vZHVsZV9wYXJhbShvcHRpODJjNDZ4LCBpbnQsIDApOwogbW9kdWxlX3BhcmFtKHBpb19tYXNrLCBpbnQsIDApOworbW9kdWxlX3BhcmFtKGlvcmR5X21hc2ssIGludCwgMCk7CiAKIG1vZHVsZV9pbml0KGxlZ2FjeV9pbml0KTsKIG1vZHVsZV9leGl0KGxlZ2FjeV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfcWRpLmMgYi9kcml2ZXJzL2F0YS9wYXRhX3FkaS5jCmluZGV4IDFiM2I0ZWQuLjQzNjIxNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3BhdGFfcWRpLmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9xZGkuYwpAQCAtMjY0LDE2ICsyNjQsMTggQEAKIAlpZiAodHlwZSA9PSA2NTgwKSB7CiAJCWFlLnBvcnRfb3BzID0gJnFkaTY1ODBfcG9ydF9vcHM7CiAJCWFlLnBpb19tYXNrID0gMHgxRjsKKwkJYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNUOwogCX0gZWxzZSB7CiAJCWFlLnBvcnRfb3BzID0gJnFkaTY1MDBfcG9ydF9vcHM7CiAJCWFlLnBpb19tYXNrID0gMHgwNzsJLyogQWN0dWFsbHkgUElPMyAhSU9SRFkgaXMgcG9zc2libGUgKi8KKwkJYWUucG9ydF9mbGFncyA9IEFUQV9GTEFHX1NMQVZFX1BPU1MgfCBBVEFfRkxBR19TUlNUIHwKKwkJCQlBVEFfRkxBR19OT19JT1JEWTsKIAl9CiAKIAlhZS5zaHQgPSAmcWRpX3NodDsKIAlhZS5uX3BvcnRzID0gMTsKIAlhZS5pcnEgPSBpcnE7CiAJYWUuaXJxX2ZsYWdzID0gMDsKLQlhZS5wb3J0X2ZsYWdzID0gQVRBX0ZMQUdfU0xBVkVfUE9TUyB8IEFUQV9GTEFHX1NSU1Q7CiAJYWUucG9ydFswXS5jbWRfYWRkciA9IGlvX2FkZHI7CiAJYWUucG9ydFswXS5hbHRzdGF0dXNfYWRkciA9IGN0bF9hZGRyOwogCWFlLnBvcnRbMF0uY3RsX2FkZHIgPSBjdGxfYWRkcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYyBiL2RyaXZlcnMvYXRhL3BhdGFfc2w4MmMxMDUuYwppbmRleCBmMmZhMTU4Li45NmU4OTBmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9wYXRhX3NsODJjMTA1LmMKKysrIGIvZHJpdmVycy9hdGEvcGF0YV9zbDgyYzEwNS5jCkBAIC0xODcsNyArMTg3LDkgQEAKIHsKIAlzdHJ1Y3QgYXRhX3BvcnQgKmFwID0gcWMtPmFwOwogCisJdWRlbGF5KDEwMCk7CiAJc2w4MmMxMDVfcmVzZXRfZW5naW5lKGFwKTsKKwl1ZGVsYXkoMTAwKTsKIAogCS8qIFNldCB0aGUgY2xvY2tzIGZvciBETUEgKi8KIAlzbDgyYzEwNV9jb25maWd1cmVfZG1hbW9kZShhcCwgcWMtPmRldik7CkBAIC0yMTYsNiArMjE4LDcgQEAKIAogCWF0YV9ibWRtYV9zdG9wKHFjKTsKIAlzbDgyYzEwNV9yZXNldF9lbmdpbmUoYXApOworCXVkZWxheSgxMDApOwogCiAJLyogVGhpcyB3aWxsIHJlZG8gdGhlIGluaXRpYWwgc2V0dXAgb2YgdGhlIERNQSBkZXZpY2UgdG8gbWF0Y2hpbmcKIAkgICBQSU8gdGltaW5ncyAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9udi5jIGIvZHJpdmVycy9hdGEvc2F0YV9udi5jCmluZGV4IDA5NWVmMWIuLmFiOTJmMjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYXRhL3NhdGFfbnYuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX252LmMKQEAgLTgyNyw3ICs4MjcsOCBAQAogCQkJLyogZnJlZXplIGlmIGhvdHBsdWdnZWQgb3IgY29udHJvbGxlciBlcnJvciAqLwogCQkJaWYgKHVubGlrZWx5KHN0YXR1cyAmIChOVl9BRE1BX1NUQVRfSE9UUExVRyB8CiAJCQkJCSAgICAgICBOVl9BRE1BX1NUQVRfSE9UVU5QTFVHIHwKLQkJCQkJICAgICAgIE5WX0FETUFfU1RBVF9USU1FT1VUKSkpIHsKKwkJCQkJICAgICAgIE5WX0FETUFfU1RBVF9USU1FT1VUIHwKKwkJCQkJICAgICAgIE5WX0FETUFfU1RBVF9TRVJST1IpKSkgewogCQkJCXN0cnVjdCBhdGFfZWhfaW5mbyAqZWhpID0gJmFwLT5laF9pbmZvOwogCiAJCQkJYXRhX2VoaV9jbGVhcl9kZXNjKGVoaSk7CkBAIC04NDEsNiArODQyLDkgQEAKIAkJCQl9IGVsc2UgaWYgKHN0YXR1cyAmIE5WX0FETUFfU1RBVF9IT1RVTlBMVUcpIHsKIAkJCQkJYXRhX2VoaV9ob3RwbHVnZ2VkKGVoaSk7CiAJCQkJCWF0YV9laGlfcHVzaF9kZXNjKGVoaSwgIjogaG90IHVucGx1ZyIpOworCQkJCX0gZWxzZSBpZiAoc3RhdHVzICYgTlZfQURNQV9TVEFUX1NFUlJPUikgeworCQkJCQkvKiBsZXQgbGliYXRhIGFuYWx5emUgU0Vycm9yIGFuZCBmaWd1cmUgb3V0IHRoZSBjYXVzZSAqLworCQkJCQlhdGFfZWhpX3B1c2hfZGVzYyhlaGksICI6IFNFcnJvciIpOwogCQkJCX0KIAkJCQlhdGFfcG9ydF9mcmVlemUoYXApOwogCQkJCWNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9hdGEvc2F0YV9wcm9taXNlLmMgYi9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYwppbmRleCBiMmUyZTY5Li5jZjllZDhjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYworKysgYi9kcml2ZXJzL2F0YS9zYXRhX3Byb21pc2UuYwpAQCAtMTE5LDkgKzExOSw3IEBACiBzdGF0aWMgdm9pZCBwZGNfc2F0YV9zY3Jfd3JpdGUgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcsIHUzMiB2YWwpOwogc3RhdGljIGludCBwZGNfYXRhX2luaXRfb25lIChzdHJ1Y3QgcGNpX2RldiAqcGRldiwgY29uc3Qgc3RydWN0IHBjaV9kZXZpY2VfaWQgKmVudCk7CiBzdGF0aWMgaXJxcmV0dXJuX3QgcGRjX2ludGVycnVwdCAoaW50IGlycSwgdm9pZCAqZGV2X2luc3RhbmNlKTsKLXN0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKTsKIHN0YXRpYyBpbnQgcGRjX3BvcnRfc3RhcnQoc3RydWN0IGF0YV9wb3J0ICphcCk7Ci1zdGF0aWMgdm9pZCBwZGNfcGF0YV9waHlfcmVzZXQoc3RydWN0IGF0YV9wb3J0ICphcCk7CiBzdGF0aWMgdm9pZCBwZGNfcWNfcHJlcChzdHJ1Y3QgYXRhX3F1ZXVlZF9jbWQgKnFjKTsKIHN0YXRpYyB2b2lkIHBkY190Zl9sb2FkX21taW8oc3RydWN0IGF0YV9wb3J0ICphcCwgY29uc3Qgc3RydWN0IGF0YV90YXNrZmlsZSAqdGYpOwogc3RhdGljIHZvaWQgcGRjX2V4ZWNfY29tbWFuZF9tbWlvKHN0cnVjdCBhdGFfcG9ydCAqYXAsIGNvbnN0IHN0cnVjdCBhdGFfdGFza2ZpbGUgKnRmKTsKQEAgLTIxNSwxMiArMjEzLDEyIEBACiAJLmRldl9zZWxlY3QJCT0gYXRhX3N0ZF9kZXZfc2VsZWN0LAogCS5jaGVja19hdGFwaV9kbWEJPSBwZGNfY2hlY2tfYXRhcGlfZG1hLAogCi0JLnBoeV9yZXNldAkJPSBwZGNfcGF0YV9waHlfcmVzZXQsCi0KIAkucWNfcHJlcAkJPSBwZGNfcWNfcHJlcCwKIAkucWNfaXNzdWUJCT0gcGRjX3FjX2lzc3VlX3Byb3QsCisJLmZyZWV6ZQkJCT0gcGRjX2ZyZWV6ZSwKKwkudGhhdwkJCT0gcGRjX3RoYXcsCisJLmVycm9yX2hhbmRsZXIJCT0gcGRjX2Vycm9yX2hhbmRsZXIsCiAJLmRhdGFfeGZlcgkJPSBhdGFfZGF0YV94ZmVyLAotCS5lbmdfdGltZW91dAkJPSBwZGNfZW5nX3RpbWVvdXQsCiAJLmlycV9oYW5kbGVyCQk9IHBkY19pbnRlcnJ1cHQsCiAJLmlycV9jbGVhcgkJPSBwZGNfaXJxX2NsZWFyLAogCS5pcnFfb24JCQk9IGF0YV9pcnFfb24sCkBAIC0yNTMsNyArMjUxLDcgQEAKIAkvKiBib2FyZF8yMDYxOSAqLwogCXsKIAkJLnNodAkJPSAmcGRjX2F0YV9zaHQsCi0JCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU1JTVCB8IEFUQV9GTEFHX1NMQVZFX1BPU1MsCisJCS5mbGFncwkJPSBQRENfQ09NTU9OX0ZMQUdTIHwgQVRBX0ZMQUdfU0xBVkVfUE9TUywKIAkJLnBpb19tYXNrCT0gMHgxZiwgLyogcGlvMC00ICovCiAJCS5td2RtYV9tYXNrCT0gMHgwNywgLyogbXdkbWEwLTIgKi8KIAkJLnVkbWFfbWFzawk9IDB4N2YsIC8qIHVkbWEwLTYgOyBGSVhNRSAqLwpAQCAtMzg5LDE0ICszODcsNiBAQAogCQlhcC0+Y2JsID0gQVRBX0NCTF9QQVRBODA7CiB9CiAKLXN0YXRpYyB2b2lkIHBkY19wYXRhX3BoeV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXBkY19wYXRhX2NibF9kZXRlY3QoYXApOwotCXBkY19yZXNldF9wb3J0KGFwKTsKLQlhdGFfcG9ydF9wcm9iZShhcCk7Ci0JYXRhX2J1c19yZXNldChhcCk7Ci19Ci0KIHN0YXRpYyB1MzIgcGRjX3NhdGFfc2NyX3JlYWQgKHN0cnVjdCBhdGFfcG9ydCAqYXAsIHVuc2lnbmVkIGludCBzY19yZWcpCiB7CiAJaWYgKHNjX3JlZyA+IFNDUl9DT05UUk9MIHx8IGFwLT5jYmwgIT0gQVRBX0NCTF9TQVRBKQpAQCAtNTY0LDYgKzU1NCwxMyBAQAogCXJlYWRsKG1taW8gKyBQRENfQ1RMU1RBVCk7IC8qIGZsdXNoICovCiB9CiAKK3N0YXRpYyBpbnQgcGRjX3ByZV9yZXNldChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQoreworCWlmICghc2F0YV9zY3JfdmFsaWQoYXApKQorCQlwZGNfcGF0YV9jYmxfZGV0ZWN0KGFwKTsKKwlyZXR1cm4gYXRhX3N0ZF9wcmVyZXNldChhcCk7Cit9CisKIHN0YXRpYyB2b2lkIHBkY19lcnJvcl9oYW5kbGVyKHN0cnVjdCBhdGFfcG9ydCAqYXApCiB7CiAJYXRhX3Jlc2V0X2ZuX3QgaGFyZHJlc2V0OwpAQCAtNTc2LDcgKzU3Myw3IEBACiAJCWhhcmRyZXNldCA9IHNhdGFfc3RkX2hhcmRyZXNldDsKIAogCS8qIHBlcmZvcm0gcmVjb3ZlcnkgKi8KLQlhdGFfZG9fZWgoYXAsIGF0YV9zdGRfcHJlcmVzZXQsIGF0YV9zdGRfc29mdHJlc2V0LCBoYXJkcmVzZXQsCisJYXRhX2RvX2VoKGFwLCBwZGNfcHJlX3Jlc2V0LCBhdGFfc3RkX3NvZnRyZXNldCwgaGFyZHJlc2V0LAogCQkgIGF0YV9zdGRfcG9zdHJlc2V0KTsKIH0KIApAQCAtNTkyLDQzICs1ODksNiBAQAogCQlwZGNfcmVzZXRfcG9ydChhcCk7CiB9CiAKLXN0YXRpYyB2b2lkIHBkY19lbmdfdGltZW91dChzdHJ1Y3QgYXRhX3BvcnQgKmFwKQotewotCXN0cnVjdCBhdGFfaG9zdCAqaG9zdCA9IGFwLT5ob3N0OwotCXU4IGRydl9zdGF0OwotCXN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWM7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQotCURQUklOVEsoIkVOVEVSXG4iKTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZob3N0LT5sb2NrLCBmbGFncyk7Ci0KLQlxYyA9IGF0YV9xY19mcm9tX3RhZyhhcCwgYXAtPmFjdGl2ZV90YWcpOwotCi0Jc3dpdGNoIChxYy0+dGYucHJvdG9jb2wpIHsKLQljYXNlIEFUQV9QUk9UX0RNQToKLQljYXNlIEFUQV9QUk9UX05PREFUQToKLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwgImNvbW1hbmQgdGltZW91dFxuIik7Ci0JCWRydl9zdGF0ID0gYXRhX3dhaXRfaWRsZShhcCk7Ci0JCXFjLT5lcnJfbWFzayB8PSBfX2FjX2Vycl9tYXNrKGRydl9zdGF0KTsKLQkJYnJlYWs7Ci0KLQlkZWZhdWx0OgotCQlkcnZfc3RhdCA9IGF0YV9idXN5X3dhaXQoYXAsIEFUQV9CVVNZIHwgQVRBX0RSUSwgMTAwMCk7Ci0KLQkJYXRhX3BvcnRfcHJpbnRrKGFwLCBLRVJOX0VSUiwKLQkJCQkidW5rbm93biB0aW1lb3V0LCBjbWQgMHgleCBzdGF0IDB4JXhcbiIsCi0JCQkJcWMtPnRmLmNvbW1hbmQsIGRydl9zdGF0KTsKLQotCQlxYy0+ZXJyX21hc2sgfD0gYWNfZXJyX21hc2soZHJ2X3N0YXQpOwotCQlicmVhazsKLQl9Ci0KLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZob3N0LT5sb2NrLCBmbGFncyk7Ci0JYXRhX2VoX3FjX2NvbXBsZXRlKHFjKTsKLQlEUFJJTlRLKCJFWElUXG4iKTsKLX0KLQogc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcGRjX2hvc3RfaW50ciggc3RydWN0IGF0YV9wb3J0ICphcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdGFfcXVldWVkX2NtZCAqcWMpCiB7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jIGIvZHJpdmVycy9hdGEvc2F0YV92c2MuYwppbmRleCAzZDlkYWYyLi4yZmQwMzdiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2F0YS9zYXRhX3ZzYy5jCisrKyBiL2RyaXZlcnMvYXRhL3NhdGFfdnNjLmMKQEAgLTM0Niw2ICszNDYsNyBAQAogCXN0cnVjdCBhdGFfcHJvYmVfZW50ICpwcm9iZV9lbnQ7CiAJdm9pZCBfX2lvbWVtICptbWlvX2Jhc2U7CiAJaW50IHJjOworCXU4IGNsczsKIAogCWlmICghcHJpbnRlZF92ZXJzaW9uKyspCiAJCWRldl9wcmludGsoS0VSTl9ERUJVRywgJnBkZXYtPmRldiwgInZlcnNpb24gIiBEUlZfVkVSU0lPTiAiXG4iKTsKQEAgLTM4Myw5ICszODQsMTIgQEAKIAlJTklUX0xJU1RfSEVBRCgmcHJvYmVfZW50LT5ub2RlKTsKIAogCS8qCi0JICogRHVlIHRvIGEgYnVnIGluIHRoZSBjaGlwLCB0aGUgZGVmYXVsdCBjYWNoZSBsaW5lIHNpemUgY2FuJ3QgYmUgdXNlZAorCSAqIER1ZSB0byBhIGJ1ZyBpbiB0aGUgY2hpcCwgdGhlIGRlZmF1bHQgY2FjaGUgbGluZSBzaXplIGNhbid0IGJlCisJICogdXNlZCAodW5sZXNzIHRoZSBkZWZhdWx0IGlzIG5vbi16ZXJvKS4KIAkgKi8KLQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMHg4MCk7CisJcGNpX3JlYWRfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgJmNscyk7CisJaWYgKGNscyA9PSAweDAwKQorCQlwY2lfd3JpdGVfY29uZmlnX2J5dGUocGRldiwgUENJX0NBQ0hFX0xJTkVfU0laRSwgMHg4MCk7CiAKIAlpZiAocGNpX2VuYWJsZV9tc2kocGRldikgPT0gMCkKIAkJcGNpX2ludHgocGRldiwgMCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL01ha2VmaWxlIGIvZHJpdmVycy9jaGFyL2FncC9NYWtlZmlsZQppbmRleCAzZTU4MTYwLi5hMGQwNGEyIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL01ha2VmaWxlCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvTWFrZWZpbGUKQEAgLTEsNiArMSw3IEBACiBhZ3BnYXJ0LXkgOj0gYmFja2VuZC5vIGZyb250ZW5kLm8gZ2VuZXJpYy5vIGlzb2NoLm8KIAogb2JqLSQoQ09ORklHX0FHUCkJCSs9IGFncGdhcnQubworb2JqLSQoQ09ORklHX0NPTVBBVCkJCSs9IGNvbXBhdF9pb2N0bC5vCiBvYmotJChDT05GSUdfQUdQX0FMSSkJCSs9IGFsaS1hZ3Aubwogb2JqLSQoQ09ORklHX0FHUF9BVEkpCQkrPSBhdGktYWdwLm8KIG9iai0kKENPTkZJR19BR1BfQU1EKQkJKz0gYW1kLWs3LWFncC5vCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FncC5oIGIvZHJpdmVycy9jaGFyL2FncC9hZ3AuaAppbmRleCAxZDU5ZTJhLi45YmQ2OGQ5IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FncC5oCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYWdwLmgKQEAgLTExNCw2ICsxMTQsNyBAQAogCXZvaWQgKCpmcmVlX2J5X3R5cGUpKHN0cnVjdCBhZ3BfbWVtb3J5ICopOwogCXZvaWQgKigqYWdwX2FsbG9jX3BhZ2UpKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKik7CiAJdm9pZCAoKmFncF9kZXN0cm95X3BhZ2UpKHZvaWQgKik7CisgICAgICAgIGludCAoKmFncF90eXBlX3RvX21hc2tfdHlwZSkgKHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKiwgaW50KTsKIH07CiAKIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgewpAQCAtMjE4LDYgKzIxOSw3IEBACiAjZGVmaW5lIEk4MTBfUFRFX01BSU5fVU5DQUNIRUQJMHgwMDAwMDAwMAogI2RlZmluZSBJODEwX1BURV9MT0NBTAkJMHgwMDAwMDAwMgogI2RlZmluZSBJODEwX1BURV9WQUxJRAkJMHgwMDAwMDAwMQorI2RlZmluZSBJODMwX1BURV9TWVNURU1fQ0FDSEVEICAweDAwMDAwMDA2CiAjZGVmaW5lIEk4MTBfU01SQU1fTUlTQ0MJMHg3MAogI2RlZmluZSBJODEwX0dGWF9NRU1fV0lOX1NJWkUJMHgwMDAxMDAwMAogI2RlZmluZSBJODEwX0dGWF9NRU1fV0lOXzMyTQkweDAwMDEwMDAwCkBAIC0yNzAsOCArMjcyLDE2IEBACiB2b2lkIGdldF9hZ3BfdmVyc2lvbihzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UpOwogdW5zaWduZWQgbG9uZyBhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCiAJdW5zaWduZWQgbG9uZyBhZGRyLCBpbnQgdHlwZSk7CitpbnQgYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCQkJCSAgaW50IHR5cGUpOwogc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWdwX2dlbmVyaWNfZmluZF9icmlkZ2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYpOwogCisvKiBnZW5lcmljIGZ1bmN0aW9ucyBmb3IgdXNlci1wb3B1bGF0ZWQgQUdQIG1lbW9yeSB0eXBlcyAqLworc3RydWN0IGFncF9tZW1vcnkgKmFncF9nZW5lcmljX2FsbG9jX3VzZXIoc2l6ZV90IHBhZ2VfY291bnQsIGludCB0eXBlKTsKK3ZvaWQgYWdwX2FsbG9jX3BhZ2VfYXJyYXkoc2l6ZV90IHNpemUsIHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pOwordm9pZCBhZ3BfZnJlZV9wYWdlX2FycmF5KHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pOworCisKIC8qIGdlbmVyaWMgcm91dGluZXMgZm9yIGFncD49MyAqLwogaW50IGFncDNfZ2VuZXJpY19mZXRjaF9zaXplKHZvaWQpOwogdm9pZCBhZ3AzX2dlbmVyaWNfdGxiZmx1c2goc3RydWN0IGFncF9tZW1vcnkgKm1lbSk7CkBAIC0yODgsNiArMjk4LDggQEAKIGV4dGVybiBpbnQgYWdwX29mZjsKIGV4dGVybiBpbnQgYWdwX3RyeV91bnN1cHBvcnRlZF9ib290OwogCitsb25nIGNvbXBhdF9hZ3BfaW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKKwogLyogQ2hpcHNldCBpbmRlcGVuZGFudCByZWdpc3RlcnMgKGZyb20gQUdQIFNwZWMpICovCiAjZGVmaW5lIEFHUF9BUEJBU0UJMHgxMAogCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FsaS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jCmluZGV4IDVhMzFlYzcuLjk4MTc3YTkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYWxpLWFncC5jCkBAIC0yMTQsNiArMjE0LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFsaV9kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2JyaWRnZV9kcml2ZXIgYWxpX20xNTQxX2JyaWRnZSA9IHsKQEAgLTIzNyw2ICsyMzgsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBtMTU0MV9hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gbTE1NDFfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FscGhhLWFncC5jCmluZGV4IGI0ZTAwYTMuLmIwYWNmNDEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvYWxwaGEtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hbHBoYS1hZ3AuYwpAQCAtOTEsNiArOTEsOSBAQAogCWludCBudW1fZW50cmllcywgc3RhdHVzOwogCXZvaWQgKnRlbXA7CiAKKwlpZiAodHlwZSA+PSBBR1BfVVNFUl9UWVBFUyB8fCBtZW0tPnR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpCisJCXJldHVybiAtRUlOVkFMOworCiAJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKIAludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOwogCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCkBAIC0xNDIsNiArMTQ1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYWxwaGFfYnJpZGdlOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9hbWQtazctYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYwppbmRleCBjODVjOGNhLi4zZDhkNDQ4IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2FtZC1rNy1hZ3AuYwpAQCAtMzgxLDYgKzM4MSw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2RldmljZV9pZHMgYW1kX2FncF9kZXZpY2VfaWRzW10gX19kZXZpbml0ZGF0YSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hbWQ2NC1hZ3AuYwppbmRleCA5M2QyMjA5Li42MzZkOTg0IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2FtZDY0LWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvYW1kNjQtYWdwLmMKQEAgLTYyLDEyICs2MiwxOCBAQAogewogCWludCBpLCBqLCBudW1fZW50cmllczsKIAlsb25nIGxvbmcgdG1wOworCWludCBtYXNrX3R5cGU7CisJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlID0gbWVtLT5icmlkZ2U7CiAJdTMyIHB0ZTsKIAogCW51bV9lbnRyaWVzID0gYWdwX251bV9lbnRyaWVzKCk7CiAKLQlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKQorCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKIAkJcmV0dXJuIC1FSU5WQUw7CisJbWFza190eXBlID0gYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShicmlkZ2UsIHR5cGUpOworCWlmIChtYXNrX3R5cGUgIT0gMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAogCS8qIE1ha2Ugc3VyZSB3ZSBjYW4gZml0IHRoZSByYW5nZSBpbiB0aGUgZ2F0dCB0YWJsZS4gKi8KIAkvKiBGSVhNRTogY291bGQgd3JhcCAqLwpAQCAtOTAsNyArOTYsNyBAQAogCiAJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgewogCQl0bXAgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGFncF9icmlkZ2UsCi0JCQltZW0tPm1lbW9yeVtpXSwgbWVtLT50eXBlKTsKKwkJCW1lbS0+bWVtb3J5W2ldLCBtYXNrX3R5cGUpOwogCiAJCUJVR19PTih0bXAgJiAweGZmZmZmZjAwMDAwMDBmZmNVTEwpOwogCQlwdGUgPSAodG1wICYgMHgwMDAwMDBmZjAwMDAwMDAwVUxMKSA+PiAyODsKQEAgLTI0Nyw2ICsyNTMsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiAvKiBTb21lIGJhc2ljIHNhbml0eSBjaGVja3MgZm9yIHRoZSBhcGVydHVyZS4gKi8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYXRpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9hdGktYWdwLmMKaW5kZXggOTk4N2RjMi4uNzdjOWFkNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9hdGktYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9hdGktYWdwLmMKQEAgLTQzMSw2ICs0MzEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvYmFja2VuZC5jIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKaW5kZXggZDU5ZTAzNy4uZWJkZDZkZCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9iYWNrZW5kLmMKQEAgLTQzLDcgKzQzLDcgQEAKICAqIGZpeCBzb21lIHJlYWwgc3R1cGlkaXR5LiBJdCdzIG9ubHkgYnkgY2hhbmNlIHdlIGNhbiBidW1wCiAgKiBwYXN0IDAuOTkgYXQgYWxsIGR1ZSB0byBzb21lIGJvb2xlYW4gbG9naWMgZXJyb3IuICovCiAjZGVmaW5lIEFHUEdBUlRfVkVSU0lPTl9NQUpPUiAwCi0jZGVmaW5lIEFHUEdBUlRfVkVSU0lPTl9NSU5PUiAxMDEKKyNkZWZpbmUgQUdQR0FSVF9WRVJTSU9OX01JTk9SIDEwMgogc3RhdGljIGNvbnN0IHN0cnVjdCBhZ3BfdmVyc2lvbiBhZ3BfY3VycmVudF92ZXJzaW9uID0KIHsKIAkubWFqb3IgPSBBR1BHQVJUX1ZFUlNJT05fTUFKT1IsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5jIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2I0YjFiCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuYwpAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIEFHUEdBUlQgZHJpdmVyIGZyb250ZW5kIGNvbXBhdGliaWxpdHkgaW9jdGxzCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQgU2lsaWNvbiBHcmFwaGljcywgSW5jLgorICogQ29weXJpZ2h0IChDKSAyMDAyLTIwMDMgRGF2ZSBKb25lcworICogQ29weXJpZ2h0IChDKSAxOTk5IEplZmYgSGFydG1hbm4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBQcmVjaXNpb24gSW5zaWdodCwgSW5jLgorICogQ29weXJpZ2h0IChDKSAxOTk5IFhpIEdyYXBoaWNzLCBJbmMuCisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEKKyAqIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksCisgKiB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uCisgKiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwKKyAqIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZQorICogU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKKyAqCisgKiBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZAorICogaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisgKgorICogVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MKKyAqIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLAorICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMCisgKiBKRUZGIEhBUlRNQU5OLCBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLAorICogREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SCisgKiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUKKyAqIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLgorICoKKyAqLworCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CisjaW5jbHVkZSA8bGludXgvYWdwZ2FydC5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSAiYWdwLmgiCisjaW5jbHVkZSAiY29tcGF0X2lvY3RsLmgiCisKK3N0YXRpYyBpbnQgY29tcGF0X2FncGlvY19pbmZvX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFncF9pbmZvMzIgdXNlcmluZm87CisJc3RydWN0IGFncF9rZXJuX2luZm8ga2VybmluZm87CisKKwlhZ3BfY29weV9pbmZvKGFncF9icmlkZ2UsICZrZXJuaW5mbyk7CisKKwl1c2VyaW5mby52ZXJzaW9uLm1ham9yID0ga2VybmluZm8udmVyc2lvbi5tYWpvcjsKKwl1c2VyaW5mby52ZXJzaW9uLm1pbm9yID0ga2VybmluZm8udmVyc2lvbi5taW5vcjsKKwl1c2VyaW5mby5icmlkZ2VfaWQgPSBrZXJuaW5mby5kZXZpY2UtPnZlbmRvciB8CisJICAgIChrZXJuaW5mby5kZXZpY2UtPmRldmljZSA8PCAxNik7CisJdXNlcmluZm8uYWdwX21vZGUgPSBrZXJuaW5mby5tb2RlOworCXVzZXJpbmZvLmFwZXJfYmFzZSA9IChjb21wYXRfbG9uZ190KWtlcm5pbmZvLmFwZXJfYmFzZTsKKwl1c2VyaW5mby5hcGVyX3NpemUgPSBrZXJuaW5mby5hcGVyX3NpemU7CisJdXNlcmluZm8ucGdfdG90YWwgPSB1c2VyaW5mby5wZ19zeXN0ZW0gPSBrZXJuaW5mby5tYXhfbWVtb3J5OworCXVzZXJpbmZvLnBnX3VzZWQgPSBrZXJuaW5mby5jdXJyZW50X21lbW9yeTsKKworCWlmIChjb3B5X3RvX3VzZXIoYXJnLCAmdXNlcmluZm8sIHNpemVvZih1c2VyaW5mbykpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9hZ3Bpb2NfcmVzZXJ2ZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCB2b2lkIF9fdXNlciAqYXJnKQoreworCXN0cnVjdCBhZ3BfcmVnaW9uMzIgdXJlc2VydmU7CisJc3RydWN0IGFncF9yZWdpb24ga3Jlc2VydmU7CisJc3RydWN0IGFncF9jbGllbnQgKmNsaWVudDsKKwlzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqY2xpZW50X3ByaXY7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmdXJlc2VydmUsIGFyZywgc2l6ZW9mKHVyZXNlcnZlKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJaWYgKCh1bnNpZ25lZCkgdXJlc2VydmUuc2VnX2NvdW50ID49IH4wVS9zaXplb2Yoc3RydWN0IGFncF9zZWdtZW50MzIpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWtyZXNlcnZlLnBpZCA9IHVyZXNlcnZlLnBpZDsKKwlrcmVzZXJ2ZS5zZWdfY291bnQgPSB1cmVzZXJ2ZS5zZWdfY291bnQ7CisKKwljbGllbnQgPSBhZ3BfZmluZF9jbGllbnRfYnlfcGlkKGtyZXNlcnZlLnBpZCk7CisKKwlpZiAoa3Jlc2VydmUuc2VnX2NvdW50ID09IDApIHsKKwkJLyogcmVtb3ZlIGEgY2xpZW50ICovCisJCWNsaWVudF9wcml2ID0gYWdwX2ZpbmRfcHJpdmF0ZShrcmVzZXJ2ZS5waWQpOworCisJCWlmIChjbGllbnRfcHJpdiAhPSBOVUxMKSB7CisJCQlzZXRfYml0KEFHUF9GRl9JU19DTElFTlQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCXNldF9iaXQoQUdQX0ZGX0lTX1ZBTElELCAmY2xpZW50X3ByaXYtPmFjY2Vzc19mbGFncyk7CisJCX0KKwkJaWYgKGNsaWVudCA9PSBOVUxMKSB7CisJCQkvKiBjbGllbnQgaXMgYWxyZWFkeSByZW1vdmVkICovCisJCQlyZXR1cm4gMDsKKwkJfQorCQlyZXR1cm4gYWdwX3JlbW92ZV9jbGllbnQoa3Jlc2VydmUucGlkKTsKKwl9IGVsc2UgeworCQlzdHJ1Y3QgYWdwX3NlZ21lbnQzMiAqdXNlZ21lbnQ7CisJCXN0cnVjdCBhZ3Bfc2VnbWVudCAqa3NlZ21lbnQ7CisJCWludCBzZWc7CisKKwkJaWYgKHVyZXNlcnZlLnNlZ19jb3VudCA+PSAxNjM4NCkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXVzZWdtZW50ID0ga21hbGxvYyhzaXplb2YoKnVzZWdtZW50KSAqIHVyZXNlcnZlLnNlZ19jb3VudCwgR0ZQX0tFUk5FTCk7CisJCWlmICghdXNlZ21lbnQpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlrc2VnbWVudCA9IGttYWxsb2Moc2l6ZW9mKCprc2VnbWVudCkgKiBrcmVzZXJ2ZS5zZWdfY291bnQsIEdGUF9LRVJORUwpOworCQlpZiAoIWtzZWdtZW50KSB7CisJCQlrZnJlZSh1c2VnbWVudCk7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCisJCWlmIChjb3B5X2Zyb21fdXNlcih1c2VnbWVudCwgKHZvaWQgX191c2VyICopIHVyZXNlcnZlLnNlZ19saXN0LAorCQkJCSAgIHNpemVvZigqdXNlZ21lbnQpICogdXJlc2VydmUuc2VnX2NvdW50KSkgeworCQkJa2ZyZWUodXNlZ21lbnQpOworCQkJa2ZyZWUoa3NlZ21lbnQpOworCQkJcmV0dXJuIC1FRkFVTFQ7CisJCX0KKworCQlmb3IgKHNlZyA9IDA7IHNlZyA8IHVyZXNlcnZlLnNlZ19jb3VudDsgc2VnKyspIHsKKwkJCWtzZWdtZW50W3NlZ10ucGdfc3RhcnQgPSB1c2VnbWVudFtzZWddLnBnX3N0YXJ0OworCQkJa3NlZ21lbnRbc2VnXS5wZ19jb3VudCA9IHVzZWdtZW50W3NlZ10ucGdfY291bnQ7CisJCQlrc2VnbWVudFtzZWddLnByb3QgPSB1c2VnbWVudFtzZWddLnByb3Q7CisJCX0KKworCQlrZnJlZSh1c2VnbWVudCk7CisJCWtyZXNlcnZlLnNlZ19saXN0ID0ga3NlZ21lbnQ7CisKKwkJaWYgKGNsaWVudCA9PSBOVUxMKSB7CisJCQkvKiBDcmVhdGUgdGhlIGNsaWVudCBhbmQgYWRkIHRoZSBzZWdtZW50ICovCisJCQljbGllbnQgPSBhZ3BfY3JlYXRlX2NsaWVudChrcmVzZXJ2ZS5waWQpOworCisJCQlpZiAoY2xpZW50ID09IE5VTEwpIHsKKwkJCQlrZnJlZShrc2VnbWVudCk7CisJCQkJcmV0dXJuIC1FTk9NRU07CisJCQl9CisJCQljbGllbnRfcHJpdiA9IGFncF9maW5kX3ByaXZhdGUoa3Jlc2VydmUucGlkKTsKKworCQkJaWYgKGNsaWVudF9wcml2ICE9IE5VTEwpIHsKKwkJCQlzZXRfYml0KEFHUF9GRl9JU19DTElFTlQsICZjbGllbnRfcHJpdi0+YWNjZXNzX2ZsYWdzKTsKKwkJCQlzZXRfYml0KEFHUF9GRl9JU19WQUxJRCwgJmNsaWVudF9wcml2LT5hY2Nlc3NfZmxhZ3MpOworCQkJfQorCQl9CisJCXJldHVybiBhZ3BfY3JlYXRlX3NlZ21lbnQoY2xpZW50LCAma3Jlc2VydmUpOworCX0KKwkvKiBXaWxsIG5ldmVyIHJlYWxseSBoYXBwZW4gKi8KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGludCBjb21wYXRfYWdwaW9jX2FsbG9jYXRlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeTsKKwlzdHJ1Y3QgYWdwX2FsbG9jYXRlMzIgYWxsb2M7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYWxsb2MsIGFyZywgc2l6ZW9mKGFsbG9jKSkpCisJCXJldHVybiAtRUZBVUxUOworCisJbWVtb3J5ID0gYWdwX2FsbG9jYXRlX21lbW9yeV93cmFwKGFsbG9jLnBnX2NvdW50LCBhbGxvYy50eXBlKTsKKworCWlmIChtZW1vcnkgPT0gTlVMTCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlhbGxvYy5rZXkgPSBtZW1vcnktPmtleTsKKwlhbGxvYy5waHlzaWNhbCA9IG1lbW9yeS0+cGh5c2ljYWw7CisKKwlpZiAoY29weV90b191c2VyKGFyZywgJmFsbG9jLCBzaXplb2YoYWxsb2MpKSkgeworCQlhZ3BfZnJlZV9tZW1vcnlfd3JhcChtZW1vcnkpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY29tcGF0X2FncGlvY19iaW5kX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFncF9iaW5kMzIgYmluZF9pbmZvOworCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CisKKwlEQkcoIiIpOworCWlmIChjb3B5X2Zyb21fdXNlcigmYmluZF9pbmZvLCBhcmcsIHNpemVvZihiaW5kX2luZm8pKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwltZW1vcnkgPSBhZ3BfZmluZF9tZW1fYnlfa2V5KGJpbmRfaW5mby5rZXkpOworCisJaWYgKG1lbW9yeSA9PSBOVUxMKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJldHVybiBhZ3BfYmluZF9tZW1vcnkobWVtb3J5LCBiaW5kX2luZm8ucGdfc3RhcnQpOworfQorCitzdGF0aWMgaW50IGNvbXBhdF9hZ3Bpb2NfdW5iaW5kX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeTsKKwlzdHJ1Y3QgYWdwX3VuYmluZDMyIHVuYmluZDsKKworCURCRygiIik7CisJaWYgKGNvcHlfZnJvbV91c2VyKCZ1bmJpbmQsIGFyZywgc2l6ZW9mKHVuYmluZCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW1lbW9yeSA9IGFncF9maW5kX21lbV9ieV9rZXkodW5iaW5kLmtleSk7CisKKwlpZiAobWVtb3J5ID09IE5VTEwpCisJCXJldHVybiAtRUlOVkFMOworCisJcmV0dXJuIGFncF91bmJpbmRfbWVtb3J5KG1lbW9yeSk7Cit9CisKK2xvbmcgY29tcGF0X2FncF9pb2N0bChzdHJ1Y3QgZmlsZSAqZmlsZSwgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmN1cnJfcHJpdiA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0X3ZhbCA9IC1FTk9UVFk7CisKKwltdXRleF9sb2NrKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCisJaWYgKChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyID09IE5VTEwpICYmCisJICAgIChjbWQgIT0gQUdQSU9DX0FDUVVJUkUzMikpIHsKKwkJcmV0X3ZhbCA9IC1FSU5WQUw7CisJCWdvdG8gaW9jdGxfb3V0OworCX0KKwlpZiAoKGFncF9mZS5iYWNrZW5kX2FjcXVpcmVkICE9IFRSVUUpICYmCisJICAgIChjbWQgIT0gQUdQSU9DX0FDUVVJUkUzMikpIHsKKwkJcmV0X3ZhbCA9IC1FQlVTWTsKKwkJZ290byBpb2N0bF9vdXQ7CisJfQorCWlmIChjbWQgIT0gQUdQSU9DX0FDUVVJUkUzMikgeworCQlpZiAoISh0ZXN0X2JpdChBR1BfRkZfSVNfQ09OVFJPTExFUiwgJmN1cnJfcHJpdi0+YWNjZXNzX2ZsYWdzKSkpIHsKKwkJCXJldF92YWwgPSAtRVBFUk07CisJCQlnb3RvIGlvY3RsX291dDsKKwkJfQorCQkvKiBVc2UgdGhlIG9yaWdpbmFsIHBpZCBvZiB0aGUgY29udHJvbGxlciwKKwkJICogaW4gY2FzZSBpdCdzIHRocmVhZGVkICovCisKKwkJaWYgKGFncF9mZS5jdXJyZW50X2NvbnRyb2xsZXItPnBpZCAhPSBjdXJyX3ByaXYtPm15X3BpZCkgeworCQkJcmV0X3ZhbCA9IC1FQlVTWTsKKwkJCWdvdG8gaW9jdGxfb3V0OworCQl9CisJfQorCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIEFHUElPQ19JTkZPMzI6CisJCXJldF92YWwgPSBjb21wYXRfYWdwaW9jX2luZm9fd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0FDUVVJUkUzMjoKKwkJcmV0X3ZhbCA9IGFncGlvY19hY3F1aXJlX3dyYXAoY3Vycl9wcml2KTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19SRUxFQVNFMzI6CisJCXJldF92YWwgPSBhZ3Bpb2NfcmVsZWFzZV93cmFwKGN1cnJfcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfU0VUVVAzMjoKKwkJcmV0X3ZhbCA9IGFncGlvY19zZXR1cF93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfUkVTRVJWRTMyOgorCQlyZXRfdmFsID0gY29tcGF0X2FncGlvY19yZXNlcnZlX3dyYXAoY3Vycl9wcml2LCAodm9pZCBfX3VzZXIgKikgYXJnKTsKKwkJYnJlYWs7CisKKwljYXNlIEFHUElPQ19QUk9URUNUMzI6CisJCXJldF92YWwgPSBhZ3Bpb2NfcHJvdGVjdF93cmFwKGN1cnJfcHJpdik7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfQUxMT0NBVEUzMjoKKwkJcmV0X3ZhbCA9IGNvbXBhdF9hZ3Bpb2NfYWxsb2NhdGVfd3JhcChjdXJyX3ByaXYsICh2b2lkIF9fdXNlciAqKSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0RFQUxMT0NBVEUzMjoKKwkJcmV0X3ZhbCA9IGFncGlvY19kZWFsbG9jYXRlX3dyYXAoY3Vycl9wcml2LCAoaW50KSBhcmcpOworCQlicmVhazsKKworCWNhc2UgQUdQSU9DX0JJTkQzMjoKKwkJcmV0X3ZhbCA9IGNvbXBhdF9hZ3Bpb2NfYmluZF93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCisJY2FzZSBBR1BJT0NfVU5CSU5EMzI6CisJCXJldF92YWwgPSBjb21wYXRfYWdwaW9jX3VuYmluZF93cmFwKGN1cnJfcHJpdiwgKHZvaWQgX191c2VyICopIGFyZyk7CisJCWJyZWFrOworCX0KKworaW9jdGxfb3V0OgorCURCRygiaW9jdGwgcmV0dXJucyAlZFxuIiwgcmV0X3ZhbCk7CisJbXV0ZXhfdW5sb2NrKCYoYWdwX2ZlLmFncF9tdXRleCkpOworCXJldHVybiByZXRfdmFsOworfQorCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2NvbXBhdF9pb2N0bC5oIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTkzOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy9jaGFyL2FncC9jb21wYXRfaW9jdGwuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMTk5OSBKZWZmIEhhcnRtYW5uCisgKiBDb3B5cmlnaHQgKEMpIDE5OTkgUHJlY2lzaW9uIEluc2lnaHQsIEluYy4KKyAqIENvcHlyaWdodCAoQykgMTk5OSBYaSBHcmFwaGljcywgSW5jLgorICoKKyAqIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhCisgKiBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLAorICogdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbgorICogdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsCisgKiBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUKKyAqIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQKKyAqIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTCisgKiBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuICBJTiBOTyBFVkVOVCBTSEFMTAorICogSkVGRiBIQVJUTUFOTiwgT1IgQU5ZIE9USEVSIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwKKyAqIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUgorICogT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFCisgKiBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS4KKyAqCisgKi8KKworI2lmbmRlZiBfQUdQX0NPTVBBVF9JT0NUTF9ICisjZGVmaW5lIF9BR1BfQ09NUEFUX0lPQ1RMX0gKKworI2luY2x1ZGUgPGxpbnV4L2NvbXBhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2FncGdhcnQuaD4KKworI2RlZmluZSBBR1BJT0NfSU5GTzMyICAgICAgIF9JT1IgKEFHUElPQ19CQVNFLCAwLCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfQUNRVUlSRTMyICAgIF9JTyAgKEFHUElPQ19CQVNFLCAxKQorI2RlZmluZSBBR1BJT0NfUkVMRUFTRTMyICAgIF9JTyAgKEFHUElPQ19CQVNFLCAyKQorI2RlZmluZSBBR1BJT0NfU0VUVVAzMiAgICAgIF9JT1cgKEFHUElPQ19CQVNFLCAzLCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfUkVTRVJWRTMyICAgIF9JT1cgKEFHUElPQ19CQVNFLCA0LCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfUFJPVEVDVDMyICAgIF9JT1cgKEFHUElPQ19CQVNFLCA1LCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfQUxMT0NBVEUzMiAgIF9JT1dSKEFHUElPQ19CQVNFLCA2LCBjb21wYXRfdXB0cl90KQorI2RlZmluZSBBR1BJT0NfREVBTExPQ0FURTMyIF9JT1cgKEFHUElPQ19CQVNFLCA3LCBjb21wYXRfaW50X3QpCisjZGVmaW5lIEFHUElPQ19CSU5EMzIgICAgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDgsIGNvbXBhdF91cHRyX3QpCisjZGVmaW5lIEFHUElPQ19VTkJJTkQzMiAgICAgX0lPVyAoQUdQSU9DX0JBU0UsIDksIGNvbXBhdF91cHRyX3QpCisKK3N0cnVjdCBhZ3BfaW5mbzMyIHsKKwlzdHJ1Y3QgYWdwX3ZlcnNpb24gdmVyc2lvbjsJLyogdmVyc2lvbiBvZiB0aGUgZHJpdmVyICAgICAgICAqLworCXUzMiBicmlkZ2VfaWQ7CQkvKiBicmlkZ2UgdmVuZG9yL2RldmljZSAgICAgICAgICovCisJdTMyIGFncF9tb2RlOwkJLyogbW9kZSBpbmZvIG9mIGJyaWRnZSAgICAgICAgICAqLworCWNvbXBhdF9sb25nX3QgYXBlcl9iYXNlOwkvKiBiYXNlIG9mIGFwZXJ0dXJlICAgICAgICAgICAgICovCisJY29tcGF0X3NpemVfdCBhcGVyX3NpemU7CS8qIHNpemUgb2YgYXBlcnR1cmUgICAgICAgICAgICAgKi8KKwljb21wYXRfc2l6ZV90IHBnX3RvdGFsOwkvKiBtYXggcGFnZXMgKHN3YXAgKyBzeXN0ZW0pICAgICovCisJY29tcGF0X3NpemVfdCBwZ19zeXN0ZW07CS8qIG1heCBwYWdlcyAoc3lzdGVtKSAgICAgICAgICAgKi8KKwljb21wYXRfc2l6ZV90IHBnX3VzZWQ7CQkvKiBjdXJyZW50IHBhZ2VzIHVzZWQgICAgICAgICAgICovCit9OworCisvKgorICogVGhlICJwcm90IiBkb3duIGJlbG93IG5lZWRzIHN0aWxsIGEgInNsZWVwIiBmbGFnIHNvbWVob3cgLi4uCisgKi8KK3N0cnVjdCBhZ3Bfc2VnbWVudDMyIHsKKwljb21wYXRfb2ZmX3QgcGdfc3RhcnQ7CQkvKiBzdGFydGluZyBwYWdlIHRvIHBvcHVsYXRlICAgICovCisJY29tcGF0X3NpemVfdCBwZ19jb3VudDsJLyogbnVtYmVyIG9mIHBhZ2VzICAgICAgICAgICAgICAqLworCWNvbXBhdF9pbnRfdCBwcm90OwkJLyogcHJvdCBmbGFncyBmb3IgbW1hcCAgICAgICAgICAqLworfTsKKworc3RydWN0IGFncF9yZWdpb24zMiB7CisJY29tcGF0X3BpZF90IHBpZDsJCS8qIHBpZCBvZiBwcm9jZXNzICAgICAgICAgICAgICAgKi8KKwljb21wYXRfc2l6ZV90IHNlZ19jb3VudDsJLyogbnVtYmVyIG9mIHNlZ21lbnRzICAgICAgICAgICAqLworCXN0cnVjdCBhZ3Bfc2VnbWVudDMyICpzZWdfbGlzdDsKK307CisKK3N0cnVjdCBhZ3BfYWxsb2NhdGUzMiB7CisJY29tcGF0X2ludF90IGtleTsJCS8qIHRhZyBvZiBhbGxvY2F0aW9uICAgICAgICAgICAgKi8KKwljb21wYXRfc2l6ZV90IHBnX2NvdW50OwkvKiBudW1iZXIgb2YgcGFnZXMgICAgICAgICAgICAgICovCisJdTMyIHR5cGU7CQkvKiAwID09IG5vcm1hbCwgb3RoZXIgZGV2c3BlYyAgICovCisJdTMyIHBoeXNpY2FsOyAgICAgICAgICAgLyogZGV2aWNlIHNwZWNpZmljIChzb21lIGRldmljZXMKKwkJCQkgKiBuZWVkIGEgcGh5cyBhZGRyZXNzIG9mIHRoZQorCQkJCSAqIGFjdHVhbCBwYWdlIGJlaGluZCB0aGUgZ2F0dAorCQkJCSAqIHRhYmxlKSAgICAgICAgICAgICAgICAgICAgICAgICovCit9OworCitzdHJ1Y3QgYWdwX2JpbmQzMiB7CisJY29tcGF0X2ludF90IGtleTsJCS8qIHRhZyBvZiBhbGxvY2F0aW9uICAgICAgICAgICAgKi8KKwljb21wYXRfb2ZmX3QgcGdfc3RhcnQ7CQkvKiBzdGFydGluZyBwYWdlIHRvIHBvcHVsYXRlICAgICovCit9OworCitzdHJ1Y3QgYWdwX3VuYmluZDMyIHsKKwljb21wYXRfaW50X3Qga2V5OwkJLyogdGFnIG9mIGFsbG9jYXRpb24gICAgICAgICAgICAqLworCXUzMiBwcmlvcml0eTsJCS8qIHByaW9yaXR5IGZvciBwYWdpbmcgb3V0ICAgICAgKi8KK307CisKK2V4dGVybiBzdHJ1Y3QgYWdwX2Zyb250X2RhdGEgYWdwX2ZlOworCitpbnQgYWdwaW9jX2FjcXVpcmVfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdik7CitpbnQgYWdwaW9jX3JlbGVhc2Vfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdik7CitpbnQgYWdwaW9jX3Byb3RlY3Rfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdik7CitpbnQgYWdwaW9jX3NldHVwX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIHZvaWQgX191c2VyICphcmcpOworaW50IGFncGlvY19kZWFsbG9jYXRlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIGludCBhcmcpOworc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmFncF9maW5kX3ByaXZhdGUocGlkX3QgcGlkKTsKK3N0cnVjdCBhZ3BfY2xpZW50ICphZ3BfY3JlYXRlX2NsaWVudChwaWRfdCBpZCk7CitpbnQgYWdwX3JlbW92ZV9jbGllbnQocGlkX3QgaWQpOworaW50IGFncF9jcmVhdGVfc2VnbWVudChzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgYWdwX3JlZ2lvbiAqcmVnaW9uKTsKK3ZvaWQgYWdwX2ZyZWVfbWVtb3J5X3dyYXAoc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeSk7CitzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2FsbG9jYXRlX21lbW9yeV93cmFwKHNpemVfdCBwZ19jb3VudCwgdTMyIHR5cGUpOworc3RydWN0IGFncF9tZW1vcnkgKmFncF9maW5kX21lbV9ieV9rZXkoaW50IGtleSk7CitzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChwaWRfdCBpZCk7CisKKyNlbmRpZiAvKiBfQUdQX0NPTVBBVF9IICovCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9lZmZpY2Vvbi1hZ3AuYwppbmRleCAzMGY3MzBmLi42NThjYjFhIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2VmZmljZW9uLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZWZmaWNlb24tYWdwLmMKQEAgLTMzNSw2ICszMzUsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgaW50IF9fZGV2aW5pdCBhZ3BfZWZmaWNlb25fcHJvYmUoc3RydWN0IHBjaV9kZXYgKnBkZXYsCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMgYi9kcml2ZXJzL2NoYXIvYWdwL2Zyb250ZW5kLmMKaW5kZXggMGYyZWQyYS4uNjc5ZDdmOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9mcm9udGVuZC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvZnJvbnRlbmQuYwpAQCAtNDEsOSArNDEsOSBAQAogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSAiYWdwLmgiCiAKLXN0YXRpYyBzdHJ1Y3QgYWdwX2Zyb250X2RhdGEgYWdwX2ZlOworc3RydWN0IGFncF9mcm9udF9kYXRhIGFncF9mZTsKIAotc3RhdGljIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfZmluZF9tZW1fYnlfa2V5KGludCBrZXkpCitzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2ZpbmRfbWVtX2J5X2tleShpbnQga2V5KQogewogCXN0cnVjdCBhZ3BfbWVtb3J5ICpjdXJyOwogCkBAIC0xNTksNyArMTU5LDcgQEAKIAlyZXR1cm4gdm1fZ2V0X3BhZ2VfcHJvdChwcm90X2JpdHMpOwogfQogCi1zdGF0aWMgaW50IGFncF9jcmVhdGVfc2VnbWVudChzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgYWdwX3JlZ2lvbiAqcmVnaW9uKQoraW50IGFncF9jcmVhdGVfc2VnbWVudChzdHJ1Y3QgYWdwX2NsaWVudCAqY2xpZW50LCBzdHJ1Y3QgYWdwX3JlZ2lvbiAqcmVnaW9uKQogewogCXN0cnVjdCBhZ3Bfc2VnbWVudF9wcml2ICoqcmV0X3NlZzsKIAlzdHJ1Y3QgYWdwX3NlZ21lbnRfcHJpdiAqc2VnOwpAQCAtMjExLDcgKzIxMSw3IEBACiAKIC8qIEZpbGUgcHJpdmF0ZSBsaXN0IHJvdXRpbmVzICovCiAKLXN0YXRpYyBzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqYWdwX2ZpbmRfcHJpdmF0ZShwaWRfdCBwaWQpCitzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqYWdwX2ZpbmRfcHJpdmF0ZShwaWRfdCBwaWQpCiB7CiAJc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKmN1cnI7CiAKQEAgLTI2NiwxMyArMjY2LDEzIEBACiAgKiBXcmFwcGVycyBmb3IgYWdwX2ZyZWVfbWVtb3J5ICYgYWdwX2FsbG9jYXRlX21lbW9yeQogICogVGhlc2UgbWFrZSBzdXJlIHRoYXQgaW50ZXJuYWwgbGlzdHMgYXJlIGtlcHQgdXBkYXRlZC4KICAqLwotc3RhdGljIHZvaWQgYWdwX2ZyZWVfbWVtb3J5X3dyYXAoc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeSkKK3ZvaWQgYWdwX2ZyZWVfbWVtb3J5X3dyYXAoc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeSkKIHsKIAlhZ3BfcmVtb3ZlX2Zyb21fcG9vbChtZW1vcnkpOwogCWFncF9mcmVlX21lbW9yeShtZW1vcnkpOwogfQogCi1zdGF0aWMgc3RydWN0IGFncF9tZW1vcnkgKmFncF9hbGxvY2F0ZV9tZW1vcnlfd3JhcChzaXplX3QgcGdfY291bnQsIHUzMiB0eXBlKQorc3RydWN0IGFncF9tZW1vcnkgKmFncF9hbGxvY2F0ZV9tZW1vcnlfd3JhcChzaXplX3QgcGdfY291bnQsIHUzMiB0eXBlKQogewogCXN0cnVjdCBhZ3BfbWVtb3J5ICptZW1vcnk7CiAKQEAgLTQ4NCw3ICs0ODQsNyBAQAogCXJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgc3RydWN0IGFncF9jbGllbnQgKmFncF9maW5kX2NsaWVudF9ieV9waWQocGlkX3QgaWQpCitzdHJ1Y3QgYWdwX2NsaWVudCAqYWdwX2ZpbmRfY2xpZW50X2J5X3BpZChwaWRfdCBpZCkKIHsKIAlzdHJ1Y3QgYWdwX2NsaWVudCAqdGVtcDsKIApAQCAtNTA5LDcgKzUwOSw3IEBACiAJYWdwX2ZlLmN1cnJlbnRfY29udHJvbGxlci0+bnVtX2NsaWVudHMrKzsKIH0KIAotc3RhdGljIHN0cnVjdCBhZ3BfY2xpZW50ICphZ3BfY3JlYXRlX2NsaWVudChwaWRfdCBpZCkKK3N0cnVjdCBhZ3BfY2xpZW50ICphZ3BfY3JlYXRlX2NsaWVudChwaWRfdCBpZCkKIHsKIAlzdHJ1Y3QgYWdwX2NsaWVudCAqbmV3X2NsaWVudDsKIApAQCAtNTIyLDcgKzUyMiw3IEBACiAJcmV0dXJuIG5ld19jbGllbnQ7CiB9CiAKLXN0YXRpYyBpbnQgYWdwX3JlbW92ZV9jbGllbnQocGlkX3QgaWQpCitpbnQgYWdwX3JlbW92ZV9jbGllbnQocGlkX3QgaWQpCiB7CiAJc3RydWN0IGFncF9jbGllbnQgKmNsaWVudDsKIAlzdHJ1Y3QgYWdwX2NsaWVudCAqcHJldl9jbGllbnQ7CkBAIC03NDYsNyArNzQ2LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZ3Bpb2NfYWNxdWlyZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2KQoraW50IGFncGlvY19hY3F1aXJlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCiB7CiAJc3RydWN0IGFncF9jb250cm9sbGVyICpjb250cm9sbGVyOwogCkBAIC03ODksMTQgKzc4OSwxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IGFncGlvY19yZWxlYXNlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCitpbnQgYWdwaW9jX3JlbGVhc2Vfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdikKIHsKIAlEQkcoIiIpOwogCWFncF9jb250cm9sbGVyX3JlbGVhc2VfY3VycmVudChhZ3BfZmUuY3VycmVudF9jb250cm9sbGVyLCBwcml2KTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZ3Bpb2Nfc2V0dXBfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKK2ludCBhZ3Bpb2Nfc2V0dXBfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdiwgdm9pZCBfX3VzZXIgKmFyZykKIHsKIAlzdHJ1Y3QgYWdwX3NldHVwIG1vZGU7CiAKQEAgLTg3Niw3ICs4NzYsNyBAQAogCXJldHVybiAtRUlOVkFMOwogfQogCi1zdGF0aWMgaW50IGFncGlvY19wcm90ZWN0X3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYpCitpbnQgYWdwaW9jX3Byb3RlY3Rfd3JhcChzdHJ1Y3QgYWdwX2ZpbGVfcHJpdmF0ZSAqcHJpdikKIHsKIAlEQkcoIiIpOwogCS8qIFRoaXMgZnVuY3Rpb24gaXMgbm90IGN1cnJlbnRseSBpbXBsZW1lbnRlZCAqLwpAQCAtODkyLDYgKzg5Miw5IEBACiAJaWYgKGNvcHlfZnJvbV91c2VyKCZhbGxvYywgYXJnLCBzaXplb2Yoc3RydWN0IGFncF9hbGxvY2F0ZSkpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAorCWlmIChhbGxvYy50eXBlID49IEFHUF9VU0VSX1RZUEVTKQorCQlyZXR1cm4gLUVJTlZBTDsKKwogCW1lbW9yeSA9IGFncF9hbGxvY2F0ZV9tZW1vcnlfd3JhcChhbGxvYy5wZ19jb3VudCwgYWxsb2MudHlwZSk7CiAKIAlpZiAobWVtb3J5ID09IE5VTEwpCkBAIC05MDcsNyArOTEwLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBhZ3Bpb2NfZGVhbGxvY2F0ZV93cmFwKHN0cnVjdCBhZ3BfZmlsZV9wcml2YXRlICpwcml2LCBpbnQgYXJnKQoraW50IGFncGlvY19kZWFsbG9jYXRlX3dyYXAoc3RydWN0IGFncF9maWxlX3ByaXZhdGUgKnByaXYsIGludCBhcmcpCiB7CiAJc3RydWN0IGFncF9tZW1vcnkgKm1lbW9yeTsKIApAQCAtMTA0Myw2ICsxMDQ2LDkgQEAKIAkucmVhZAkJPSBhZ3BfcmVhZCwKIAkud3JpdGUJCT0gYWdwX3dyaXRlLAogCS5pb2N0bAkJPSBhZ3BfaW9jdGwsCisjaWZkZWYgQ09ORklHX0NPTVBBVAorCS5jb21wYXRfaW9jdGwJPSBjb21wYXRfYWdwX2lvY3RsLAorI2VuZGlmCiAJLm1tYXAJCT0gYWdwX21tYXAsCiAJLm9wZW4JCT0gYWdwX29wZW4sCiAJLnJlbGVhc2UJPSBhZ3BfcmVsZWFzZSwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvZ2VuZXJpYy5jIGIvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKaW5kZXggMzQ5MWQ2Zi4uNzkyMzMzNyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9nZW5lcmljLmMKQEAgLTEwMSw2ICsxMDEsNjMgQEAKIAlyZXR1cm4gLTE7CiB9CiAKKy8qCisgKiBVc2Uga21hbGxvYyBpZiBwb3NzaWJsZSBmb3IgdGhlIHBhZ2UgbGlzdC4gT3RoZXJ3aXNlIGZhbGwgYmFjayB0bworICogdm1hbGxvYy4gVGhpcyBzcGVlZHMgdGhpbmdzIHVwIGFuZCBhbHNvIHNhdmVzIG1lbW9yeSBmb3Igc21hbGwgQUdQCisgKiByZWdpb25zLgorICovCisKK3ZvaWQgYWdwX2FsbG9jX3BhZ2VfYXJyYXkoc2l6ZV90IHNpemUsIHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0pCit7CisJbWVtLT5tZW1vcnkgPSBOVUxMOworCW1lbS0+dm1hbGxvY19mbGFnID0gMDsKKworCWlmIChzaXplIDw9IDIqUEFHRV9TSVpFKQorCQltZW0tPm1lbW9yeSA9IGttYWxsb2Moc2l6ZSwgR0ZQX0tFUk5FTCB8IF9fR0ZQX05PUkVUUlkpOworCWlmIChtZW0tPm1lbW9yeSA9PSBOVUxMKSB7CisJCW1lbS0+bWVtb3J5ID0gdm1hbGxvYyhzaXplKTsKKwkJbWVtLT52bWFsbG9jX2ZsYWcgPSAxOworCX0KK30KK0VYUE9SVF9TWU1CT0woYWdwX2FsbG9jX3BhZ2VfYXJyYXkpOworCit2b2lkIGFncF9mcmVlX3BhZ2VfYXJyYXkoc3RydWN0IGFncF9tZW1vcnkgKm1lbSkKK3sKKwlpZiAobWVtLT52bWFsbG9jX2ZsYWcpIHsKKwkJdmZyZWUobWVtLT5tZW1vcnkpOworCX0gZWxzZSB7CisJCWtmcmVlKG1lbS0+bWVtb3J5KTsKKwl9Cit9CitFWFBPUlRfU1lNQk9MKGFncF9mcmVlX3BhZ2VfYXJyYXkpOworCisKK3N0YXRpYyBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2NyZWF0ZV91c2VyX21lbW9yeSh1bnNpZ25lZCBsb25nIG51bV9hZ3BfcGFnZXMpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm5ldzsKKwl1bnNpZ25lZCBsb25nIGFsbG9jX3NpemUgPSBudW1fYWdwX3BhZ2VzKnNpemVvZihzdHJ1Y3QgcGFnZSAqKTsKKworCW5ldyA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBhZ3BfbWVtb3J5KSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5ldyA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCW5ldy0+a2V5ID0gYWdwX2dldF9rZXkoKTsKKworCWlmIChuZXctPmtleSA8IDApIHsKKwkJa2ZyZWUobmV3KTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYWdwX2FsbG9jX3BhZ2VfYXJyYXkoYWxsb2Nfc2l6ZSwgbmV3KTsKKworCWlmIChuZXctPm1lbW9yeSA9PSBOVUxMKSB7CisJCWFncF9mcmVlX2tleShuZXctPmtleSk7CisJCWtmcmVlKG5ldyk7CisJCXJldHVybiBOVUxMOworCX0KKwluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gMDsKKwlyZXR1cm4gbmV3OworfQogCiBzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2NyZWF0ZV9tZW1vcnkoaW50IHNjcmF0Y2hfcGFnZXMpCiB7CkBAIC0xMTYsNyArMTczLDggQEAKIAkJa2ZyZWUobmV3KTsKIAkJcmV0dXJuIE5VTEw7CiAJfQotCW5ldy0+bWVtb3J5ID0gdm1hbGxvYyhQQUdFX1NJWkUgKiBzY3JhdGNoX3BhZ2VzKTsKKworCWFncF9hbGxvY19wYWdlX2FycmF5KFBBR0VfU0laRSAqIHNjcmF0Y2hfcGFnZXMsIG5ldyk7CiAKIAlpZiAobmV3LT5tZW1vcnkgPT0gTlVMTCkgewogCQlhZ3BfZnJlZV9rZXkobmV3LT5rZXkpOwpAQCAtMTI0LDYgKzE4Miw3IEBACiAJCXJldHVybiBOVUxMOwogCX0KIAluZXctPm51bV9zY3JhdGNoX3BhZ2VzID0gc2NyYXRjaF9wYWdlczsKKwluZXctPnR5cGUgPSBBR1BfTk9STUFMX01FTU9SWTsKIAlyZXR1cm4gbmV3OwogfQogRVhQT1JUX1NZTUJPTChhZ3BfY3JlYXRlX21lbW9yeSk7CkBAIC0xNDYsNiArMjA1LDExIEBACiAJaWYgKGN1cnItPmlzX2JvdW5kID09IFRSVUUpCiAJCWFncF91bmJpbmRfbWVtb3J5KGN1cnIpOwogCisJaWYgKGN1cnItPnR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpIHsKKwkJYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlKGN1cnIpOworCQlyZXR1cm47CisJfQorCiAJaWYgKGN1cnItPnR5cGUgIT0gMCkgewogCQljdXJyLT5icmlkZ2UtPmRyaXZlci0+ZnJlZV9ieV90eXBlKGN1cnIpOwogCQlyZXR1cm47CkBAIC0xNTcsNyArMjIxLDcgQEAKIAkJZmx1c2hfYWdwX21hcHBpbmdzKCk7CiAJfQogCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOwotCXZmcmVlKGN1cnItPm1lbW9yeSk7CisJYWdwX2ZyZWVfcGFnZV9hcnJheShjdXJyKTsKIAlrZnJlZShjdXJyKTsKIH0KIEVYUE9SVF9TWU1CT0woYWdwX2ZyZWVfbWVtb3J5KTsKQEAgLTE4OCw2ICsyNTIsMTMgQEAKIAlpZiAoKGF0b21pY19yZWFkKCZicmlkZ2UtPmN1cnJlbnRfbWVtb3J5X2FncCkgKyBwYWdlX2NvdW50KSA+IGJyaWRnZS0+bWF4X21lbW9yeV9hZ3ApCiAJCXJldHVybiBOVUxMOwogCisJaWYgKHR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpIHsKKwkJbmV3ID0gYWdwX2dlbmVyaWNfYWxsb2NfdXNlcihwYWdlX2NvdW50LCB0eXBlKTsKKwkJaWYgKG5ldykKKwkJCW5ldy0+YnJpZGdlID0gYnJpZGdlOworCQlyZXR1cm4gbmV3OworCX0KKwogCWlmICh0eXBlICE9IDApIHsKIAkJbmV3ID0gYnJpZGdlLT5kcml2ZXItPmFsbG9jX2J5X3R5cGUocGFnZV9jb3VudCwgdHlwZSk7CiAJCWlmIChuZXcpCkBAIC05NjAsNiArMTAzMSw3IEBACiAJb2ZmX3QgajsKIAl2b2lkICp0ZW1wOwogCXN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmJyaWRnZTsKKwlpbnQgbWFza190eXBlOwogCiAJYnJpZGdlID0gbWVtLT5icmlkZ2U7CiAJaWYgKCFicmlkZ2UpCkBAIC05OTUsNyArMTA2NywxMSBAQAogCW51bV9lbnRyaWVzIC09IGFncF9tZW1vcnlfcmVzZXJ2ZWQvUEFHRV9TSVpFOwogCWlmIChudW1fZW50cmllcyA8IDApIG51bV9lbnRyaWVzID0gMDsKIAotCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKKwlpZiAodHlwZSAhPSBtZW0tPnR5cGUpCisJCXJldHVybiAtRUlOVkFMOworCisJbWFza190eXBlID0gYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShicmlkZ2UsIHR5cGUpOworCWlmIChtYXNrX3R5cGUgIT0gMCkgewogCQkvKiBUaGUgZ2VuZXJpYyByb3V0aW5lcyBrbm93IG5vdGhpbmcgb2YgbWVtb3J5IHR5cGVzICovCiAJCXJldHVybiAtRUlOVkFMOwogCX0KQEAgLTEwMTgsNyArMTA5NCw4IEBACiAJfQogCiAJZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgewotCQl3cml0ZWwoYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGJyaWRnZSwgbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksIGJyaWRnZS0+Z2F0dF90YWJsZStqKTsKKwkJd3JpdGVsKGJyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShicmlkZ2UsIG1lbS0+bWVtb3J5W2ldLCBtYXNrX3R5cGUpLAorCQkgICAgICAgYnJpZGdlLT5nYXR0X3RhYmxlK2opOwogCX0KIAlyZWFkbChicmlkZ2UtPmdhdHRfdGFibGUrai0xKTsJLyogUENJIFBvc3RpbmcuICovCiAKQEAgLTEwMzIsNiArMTEwOSw3IEBACiB7CiAJc2l6ZV90IGk7CiAJc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlOworCWludCBtYXNrX3R5cGU7CiAKIAlicmlkZ2UgPSBtZW0tPmJyaWRnZTsKIAlpZiAoIWJyaWRnZSkKQEAgLTEwNDAsNyArMTExOCwxMSBAQAogCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKIAkJcmV0dXJuIDA7CiAKLQlpZiAodHlwZSAhPSAwIHx8IG1lbS0+dHlwZSAhPSAwKSB7CisJaWYgKHR5cGUgIT0gbWVtLT50eXBlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW1hc2tfdHlwZSA9IGJyaWRnZS0+ZHJpdmVyLT5hZ3BfdHlwZV90b19tYXNrX3R5cGUoYnJpZGdlLCB0eXBlKTsKKwlpZiAobWFza190eXBlICE9IDApIHsKIAkJLyogVGhlIGdlbmVyaWMgcm91dGluZXMga25vdyBub3RoaW5nIG9mIG1lbW9yeSB0eXBlcyAqLwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC0xMDU2LDIyICsxMTM4LDQwIEBACiB9CiBFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX3JlbW92ZV9tZW1vcnkpOwogCi0KIHN0cnVjdCBhZ3BfbWVtb3J5ICphZ3BfZ2VuZXJpY19hbGxvY19ieV90eXBlKHNpemVfdCBwYWdlX2NvdW50LCBpbnQgdHlwZSkKIHsKIAlyZXR1cm4gTlVMTDsKIH0KIEVYUE9SVF9TWU1CT0woYWdwX2dlbmVyaWNfYWxsb2NfYnlfdHlwZSk7CiAKLQogdm9pZCBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUoc3RydWN0IGFncF9tZW1vcnkgKmN1cnIpCiB7Ci0JdmZyZWUoY3Vyci0+bWVtb3J5KTsKKwlhZ3BfZnJlZV9wYWdlX2FycmF5KGN1cnIpOwogCWFncF9mcmVlX2tleShjdXJyLT5rZXkpOwogCWtmcmVlKGN1cnIpOwogfQogRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUpOwogCitzdHJ1Y3QgYWdwX21lbW9yeSAqYWdwX2dlbmVyaWNfYWxsb2NfdXNlcihzaXplX3QgcGFnZV9jb3VudCwgaW50IHR5cGUpCit7CisJc3RydWN0IGFncF9tZW1vcnkgKm5ldzsKKwlpbnQgaTsKKwlpbnQgcGFnZXM7CisKKwlwYWdlcyA9IChwYWdlX2NvdW50ICsgRU5UUklFU19QRVJfUEFHRSAtIDEpIC8gRU5UUklFU19QRVJfUEFHRTsKKwluZXcgPSBhZ3BfY3JlYXRlX3VzZXJfbWVtb3J5KHBhZ2VfY291bnQpOworCWlmIChuZXcgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGFnZV9jb3VudDsgaSsrKQorCQluZXctPm1lbW9yeVtpXSA9IDA7CisJbmV3LT5wYWdlX2NvdW50ID0gMDsKKwluZXctPnR5cGUgPSB0eXBlOworCW5ldy0+bnVtX3NjcmF0Y2hfcGFnZXMgPSBwYWdlczsKKworCXJldHVybiBuZXc7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX2FsbG9jX3VzZXIpOwogCiAvKgogICogQmFzaWMgUGFnZSBBbGxvY2F0aW9uIFJvdXRpbmVzIC0KQEAgLTExNjUsNiArMTI2NSwxNSBAQAogfQogRVhQT1JUX1NZTUJPTChhZ3BfZ2VuZXJpY19tYXNrX21lbW9yeSk7CiAKK2ludCBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZShzdHJ1Y3QgYWdwX2JyaWRnZV9kYXRhICpicmlkZ2UsCisJCQkJICBpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA+PSBBR1BfVVNFUl9UWVBFUykKKwkJcmV0dXJuIDA7CisJcmV0dXJuIHR5cGU7Cit9CitFWFBPUlRfU1lNQk9MKGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlKTsKKwogLyoKICAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW1wbGVtZW50ZWQgYWNjb3JkaW5nIHRvIHRoZSBBR1B2MyBzcGVjLAogICogd2hpY2ggY292ZXJzIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdGhhdCBoYWQgcHJldmlvdXNseSBiZWVuCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9ocC1hZ3AuYwppbmRleCA5MDdmYjY2Li44NDdkZWFiIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2hwLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvaHAtYWdwLmMKQEAgLTQzOCw2ICs0MzgsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiAJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvaTQ2MC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaTQ2MC1hZ3AuYwppbmRleCA5MTc2OTQ0Li4zZTc2MTg2IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL2k0NjAtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9pNDYwLWFncC5jCkBAIC0yOTMsNiArMjkzLDkgQEAKIAlwcl9kZWJ1ZygiaTQ2MF9pbnNlcnRfbWVtb3J5X3NtYWxsX2lvX3BhZ2UobWVtPSVwLCBwZ19zdGFydD0lbGQsIHR5cGU9JWQsIHBhZGRyMD0weCVseClcbiIsCiAJCSBtZW0sIHBnX3N0YXJ0LCB0eXBlLCBtZW0tPm1lbW9yeVswXSk7CiAKKwlpZiAodHlwZSA+PSBBR1BfVVNFUl9UWVBFUyB8fCBtZW0tPnR5cGUgPj0gQUdQX1VTRVJfVFlQRVMpCisJCXJldHVybiAtRUlOVkFMOworCiAJaW9fcGdfc3RhcnQgPSBJNDYwX0lPUEFHRVNfUEVSX0tQQUdFICogcGdfc3RhcnQ7CiAKIAl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOwpAQCAtMzk2LDYgKzM5OSw5IEBACiAJc3RydWN0IGxwX2Rlc2MgKnN0YXJ0LCAqZW5kLCAqbHA7CiAJdm9pZCAqdGVtcDsKIAorCWlmICh0eXBlID49IEFHUF9VU0VSX1RZUEVTIHx8IG1lbS0+dHlwZSA+PSBBR1BfVVNFUl9UWVBFUykKKwkJcmV0dXJuIC1FSU5WQUw7CisKIAl0ZW1wID0gYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplOwogCW51bV9lbnRyaWVzID0gQV9TSVpFXzgodGVtcCktPm51bV9lbnRyaWVzOwogCkBAIC01NzIsNiArNTc4LDcgQEAKICNlbmRpZgogCS5hbGxvY19ieV90eXBlCQk9IGFncF9nZW5lcmljX2FsbG9jX2J5X3R5cGUsCiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2FudF91c2VfYXBlcnR1cmUJPSAxLAogfTsKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvaW50ZWwtYWdwLmMKaW5kZXggYTMwMTFkZS4uMDZiMGJiNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9pbnRlbC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL2ludGVsLWFncC5jCkBAIC01LDYgKzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BjaS5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdlbWFwLmg+CiAjaW5jbHVkZSA8bGludXgvYWdwX2JhY2tlbmQuaD4KICNpbmNsdWRlICJhZ3AuaCIKQEAgLTI0LDYgKzI1LDkgQEAKICAgICAgICAgICAgICAgICAgYWdwX2JyaWRnZS0+ZGV2LT5kZXZpY2UgPT0gUENJX0RFVklDRV9JRF9JTlRFTF84Mjk2NUdfSEIpCiAKIAorZXh0ZXJuIGludCBhZ3BfbWVtb3J5X3Jlc2VydmVkOworCisKIC8qIEludGVsIDgxNSByZWdpc3RlciAqLwogI2RlZmluZSBJTlRFTF84MTVfQVBDT05UCTB4NTEKICNkZWZpbmUgSU5URUxfODE1X0FUVEJBU0VfTUFTSwl+MHgxRkZGRkZGRgpAQCAtNjgsMTIgKzcyLDE1IEBACiAKICNkZWZpbmUgQUdQX0RDQUNIRV9NRU1PUlkJMQogI2RlZmluZSBBR1BfUEhZU19NRU1PUlkJCTIKKyNkZWZpbmUgSU5URUxfQUdQX0NBQ0hFRF9NRU1PUlkgMwogCiBzdGF0aWMgc3RydWN0IGdhdHRfbWFzayBpbnRlbF9pODEwX21hc2tzW10gPQogewogCXsubWFzayA9IEk4MTBfUFRFX1ZBTElELCAudHlwZSA9IDB9LAogCXsubWFzayA9IChJODEwX1BURV9WQUxJRCB8IEk4MTBfUFRFX0xPQ0FMKSwgLnR5cGUgPSBBR1BfRENBQ0hFX01FTU9SWX0sCi0Jey5tYXNrID0gSTgxMF9QVEVfVkFMSUQsIC50eXBlID0gMH0KKwl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCwgLnR5cGUgPSAwfSwKKwl7Lm1hc2sgPSBJODEwX1BURV9WQUxJRCB8IEk4MzBfUFRFX1NZU1RFTV9DQUNIRUQsCisJIC50eXBlID0gSU5URUxfQUdQX0NBQ0hFRF9NRU1PUll9CiB9OwogCiBzdGF0aWMgc3RydWN0IF9pbnRlbF9pODEwX3ByaXZhdGUgewpAQCAtMTE3LDEzICsxMjQsMTUgQEAKIAogCWN1cnJlbnRfc2l6ZSA9IEFfU0laRV9GSVgoYWdwX2JyaWRnZS0+Y3VycmVudF9zaXplKTsKIAotCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbnRlbF9pODEwX3ByaXZhdGUuaTgxMF9kZXYsIEk4MTBfTU1BRERSLCAmdGVtcCk7Ci0JdGVtcCAmPSAweGZmZjgwMDAwOwotCi0JaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycyA9IGlvcmVtYXAodGVtcCwgMTI4ICogNDA5Nik7CiAJaWYgKCFpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzKSB7Ci0JCXByaW50ayhLRVJOX0VSUiBQRlggIlVuYWJsZSB0byByZW1hcCBtZW1vcnkuXG4iKTsKLQkJcmV0dXJuIC1FTk9NRU07CisJCXBjaV9yZWFkX2NvbmZpZ19kd29yZChpbnRlbF9pODEwX3ByaXZhdGUuaTgxMF9kZXYsIEk4MTBfTU1BRERSLCAmdGVtcCk7CisJCXRlbXAgJj0gMHhmZmY4MDAwMDsKKworCQlpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzID0gaW9yZW1hcCh0ZW1wLCAxMjggKiA0MDk2KTsKKwkJaWYgKCFpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzKSB7CisJCQlwcmludGsoS0VSTl9FUlIgUEZYICJVbmFibGUgdG8gcmVtYXAgbWVtb3J5LlxuIik7CisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQogCX0KIAogCWlmICgocmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX0RSQU1fQ1RMKQpAQCAtMjAxLDYyICsyMTAsNzkgQEAKIAlhdG9taWNfZGVjKCZhZ3BfYnJpZGdlLT5jdXJyZW50X21lbW9yeV9hZ3ApOwogfQogCitzdGF0aWMgaW50IGludGVsX2k4MzBfdHlwZV90b19tYXNrX3R5cGUoc3RydWN0IGFncF9icmlkZ2VfZGF0YSAqYnJpZGdlLAorCQkJCQlpbnQgdHlwZSkKK3sKKwlpZiAodHlwZSA8IEFHUF9VU0VSX1RZUEVTKQorCQlyZXR1cm4gdHlwZTsKKwllbHNlIGlmICh0eXBlID09IEFHUF9VU0VSX0NBQ0hFRF9NRU1PUlkpCisJCXJldHVybiBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWTsKKwllbHNlCisJCXJldHVybiAwOworfQorCiBzdGF0aWMgaW50IGludGVsX2k4MTBfaW5zZXJ0X2VudHJpZXMoc3RydWN0IGFncF9tZW1vcnkgKm1lbSwgb2ZmX3QgcGdfc3RhcnQsCiAJCQkJaW50IHR5cGUpCiB7CiAJaW50IGksIGosIG51bV9lbnRyaWVzOwogCXZvaWQgKnRlbXA7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IG1hc2tfdHlwZTsKIAogCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKIAludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOwogCiAJaWYgKChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCkgPiBudW1fZW50cmllcykKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKKwogCiAJZm9yIChqID0gcGdfc3RhcnQ7IGogPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBqKyspIHsKLQkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStqKSkpCi0JCQlyZXR1cm4gLUVCVVNZOwotCX0KLQotCWlmICh0eXBlICE9IDAgfHwgbWVtLT50eXBlICE9IDApIHsKLQkJaWYgKCh0eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKSAmJiAobWVtLT50eXBlID09IEFHUF9EQ0FDSEVfTUVNT1JZKSkgewotCQkJLyogc3BlY2lhbCBpbnNlcnQgKi8KLQkJCWlmICghbWVtLT5pc19mbHVzaGVkKSB7Ci0JCQkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7Ci0JCQkJbWVtLT5pc19mbHVzaGVkID0gVFJVRTsKLQkJCX0KLQotCQkJZm9yIChpID0gcGdfc3RhcnQ7IGkgPCAocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpOyBpKyspIHsKLQkJCQl3cml0ZWwoKGkqNDA5Nil8STgxMF9QVEVfTE9DQUx8STgxMF9QVEVfVkFMSUQsIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7Ci0JCQl9Ci0JCQlyZWFkbChpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKChpLTEpKjQpKTsJLyogUENJIFBvc3RpbmcuICovCi0KLQkJCWFncF9icmlkZ2UtPmRyaXZlci0+dGxiX2ZsdXNoKG1lbSk7Ci0JCQlyZXR1cm4gMDsKKwkJaWYgKCFQR0VfRU1QVFkoYWdwX2JyaWRnZSwgcmVhZGwoYWdwX2JyaWRnZS0+Z2F0dF90YWJsZStqKSkpIHsKKwkJCXJldCA9IC1FQlVTWTsKKwkJCWdvdG8gb3V0X2VycjsKIAkJfQotCQlpZiAoKHR5cGUgPT0gQUdQX1BIWVNfTUVNT1JZKSAmJiAobWVtLT50eXBlID09IEFHUF9QSFlTX01FTU9SWSkpCi0JCQlnb3RvIGluc2VydDsKLQkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCi1pbnNlcnQ6Ci0JaWYgKCFtZW0tPmlzX2ZsdXNoZWQpIHsKLQkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7Ci0JCW1lbS0+aXNfZmx1c2hlZCA9IFRSVUU7Ci0JfQorCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKKwkJZ290byBvdXRfZXJyOwogCi0JZm9yIChpID0gMCwgaiA9IHBnX3N0YXJ0OyBpIDwgbWVtLT5wYWdlX2NvdW50OyBpKyssIGorKykgewotCQl3cml0ZWwoYWdwX2JyaWRnZS0+ZHJpdmVyLT5tYXNrX21lbW9yeShhZ3BfYnJpZGdlLAotCQkJbWVtLT5tZW1vcnlbaV0sIG1lbS0+dHlwZSksCi0JCQlpbnRlbF9pODEwX3ByaXZhdGUucmVnaXN0ZXJzK0k4MTBfUFRFX0JBU0UrKGoqNCkpOworCW1hc2tfdHlwZSA9IGFncF9icmlkZ2UtPmRyaXZlci0+YWdwX3R5cGVfdG9fbWFza190eXBlKGFncF9icmlkZ2UsIHR5cGUpOworCisJc3dpdGNoIChtYXNrX3R5cGUpIHsKKwljYXNlIEFHUF9EQ0FDSEVfTUVNT1JZOgorCQlpZiAoIW1lbS0+aXNfZmx1c2hlZCkKKwkJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOworCQlmb3IgKGkgPSBwZ19zdGFydDsgaSA8IChwZ19zdGFydCArIG1lbS0+cGFnZV9jb3VudCk7IGkrKykgeworCQkJd3JpdGVsKChpKjQwOTYpfEk4MTBfUFRFX0xPQ0FMfEk4MTBfUFRFX1ZBTElELAorCQkJICAgICAgIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaSo0KSk7CisJCX0KKwkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKygoaS0xKSo0KSk7CisJCWJyZWFrOworCWNhc2UgQUdQX1BIWVNfTUVNT1JZOgorCWNhc2UgQUdQX05PUk1BTF9NRU1PUlk6CisJCWlmICghbWVtLT5pc19mbHVzaGVkKQorCQkJZ2xvYmFsX2NhY2hlX2ZsdXNoKCk7CisJCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKKwkJCXdyaXRlbChhZ3BfYnJpZGdlLT5kcml2ZXItPm1hc2tfbWVtb3J5KGFncF9icmlkZ2UsCisJCQkJCQkJICAgICAgIG1lbS0+bWVtb3J5W2ldLAorCQkJCQkJCSAgICAgICBtYXNrX3R5cGUpLAorCQkJICAgICAgIGludGVsX2k4MTBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CisJCX0KKwkJcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKygoai0xKSo0KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWdvdG8gb3V0X2VycjsKIAl9Ci0JcmVhZGwoaW50ZWxfaTgxMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKygoai0xKSo0KSk7CS8qIFBDSSBQb3N0aW5nLiAqLwogCiAJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKLQlyZXR1cm4gMDsKK291dDoKKwlyZXQgPSAwOworb3V0X2VycjoKKwltZW0tPmlzX2ZsdXNoZWQgPSAxOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfaTgxMF9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLCBvZmZfdCBwZ19zdGFydCwKQEAgLTMzNywxMiArMzYzLDExIEBACiAJCW5ldy0+dHlwZSA9IEFHUF9EQ0FDSEVfTUVNT1JZOwogCQluZXctPnBhZ2VfY291bnQgPSBwZ19jb3VudDsKIAkJbmV3LT5udW1fc2NyYXRjaF9wYWdlcyA9IDA7Ci0JCXZmcmVlKG5ldy0+bWVtb3J5KTsKKwkJYWdwX2ZyZWVfcGFnZV9hcnJheShuZXcpOwogCQlyZXR1cm4gbmV3OwogCX0KIAlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCiAJCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOwotCiAJcmV0dXJuIE5VTEw7CiB9CiAKQEAgLTM1Nyw3ICszODIsNyBAQAogCQkJCSBnYXJ0X3RvX3ZpcnQoY3Vyci0+bWVtb3J5WzBdKSk7CiAJCQlnbG9iYWxfZmx1c2hfdGxiKCk7CiAJCX0KLQkJdmZyZWUoY3Vyci0+bWVtb3J5KTsKKwkJYWdwX2ZyZWVfcGFnZV9hcnJheShjdXJyKTsKIAl9CiAJa2ZyZWUoY3Vycik7CiB9CkBAIC02MTksOSArNjQ0LDExIEBACiB7CiAJaW50IGksaixudW1fZW50cmllczsKIAl2b2lkICp0ZW1wOworCWludCByZXQgPSAtRUlOVkFMOworCWludCBtYXNrX3R5cGU7CiAKIAlpZiAobWVtLT5wYWdlX2NvdW50ID09IDApCi0JCXJldHVybiAwOworCQlnb3RvIG91dDsKIAogCXRlbXAgPSBhZ3BfYnJpZGdlLT5jdXJyZW50X3NpemU7CiAJbnVtX2VudHJpZXMgPSBBX1NJWkVfRklYKHRlbXApLT5udW1fZW50cmllczsKQEAgLTYzMSwzNCArNjU4LDQxIEBACiAJCQkJcGdfc3RhcnQsaW50ZWxfaTgzMF9wcml2YXRlLmd0dF9lbnRyaWVzKTsKIAogCQlwcmludGsgKEtFUk5fSU5GTyBQRlggIlRyeWluZyB0byBpbnNlcnQgaW50byBsb2NhbC9zdG9sZW4gbWVtb3J5XG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCWdvdG8gb3V0X2VycjsKIAl9CiAKIAlpZiAoKHBnX3N0YXJ0ICsgbWVtLT5wYWdlX2NvdW50KSA+IG51bV9lbnRyaWVzKQotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOwogCiAJLyogVGhlIGk4MzAgY2FuJ3QgY2hlY2sgdGhlIEdUVCBmb3IgZW50cmllcyBzaW5jZSBpdHMgcmVhZCBvbmx5LAogCSAqIGRlcGVuZCBvbiB0aGUgY2FsbGVyIHRvIG1ha2UgdGhlIGNvcnJlY3Qgb2Zmc2V0IGRlY2lzaW9ucy4KIAkgKi8KIAotCWlmICgodHlwZSAhPSAwICYmIHR5cGUgIT0gQUdQX1BIWVNfTUVNT1JZKSB8fAotCQkobWVtLT50eXBlICE9IDAgJiYgbWVtLT50eXBlICE9IEFHUF9QSFlTX01FTU9SWSkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKKwkJZ290byBvdXRfZXJyOwogCi0JaWYgKCFtZW0tPmlzX2ZsdXNoZWQpIHsKKwltYXNrX3R5cGUgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShhZ3BfYnJpZGdlLCB0eXBlKTsKKworCWlmIChtYXNrX3R5cGUgIT0gMCAmJiBtYXNrX3R5cGUgIT0gQUdQX1BIWVNfTUVNT1JZICYmCisJICAgIG1hc2tfdHlwZSAhPSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWSkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKCFtZW0tPmlzX2ZsdXNoZWQpCiAJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOwotCX0KIAogCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKIAkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKLQkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLAotCQkJaW50ZWxfaTgzMF9wcml2YXRlLnJlZ2lzdGVycytJODEwX1BURV9CQVNFKyhqKjQpKTsKKwkJCQkJCSAgICAgICBtZW0tPm1lbW9yeVtpXSwgbWFza190eXBlKSwKKwkJICAgICAgIGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoaio0KSk7CiAJfQogCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5yZWdpc3RlcnMrSTgxMF9QVEVfQkFTRSsoKGotMSkqNCkpOwotCiAJYWdwX2JyaWRnZS0+ZHJpdmVyLT50bGJfZmx1c2gobWVtKTsKLQlyZXR1cm4gMDsKKworb3V0OgorCXJldCA9IDA7CitvdXRfZXJyOgorCW1lbS0+aXNfZmx1c2hlZCA9IDE7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIGludCBpbnRlbF9pODMwX3JlbW92ZV9lbnRyaWVzKHN0cnVjdCBhZ3BfbWVtb3J5ICptZW0sb2ZmX3QgcGdfc3RhcnQsCkBAIC02ODcsNyArNzIxLDYgQEAKIHsKIAlpZiAodHlwZSA9PSBBR1BfUEhZU19NRU1PUlkpCiAJCXJldHVybiBhbGxvY19hZ3BwaHlzbWVtX2k4eHgocGdfY291bnQsIHR5cGUpOwotCiAJLyogYWx3YXlzIHJldHVybiBOVUxMIGZvciBvdGhlciBhbGxvY2F0aW9uIHR5cGVzIGZvciBub3cgKi8KIAlyZXR1cm4gTlVMTDsKIH0KQEAgLTczNCw5ICs3NjcsMTEgQEAKIHsKIAlpbnQgaSxqLG51bV9lbnRyaWVzOwogCXZvaWQgKnRlbXA7CisJaW50IHJldCA9IC1FSU5WQUw7CisJaW50IG1hc2tfdHlwZTsKIAogCWlmIChtZW0tPnBhZ2VfY291bnQgPT0gMCkKLQkJcmV0dXJuIDA7CisJCWdvdG8gb3V0OwogCiAJdGVtcCA9IGFncF9icmlkZ2UtPmN1cnJlbnRfc2l6ZTsKIAludW1fZW50cmllcyA9IEFfU0laRV9GSVgodGVtcCktPm51bV9lbnRyaWVzOwpAQCAtNzQ2LDMzICs3ODEsNDEgQEAKIAkJCQlwZ19zdGFydCxpbnRlbF9pODMwX3ByaXZhdGUuZ3R0X2VudHJpZXMpOwogCiAJCXByaW50ayAoS0VSTl9JTkZPIFBGWCAiVHJ5aW5nIHRvIGluc2VydCBpbnRvIGxvY2FsL3N0b2xlbiBtZW1vcnlcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKKwkJZ290byBvdXRfZXJyOwogCX0KIAogCWlmICgocGdfc3RhcnQgKyBtZW0tPnBhZ2VfY291bnQpID4gbnVtX2VudHJpZXMpCi0JCXJldHVybiAtRUlOVkFMOworCQlnb3RvIG91dF9lcnI7CiAKLQkvKiBUaGUgaTgzMCBjYW4ndCBjaGVjayB0aGUgR1RUIGZvciBlbnRyaWVzIHNpbmNlIGl0cyByZWFkIG9ubHksCisJLyogVGhlIGk5MTUgY2FuJ3QgY2hlY2sgdGhlIEdUVCBmb3IgZW50cmllcyBzaW5jZSBpdHMgcmVhZCBvbmx5LAogCSAqIGRlcGVuZCBvbiB0aGUgY2FsbGVyIHRvIG1ha2UgdGhlIGNvcnJlY3Qgb2Zmc2V0IGRlY2lzaW9ucy4KIAkgKi8KIAotCWlmICgodHlwZSAhPSAwICYmIHR5cGUgIT0gQUdQX1BIWVNfTUVNT1JZKSB8fAotCQkobWVtLT50eXBlICE9IDAgJiYgbWVtLT50eXBlICE9IEFHUF9QSFlTX01FTU9SWSkpCi0JCXJldHVybiAtRUlOVkFMOworCWlmICh0eXBlICE9IG1lbS0+dHlwZSkKKwkJZ290byBvdXRfZXJyOwogCi0JaWYgKCFtZW0tPmlzX2ZsdXNoZWQpIHsKKwltYXNrX3R5cGUgPSBhZ3BfYnJpZGdlLT5kcml2ZXItPmFncF90eXBlX3RvX21hc2tfdHlwZShhZ3BfYnJpZGdlLCB0eXBlKTsKKworCWlmIChtYXNrX3R5cGUgIT0gMCAmJiBtYXNrX3R5cGUgIT0gQUdQX1BIWVNfTUVNT1JZICYmCisJICAgIG1hc2tfdHlwZSAhPSBJTlRFTF9BR1BfQ0FDSEVEX01FTU9SWSkKKwkJZ290byBvdXRfZXJyOworCisJaWYgKCFtZW0tPmlzX2ZsdXNoZWQpCiAJCWdsb2JhbF9jYWNoZV9mbHVzaCgpOwotCQltZW0tPmlzX2ZsdXNoZWQgPSBUUlVFOwotCX0KIAogCWZvciAoaSA9IDAsIGogPSBwZ19zdGFydDsgaSA8IG1lbS0+cGFnZV9jb3VudDsgaSsrLCBqKyspIHsKIAkJd3JpdGVsKGFncF9icmlkZ2UtPmRyaXZlci0+bWFza19tZW1vcnkoYWdwX2JyaWRnZSwKLQkJCW1lbS0+bWVtb3J5W2ldLCBtZW0tPnR5cGUpLCBpbnRlbF9pODMwX3ByaXZhdGUuZ3R0K2opOworCQkJbWVtLT5tZW1vcnlbaV0sIG1hc2tfdHlwZSksIGludGVsX2k4MzBfcHJpdmF0ZS5ndHQraik7CiAJfQotCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5ndHQrai0xKTsKIAorCXJlYWRsKGludGVsX2k4MzBfcHJpdmF0ZS5ndHQrai0xKTsKIAlhZ3BfYnJpZGdlLT5kcml2ZXItPnRsYl9mbHVzaChtZW0pOwotCXJldHVybiAwOworCisgb3V0OgorCXJldCA9IDA7Cisgb3V0X2VycjoKKwltZW0tPmlzX2ZsdXNoZWQgPSAxOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgaW50ZWxfaTkxNV9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgYWdwX21lbW9yeSAqbWVtLG9mZl90IHBnX3N0YXJ0LApAQCAtODAzLDcgKzg0Niw3IEBACiAgKi8KIHN0YXRpYyBpbnQgaW50ZWxfaTl4eF9mZXRjaF9zaXplKHZvaWQpCiB7Ci0JaW50IG51bV9zaXplcyA9IHNpemVvZihpbnRlbF9pODMwX3NpemVzKSAvIHNpemVvZigqaW50ZWxfaTgzMF9zaXplcyk7CisJaW50IG51bV9zaXplcyA9IEFSUkFZX1NJWkUoaW50ZWxfaTgzMF9zaXplcyk7CiAJaW50IGFwZXJfc2l6ZTsgLyogc2l6ZSBpbiBtZWdhYnl0ZXMgKi8KIAlpbnQgaTsKIApAQCAtMTM4NCw2ICsxNDI3LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MTBfZHJpdmVyID0gewpAQCAtMTQwOCw2ICsxNDUyLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGludGVsX2k4MTBfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzgxNV9kcml2ZXIgPSB7CkBAIC0xNDMxLDYgKzE0NzYsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzgzMF9kcml2ZXIgPSB7CkBAIC0xNDU1LDYgKzE1MDEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MjBfZHJpdmVyID0gewpAQCAtMTQ3OCw2ICsxNTI1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF84MzBtcF9kcml2ZXIgPSB7CkBAIC0xNTAxLDYgKzE1NDksNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzg0MF9kcml2ZXIgPSB7CkBAIC0xNTI0LDYgKzE1NzMsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzg0NV9kcml2ZXIgPSB7CkBAIC0xNTQ3LDYgKzE1OTcsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzg1MF9kcml2ZXIgPSB7CkBAIC0xNTcwLDYgKzE2MjEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzg2MF9kcml2ZXIgPSB7CkBAIC0xNTkzLDYgKzE2NDUsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIGludGVsXzkxNV9kcml2ZXIgPSB7CkBAIC0xNjE3LDYgKzE2NzAsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gaW50ZWxfaTgxMF9mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF9pOTY1X2RyaXZlciA9IHsKQEAgLTE2NDEsNiArMTY5NSw3IEBACiAgICAgICAgLmZyZWVfYnlfdHlwZSAgICAgICAgICAgPSBpbnRlbF9pODEwX2ZyZWVfYnlfdHlwZSwKICAgICAgICAuYWdwX2FsbG9jX3BhZ2UgICAgICAgICA9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAgICAgICAgLmFncF9kZXN0cm95X3BhZ2UgICAgICAgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisgICAgICAgLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBpbnRlbF9pODMwX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfYnJpZGdlX2RyaXZlciBpbnRlbF83NTA1X2RyaXZlciA9IHsKQEAgLTE2NjQsNiArMTcxOSw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBpbnQgZmluZF9pODEwKHUxNiBkZXZpY2UpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL252aWRpYS1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jCmluZGV4IGRmN2YzN2IuLjI1NjMyODYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3AvbnZpZGlhLWFncC5jCkBAIC0zMTAsNiArMzEwLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgYWdwX252aWRpYV9wcm9iZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3AvcGFyaXNjLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9wYXJpc2MtYWdwLmMKaW5kZXggMTdjNTBiMC4uYjdiNDU5MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9wYXJpc2MtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9wYXJpc2MtYWdwLmMKQEAgLTIyOCw2ICsyMjgsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiAJLmNhbnRfdXNlX2FwZXJ0dXJlCT0gMSwKIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9hZ3Avc2dpLWFncC5jIGIvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKaW5kZXggOTAyNjQ4ZC4uOTJkMWRjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC9zZ2ktYWdwLmMKQEAgLTI2NSw2ICsyNjUsNyBAQAogCS5mcmVlX2J5X3R5cGUgPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlID0gc2dpX3Rpb2NhX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UgPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIAkuY2FudF91c2VfYXBlcnR1cmUgPSAxLAogCS5uZWVkc19zY3JhdGNoX3BhZ2UgPSAwLAogCS5udW1fYXBlcnR1cmVfc2l6ZXMgPSAxLApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC9zaXMtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3Npcy1hZ3AuYwppbmRleCBhMDBmZDQ4Li42MDM0MmI3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvYWdwL3Npcy1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3Npcy1hZ3AuYwpAQCAtMTQwLDYgKzE0MCw3IEBACiAJLmZyZWVfYnlfdHlwZQkJPSBhZ3BfZ2VuZXJpY19mcmVlX2J5X3R5cGUsCiAJLmFncF9hbGxvY19wYWdlCQk9IGFncF9nZW5lcmljX2FsbG9jX3BhZ2UsCiAJLmFncF9kZXN0cm95X3BhZ2UJPSBhZ3BfZ2VuZXJpY19kZXN0cm95X3BhZ2UsCisJLmFncF90eXBlX3RvX21hc2tfdHlwZSAgPSBhZ3BfZ2VuZXJpY190eXBlX3RvX21hc2tfdHlwZSwKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYWdwX2RldmljZV9pZHMgc2lzX2FncF9kZXZpY2VfaWRzW10gX19kZXZpbml0ZGF0YSA9CmRpZmYgLS1naXQgYS9kcml2ZXJzL2NoYXIvYWdwL3N3b3Jrcy1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCmluZGV4IDRmMmQ3ZDkuLjlmNWFlNzcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCisrKyBiL2RyaXZlcnMvY2hhci9hZ3Avc3dvcmtzLWFncC5jCkBAIC00NDQsNiArNDQ0LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIGludCBfX2RldmluaXQgYWdwX3NlcnZlcndvcmtzX3Byb2JlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYyBiL2RyaXZlcnMvY2hhci9hZ3AvdW5pbm9ydGgtYWdwLmMKaW5kZXggZGZmYzE5My4uNmM0NTcwMiAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC91bmlub3J0aC1hZ3AuYworKysgYi9kcml2ZXJzL2NoYXIvYWdwL3VuaW5vcnRoLWFncC5jCkBAIC01MTAsNiArNTEwLDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCiB9OwogCkBAIC01MzQsNiArNTM1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogCS5jYW50X3VzZV9hcGVydHVyZQk9IDEsCiAJLm5lZWRzX3NjcmF0Y2hfcGFnZQk9IDEsCiB9OwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMgYi9kcml2ZXJzL2NoYXIvYWdwL3ZpYS1hZ3AuYwppbmRleCAyZGVkN2EyOC4uMmU3YzA0MyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMKKysrIGIvZHJpdmVycy9jaGFyL2FncC92aWEtYWdwLmMKQEAgLTE5MSw2ICsxOTEsNyBAQAogCS5mcmVlX2J5X3R5cGUJCT0gYWdwX2dlbmVyaWNfZnJlZV9ieV90eXBlLAogCS5hZ3BfYWxsb2NfcGFnZQkJPSBhZ3BfZ2VuZXJpY19hbGxvY19wYWdlLAogCS5hZ3BfZGVzdHJveV9wYWdlCT0gYWdwX2dlbmVyaWNfZGVzdHJveV9wYWdlLAorCS5hZ3BfdHlwZV90b19tYXNrX3R5cGUgID0gYWdwX2dlbmVyaWNfdHlwZV90b19tYXNrX3R5cGUsCiB9OwogCiBzdGF0aWMgc3RydWN0IGFncF9icmlkZ2VfZHJpdmVyIHZpYV9kcml2ZXIgPSB7CkBAIC0yMTQsNiArMjE1LDcgQEAKIAkuZnJlZV9ieV90eXBlCQk9IGFncF9nZW5lcmljX2ZyZWVfYnlfdHlwZSwKIAkuYWdwX2FsbG9jX3BhZ2UJCT0gYWdwX2dlbmVyaWNfYWxsb2NfcGFnZSwKIAkuYWdwX2Rlc3Ryb3lfcGFnZQk9IGFncF9nZW5lcmljX2Rlc3Ryb3lfcGFnZSwKKwkuYWdwX3R5cGVfdG9fbWFza190eXBlICA9IGFncF9nZW5lcmljX3R5cGVfdG9fbWFza190eXBlLAogfTsKIAogc3RhdGljIHN0cnVjdCBhZ3BfZGV2aWNlX2lkcyB2aWFfYWdwX2RldmljZV9pZHNbXSBfX2RldmluaXRkYXRhID0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYyBiL2RyaXZlcnMvY2hhci9oYW5nY2hlY2stdGltZXIuYwppbmRleCAxYWE5M2E3Li5hZTc2YTlmIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvaGFuZ2NoZWNrLXRpbWVyLmMKKysrIGIvZHJpdmVycy9jaGFyL2hhbmdjaGVjay10aW1lci5jCkBAIC0xMTcsNyArMTE3LDcgQEAKIF9fc2V0dXAoImhjaGVja19kdW1wX3Rhc2tzIiwgaGFuZ2NoZWNrX3BhcnNlX2R1bXBfdGFza3MpOwogI2VuZGlmIC8qIG5vdCBNT0RVTEUgKi8KIAotI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfUzM5MCkKKyNpZiBkZWZpbmVkKENPTkZJR19TMzkwKQogIyBkZWZpbmUgSEFWRV9NT05PVE9OSUMKICMgZGVmaW5lIFRJTUVSX0ZSRVEgMTAwMDAwMDAwMFVMTAogI2VsaWYgZGVmaW5lZChDT05GSUdfSUE2NCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9zeXNycS5jIGIvZHJpdmVycy9jaGFyL3N5c3JxLmMKaW5kZXggYmU3M2M4MC4uMWQ4YzRhZTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9zeXNycS5jCisrKyBiL2RyaXZlcnMvY2hhci9zeXNycS5jCkBAIC0zNiw2ICszNiw3IEBACiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CiAKICNpbmNsdWRlIDxhc20vcHRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CkBAIC0xNTgsNiArMTU5LDE3IEBACiAJLmVuYWJsZV9tYXNrCT0gU1lTUlFfRU5BQkxFX1NZTkMsCiB9OwogCitzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfc2hvd190aW1lcnMoaW50IGtleSwgc3RydWN0IHR0eV9zdHJ1Y3QgKnR0eSkKK3sKKwlzeXNycV90aW1lcl9saXN0X3Nob3coKTsKK30KKworc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd190aW1lcnNfb3AgPSB7CisJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd190aW1lcnMsCisJLmhlbHBfbXNnCT0gInNob3ctYWxsLXRpbWVycyhRKSIsCisJLmFjdGlvbl9tc2cJPSAiU2hvdyBQZW5kaW5nIFRpbWVycyIsCit9OworCiBzdGF0aWMgdm9pZCBzeXNycV9oYW5kbGVfbW91bnRybyhpbnQga2V5LCBzdHJ1Y3QgdHR5X3N0cnVjdCAqdHR5KQogewogCWVtZXJnZW5jeV9yZW1vdW50KCk7CkBAIC0zMzUsNyArMzQ3LDcgQEAKIAkvKiBvOiBUaGlzIHdpbGwgb2Z0ZW4gYmUgcmVnaXN0ZXJlZCBhcyAnT2ZmJyBhdCBpbml0IHRpbWUgKi8KIAlOVUxMLAkJCQkvKiBvICovCiAJJnN5c3JxX3Nob3dyZWdzX29wLAkJLyogcCAqLwotCU5VTEwsCQkJCS8qIHEgKi8KKwkmc3lzcnFfc2hvd190aW1lcnNfb3AsCQkvKiBxICovCiAJJnN5c3JxX3VucmF3X29wLAkJLyogciAqLwogCSZzeXNycV9zeW5jX29wLAkJCS8qIHMgKi8KIAkmc3lzcnFfc2hvd3N0YXRlX29wLAkJLyogdCAqLwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9hY3BpX3BtLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwppbmRleCBiNmJjZGJiLi5jY2FhNmEzIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2FjcGlfcG0uYwpAQCAtMTYsMTUgKzE2LDEzIEBACiAgKiBUaGlzIGZpbGUgaXMgbGljZW5zZWQgdW5kZXIgdGhlIEdQTCB2Mi4KICAqLwogCisjaW5jbHVkZSA8bGludXgvYWNwaV9wbXRtci5oPgogI2luY2x1ZGUgPGxpbnV4L2Nsb2Nrc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAjaW5jbHVkZSA8YXNtL2lvLmg+CiAKLS8qIE51bWJlciBvZiBQTVRNUiB0aWNrcyBleHBlY3RlZCBkdXJpbmcgY2FsaWJyYXRpb24gcnVuICovCi0jZGVmaW5lIFBNVE1SX1RJQ0tTX1BFUl9TRUMgMzU3OTU0NQotCiAvKgogICogVGhlIEkvTyBwb3J0IHRoZSBQTVRNUiByZXNpZGVzIGF0LgogICogVGhlIGxvY2F0aW9uIGlzIGRldGVjdGVkIGR1cmluZyBzZXR1cF9hcmNoKCksCkBAIC0zMiwxNSArMzAsMTMgQEAKICAqLwogdTMyIHBtdG1yX2lvcG9ydCBfX3JlYWRfbW9zdGx5OwogCi0jZGVmaW5lIEFDUElfUE1fTUFTSyBDTE9DS1NPVVJDRV9NQVNLKDI0KSAvKiBsaW1pdCBpdCB0byAyNCBiaXRzICovCi0KIHN0YXRpYyBpbmxpbmUgdTMyIHJlYWRfcG10bXIodm9pZCkKIHsKIAkvKiBtYXNrIHRoZSBvdXRwdXQgdG8gMjQgYml0cyAqLwogCXJldHVybiBpbmwocG10bXJfaW9wb3J0KSAmIEFDUElfUE1fTUFTSzsKIH0KIAotc3RhdGljIGN5Y2xlX3QgYWNwaV9wbV9yZWFkX3ZlcmlmaWVkKHZvaWQpCit1MzIgYWNwaV9wbV9yZWFkX3ZlcmlmaWVkKHZvaWQpCiB7CiAJdTMyIHYxID0gMCwgdjIgPSAwLCB2MyA9IDA7CiAKQEAgLTU3LDcgKzUzLDEyIEBACiAJfSB3aGlsZSAodW5saWtlbHkoKHYxID4gdjIgJiYgdjEgPCB2MykgfHwgKHYyID4gdjMgJiYgdjIgPCB2MSkKIAkJCSAgfHwgKHYzID4gdjEgJiYgdjMgPCB2MikpKTsKIAotCXJldHVybiAoY3ljbGVfdCl2MjsKKwlyZXR1cm4gdjI7Cit9CisKK3N0YXRpYyBjeWNsZV90IGFjcGlfcG1fcmVhZF9zbG93KHZvaWQpCit7CisJcmV0dXJuIChjeWNsZV90KWFjcGlfcG1fcmVhZF92ZXJpZmllZCgpOwogfQogCiBzdGF0aWMgY3ljbGVfdCBhY3BpX3BtX3JlYWQodm9pZCkKQEAgLTcyLDcgKzczLDggQEAKIAkubWFzawkJPSAoY3ljbGVfdClBQ1BJX1BNX01BU0ssCiAJLm11bHQJCT0gMCwgLyp0byBiZSBjYWx1Y2xhdGVkKi8KIAkuc2hpZnQJCT0gMjIsCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKKwogfTsKIAogCkBAIC04Nyw3ICs4OSw3IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX3BtX25lZWRfd29ya2Fyb3VuZCh2b2lkKQogewotCWNsb2Nrc291cmNlX2FjcGlfcG0ucmVhZCA9IGFjcGlfcG1fcmVhZF92ZXJpZmllZDsKKwljbG9ja3NvdXJjZV9hY3BpX3BtLnJlYWQgPSBhY3BpX3BtX3JlYWRfc2xvdzsKIAljbG9ja3NvdXJjZV9hY3BpX3BtLnJhdGluZyA9IDExMDsKIH0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9jbG9ja3NvdXJjZS9jeWNsb25lLmMgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwppbmRleCBiZjRkM2Q1Li40ZjM5MjVjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYworKysgYi9kcml2ZXJzL2Nsb2Nrc291cmNlL2N5Y2xvbmUuYwpAQCAtMzEsNyArMzEsNyBAQAogCS5tYXNrCQk9IENZQ0xPTkVfVElNRVJfTUFTSywKIAkubXVsdAkJPSAxMCwKIAkuc2hpZnQJCT0gMCwKLQkuaXNfY29udGludW91cwk9IDEsCisJLmZsYWdzCQk9IENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTLAogfTsKIAogc3RhdGljIGludCBfX2luaXQgaW5pdF9jeWNsb25lX2Nsb2Nrc291cmNlKHZvaWQpCmRpZmYgLS1naXQgYS9kcml2ZXJzL2Nsb2Nrc291cmNlL3NjeDIwMF9ocnQuYyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2N4MjAwX2hydC5jCmluZGV4IDIyOTE1Y2MuLmI5MmRhNjcgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2N4MjAwX2hydC5jCisrKyBiL2RyaXZlcnMvY2xvY2tzb3VyY2Uvc2N4MjAwX2hydC5jCkBAIC01Nyw3ICs1Nyw3IEBACiAJLnJhdGluZwkJPSAyNTAsCiAJLnJlYWQJCT0gcmVhZF9ocnQsCiAJLm1hc2sJCT0gQ0xPQ0tTT1VSQ0VfTUFTSygzMiksCi0JLmlzX2NvbnRpbnVvdXMJPSAxLAorCS5mbGFncwkJPSBDTE9DS19TT1VSQ0VfSVNfQ09OVElOVU9VUywKIAkvKiBtdWx0LCBzaGlmdCBhcmUgc2V0IGJhc2VkIG9uIG1oejI3IGZsYWcgKi8KIH07CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9LY29uZmlnIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKaW5kZXggNDkxNzc5YS4uZDE1NWU4MSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKKysrIGIvZHJpdmVycy9jcHVmcmVxL0tjb25maWcKQEAgLTE2LDcgKzE2LDcgQEAKIGlmIENQVV9GUkVRCiAKIGNvbmZpZyBDUFVfRlJFUV9UQUJMRQotICAgICAgIGRlZl90cmlzdGF0ZSBtCisgICAgICAgdHJpc3RhdGUKIAogY29uZmlnIENQVV9GUkVRX0RFQlVHCiAJYm9vbCAiRW5hYmxlIENQVWZyZXEgZGVidWdnaW5nIgpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxLmMKaW5kZXggYTQ1Y2M4OS4uZjUyZmFjYyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXEuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcS5jCkBAIC00MSw4ICs0MSw2NyBAQAogc3RhdGljIHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqY3B1ZnJlcV9jcHVfZGF0YVtOUl9DUFVTXTsKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soY3B1ZnJlcV9kcml2ZXJfbG9jayk7CiAKKy8qCisgKiBjcHVfcG9saWN5X3J3c2VtIGlzIGEgcGVyIENQVSByZWFkZXItd3JpdGVyIHNlbWFwaG9yZSBkZXNpZ25lZCB0byBjdXJlCisgKiBhbGwgY3B1ZnJlcS9ob3RwbHVnL3dvcmtxdWV1ZS9ldGMgcmVsYXRlZCBsb2NrIGlzc3Vlcy4KKyAqCisgKiBUaGUgcnVsZXMgZm9yIHRoaXMgc2VtYXBob3JlOgorICogLSBBbnkgcm91dGluZSB0aGF0IHdhbnRzIHRvIHJlYWQgZnJvbSB0aGUgcG9saWN5IHN0cnVjdHVyZSB3aWxsCisgKiAgIGRvIGEgZG93bl9yZWFkIG9uIHRoaXMgc2VtYXBob3JlLgorICogLSBBbnkgcm91dGluZSB0aGF0IHdpbGwgd3JpdGUgdG8gdGhlIHBvbGljeSBzdHJ1Y3R1cmUgYW5kL29yIG1heSB0YWtlIGF3YXkKKyAqICAgdGhlIHBvbGljeSBhbHRvZ2V0aGVyIChlZy4gQ1BVIGhvdHBsdWcpLCB3aWxsIGhvbGQgdGhpcyBsb2NrIGluIHdyaXRlCisgKiAgIG1vZGUgYmVmb3JlIGRvaW5nIHNvLgorICoKKyAqIEFkZGl0aW9uYWwgcnVsZXM6CisgKiAtIEFsbCBob2xkZXJzIG9mIHRoZSBsb2NrIHNob3VsZCBjaGVjayB0byBtYWtlIHN1cmUgdGhhdCB0aGUgQ1BVIHRoZXkKKyAqICAgYXJlIGNvbmNlcm5lZCB3aXRoIGFyZSBvbmxpbmUgYWZ0ZXIgdGhleSBnZXQgdGhlIGxvY2suCisgKiAtIEdvdmVybm9yIHJvdXRpbmVzIHRoYXQgY2FuIGJlIGNhbGxlZCBpbiBjcHVmcmVxIGhvdHBsdWcgcGF0aCBzaG91bGQgbm90CisgKiAgIHRha2UgdGhpcyBzZW0gYXMgdG9wIGxldmVsIGhvdHBsdWcgbm90aWZpZXIgaGFuZGxlciB0YWtlcyB0aGlzLgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoaW50LCBwb2xpY3lfY3B1KTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3Qgcndfc2VtYXBob3JlLCBjcHVfcG9saWN5X3J3c2VtKTsKKworI2RlZmluZSBsb2NrX3BvbGljeV9yd3NlbShtb2RlLCBjcHUpCQkJCQlcCitpbnQgbG9ja19wb2xpY3lfcndzZW1fIyNtb2RlCQkJCQkJXAorKGludCBjcHUpCQkJCQkJCQlcCit7CQkJCQkJCQkJXAorCWludCBwb2xpY3lfY3B1ID0gcGVyX2NwdShwb2xpY3lfY3B1LCBjcHUpOwkJCVwKKwlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CQkJCQlcCisJZG93bl8jI21vZGUoJnBlcl9jcHUoY3B1X3BvbGljeV9yd3NlbSwgcG9saWN5X2NwdSkpOwkJXAorCWlmICh1bmxpa2VseSghY3B1X29ubGluZShjcHUpKSkgewkJCQlcCisJCXVwXyMjbW9kZSgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBwb2xpY3lfY3B1KSk7CVwKKwkJcmV0dXJuIC0xOwkJCQkJCVwKKwl9CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30KKworbG9ja19wb2xpY3lfcndzZW0ocmVhZCwgY3B1KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGxvY2tfcG9saWN5X3J3c2VtX3JlYWQpOworCitsb2NrX3BvbGljeV9yd3NlbSh3cml0ZSwgY3B1KTsKK0VYUE9SVF9TWU1CT0xfR1BMKGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKTsKKwordm9pZCB1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQoaW50IGNwdSkKK3sKKwlpbnQgcG9saWN5X2NwdSA9IHBlcl9jcHUocG9saWN5X2NwdSwgY3B1KTsKKwlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CisJdXBfcmVhZCgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBwb2xpY3lfY3B1KSk7Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQpOworCit2b2lkIHVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoaW50IGNwdSkKK3sKKwlpbnQgcG9saWN5X2NwdSA9IHBlcl9jcHUocG9saWN5X2NwdSwgY3B1KTsKKwlCVUdfT04ocG9saWN5X2NwdSA9PSAtMSk7CisJdXBfd3JpdGUoJnBlcl9jcHUoY3B1X3BvbGljeV9yd3NlbSwgcG9saWN5X2NwdSkpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZSk7CisKKwogLyogaW50ZXJuYWwgcHJvdG90eXBlcyAqLwogc3RhdGljIGludCBfX2NwdWZyZXFfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksIHVuc2lnbmVkIGludCBldmVudCk7CitzdGF0aWMgdW5zaWduZWQgaW50IF9fY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSk7CiBzdGF0aWMgdm9pZCBoYW5kbGVfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayk7CiAKIC8qKgpAQCAtNDE1LDEyICs0NzQsOCBAQAogCWlmIChyZXQgIT0gMSkJCQkJCQkJXAogCQlyZXR1cm4gLUVJTlZBTDsJCQkJCQlcCiAJCQkJCQkJCQlcCi0JbG9ja19jcHVfaG90cGx1ZygpOwkJCQkJCVwKLQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOwkJCQkJXAogCXJldCA9IF9fY3B1ZnJlcV9zZXRfcG9saWN5KHBvbGljeSwgJm5ld19wb2xpY3kpOwkJXAogCXBvbGljeS0+dXNlcl9wb2xpY3kub2JqZWN0ID0gcG9saWN5LT5vYmplY3Q7CQkJXAotCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsJCQkJCVwKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsJCQkJCQlcCiAJCQkJCQkJCQlcCiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwkJCQkJXAogfQpAQCAtNDM0LDcgKzQ4OSw3IEBACiBzdGF0aWMgc3NpemVfdCBzaG93X2NwdWluZm9fY3VyX2ZyZXEgKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqIHBvbGljeSwKIAkJCQkJCQljaGFyICpidWYpCiB7Ci0JdW5zaWduZWQgaW50IGN1cl9mcmVxID0gY3B1ZnJlcV9nZXQocG9saWN5LT5jcHUpOworCXVuc2lnbmVkIGludCBjdXJfZnJlcSA9IF9fY3B1ZnJlcV9nZXQocG9saWN5LT5jcHUpOwogCWlmICghY3VyX2ZyZXEpCiAJCXJldHVybiBzcHJpbnRmKGJ1ZiwgIjx1bmtub3duPiIpOwogCXJldHVybiBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBjdXJfZnJlcSk7CkBAIC00NzksMTggKzUzNCwxMiBAQAogCQkJCQkJJm5ld19wb2xpY3kuZ292ZXJub3IpKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCWxvY2tfY3B1X2hvdHBsdWcoKTsKLQogCS8qIERvIG5vdCB1c2UgY3B1ZnJlcV9zZXRfcG9saWN5IGhlcmUgb3IgdGhlIHVzZXJfcG9saWN5Lm1heAogCSAgIHdpbGwgYmUgd3JvbmdseSBvdmVycmlkZGVuICovCi0JbXV0ZXhfbG9jaygmcG9saWN5LT5sb2NrKTsKIAlyZXQgPSBfX2NwdWZyZXFfc2V0X3BvbGljeShwb2xpY3ksICZuZXdfcG9saWN5KTsKIAogCXBvbGljeS0+dXNlcl9wb2xpY3kucG9saWN5ID0gcG9saWN5LT5wb2xpY3k7CiAJcG9saWN5LT51c2VyX3BvbGljeS5nb3Zlcm5vciA9IHBvbGljeS0+Z292ZXJub3I7Ci0JbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOwotCi0JdW5sb2NrX2NwdV9ob3RwbHVnKCk7CiAKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpAQCAtNTk1LDExICs2NDQsMTcgQEAKIAlwb2xpY3kgPSBjcHVmcmVxX2NwdV9nZXQocG9saWN5LT5jcHUpOwogCWlmICghcG9saWN5KQogCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChsb2NrX3BvbGljeV9yd3NlbV9yZWFkKHBvbGljeS0+Y3B1KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGZhdHRyLT5zaG93KQogCQlyZXQgPSBmYXR0ci0+c2hvdyhwb2xpY3ksIGJ1Zik7CiAJZWxzZQogCQlyZXQgPSAtRUlPOwogCisJdW5sb2NrX3BvbGljeV9yd3NlbV9yZWFkKHBvbGljeS0+Y3B1KTsKKwogCWNwdWZyZXFfY3B1X3B1dChwb2xpY3kpOwogCXJldHVybiByZXQ7CiB9CkBAIC02MTMsMTEgKzY2OCwxNyBAQAogCXBvbGljeSA9IGNwdWZyZXFfY3B1X2dldChwb2xpY3ktPmNwdSk7CiAJaWYgKCFwb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOworCisJaWYgKGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKHBvbGljeS0+Y3B1KSA8IDApCisJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKGZhdHRyLT5zdG9yZSkKIAkJcmV0ID0gZmF0dHItPnN0b3JlKHBvbGljeSwgYnVmLCBjb3VudCk7CiAJZWxzZQogCQlyZXQgPSAtRUlPOwogCisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSk7CisKIAljcHVmcmVxX2NwdV9wdXQocG9saWN5KTsKIAlyZXR1cm4gcmV0OwogfQpAQCAtNjkxLDggKzc1MiwxMCBAQAogCXBvbGljeS0+Y3B1ID0gY3B1OwogCXBvbGljeS0+Y3B1cyA9IGNwdW1hc2tfb2ZfY3B1KGNwdSk7CiAKLQltdXRleF9pbml0KCZwb2xpY3ktPmxvY2spOwotCW11dGV4X2xvY2soJnBvbGljeS0+bG9jayk7CisJLyogSW5pdGlhbGx5IHNldCBDUFUgaXRzZWxmIGFzIHRoZSBwb2xpY3lfY3B1ICovCisJcGVyX2NwdShwb2xpY3lfY3B1LCBjcHUpID0gY3B1OworCWxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CisKIAlpbml0X2NvbXBsZXRpb24oJnBvbGljeS0+a29ial91bnJlZ2lzdGVyKTsKIAlJTklUX1dPUksoJnBvbGljeS0+dXBkYXRlLCBoYW5kbGVfdXBkYXRlKTsKIApAQCAtNzAyLDcgKzc2NSw3IEBACiAJcmV0ID0gY3B1ZnJlcV9kcml2ZXItPmluaXQocG9saWN5KTsKIAlpZiAocmV0KSB7CiAJCWRwcmludGsoImluaXRpYWxpemF0aW9uIGZhaWxlZFxuIik7Ci0JCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKKwkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCQlnb3RvIGVycl9vdXQ7CiAJfQogCkBAIC03MTYsNiArNzc5LDE0IEBACiAJCSAqLwogCQltYW5hZ2VkX3BvbGljeSA9IGNwdWZyZXFfY3B1X2dldChqKTsKIAkJaWYgKHVubGlrZWx5KG1hbmFnZWRfcG9saWN5KSkgeworCisJCQkvKiBTZXQgcHJvcGVyIHBvbGljeV9jcHUgKi8KKwkJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKKwkJCXBlcl9jcHUocG9saWN5X2NwdSwgY3B1KSA9IG1hbmFnZWRfcG9saWN5LT5jcHU7CisKKwkJCWlmIChsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpIDwgMCkKKwkJCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CisKIAkJCXNwaW5fbG9ja19pcnFzYXZlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAJCQltYW5hZ2VkX3BvbGljeS0+Y3B1cyA9IHBvbGljeS0+Y3B1czsKIAkJCWNwdWZyZXFfY3B1X2RhdGFbY3B1XSA9IG1hbmFnZWRfcG9saWN5OwpAQCAtNzI2LDEzICs3OTcsMTMgQEAKIAkJCQkJCSZtYW5hZ2VkX3BvbGljeS0+a29iaiwKIAkJCQkJCSJjcHVmcmVxIik7CiAJCQlpZiAocmV0KSB7Ci0JCQkJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCQkJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJCQlnb3RvIGVycl9vdXRfZHJpdmVyX2V4aXQ7CiAJCQl9CiAKIAkJCWNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCgpOwotCQkJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOwogCQkJcmV0ID0gMDsKKwkJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsgLyogY2FsbCBkcml2ZXItPmV4aXQoKSAqLwogCQl9CiAJfQpAQCAtNzQ2LDcgKzgxNyw3IEBACiAKIAlyZXQgPSBrb2JqZWN0X3JlZ2lzdGVyKCZwb2xpY3ktPmtvYmopOwogCWlmIChyZXQpIHsKLQkJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCWdvdG8gZXJyX291dF9kcml2ZXJfZXhpdDsKIAl9CiAJLyogc2V0IHVwIGZpbGVzIGZvciB0aGlzIGNwdSBkZXZpY2UgKi8KQEAgLTc2MSw4ICs4MzIsMTAgQEAKIAkJc3lzZnNfY3JlYXRlX2ZpbGUoJnBvbGljeS0+a29iaiwgJnNjYWxpbmdfY3VyX2ZyZXEuYXR0cik7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY3B1ZnJlcV9kcml2ZXJfbG9jaywgZmxhZ3MpOwotCWZvcl9lYWNoX2NwdV9tYXNrKGosIHBvbGljeS0+Y3B1cykKKwlmb3JfZWFjaF9jcHVfbWFzayhqLCBwb2xpY3ktPmNwdXMpIHsKIAkJY3B1ZnJlcV9jcHVfZGF0YVtqXSA9IHBvbGljeTsKKwkJcGVyX2NwdShwb2xpY3lfY3B1LCBqKSA9IHBvbGljeS0+Y3B1OworCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAKIAkvKiBzeW1saW5rIGFmZmVjdGVkIENQVXMgKi8KQEAgLTc3OCwxNCArODUxLDE0IEBACiAJCXJldCA9IHN5c2ZzX2NyZWF0ZV9saW5rKCZjcHVfc3lzX2Rldi0+a29iaiwgJnBvbGljeS0+a29iaiwKIAkJCQkJImNwdWZyZXEiKTsKIAkJaWYgKHJldCkgewotCQkJbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOworCQkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCQkJZ290byBlcnJfb3V0X3VucmVnaXN0ZXI7CiAJCX0KIAl9CiAKIAlwb2xpY3ktPmdvdmVybm9yID0gTlVMTDsgLyogdG8gYXNzdXJlIHRoYXQgdGhlIHN0YXJ0aW5nIHNlcXVlbmNlIGlzCiAJCQkJICAqIHJ1biBpbiBjcHVmcmVxX3NldF9wb2xpY3kgKi8KLQltdXRleF91bmxvY2soJnBvbGljeS0+bG9jayk7CisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogCiAJLyogc2V0IGRlZmF1bHQgcG9saWN5ICovCiAJcmV0ID0gY3B1ZnJlcV9zZXRfcG9saWN5KCZuZXdfcG9saWN5KTsKQEAgLTgyNiwxMSArODk5LDEzIEBACiAKIAogLyoqCi0gKiBjcHVmcmVxX3JlbW92ZV9kZXYgLSByZW1vdmUgYSBDUFUgZGV2aWNlCisgKiBfX2NwdWZyZXFfcmVtb3ZlX2RldiAtIHJlbW92ZSBhIENQVSBkZXZpY2UKICAqCiAgKiBSZW1vdmVzIHRoZSBjcHVmcmVxIGludGVyZmFjZSBmb3IgYSBDUFUgZGV2aWNlLgorICogQ2FsbGVyIHNob3VsZCBhbHJlYWR5IGhhdmUgcG9saWN5X3J3c2VtIGluIHdyaXRlIG1vZGUgZm9yIHRoaXMgQ1BVLgorICogVGhpcyByb3V0aW5lIGZyZWVzIHRoZSByd3NlbSBiZWZvcmUgcmV0dXJuaW5nLgogICovCi1zdGF0aWMgaW50IGNwdWZyZXFfcmVtb3ZlX2RldiAoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNfZGV2KQorc3RhdGljIGludCBfX2NwdWZyZXFfcmVtb3ZlX2RldiAoc3RydWN0IHN5c19kZXZpY2UgKiBzeXNfZGV2KQogewogCXVuc2lnbmVkIGludCBjcHUgPSBzeXNfZGV2LT5pZDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwpAQCAtODQ5LDYgKzkyNCw3IEBACiAJaWYgKCFkYXRhKSB7CiAJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdWZyZXFfZHJpdmVyX2xvY2ssIGZsYWdzKTsKIAkJY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CisJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJcmV0dXJuIC1FSU5WQUw7CiAJfQogCWNwdWZyZXFfY3B1X2RhdGFbY3B1XSA9IE5VTEw7CkBAIC04NjUsNiArOTQxLDcgQEAKIAkJc3lzZnNfcmVtb3ZlX2xpbmsoJnN5c19kZXYtPmtvYmosICJjcHVmcmVxIik7CiAJCWNwdWZyZXFfY3B1X3B1dChkYXRhKTsKIAkJY3B1ZnJlcV9kZWJ1Z19lbmFibGVfcmF0ZWxpbWl0KCk7CisJCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAkJcmV0dXJuIDA7CiAJfQogI2VuZGlmCkBAIC04NzMsNiArOTUwLDcgQEAKIAlpZiAoIWtvYmplY3RfZ2V0KCZkYXRhLT5rb2JqKSkgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAJCWNwdWZyZXFfZGVidWdfZW5hYmxlX3JhdGVsaW1pdCgpOworCQl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CiAJCXJldHVybiAtRUZBVUxUOwogCX0KIApAQCAtOTA2LDEwICs5ODQsMTAgQEAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVmcmVxX2RyaXZlcl9sb2NrLCBmbGFncyk7CiAjZW5kaWYKIAotCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOwogCWlmIChjcHVmcmVxX2RyaXZlci0+dGFyZ2V0KQogCQlfX2NwdWZyZXFfZ292ZXJub3IoZGF0YSwgQ1BVRlJFUV9HT1ZfU1RPUCk7Ci0JbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKKworCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KTsKIAogCWtvYmplY3RfdW5yZWdpc3RlcigmZGF0YS0+a29iaik7CiAKQEAgLTkzMyw2ICsxMDExLDE4IEBACiB9CiAKIAorc3RhdGljIGludCBjcHVmcmVxX3JlbW92ZV9kZXYgKHN0cnVjdCBzeXNfZGV2aWNlICogc3lzX2RldikKK3sKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc3lzX2Rldi0+aWQ7CisJaW50IHJldHZhbDsKKwlpZiAodW5saWtlbHkobG9ja19wb2xpY3lfcndzZW1fd3JpdGUoY3B1KSkpCisJCUJVRygpOworCisJcmV0dmFsID0gX19jcHVmcmVxX3JlbW92ZV9kZXYoc3lzX2Rldik7CisJcmV0dXJuIHJldHZhbDsKK30KKworCiBzdGF0aWMgdm9pZCBoYW5kbGVfdXBkYXRlKHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKnBvbGljeSA9CkBAIC05ODAsOSArMTA3MCwxMiBAQAogCXVuc2lnbmVkIGludCByZXRfZnJlcSA9IDA7CiAKIAlpZiAocG9saWN5KSB7Ci0JCW11dGV4X2xvY2soJnBvbGljeS0+bG9jayk7CisJCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV9yZWFkKGNwdSkpKQorCQkJcmV0dXJuIHJldF9mcmVxOworCiAJCXJldF9mcmVxID0gcG9saWN5LT5jdXI7Ci0JCW11dGV4X3VubG9jaygmcG9saWN5LT5sb2NrKTsKKworCQl1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQoY3B1KTsKIAkJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJfQogCkBAIC05OTEsMjQgKzEwODQsMTMgQEAKIEVYUE9SVF9TWU1CT0woY3B1ZnJlcV9xdWlja19nZXQpOwogCiAKLS8qKgotICogY3B1ZnJlcV9nZXQgLSBnZXQgdGhlIGN1cnJlbnQgQ1BVIGZyZXF1ZW5jeSAoaW4ga0h6KQotICogQGNwdTogQ1BVIG51bWJlcgotICoKLSAqIEdldCB0aGUgQ1BVIGN1cnJlbnQgKHN0YXRpYykgQ1BVIGZyZXF1ZW5jeQotICovCi11bnNpZ25lZCBpbnQgY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyB1bnNpZ25lZCBpbnQgX19jcHVmcmVxX2dldCh1bnNpZ25lZCBpbnQgY3B1KQogewotCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdSk7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kgPSBjcHVmcmVxX2NwdV9kYXRhW2NwdV07CiAJdW5zaWduZWQgaW50IHJldF9mcmVxID0gMDsKIAotCWlmICghcG9saWN5KQotCQlyZXR1cm4gMDsKLQogCWlmICghY3B1ZnJlcV9kcml2ZXItPmdldCkKLQkJZ290byBvdXQ7Ci0KLQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOworCQlyZXR1cm4gKHJldF9mcmVxKTsKIAogCXJldF9mcmVxID0gY3B1ZnJlcV9kcml2ZXItPmdldChjcHUpOwogCkBAIC0xMDIyLDExICsxMTA0LDMzIEBACiAJCX0KIAl9CiAKLQltdXRleF91bmxvY2soJnBvbGljeS0+bG9jayk7CisJcmV0dXJuIChyZXRfZnJlcSk7Cit9CiAKLW91dDoKKy8qKgorICogY3B1ZnJlcV9nZXQgLSBnZXQgdGhlIGN1cnJlbnQgQ1BVIGZyZXF1ZW5jeSAoaW4ga0h6KQorICogQGNwdTogQ1BVIG51bWJlcgorICoKKyAqIEdldCB0aGUgQ1BVIGN1cnJlbnQgKHN0YXRpYykgQ1BVIGZyZXF1ZW5jeQorICovCit1bnNpZ25lZCBpbnQgY3B1ZnJlcV9nZXQodW5zaWduZWQgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBpbnQgcmV0X2ZyZXEgPSAwOworCXN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5ID0gY3B1ZnJlcV9jcHVfZ2V0KGNwdSk7CisKKwlpZiAoIXBvbGljeSkKKwkJZ290byBvdXQ7CisKKwlpZiAodW5saWtlbHkobG9ja19wb2xpY3lfcndzZW1fcmVhZChjcHUpKSkKKwkJZ290byBvdXRfcG9saWN5OworCisJcmV0X2ZyZXEgPSBfX2NwdWZyZXFfZ2V0KGNwdSk7CisKKwl1bmxvY2tfcG9saWN5X3J3c2VtX3JlYWQoY3B1KTsKKworb3V0X3BvbGljeToKIAljcHVmcmVxX2NwdV9wdXQocG9saWN5KTsKLQorb3V0OgogCXJldHVybiAocmV0X2ZyZXEpOwogfQogRVhQT1JUX1NZTUJPTChjcHVmcmVxX2dldCk7CkBAIC0xMjc4LDcgKzEzODIsNiBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogCi0vKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGxvY2tfY3B1X2hvdHBsdWcgaGVsZCAqLwogaW50IF9fY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5LAogCQkJICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJlcSwKIAkJCSAgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pCkBAIC0xMzA0LDIwICsxNDA3LDE5IEBACiAJaWYgKCFwb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG9ja19jcHVfaG90cGx1ZygpOwotCW11dGV4X2xvY2soJnBvbGljeS0+bG9jayk7CisJaWYgKHVubGlrZWx5KGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKHBvbGljeS0+Y3B1KSkpCisJCXJldHVybiAtRUlOVkFMOwogCiAJcmV0ID0gX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCB0YXJnZXRfZnJlcSwgcmVsYXRpb24pOwogCi0JbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOwotCXVubG9ja19jcHVfaG90cGx1ZygpOworCXVubG9ja19wb2xpY3lfcndzZW1fd3JpdGUocG9saWN5LT5jcHUpOwogCiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJcmV0dXJuIHJldDsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZHJpdmVyX3RhcmdldCk7CiAKLWludCBjcHVmcmVxX2RyaXZlcl9nZXRhdmcoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCitpbnQgX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCiB7CiAJaW50IHJldCA9IDA7CiAKQEAgLTEzMjUsMjAgKzE0MjcsMTUgQEAKIAlpZiAoIXBvbGljeSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQltdXRleF9sb2NrKCZwb2xpY3ktPmxvY2spOwotCiAJaWYgKGNwdV9vbmxpbmUocG9saWN5LT5jcHUpICYmIGNwdWZyZXFfZHJpdmVyLT5nZXRhdmcpCiAJCXJldCA9IGNwdWZyZXFfZHJpdmVyLT5nZXRhdmcocG9saWN5LT5jcHUpOwogCi0JbXV0ZXhfdW5sb2NrKCZwb2xpY3ktPmxvY2spOwotCiAJY3B1ZnJlcV9jcHVfcHV0KHBvbGljeSk7CiAJcmV0dXJuIHJldDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKGNwdWZyZXFfZHJpdmVyX2dldGF2Zyk7CitFWFBPUlRfU1lNQk9MX0dQTChfX2NwdWZyZXFfZHJpdmVyX2dldGF2Zyk7CiAKIC8qCi0gKiBMb2NraW5nOiBNdXN0IGJlIGNhbGxlZCB3aXRoIHRoZSBsb2NrX2NwdV9ob3RwbHVnKCkgbG9jayBoZWxkCiAgKiB3aGVuICJldmVudCIgaXMgQ1BVRlJFUV9HT1ZfTElNSVRTCiAgKi8KIApAQCAtMTQyMCw5ICsxNTE3LDcgQEAKIAlpZiAoIWNwdV9wb2xpY3kpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbXV0ZXhfbG9jaygmY3B1X3BvbGljeS0+bG9jayk7CiAJbWVtY3B5KHBvbGljeSwgY3B1X3BvbGljeSwgc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX3BvbGljeSkpOwotCW11dGV4X3VubG9jaygmY3B1X3BvbGljeS0+bG9jayk7CiAKIAljcHVmcmVxX2NwdV9wdXQoY3B1X3BvbGljeSk7CiAJcmV0dXJuIDA7CkBAIC0xNDMzLDcgKzE1MjgsNiBAQAogLyoKICAqIGRhdGEgICA6IGN1cnJlbnQgcG9saWN5LgogICogcG9saWN5IDogcG9saWN5IHRvIGJlIHNldC4KLSAqIExvY2tpbmc6IE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGxvY2tfY3B1X2hvdHBsdWcoKSBsb2NrIGhlbGQKICAqLwogc3RhdGljIGludCBfX2NwdWZyZXFfc2V0X3BvbGljeShzdHJ1Y3QgY3B1ZnJlcV9wb2xpY3kgKmRhdGEsCiAJCQkJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpCkBAIC0xNTM5LDEwICsxNjMzLDkgQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JbG9ja19jcHVfaG90cGx1ZygpOworCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSkpKQorCQlyZXR1cm4gLUVJTlZBTDsKIAotCS8qIGxvY2sgdGhpcyBDUFUgKi8KLQltdXRleF9sb2NrKCZkYXRhLT5sb2NrKTsKIAogCXJldCA9IF9fY3B1ZnJlcV9zZXRfcG9saWN5KGRhdGEsIHBvbGljeSk7CiAJZGF0YS0+dXNlcl9wb2xpY3kubWluID0gZGF0YS0+bWluOwpAQCAtMTU1MCw5ICsxNjQzLDggQEAKIAlkYXRhLT51c2VyX3BvbGljeS5wb2xpY3kgPSBkYXRhLT5wb2xpY3k7CiAJZGF0YS0+dXNlcl9wb2xpY3kuZ292ZXJub3IgPSBkYXRhLT5nb3Zlcm5vcjsKIAotCW11dGV4X3VubG9jaygmZGF0YS0+bG9jayk7CisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShwb2xpY3ktPmNwdSk7CiAKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIAljcHVmcmVxX2NwdV9wdXQoZGF0YSk7CiAKIAlyZXR1cm4gcmV0OwpAQCAtMTU3Niw4ICsxNjY4LDggQEAKIAlpZiAoIWRhdGEpCiAJCXJldHVybiAtRU5PREVWOwogCi0JbG9ja19jcHVfaG90cGx1ZygpOwotCW11dGV4X2xvY2soJmRhdGEtPmxvY2spOworCWlmICh1bmxpa2VseShsb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpKSkKKwkJcmV0dXJuIC1FSU5WQUw7CiAKIAlkcHJpbnRrKCJ1cGRhdGluZyBwb2xpY3kgZm9yIENQVSAldVxuIiwgY3B1KTsKIAltZW1jcHkoJnBvbGljeSwgZGF0YSwgc2l6ZW9mKHN0cnVjdCBjcHVmcmVxX3BvbGljeSkpOwpAQCAtMTYwMiw4ICsxNjk0LDggQEAKIAogCXJldCA9IF9fY3B1ZnJlcV9zZXRfcG9saWN5KGRhdGEsICZwb2xpY3kpOwogCi0JbXV0ZXhfdW5sb2NrKCZkYXRhLT5sb2NrKTsKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKKwl1bmxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSk7CisKIAljcHVmcmVxX2NwdV9wdXQoZGF0YSk7CiAJcmV0dXJuIHJldDsKIH0KQEAgLTE2MTMsMzEgKzE3MDUsMjggQEAKIAkJCQkJdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCiB7CiAJdW5zaWduZWQgaW50IGNwdSA9ICh1bnNpZ25lZCBsb25nKWhjcHU7Ci0Jc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CiAJc3RydWN0IHN5c19kZXZpY2UgKnN5c19kZXY7CisJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3k7CiAKIAlzeXNfZGV2ID0gZ2V0X2NwdV9zeXNkZXYoY3B1KTsKLQogCWlmIChzeXNfZGV2KSB7CiAJCXN3aXRjaCAoYWN0aW9uKSB7CiAJCWNhc2UgQ1BVX09OTElORToKIAkJCWNwdWZyZXFfYWRkX2RldihzeXNfZGV2KTsKIAkJCWJyZWFrOwogCQljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCQkvKgotCQkJICogV2UgYXR0ZW1wdCB0byBwdXQgdGhpcyBjcHUgaW4gbG93ZXN0IGZyZXF1ZW5jeQotCQkJICogcG9zc2libGUgYmVmb3JlIGdvaW5nIGRvd24uIFRoaXMgd2lsbCBwZXJtaXQKLQkJCSAqIGhhcmR3YXJlLW1hbmFnZWQgUC1TdGF0ZSB0byBzd2l0Y2ggb3RoZXIgcmVsYXRlZAotCQkJICogdGhyZWFkcyB0byBtaW4gb3IgaGlnaGVyIHNwZWVkcyBpZiBwb3NzaWJsZS4KLQkJCSAqLworCQkJaWYgKHVubGlrZWx5KGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSkpKQorCQkJCUJVRygpOworCiAJCQlwb2xpY3kgPSBjcHVmcmVxX2NwdV9kYXRhW2NwdV07CiAJCQlpZiAocG9saWN5KSB7Ci0JCQkJY3B1ZnJlcV9kcml2ZXJfdGFyZ2V0KHBvbGljeSwgcG9saWN5LT5taW4sCisJCQkJX19jcHVmcmVxX2RyaXZlcl90YXJnZXQocG9saWN5LCBwb2xpY3ktPm1pbiwKIAkJCQkJCUNQVUZSRVFfUkVMQVRJT05fSCk7CiAJCQl9CisJCQlfX2NwdWZyZXFfcmVtb3ZlX2RldihzeXNfZGV2KTsKIAkJCWJyZWFrOwotCQljYXNlIENQVV9ERUFEOgotCQkJY3B1ZnJlcV9yZW1vdmVfZGV2KHN5c19kZXYpOworCQljYXNlIENQVV9ET1dOX0ZBSUxFRDoKKwkJCWNwdWZyZXFfYWRkX2RldihzeXNfZGV2KTsKIAkJCWJyZWFrOwogCQl9CiAJfQpAQCAtMTc1MSwzICsxODQwLDE2IEBACiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChjcHVmcmVxX3VucmVnaXN0ZXJfZHJpdmVyKTsKKworc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9jb3JlX2luaXQodm9pZCkKK3sKKwlpbnQgY3B1OworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlwZXJfY3B1KHBvbGljeV9jcHUsIGNwdSkgPSAtMTsKKwkJaW5pdF9yd3NlbSgmcGVyX2NwdShjcHVfcG9saWN5X3J3c2VtLCBjcHUpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2NvcmVfaW5pdGNhbGwoY3B1ZnJlcV9jb3JlX2luaXQpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfY29uc2VydmF0aXZlLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwppbmRleCAwNWQ2YzIyLi4yNmY0NDBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9jb25zZXJ2YXRpdmUuYwpAQCAtNDI5LDE0ICs0MjksMTIgQEAKIHN0YXRpYyB2b2lkIGRvX2Ric190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspCiB7IAogCWludCBpOwotCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAltdXRleF9sb2NrKCZkYnNfbXV0ZXgpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoaSkKIAkJZGJzX2NoZWNrX2NwdShpKTsKIAlzY2hlZHVsZV9kZWxheWVkX3dvcmsoJmRic193b3JrLCAKIAkJCXVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSkpOwogCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0gCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfaW5pdCh2b2lkKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYyBiL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX29uZGVtYW5kLmMKaW5kZXggZjY5NzQ0OS4uZDYwYmNiOSAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfb25kZW1hbmQuYworKysgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9vbmRlbWFuZC5jCkBAIC01MiwxOSArNTIsMjAgQEAKIHN0YXRpYyB2b2lkIGRvX2Ric190aW1lcihzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspOwogCiAvKiBTYW1wbGluZyB0eXBlcyAqLwotZW51bSBkYnNfc2FtcGxlIHtEQlNfTk9STUFMX1NBTVBMRSwgREJTX1NVQl9TQU1QTEV9OworZW51bSB7REJTX05PUk1BTF9TQU1QTEUsIERCU19TVUJfU0FNUExFfTsKIAogc3RydWN0IGNwdV9kYnNfaW5mb19zIHsKIAljcHV0aW1lNjRfdCBwcmV2X2NwdV9pZGxlOwogCWNwdXRpbWU2NF90IHByZXZfY3B1X3dhbGw7CiAJc3RydWN0IGNwdWZyZXFfcG9saWN5ICpjdXJfcG9saWN5OwogIAlzdHJ1Y3QgZGVsYXllZF93b3JrIHdvcms7Ci0JZW51bSBkYnNfc2FtcGxlIHNhbXBsZV90eXBlOwotCXVuc2lnbmVkIGludCBlbmFibGU7CiAJc3RydWN0IGNwdWZyZXFfZnJlcXVlbmN5X3RhYmxlICpmcmVxX3RhYmxlOwogCXVuc2lnbmVkIGludCBmcmVxX2xvOwogCXVuc2lnbmVkIGludCBmcmVxX2xvX2ppZmZpZXM7CiAJdW5zaWduZWQgaW50IGZyZXFfaGlfamlmZmllczsKKwlpbnQgY3B1OworCXVuc2lnbmVkIGludCBlbmFibGU6MSwKKwkgICAgICAgICAgICAgc2FtcGxlX3R5cGU6MTsKIH07CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9kYnNfaW5mb19zLCBjcHVfZGJzX2luZm8pOwogCkBAIC00MDIsNyArNDAzLDcgQEAKIAlpZiAobG9hZCA8IChkYnNfdHVuZXJzX2lucy51cF90aHJlc2hvbGQgLSAxMCkpIHsKIAkJdW5zaWduZWQgaW50IGZyZXFfbmV4dCwgZnJlcV9jdXI7CiAKLQkJZnJlcV9jdXIgPSBjcHVmcmVxX2RyaXZlcl9nZXRhdmcocG9saWN5KTsKKwkJZnJlcV9jdXIgPSBfX2NwdWZyZXFfZHJpdmVyX2dldGF2Zyhwb2xpY3kpOwogCQlpZiAoIWZyZXFfY3VyKQogCQkJZnJlcV9jdXIgPSBwb2xpY3ktPmN1cjsKIApAQCAtNDIzLDkgKzQyNCwxMSBAQAogCiBzdGF0aWMgdm9pZCBkb19kYnNfdGltZXIoc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewotCXVuc2lnbmVkIGludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0Jc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbyA9ICZwZXJfY3B1KGNwdV9kYnNfaW5mbywgY3B1KTsKLQllbnVtIGRic19zYW1wbGUgc2FtcGxlX3R5cGUgPSBkYnNfaW5mby0+c2FtcGxlX3R5cGU7CisJc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbyA9CisJCWNvbnRhaW5lcl9vZih3b3JrLCBzdHJ1Y3QgY3B1X2Ric19pbmZvX3MsIHdvcmsud29yayk7CisJdW5zaWduZWQgaW50IGNwdSA9IGRic19pbmZvLT5jcHU7CisJaW50IHNhbXBsZV90eXBlID0gZGJzX2luZm8tPnNhbXBsZV90eXBlOworCiAJLyogV2Ugd2FudCBhbGwgQ1BVcyB0byBkbyBzYW1wbGluZyBuZWFybHkgb24gc2FtZSBqaWZmeSAqLwogCWludCBkZWxheSA9IHVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSk7CiAKQEAgLTQzNCwxNSArNDM3LDE5IEBACiAKIAlkZWxheSAtPSBqaWZmaWVzICUgZGVsYXk7CiAKLQlpZiAoIWRic19pbmZvLT5lbmFibGUpCisJaWYgKGxvY2tfcG9saWN5X3J3c2VtX3dyaXRlKGNwdSkgPCAwKQogCQlyZXR1cm47CisKKwlpZiAoIWRic19pbmZvLT5lbmFibGUpIHsKKwkJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOworCQlyZXR1cm47CisJfQorCiAJLyogQ29tbW9uIE5PUk1BTF9TQU1QTEUgc2V0dXAgKi8KIAlkYnNfaW5mby0+c2FtcGxlX3R5cGUgPSBEQlNfTk9STUFMX1NBTVBMRTsKIAlpZiAoIWRic190dW5lcnNfaW5zLnBvd2Vyc2F2ZV9iaWFzIHx8CiAJICAgIHNhbXBsZV90eXBlID09IERCU19OT1JNQUxfU0FNUExFKSB7Ci0JCWxvY2tfY3B1X2hvdHBsdWcoKTsKIAkJZGJzX2NoZWNrX2NwdShkYnNfaW5mbyk7Ci0JCXVubG9ja19jcHVfaG90cGx1ZygpOwogCQlpZiAoZGJzX2luZm8tPmZyZXFfbG8pIHsKIAkJCS8qIFNldHVwIHRpbWVyIGZvciBTVUJfU0FNUExFICovCiAJCQlkYnNfaW5mby0+c2FtcGxlX3R5cGUgPSBEQlNfU1VCX1NBTVBMRTsKQEAgLTQ1NCwyNiArNDYxLDI3IEBACiAJICAgICAgICAgICAgICAgICAgICAgICAgCUNQVUZSRVFfUkVMQVRJT05fSCk7CiAJfQogCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihjcHUsIGtvbmRlbWFuZF93cSwgJmRic19pbmZvLT53b3JrLCBkZWxheSk7CisJdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShjcHUpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgZGJzX3RpbWVyX2luaXQodW5zaWduZWQgaW50IGNwdSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBkYnNfdGltZXJfaW5pdChzdHJ1Y3QgY3B1X2Ric19pbmZvX3MgKmRic19pbmZvKQogewotCXN0cnVjdCBjcHVfZGJzX2luZm9fcyAqZGJzX2luZm8gPSAmcGVyX2NwdShjcHVfZGJzX2luZm8sIGNwdSk7CiAJLyogV2Ugd2FudCBhbGwgQ1BVcyB0byBkbyBzYW1wbGluZyBuZWFybHkgb24gc2FtZSBqaWZmeSAqLwogCWludCBkZWxheSA9IHVzZWNzX3RvX2ppZmZpZXMoZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSk7CiAJZGVsYXkgLT0gamlmZmllcyAlIGRlbGF5OwogCisJZGJzX2luZm8tPmVuYWJsZSA9IDE7CiAJb25kZW1hbmRfcG93ZXJzYXZlX2JpYXNfaW5pdCgpOwotCUlOSVRfREVMQVlFRF9XT1JLX05BUigmZGJzX2luZm8tPndvcmssIGRvX2Ric190aW1lcik7CiAJZGJzX2luZm8tPnNhbXBsZV90eXBlID0gREJTX05PUk1BTF9TQU1QTEU7Ci0JcXVldWVfZGVsYXllZF93b3JrX29uKGNwdSwga29uZGVtYW5kX3dxLCAmZGJzX2luZm8tPndvcmssIGRlbGF5KTsKKwlJTklUX0RFTEFZRURfV09SS19OQVIoJmRic19pbmZvLT53b3JrLCBkb19kYnNfdGltZXIpOworCXF1ZXVlX2RlbGF5ZWRfd29ya19vbihkYnNfaW5mby0+Y3B1LCBrb25kZW1hbmRfd3EsICZkYnNfaW5mby0+d29yaywKKwkgICAgICAgICAgICAgICAgICAgICAgZGVsYXkpOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGJzX3RpbWVyX2V4aXQoc3RydWN0IGNwdV9kYnNfaW5mb19zICpkYnNfaW5mbykKIHsKIAlkYnNfaW5mby0+ZW5hYmxlID0gMDsKIAljYW5jZWxfZGVsYXllZF93b3JrKCZkYnNfaW5mby0+d29yayk7Ci0JZmx1c2hfd29ya3F1ZXVlKGtvbmRlbWFuZF93cSk7CiB9CiAKIHN0YXRpYyBpbnQgY3B1ZnJlcV9nb3Zlcm5vcl9kYnMoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3ksCkBAIC01MDIsMjEgKzUxMCw5IEBACiAKIAkJbXV0ZXhfbG9jaygmZGJzX211dGV4KTsKIAkJZGJzX2VuYWJsZSsrOwotCQlpZiAoZGJzX2VuYWJsZSA9PSAxKSB7Ci0JCQlrb25kZW1hbmRfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJrb25kZW1hbmQiKTsKLQkJCWlmICgha29uZGVtYW5kX3dxKSB7Ci0JCQkJcHJpbnRrKEtFUk5fRVJSCi0JCQkJCSAiQ3JlYXRpb24gb2Yga29uZGVtYW5kIGZhaWxlZFxuIik7Ci0JCQkJZGJzX2VuYWJsZS0tOwotCQkJCW11dGV4X3VubG9jaygmZGJzX211dGV4KTsKLQkJCQlyZXR1cm4gLUVOT1NQQzsKLQkJCX0KLQkJfQogCiAJCXJjID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cCk7CiAJCWlmIChyYykgewotCQkJaWYgKGRic19lbmFibGUgPT0gMSkKLQkJCQlkZXN0cm95X3dvcmtxdWV1ZShrb25kZW1hbmRfd3EpOwogCQkJZGJzX2VuYWJsZS0tOwogCQkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwogCQkJcmV0dXJuIHJjOwpAQCAtNTMwLDcgKzUyNiw3IEBACiAJCQlqX2Ric19pbmZvLT5wcmV2X2NwdV9pZGxlID0gZ2V0X2NwdV9pZGxlX3RpbWUoaik7CiAJCQlqX2Ric19pbmZvLT5wcmV2X2NwdV93YWxsID0gZ2V0X2ppZmZpZXNfNjQoKTsKIAkJfQotCQl0aGlzX2Ric19pbmZvLT5lbmFibGUgPSAxOworCQl0aGlzX2Ric19pbmZvLT5jcHUgPSBjcHU7CiAJCS8qCiAJCSAqIFN0YXJ0IHRoZSB0aW1lcnNjaGVkdWxlIHdvcmssIHdoZW4gdGhpcyBnb3Zlcm5vcgogCQkgKiBpcyB1c2VkIGZvciBmaXJzdCB0aW1lCkBAIC01NTAsNyArNTQ2LDcgQEAKIAogCQkJZGJzX3R1bmVyc19pbnMuc2FtcGxpbmdfcmF0ZSA9IGRlZl9zYW1wbGluZ19yYXRlOwogCQl9Ci0JCWRic190aW1lcl9pbml0KHBvbGljeS0+Y3B1KTsKKwkJZGJzX3RpbWVyX2luaXQodGhpc19kYnNfaW5mbyk7CiAKIAkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwogCQlicmVhazsKQEAgLTU2MCw5ICs1NTYsNiBAQAogCQlkYnNfdGltZXJfZXhpdCh0aGlzX2Ric19pbmZvKTsKIAkJc3lzZnNfcmVtb3ZlX2dyb3VwKCZwb2xpY3ktPmtvYmosICZkYnNfYXR0cl9ncm91cCk7CiAJCWRic19lbmFibGUtLTsKLQkJaWYgKGRic19lbmFibGUgPT0gMCkKLQkJCWRlc3Ryb3lfd29ya3F1ZXVlKGtvbmRlbWFuZF93cSk7Ci0KIAkJbXV0ZXhfdW5sb2NrKCZkYnNfbXV0ZXgpOwogCiAJCWJyZWFrOwpAQCAtNTkxLDEyICs1ODQsMTggQEAKIAogc3RhdGljIGludCBfX2luaXQgY3B1ZnJlcV9nb3ZfZGJzX2luaXQodm9pZCkKIHsKKwlrb25kZW1hbmRfd3EgPSBjcmVhdGVfd29ya3F1ZXVlKCJrb25kZW1hbmQiKTsKKwlpZiAoIWtvbmRlbWFuZF93cSkgeworCQlwcmludGsoS0VSTl9FUlIgIkNyZWF0aW9uIG9mIGtvbmRlbWFuZCBmYWlsZWRcbiIpOworCQlyZXR1cm4gLUVGQVVMVDsKKwl9CiAJcmV0dXJuIGNwdWZyZXFfcmVnaXN0ZXJfZ292ZXJub3IoJmNwdWZyZXFfZ292X2Ricyk7CiB9CiAKIHN0YXRpYyB2b2lkIF9fZXhpdCBjcHVmcmVxX2dvdl9kYnNfZXhpdCh2b2lkKQogewogCWNwdWZyZXFfdW5yZWdpc3Rlcl9nb3Zlcm5vcigmY3B1ZnJlcV9nb3ZfZGJzKTsKKwlkZXN0cm95X3dvcmtxdWV1ZShrb25kZW1hbmRfd3EpOwogfQogCiAKQEAgLTYwOCwzICs2MDcsNCBAQAogCiBtb2R1bGVfaW5pdChjcHVmcmVxX2dvdl9kYnNfaW5pdCk7CiBtb2R1bGVfZXhpdChjcHVmcmVxX2dvdl9kYnNfZXhpdCk7CisKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMgYi9kcml2ZXJzL2NwdWZyZXEvY3B1ZnJlcV9zdGF0cy5jCmluZGV4IDkxYWQzNDIuLmQxYzdjYWMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3N0YXRzLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfc3RhdHMuYwpAQCAtMzcwLDEyICszNzAsMTAgQEAKIAljcHVmcmVxX3VucmVnaXN0ZXJfbm90aWZpZXIoJm5vdGlmaWVyX3RyYW5zX2Jsb2NrLAogCQkJQ1BVRlJFUV9UUkFOU0lUSU9OX05PVElGSUVSKTsKIAl1bnJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmY3B1ZnJlcV9zdGF0X2NwdV9ub3RpZmllcik7Ci0JbG9ja19jcHVfaG90cGx1ZygpOwogCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CiAJCWNwdWZyZXFfc3RhdF9jcHVfY2FsbGJhY2soJmNwdWZyZXFfc3RhdF9jcHVfbm90aWZpZXIsCiAJCQkJCQlDUFVfREVBRCwgKHZvaWQgKikobG9uZyljcHUpOwogCX0KLQl1bmxvY2tfY3B1X2hvdHBsdWcoKTsKIH0KIAogTU9EVUxFX0FVVEhPUiAoIlpvdSBOYW4gaGFpIDxuYW5oYWkuem91QGludGVsLmNvbT4iKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY3B1ZnJlcS9jcHVmcmVxX3VzZXJzcGFjZS5jIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKaW5kZXggMmE0ZWIwYi4uODYwMzQ1YyAxMDA2NDQKLS0tIGEvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKKysrIGIvZHJpdmVycy9jcHVmcmVxL2NwdWZyZXFfdXNlcnNwYWNlLmMKQEAgLTcxLDcgKzcxLDYgQEAKIAogCWRwcmludGsoImNwdWZyZXFfc2V0IGZvciBjcHUgJXUsIGZyZXEgJXUga0h6XG4iLCBwb2xpY3ktPmNwdSwgZnJlcSk7CiAKLQlsb2NrX2NwdV9ob3RwbHVnKCk7CiAJbXV0ZXhfbG9jaygmdXNlcnNwYWNlX211dGV4KTsKIAlpZiAoIWNwdV9pc19tYW5hZ2VkW3BvbGljeS0+Y3B1XSkKIAkJZ290byBlcnI7CkBAIC05NCw3ICs5Myw2IEBACiAKICBlcnI6CiAJbXV0ZXhfdW5sb2NrKCZ1c2Vyc3BhY2VfbXV0ZXgpOwotCXVubG9ja19jcHVfaG90cGx1ZygpOwogCXJldHVybiByZXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMvaW5wdXQvdG91Y2hzY3JlZW4vYWRzNzg0Ni5jIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKaW5kZXggY2QyNTFlZi4uMGEyNmUwNiAxMDA2NDQKLS0tIGEvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKKysrIGIvZHJpdmVycy9pbnB1dC90b3VjaHNjcmVlbi9hZHM3ODQ2LmMKQEAgLTU0Niw3ICs1NDYsNyBAQAogCQkJdHMtPnNwaS0+ZGV2LmJ1c19pZCwgdHMtPnRjLmlnbm9yZSwgUnQpOwogI2VuZGlmCiAJCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwKLQkJCSAgICAgIEhSVElNRVJfUkVMKTsKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9SRUwpOwogCQlyZXR1cm47CiAJfQogCkBAIC01NzgsNyArNTc4LDggQEAKICNlbmRpZgogCX0KIAotCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwgSFJUSU1FUl9SRUwpOworCWhydGltZXJfc3RhcnQoJnRzLT50aW1lciwga3RpbWVfc2V0KDAsIFRTX1BPTExfUEVSSU9EKSwKKwkJCUhSVElNRVJfTU9ERV9SRUwpOwogfQogCiBzdGF0aWMgaW50IGFkczc4NDZfZGVib3VuY2Uodm9pZCAqYWRzLCBpbnQgZGF0YV9pZHgsIGludCAqdmFsKQpAQCAtNjY3LDcgKzY2OCw3IEBACiAJCQkJc3RhdHVzKTsKIH0KIAotc3RhdGljIGludCBhZHM3ODQ2X3RpbWVyKHN0cnVjdCBocnRpbWVyICpoYW5kbGUpCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgYWRzNzg0Nl90aW1lcihzdHJ1Y3QgaHJ0aW1lciAqaGFuZGxlKQogewogCXN0cnVjdCBhZHM3ODQ2CSp0cyA9IGNvbnRhaW5lcl9vZihoYW5kbGUsIHN0cnVjdCBhZHM3ODQ2LCB0aW1lcik7CiAJaW50CQlzdGF0dXMgPSAwOwpAQCAtNzI0LDcgKzcyNSw3IEBACiAJCQlkaXNhYmxlX2lycSh0cy0+c3BpLT5pcnEpOwogCQkJdHMtPnBlbmRpbmcgPSAxOwogCQkJaHJ0aW1lcl9zdGFydCgmdHMtPnRpbWVyLCBrdGltZV9zZXQoMCwgVFNfUE9MTF9ERUxBWSksCi0JCQkJCUhSVElNRVJfUkVMKTsKKwkJCQkJSFJUSU1FUl9NT0RFX1JFTCk7CiAJCX0KIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdHMtPmxvY2ssIGZsYWdzKTsKQEAgLTg2Miw3ICs4NjMsNyBAQAogCXRzLT5zcGkgPSBzcGk7CiAJdHMtPmlucHV0ID0gaW5wdXRfZGV2OwogCi0JaHJ0aW1lcl9pbml0KCZ0cy0+dGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9SRUwpOworCWhydGltZXJfaW5pdCgmdHMtPnRpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfTU9ERV9SRUwpOwogCXRzLT50aW1lci5mdW5jdGlvbiA9IGFkczc4NDZfdGltZXI7CiAKIAlzcGluX2xvY2tfaW5pdCgmdHMtPmxvY2spOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9pc2RuL2dpZ2FzZXQvTWFrZWZpbGUgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9NYWtlZmlsZQppbmRleCA4MzViODA2Li4wNzdlMjk3IDEwMDY0NAotLS0gYS9kcml2ZXJzL2lzZG4vZ2lnYXNldC9NYWtlZmlsZQorKysgYi9kcml2ZXJzL2lzZG4vZ2lnYXNldC9NYWtlZmlsZQpAQCAtNSw0ICs1LDQgQEAKIAogb2JqLSQoQ09ORklHX0dJR0FTRVRfTTEwNSkgKz0gdXNiX2dpZ2FzZXQubyBnaWdhc2V0Lm8KIG9iai0kKENPTkZJR19HSUdBU0VUX0JBU0UpICs9IGJhc19naWdhc2V0Lm8gZ2lnYXNldC5vCi1vYmotJChDT05GSUdfR0lHQVNFVF9NMTA1KSArPSBzZXJfZ2lnYXNldC5vIGdpZ2FzZXQubworb2JqLSQoQ09ORklHX0dJR0FTRVRfTTEwMSkgKz0gc2VyX2dpZ2FzZXQubyBnaWdhc2V0Lm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9LY29uZmlnIGIvZHJpdmVycy9taXNjL0tjb25maWcKaW5kZXggYmVkYWU0YS4uODBiMTk5ZiAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL0tjb25maWcKKysrIGIvZHJpdmVycy9taXNjL0tjb25maWcKQEAgLTEwNyw0ICsxMDcsMTkgQEAKIAogCSAgSWYgeW91IGhhdmUgYW4gTVNJIFMyNzAgbGFwdG9wLCBzYXkgWSBvciBNIGhlcmUuCiAKK2NvbmZpZyBTT05ZX0xBUFRPUAorCXRyaXN0YXRlICJTb255IExhcHRvcCBFeHRyYXMiCisJZGVwZW5kcyBvbiBYODYgJiYgQUNQSQorCXNlbGVjdCBCQUNLTElHSFRfQ0xBU1NfREVWSUNFCisJICAtLS1oZWxwLS0tCisJICBUaGlzIG1pbmktZHJpdmVyIGRyaXZlcyB0aGUgU05DIGRldmljZSBwcmVzZW50IGluIHRoZSBBQ1BJIEJJT1Mgb2YKKwkgIHRoZSBTb255IFZhaW8gbGFwdG9wcy4KKworCSAgSXQgZ2l2ZXMgYWNjZXNzIHRvIHNvbWUgZXh0cmEgbGFwdG9wIGZ1bmN0aW9uYWxpdGllcy4gSW4gaXRzIGN1cnJlbnQKKwkgIGZvcm0sIHRoaXMgZHJpdmVyIGxldCB0aGUgdXNlciBzZXQgb3IgcXVlcnkgdGhlIHNjcmVlbiBicmlnaHRuZXNzCisJICB0aHJvdWdoIHRoZSBiYWNrbGlnaHQgc3Vic3lzdGVtIGFuZCByZW1vdmUvYXBwbHkgcG93ZXIgdG8gc29tZQorCSAgZGV2aWNlcy4KKworCSAgUmVhZCA8ZmlsZTpEb2N1bWVudGF0aW9uL3NvbnktbGFwdG9wLnR4dD4gZm9yIG1vcmUgaW5mb3JtYXRpb24uCisKIGVuZG1lbnUKZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9NYWtlZmlsZSBiL2RyaXZlcnMvbWlzYy9NYWtlZmlsZQppbmRleCAzNWRhNTNjLi43NzkzY2NkIDEwMDY0NAotLS0gYS9kcml2ZXJzL21pc2MvTWFrZWZpbGUKKysrIGIvZHJpdmVycy9taXNjL01ha2VmaWxlCkBAIC0xMSwzICsxMSw0IEBACiBvYmotJChDT05GSUdfVElGTV9DT1JFKSAgICAgICAJKz0gdGlmbV9jb3JlLm8KIG9iai0kKENPTkZJR19USUZNXzdYWDEpICAgICAgIAkrPSB0aWZtXzd4eDEubwogb2JqLSQoQ09ORklHX1NHSV9JT0M0KQkJKz0gaW9jNC5vCitvYmotJChDT05GSUdfU09OWV9MQVBUT1ApCSs9IHNvbnktbGFwdG9wLm8KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbWlzYy9hc3VzLWxhcHRvcC5jIGIvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKaW5kZXggODYxYzM5OS4uZTRlMmI3MCAxMDA2NDQKLS0tIGEvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKKysrIGIvZHJpdmVycy9taXNjL2FzdXMtbGFwdG9wLmMKQEAgLTEwODgsMTEgKzEwODgsNiBAQAogCWlmIChhY3BpX2Rpc2FibGVkKQogCQlyZXR1cm4gLUVOT0RFVjsKIAotCWlmICghYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZCkgewotCQlwcmludGsoQVNVU19FUlIgIlVzaW5nIGdlbmVyaWMgaG90a2V5IGRyaXZlclxuIik7Ci0JCXJldHVybiAtRU5PREVWOwotCX0KLQogCXJlc3VsdCA9IGFjcGlfYnVzX3JlZ2lzdGVyX2RyaXZlcigmYXN1c19ob3RrX2RyaXZlcik7CiAJaWYgKHJlc3VsdCA8IDApCiAJCXJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYyBiL2RyaXZlcnMvbWlzYy9zb255LWxhcHRvcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhYmJlZDAKLS0tIC9kZXYvbnVsbAorKysgYi9kcml2ZXJzL21pc2Mvc29ueS1sYXB0b3AuYwpAQCAtMCwwICsxLDU2MiBAQAorLyoKKyAqIEFDUEkgU29ueSBOb3RlYm9vayBDb250cm9sIERyaXZlciAoU05DKQorICoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDA1IFN0ZWxpYW4gUG9wIDxzdGVsaWFuQHBvcGllcy5uZXQ+CisgKiBDb3B5cmlnaHQgKEMpIDIwMDcgTWF0dGlhIERvbmdpbGkgPG1hbGF0dGlhQGxpbnV4Lml0PgorICoKKyAqIFBhcnRzIG9mIHRoaXMgZHJpdmVyIGluc3BpcmVkIGZyb20gYXN1c19hY3BpLmMgYW5kIGlibV9hY3BpLmMKKyAqIHdoaWNoIGFyZSBjb3B5cmlnaHRlZCBieSB0aGVpciByZXNwZWN0aXZlIGF1dGhvcnMuCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGVwYXJhbS5oPgorI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgPGxpbnV4L2JhY2tsaWdodC5oPgorI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGFjcGkvYWNwaV9kcml2ZXJzLmg+CisjaW5jbHVkZSA8YWNwaS9hY3BpX2J1cy5oPgorI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKyNkZWZpbmUgQUNQSV9TTkNfQ0xBU1MJCSJzb255IgorI2RlZmluZSBBQ1BJX1NOQ19ISUQJCSJTTlk1MDAxIgorI2RlZmluZSBBQ1BJX1NOQ19EUklWRVJfTkFNRQkiQUNQSSBTb255IE5vdGVib29rIENvbnRyb2wgRHJpdmVyIHYwLjQiCisKKy8qIHRoZSBkZXZpY2UgdXNlcyAxLWJhc2VkIHZhbHVlcywgd2hpbGUgdGhlIGJhY2tsaWdodCBzdWJzeXN0ZW0gdXNlcworICAgMC1iYXNlZCB2YWx1ZXMgKi8KKyNkZWZpbmUgU09OWV9NQVhfQlJJR0hUTkVTUwk4CisKKyNkZWZpbmUgTE9HX1BGWAkJCUtFUk5fV0FSTklORyAic29ueS1sYXB0b3A6ICIKKworTU9EVUxFX0FVVEhPUigiU3RlbGlhbiBQb3AsIE1hdHRpYSBEb25naWxpIik7CitNT0RVTEVfREVTQ1JJUFRJT04oQUNQSV9TTkNfRFJJVkVSX05BTUUpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOworCitzdGF0aWMgaW50IGRlYnVnOworbW9kdWxlX3BhcmFtKGRlYnVnLCBpbnQsIDApOworTU9EVUxFX1BBUk1fREVTQyhkZWJ1ZywgInNldCB0aGlzIHRvIDEgKGFuZCBSVEZNKSBpZiB5b3Ugd2FudCB0byBoZWxwICIKKwkJICJ0aGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBkcml2ZXIiKTsKKworc3RhdGljIHNzaXplX3Qgc29ueV9hY3BpX3Nob3coc3RydWN0IGRldmljZSAqLCBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqLAorCQkJICAgICAgY2hhciAqKTsKK3N0YXRpYyBzc2l6ZV90IHNvbnlfYWNwaV9zdG9yZShzdHJ1Y3QgZGV2aWNlICosIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICosCisJCQkgICAgICAgY29uc3QgY2hhciAqLCBzaXplX3QpOworc3RhdGljIGludCBib29sZWFuX3ZhbGlkYXRlKGNvbnN0IGludCwgY29uc3QgaW50KTsKK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlKGNvbnN0IGludCwgY29uc3QgaW50KTsKKworI2RlZmluZSBTTkNfVkFMSURBVEVfSU4JCTAKKyNkZWZpbmUgU05DX1ZBTElEQVRFX09VVAkxCisKK3N0cnVjdCBzb255X2FjcGlfdmFsdWUgeworCWNoYXIgKm5hbWU7CQkvKiBuYW1lIG9mIHRoZSBlbnRyeSAqLworCWNoYXIgKiphY3BpZ2V0OwkJLyogbmFtZXMgb2YgdGhlIEFDUEkgZ2V0IGZ1bmN0aW9uICovCisJY2hhciAqKmFjcGlzZXQ7CQkvKiBuYW1lcyBvZiB0aGUgQUNQSSBzZXQgZnVuY3Rpb24gKi8KKwlpbnQgKCp2YWxpZGF0ZSkoY29uc3QgaW50LCBjb25zdCBpbnQpOwkvKiBpbnB1dC9vdXRwdXQgdmFsaWRhdGlvbiAqLworCWludCB2YWx1ZTsJCS8qIGN1cnJlbnQgc2V0dGluZyAqLworCWludCB2YWxpZDsJCS8qIEhhcyBldmVyIGJlZW4gc2V0ICovCisJaW50IGRlYnVnOwkJLyogYWN0aXZlIG9ubHkgaW4gZGVidWcgbW9kZSA/ICovCisJc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgZGV2YXR0cjsJLyogc3lzZnMgYXRyaWJ1dGUgKi8KK307CisKKyNkZWZpbmUgSEFORExFX05BTUVTKF9uYW1lLCBfdmFsdWVzLi4uKSBcCisJc3RhdGljIGNoYXIgKnNuY18jI19uYW1lW10gPSB7IF92YWx1ZXMsIE5VTEwgfQorCisjZGVmaW5lIFNPTllfQUNQSV9WQUxVRShfbmFtZSwgX2dldHRlcnMsIF9zZXR0ZXJzLCBfdmFsaWRhdGUsIF9kZWJ1ZykgXAorCXsgXAorCQkubmFtZQkJPSBfX3N0cmluZ2lmeShfbmFtZSksIFwKKwkJLmFjcGlnZXQJPSBfZ2V0dGVycywgXAorCQkuYWNwaXNldAk9IF9zZXR0ZXJzLCBcCisJCS52YWxpZGF0ZQk9IF92YWxpZGF0ZSwgXAorCQkuZGVidWcJCT0gX2RlYnVnLCBcCisJCS5kZXZhdHRyCT0gX19BVFRSKF9uYW1lLCAwLCBzb255X2FjcGlfc2hvdywgc29ueV9hY3BpX3N0b3JlKSwgXAorCX0KKworI2RlZmluZSBTT05ZX0FDUElfVkFMVUVfTlVMTAl7IC5uYW1lID0gTlVMTCB9CisKK0hBTkRMRV9OQU1FUyhmbmtleV9nZXQsICJHSEtFIik7CisKK0hBTkRMRV9OQU1FUyhicmlnaHRuZXNzX2RlZl9nZXQsICJHUEJSIik7CitIQU5ETEVfTkFNRVMoYnJpZ2h0bmVzc19kZWZfc2V0LCAiU1BCUiIpOworCitIQU5ETEVfTkFNRVMoY2Rwb3dlcl9nZXQsICJHQ0RQIik7CitIQU5ETEVfTkFNRVMoY2Rwb3dlcl9zZXQsICJTQ0RQIiwgIkNEUFciKTsKKworSEFORExFX05BTUVTKGF1ZGlvcG93ZXJfZ2V0LCAiR0FaUCIpOworSEFORExFX05BTUVTKGF1ZGlvcG93ZXJfc2V0LCAiQVpQVyIpOworCitIQU5ETEVfTkFNRVMobGFucG93ZXJfZ2V0LCAiR0xOUCIpOworSEFORExFX05BTUVTKGxhbnBvd2VyX3NldCwgIkxOUFciKTsKKworSEFORExFX05BTUVTKFBJRF9nZXQsICJHUElEIik7CisKK0hBTkRMRV9OQU1FUyhDVFJfZ2V0LCAiR0NUUiIpOworSEFORExFX05BTUVTKENUUl9zZXQsICJTQ1RSIik7CisKK0hBTkRMRV9OQU1FUyhQQ1JfZ2V0LCAiR1BDUiIpOworSEFORExFX05BTUVTKFBDUl9zZXQsICJTUENSIik7CisKK0hBTkRMRV9OQU1FUyhDTUlfZ2V0LCAiR0NNSSIpOworSEFORExFX05BTUVTKENNSV9zZXQsICJTQ01JIik7CisKK3N0YXRpYyBzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlIHNvbnlfYWNwaV92YWx1ZXNbXSA9IHsKKwlTT05ZX0FDUElfVkFMVUUoYnJpZ2h0bmVzc19kZWZhdWx0LCBzbmNfYnJpZ2h0bmVzc19kZWZfZ2V0LAorCQkJc25jX2JyaWdodG5lc3NfZGVmX3NldCwgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlLCAwKSwKKwlTT05ZX0FDUElfVkFMVUUoZm5rZXksIHNuY19mbmtleV9nZXQsIE5VTEwsIE5VTEwsIDApLAorCVNPTllfQUNQSV9WQUxVRShjZHBvd2VyLCBzbmNfY2Rwb3dlcl9nZXQsIHNuY19jZHBvd2VyX3NldCwgYm9vbGVhbl92YWxpZGF0ZSwgMCksCisJU09OWV9BQ1BJX1ZBTFVFKGF1ZGlvcG93ZXIsIHNuY19hdWRpb3Bvd2VyX2dldCwgc25jX2F1ZGlvcG93ZXJfc2V0LAorCQkJYm9vbGVhbl92YWxpZGF0ZSwgMCksCisJU09OWV9BQ1BJX1ZBTFVFKGxhbnBvd2VyLCBzbmNfbGFucG93ZXJfZ2V0LCBzbmNfbGFucG93ZXJfc2V0LAorCQkJYm9vbGVhbl92YWxpZGF0ZSwgMSksCisJLyogdW5rbm93biBtZXRob2RzICovCisJU09OWV9BQ1BJX1ZBTFVFKFBJRCwgc25jX1BJRF9nZXQsIE5VTEwsIE5VTEwsIDEpLAorCVNPTllfQUNQSV9WQUxVRShDVFIsIHNuY19DVFJfZ2V0LCBzbmNfQ1RSX3NldCwgTlVMTCwgMSksCisJU09OWV9BQ1BJX1ZBTFVFKFBDUiwgc25jX1BDUl9nZXQsIHNuY19QQ1Jfc2V0LCBOVUxMLCAxKSwKKwlTT05ZX0FDUElfVkFMVUUoQ01JLCBzbmNfQ01JX2dldCwgc25jX0NNSV9zZXQsIE5VTEwsIDEpLAorCVNPTllfQUNQSV9WQUxVRV9OVUxMCit9OworCitzdGF0aWMgYWNwaV9oYW5kbGUgc29ueV9hY3BpX2hhbmRsZTsKK3N0YXRpYyBzdHJ1Y3QgYWNwaV9kZXZpY2UgKnNvbnlfYWNwaV9hY3BpX2RldmljZSA9IE5VTEw7CisKKy8qCisgKiBhY3BpX2V2YWx1YXRlX29iamVjdCB3cmFwcGVycworICovCitzdGF0aWMgaW50IGFjcGlfY2FsbGdldGZ1bmMoYWNwaV9oYW5kbGUgaGFuZGxlLCBjaGFyICpuYW1lLCBpbnQgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgYWNwaV9idWZmZXIgb3V0cHV0OworCXVuaW9uIGFjcGlfb2JqZWN0IG91dF9vYmo7CisJYWNwaV9zdGF0dXMgc3RhdHVzOworCisJb3V0cHV0Lmxlbmd0aCA9IHNpemVvZihvdXRfb2JqKTsKKwlvdXRwdXQucG9pbnRlciA9ICZvdXRfb2JqOworCisJc3RhdHVzID0gYWNwaV9ldmFsdWF0ZV9vYmplY3QoaGFuZGxlLCBuYW1lLCBOVUxMLCAmb3V0cHV0KTsKKwlpZiAoKHN0YXR1cyA9PSBBRV9PSykgJiYgKG91dF9vYmoudHlwZSA9PSBBQ1BJX1RZUEVfSU5URUdFUikpIHsKKwkJKnJlc3VsdCA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKKwkJcmV0dXJuIDA7CisJfQorCisJcHJpbnRrKExPR19QRlggImFjcGlfY2FsbHJlYWRmdW5jIGZhaWxlZFxuIik7CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgYWNwaV9jYWxsc2V0ZnVuYyhhY3BpX2hhbmRsZSBoYW5kbGUsIGNoYXIgKm5hbWUsIGludCB2YWx1ZSwKKwkJCSAgICBpbnQgKnJlc3VsdCkKK3sKKwlzdHJ1Y3QgYWNwaV9vYmplY3RfbGlzdCBwYXJhbXM7CisJdW5pb24gYWNwaV9vYmplY3QgaW5fb2JqOworCXN0cnVjdCBhY3BpX2J1ZmZlciBvdXRwdXQ7CisJdW5pb24gYWNwaV9vYmplY3Qgb3V0X29iajsKKwlhY3BpX3N0YXR1cyBzdGF0dXM7CisKKwlwYXJhbXMuY291bnQgPSAxOworCXBhcmFtcy5wb2ludGVyID0gJmluX29iajsKKwlpbl9vYmoudHlwZSA9IEFDUElfVFlQRV9JTlRFR0VSOworCWluX29iai5pbnRlZ2VyLnZhbHVlID0gdmFsdWU7CisKKwlvdXRwdXQubGVuZ3RoID0gc2l6ZW9mKG91dF9vYmopOworCW91dHB1dC5wb2ludGVyID0gJm91dF9vYmo7CisKKwlzdGF0dXMgPSBhY3BpX2V2YWx1YXRlX29iamVjdChoYW5kbGUsIG5hbWUsICZwYXJhbXMsICZvdXRwdXQpOworCWlmIChzdGF0dXMgPT0gQUVfT0spIHsKKwkJaWYgKHJlc3VsdCAhPSBOVUxMKSB7CisJCQlpZiAob3V0X29iai50eXBlICE9IEFDUElfVFlQRV9JTlRFR0VSKSB7CisJCQkJcHJpbnRrKExPR19QRlggImFjcGlfZXZhbHVhdGVfb2JqZWN0IGJhZCAiCisJCQkJICAgICAgICJyZXR1cm4gdHlwZVxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJKnJlc3VsdCA9IG91dF9vYmouaW50ZWdlci52YWx1ZTsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisKKwlwcmludGsoTE9HX1BGWCAiYWNwaV9ldmFsdWF0ZV9vYmplY3QgZmFpbGVkXG4iKTsKKworCXJldHVybiAtMTsKK30KKworLyoKKyAqIHNvbnlfYWNwaV92YWx1ZXMgaW5wdXQvb3V0cHV0IHZhbGlkYXRlIGZ1bmN0aW9ucworICovCisKKy8qIGJyaWdodG5lc3NfZGVmYXVsdF92YWxpZGF0ZToKKyAqCisgKiBtYW5pcHVsYXRlIGlucHV0IG91dHB1dCB2YWx1ZXMgdG8ga2VlcCBjb25zaXN0ZW5jeSB3aXRoIHRoZQorICogYmFja2xpZ2h0IGZyYW1ld29yayBmb3Igd2hpY2ggYnJpZ2h0bmVzcyB2YWx1ZXMgYXJlIDAtYmFzZWQuCisgKi8KK3N0YXRpYyBpbnQgYnJpZ2h0bmVzc19kZWZhdWx0X3ZhbGlkYXRlKGNvbnN0IGludCBkaXJlY3Rpb24sIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlzd2l0Y2ggKGRpcmVjdGlvbikgeworCQljYXNlIFNOQ19WQUxJREFURV9PVVQ6CisJCQlyZXR1cm4gdmFsdWUgLSAxOworCQljYXNlIFNOQ19WQUxJREFURV9JTjoKKwkJCWlmICh2YWx1ZSA+PSAwICYmIHZhbHVlIDwgU09OWV9NQVhfQlJJR0hUTkVTUykKKwkJCQlyZXR1cm4gdmFsdWUgKyAxOworCX0KKwlyZXR1cm4gLUVJTlZBTDsKK30KKworLyogYm9vbGVhbl92YWxpZGF0ZToKKyAqCisgKiBvbiBpbnB1dCB2YWxpZGF0ZSBib29sZWFuIHZhbHVlcyAwLzEsIG9uIG91dHB1dCBqdXN0IHBhc3MgdGhlCisgKiByZWNlaXZlZCB2YWx1ZS4KKyAqLworc3RhdGljIGludCBib29sZWFuX3ZhbGlkYXRlKGNvbnN0IGludCBkaXJlY3Rpb24sIGNvbnN0IGludCB2YWx1ZSkKK3sKKwlpZiAoZGlyZWN0aW9uID09IFNOQ19WQUxJREFURV9JTikgeworCQlpZiAodmFsdWUgIT0gMCAmJiB2YWx1ZSAhPSAxKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiB2YWx1ZTsKK30KKworLyoKKyAqIFN5c2ZzIHNob3cvc3RvcmUgY29tbW9uIHRvIGFsbCBzb255X2FjcGlfdmFsdWVzCisgKi8KK3N0YXRpYyBzc2l6ZV90IHNvbnlfYWNwaV9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCisJCQkgICAgICBjaGFyICpidWZmZXIpCit7CisJaW50IHZhbHVlOworCXN0cnVjdCBzb255X2FjcGlfdmFsdWUgKml0ZW0gPQorCSAgICBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IHNvbnlfYWNwaV92YWx1ZSwgZGV2YXR0cik7CisKKwlpZiAoISppdGVtLT5hY3BpZ2V0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmIChhY3BpX2NhbGxnZXRmdW5jKHNvbnlfYWNwaV9oYW5kbGUsICppdGVtLT5hY3BpZ2V0LCAmdmFsdWUpIDwgMCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoaXRlbS0+dmFsaWRhdGUpCisJCXZhbHVlID0gaXRlbS0+dmFsaWRhdGUoU05DX1ZBTElEQVRFX09VVCwgdmFsdWUpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZmZlciwgUEFHRV9TSVpFLCAiJWRcbiIsIHZhbHVlKTsKK30KKworc3RhdGljIHNzaXplX3Qgc29ueV9hY3BpX3N0b3JlKHN0cnVjdCBkZXZpY2UgKmRldiwKKwkJCSAgICAgICBzdHJ1Y3QgZGV2aWNlX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgICBjb25zdCBjaGFyICpidWZmZXIsIHNpemVfdCBjb3VudCkKK3sKKwlpbnQgdmFsdWU7CisJc3RydWN0IHNvbnlfYWNwaV92YWx1ZSAqaXRlbSA9CisJICAgIGNvbnRhaW5lcl9vZihhdHRyLCBzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlLCBkZXZhdHRyKTsKKworCWlmICghaXRlbS0+YWNwaXNldCkKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoY291bnQgPiAzMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl2YWx1ZSA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZmZlciwgTlVMTCwgMTApOworCisJaWYgKGl0ZW0tPnZhbGlkYXRlKQorCQl2YWx1ZSA9IGl0ZW0tPnZhbGlkYXRlKFNOQ19WQUxJREFURV9JTiwgdmFsdWUpOworCisJaWYgKHZhbHVlIDwgMCkKKwkJcmV0dXJuIHZhbHVlOworCisJaWYgKGFjcGlfY2FsbHNldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlzZXQsIHZhbHVlLCBOVUxMKSA8IDApCisJCXJldHVybiAtRUlPOworCWl0ZW0tPnZhbHVlID0gdmFsdWU7CisJaXRlbS0+dmFsaWQgPSAxOworCXJldHVybiBjb3VudDsKK30KKworLyoKKyAqIFBsYXRmb3JtIGRldmljZQorICovCitzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RyaXZlciBzbmNwZl9kcml2ZXIgPSB7CisJLmRyaXZlciA9IHsKKwkJICAgLm5hbWUgPSAic29ueS1sYXB0b3AiLAorCQkgICAub3duZXIgPSBUSElTX01PRFVMRSwKKwkJICAgfQorfTsKK3N0YXRpYyBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICpzbmNwZl9kZXZpY2U7CisKK3N0YXRpYyBpbnQgc29ueV9zbmNfcGZfYWRkKHZvaWQpCit7CisJYWNwaV9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBzb255X2FjcGlfdmFsdWUgKml0ZW07CisJaW50IHJldCA9IDA7CisKKwlyZXQgPSBwbGF0Zm9ybV9kcml2ZXJfcmVnaXN0ZXIoJnNuY3BmX2RyaXZlcik7CisJaWYgKHJldCkKKwkJZ290byBvdXQ7CisKKwlzbmNwZl9kZXZpY2UgPSBwbGF0Zm9ybV9kZXZpY2VfYWxsb2MoInNvbnktbGFwdG9wIiwgLTEpOworCWlmICghc25jcGZfZGV2aWNlKSB7CisJCXJldCA9IC1FTk9NRU07CisJCWdvdG8gb3V0X3BsYXRmb3JtX3JlZ2lzdGVyZWQ7CisJfQorCisJcmV0ID0gcGxhdGZvcm1fZGV2aWNlX2FkZChzbmNwZl9kZXZpY2UpOworCWlmIChyZXQpCisJCWdvdG8gb3V0X3BsYXRmb3JtX2FsbG9jZWQ7CisKKwlmb3IgKGl0ZW0gPSBzb255X2FjcGlfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKKworCQlpZiAoIWRlYnVnICYmIGl0ZW0tPmRlYnVnKQorCQkJY29udGludWU7CisKKwkJLyogZmluZCB0aGUgYXZhaWxhYmxlIGFjcGlnZXQgYXMgZGVzY3JpYmVkIGluIHRoZSBEU0RUICovCisJCWZvciAoOyBpdGVtLT5hY3BpZ2V0ICYmICppdGVtLT5hY3BpZ2V0OyArK2l0ZW0tPmFjcGlnZXQpIHsKKwkJCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHNvbnlfYWNwaV9oYW5kbGUsCisJCQkJCQkJICppdGVtLT5hY3BpZ2V0LAorCQkJCQkJCSAmaGFuZGxlKSkpIHsKKwkJCQlpZiAoZGVidWcpCisJCQkJCXByaW50ayhMT0dfUEZYICJGb3VuZCAlcyBnZXR0ZXI6ICVzXG4iLAorCQkJCQkgICAgICAgaXRlbS0+bmFtZSwgKml0ZW0tPmFjcGlnZXQpOworCQkJCWl0ZW0tPmRldmF0dHIuYXR0ci5tb2RlIHw9IFNfSVJVR087CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCQkvKiBmaW5kIHRoZSBhdmFpbGFibGUgYWNwaXNldCBhcyBkZXNjcmliZWQgaW4gdGhlIERTRFQgKi8KKwkJZm9yICg7IGl0ZW0tPmFjcGlzZXQgJiYgKml0ZW0tPmFjcGlzZXQ7ICsraXRlbS0+YWNwaXNldCkgeworCQkJaWYgKEFDUElfU1VDQ0VTUyhhY3BpX2dldF9oYW5kbGUoc29ueV9hY3BpX2hhbmRsZSwKKwkJCQkJCQkgKml0ZW0tPmFjcGlzZXQsCisJCQkJCQkJICZoYW5kbGUpKSkgeworCQkJCWlmIChkZWJ1ZykKKwkJCQkJcHJpbnRrKExPR19QRlggIkZvdW5kICVzIHNldHRlcjogJXNcbiIsCisJCQkJCSAgICAgICBpdGVtLT5uYW1lLCAqaXRlbS0+YWNwaXNldCk7CisJCQkJaXRlbS0+ZGV2YXR0ci5hdHRyLm1vZGUgfD0gU19JV1VTUjsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCisJCWlmIChpdGVtLT5kZXZhdHRyLmF0dHIubW9kZSAhPSAwKSB7CisJCQlyZXQgPQorCQkJICAgIGRldmljZV9jcmVhdGVfZmlsZSgmc25jcGZfZGV2aWNlLT5kZXYsCisJCQkJCSAgICAgICAmaXRlbS0+ZGV2YXR0cik7CisJCQlpZiAocmV0KQorCQkJCWdvdG8gb3V0X3N5c2ZzOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKKyAgICAgIG91dF9zeXNmczoKKwlmb3IgKGl0ZW0gPSBzb255X2FjcGlfdmFsdWVzOyBpdGVtLT5uYW1lOyArK2l0ZW0pIHsKKwkJZGV2aWNlX3JlbW92ZV9maWxlKCZzbmNwZl9kZXZpY2UtPmRldiwgJml0ZW0tPmRldmF0dHIpOworCX0KKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNuY3BmX2RldmljZSk7CisgICAgICBvdXRfcGxhdGZvcm1fYWxsb2NlZDoKKwlwbGF0Zm9ybV9kZXZpY2VfcHV0KHNuY3BmX2RldmljZSk7CisgICAgICBvdXRfcGxhdGZvcm1fcmVnaXN0ZXJlZDoKKwlwbGF0Zm9ybV9kcml2ZXJfdW5yZWdpc3Rlcigmc25jcGZfZHJpdmVyKTsKKyAgICAgIG91dDoKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBzb255X3NuY19wZl9yZW1vdmUodm9pZCkKK3sKKwlzdHJ1Y3Qgc29ueV9hY3BpX3ZhbHVlICppdGVtOworCisJZm9yIChpdGVtID0gc29ueV9hY3BpX3ZhbHVlczsgaXRlbS0+bmFtZTsgKytpdGVtKSB7CisJCWRldmljZV9yZW1vdmVfZmlsZSgmc25jcGZfZGV2aWNlLT5kZXYsICZpdGVtLT5kZXZhdHRyKTsKKwl9CisKKwlwbGF0Zm9ybV9kZXZpY2VfZGVsKHNuY3BmX2RldmljZSk7CisJcGxhdGZvcm1fZGV2aWNlX3B1dChzbmNwZl9kZXZpY2UpOworCXBsYXRmb3JtX2RyaXZlcl91bnJlZ2lzdGVyKCZzbmNwZl9kcml2ZXIpOworfQorCisvKgorICogQmFja2xpZ2h0IGRldmljZQorICovCitzdGF0aWMgaW50IHNvbnlfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMoc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKmJkKQoreworCXJldHVybiBhY3BpX2NhbGxzZXRmdW5jKHNvbnlfYWNwaV9oYW5kbGUsICJTQlJUIiwKKwkJCQliZC0+cHJvcHMtPmJyaWdodG5lc3MgKyAxLCBOVUxMKTsKK30KKworc3RhdGljIGludCBzb255X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcyhzdHJ1Y3QgYmFja2xpZ2h0X2RldmljZSAqYmQpCit7CisJaW50IHZhbHVlOworCisJaWYgKGFjcGlfY2FsbGdldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgIkdCUlQiLCAmdmFsdWUpKQorCQlyZXR1cm4gMDsKKwkvKiBicmlnaHRuZXNzIGxldmVscyBhcmUgMS1iYXNlZCwgd2hpbGUgYmFja2xpZ2h0IG9uZXMgYXJlIDAtYmFzZWQgKi8KKwlyZXR1cm4gdmFsdWUgLSAxOworfQorCitzdGF0aWMgc3RydWN0IGJhY2tsaWdodF9kZXZpY2UgKnNvbnlfYmFja2xpZ2h0X2RldmljZTsKK3N0YXRpYyBzdHJ1Y3QgYmFja2xpZ2h0X3Byb3BlcnRpZXMgc29ueV9iYWNrbGlnaHRfcHJvcGVydGllcyA9IHsKKwkub3duZXIgPSBUSElTX01PRFVMRSwKKwkudXBkYXRlX3N0YXR1cyA9IHNvbnlfYmFja2xpZ2h0X3VwZGF0ZV9zdGF0dXMsCisJLmdldF9icmlnaHRuZXNzID0gc29ueV9iYWNrbGlnaHRfZ2V0X2JyaWdodG5lc3MsCisJLm1heF9icmlnaHRuZXNzID0gU09OWV9NQVhfQlJJR0hUTkVTUyAtIDEsCit9OworCisvKgorICogQUNQSSBjYWxsYmFja3MKKyAqLworc3RhdGljIHZvaWQgc29ueV9hY3BpX25vdGlmeShhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBldmVudCwgdm9pZCAqZGF0YSkKK3sKKwlpZiAoZGVidWcpCisJCXByaW50ayhMT0dfUEZYICJzb255X2FjcGlfbm90aWZ5LCBldmVudDogJWRcbiIsIGV2ZW50KTsKKwlhY3BpX2J1c19nZW5lcmF0ZV9ldmVudChzb255X2FjcGlfYWNwaV9kZXZpY2UsIDEsIGV2ZW50KTsKK30KKworc3RhdGljIGFjcGlfc3RhdHVzIHNvbnlfd2Fsa19jYWxsYmFjayhhY3BpX2hhbmRsZSBoYW5kbGUsIHUzMiBsZXZlbCwKKwkJCQkgICAgICB2b2lkICpjb250ZXh0LCB2b2lkICoqcmV0dXJuX3ZhbHVlKQoreworCXN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICpub2RlOworCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm9wZXJhbmQ7CisKKwlub2RlID0gKHN0cnVjdCBhY3BpX25hbWVzcGFjZV9ub2RlICopaGFuZGxlOworCW9wZXJhbmQgPSAodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqKW5vZGUtPm9iamVjdDsKKworCXByaW50ayhMT0dfUEZYICJtZXRob2Q6IG5hbWU6ICU0LjRzLCBhcmdzICVYXG4iLCBub2RlLT5uYW1lLmFzY2lpLAorCSAgICAgICAodTMyKSBvcGVyYW5kLT5tZXRob2QucGFyYW1fY291bnQpOworCisJcmV0dXJuIEFFX09LOworfQorCisvKgorICogQUNQSSBkZXZpY2UKKyAqLworc3RhdGljIGludCBzb255X2FjcGlfcmVzdW1lKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCXN0cnVjdCBzb255X2FjcGlfdmFsdWUgKml0ZW07CisKKwlmb3IgKGl0ZW0gPSBzb255X2FjcGlfdmFsdWVzOyBpdGVtLT5uYW1lOyBpdGVtKyspIHsKKwkJaW50IHJldDsKKworCQlpZiAoIWl0ZW0tPnZhbGlkKQorCQkJY29udGludWU7CisJCXJldCA9IGFjcGlfY2FsbHNldGZ1bmMoc29ueV9hY3BpX2hhbmRsZSwgKml0ZW0tPmFjcGlzZXQsCisJCQkJICAgICAgIGl0ZW0tPnZhbHVlLCBOVUxMKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCXByaW50aygiJXM6ICVkXG4iLCBfX0ZVTkNUSU9OX18sIHJldCk7CisJCQlicmVhazsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzb255X2FjcGlfYWRkKHN0cnVjdCBhY3BpX2RldmljZSAqZGV2aWNlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKwlpbnQgcmVzdWx0OworCWFjcGlfaGFuZGxlIGhhbmRsZTsKKworCXNvbnlfYWNwaV9hY3BpX2RldmljZSA9IGRldmljZTsKKworCXNvbnlfYWNwaV9oYW5kbGUgPSBkZXZpY2UtPmhhbmRsZTsKKworCWlmIChkZWJ1ZykgeworCQlzdGF0dXMgPSBhY3BpX3dhbGtfbmFtZXNwYWNlKEFDUElfVFlQRV9NRVRIT0QsIHNvbnlfYWNwaV9oYW5kbGUsCisJCQkJCSAgICAgMSwgc29ueV93YWxrX2NhbGxiYWNrLCBOVUxMLCBOVUxMKTsKKwkJaWYgKEFDUElfRkFJTFVSRShzdGF0dXMpKSB7CisJCQlwcmludGsoTE9HX1BGWCAidW5hYmxlIHRvIHdhbGsgYWNwaSByZXNvdXJjZXNcbiIpOworCQkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJCWdvdG8gb3V0d2FsazsKKwkJfQorCX0KKworCXN0YXR1cyA9IGFjcGlfaW5zdGFsbF9ub3RpZnlfaGFuZGxlcihzb255X2FjcGlfaGFuZGxlLAorCQkJCQkgICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgICBzb255X2FjcGlfbm90aWZ5LCBOVUxMKTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpIHsKKwkJcHJpbnRrKExPR19QRlggInVuYWJsZSB0byBpbnN0YWxsIG5vdGlmeSBoYW5kbGVyXG4iKTsKKwkJcmVzdWx0ID0gLUVOT0RFVjsKKwkJZ290byBvdXR3YWxrOworCX0KKworCWlmIChBQ1BJX1NVQ0NFU1MoYWNwaV9nZXRfaGFuZGxlKHNvbnlfYWNwaV9oYW5kbGUsICJHQlJUIiwgJmhhbmRsZSkpKSB7CisJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoInNvbnkiLCBOVUxMLAorCQkJCQkJCQkgIE5VTEwsCisJCQkJCQkJCSAgJnNvbnlfYmFja2xpZ2h0X3Byb3BlcnRpZXMpOworCisJCWlmIChJU19FUlIoc29ueV9iYWNrbGlnaHRfZGV2aWNlKSkgeworCQkJcHJpbnRrKExPR19QRlggInVuYWJsZSB0byByZWdpc3RlciBiYWNrbGlnaHQgZGV2aWNlXG4iKTsKKwkJCXNvbnlfYmFja2xpZ2h0X2RldmljZSA9IE5VTEw7CisJCX0gZWxzZQorCQkJc29ueV9iYWNrbGlnaHRfcHJvcGVydGllcy5icmlnaHRuZXNzID0KKwkJCSAgICBzb255X2JhY2tsaWdodF9nZXRfYnJpZ2h0bmVzcworCQkJICAgIChzb255X2JhY2tsaWdodF9kZXZpY2UpOworCX0KKworCWlmIChzb255X3NuY19wZl9hZGQoKSkKKwkJZ290byBvdXRiYWNrbGlnaHQ7CisKKwlwcmludGsoS0VSTl9JTkZPIEFDUElfU05DX0RSSVZFUl9OQU1FICIgc3VjY2Vzc2Z1bGx5IGluc3RhbGxlZFxuIik7CisKKwlyZXR1cm4gMDsKKworICAgICAgb3V0YmFja2xpZ2h0OgorCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihzb255X2JhY2tsaWdodF9kZXZpY2UpOworCisJc3RhdHVzID0gYWNwaV9yZW1vdmVfbm90aWZ5X2hhbmRsZXIoc29ueV9hY3BpX2hhbmRsZSwKKwkJCQkJICAgIEFDUElfREVWSUNFX05PVElGWSwKKwkJCQkJICAgIHNvbnlfYWNwaV9ub3RpZnkpOworCWlmIChBQ1BJX0ZBSUxVUkUoc3RhdHVzKSkKKwkJcHJpbnRrKExPR19QRlggInVuYWJsZSB0byByZW1vdmUgbm90aWZ5IGhhbmRsZXJcbiIpOworICAgICAgb3V0d2FsazoKKwlyZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW50IHNvbnlfYWNwaV9yZW1vdmUoc3RydWN0IGFjcGlfZGV2aWNlICpkZXZpY2UsIGludCB0eXBlKQoreworCWFjcGlfc3RhdHVzIHN0YXR1czsKKworCWlmIChzb255X2JhY2tsaWdodF9kZXZpY2UpCisJCWJhY2tsaWdodF9kZXZpY2VfdW5yZWdpc3Rlcihzb255X2JhY2tsaWdodF9kZXZpY2UpOworCisJc29ueV9hY3BpX2FjcGlfZGV2aWNlID0gTlVMTDsKKworCXN0YXR1cyA9IGFjcGlfcmVtb3ZlX25vdGlmeV9oYW5kbGVyKHNvbnlfYWNwaV9oYW5kbGUsCisJCQkJCSAgICBBQ1BJX0RFVklDRV9OT1RJRlksCisJCQkJCSAgICBzb255X2FjcGlfbm90aWZ5KTsKKwlpZiAoQUNQSV9GQUlMVVJFKHN0YXR1cykpCisJCXByaW50ayhMT0dfUEZYICJ1bmFibGUgdG8gcmVtb3ZlIG5vdGlmeSBoYW5kbGVyXG4iKTsKKworCXNvbnlfc25jX3BmX3JlbW92ZSgpOworCisJcHJpbnRrKEtFUk5fSU5GTyBBQ1BJX1NOQ19EUklWRVJfTkFNRSAiIHN1Y2Nlc3NmdWxseSByZW1vdmVkXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGFjcGlfZHJpdmVyIHNvbnlfYWNwaV9kcml2ZXIgPSB7CisJLm5hbWUgPSBBQ1BJX1NOQ19EUklWRVJfTkFNRSwKKwkuY2xhc3MgPSBBQ1BJX1NOQ19DTEFTUywKKwkuaWRzID0gQUNQSV9TTkNfSElELAorCS5vcHMgPSB7CisJCS5hZGQgPSBzb255X2FjcGlfYWRkLAorCQkucmVtb3ZlID0gc29ueV9hY3BpX3JlbW92ZSwKKwkJLnJlc3VtZSA9IHNvbnlfYWNwaV9yZXN1bWUsCisJCX0sCit9OworCitzdGF0aWMgaW50IF9faW5pdCBzb255X2FjcGlfaW5pdCh2b2lkKQoreworCXJldHVybiBhY3BpX2J1c19yZWdpc3Rlcl9kcml2ZXIoJnNvbnlfYWNwaV9kcml2ZXIpOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgc29ueV9hY3BpX2V4aXQodm9pZCkKK3sKKwlhY3BpX2J1c191bnJlZ2lzdGVyX2RyaXZlcigmc29ueV9hY3BpX2RyaXZlcik7Cit9CisKK21vZHVsZV9pbml0KHNvbnlfYWNwaV9pbml0KTsKK21vZHVsZV9leGl0KHNvbnlfYWNwaV9leGl0KTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvS2NvbmZpZwppbmRleCBhZDI3ZTVlLi5iMDQ3NjdjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL0tjb25maWcKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9LY29uZmlnCkBAIC0yLDE3ICsyLDUgQEAKICMgUGx1ZyBhbmQgUGxheSBBQ1BJIGNvbmZpZ3VyYXRpb24KICMKIGNvbmZpZyBQTlBBQ1BJCi0JYm9vbCAiUGx1ZyBhbmQgUGxheSBBQ1BJIHN1cHBvcnQiCi0JZGVwZW5kcyBvbiBQTlAgJiYgQUNQSQotCWRlZmF1bHQgeQotCS0tLWhlbHAtLS0KLQkgIExpbnV4IHVzZXMgdGhlIFBOUEFDUEkgdG8gYXV0b2RldGVjdCBidWlsdC1pbgotCSAgbWFpbmJvYXJkIHJlc291cmNlcyAoZS5nLiBwYXJhbGxlbCBwb3J0IHJlc291cmNlcykuCi0KLSAgICAgICAgICBTb21lIGZlYXR1cmVzIChlLmcuIHJlYWwgaG90cGx1ZykgYXJlIG5vdCBjdXJyZW50bHkKLSAgICAgICAgICBpbXBsZW1lbnRlZC4KLQotICAgICAgICAgIElmIHlvdSB3b3VsZCBsaWtlIHRoZSBrZXJuZWwgdG8gZGV0ZWN0IGFuZCBhbGxvY2F0ZSByZXNvdXJjZXMgdG8KLSAgICAgICAgICB5b3VyIG1haW5ib2FyZCBkZXZpY2VzIChvbiBzb21lIHN5c3RlbXMgdGhleSBhcmUgZGlzYWJsZWQgYnkgdGhlCi0gICAgICAgICAgQklPUykgc2F5IFkgaGVyZS4gIEFsc28gdGhlIFBOUEFDUEkgY2FuIGhlbHAgcHJldmVudCByZXNvdXJjZQotICAgICAgICAgIGNvbmZsaWN0cyBiZXR3ZWVuIG1haW5ib2FyZCBkZXZpY2VzIGFuZCBvdGhlciBidXMgZGV2aWNlcy4KKwlib29sCisJZGVmYXVsdCAoUE5QICYmIEFDUEkpCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jIGIvZHJpdmVycy91c2IvbWlzYy9hcHBsZWRpc3BsYXkuYwppbmRleCAzMmYwZTNhLi5lNTczYzhiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3VzYi9taXNjL2FwcGxlZGlzcGxheS5jCisrKyBiL2RyaXZlcnMvdXNiL21pc2MvYXBwbGVkaXNwbGF5LmMKQEAgLTI4MSw4ICsyODEsOCBAQAogCS8qIFJlZ2lzdGVyIGJhY2tsaWdodCBkZXZpY2UgKi8KIAlzbnByaW50ZihibF9uYW1lLCBzaXplb2YoYmxfbmFtZSksICJhcHBsZWRpc3BsYXklZCIsCiAJCWF0b21pY19pbmNfcmV0dXJuKCZjb3VudF9kaXNwbGF5cykgLSAxKTsKLQlwZGF0YS0+YmQgPSBiYWNrbGlnaHRfZGV2aWNlX3JlZ2lzdGVyKGJsX25hbWUsIE5VTEwsCi0JCXBkYXRhLCAmYXBwbGVkaXNwbGF5X2JsX2RhdGEpOworCXBkYXRhLT5iZCA9IGJhY2tsaWdodF9kZXZpY2VfcmVnaXN0ZXIoYmxfbmFtZSwgTlVMTCwgcGRhdGEsCisJCQkJCQkmYXBwbGVkaXNwbGF5X2JsX2RhdGEpOwogCWlmIChJU19FUlIocGRhdGEtPmJkKSkgewogCQllcnIoImFwcGxlZGlzcGxheTogQmFja2xpZ2h0IHJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKIAkJZ290byBlcnJvcjsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMgYi9kcml2ZXJzL3ZpZGVvL3MzYzI0MTBmYi5jCmluZGV4IGNjZWY1NmQuLmVkMzQyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvdmlkZW8vczNjMjQxMGZiLmMKKysrIGIvZHJpdmVycy92aWRlby9zM2MyNDEwZmIuYwpAQCAtNzkxLDYgKzc5MSw4IEBACiAKIAlpbmZvID0gZmJpbmZvLT5wYXI7CiAJaW5mby0+ZmIgPSBmYmluZm87CisJaW5mby0+ZGV2ID0gJnBkZXYtPmRldjsKKwogCXBsYXRmb3JtX3NldF9kcnZkYXRhKHBkZXYsIGZiaW5mbyk7CiAKIAlkcHJpbnRrKCJkZXZpbml0XG4iKTsKZGlmZiAtLWdpdCBhL2ZzL2VjcnlwdGZzL2VjcnlwdGZzX2tlcm5lbC5oIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKaW5kZXggYjM2MDliNy4uNDAzZTNiYSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKKysrIGIvZnMvZWNyeXB0ZnMvZWNyeXB0ZnNfa2VybmVsLmgKQEAgLTQ2Nyw2ICs0NjcsNyBAQAogZXh0ZXJuIHN0cnVjdCBrbWVtX2NhY2hlICplY3J5cHRmc19oZWFkZXJfY2FjaGVfMjsKIGV4dGVybiBzdHJ1Y3Qga21lbV9jYWNoZSAqZWNyeXB0ZnNfeGF0dHJfY2FjaGU7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2xvd2VyX3BhZ2VfY2FjaGU7CitleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2tleV9yZWNvcmRfY2FjaGU7CiAKIGludCBlY3J5cHRmc19pbnRlcnBvc2Uoc3RydWN0IGRlbnRyeSAqaGlkZGVuX2RlbnRyeSwKIAkJICAgICAgIHN0cnVjdCBkZW50cnkgKnRoaXNfZGVudHJ5LCBzdHJ1Y3Qgc3VwZXJfYmxvY2sgKnNiLApkaWZmIC0tZ2l0IGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYyBiL2ZzL2VjcnlwdGZzL2tleXN0b3JlLmMKaW5kZXggODExNTZlOS4uYjU1MGRlYSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMva2V5c3RvcmUuYworKysgYi9mcy9lY3J5cHRmcy9rZXlzdG9yZS5jCkBAIC0xNjM4LDYgKzE2MzgsOCBAQAogCXJldHVybiByYzsKIH0KIAorc3RydWN0IGttZW1fY2FjaGUgKmVjcnlwdGZzX2tleV9yZWNvcmRfY2FjaGU7CisKIC8qKgogICogZWNyeXB0ZnNfZ2VuZXJhdGVfa2V5X3BhY2tldF9zZXQKICAqIEBkZXN0OiBWaXJ0dWFsIGFkZHJlc3MgZnJvbSB3aGljaCB0byB3cml0ZSB0aGUga2V5IHJlY29yZCBzZXQKQEAgLTE2NjQsNTAgKzE2NjYsNTUgQEAKIAkJJmVjcnlwdGZzX3N1cGVyYmxvY2tfdG9fcHJpdmF0ZSgKIAkJCWVjcnlwdGZzX2RlbnRyeS0+ZF9zYiktPm1vdW50X2NyeXB0X3N0YXQ7CiAJc2l6ZV90IHdyaXR0ZW47Ci0Jc3RydWN0IGVjcnlwdGZzX2tleV9yZWNvcmQga2V5X3JlYzsKKwlzdHJ1Y3QgZWNyeXB0ZnNfa2V5X3JlY29yZCAqa2V5X3JlYzsKIAlpbnQgcmMgPSAwOwogCiAJKCpsZW4pID0gMDsKKwlrZXlfcmVjID0ga21lbV9jYWNoZV9hbGxvYyhlY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWtleV9yZWMpIHsKKwkJcmMgPSAtRU5PTUVNOworCQlnb3RvIG91dDsKKwl9CiAJaWYgKG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3RvaykgewogCQlhdXRoX3RvayA9IG1vdW50X2NyeXB0X3N0YXQtPmdsb2JhbF9hdXRoX3RvazsKIAkJaWYgKGF1dGhfdG9rLT50b2tlbl90eXBlID09IEVDUllQVEZTX1BBU1NXT1JEKSB7CiAJCQlyYyA9IHdyaXRlX3RhZ18zX3BhY2tldCgoZGVzdF9iYXNlICsgKCpsZW4pKSwKIAkJCQkJCW1heCwgYXV0aF90b2ssCi0JCQkJCQljcnlwdF9zdGF0LCAma2V5X3JlYywKKwkJCQkJCWNyeXB0X3N0YXQsIGtleV9yZWMsCiAJCQkJCQkmd3JpdHRlbik7CiAJCQlpZiAocmMpIHsKIAkJCQllY3J5cHRmc19wcmludGsoS0VSTl9XQVJOSU5HLCAiRXJyb3IgIgogCQkJCQkJIndyaXRpbmcgdGFnIDMgcGFja2V0XG4iKTsKLQkJCQlnb3RvIG91dDsKKwkJCQlnb3RvIG91dF9mcmVlOwogCQkJfQogCQkJKCpsZW4pICs9IHdyaXR0ZW47CiAJCQkvKiBXcml0ZSBhdXRoIHRvayBzaWduYXR1cmUgcGFja2V0ICovCiAJCQlyYyA9IHdyaXRlX3RhZ18xMV9wYWNrZXQoCiAJCQkJKGRlc3RfYmFzZSArICgqbGVuKSksCiAJCQkJKG1heCAtICgqbGVuKSksCi0JCQkJa2V5X3JlYy5zaWcsIEVDUllQVEZTX1NJR19TSVpFLCAmd3JpdHRlbik7CisJCQkJa2V5X3JlYy0+c2lnLCBFQ1JZUFRGU19TSUdfU0laRSwgJndyaXR0ZW4pOwogCQkJaWYgKHJjKSB7CiAJCQkJZWNyeXB0ZnNfcHJpbnRrKEtFUk5fRVJSLCAiRXJyb3Igd3JpdGluZyAiCiAJCQkJCQkiYXV0aCB0b2sgc2lnbmF0dXJlIHBhY2tldFxuIik7Ci0JCQkJZ290byBvdXQ7CisJCQkJZ290byBvdXRfZnJlZTsKIAkJCX0KIAkJCSgqbGVuKSArPSB3cml0dGVuOwogCQl9IGVsc2UgaWYgKGF1dGhfdG9rLT50b2tlbl90eXBlID09IEVDUllQVEZTX1BSSVZBVEVfS0VZKSB7CiAJCQlyYyA9IHdyaXRlX3RhZ18xX3BhY2tldChkZXN0X2Jhc2UgKyAoKmxlbiksCiAJCQkJCQltYXgsIGF1dGhfdG9rLAogCQkJCQkJY3J5cHRfc3RhdCxtb3VudF9jcnlwdF9zdGF0LAotCQkJCQkJJmtleV9yZWMsICZ3cml0dGVuKTsKKwkJCQkJCWtleV9yZWMsICZ3cml0dGVuKTsKIAkJCWlmIChyYykgewogCQkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJFcnJvciAiCiAJCQkJCQkid3JpdGluZyB0YWcgMSBwYWNrZXRcbiIpOwotCQkJCWdvdG8gb3V0OworCQkJCWdvdG8gb3V0X2ZyZWU7CiAJCQl9CiAJCQkoKmxlbikgKz0gd3JpdHRlbjsKIAkJfSBlbHNlIHsKIAkJCWVjcnlwdGZzX3ByaW50ayhLRVJOX1dBUk5JTkcsICJVbnN1cHBvcnRlZCAiCiAJCQkJCSJhdXRoZW50aWNhdGlvbiB0b2tlbiB0eXBlXG4iKTsKIAkJCXJjID0gLUVJTlZBTDsKLQkJCWdvdG8gb3V0OworCQkJZ290byBvdXRfZnJlZTsKIAkJfQogCX0gZWxzZQogCQlCVUcoKTsKQEAgLTE3MTcsNiArMTcyNCw5IEBACiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkVycm9yIHdyaXRpbmcgYm91bmRhcnkgYnl0ZVxuIik7CiAJCXJjID0gLUVJTzsKIAl9CisKK291dF9mcmVlOgorCWttZW1fY2FjaGVfZnJlZShlY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlLCBrZXlfcmVjKTsKIG91dDoKIAlpZiAocmMpCiAJCSgqbGVuKSA9IDA7CmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tYWluLmMgYi9mcy9lY3J5cHRmcy9tYWluLmMKaW5kZXggMjZmZTQwNS4uODAwNDRkMSAxMDA2NDQKLS0tIGEvZnMvZWNyeXB0ZnMvbWFpbi5jCisrKyBiL2ZzL2VjcnlwdGZzL21haW4uYwpAQCAtNjUxLDYgKzY1MSwxMSBAQAogCQkubmFtZSA9ICJlY3J5cHRmc19sb3dlcl9wYWdlX2NhY2hlIiwKIAkJLnNpemUgPSBQQUdFX0NBQ0hFX1NJWkUsCiAJfSwKKwl7CisJCS5jYWNoZSA9ICZlY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlLAorCQkubmFtZSA9ICJlY3J5cHRmc19rZXlfcmVjb3JkX2NhY2hlIiwKKwkJLnNpemUgPSBzaXplb2Yoc3RydWN0IGVjcnlwdGZzX2tleV9yZWNvcmQpLAorCX0sCiB9OwogCiBzdGF0aWMgdm9pZCBlY3J5cHRmc19mcmVlX2ttZW1fY2FjaGVzKHZvaWQpCmRpZmYgLS1naXQgYS9mcy9lY3J5cHRmcy9tZXNzYWdpbmcuYyBiL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCmluZGV4IDQ3ZDdlN2IuLjNiYWYyNTMgMTAwNjQ0Ci0tLSBhL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCisrKyBiL2ZzL2VjcnlwdGZzL21lc3NhZ2luZy5jCkBAIC0xNjksNyArMTY5LDggQEAKIAlpZiAoIW5ld19pZCkgewogCQlyYyA9IC1FTk9NRU07CiAJCWVjcnlwdGZzX3ByaW50ayhLRVJOX0VSUiwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnk7IHVuYWJsZSAiCi0JCQkJInRvIHJlZ2lzdGVyIGRhZW1vbiBbJWRdIGZvciB1c2VyXG4iLCBwaWQsIHVpZCk7CisJCQkJInRvIHJlZ2lzdGVyIGRhZW1vbiBbJWRdIGZvciB1c2VyIFslZF1cbiIsCisJCQkJcGlkLCB1aWQpOwogCQlnb3RvIHVubG9jazsKIAl9CiAJaWYgKCFlY3J5cHRmc19maW5kX2RhZW1vbl9pZCh1aWQsICZvbGRfaWQpKSB7CmRpZmYgLS1naXQgYS9mcy9uYW1laS5jIGIvZnMvbmFtZWkuYwppbmRleCAxNjFlMjIyLi5lZTYwY2M0IDEwMDY0NAotLS0gYS9mcy9uYW1laS5jCisrKyBiL2ZzL25hbWVpLmMKQEAgLTI2ODgsMTAgKzI2ODgsMTEgQEAKIHsKIAlzdHJ1Y3QgYWRkcmVzc19zcGFjZSAqbWFwcGluZyA9IGlub2RlLT5pX21hcHBpbmc7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JaW50IGVyciA9IC1FTk9NRU07CisJaW50IGVycjsKIAljaGFyICprYWRkcjsKIAogcmV0cnk6CisJZXJyID0gLUVOT01FTTsKIAlwYWdlID0gZmluZF9vcl9jcmVhdGVfcGFnZShtYXBwaW5nLCAwLCBnZnBfbWFzayk7CiAJaWYgKCFwYWdlKQogCQlnb3RvIGZhaWw7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRhY2wuYyBiL2ZzL25mc2QvbmZzNGFjbC5jCmluZGV4IDVkOTQ1NTUuLjgzMjY3M2IgMTAwNjQ0Ci0tLSBhL2ZzL25mc2QvbmZzNGFjbC5jCisrKyBiL2ZzL25mc2QvbmZzNGFjbC5jCkBAIC02MSw5ICs2MSwxMSBAQAogCiAvKiBmbGFncyB1c2VkIHRvIHNpbXVsYXRlIHBvc2l4IGRlZmF1bHQgQUNMcyAqLwogI2RlZmluZSBORlM0X0lOSEVSSVRBTkNFX0ZMQUdTIChORlM0X0FDRV9GSUxFX0lOSEVSSVRfQUNFIFwKLQkJfCBORlM0X0FDRV9ESVJFQ1RPUllfSU5IRVJJVF9BQ0UgfCBORlM0X0FDRV9JTkhFUklUX09OTFlfQUNFKQorCQl8IE5GUzRfQUNFX0RJUkVDVE9SWV9JTkhFUklUX0FDRSkKIAotI2RlZmluZSBORlM0X1NVUFBPUlRFRF9GTEFHUyAoTkZTNF9JTkhFUklUQU5DRV9GTEFHUyB8IE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVApCisjZGVmaW5lIE5GUzRfU1VQUE9SVEVEX0ZMQUdTIChORlM0X0lOSEVSSVRBTkNFX0ZMQUdTIFwKKwkJfCBORlM0X0FDRV9JTkhFUklUX09OTFlfQUNFIFwKKwkJfCBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQKQogCiAjZGVmaW5lIE1BU0tfRVFVQUwobWFzazEsIG1hc2syKSBcCiAJKCAoKG1hc2sxKSAmIE5GUzRfQUNFX01BU0tfQUxMKSA9PSAoKG1hc2syKSAmIE5GUzRfQUNFX01BU0tfQUxMKSApCkBAIC04NywxMiArODksMTkgQEAKIH0KIAogc3RhdGljIHUzMgotZGVueV9tYXNrKHUzMiBhbGxvd19tYXNrLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCitkZW55X21hc2tfZnJvbV9wb3NpeCh1bnNpZ25lZCBzaG9ydCBwZXJtLCB1MzIgZmxhZ3MpCiB7Ci0JdTMyIHJldCA9IH5hbGxvd19tYXNrICYgfk5GUzRfTUFTS19VTlNVUFA7Ci0JaWYgKCEoZmxhZ3MgJiBORlM0X0FDTF9ESVIpKQotCQlyZXQgJj0gfk5GUzRfQUNFX0RFTEVURV9DSElMRDsKLQlyZXR1cm4gcmV0OworCXUzMiBtYXNrID0gMDsKKworCWlmIChwZXJtICYgQUNMX1JFQUQpCisJCW1hc2sgfD0gTkZTNF9SRUFEX01PREU7CisJaWYgKHBlcm0gJiBBQ0xfV1JJVEUpCisJCW1hc2sgfD0gTkZTNF9XUklURV9NT0RFOworCWlmICgocGVybSAmIEFDTF9XUklURSkgJiYgKGZsYWdzICYgTkZTNF9BQ0xfRElSKSkKKwkJbWFzayB8PSBORlM0X0FDRV9ERUxFVEVfQ0hJTEQ7CisJaWYgKHBlcm0gJiBBQ0xfRVhFQ1VURSkKKwkJbWFzayB8PSBORlM0X0VYRUNVVEVfTU9ERTsKKwlyZXR1cm4gbWFzazsKIH0KIAogLyogWFhYOiBtb2RpZnkgZnVuY3Rpb25zIHRvIHJldHVybiBORlMgZXJyb3JzOyB0aGV5J3JlIG9ubHkgZXZlcgpAQCAtMTI2LDEwOCArMTM1LDE1MSBAQAogfTsKIAogc3RhdGljIHNob3J0IGFjZTJ0eXBlKHN0cnVjdCBuZnM0X2FjZSAqKTsKLXN0YXRpYyBpbnQgX3Bvc2l4X3RvX25mc3Y0X29uZShzdHJ1Y3QgcG9zaXhfYWNsICosIHN0cnVjdCBuZnM0X2FjbCAqLCB1bnNpZ25lZCBpbnQpOwotc3RhdGljIHN0cnVjdCBwb3NpeF9hY2wgKl9uZnN2NF90b19wb3NpeF9vbmUoc3RydWN0IG5mczRfYWNsICosIHVuc2lnbmVkIGludCk7Ci1pbnQgbmZzNF9hY2xfYWRkX2FjZShzdHJ1Y3QgbmZzNF9hY2wgKiwgdTMyLCB1MzIsIHUzMiwgaW50LCB1aWRfdCk7Ci1zdGF0aWMgaW50IG5mczRfYWNsX3NwbGl0KHN0cnVjdCBuZnM0X2FjbCAqLCBzdHJ1Y3QgbmZzNF9hY2wgKik7CitzdGF0aWMgdm9pZCBfcG9zaXhfdG9fbmZzdjRfb25lKHN0cnVjdCBwb3NpeF9hY2wgKiwgc3RydWN0IG5mczRfYWNsICosCisJCQkJdW5zaWduZWQgaW50KTsKK3ZvaWQgbmZzNF9hY2xfYWRkX2FjZShzdHJ1Y3QgbmZzNF9hY2wgKiwgdTMyLCB1MzIsIHUzMiwgaW50LCB1aWRfdCk7CiAKIHN0cnVjdCBuZnM0X2FjbCAqCiBuZnM0X2FjbF9wb3NpeF90b19uZnN2NChzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsICpkcGFjbCwKIAkJCXVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgbmZzNF9hY2wgKmFjbDsKLQlpbnQgZXJyb3IgPSAtRUlOVkFMOworCWludCBzaXplID0gMDsKIAotCWlmICgocGFjbCAhPSBOVUxMICYmCi0JCShwb3NpeF9hY2xfdmFsaWQocGFjbCkgPCAwIHx8IHBhY2wtPmFfY291bnQgPT0gMCkpIHx8Ci0JICAgIChkcGFjbCAhPSBOVUxMICYmCi0JCShwb3NpeF9hY2xfdmFsaWQoZHBhY2wpIDwgMCB8fCBkcGFjbC0+YV9jb3VudCA9PSAwKSkpCi0JCWdvdG8gb3V0X2VycjsKLQotCWFjbCA9IG5mczRfYWNsX25ldygpOwotCWlmIChhY2wgPT0gTlVMTCkgewotCQllcnJvciA9IC1FTk9NRU07Ci0JCWdvdG8gb3V0X2VycjsKKwlpZiAocGFjbCkgeworCQlpZiAocG9zaXhfYWNsX3ZhbGlkKHBhY2wpIDwgMCkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlzaXplICs9IDIqcGFjbC0+YV9jb3VudDsKKwl9CisJaWYgKGRwYWNsKSB7CisJCWlmIChwb3NpeF9hY2xfdmFsaWQoZHBhY2wpIDwgMCkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQlzaXplICs9IDIqZHBhY2wtPmFfY291bnQ7CiAJfQogCi0JaWYgKHBhY2wgIT0gTlVMTCkgewotCQllcnJvciA9IF9wb3NpeF90b19uZnN2NF9vbmUocGFjbCwgYWNsLAotCQkJCQkJZmxhZ3MgJiB+TkZTNF9BQ0xfVFlQRV9ERUZBVUxUKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0X2FjbDsKLQl9CisJLyogQWxsb2NhdGUgZm9yIHdvcnN0IGNhc2U6IG9uZSAoZGVueSwgYWxsb3cpIHBhaXIgZWFjaDogKi8KKwlhY2wgPSBuZnM0X2FjbF9uZXcoc2l6ZSk7CisJaWYgKGFjbCA9PSBOVUxMKQorCQlyZXR1cm4gRVJSX1BUUigtRU5PTUVNKTsKIAotCWlmIChkcGFjbCAhPSBOVUxMKSB7Ci0JCWVycm9yID0gX3Bvc2l4X3RvX25mc3Y0X29uZShkcGFjbCwgYWNsLAotCQkJCQkJZmxhZ3MgfCBORlM0X0FDTF9UWVBFX0RFRkFVTFQpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBvdXRfYWNsOwotCX0KKwlpZiAocGFjbCkKKwkJX3Bvc2l4X3RvX25mc3Y0X29uZShwYWNsLCBhY2wsIGZsYWdzICYgfk5GUzRfQUNMX1RZUEVfREVGQVVMVCk7CiAKLQlyZXR1cm4gYWNsOwotCi1vdXRfYWNsOgotCW5mczRfYWNsX2ZyZWUoYWNsKTsKLW91dF9lcnI6Ci0JYWNsID0gRVJSX1BUUihlcnJvcik7CisJaWYgKGRwYWNsKQorCQlfcG9zaXhfdG9fbmZzdjRfb25lKGRwYWNsLCBhY2wsIGZsYWdzIHwgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKTsKIAogCXJldHVybiBhY2w7CiB9CiAKLXN0YXRpYyBpbnQKLW5mczRfYWNsX2FkZF9wYWlyKHN0cnVjdCBuZnM0X2FjbCAqYWNsLCBpbnQgZWZsYWcsIHUzMiBtYXNrLCBpbnQgd2hvdHlwZSwKLQkJdWlkX3Qgb3duZXIsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlpbnQgZXJyb3I7CitzdHJ1Y3QgcG9zaXhfYWNsX3N1bW1hcnkgeworCXVuc2lnbmVkIHNob3J0IG93bmVyOworCXVuc2lnbmVkIHNob3J0IHVzZXJzOworCXVuc2lnbmVkIHNob3J0IGdyb3VwOworCXVuc2lnbmVkIHNob3J0IGdyb3VwczsKKwl1bnNpZ25lZCBzaG9ydCBvdGhlcjsKKwl1bnNpZ25lZCBzaG9ydCBtYXNrOworfTsKIAotCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFLAotCQkJCSBlZmxhZywgbWFzaywgd2hvdHlwZSwgb3duZXIpOwotCWlmIChlcnJvciA8IDApCi0JCXJldHVybiBlcnJvcjsKLQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAotCQkJCWVmbGFnLCBkZW55X21hc2sobWFzaywgZmxhZ3MpLCB3aG90eXBlLCBvd25lcik7Ci0JcmV0dXJuIGVycm9yOworc3RhdGljIHZvaWQKK3N1bW1hcml6ZV9wb3NpeF9hY2woc3RydWN0IHBvc2l4X2FjbCAqYWNsLCBzdHJ1Y3QgcG9zaXhfYWNsX3N1bW1hcnkgKnBhcykKK3sKKwlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlOworCXBhcy0+dXNlcnMgPSAwOworCXBhcy0+Z3JvdXBzID0gMDsKKwlwYXMtPm1hc2sgPSAwNzsKKworCXBlID0gYWNsLT5hX2VudHJpZXMgKyBhY2wtPmFfY291bnQ7CisKKwlGT1JFQUNIX0FDTF9FTlRSWShwYSwgYWNsLCBwZSkgeworCQlzd2l0Y2ggKHBhLT5lX3RhZykgeworCQkJY2FzZSBBQ0xfVVNFUl9PQko6CisJCQkJcGFzLT5vd25lciA9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9HUk9VUF9PQko6CisJCQkJcGFzLT5ncm91cCA9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9VU0VSOgorCQkJCXBhcy0+dXNlcnMgfD0gcGEtPmVfcGVybTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNMX0dST1VQOgorCQkJCXBhcy0+Z3JvdXBzIHw9IHBhLT5lX3Blcm07CisJCQkJYnJlYWs7CisJCQljYXNlIEFDTF9PVEhFUjoKKwkJCQlwYXMtPm90aGVyID0gcGEtPmVfcGVybTsKKwkJCQlicmVhazsKKwkJCWNhc2UgQUNMX01BU0s6CisJCQkJcGFzLT5tYXNrID0gcGEtPmVfcGVybTsKKwkJCQlicmVhazsKKwkJfQorCX0KKwkvKiBXZSdsbCBvbmx5IGNhcmUgYWJvdXQgZWZmZWN0aXZlIHBlcm1pc3Npb25zOiAqLworCXBhcy0+dXNlcnMgJj0gcGFzLT5tYXNrOworCXBhcy0+Z3JvdXAgJj0gcGFzLT5tYXNrOworCXBhcy0+Z3JvdXBzICY9IHBhcy0+bWFzazsKIH0KIAogLyogV2UgYXNzdW1lIHRoZSBhY2wgaGFzIGJlZW4gdmVyaWZpZWQgd2l0aCBwb3NpeF9hY2xfdmFsaWQuICovCi1zdGF0aWMgaW50CitzdGF0aWMgdm9pZAogX3Bvc2l4X3RvX25mc3Y0X29uZShzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsLCBzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwKIAkJCQkJCXVuc2lnbmVkIGludCBmbGFncykKIHsKLQlzdHJ1Y3QgcG9zaXhfYWNsX2VudHJ5ICpwYSwgKnBlLCAqZ3JvdXBfb3duZXJfZW50cnk7Ci0JaW50IGVycm9yID0gLUVJTlZBTDsKLQl1MzIgbWFzaywgbWFza19tYXNrOworCXN0cnVjdCBwb3NpeF9hY2xfZW50cnkgKnBhLCAqZ3JvdXBfb3duZXJfZW50cnk7CisJc3RydWN0IG5mczRfYWNlICphY2U7CisJc3RydWN0IHBvc2l4X2FjbF9zdW1tYXJ5IHBhczsKKwl1bnNpZ25lZCBzaG9ydCBkZW55OwogCWludCBlZmxhZyA9ICgoZmxhZ3MgJiBORlM0X0FDTF9UWVBFX0RFRkFVTFQpID8KIAkJCQkJTkZTNF9JTkhFUklUQU5DRV9GTEFHUyA6IDApOwogCiAJQlVHX09OKHBhY2wtPmFfY291bnQgPCAzKTsKLQlwZSA9IHBhY2wtPmFfZW50cmllcyArIHBhY2wtPmFfY291bnQ7Ci0JcGEgPSBwZSAtIDI7IC8qIGlmIG1hc2sgZW50cnkgZXhpc3RzLCBpdCdzIHNlY29uZCBmcm9tIHRoZSBsYXN0LiAqLwotCWlmIChwYS0+ZV90YWcgPT0gQUNMX01BU0spCi0JCW1hc2tfbWFzayA9IGRlbnlfbWFzayhtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpLCBmbGFncyk7Ci0JZWxzZQotCQltYXNrX21hc2sgPSAwOworCXN1bW1hcml6ZV9wb3NpeF9hY2wocGFjbCwgJnBhcyk7CiAKIAlwYSA9IHBhY2wtPmFfZW50cmllczsKLQlCVUdfT04ocGEtPmVfdGFnICE9IEFDTF9VU0VSX09CSik7Ci0JbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyB8IE5GUzRfQUNMX09XTkVSKTsKLQllcnJvciA9IG5mczRfYWNsX2FkZF9wYWlyKGFjbCwgZWZsYWcsIG1hc2ssIE5GUzRfQUNMX1dIT19PV05FUiwgMCwgZmxhZ3MpOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gb3V0OworCWFjZSA9IGFjbC0+YWNlcyArIGFjbC0+bmFjZXM7CisKKwkvKiBXZSBjb3VsZCBkZW55IGV2ZXJ5dGhpbmcgbm90IGdyYW50ZWQgYnkgdGhlIG93bmVyOiAqLworCWRlbnkgPSB+cGFzLm93bmVyOworCS8qCisJICogYnV0IGl0IGlzIGVxdWl2YWxlbnQgKGFuZCBzaW1wbGVyKSB0byBkZW55IG9ubHkgd2hhdCBpcyBub3QKKwkgKiBncmFudGVkIGJ5IGxhdGVyIGVudHJpZXM6CisJICovCisJZGVueSAmPSBwYXMudXNlcnMgfCBwYXMuZ3JvdXAgfCBwYXMuZ3JvdXBzIHwgcGFzLm90aGVyOworCWlmIChkZW55KSB7CisJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEU7CisJCWFjZS0+ZmxhZyA9IGVmbGFnOworCQlhY2UtPmFjY2Vzc19tYXNrID0gZGVueV9tYXNrX2Zyb21fcG9zaXgoZGVueSwgZmxhZ3MpOworCQlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fT1dORVI7CisJCWFjZSsrOworCQlhY2wtPm5hY2VzKys7CisJfQorCisJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEU7CisJYWNlLT5mbGFnID0gZWZsYWc7CisJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyB8IE5GUzRfQUNMX09XTkVSKTsKKwlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fT1dORVI7CisJYWNlKys7CisJYWNsLT5uYWNlcysrOwogCXBhKys7CiAKIAl3aGlsZSAocGEtPmVfdGFnID09IEFDTF9VU0VSKSB7Ci0JCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOwotCQllcnJvciA9IG5mczRfYWNsX2FkZF9hY2UoYWNsLCBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFLAotCQkJCWVmbGFnLCAgbWFza19tYXNrLCBORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0KLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfcGFpcihhY2wsIGVmbGFnLCBtYXNrLAotCQkJCU5GUzRfQUNMX1dIT19OQU1FRCwgcGEtPmVfaWQsIGZsYWdzKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OworCQlkZW55ID0gfihwYS0+ZV9wZXJtICYgcGFzLm1hc2spOworCQlkZW55ICY9IHBhcy5ncm91cHMgfCBwYXMuZ3JvdXAgfCBwYXMub3RoZXI7CisJCWlmIChkZW55KSB7CisJCQlhY2UtPnR5cGUgPSBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFOworCQkJYWNlLT5mbGFnID0gZWZsYWc7CisJCQlhY2UtPmFjY2Vzc19tYXNrID0gZGVueV9tYXNrX2Zyb21fcG9zaXgoZGVueSwgZmxhZ3MpOworCQkJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX05BTUVEOworCQkJYWNlLT53aG8gPSBwYS0+ZV9pZDsKKwkJCWFjZSsrOworCQkJYWNsLT5uYWNlcysrOworCQl9CisJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFOworCQlhY2UtPmZsYWcgPSBlZmxhZzsKKwkJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtICYgcGFzLm1hc2ssCisJCQkJCQkgICBmbGFncyk7CisJCWFjZS0+d2hvdHlwZSA9IE5GUzRfQUNMX1dIT19OQU1FRDsKKwkJYWNlLT53aG8gPSBwYS0+ZV9pZDsKKwkJYWNlKys7CisJCWFjbC0+bmFjZXMrKzsKIAkJcGErKzsKIAl9CiAKQEAgLTIzNiw2NyArMjg4LDY1IEBACiAKIAkvKiBhbGxvdyBBQ0VzICovCiAKLQlpZiAocGFjbC0+YV9jb3VudCA+IDMpIHsKLQkJQlVHX09OKHBhLT5lX3RhZyAhPSBBQ0xfR1JPVVBfT0JKKTsKLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKLQkJCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsIG1hc2tfbWFzaywKLQkJCQlORlM0X0FDTF9XSE9fR1JPVVAsIDApOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBvdXQ7Ci0JfQogCWdyb3VwX293bmVyX2VudHJ5ID0gcGE7Ci0JbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7Ci0JZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUsCi0JCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsIG1hc2ssCi0JCQlORlM0X0FDTF9XSE9fR1JPVVAsIDApOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gb3V0OworCisJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEU7CisJYWNlLT5mbGFnID0gZWZsYWc7CisJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYXMuZ3JvdXAsIGZsYWdzKTsKKwlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fR1JPVVA7CisJYWNlKys7CisJYWNsLT5uYWNlcysrOwogCXBhKys7CiAKIAl3aGlsZSAocGEtPmVfdGFnID09IEFDTF9HUk9VUCkgewotCQltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKLQkJCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsIG1hc2tfbWFzaywKLQkJCQlORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OwotCi0JCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFLAotCQkgICAgCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsIG1hc2ssCi0JCSAgICAJCU5GUzRfQUNMX1dIT19OQU1FRCwgcGEtPmVfaWQpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBvdXQ7CisJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19BTExPV0VEX0FDRV9UWVBFOworCQlhY2UtPmZsYWcgPSBlZmxhZyB8IE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVA7CisJCWFjZS0+YWNjZXNzX21hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSAmIHBhcy5tYXNrLAorCQkJCQkJICAgZmxhZ3MpOworCQlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fTkFNRUQ7CisJCWFjZS0+d2hvID0gcGEtPmVfaWQ7CisJCWFjZSsrOworCQlhY2wtPm5hY2VzKys7CiAJCXBhKys7CiAJfQogCiAJLyogZGVueSBBQ0VzICovCiAKIAlwYSA9IGdyb3VwX293bmVyX2VudHJ5OwotCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOwotCWVycm9yID0gbmZzNF9hY2xfYWRkX2FjZShhY2wsIE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEUsCi0JCQlORlM0X0FDRV9JREVOVElGSUVSX0dST1VQIHwgZWZsYWcsCi0JCQlkZW55X21hc2sobWFzaywgZmxhZ3MpLCBORlM0X0FDTF9XSE9fR1JPVVAsIDApOwotCWlmIChlcnJvciA8IDApCi0JCWdvdG8gb3V0OworCisJZGVueSA9IH5wYXMuZ3JvdXAgJiBwYXMub3RoZXI7CisJaWYgKGRlbnkpIHsKKwkJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRTsKKwkJYWNlLT5mbGFnID0gZWZsYWcgfCBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQOworCQlhY2UtPmFjY2Vzc19tYXNrID0gZGVueV9tYXNrX2Zyb21fcG9zaXgoZGVueSwgZmxhZ3MpOworCQlhY2UtPndob3R5cGUgPSBORlM0X0FDTF9XSE9fR1JPVVA7CisJCWFjZSsrOworCQlhY2wtPm5hY2VzKys7CisJfQogCXBhKys7CisKIAl3aGlsZSAocGEtPmVfdGFnID09IEFDTF9HUk9VUCkgewotCQltYXNrID0gbWFza19mcm9tX3Bvc2l4KHBhLT5lX3Blcm0sIGZsYWdzKTsKLQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGFjbCwgTkZTNF9BQ0VfQUNDRVNTX0RFTklFRF9BQ0VfVFlQRSwKLQkJICAgIAkJTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCB8IGVmbGFnLAotCQkgICAgCQlkZW55X21hc2sobWFzaywgZmxhZ3MpLCBORlM0X0FDTF9XSE9fTkFNRUQsIHBhLT5lX2lkKTsKLQkJaWYgKGVycm9yIDwgMCkKLQkJCWdvdG8gb3V0OworCQlkZW55ID0gfihwYS0+ZV9wZXJtICYgcGFzLm1hc2spOworCQlkZW55ICY9IHBhcy5vdGhlcjsKKwkJaWYgKGRlbnkpIHsKKwkJCWFjZS0+dHlwZSA9IE5GUzRfQUNFX0FDQ0VTU19ERU5JRURfQUNFX1RZUEU7CisJCQlhY2UtPmZsYWcgPSBlZmxhZyB8IE5GUzRfQUNFX0lERU5USUZJRVJfR1JPVVA7CisJCQlhY2UtPmFjY2Vzc19tYXNrID0gbWFza19mcm9tX3Bvc2l4KGRlbnksIGZsYWdzKTsKKwkJCWFjZS0+d2hvdHlwZSA9IE5GUzRfQUNMX1dIT19OQU1FRDsKKwkJCWFjZS0+d2hvID0gcGEtPmVfaWQ7CisJCQlhY2UrKzsKKwkJCWFjbC0+bmFjZXMrKzsKKwkJfQogCQlwYSsrOwogCX0KIAogCWlmIChwYS0+ZV90YWcgPT0gQUNMX01BU0spCiAJCXBhKys7Ci0JQlVHX09OKHBhLT5lX3RhZyAhPSBBQ0xfT1RIRVIpOwotCW1hc2sgPSBtYXNrX2Zyb21fcG9zaXgocGEtPmVfcGVybSwgZmxhZ3MpOwotCWVycm9yID0gbmZzNF9hY2xfYWRkX3BhaXIoYWNsLCBlZmxhZywgbWFzaywgTkZTNF9BQ0xfV0hPX0VWRVJZT05FLCAwLCBmbGFncyk7Ci0KLW91dDoKLQlyZXR1cm4gZXJyb3I7CisJYWNlLT50eXBlID0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEU7CisJYWNlLT5mbGFnID0gZWZsYWc7CisJYWNlLT5hY2Nlc3NfbWFzayA9IG1hc2tfZnJvbV9wb3NpeChwYS0+ZV9wZXJtLCBmbGFncyk7CisJYWNlLT53aG90eXBlID0gTkZTNF9BQ0xfV0hPX0VWRVJZT05FOworCWFjbC0+bmFjZXMrKzsKIH0KIAogc3RhdGljIHZvaWQKQEAgLTM0Miw0NiArMzkyLDYgQEAKIAlyZXR1cm47CiB9CiAKLWludAotbmZzNF9hY2xfbmZzdjRfdG9fcG9zaXgoc3RydWN0IG5mczRfYWNsICphY2wsIHN0cnVjdCBwb3NpeF9hY2wgKipwYWNsLAotCQlzdHJ1Y3QgcG9zaXhfYWNsICoqZHBhY2wsIHVuc2lnbmVkIGludCBmbGFncykKLXsKLQlzdHJ1Y3QgbmZzNF9hY2wgKmRhY2w7Ci0JaW50IGVycm9yID0gLUVOT01FTTsKLQotCSpwYWNsID0gTlVMTDsKLQkqZHBhY2wgPSBOVUxMOwotCi0JZGFjbCA9IG5mczRfYWNsX25ldygpOwotCWlmIChkYWNsID09IE5VTEwpCi0JCWdvdG8gb3V0OwotCi0JZXJyb3IgPSBuZnM0X2FjbF9zcGxpdChhY2wsIGRhY2wpOwotCWlmIChlcnJvcikKLQkJZ290byBvdXRfYWNsOwotCi0JKnBhY2wgPSBfbmZzdjRfdG9fcG9zaXhfb25lKGFjbCwgZmxhZ3MpOwotCWlmIChJU19FUlIoKnBhY2wpKSB7Ci0JCWVycm9yID0gUFRSX0VSUigqcGFjbCk7Ci0JCSpwYWNsID0gTlVMTDsKLQkJZ290byBvdXRfYWNsOwotCX0KLQotCSpkcGFjbCA9IF9uZnN2NF90b19wb3NpeF9vbmUoZGFjbCwgZmxhZ3MpOwotCWlmIChJU19FUlIoKmRwYWNsKSkgewotCQllcnJvciA9IFBUUl9FUlIoKmRwYWNsKTsKLQkJKmRwYWNsID0gTlVMTDsKLQl9Ci1vdXRfYWNsOgotCWlmIChlcnJvcikgewotCQlwb3NpeF9hY2xfcmVsZWFzZSgqcGFjbCk7Ci0JCSpwYWNsID0gTlVMTDsKLQl9Ci0JbmZzNF9hY2xfZnJlZShkYWNsKTsKLW91dDoKLQlyZXR1cm4gZXJyb3I7Ci19Ci0KIC8qCiAgKiBXaGlsZSBwcm9jZXNzaW5nIHRoZSBORlN2NCBBQ0UsIHRoaXMgbWFpbnRhaW5zIGJpdG1hc2tzIHJlcHJlc2VudGluZwogICogd2hpY2ggcGVybWlzc2lvbiBiaXRzIGhhdmUgYmVlbiBhbGxvd2VkIGFuZCB3aGljaCBkZW5pZWQgdG8gYSBnaXZlbgpAQCAtNDA2LDYgKzQxNiw3IEBACiAgKiBjYWxjdWxhdGVkIHNvIGZhcjogKi8KIAogc3RydWN0IHBvc2l4X2FjbF9zdGF0ZSB7CisJaW50IGVtcHR5OwogCXN0cnVjdCBwb3NpeF9hY2Vfc3RhdGUgb3duZXI7CiAJc3RydWN0IHBvc2l4X2FjZV9zdGF0ZSBncm91cDsKIAlzdHJ1Y3QgcG9zaXhfYWNlX3N0YXRlIG90aGVyOwpAQCAtNDIxLDYgKzQzMiw3IEBACiAJaW50IGFsbG9jOwogCiAJbWVtc2V0KHN0YXRlLCAwLCBzaXplb2Yoc3RydWN0IHBvc2l4X2FjbF9zdGF0ZSkpOworCXN0YXRlLT5lbXB0eSA9IDE7CiAJLyoKIAkgKiBJbiB0aGUgd29yc3QgY2FzZSwgZWFjaCBpbmRpdmlkdWFsIGFjbCBjb3VsZCBiZSBmb3IgYSBkaXN0aW5jdAogCSAqIG5hbWVkIHVzZXIgb3IgZ3JvdXAsIGJ1dCB3ZSBkb24ndCBubyB3aGljaCwgc28gd2UgYWxsb2NhdGUKQEAgLTQ4OCw2ICs1MDAsMjAgQEAKIAlpbnQgbmFjZTsKIAlpbnQgaSwgZXJyb3IgPSAwOwogCisJLyoKKwkgKiBBQ0xzIHdpdGggbm8gQUNFcyBhcmUgdHJlYXRlZCBkaWZmZXJlbnRseSBpbiB0aGUgaW5oZXJpdGFibGUKKwkgKiBhbmQgZWZmZWN0aXZlIGNhc2VzOiB3aGVuIHRoZXJlIGFyZSBubyBpbmhlcml0YWJsZSBBQ0VzLCB3ZQorCSAqIHNldCBhIHplcm8tbGVuZ3RoIGRlZmF1bHQgcG9zaXggYWNsOgorCSAqLworCWlmIChzdGF0ZS0+ZW1wdHkgJiYgKGZsYWdzICYgTkZTNF9BQ0xfVFlQRV9ERUZBVUxUKSkgeworCQlwYWNsID0gcG9zaXhfYWNsX2FsbG9jKDAsIEdGUF9LRVJORUwpOworCQlyZXR1cm4gcGFjbCA/IHBhY2wgOiBFUlJfUFRSKC1FTk9NRU0pOworCX0KKwkvKgorCSAqIFdoZW4gdGhlcmUgYXJlIG5vIGVmZmVjdGl2ZSBBQ0VzLCB0aGUgZm9sbG93aW5nIHdpbGwgZW5kCisJICogdXAgc2V0dGluZyBhIDMtZWxlbWVudCBlZmZlY3RpdmUgcG9zaXggQUNMIHdpdGggYWxsCisJICogcGVybWlzc2lvbnMgemVyby4KKwkgKi8KIAluYWNlID0gNCArIHN0YXRlLT51c2Vycy0+biArIHN0YXRlLT5ncm91cHMtPm47CiAJcGFjbCA9IHBvc2l4X2FjbF9hbGxvYyhuYWNlLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXBhY2wpCkBAIC02MDMsNiArNjI5LDggQEAKIAl1MzIgbWFzayA9IGFjZS0+YWNjZXNzX21hc2s7CiAJaW50IGk7CiAKKwlzdGF0ZS0+ZW1wdHkgPSAwOworCiAJc3dpdGNoIChhY2UydHlwZShhY2UpKSB7CiAJY2FzZSBBQ0xfVVNFUl9PQko6CiAJCWlmIChhY2UtPnR5cGUgPT0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUpIHsKQEAgLTY2Niw3NSArNjk0LDYyIEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHBvc2l4X2FjbCAqCi1fbmZzdjRfdG9fcG9zaXhfb25lKHN0cnVjdCBuZnM0X2FjbCAqbjRhY2wsIHVuc2lnbmVkIGludCBmbGFncykKK2ludCBuZnM0X2FjbF9uZnN2NF90b19wb3NpeChzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwgc3RydWN0IHBvc2l4X2FjbCAqKnBhY2wsCisJCQkgICAgc3RydWN0IHBvc2l4X2FjbCAqKmRwYWNsLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCiB7Ci0Jc3RydWN0IHBvc2l4X2FjbF9zdGF0ZSBzdGF0ZTsKLQlzdHJ1Y3QgcG9zaXhfYWNsICpwYWNsOworCXN0cnVjdCBwb3NpeF9hY2xfc3RhdGUgZWZmZWN0aXZlX2FjbF9zdGF0ZSwgZGVmYXVsdF9hY2xfc3RhdGU7CiAJc3RydWN0IG5mczRfYWNlICphY2U7CiAJaW50IHJldDsKIAotCXJldCA9IGluaXRfc3RhdGUoJnN0YXRlLCBuNGFjbC0+bmFjZXMpOworCXJldCA9IGluaXRfc3RhdGUoJmVmZmVjdGl2ZV9hY2xfc3RhdGUsIGFjbC0+bmFjZXMpOwogCWlmIChyZXQpCi0JCXJldHVybiBFUlJfUFRSKHJldCk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGFjZSwgJm40YWNsLT5hY2VfaGVhZCwgbF9hY2UpCi0JCXByb2Nlc3Nfb25lX3Y0X2FjZSgmc3RhdGUsIGFjZSk7Ci0KLQlwYWNsID0gcG9zaXhfc3RhdGVfdG9fYWNsKCZzdGF0ZSwgZmxhZ3MpOwotCi0JZnJlZV9zdGF0ZSgmc3RhdGUpOwotCi0JaWYgKCFJU19FUlIocGFjbCkpCi0JCXNvcnRfcGFjbChwYWNsKTsKLQlyZXR1cm4gcGFjbDsKLX0KLQotc3RhdGljIGludAotbmZzNF9hY2xfc3BsaXQoc3RydWN0IG5mczRfYWNsICphY2wsIHN0cnVjdCBuZnM0X2FjbCAqZGFjbCkKLXsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpoLCAqbjsKLQlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKLQlpbnQgZXJyb3IgPSAwOwotCi0JbGlzdF9mb3JfZWFjaF9zYWZlKGgsIG4sICZhY2wtPmFjZV9oZWFkKSB7Ci0JCWFjZSA9IGxpc3RfZW50cnkoaCwgc3RydWN0IG5mczRfYWNlLCBsX2FjZSk7Ci0KKwkJcmV0dXJuIHJldDsKKwlyZXQgPSBpbml0X3N0YXRlKCZkZWZhdWx0X2FjbF9zdGF0ZSwgYWNsLT5uYWNlcyk7CisJaWYgKHJldCkKKwkJZ290byBvdXRfZXN0YXRlOworCXJldCA9IC1FSU5WQUw7CisJZm9yIChhY2UgPSBhY2wtPmFjZXM7IGFjZSA8IGFjbC0+YWNlcyArIGFjbC0+bmFjZXM7IGFjZSsrKSB7CiAJCWlmIChhY2UtPnR5cGUgIT0gTkZTNF9BQ0VfQUNDRVNTX0FMTE9XRURfQUNFX1RZUEUgJiYKIAkJICAgIGFjZS0+dHlwZSAhPSBORlM0X0FDRV9BQ0NFU1NfREVOSUVEX0FDRV9UWVBFKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0KKwkJCWdvdG8gb3V0X2RzdGF0ZTsKIAkJaWYgKGFjZS0+ZmxhZyAmIH5ORlM0X1NVUFBPUlRFRF9GTEFHUykKLQkJCXJldHVybiAtRUlOVkFMOwotCi0JCXN3aXRjaCAoYWNlLT5mbGFnICYgTkZTNF9JTkhFUklUQU5DRV9GTEFHUykgewotCQljYXNlIDA6Ci0JCQkvKiBMZWF2ZSB0aGlzIGFjZSBpbiB0aGUgZWZmZWN0aXZlIGFjbDogKi8KKwkJCWdvdG8gb3V0X2RzdGF0ZTsKKwkJaWYgKChhY2UtPmZsYWcgJiBORlM0X0lOSEVSSVRBTkNFX0ZMQUdTKSA9PSAwKSB7CisJCQlwcm9jZXNzX29uZV92NF9hY2UoJmVmZmVjdGl2ZV9hY2xfc3RhdGUsIGFjZSk7CiAJCQljb250aW51ZTsKLQkJY2FzZSBORlM0X0lOSEVSSVRBTkNFX0ZMQUdTOgotCQkJLyogQWRkIHRoaXMgYWNlIHRvIHRoZSBkZWZhdWx0IGFjbCBhbmQgcmVtb3ZlIGl0Ci0JCQkgKiBmcm9tIHRoZSBlZmZlY3RpdmUgYWNsOiAqLwotCQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGRhY2wsIGFjZS0+dHlwZSwgYWNlLT5mbGFnLAotCQkJCWFjZS0+YWNjZXNzX21hc2ssIGFjZS0+d2hvdHlwZSwgYWNlLT53aG8pOwotCQkJaWYgKGVycm9yKQotCQkJCXJldHVybiBlcnJvcjsKLQkJCWxpc3RfZGVsKGgpOwotCQkJa2ZyZWUoYWNlKTsKLQkJCWFjbC0+bmFjZXMtLTsKLQkJCWJyZWFrOwotCQljYXNlIE5GUzRfSU5IRVJJVEFOQ0VfRkxBR1MgJiB+TkZTNF9BQ0VfSU5IRVJJVF9PTkxZX0FDRToKLQkJCS8qIEFkZCB0aGlzIGFjZSB0byB0aGUgZGVmYXVsdCwgYnV0IGxlYXZlIGl0IGluCi0JCQkgKiB0aGUgZWZmZWN0aXZlIGFjbCBhcyB3ZWxsOiAqLwotCQkJZXJyb3IgPSBuZnM0X2FjbF9hZGRfYWNlKGRhY2wsIGFjZS0+dHlwZSwgYWNlLT5mbGFnLAotCQkJCWFjZS0+YWNjZXNzX21hc2ssIGFjZS0+d2hvdHlwZSwgYWNlLT53aG8pOwotCQkJaWYgKGVycm9yKQotCQkJCXJldHVybiBlcnJvcjsKLQkJCWJyZWFrOwotCQlkZWZhdWx0OgotCQkJcmV0dXJuIC1FSU5WQUw7CiAJCX0KKwkJaWYgKCEoZmxhZ3MgJiBORlM0X0FDTF9ESVIpKQorCQkJZ290byBvdXRfZHN0YXRlOworCQkvKgorCQkgKiBOb3RlIHRoYXQgd2hlbiBvbmx5IG9uZSBvZiBGSUxFX0lOSEVSSVQgb3IgRElSRUNUT1JZX0lOSEVSSVQKKwkJICogaXMgc2V0LCB3ZSdyZSBlZmZlY3RpdmVseSB0dXJuaW5nIG9uIHRoZSBvdGhlci4gIFRoYXQncyBPSywKKwkJICogYWNjb3JkaW5nIHRvIHJmYyAzNTMwLgorCQkgKi8KKwkJcHJvY2Vzc19vbmVfdjRfYWNlKCZkZWZhdWx0X2FjbF9zdGF0ZSwgYWNlKTsKKworCQlpZiAoIShhY2UtPmZsYWcgJiBORlM0X0FDRV9JTkhFUklUX09OTFlfQUNFKSkKKwkJCXByb2Nlc3Nfb25lX3Y0X2FjZSgmZWZmZWN0aXZlX2FjbF9zdGF0ZSwgYWNlKTsKIAl9Ci0JcmV0dXJuIDA7CisJKnBhY2wgPSBwb3NpeF9zdGF0ZV90b19hY2woJmVmZmVjdGl2ZV9hY2xfc3RhdGUsIGZsYWdzKTsKKwlpZiAoSVNfRVJSKCpwYWNsKSkgeworCQlyZXQgPSBQVFJfRVJSKCpwYWNsKTsKKwkJZ290byBvdXRfZHN0YXRlOworCX0KKwkqZHBhY2wgPSBwb3NpeF9zdGF0ZV90b19hY2woJmRlZmF1bHRfYWNsX3N0YXRlLAorCQkJCQkJZmxhZ3MgfCBORlM0X0FDTF9UWVBFX0RFRkFVTFQpOworCWlmIChJU19FUlIoKmRwYWNsKSkgeworCQlyZXQgPSBQVFJfRVJSKCpkcGFjbCk7CisJCXBvc2l4X2FjbF9yZWxlYXNlKCpwYWNsKTsKKwkJZ290byBvdXRfZHN0YXRlOworCX0KKwlzb3J0X3BhY2woKnBhY2wpOworCXNvcnRfcGFjbCgqZHBhY2wpOworCXJldCA9IDA7CitvdXRfZHN0YXRlOgorCWZyZWVfc3RhdGUoJmRlZmF1bHRfYWNsX3N0YXRlKTsKK291dF9lc3RhdGU6CisJZnJlZV9zdGF0ZSgmZWZmZWN0aXZlX2FjbF9zdGF0ZSk7CisJcmV0dXJuIHJldDsKIH0KIAogc3RhdGljIHNob3J0CkBAIC03NTksNDggKzc3NCwyMiBAQAogRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9uZnN2NF90b19wb3NpeCk7CiAKIHN0cnVjdCBuZnM0X2FjbCAqCi1uZnM0X2FjbF9uZXcodm9pZCkKK25mczRfYWNsX25ldyhpbnQgbikKIHsKIAlzdHJ1Y3QgbmZzNF9hY2wgKmFjbDsKIAotCWlmICgoYWNsID0ga21hbGxvYyhzaXplb2YoKmFjbCksIEdGUF9LRVJORUwpKSA9PSBOVUxMKQorCWFjbCA9IGttYWxsb2Moc2l6ZW9mKCphY2wpICsgbipzaXplb2Yoc3RydWN0IG5mczRfYWNlKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGFjbCA9PSBOVUxMKQogCQlyZXR1cm4gTlVMTDsKLQogCWFjbC0+bmFjZXMgPSAwOwotCUlOSVRfTElTVF9IRUFEKCZhY2wtPmFjZV9oZWFkKTsKLQogCXJldHVybiBhY2w7CiB9CiAKIHZvaWQKLW5mczRfYWNsX2ZyZWUoc3RydWN0IG5mczRfYWNsICphY2wpCi17Ci0Jc3RydWN0IGxpc3RfaGVhZCAqaDsKLQlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKLQotCWlmICghYWNsKQotCQlyZXR1cm47Ci0KLQl3aGlsZSAoIWxpc3RfZW1wdHkoJmFjbC0+YWNlX2hlYWQpKSB7Ci0JCWggPSBhY2wtPmFjZV9oZWFkLm5leHQ7Ci0JCWxpc3RfZGVsKGgpOwotCQlhY2UgPSBsaXN0X2VudHJ5KGgsIHN0cnVjdCBuZnM0X2FjZSwgbF9hY2UpOwotCQlrZnJlZShhY2UpOwotCX0KLQotCWtmcmVlKGFjbCk7Ci0KLQlyZXR1cm47Ci19Ci0KLWludAogbmZzNF9hY2xfYWRkX2FjZShzdHJ1Y3QgbmZzNF9hY2wgKmFjbCwgdTMyIHR5cGUsIHUzMiBmbGFnLCB1MzIgYWNjZXNzX21hc2ssCiAJCWludCB3aG90eXBlLCB1aWRfdCB3aG8pCiB7Ci0Jc3RydWN0IG5mczRfYWNlICphY2U7Ci0KLQlpZiAoKGFjZSA9IGttYWxsb2Moc2l6ZW9mKCphY2UpLCBHRlBfS0VSTkVMKSkgPT0gTlVMTCkKLQkJcmV0dXJuIC1FTk9NRU07CisJc3RydWN0IG5mczRfYWNlICphY2UgPSBhY2wtPmFjZXMgKyBhY2wtPm5hY2VzOwogCiAJYWNlLT50eXBlID0gdHlwZTsKIAlhY2UtPmZsYWcgPSBmbGFnOwpAQCAtODA4LDEwICs3OTcsNyBAQAogCWFjZS0+d2hvdHlwZSA9IHdob3R5cGU7CiAJYWNlLT53aG8gPSB3aG87CiAKLQlsaXN0X2FkZF90YWlsKCZhY2UtPmxfYWNlLCAmYWNsLT5hY2VfaGVhZCk7CiAJYWNsLT5uYWNlcysrOwotCi0JcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgewpAQCAtODY1LDcgKzg1MSw2IEBACiB9CiAKIEVYUE9SVF9TWU1CT0wobmZzNF9hY2xfbmV3KTsKLUVYUE9SVF9TWU1CT0wobmZzNF9hY2xfZnJlZSk7CiBFWFBPUlRfU1lNQk9MKG5mczRfYWNsX2FkZF9hY2UpOwogRVhQT1JUX1NZTUJPTChuZnM0X2FjbF9nZXRfd2hvdHlwZSk7CiBFWFBPUlRfU1lNQk9MKG5mczRfYWNsX3dyaXRlX3dobyk7CmRpZmYgLS1naXQgYS9mcy9uZnNkL25mczRjYWxsYmFjay5jIGIvZnMvbmZzZC9uZnM0Y2FsbGJhY2suYwppbmRleCBmNTc2NTVhLi5mYjE0ZDY4IDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczRjYWxsYmFjay5jCisrKyBiL2ZzL25mc2QvbmZzNGNhbGxiYWNrLmMKQEAgLTM4Nyw3ICszODcsNiBAQAogCQkuYWRkcmVzcwk9IChzdHJ1Y3Qgc29ja2FkZHIgKikmYWRkciwKIAkJLmFkZHJzaXplCT0gc2l6ZW9mKGFkZHIpLAogCQkudGltZW91dAk9ICZ0aW1lcGFybXMsCi0JCS5zZXJ2ZXJuYW1lCT0gY2xwLT5jbF9uYW1lLmRhdGEsCiAJCS5wcm9ncmFtCT0gcHJvZ3JhbSwKIAkJLnZlcnNpb24JPSBuZnNfY2JfdmVyc2lvblsxXS0+bnVtYmVyLAogCQkuYXV0aGZsYXZvcgk9IFJQQ19BVVRIX1VOSVgsCS8qIFhYWDogbmVlZCBBVVRIX0dTUy4uLiAqLwpAQCAtMzk3LDYgKzM5Niw3IEBACiAJCS5ycGNfcHJvYyAgICAgICA9ICZuZnM0X2NiX3Byb2NlZHVyZXNbTkZTUFJPQzRfQ0xOVF9DQl9OVUxMXSwKIAkJLnJwY19hcmdwICAgICAgID0gY2xwLAogCX07CisJY2hhciBjbGllbnRuYW1lWzE2XTsKIAlpbnQgc3RhdHVzOwogCiAJaWYgKGF0b21pY19yZWFkKCZjYi0+Y2Jfc2V0KSkKQEAgLTQxOSw2ICs0MTksMTEgQEAKIAltZW1zZXQocHJvZ3JhbS0+c3RhdHMsIDAsIHNpemVvZihjYi0+Y2Jfc3RhdCkpOwogCXByb2dyYW0tPnN0YXRzLT5wcm9ncmFtID0gcHJvZ3JhbTsKIAorCS8qIEp1c3QgaGVyZSB0byBtYWtlIHNvbWUgcHJpbnRrJ3MgbW9yZSB1c2VmdWw6ICovCisJc25wcmludGYoY2xpZW50bmFtZSwgc2l6ZW9mKGNsaWVudG5hbWUpLAorCQkiJXUuJXUuJXUuJXUiLCBOSVBRVUFEKGFkZHIuc2luX2FkZHIpKTsKKwlhcmdzLnNlcnZlcm5hbWUgPSBjbGllbnRuYW1lOworCiAJLyogQ3JlYXRlIFJQQyBjbGllbnQgKi8KIAljYi0+Y2JfY2xpZW50ID0gcnBjX2NyZWF0ZSgmYXJncyk7CiAJaWYgKElTX0VSUihjYi0+Y2JfY2xpZW50KSkgewpkaWZmIC0tZ2l0IGEvZnMvbmZzZC9uZnM0eGRyLmMgYi9mcy9uZnNkL25mczR4ZHIuYwppbmRleCAwZWZiYTU1Li41ZDA5MGYxIDEwMDY0NAotLS0gYS9mcy9uZnNkL25mczR4ZHIuYworKysgYi9mcy9uZnNkL25mczR4ZHIuYwpAQCAtMTk5LDI0ICsxOTksMjIgQEAKIAogc3RhdGljIGNoYXIgKnNhdmVtZW0oc3RydWN0IG5mc2Q0X2NvbXBvdW5kYXJncyAqYXJncCwgX19iZTMyICpwLCBpbnQgbmJ5dGVzKQogewotCXZvaWQgKm5ldyA9IE5VTEw7CiAJaWYgKHAgPT0gYXJncC0+dG1wKSB7Ci0JCW5ldyA9IGttYWxsb2MobmJ5dGVzLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXcpIHJldHVybiBOVUxMOwotCQlwID0gbmV3OworCQlwID0ga21hbGxvYyhuYnl0ZXMsIEdGUF9LRVJORUwpOworCQlpZiAoIXApCisJCQlyZXR1cm4gTlVMTDsKIAkJbWVtY3B5KHAsIGFyZ3AtPnRtcCwgbmJ5dGVzKTsKIAl9IGVsc2UgewogCQlCVUdfT04ocCAhPSBhcmdwLT50bXBwKTsKIAkJYXJncC0+dG1wcCA9IE5VTEw7CiAJfQogCWlmIChkZWZlcl9mcmVlKGFyZ3AsIGtmcmVlLCBwKSkgewotCQlrZnJlZShuZXcpOworCQlrZnJlZShwKTsKIAkJcmV0dXJuIE5VTEw7CiAJfSBlbHNlCiAJCXJldHVybiAoY2hhciAqKXA7CiB9CiAKLQogc3RhdGljIF9fYmUzMgogbmZzZDRfZGVjb2RlX2JpdG1hcChzdHJ1Y3QgbmZzZDRfY29tcG91bmRhcmdzICphcmdwLCB1MzIgKmJtdmFsKQogewpAQCAtMjU1LDcgKzI1Myw3IEBACiAJCXJldHVybiBzdGF0dXM7CiAKIAkvKgotCSAqIEFjY29yZGluZyB0byBzcGVjLCB1bnN1cHBvcnRlZCBhdHRyaWJ1dGVzIHJldHVybiBFUlJfTk9UU1VQUDsKKwkgKiBBY2NvcmRpbmcgdG8gc3BlYywgdW5zdXBwb3J0ZWQgYXR0cmlidXRlcyByZXR1cm4gRVJSX0FUVFJOT1RTVVBQOwogCSAqIHJlYWQtb25seSBhdHRyaWJ1dGVzIHJldHVybiBFUlJfSU5WQUwuCiAJICovCiAJaWYgKChibXZhbFswXSAmIH5ORlNEX1NVUFBPUlRFRF9BVFRSU19XT1JEMCkgfHwgKGJtdmFsWzFdICYgfk5GU0RfU1VQUE9SVEVEX0FUVFJTX1dPUkQxKSkKQEAgLTI3Myw0MiArMjcxLDQyIEBACiAJCWlhdHRyLT5pYV92YWxpZCB8PSBBVFRSX1NJWkU7CiAJfQogCWlmIChibXZhbFswXSAmIEZBVFRSNF9XT1JEMF9BQ0wpIHsKLQkJaW50IG5hY2UsIGk7Ci0JCXN0cnVjdCBuZnM0X2FjZSBhY2U7CisJCWludCBuYWNlOworCQlzdHJ1Y3QgbmZzNF9hY2UgKmFjZTsKIAogCQlSRUFEX0JVRig0KTsgbGVuICs9IDQ7CiAJCVJFQUQzMihuYWNlKTsKIAotCQkqYWNsID0gbmZzNF9hY2xfbmV3KCk7CisJCWlmIChuYWNlID4gTkZTNF9BQ0xfTUFYKQorCQkJcmV0dXJuIG5mc2Vycl9yZXNvdXJjZTsKKworCQkqYWNsID0gbmZzNF9hY2xfbmV3KG5hY2UpOwogCQlpZiAoKmFjbCA9PSBOVUxMKSB7CiAJCQlob3N0X2VyciA9IC1FTk9NRU07CiAJCQlnb3RvIG91dF9uZnNlcnI7CiAJCX0KLQkJZGVmZXJfZnJlZShhcmdwLCAodm9pZCAoKikoY29uc3Qgdm9pZCAqKSluZnM0X2FjbF9mcmVlLCAqYWNsKTsKKwkJZGVmZXJfZnJlZShhcmdwLCBrZnJlZSwgKmFjbCk7CiAKLQkJZm9yIChpID0gMDsgaSA8IG5hY2U7IGkrKykgeworCQkoKmFjbCktPm5hY2VzID0gbmFjZTsKKwkJZm9yIChhY2UgPSAoKmFjbCktPmFjZXM7IGFjZSA8ICgqYWNsKS0+YWNlcyArIG5hY2U7IGFjZSsrKSB7CiAJCQlSRUFEX0JVRigxNik7IGxlbiArPSAxNjsKLQkJCVJFQUQzMihhY2UudHlwZSk7Ci0JCQlSRUFEMzIoYWNlLmZsYWcpOwotCQkJUkVBRDMyKGFjZS5hY2Nlc3NfbWFzayk7CisJCQlSRUFEMzIoYWNlLT50eXBlKTsKKwkJCVJFQUQzMihhY2UtPmZsYWcpOworCQkJUkVBRDMyKGFjZS0+YWNjZXNzX21hc2spOwogCQkJUkVBRDMyKGR1bW15MzIpOwogCQkJUkVBRF9CVUYoZHVtbXkzMik7CiAJCQlsZW4gKz0gWERSX1FVQURMRU4oZHVtbXkzMikgPDwgMjsKIAkJCVJFQURNRU0oYnVmLCBkdW1teTMyKTsKLQkJCWFjZS53aG90eXBlID0gbmZzNF9hY2xfZ2V0X3dob3R5cGUoYnVmLCBkdW1teTMyKTsKKwkJCWFjZS0+d2hvdHlwZSA9IG5mczRfYWNsX2dldF93aG90eXBlKGJ1ZiwgZHVtbXkzMik7CiAJCQlob3N0X2VyciA9IDA7Ci0JCQlpZiAoYWNlLndob3R5cGUgIT0gTkZTNF9BQ0xfV0hPX05BTUVEKQotCQkJCWFjZS53aG8gPSAwOwotCQkJZWxzZSBpZiAoYWNlLmZsYWcgJiBORlM0X0FDRV9JREVOVElGSUVSX0dST1VQKQorCQkJaWYgKGFjZS0+d2hvdHlwZSAhPSBORlM0X0FDTF9XSE9fTkFNRUQpCisJCQkJYWNlLT53aG8gPSAwOworCQkJZWxzZSBpZiAoYWNlLT5mbGFnICYgTkZTNF9BQ0VfSURFTlRJRklFUl9HUk9VUCkKIAkJCQlob3N0X2VyciA9IG5mc2RfbWFwX25hbWVfdG9fZ2lkKGFyZ3AtPnJxc3RwLAotCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLndobyk7CisJCQkJCQlidWYsIGR1bW15MzIsICZhY2UtPndobyk7CiAJCQllbHNlCiAJCQkJaG9zdF9lcnIgPSBuZnNkX21hcF9uYW1lX3RvX3VpZChhcmdwLT5ycXN0cCwKLQkJCQkJCWJ1ZiwgZHVtbXkzMiwgJmFjZS53aG8pOwotCQkJaWYgKGhvc3RfZXJyKQotCQkJCWdvdG8gb3V0X25mc2VycjsKLQkJCWhvc3RfZXJyID0gbmZzNF9hY2xfYWRkX2FjZSgqYWNsLCBhY2UudHlwZSwgYWNlLmZsYWcsCi0JCQkJIGFjZS5hY2Nlc3NfbWFzaywgYWNlLndob3R5cGUsIGFjZS53aG8pOworCQkJCQkJYnVmLCBkdW1teTMyLCAmYWNlLT53aG8pOwogCQkJaWYgKGhvc3RfZXJyKQogCQkJCWdvdG8gb3V0X25mc2VycjsKIAkJfQpAQCAtMTU5Niw3ICsxNTk0LDYgQEAKIAl9CiAJaWYgKGJtdmFsMCAmIEZBVFRSNF9XT1JEMF9BQ0wpIHsKIAkJc3RydWN0IG5mczRfYWNlICphY2U7Ci0JCXN0cnVjdCBsaXN0X2hlYWQgKmg7CiAKIAkJaWYgKGFjbCA9PSBOVUxMKSB7CiAJCQlpZiAoKGJ1ZmxlbiAtPSA0KSA8IDApCkBAIC0xNjA5LDkgKzE2MDYsNyBAQAogCQkJZ290byBvdXRfcmVzb3VyY2U7CiAJCVdSSVRFMzIoYWNsLT5uYWNlcyk7CiAKLQkJbGlzdF9mb3JfZWFjaChoLCAmYWNsLT5hY2VfaGVhZCkgewotCQkJYWNlID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgbmZzNF9hY2UsIGxfYWNlKTsKLQorCQlmb3IgKGFjZSA9IGFjbC0+YWNlczsgYWNlIDwgYWNsLT5hY2VzICsgYWNsLT5uYWNlczsgYWNlKyspIHsKIAkJCWlmICgoYnVmbGVuIC09IDQqMykgPCAwKQogCQkJCWdvdG8gb3V0X3Jlc291cmNlOwogCQkJV1JJVEUzMihhY2UtPnR5cGUpOwpAQCAtMTgyMSw3ICsxODE2LDcgQEAKIAlzdGF0dXMgPSBuZnNfb2s7CiAKIG91dDoKLQluZnM0X2FjbF9mcmVlKGFjbCk7CisJa2ZyZWUoYWNsKTsKIAlpZiAoZmhwID09ICZ0ZW1wZmgpCiAJCWZoX3B1dCgmdGVtcGZoKTsKIAlyZXR1cm4gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvZnMvbmZzZC92ZnMuYyBiL2ZzL25mc2QvdmZzLmMKaW5kZXggODI4MzIzNi4uN2U2YWEyNCAxMDA2NDQKLS0tIGEvZnMvbmZzZC92ZnMuYworKysgYi9mcy9uZnNkL3Zmcy5jCkBAIC00NjYsNyArNDY2LDEwIEBACiAJcG9zaXhfYWNsX3JlbGVhc2UoZHBhY2wpOwogCXJldHVybiAoZXJyb3IpOwogb3V0X25mc2VycjoKLQllcnJvciA9IG5mc2Vycm5vKGhvc3RfZXJyb3IpOworCWlmIChob3N0X2Vycm9yID09IC1FT1BOT1RTVVBQKQorCQllcnJvciA9IG5mc2Vycl9hdHRybm90c3VwcDsKKwllbHNlCisJCWVycm9yID0gbmZzZXJybm8oaG9zdF9lcnJvcik7CiAJZ290byBvdXQ7CiB9CiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY2ludGVycC5oIGIvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKaW5kZXggY2U3YzlkNi4uNzM5NjdjOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKKysrIGIvaW5jbHVkZS9hY3BpL2FjaW50ZXJwLmgKQEAgLTI1Myw3ICsyNTMsOCBAQAogCiB2b2lkIGFjcGlfZXhfcmVsZWFzZV9hbGxfbXV0ZXhlcyhzdHJ1Y3QgYWNwaV90aHJlYWRfc3RhdGUgKnRocmVhZCk7CiAKLXZvaWQgYWNwaV9leF91bmxpbmtfbXV0ZXgodW5pb24gYWNwaV9vcGVyYW5kX29iamVjdCAqb2JqX2Rlc2MpOwordm9pZCBhY3BpX2V4X3VubGlua19tdXRleCh1bmlvbiBhY3BpX29wZXJhbmRfb2JqZWN0ICpvYmpfZGVzYywKKwkJCSAgc3RydWN0IGFjcGlfdGhyZWFkX3N0YXRlICp0aHJlYWQpOwogCiAvKgogICogZXhwcmVwIC0gQUNQSSBBTUwgZXhlY3V0aW9uIC0gcHJlcCB1dGlsaXRpZXMKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYWNwaS9hY29iamVjdC5oIGIvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKaW5kZXggMDRlOTczNS4uNTIwNmQ2MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKKysrIGIvaW5jbHVkZS9hY3BpL2Fjb2JqZWN0LmgKQEAgLTE1NSw3ICsxNTUsNyBAQAogc3RydWN0IGFjcGlfb2JqZWN0X211dGV4IHsKIAlBQ1BJX09CSkVDVF9DT01NT05fSEVBREVSIHU4IHN5bmNfbGV2ZWw7CS8qIDAtMTUsIHNwZWNpZmllZCBpbiBNdXRleCgpIGNhbGwgKi8KIAl1MTYgYWNxdWlzaXRpb25fZGVwdGg7CS8qIEFsbG93IG11bHRpcGxlIEFjcXVpcmVzLCBzYW1lIHRocmVhZCAqLwotCXN0cnVjdCBhY3BpX3RocmVhZF9zdGF0ZSAqb3duZXJfdGhyZWFkOwkvKiBDdXJyZW50IG93bmVyIG9mIHRoZSBtdXRleCAqLworCWFjcGlfdGhyZWFkX2lkIG93bmVyX3RocmVhZF9pZDsJLyogQ3VycmVudCBvd25lciBvZiB0aGUgbXV0ZXggKi8KIAlhY3BpX211dGV4IG9zX211dGV4OwkvKiBBY3R1YWwgT1Mgc3luY2hyb25pemF0aW9uIG9iamVjdCAqLwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKnByZXY7CS8qIExpbmsgZm9yIGxpc3Qgb2YgYWNxdWlyZWQgbXV0ZXhlcyAqLwogCXVuaW9uIGFjcGlfb3BlcmFuZF9vYmplY3QgKm5leHQ7CS8qIExpbmsgZm9yIGxpc3Qgb2YgYWNxdWlyZWQgbXV0ZXhlcyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oIGIvaW5jbHVkZS9hY3BpL2FjcGlfZHJpdmVycy5oCmluZGV4IDRkYzhhNTAuLjA3YTVlYjAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3BpX2RyaXZlcnMuaAorKysgYi9pbmNsdWRlL2FjcGkvYWNwaV9kcml2ZXJzLmgKQEAgLTEwNSwxMiArMTA1LDYgQEAKIAogaW50IGFjcGlfcHJvY2Vzc29yX3NldF90aGVybWFsX2xpbWl0KGFjcGlfaGFuZGxlIGhhbmRsZSwgaW50IHR5cGUpOwogCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSG90IEtleXMKLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLWV4dGVybiBpbnQgYWNwaV9zcGVjaWZpY19ob3RrZXlfZW5hYmxlZDsKLQogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvY2sgU3RhdGlvbgogICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMTIyLDEwICsxMTYsMjQgQEAKIAlhY3BpX25vdGlmeV9oYW5kbGVyIGhhbmRsZXIsIHZvaWQgKmNvbnRleHQpOwogZXh0ZXJuIHZvaWQgdW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGFjcGlfaGFuZGxlIGhhbmRsZSk7CiAjZWxzZQotI2RlZmluZSBpc19kb2NrX2RldmljZShoKQkJCSgwKQotI2RlZmluZSByZWdpc3Rlcl9kb2NrX25vdGlmaWVyKG5iKSAJCSgtRU5PREVWKQotI2RlZmluZSB1bnJlZ2lzdGVyX2RvY2tfbm90aWZpZXIobmIpICAgICAgICAgICAJZG8geyB9IHdoaWxlKDApCi0jZGVmaW5lIHJlZ2lzdGVyX2hvdHBsdWdfZG9ja19kZXZpY2UoaDEsIGgyLCBjKQkoLUVOT0RFVikKLSNkZWZpbmUgdW5yZWdpc3Rlcl9ob3RwbHVnX2RvY2tfZGV2aWNlKGgpICAgICAgIGRvIHsgfSB3aGlsZSgwKQorc3RhdGljIGlubGluZSBpbnQgaXNfZG9ja19kZXZpY2UoYWNwaV9oYW5kbGUgaGFuZGxlKQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfZG9ja19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworCXJldHVybiAtRU5PREVWOworfQorc3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfZG9ja19ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKQoreworfQorc3RhdGljIGlubGluZSBpbnQgcmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUsCisJCQkJYWNwaV9ub3RpZnlfaGFuZGxlciBoYW5kbGVyLCB2b2lkICpjb250ZXh0KQoreworCXJldHVybiAtRU5PREVWOworfQorc3RhdGljIGlubGluZSB2b2lkIHVucmVnaXN0ZXJfaG90cGx1Z19kb2NrX2RldmljZShhY3BpX2hhbmRsZSBoYW5kbGUpCit7Cit9CiAjZW5kaWYKICNlbmRpZiAvKl9fQUNQSV9EUklWRVJTX0hfXyovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FjcGkvYWNwaW9zeGYuaCBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCmluZGV4IDc4MTM5NGIuLjI3ODUwNTggMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCisrKyBiL2luY2x1ZGUvYWNwaS9hY3Bpb3N4Zi5oCkBAIC0yNDAsMTIgKzI0MCw2IEBACiBhY3BpX29zX3ZhbGlkYXRlX2FkZHJlc3ModTggc3BhY2VfaWQsCiAJCQkgYWNwaV9waHlzaWNhbF9hZGRyZXNzIGFkZHJlc3MsIGFjcGlfc2l6ZSBsZW5ndGgpOwogCi11OCBhY3BpX29zX3JlYWRhYmxlKHZvaWQgKnBvaW50ZXIsIGFjcGlfc2l6ZSBsZW5ndGgpOwotCi0jaWZkZWYgQUNQSV9GVVRVUkVfVVNBR0UKLXU4IGFjcGlfb3Nfd3JpdGFibGUodm9pZCAqcG9pbnRlciwgYWNwaV9zaXplIGxlbmd0aCk7Ci0jZW5kaWYKLQogdTY0IGFjcGlfb3NfZ2V0X3RpbWVyKHZvaWQpOwogCiBhY3BpX3N0YXR1cyBhY3BpX29zX3NpZ25hbCh1MzIgZnVuY3Rpb24sIHZvaWQgKmluZm8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oIGIvaW5jbHVkZS9hY3BpL3Byb2Nlc3Nvci5oCmluZGV4IDc3OThkMmEuLjkxNmMwMTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYWNwaS9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FjcGkvcHJvY2Vzc29yLmgKQEAgLTc5LDYgKzc5LDcgQEAKIAl1MzIgYm1fYWN0aXZpdHk7CiAJaW50IGNvdW50OwogCXN0cnVjdCBhY3BpX3Byb2Nlc3Nvcl9jeCBzdGF0ZXNbQUNQSV9QUk9DRVNTT1JfTUFYX1BPV0VSXTsKKwlpbnQgdGltZXJfYnJvYWRjYXN0X29uX3N0YXRlOwogfTsKIAogLyogUGVyZm9ybWFuY2UgTWFuYWdlbWVudCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaCBiL2luY2x1ZGUvYXNtLWF2cjMyL2FyY2gtYXQzMmFwL2JvYXJkLmgKaW5kZXggYjEyMGVlMC4uMWE3YjA3ZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvYXJjaC1hdDMyYXAvYm9hcmQuaAorKysgYi9pbmNsdWRlL2FzbS1hdnIzMi9hcmNoLWF0MzJhcC9ib2FyZC5oCkBAIC0yNiw3ICsyNiw5IEBACiBzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKIGF0MzJfYWRkX2RldmljZV9ldGgodW5zaWduZWQgaW50IGlkLCBzdHJ1Y3QgZXRoX3BsYXRmb3JtX2RhdGEgKmRhdGEpOwogCi1zdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICphdDMyX2FkZF9kZXZpY2Vfc3BpKHVuc2lnbmVkIGludCBpZCk7CitzdHJ1Y3Qgc3BpX2JvYXJkX2luZm87CitzdHJ1Y3QgcGxhdGZvcm1fZGV2aWNlICoKK2F0MzJfYWRkX2RldmljZV9zcGkodW5zaWduZWQgaW50IGlkLCBzdHJ1Y3Qgc3BpX2JvYXJkX2luZm8gKmIsIHVuc2lnbmVkIGludCBuKTsKIAogc3RydWN0IGxjZGNfcGxhdGZvcm1fZGF0YSB7CiAJdW5zaWduZWQgbG9uZyBmYm1lbV9zdGFydDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL2lvLmggYi9pbmNsdWRlL2FzbS1hdnIzMi9pby5oCmluZGV4IGVlYzQ3NTAuLmMwOGU4MTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWF2cjMyL2lvLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvaW8uaApAQCAtMjgsMTMgKzI4LDEzIEBACiAgKiBHZW5lcmljIElPIHJlYWQvd3JpdGUuICBUaGVzZSBwZXJmb3JtIG5hdGl2ZS1lbmRpYW4gYWNjZXNzZXMuICBOb3RlCiAgKiB0aGF0IHNvbWUgYXJjaGl0ZWN0dXJlcyB3aWxsIHdhbnQgdG8gcmUtZGVmaW5lIF9fcmF3X3tyZWFkLHdyaXRlfXcuCiAgKi8KLWV4dGVybiB2b2lkIF9fcmF3X3dyaXRlc2IodW5zaWduZWQgaW50IGFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBieXRlbGVuKTsKLWV4dGVybiB2b2lkIF9fcmF3X3dyaXRlc3codW5zaWduZWQgaW50IGFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKTsKLWV4dGVybiB2b2lkIF9fcmF3X3dyaXRlc2wodW5zaWduZWQgaW50IGFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsb25nbGVuKTsKK2V4dGVybiB2b2lkIF9fcmF3X3dyaXRlc2Iodm9pZCBfX2lvbWVtICphZGRyLCBjb25zdCB2b2lkICpkYXRhLCBpbnQgYnl0ZWxlbik7CitleHRlcm4gdm9pZCBfX3Jhd193cml0ZXN3KHZvaWQgX19pb21lbSAqYWRkciwgY29uc3Qgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pOworZXh0ZXJuIHZvaWQgX19yYXdfd3JpdGVzbCh2b2lkIF9faW9tZW0gKmFkZHIsIGNvbnN0IHZvaWQgKmRhdGEsIGludCBsb25nbGVuKTsKIAotZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHNiKHVuc2lnbmVkIGludCBhZGRyLCB2b2lkICpkYXRhLCBpbnQgYnl0ZWxlbik7Ci1leHRlcm4gdm9pZCBfX3Jhd19yZWFkc3codW5zaWduZWQgaW50IGFkZHIsIHZvaWQgKmRhdGEsIGludCB3b3JkbGVuKTsKLWV4dGVybiB2b2lkIF9fcmF3X3JlYWRzbCh1bnNpZ25lZCBpbnQgYWRkciwgdm9pZCAqZGF0YSwgaW50IGxvbmdsZW4pOworZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHNiKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IGJ5dGVsZW4pOworZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHN3KGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IHdvcmRsZW4pOworZXh0ZXJuIHZvaWQgX19yYXdfcmVhZHNsKGNvbnN0IHZvaWQgX19pb21lbSAqYWRkciwgdm9pZCAqZGF0YSwgaW50IGxvbmdsZW4pOwogCiBzdGF0aWMgaW5saW5lIHZvaWQgd3JpdGViKHVuc2lnbmVkIGNoYXIgYiwgdm9sYXRpbGUgdm9pZCBfX2lvbWVtICphZGRyKQogewpAQCAtMjUyLDYgKzI1Miw5IEBACiAjZGVmaW5lIGlvcmVtYXAob2Zmc2V0LCBzaXplKQkJCVwKIAlfX2lvcmVtYXAoKG9mZnNldCksIChzaXplKSwgMCkKIAorI2RlZmluZSBpb3JlbWFwX25vY2FjaGUob2Zmc2V0LCBzaXplKQkJXAorCV9faW9yZW1hcCgob2Zmc2V0KSwgKHNpemUpLCAwKQorCiAjZGVmaW5lIGlvdW5tYXAoYWRkcikJCQkJXAogCV9faW91bm1hcChhZGRyKQogCkBAIC0yNjMsNiArMjY2LDE0IEBACiAjZGVmaW5lIHBhZ2VfdG9fYnVzIHBhZ2VfdG9fcGh5cwogI2RlZmluZSBidXNfdG9fcGFnZSBwaHlzX3RvX3BhZ2UKIAorLyoKKyAqIENyZWF0ZSBhIHZpcnR1YWwgbWFwcGluZyBjb29raWUgZm9yIGFuIElPIHBvcnQgcmFuZ2UuICBUaGVyZSBleGlzdHMKKyAqIG5vIHN1Y2ggdGhpbmcgYXMgcG9ydC1iYXNlZCBJL08gb24gQVZSMzIsIHNvIGEgcmVndWxhciBpb3JlbWFwKCkKKyAqIHNob3VsZCBkbyB3aGF0IHdlIG5lZWQuCisgKi8KKyNkZWZpbmUgaW9wb3J0X21hcChwb3J0LCBucikJaW9yZW1hcChwb3J0LCBucikKKyNkZWZpbmUgaW9wb3J0X3VubWFwKHBvcnQpCWlvdW5tYXAocG9ydCkKKwogI2RlZmluZSBkbWFfY2FjaGVfd2JhY2tfaW52KF9zdGFydCwgX3NpemUpCVwKIAlmbHVzaF9kY2FjaGVfcmVnaW9uKF9zdGFydCwgX3NpemUpCiAjZGVmaW5lIGRtYV9jYWNoZV9pbnYoX3N0YXJ0LCBfc2l6ZSkJCVwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWF2cjMyL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tYXZyMzIvdW5pc3RkLmgKaW5kZXggNTZlZDFmOS4uOGY1MTIwNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tYXZyMzIvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tYXZyMzIvdW5pc3RkLmgKQEAgLTEyMCw3ICsxMjAsNyBAQAogI2RlZmluZSBfX05SX2dldGl0aW1lcgkJMTA1CiAjZGVmaW5lIF9fTlJfc3dhcG9mZgkJMTA2CiAjZGVmaW5lIF9fTlJfc3lzaW5mbwkJMTA3Ci0jZGVmaW5lIF9fTlJfaXBjCQkxMDgKKy8qIDEwOCB3YXMgX19OUl9pcGMgZm9yIGEgbGl0dGxlIHdoaWxlICovCiAjZGVmaW5lIF9fTlJfc2VuZGZpbGUJCTEwOQogI2RlZmluZSBfX05SX3NldGRvbWFpbm5hbWUJMTEwCiAjZGVmaW5lIF9fTlJfdW5hbWUJCTExMQpAQCAtMjgyLDggKzI4MiwyMSBAQAogI2RlZmluZSBfX05SX3Ztc3BsaWNlCQkyNjQKICNkZWZpbmUgX19OUl9lcG9sbF9wd2FpdAkyNjUKIAorI2RlZmluZSBfX05SX21zZ2dldAkJMjY2CisjZGVmaW5lIF9fTlJfbXNnc25kCQkyNjcKKyNkZWZpbmUgX19OUl9tc2dyY3YJCTI2OAorI2RlZmluZSBfX05SX21zZ2N0bAkJMjY5CisjZGVmaW5lIF9fTlJfc2VtZ2V0CQkyNzAKKyNkZWZpbmUgX19OUl9zZW1vcAkJMjcxCisjZGVmaW5lIF9fTlJfc2VtY3RsCQkyNzIKKyNkZWZpbmUgX19OUl9zZW10aW1lZG9wCQkyNzMKKyNkZWZpbmUgX19OUl9zaG1hdAkJMjc0CisjZGVmaW5lIF9fTlJfc2htZ2V0CQkyNzUKKyNkZWZpbmUgX19OUl9zaG1kdAkJMjc2CisjZGVmaW5lIF9fTlJfc2htY3RsCQkyNzcKKwogI2lmZGVmIF9fS0VSTkVMX18KLSNkZWZpbmUgTlJfc3lzY2FsbHMJCTI2NgorI2RlZmluZSBOUl9zeXNjYWxscwkJMjc4CiAKIAogI2RlZmluZSBfX0FSQ0hfV0FOVF9JUENfUEFSU0VfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni9hY3BpLmggYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAppbmRleCA1ZTY1N2ViLi40NDlmM2YyIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L2FjcGkuaApAQCAtMTI3LDYgKzEyNyw3IEBACiAjZGVmaW5lIGFjcGlfaW9hcGljIDAKIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX25vaXJxX3NldCh2b2lkKSB7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhY3BpX2Rpc2FibGVfcGNpKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGRpc2FibGVfYWNwaSh2b2lkKSB7IH0KIAogI2VuZGlmCS8qICFDT05GSUdfQUNQSSAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2FwaWMuaCBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCmluZGV4IDNhNjEyMDYuLmNjNmIxNjUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvYXBpYy5oCkBAIC05NSw5ICs5NSw3IEBACiAJYXBpY193cml0ZV9hcm91bmQoQVBJQ19FT0ksIDApOwogfQogCi1leHRlcm4gdm9pZCAoKndhaXRfdGltZXJfdGljaykodm9pZCk7Ci0KLWV4dGVybiBpbnQgZ2V0X21heGx2dCh2b2lkKTsKK2V4dGVybiBpbnQgbGFwaWNfZ2V0X21heGx2dCh2b2lkKTsKIGV4dGVybiB2b2lkIGNsZWFyX2xvY2FsX0FQSUModm9pZCk7CiBleHRlcm4gdm9pZCBjb25uZWN0X2JzcF9BUElDICh2b2lkKTsKIGV4dGVybiB2b2lkIGRpc2Nvbm5lY3RfYnNwX0FQSUMgKGludCB2aXJ0X3dpcmVfc2V0dXApOwpAQCAtMTEzLDE0ICsxMTEsOSBAQAogZXh0ZXJuIHZvaWQgc2V0dXBfYm9vdF9BUElDX2Nsb2NrICh2b2lkKTsKIGV4dGVybiB2b2lkIHNldHVwX3NlY29uZGFyeV9BUElDX2Nsb2NrICh2b2lkKTsKIGV4dGVybiBpbnQgQVBJQ19pbml0X3VuaXByb2Nlc3NvciAodm9pZCk7Ci1leHRlcm4gdm9pZCBkaXNhYmxlX0FQSUNfdGltZXIodm9pZCk7Ci1leHRlcm4gdm9pZCBlbmFibGVfQVBJQ190aW1lcih2b2lkKTsKIAogZXh0ZXJuIHZvaWQgZW5hYmxlX05NSV90aHJvdWdoX0xWVDAgKHZvaWQgKiBkdW1teSk7CiAKLXZvaWQgc21wX3NlbmRfdGltZXJfYnJvYWRjYXN0X2lwaSh2b2lkKTsKLXZvaWQgc3dpdGNoX0FQSUNfdGltZXJfdG9faXBpKHZvaWQgKmNwdW1hc2spOwotdm9pZCBzd2l0Y2hfaXBpX3RvX0FQSUNfdGltZXIodm9pZCAqY3B1bWFzayk7CiAjZGVmaW5lIEFSQ0hfQVBJQ1RJTUVSX1NUT1BTX09OX0MzCTEKIAogZXh0ZXJuIGludCB0aW1lcl9vdmVyXzgyNTQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2hwZXQuaCBiL2luY2x1ZGUvYXNtLWkzODYvaHBldC5oCmluZGV4IGU0N2JlOWEuLmZjMDNjZjkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvaHBldC5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaHBldC5oCkBAIC05MCwxNiArOTAsMTkgQEAKICNkZWZpbmUgSFBFVF9NSU5fUEVSSU9EICgxMDAwMDBVTCkKICNkZWZpbmUgSFBFVF9USUNLX1JBVEUgIChIWiAqIDEwMDAwMFVMKQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X3RpY2s7ICAJLyogaHBldCBjbGtzIGNvdW50IHBlciB0aWNrICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CS8qIGhwZXQgbWVtb3J5IG1hcCBwaHlzaWNhbCBhZGRyZXNzICovCi1leHRlcm4gaW50IGhwZXRfdXNlX3RpbWVyOworZXh0ZXJuIGludCBpc19ocGV0X2VuYWJsZWQodm9pZCk7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzY0CitleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X3RpY2s7CS8qIGhwZXQgY2xrcyBjb3VudCBwZXIgdGljayAqLworZXh0ZXJuIGludCBocGV0X3VzZV90aW1lcjsKIGV4dGVybiBpbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgaHBldF9lbmFibGUodm9pZCk7Ci1leHRlcm4gaW50IGhwZXRfcmVlbmFibGUodm9pZCk7Ci1leHRlcm4gaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKTsKIGV4dGVybiBpbnQgaXNfaHBldF9jYXBhYmxlKHZvaWQpOwogZXh0ZXJuIGludCBocGV0X3JlYWRsKHVuc2lnbmVkIGxvbmcgYSk7CisjZWxzZQorZXh0ZXJuIGludCBocGV0X2VuYWJsZSh2b2lkKTsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX0hQRVRfRU1VTEFURV9SVEMKIGV4dGVybiBpbnQgaHBldF9tYXNrX3J0Y19pcnFfYml0KHVuc2lnbmVkIGxvbmcgYml0X21hc2spOwpAQCAtMTEwLDUgKzExMywxMCBAQAogZXh0ZXJuIGludCBocGV0X3J0Y190aW1lcl9pbml0KHZvaWQpOwogZXh0ZXJuIGlycXJldHVybl90IGhwZXRfcnRjX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQpOwogI2VuZGlmIC8qIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDICovCisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgaW50IGhwZXRfZW5hYmxlKHZvaWQpIHsgcmV0dXJuIDA7IH0KKwogI2VuZGlmIC8qIENPTkZJR19IUEVUX1RJTUVSICovCiAjZW5kaWYgLyogX0kzODZfSFBFVF9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L2k4MjUzLmggYi9pbmNsdWRlL2FzbS1pMzg2L2k4MjUzLmgKaW5kZXggMDE1ZDhkZi4uNmNiMGRkNCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni9pODI1My5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvaTgyNTMuaApAQCAtMSw2ICsxLDIxIEBACiAjaWZuZGVmIF9fQVNNX0k4MjUzX0hfXwogI2RlZmluZSBfX0FTTV9JODI1M19IX18KIAorI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KKwogZXh0ZXJuIHNwaW5sb2NrX3QgaTgyNTNfbG9jazsKIAorZXh0ZXJuIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmdsb2JhbF9jbG9ja19ldmVudDsKKworLyoqCisgKiBwaXRfaW50ZXJydXB0X2hvb2sgLSBob29rIGludG8gdGltZXIgdGljaworICogQHJlZ3M6CXN0YW5kYXJkIHJlZ2lzdGVycyBmcm9tIGludGVycnVwdAorICoKKyAqIENhbGwgdGhlIGdsb2JhbCBjbG9jayBldmVudCBoYW5kbGVyLgorICoqLworc3RhdGljIGlubGluZSB2b2lkIHBpdF9pbnRlcnJ1cHRfaG9vayh2b2lkKQoreworCWdsb2JhbF9jbG9ja19ldmVudC0+ZXZlbnRfaGFuZGxlcihnbG9iYWxfY2xvY2tfZXZlbnQpOworfQorCiAjZW5kaWYJLyogX19BU01fSTgyNTNfSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9kb190aW1lci5oIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLWRlZmF1bHQvZG9fdGltZXIuaAppbmRleCA3ZDYwNmUzLi41NmU1Njg5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1pMzg2L21hY2gtZGVmYXVsdC9kb190aW1lci5oCisrKyBiL2luY2x1ZGUvYXNtLWkzODYvbWFjaC1kZWZhdWx0L2RvX3RpbWVyLmgKQEAgLTEsODYgKzEsMTYgQEAKIC8qIGRlZmluZXMgZm9yIGlubGluZSBhcmNoIHNldHVwIGZ1bmN0aW9ucyAqLworI2luY2x1ZGUgPGxpbnV4L2Nsb2NrY2hpcHMuaD4KIAotI2luY2x1ZGUgPGFzbS9hcGljLmg+CiAjaW5jbHVkZSA8YXNtL2k4MjU5Lmg+CisjaW5jbHVkZSA8YXNtL2k4MjUzLmg+CiAKIC8qKgogICogZG9fdGltZXJfaW50ZXJydXB0X2hvb2sgLSBob29rIGludG8gdGltZXIgdGljawotICogQHJlZ3M6CXN0YW5kYXJkIHJlZ2lzdGVycyBmcm9tIGludGVycnVwdAogICoKLSAqIERlc2NyaXB0aW9uOgotICoJVGhpcyBob29rIGlzIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGltZXIgaW50ZXJydXB0IGlzIGFjaydkLgotICoJSXQncyBwcmltYXJ5IHB1cnBvc2UgaXMgdG8gYWxsb3cgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IHBvc3Nlc3MKLSAqCWluZGl2aWR1YWwgcGVyIENQVSBjbG9ja3MgKGxpa2UgdGhlIENQVSBBUElDcyBzdXBwbHkpIHRvIGJyb2FkY2FzdCB0aGUKLSAqCXRpbWVyIGludGVycnVwdCBhcyBhIG1lYW5zIG9mIHRyaWdnZXJpbmcgcmVzY2hlZHVsZXMgZXRjLgorICogQ2FsbCB0aGUgcGl0IGNsb2NrIGV2ZW50IGhhbmRsZXIuIHNlZSBhc20vaTgyNTMuaAogICoqLwogCiBzdGF0aWMgaW5saW5lIHZvaWQgZG9fdGltZXJfaW50ZXJydXB0X2hvb2sodm9pZCkKIHsKLQlkb190aW1lcigxKTsKLSNpZm5kZWYgQ09ORklHX1NNUAotCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZV92bShnZXRfaXJxX3JlZ3MoKSkpOwotI2VuZGlmCi0vKgotICogSW4gdGhlIFNNUCBjYXNlIHdlIHVzZSB0aGUgbG9jYWwgQVBJQyB0aW1lciBpbnRlcnJ1cHQgdG8gZG8gdGhlCi0gKiBwcm9maWxpbmcsIGV4Y2VwdCB3aGVuIHdlIHNpbXVsYXRlIFNNUCBtb2RlIG9uIGEgdW5pcHJvY2Vzc29yCi0gKiBzeXN0ZW0sIGluIHRoYXQgY2FzZSB3ZSBoYXZlIHRvIGNhbGwgdGhlIGxvY2FsIGludGVycnVwdCBoYW5kbGVyLgotICovCi0jaWZuZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKLSNlbHNlCi0JaWYgKCF1c2luZ19hcGljX3RpbWVyKQotCQlzbXBfbG9jYWxfdGltZXJfaW50ZXJydXB0KCk7Ci0jZW5kaWYKLX0KLQotCi0vKiB5b3UgY2FuIHNhZmVseSB1bmRlZmluZSB0aGlzIGlmIHlvdSBkb24ndCBoYXZlIHRoZSBOZXB0dW5lIGNoaXBzZXQgKi8KLQotI2RlZmluZSBCVUdHWV9ORVBUVU5fVElNRVIKLQotLyoqCi0gKiBkb190aW1lcl9vdmVyZmxvdyAtIHByb2Nlc3MgYSBkZXRlY3RlZCB0aW1lciBvdmVyZmxvdyBjb25kaXRpb24KLSAqIEBjb3VudDoJaGFyZHdhcmUgdGltZXIgaW50ZXJydXB0IGNvdW50IG9uIG92ZXJmbG93Ci0gKgotICogRGVzY3JpcHRpb246Ci0gKglUaGlzIGNhbGwgaXMgaW52b2tlZCB3aGVuIHRoZSBqaWZmaWVzIGNvdW50IGhhcyBub3QgaW5jcmVtZW50ZWQgYnV0Ci0gKgl0aGUgaGFyZHdhcmUgdGltZXIgaW50ZXJydXB0IGhhcy4gIEl0IG1lYW5zIHRoYXQgYSB0aW1lciB0aWNrIGludGVycnVwdAotICoJY2FtZSBhbG9uZyB3aGlsZSB0aGUgcHJldmlvdXMgb25lIHdhcyBwZW5kaW5nLCB0aHVzIGEgdGljayB3YXMgbWlzc2VkCi0gKiovCi1zdGF0aWMgaW5saW5lIGludCBkb190aW1lcl9vdmVyZmxvdyhpbnQgY291bnQpCi17Ci0JaW50IGk7Ci0KLQlzcGluX2xvY2soJmk4MjU5QV9sb2NrKTsKLQkvKgotCSAqIFRoaXMgaXMgdHJpY2t5IHdoZW4gSS9PIEFQSUNzIGFyZSB1c2VkOwotCSAqIHNlZSBkb190aW1lcl9pbnRlcnJ1cHQoKS4KLQkgKi8KLQlpID0gaW5iKDB4MjApOwotCXNwaW5fdW5sb2NrKCZpODI1OUFfbG9jayk7Ci0JCi0JLyogYXNzdW1wdGlvbiBhYm91dCB0aW1lciBiZWluZyBJUlEwICovCi0JaWYgKGkgJiAweDAxKSB7Ci0JCS8qCi0JCSAqIFdlIGNhbm5vdCBkZXRlY3QgbG9zdCB0aW1lciBpbnRlcnJ1cHRzIC4uLiAKLQkJICogd2VsbCwgdGhhdCdzIHdoeSB3ZSBjYWxsIHRoZW0gbG9zdCwgZG9uJ3Qgd2U/IDopCi0JCSAqIFtobW0sIG9uIHRoZSBQZW50aXVtIGFuZCBBbHBoYSB3ZSBjYW4gLi4uIHNvcnQgb2ZdCi0JCSAqLwotCQljb3VudCAtPSBMQVRDSDsKLQl9IGVsc2UgewotI2lmZGVmIEJVR0dZX05FUFRVTl9USU1FUgotCQkvKgotCQkgKiBmb3IgdGhlIE5lcHR1biBidWcgd2Uga25vdyB0aGF0IHRoZSAnbGF0Y2gnCi0JCSAqIGNvbW1hbmQgZG9lc24ndCBsYXRjaCB0aGUgaGlnaCBhbmQgbG93IHZhbHVlCi0JCSAqIG9mIHRoZSBjb3VudGVyIGF0b21pY2FsbHkuIFRodXMgd2UgaGF2ZSB0byAKLQkJICogc3Vic3RyYWN0IDI1NiBmcm9tIHRoZSBjb3VudGVyIAotCQkgKiAuLi4gZnVubnksIGlzbnQgaXQ/IDopCi0JCSAqLwotCQkKLQkJY291bnQgLT0gMjU2OwotI2Vsc2UKLQkJcHJpbnRrKCJkb19zbG93X2dldHRpbWVvZmZzZXQoKTogaGFyZHdhcmUgdGltZXIgcHJvYmxlbT9cbiIpOwotI2VuZGlmCi0JfQotCXJldHVybiBjb3VudDsKKwlwaXRfaW50ZXJydXB0X2hvb2soKTsKIH0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL2RvX3RpbWVyLmggYi9pbmNsdWRlL2FzbS1pMzg2L21hY2gtdm95YWdlci9kb190aW1lci5oCmluZGV4IDA0ZTY5YzEuLjYwZjlkY2MgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbWFjaC12b3lhZ2VyL2RvX3RpbWVyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tYWNoLXZveWFnZXIvZG9fdGltZXIuaApAQCAtMSwyNSArMSwxOCBAQAogLyogZGVmaW5lcyBmb3IgaW5saW5lIGFyY2ggc2V0dXAgZnVuY3Rpb25zICovCi0jaW5jbHVkZSA8YXNtL3ZveWFnZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CiAKKyNpbmNsdWRlIDxhc20vdm95YWdlci5oPgorI2luY2x1ZGUgPGFzbS9pODI1My5oPgorCisvKioKKyAqIGRvX3RpbWVyX2ludGVycnVwdF9ob29rIC0gaG9vayBpbnRvIHRpbWVyIHRpY2sKKyAqIEByZWdzOiAgICAgc3RhbmRhcmQgcmVnaXN0ZXJzIGZyb20gaW50ZXJydXB0CisgKgorICogQ2FsbCB0aGUgcGl0IGNsb2NrIGV2ZW50IGhhbmRsZXIuIHNlZSBhc20vaTgyNTMuaAorICoqLwogc3RhdGljIGlubGluZSB2b2lkIGRvX3RpbWVyX2ludGVycnVwdF9ob29rKHZvaWQpCiB7Ci0JZG9fdGltZXIoMSk7Ci0jaWZuZGVmIENPTkZJR19TTVAKLQl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGVfdm0oaXJxX3JlZ3MpKTsKLSNlbmRpZgotCisJcGl0X2ludGVycnVwdF9ob29rKCk7CiAJdm95YWdlcl90aW1lcl9pbnRlcnJ1cHQoKTsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgZG9fdGltZXJfb3ZlcmZsb3coaW50IGNvdW50KQotewotCS8qIGNhbid0IHJlYWQgdGhlIElTUiwganVzdCBhc3N1bWUgMSB0aWNrCi0JICAgb3ZlcmZsb3cgKi8KLQlpZihjb3VudCA+IExBVENIIHx8IGNvdW50IDwgMCkgewotCQlwcmludGsoS0VSTl9FUlIgIlZPWUFHRVIgUFJPQkxFTTogY291bnQgaXMgJWQsIGxhdGNoIGlzICVkXG4iLCBjb3VudCwgTEFUQ0gpOwotCQljb3VudCA9IExBVENIOwotCX0KLQljb3VudCAtPSBMQVRDSDsKLQotCXJldHVybiBjb3VudDsKLX0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjLmggYi9pbmNsdWRlL2FzbS1pMzg2L21wc3BlYy5oCmluZGV4IDc3MGJmNmQuLmYyMTM0OTMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbXBzcGVjLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tcHNwZWMuaApAQCAtMjMsNyArMjMsNiBAQAogZXh0ZXJuIGludCBtcGNfZGVmYXVsdF90eXBlOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbXBfbGFwaWNfYWRkcjsKIGV4dGVybiBpbnQgcGljX21vZGU7Ci1leHRlcm4gaW50IHVzaW5nX2FwaWNfdGltZXI7CiAKICNpZmRlZiBDT05GSUdfQUNQSQogZXh0ZXJuIHZvaWQgbXBfcmVnaXN0ZXJfbGFwaWMgKHU4IGlkLCB1OCBlbmFibGVkKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWkzODYvbXNyLmggYi9pbmNsdWRlL2FzbS1pMzg2L21zci5oCmluZGV4IDYwOWEzODkuLjZkYjQwZDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLWkzODYvbXNyLmgKKysrIGIvaW5jbHVkZS9hc20taTM4Ni9tc3IuaApAQCAtMzA3LDQgKzMwNyw3IEBACiAjZGVmaW5lIE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwJMHgzOGYKICNkZWZpbmUgTVNSX0NPUkVfUEVSRl9HTE9CQUxfT1ZGX0NUUkwJMHgzOTAKIAorLyogR2VvZGUgZGVmaW5lZCBNU1JzICovCisjZGVmaW5lIE1TUl9HRU9ERV9CVVNDT05UX0NPTkYwICAgICAgICAgMHgxOTAwCisKICNlbmRpZiAvKiBfX0FTTV9NU1JfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taTM4Ni90c2MuaCBiL2luY2x1ZGUvYXNtLWkzODYvdHNjLmgKaW5kZXggYzEzOTMzMS4uZTk5Nzg5MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20taTM4Ni90c2MuaAorKysgYi9pbmNsdWRlL2FzbS1pMzg2L3RzYy5oCkBAIC0xLDQ4ICsxIEBACi0vKgotICogbGludXgvaW5jbHVkZS9hc20taTM4Ni90c2MuaAotICoKLSAqIGkzODYgVFNDIHJlbGF0ZWQgZnVuY3Rpb25zCi0gKi8KLSNpZm5kZWYgX0FTTV9pMzg2X1RTQ19ICi0jZGVmaW5lIF9BU01faTM4Nl9UU0NfSAotCi0jaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgotCi0vKgotICogU3RhbmRhcmQgd2F5IHRvIGFjY2VzcyB0aGUgY3ljbGUgY291bnRlciBvbiBpNTg2KyBDUFVzLgotICogQ3VycmVudGx5IG9ubHkgdXNlZCBvbiBTTVAuCi0gKgotICogSWYgeW91IHJlYWxseSBoYXZlIGEgU01QIG1hY2hpbmUgd2l0aCBpNDg2IGNoaXBzIG9yIG9sZGVyLAotICogY29tcGlsZSBmb3IgdGhhdCwgYW5kIHRoaXMgd2lsbCBqdXN0IGFsd2F5cyByZXR1cm4gemVyby4KLSAqIFRoYXQncyBvaywgaXQganVzdCBtZWFucyB0aGF0IHRoZSBuaWNlciBzY2hlZHVsaW5nIGhldXJpc3RpY3MKLSAqIHdvbid0IHdvcmsgZm9yIHlvdS4KLSAqCi0gKiBXZSBvbmx5IHVzZSB0aGUgbG93IDMyIGJpdHMsIGFuZCB3ZSdkIHNpbXBseSBiZXR0ZXIgbWFrZSBzdXJlCi0gKiB0aGF0IHdlIHJlc2NoZWR1bGUgYmVmb3JlIHRoYXQgd3JhcHMuIFNjaGVkdWxpbmcgYXQgbGVhc3QgZXZlcnkKLSAqIGZvdXIgYmlsbGlvbiBjeWNsZXMganVzdCBiYXNpY2FsbHkgc291bmRzIGxpa2UgYSBnb29kIGlkZWEsCi0gKiByZWdhcmRsZXNzIG9mIGhvdyBmYXN0IHRoZSBtYWNoaW5lIGlzLgotICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfdDsKLQotZXh0ZXJuIHVuc2lnbmVkIGludCBjcHVfa2h6OwotZXh0ZXJuIHVuc2lnbmVkIGludCB0c2Nfa2h6OwotCi1zdGF0aWMgaW5saW5lIGN5Y2xlc190IGdldF9jeWNsZXModm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0ID0gMDsKLQotI2lmbmRlZiBDT05GSUdfWDg2X1RTQwotCWlmICghY3B1X2hhc190c2MpCi0JCXJldHVybiAwOwotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKENPTkZJR19YODZfR0VORVJJQykgfHwgZGVmaW5lZChDT05GSUdfWDg2X1RTQykKLQlyZHRzY2xsKHJldCk7Ci0jZW5kaWYKLQlyZXR1cm4gcmV0OwotfQotCi1leHRlcm4gdm9pZCB0c2NfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKHZvaWQpOwotCi0jZW5kaWYKKyNpbmNsdWRlIDxhc20teDg2XzY0L3RzYy5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20taWE2NC9saWJhdGEtcG9ydG1hcC5oIGIvaW5jbHVkZS9hc20taWE2NC9saWJhdGEtcG9ydG1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMDBjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2FzbS1pYTY0L2xpYmF0YS1wb3J0bWFwLmgKQEAgLTAsMCArMSwxMiBAQAorI2lmbmRlZiBfX0FTTV9JQTY0X0xJQkFUQV9QT1JUTUFQX0gKKyNkZWZpbmUgX19BU01fSUE2NF9MSUJBVEFfUE9SVE1BUF9ICisKKyNkZWZpbmUgQVRBX1BSSU1BUllfQ01ECQkweDFGMAorI2RlZmluZSBBVEFfUFJJTUFSWV9DVEwJCTB4M0Y2CisjZGVmaW5lIEFUQV9QUklNQVJZX0lSUShkZXYpCWlzYV9pcnFfdG9fdmVjdG9yKDE0KQorCisjZGVmaW5lIEFUQV9TRUNPTkRBUllfQ01ECTB4MTcwCisjZGVmaW5lIEFUQV9TRUNPTkRBUllfQ1RMCTB4Mzc2CisjZGVmaW5lIEFUQV9TRUNPTkRBUllfSVJRKGRldikJaXNhX2lycV90b192ZWN0b3IoMTUpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvS2J1aWxkIGIvaW5jbHVkZS9hc20tc2gvS2J1aWxkCmluZGV4IGM2OGUxNjguLjc2YThjY2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL0tidWlsZAorKysgYi9pbmNsdWRlL2FzbS1zaC9LYnVpbGQKQEAgLTEgKzEsMyBAQAogaW5jbHVkZSBpbmNsdWRlL2FzbS1nZW5lcmljL0tidWlsZC5hc20KKworaGVhZGVyLXkgKz0gY3B1LWZlYXR1cmVzLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9iaWdzdXIuaCBiL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9iaWdzdXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI3MjQ1Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvYmlnc3VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vKgotICoKLSAqIEhpdGFjaGkgQmlnIFN1ciBFdmFsIEJvYXJkIHN1cHBvcnQKLSAqCi0gKiBEdXN0aW4gTWNJbnRpcmUgKGR1c3RpbkBzZW5zb3JpYS5jb20pCi0gKgotICogTWF5IGJlIGNvcGllZCBvciBtb2RpZmllZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYwotICogTGljZW5zZS4gIFNlZSBsaW51eC9DT1BZSU5HIGZvciBtb3JlIGluZm9ybWF0aW9uLgotICoKLSAqIERlcml2ZWQgZnJvbSBIaXRhY2hpIFNINzc1MSByZWZlcmVuY2UgbWFudWFsCi0gKiAKLSAqLwotCi0jaWZuZGVmIF9BU01fQklHU1VSX0hfCi0jZGVmaW5lIF9BU01fQklHU1VSX0hfCi0KLSNpbmNsdWRlIDxhc20vaXJxLmg+Ci0jaW5jbHVkZSA8YXNtL2hkNjQ0NjUvaGQ2NDQ2NS5oPgotCi0vKiA3NzUxIEludGVybmFsIElSUSdzIHVzZWQgYnkgZXh0ZXJuYWwgQ1BMRCBjb250cm9sbGVyICovCi0jZGVmaW5lIEJJR1NVUl9JUlFfTE9XCTAKLSNkZWZpbmUgQklHU1VSX0lSUV9OVU0gIDE0ICAgICAgICAgLyogRXh0ZXJuYWwgQ1BMRCBsZXZlbCAxIElSUXMgKi8KLSNkZWZpbmUgQklHU1VSX0lSUV9ISUdIIChCSUdTVVJfSVJRX0xPVyArIEJJR1NVUl9JUlFfTlVNKQotI2RlZmluZSBCSUdTVVJfMk5ETFZMX0lSUV9MT1cgICAoSEQ2NDQ2NV9JUlFfQkFTRStIRDY0NDY1X0lSUV9OVU0pICAKLSNkZWZpbmUgQklHU1VSXzJORExWTF9JUlFfTlVNICAgMzIgLyogTGV2ZWwgMiBJUlFzID0gNCByZWdzICogOCBiaXRzICovCi0jZGVmaW5lIEJJR1NVUl8yTkRMVkxfSVJRX0hJR0ggIChCSUdTVVJfMk5ETFZMX0lSUV9MT1cgKyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCSUdTVVJfMk5ETFZMX0lSUV9OVU0pCi0KLS8qIFBDSSBpbnRlcnJ1cHQgYmFzZSBudW1iZXIgKEFfSU5UQS1BX0lOVEQpICovCi0jZGVmaW5lIEJJR1NVUl9TSDc3NTFfUENJX0lSUV9CQVNFICAoQklHU1VSXzJORExWTF9JUlFfTE9XKzEwKSAgCi0KLS8qIENQTEQgcmVnaXN0ZXJzIGFuZCBleHRlcm5hbCBjaGlwIGFkZHJlc3NlcyAqLwotI2RlZmluZSBCSUdTVVJfSEQ2NDQ2NF9BRERSCTB4QjIwMDAwMDAKLSNkZWZpbmUgQklHU1VSX0RHRFIJMHhCMUZGRkUwMAotI2RlZmluZSBCSUdTVVJfQklEUgkweEIxRkZGRDAwCi0jZGVmaW5lIEJJR1NVUl9DU0xSCTB4QjFGRkZDMDAKLSNkZWZpbmUgQklHU1VSX1NXMVIJMHhCMUZGRkIwMAotI2RlZmluZSBCSUdTVVJfREJHUgkweEIxRkZGQTAwCi0jZGVmaW5lIEJJR1NVUl9CRFRSCTB4QjFGRkY5MDAKLSNkZWZpbmUgQklHU1VSX0JEUlIJMHhCMUZGRjgwMAotI2RlZmluZSBCSUdTVVJfUFBSMQkweEIxRkZGNzAwCi0jZGVmaW5lIEJJR1NVUl9QUFIyCTB4QjFGRkY2MDAKLSNkZWZpbmUgQklHU1VSX0lERTIJMHhCMUZGRjUwMAotI2RlZmluZSBCSUdTVVJfSURFMwkweEIxRkZGNDAwCi0jZGVmaW5lIEJJR1NVUl9TUENSCTB4QjFGRkYzMDAKLSNkZWZpbmUgQklHU1VSX0VUSFIJMHhCMUZFMDAwMAotI2RlZmluZSBCSUdTVVJfUFBEUgkweEIxRkRGRjAwCi0jZGVmaW5lIEJJR1NVUl9JQ1RMCTB4QjFGREZFMDAKLSNkZWZpbmUgQklHU1VSX0lDTUQJMHhCMUZERkQwMAotI2RlZmluZSBCSUdTVVJfRE1BMAkweEIxRkRGQzAwCi0jZGVmaW5lIEJJR1NVUl9ETUExCTB4QjFGREZCMDAKLSNkZWZpbmUgQklHU1VSX0lSUTAJMHhCMUZERkEwMAotI2RlZmluZSBCSUdTVVJfSVJRMQkweEIxRkRGOTAwCi0jZGVmaW5lIEJJR1NVUl9JUlEyCTB4QjFGREY4MDAKLSNkZWZpbmUgQklHU1VSX0lSUTMJMHhCMUZERjcwMAotI2RlZmluZSBCSUdTVVJfSU1SMAkweEIxRkRGNjAwCi0jZGVmaW5lIEJJR1NVUl9JTVIxCTB4QjFGREY1MDAKLSNkZWZpbmUgQklHU1VSX0lNUjIJMHhCMUZERjQwMAotI2RlZmluZSBCSUdTVVJfSU1SMwkweEIxRkRGMzAwCi0jZGVmaW5lIEJJR1NVUl9JUkxNUjAJMHhCMUZERjIwMAotI2RlZmluZSBCSUdTVVJfSVJMTVIxCTB4QjFGREYxMDAKLSNkZWZpbmUgQklHU1VSX1YzMjBVU0NfQUREUiAgMHhCMTAwMDAwMAotI2RlZmluZSBCSUdTVVJfSEQ2NDQ2NV9BRERSICAweEIwMDAwMDAwCi0jZGVmaW5lIEJJR1NVUl9JTlRFUk5BTF9CQVNFIDB4QjAwMDAwMDAKLQotLyogU01DIGV0aGVybmV0IGNhcmQgcGFyYW1ldGVycyAqLwotI2RlZmluZSBCSUdTVVJfRVRIRVJfSU9QT1JUCQkweDIyMAotCi0vKiBJREUgcmVnaXN0ZXIgcGFyYW10ZXJzICovCi0jZGVmaW5lIEJJR1NVUl9JREVDTURfSU9QT1JUCTB4MWYwCi0jZGVmaW5lIEJJR1NVUl9JREVDVExfSU9QT1JUCTB4MWY4Ci0KLS8qIExFRCBiaXQgcG9zaXRpb24gaW4gQklHU1VSX0NTTFIgKi8KLSNkZWZpbmUgQklHU1VSX0xFRCAgKDE8PDQpCi0KLS8qIFBDSTogZGVmYXVsdCBMT0NBTCBtZW1vcnkgd2luZG93IHNpemVzIChzZWVuIGZyb20gUENJIGJ1cykgKi8KLSNkZWZpbmUgQklHU1VSX0xTUjBfU0laRSAgICAoNjQqKDE8PDIwKSkgLy82NE1CCi0jZGVmaW5lIEJJR1NVUl9MU1IxX1NJWkUgICAgKDY0KigxPDwyMCkpIC8vNjRNQgotCi0jZW5kaWYgLyogX0FTTV9CSUdTVVJfSF8gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9pby5oIGIvaW5jbHVkZS9hc20tc2gvYmlnc3VyL2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NzBhYzguLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvYmlnc3VyL2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvYmlnc3VyL2lvLmgKLSAqCi0gKiBCeSBEdXN0aW4gTWNJbnRpcmUgKGR1c3RpbkBzZW5zb3JpYS5jb20pIChjKTIwMDEKLSAqIERlcml2ZWQgZnJvbSBpb19oZDY0NDY1LmgsIHdoaWNoIGJvcmUgdGhlIG1lc3NhZ2U6Ci0gKiBCeSBHcmVnIEJhbmtzIDxnYmFua3NAcG9ja2V0cGVuZ3VpbnMuY29tPgotICogKGMpIDIwMDAgUG9ja2V0UGVuZ3VpbnMgSW5jLiAKLSAqIGFuZCBmcm9tIGlvX2hkNjQ0NjEuaCwgd2hpY2ggYm9yZSB0aGUgbWVzc2FnZToKLSAqIENvcHlyaWdodCAyMDAwIFN0dWFydCBNZW5lZnkgKHN0dWFydC5tZW5lZnlAc3QuY29tKQotICoKLSAqIE1heSBiZSBjb3BpZWQgb3IgbW9kaWZpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKLSAqIExpY2Vuc2UuICBTZWUgbGludXgvQ09QWUlORyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSAqCi0gKiBJTyBmdW5jdGlvbnMgZm9yIGEgSGl0YWNoaSBCaWcgU3VyIEV2YWx1YXRpb24gQm9hcmQuCi0gKi8KLQotI2lmbmRlZiBfQVNNX1NIX0lPX0JJR1NVUl9ICi0jZGVmaW5lIF9BU01fU0hfSU9fQklHU1VSX0gKLQotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+Ci0KLWV4dGVybiB1bnNpZ25lZCBsb25nIGJpZ3N1cl9pc2FfcG9ydDJhZGRyKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLWV4dGVybiBpbnQgYmlnc3VyX2lycV9kZW11eChpbnQgaXJxKTsKLS8qIFByb3Zpc2lvbiBmb3IgZ2VuZXJpYyBzZWNvbmRhcnkgZGVtdXggc3RlcCAtLSB1c2VkIGJ5IFBDTUNJQSBjb2RlICovCi1leHRlcm4gdm9pZCBiaWdzdXJfcmVnaXN0ZXJfaXJxX2RlbXV4KGludCBpcnEsCi0JCWludCAoKmRlbXV4KShpbnQgaXJxLCB2b2lkICpkZXYpLCB2b2lkICpkZXYpOwotZXh0ZXJuIHZvaWQgYmlnc3VyX3VucmVnaXN0ZXJfaXJxX2RlbXV4KGludCBpcnEpOwotLyogU2V0IHRoaXMgdmFyaWFibGUgdG8gMSB0byBzZWUgcG9ydCB0cmFmZmljICovCi1leHRlcm4gaW50IGJpZ3N1cl9pb19kZWJ1ZzsKLS8qIE1hcCBhIHJhbmdlIG9mIHBvcnRzIHRvIGEgcmFuZ2Ugb2Yga2VybmVsIHZpcnR1YWwgbWVtb3J5LiAqLwotZXh0ZXJuIHZvaWQgYmlnc3VyX3BvcnRfbWFwKHUzMiBiYXNlcG9ydCwgdTMyIG5wb3J0cywgdTMyIGFkZHIsIHU4IHNoaWZ0KTsKLWV4dGVybiB2b2lkIGJpZ3N1cl9wb3J0X3VubWFwKHUzMiBiYXNlcG9ydCwgdTMyIG5wb3J0cyk7Ci0KLSNlbmRpZiAvKiBfQVNNX1NIX0lPX0JJR1NVUl9IICovCi0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXNoL2JpZ3N1ci9zZXJpYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA4ZmE4Mi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9iaWdzdXIvc2VyaWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogaW5jbHVkZS9hc20tc2gvYmlnc3VyL3NlcmlhbC5oCi0gKgotICogQ29uZmlndXJhdGlvbiBkZXRhaWxzIGZvciBCaWcgU3VyIDE2NTUwIGJhc2VkIHNlcmlhbCBwb3J0cyAKLSAqIGkuZS4gSEQ2NDQ2NSwgUENNQ0lBLCBldGMuCi0gKi8KLQotI2lmbmRlZiBfQVNNX1NFUklBTF9CSUdTVVJfSAotI2RlZmluZSBfQVNNX1NFUklBTF9CSUdTVVJfSAotI2luY2x1ZGUgPGFzbS9oZDY0NDY1Lmg+Ci0KLSNkZWZpbmUgQkFTRV9CQVVEICgzMzc5MjAwIC8gMTYpCi0KLSNkZWZpbmUgU1REX0NPTV9GTEFHUyAoQVNZTkNfQk9PVF9BVVRPQ09ORiB8IEFTWU5DX1NLSVBfVEVTVCkKLQotCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8gICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB7IDAsIEJBU0VfQkFVRCwgMHgzRjgsIEhENjQ0NjVfSVJRX1VBUlQsIFNURF9DT01fRkxBR1MgfSAvKiB0dHlTMCAqLyAKLQotLyogWFhYOiBUaGlzIHNob3VsZCBiZSBtb3ZlZCBpbm8gaXJxLmggKi8KLSNkZWZpbmUgaXJxX2Nhbm5vbmljYWxpemUoeCkgKHgpCi0KLSNlbmRpZiAvKiBfQVNNX1NFUklBTF9CSUdTVVJfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvYnVncy5oIGIvaW5jbHVkZS9hc20tc2gvYnVncy5oCmluZGV4IGEyOTQ5OTcuLjVhMTE3ZWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2J1Z3MuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9idWdzLmgKQEAgLTE5LDkgKzE5LDkgQEAKIAlleHRlcm4gdW5zaWduZWQgbG9uZyBsb29wc19wZXJfamlmZnk7CiAJY2hhciAqcCA9ICZpbml0X3V0c25hbWUoKS0+bWFjaGluZVsyXTsgLyogInNoIiAqLwogCi0JY3B1X2RhdGEtPmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKKwljdXJyZW50X2NwdV9kYXRhLmxvb3BzX3Blcl9qaWZmeSA9IGxvb3BzX3Blcl9qaWZmeTsKIAotCXN3aXRjaCAoY3B1X2RhdGEtPnR5cGUpIHsKKwlzd2l0Y2ggKGN1cnJlbnRfY3B1X2RhdGEudHlwZSkgewogCWNhc2UgQ1BVX1NINzYwNCAuLi4gQ1BVX1NINzYxOToKIAkJKnArKyA9ICcyJzsKIAkJYnJlYWs7CkBAIC01NCw3ICs1NCw3IEBACiAJCWJyZWFrOwogCX0KIAotCXByaW50aygiQ1BVOiAlc1xuIiwgZ2V0X2NwdV9zdWJ0eXBlKCkpOworCXByaW50aygiQ1BVOiAlc1xuIiwgZ2V0X2NwdV9zdWJ0eXBlKCZjdXJyZW50X2NwdV9kYXRhKSk7CiAKICNpZm5kZWYgX19MSVRUTEVfRU5ESUFOX18KIAkvKiAnZWInIG1lYW5zICdFbmRpYW4gQmlnJyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY2FjaGVmbHVzaC5oIGIvaW5jbHVkZS9hc20tc2gvY2FjaGVmbHVzaC5oCmluZGV4IDA3ZjYyZWMuLjIyZjEyNjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jYWNoZWZsdXNoLmgKQEAgLTMwLDUgKzMwLDggQEAKIAogI2RlZmluZSBIQVZFX0FSQ0hfVU5NQVBQRURfQVJFQQogCisvKiBQYWdlIGZsYWcgZm9yIGxhenkgZGNhY2hlIHdyaXRlLWJhY2sgZm9yIHRoZSBhbGlhc2luZyBVUCBjYWNoZXMgKi8KKyNkZWZpbmUgUEdfZGNhY2hlX2RpcnR5CVBHX2FyY2hfMQorCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogI2VuZGlmIC8qIF9fQVNNX1NIX0NBQ0hFRkxVU0hfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2gzL2NhY2hlZmx1c2guaAppbmRleCBmNzBkOGVmNy4uNmZhYmJiYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9jYWNoZWZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoMy9jYWNoZWZsdXNoLmgKQEAgLTM2LDggKzM2LDYgQEAKICAvKiAzMktCIGNhY2hlLCA0a2IgUEFHRSBzaXplcyBuZWVkIHRvIGNoZWNrIGJpdCAxMiAqLwogI2RlZmluZSBDQUNIRV9BTElBUyAweDAwMDAxMDAwCiAKLSNkZWZpbmUgUEdfbWFwcGVkCVBHX2FyY2hfMQotCiB2b2lkIGZsdXNoX2NhY2hlX2FsbCh2b2lkKTsKIHZvaWQgZmx1c2hfY2FjaGVfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogI2RlZmluZSBmbHVzaF9jYWNoZV9kdXBfbW0obW0pIGZsdXNoX2NhY2hlX21tKG1tKQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9jYWNoZWZsdXNoLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlZmx1c2guaAppbmRleCBiMDFhMTBmLi5iMzc0NmE5IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlZmx1c2guaAorKysgYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2NhY2hlZmx1c2guaApAQCAtMTcsNiArMTcsNyBAQAogICogIHNvIHdlIG5lZWQgdGhlbS4KICAqLwogdm9pZCBmbHVzaF9jYWNoZV9hbGwodm9pZCk7Cit2b2lkIGZsdXNoX2RjYWNoZV9hbGwodm9pZCk7CiB2b2lkIGZsdXNoX2NhY2hlX21tKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKICNkZWZpbmUgZmx1c2hfY2FjaGVfZHVwX21tKG1tKSBmbHVzaF9jYWNoZV9tbShtbSkKIHZvaWQgZmx1c2hfY2FjaGVfcmFuZ2Uoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCkBAIC0zOCwxNiArMzksNCBAQAogLyogSW5pdGlhbGl6YXRpb24gb2YgUDMgYXJlYSBmb3IgY29weV91c2VyX3BhZ2UgKi8KIHZvaWQgcDNfY2FjaGVfaW5pdCh2b2lkKTsKIAotI2RlZmluZSBQR19tYXBwZWQJUEdfYXJjaF8xCi0KLSNpZmRlZiBDT05GSUdfTU1VCi1leHRlcm4gaW50IHJlbWFwX2FyZWFfcGFnZXModW5zaWduZWQgbG9uZyBhZGRyLCB1bnNpZ25lZCBsb25nIHBoeXNfYWRkciwKLQkJCSAgICB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOwotI2Vsc2UgLyogQ09ORklHX01NVSAqLwotc3RhdGljIGlubGluZSBpbnQgcmVtYXBfYXJlYV9wYWdlcyh1bnNpZ25lZCBsb25nIGFkZHIsIHVuc2lnbmVkIGxvbmcgcGh5c19hZGRyLAotCQkJCSAgIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKLXsKLQlyZXR1cm4gMDsKLX0KLSNlbmRpZiAvKiBDT05GSUdfTU1VICovCiAjZW5kaWYgLyogX19BU01fQ1BVX1NINF9DQUNIRUZMVVNIX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZG1hLmggYi9pbmNsdWRlL2FzbS1zaC9jcHUtc2g0L2RtYS5oCmluZGV4IDNlNGIzZTYuLmMxMzVlOWMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL2NwdS1zaDQvZG1hLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvY3B1LXNoNC9kbWEuaApAQCAtMyw2ICszLDE3IEBACiAKICNkZWZpbmUgRE1BT1JfSU5JVAkoIDB4ODAwMCB8IERNQU9SX0RNRSApCiAKKy8qIFNINzc1MS83NzYwLzc3ODAgRE1BIElSUSBzb3VyY2VzICovCisjZGVmaW5lIERNVEUwX0lSUQkzNAorI2RlZmluZSBETVRFMV9JUlEJMzUKKyNkZWZpbmUgRE1URTJfSVJRCTM2CisjZGVmaW5lIERNVEUzX0lSUQkzNworI2RlZmluZSBETVRFNF9JUlEJNDQKKyNkZWZpbmUgRE1URTVfSVJRCTQ1CisjZGVmaW5lIERNVEU2X0lSUQk0NgorI2RlZmluZSBETVRFN19JUlEJNDcKKyNkZWZpbmUgRE1BRV9JUlEJMzgKKwogI2lmZGVmIENPTkZJR19DUFVfU0g0QQogI2RlZmluZSBTSF9ETUFDX0JBU0UJMHhmYzgwODAyMAogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9kbWEtbWFwcGluZy5oIGIvaW5jbHVkZS9hc20tc2gvZG1hLW1hcHBpbmcuaAppbmRleCA4ZDA4NjdiLi5kM2JjNzgxIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9kbWEtbWFwcGluZy5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2RtYS1tYXBwaW5nLmgKQEAgLTUzLDYgKzUzLDEwIEBACiAJY29uc2lzdGVudF9mcmVlKHZhZGRyLCBzaXplKTsKIH0KIAorI2RlZmluZSBkbWFfYWxsb2Nfbm9uY29oZXJlbnQoZCwgcywgaCwgZikgZG1hX2FsbG9jX2NvaGVyZW50KGQsIHMsIGgsIGYpCisjZGVmaW5lIGRtYV9mcmVlX25vbmNvaGVyZW50KGQsIHMsIHYsIGgpIGRtYV9mcmVlX2NvaGVyZW50KGQsIHMsIHYsIGgpCisjZGVmaW5lIGRtYV9pc19jb25zaXN0ZW50KGQsIGgpICgxKQorCiBzdGF0aWMgaW5saW5lIHZvaWQgZG1hX2NhY2hlX3N5bmMoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICp2YWRkciwgc2l6ZV90IHNpemUsCiAJCQkJICBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIpCiB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvZWMzMTA0LmggYi9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvZWMzMTA0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzOWNmYTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvZWMzMTA0L2VjMzEwNC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotI2lmbmRlZiBfX0FTTV9FQzMxMDRfSAotI2RlZmluZSBfX0FTTV9FQzMxMDRfSAotCi0KLS8qCi0gKiBNb3N0IG9mIHRoZSByZWdpc3RlciBzZXQgaXMgYXQgMHhiMGVjMDAwMCAtIDB4YjBlY2ZmZmYuCi0gKgotICogYXMgZmFyIGFzIEkndmUgZmlndXJlZCBpdCBvdXQgdGhlIHJlZ2lzdGVyIG1hcCBpczoKLSAqIDB4YjBlYzAwMDAgLSBpZCBzdHJpbmcKLSAqIDB4YjBlYzBYWFggLSBwb3dlciBtYW5hZ2VtZW50Ci0gKiAweGIwZWMxWFhYIC0gaW50ZXJydXB0IGNvbnRyb2wKLSAqIDB4YjBlYzNYWFggLSBwczIgcG9ydCAodG91Y2ggcGFkIG9uIGFlcm8gODAwMCkKLSAqIDB4YjBlYzZYWFggLSBpMmMKLSAqIDB4YjBlYzcwMDAgLSBmaXJzdCBzZXJpYWwgcG9ydCAocHJvcHJpZXRhcnkgY29ubmVjdG9yIG9uIGFlcm8gODAwMCkKLSAqIDB4YjBlYzgwMDAgLSBzZWNvbmQgc2VyaWFsIHBvcnQKLSAqIDB4YjBlYzkwMDAgLSB0aGlyZCBzZXJpYWwgcG9ydAotICogMHhiMGVjYTAwMCAtIGZvdXJ0aCBzZXJpYWwgcG9ydCAoa2V5Ym9hcmQgY29udHJvbGxlciBvbiBhZXJvIDgwMDApCi0gKiAweGIwZWNjWFhYIC0gR1BJTwotICogMHhiMGVjZFhYWCAtIEdQSU8KLSAqLwotCi0jZGVmaW5lIEVDMzEwNF9CQVNFCTB4YjBlYzAwMDAKLQotI2RlZmluZSBFQzMxMDRfU0VSNF9EQVRBCShFQzMxMDRfQkFTRSsweGEwMDApCi0jZGVmaW5lIEVDMzEwNF9TRVI0X0lJUgkJKEVDMzEwNF9CQVNFKzB4YTAwOCkKLSNkZWZpbmUgRUMzMTA0X1NFUjRfTUNSCQkoRUMzMTA0X0JBU0UrMHhhMDEwKQotI2RlZmluZSBFQzMxMDRfU0VSNF9MU1IJCShFQzMxMDRfQkFTRSsweGEwMTQpCi0jZGVmaW5lIEVDMzEwNF9TRVI0X01TUgkJKEVDMzEwNF9CQVNFKzB4YTAxOCkKLQotLyoKLSAqIG91ciBJU0EgYnVzLiAgdGhpcyBzZWVtcyB0byBiZSByZWFsIElTQS4KLSAqLwotI2RlZmluZSBFQzMxMDRfSVNBX0JBU0UJMHhhNTAwMDAwMAotCi0jZGVmaW5lIEVDMzEwNF9JUlEJMTEKLSNkZWZpbmUgRUMzMTA0X0lSUUJBU0UJNjQKLQotI2RlZmluZSBFQzMxMDRfSVJRX1NFUjEJRUMzMTA0X0lSUUJBU0UgKyA3Ci0jZGVmaW5lIEVDMzEwNF9JUlFfU0VSMglFQzMxMDRfSVJRQkFTRSArIDgKLSNkZWZpbmUgRUMzMTA0X0lSUV9TRVIzCUVDMzEwNF9JUlFCQVNFICsgOQotI2RlZmluZSBFQzMxMDRfSVJRX1NFUjQJRUMzMTA0X0lSUUJBU0UgKyAxMAotCi0jZW5kaWYgLyogX19BU01fRUMzMTA0X0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9pby5oIGIvaW5jbHVkZS9hc20tc2gvZWMzMTA0L2lvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWM4ZTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9hc20tc2gvZWMzMTA0L2lvLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi0jaWZuZGVmIF9BU01fU0hfSU9fRUMzMTA0X0gKLSNkZWZpbmUgX0FTTV9TSF9JT19FQzMxMDRfSAotCi0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotZXh0ZXJuIHVuc2lnbmVkIGNoYXIgZWMzMTA0X2luYih1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHVuc2lnbmVkIHNob3J0IGVjMzEwNF9pbncodW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB1bnNpZ25lZCBsb25nIGVjMzEwNF9pbmwodW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIHZvaWQgZWMzMTA0X291dGIodW5zaWduZWQgY2hhciB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLWV4dGVybiB2b2lkIGVjMzEwNF9vdXR3KHVuc2lnbmVkIHNob3J0IHZhbHVlLCB1bnNpZ25lZCBsb25nIHBvcnQpOwotZXh0ZXJuIHZvaWQgZWMzMTA0X291dGwodW5zaWduZWQgbG9uZyB2YWx1ZSwgdW5zaWduZWQgbG9uZyBwb3J0KTsKLQotZXh0ZXJuIGludCBlYzMxMDRfaXJxX2RlbXV4KGludCBpcnEpOwotCi0jZW5kaWYgLyogX0FTTV9TSF9JT19FQzMxMDRfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvZWMzMTA0L2tleWJvYXJkLmggYi9pbmNsdWRlL2FzbS1zaC9lYzMxMDQva2V5Ym9hcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzEyNTNhNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9lYzMxMDQva2V5Ym9hcmQuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLWV4dGVybiB1bnNpZ25lZCBjaGFyIGVjMzEwNF9rYmRfc3lzcnFfeGxhdGVbXTsKLWV4dGVybiBpbnQgZWMzMTA0X2tiZF9zZXRrZXljb2RlKHVuc2lnbmVkIGludCBzY2FuY29kZSwgdW5zaWduZWQgaW50IGtleWNvZGUpOwotZXh0ZXJuIGludCBlYzMxMDRfa2JkX2dldGtleWNvZGUodW5zaWduZWQgaW50IHNjYW5jb2RlKTsKLWV4dGVybiBpbnQgZWMzMTA0X2tiZF90cmFuc2xhdGUodW5zaWduZWQgY2hhciwgdW5zaWduZWQgY2hhciAqLCBjaGFyKTsKLWV4dGVybiBjaGFyIGVjMzEwNF9rYmRfdW5leHBlY3RlZF91cCh1bnNpZ25lZCBjaGFyKTsKLWV4dGVybiB2b2lkIGVjMzEwNF9rYmRfbGVkcyh1bnNpZ25lZCBjaGFyKTsKLWV4dGVybiB2b2lkIGVjMzEwNF9rYmRfaW5pdF9odyh2b2lkKTsKLQotI2RlZmluZSBrYmRfc3lzcnFfeGxhdGUgZWMzMTA0X2tiZF9zeXNycV94bGF0ZQotI2RlZmluZSBrYmRfc2V0a2V5Y29kZSBlYzMxMDRfa2JkX3NldGtleWNvZGUKLSNkZWZpbmUga2JkX2dldGtleWNvZGUgZWMzMTA0X2tiZF9nZXRrZXljb2RlCi0jZGVmaW5lIGtiZF90cmFuc2xhdGUgZWMzMTA0X2tiZF90cmFuc2xhdGUKLSNkZWZpbmUga2JkX3VuZXhwZWN0ZWRfdXAgZWMzMTA0X2tiZF91bmV4cGVjdGVkX3VwCi0jZGVmaW5lIGtiZF9sZWRzIGVjMzEwNF9rYmRfbGVkcwotI2RlZmluZSBrYmRfaW5pdF9odyBlYzMxMDRfa2JkX2luaXRfaHcKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXNoL2VjMzEwNC9zZXJpYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlNGQ3OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL2FzbS1zaC9lYzMxMDQvc2VyaWFsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jaW5jbHVkZSA8YXNtL2VjMzEwNC5oPgotLyogTmF0dXJhbGx5IHdlIGRvbid0IGtub3cgdGhlIGV4YWN0IHZhbHVlIGJ1dCAxMTUyMDAgYmF1ZCBoYXMgYSBkaXZpc29yCi0gKiBvZiA5IGFuZCAxOTIwMCBiYXVkIGhhcyBhIGRpdmlzb3Igb2YgNTIsIHNvIHRoaXMgc2VlbXMgbGlrZSBhIGdvb2QKLSAqIGd1ZXNzLiAgKi8KLSNkZWZpbmUgQkFTRV9CQVVEICgxNjgwMDAwMCAvIDE2KQotCi0jZGVmaW5lIFNURF9DT01fRkxBR1MgKEFTWU5DX0JPT1RfQVVUT0NPTkYgfCBBU1lOQ19TS0lQX1RFU1QpCi0KLS8qIHRoZXJlIGlzIGEgZm91cnRoIHNlcmlhbCBwb3J0IHdpdGggdGhlIGV4cGVjdGVkIHZhbHVlcyBhcyB3ZWxsLCBidXQKLSAqIGl0J3MgZ290IHRoZSBrZXlib2FyZCBjb250cm9sbGVyIGJlaGluZCBpdCBzbyB3ZSBjYW4ndCByZWFsbHkgdXNlIGl0Ci0gKiAod2l0aG91dCBtb3ZpbmcgdGhlIGtleWJvYXJkIGRyaXZlciB0byB1c2Vyc3BhY2UsIHdoaWNoIGRvZXNuJ3Qgc291bmQKLSAqIGxpa2UgYSB2ZXJ5IGdvb2QgaWRlYSkgKi8KLSNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwkJCVwKLQkvKiBVQVJUIENMSyAgIFBPUlQgSVJRICAgICBGTEFHUyAgICAgICAgKi8JCQlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MTFDMDAsIEVDMzEwNF9JUlFCQVNFKzcsIFNURF9DT01fRkxBR1MgfSwgLyogdHR5UzAgKi8JXAotCXsgMCwgQkFTRV9CQVVELCAweDEyMDAwLCBFQzMxMDRfSVJRQkFTRSs4LCBTVERfQ09NX0ZMQUdTIH0sIC8qIHR0eVMxICovCVwKLQl7IDAsIEJBU0VfQkFVRCwgMHgxMjQwMCwgRUMzMTA0X0lSUUJBU0UrOSwgU1REX0NPTV9GTEFHUyB9LCAvKiB0dHlTMiAqLwotCi0vKiBYWFg6IFRoaXMgc2hvdWxkIGJlIG1vdmVkIGlubyBpcnEuaCAqLwotI2RlZmluZSBpcnFfY2Fubm9uaWNhbGl6ZSh4KSAoeCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL2lycS5oIGIvaW5jbHVkZS9hc20tc2gvaXJxLmgKaW5kZXggYmZmOTY1ZS4uOGNjZjdhZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvaXJxLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvaXJxLmgKQEAgLTY2LDEyICs2Niw4IEBACiAvKiAzLiBPRkZDSElQX05SX0lSUVMgKi8KICNpZiBkZWZpbmVkKENPTkZJR19IRDY0NDYxKQogIyBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDE4Ci0jZWxpZiBkZWZpbmVkIChDT05GSUdfU0hfQklHU1VSKSAvKiBtdXN0IGJlIGJlZm9yZSBDT05GSUdfSEQ2NDQ2NSAqLwotIyBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDQ4CiAjZWxpZiBkZWZpbmVkKENPTkZJR19IRDY0NDY1KQogIyBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDE2Ci0jZWxpZiBkZWZpbmVkIChDT05GSUdfU0hfRUMzMTA0KQotIyBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDE2CiAjZWxpZiBkZWZpbmVkIChDT05GSUdfU0hfRFJFQU1DQVNUKQogIyBkZWZpbmUgT0ZGQ0hJUF9OUl9JUlFTIDk2CiAjZWxpZiBkZWZpbmVkIChDT05GSUdfU0hfVElUQU4pCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9rZ2RiLmggYi9pbmNsdWRlL2FzbS1zaC9rZ2RiLmgKaW5kZXggN2IyNmY1My4uMDA5NWM2NiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gva2dkYi5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL2tnZGIuaApAQCAtODUsMTAgKzg1LDEwIEBACiAjZGVmaW5lIEtHREJfUFJJTlRLKC4uLikgcHJpbnRrKCJLR0RCOiAiIF9fVkFfQVJHU19fKQogCiAvKiBGb3JjZWQgYnJlYWtwb2ludCAqLwotI2RlZmluZSBCUkVBS1BPSU5UKCkgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmIChrZ2RiX2VuYWJsZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBhc20gdm9sYXRpbGUoInRyYXBhICAgIzB4ZmYiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisjZGVmaW5lIEJSRUFLUE9JTlQoKQkJCQkJXAorZG8gewkJCQkJCQlcCisJaWYgKGtnZGJfZW5hYmxlZCkJCQkJXAorCQlfX2FzbV9fIF9fdm9sYXRpbGVfXygidHJhcGEgICAjMHgzYyIpOwlcCiB9IHdoaWxlICgwKQogCiAvKiBLR0RCIHNob3VsZCBiZSBhYmxlIHRvIGZsdXNoIGFsbCBrZXJuZWwgdGV4dCBzcGFjZSAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvbW11LmggYi9pbmNsdWRlL2FzbS1zaC9tbXUuaAppbmRleCBjZjQ3ZGY3Li5lYjAzNThjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9tbXUuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9tbXUuaApAQCAtMSwyNSArMSwxOSBAQAogI2lmbmRlZiBfX01NVV9ICiAjZGVmaW5lIF9fTU1VX0gKIAotI2lmICFkZWZpbmVkKENPTkZJR19NTVUpCisvKiBEZWZhdWx0ICJ1bnNpZ25lZCBsb25nIiBjb250ZXh0ICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbW1fY29udGV4dF9pZF90W05SX0NQVVNdOwogCiB0eXBlZGVmIHN0cnVjdCB7CisjaWZkZWYgQ09ORklHX01NVQorCW1tX2NvbnRleHRfaWRfdAkJaWQ7CisJdm9pZAkJCSp2ZHNvOworI2Vsc2UKIAlzdHJ1Y3Qgdm1fbGlzdF9zdHJ1Y3QJKnZtbGlzdDsKIAl1bnNpZ25lZCBsb25nCQllbmRfYnJrOworI2VuZGlmCiB9IG1tX2NvbnRleHRfdDsKIAotI2Vsc2UKLQotLyogRGVmYXVsdCAidW5zaWduZWQgbG9uZyIgY29udGV4dCAqLwotdHlwZWRlZiB1bnNpZ25lZCBsb25nIG1tX2NvbnRleHRfaWRfdDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotCW1tX2NvbnRleHRfaWRfdCBpZDsKLQl2b2lkICp2ZHNvOwotfSBtbV9jb250ZXh0X3Q7Ci0KLSNlbmRpZiAvKiBDT05GSUdfTU1VICovCi0KIC8qCiAgKiBQcml2aWxlZ2VkIFNwYWNlIE1hcHBpbmcgQnVmZmVyIChQTUIpIGRlZmluaXRpb25zCiAgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL21tdV9jb250ZXh0LmggYi9pbmNsdWRlL2FzbS1zaC9tbXVfY29udGV4dC5oCmluZGV4IDQ2ZjA0ZTIuLjM0MjAyNDQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL21tdV9jb250ZXh0LmgKKysrIGIvaW5jbHVkZS9hc20tc2gvbW11X2NvbnRleHQuaApAQCAtMSw2ICsxLDYgQEAKIC8qCiAgKiBDb3B5cmlnaHQgKEMpIDE5OTkgTmlpYmUgWXV0YWthCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDMgUGF1bCBNdW5kdAorICogQ29weXJpZ2h0IChDKSAyMDAzIC0gMjAwNiBQYXVsIE11bmR0CiAgKgogICogQVNJRCBoYW5kbGluZyBpZGVhIHRha2VuIGZyb20gTUlQUyBpbXBsZW1lbnRhdGlvbi4KICAqLwpAQCAtMTksMTEgKzE5LDYgQEAKICAqICAgIChiKSBBU0lEIChBZGRyZXNzIFNwYWNlIElEZW50aWZpZXIpCiAgKi8KIAotLyoKLSAqIENhY2hlIG9mIE1NVSBjb250ZXh0IGxhc3QgdXNlZC4KLSAqLwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbW11X2NvbnRleHRfY2FjaGU7Ci0KICNkZWZpbmUgTU1VX0NPTlRFWFRfQVNJRF9NQVNLCQkweDAwMDAwMGZmCiAjZGVmaW5lIE1NVV9DT05URVhUX1ZFUlNJT05fTUFTSwkweGZmZmZmZjAwCiAjZGVmaW5lIE1NVV9DT05URVhUX0ZJUlNUX1ZFUlNJT04JMHgwMDAwMDEwMApAQCAtMzIsNiArMjcsMTEgQEAKIC8qIEFTSUQgaXMgOC1iaXQgdmFsdWUsIHNvIGl0IGNhbid0IGJlIDB4MTAwICovCiAjZGVmaW5lIE1NVV9OT19BU0lECQkJMHgxMDAKIAorI2RlZmluZSBjcHVfY29udGV4dChjcHUsIG1tKQkoKG1tKS0+Y29udGV4dC5pZFtjcHVdKQorI2RlZmluZSBjcHVfYXNpZChjcHUsIG1tKQkoY3B1X2NvbnRleHQoKGNwdSksIChtbSkpICYgXAorCQkJCSBNTVVfQ09OVEVYVF9BU0lEX01BU0spCisjZGVmaW5lIGFzaWRfY2FjaGUoY3B1KQkJKGNwdV9kYXRhW2NwdV0uYXNpZF9jYWNoZSkKKwogLyoKICAqIFZpcnR1YWwgUGFnZSBOdW1iZXIgbWFzawogICovCkBAIC00MSwxOCArNDEsMTcgQEAKIC8qCiAgKiBHZXQgTU1VIGNvbnRleHQgaWYgbmVlZGVkLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgZ2V0X21tdV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQorc3RhdGljIGlubGluZSB2b2lkIGdldF9tbXVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgaW50IGNwdSkKIHsKLQl1bnNpZ25lZCBsb25nIG1jID0gbW11X2NvbnRleHRfY2FjaGU7CisJdW5zaWduZWQgbG9uZyBhc2lkID0gYXNpZF9jYWNoZShjcHUpOwogCiAJLyogQ2hlY2sgaWYgd2UgaGF2ZSBvbGQgdmVyc2lvbiBvZiBjb250ZXh0LiAqLwotCWlmICgoKG1tLT5jb250ZXh0LmlkIF4gbWMpICYgTU1VX0NPTlRFWFRfVkVSU0lPTl9NQVNLKSA9PSAwKQorCWlmICgoKGNwdV9jb250ZXh0KGNwdSwgbW0pIF4gYXNpZCkgJiBNTVVfQ09OVEVYVF9WRVJTSU9OX01BU0spID09IDApCiAJCS8qIEl0J3MgdXAgdG8gZGF0ZSwgZG8gbm90aGluZyAqLwogCQlyZXR1cm47CiAKIAkvKiBJdCdzIG9sZCwgd2UgbmVlZCB0byBnZXQgbmV3IGNvbnRleHQgd2l0aCBuZXcgdmVyc2lvbi4gKi8KLQltYyA9ICsrbW11X2NvbnRleHRfY2FjaGU7Ci0JaWYgKCEobWMgJiBNTVVfQ09OVEVYVF9BU0lEX01BU0spKSB7CisJaWYgKCEoKythc2lkICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLKSkgewogCQkvKgogCQkgKiBXZSBleGhhdXN0IEFTSUQgb2YgdGhpcyB2ZXJzaW9uLgogCQkgKiBGbHVzaCBhbGwgVExCIGFuZCBzdGFydCBuZXcgY3ljbGUuCkBAIC02MywxMCArNjIsMTEgQEAKIAkJICogRml4IHZlcnNpb247IE5vdGUgdGhhdCB3ZSBhdm9pZCB2ZXJzaW9uICMwCiAJCSAqIHRvIGRpc3Rpbmd1c2ggTk9fQ09OVEVYVC4KIAkJICovCi0JCWlmICghbWMpCi0JCQltbXVfY29udGV4dF9jYWNoZSA9IG1jID0gTU1VX0NPTlRFWFRfRklSU1RfVkVSU0lPTjsKKwkJaWYgKCFhc2lkKQorCQkJYXNpZCA9IE1NVV9DT05URVhUX0ZJUlNUX1ZFUlNJT047CiAJfQotCW1tLT5jb250ZXh0LmlkID0gbWM7CisKKwljcHVfY29udGV4dChjcHUsIG1tKSA9IGFzaWRfY2FjaGUoY3B1KSA9IGFzaWQ7CiB9CiAKIC8qCkBAIC03NCw5ICs3NCwxMyBAQAogICogaW5zdGFuY2UuCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGluaXRfbmV3X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssCi0JCQkJICAgICAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQorCQkJCSAgIHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQogewotCW1tLT5jb250ZXh0LmlkID0gTk9fQ09OVEVYVDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBudW1fb25saW5lX2NwdXMoKTsgaSsrKQorCQljcHVfY29udGV4dChpLCBtbSkgPSBOT19DT05URVhUOworCiAJcmV0dXJuIDA7CiB9CiAKQEAgLTExNywxMCArMTIxLDEwIEBACiAgKiBBZnRlciB3ZSBoYXZlIHNldCBjdXJyZW50LT5tbSB0byBhIG5ldyB2YWx1ZSwgdGhpcyBhY3RpdmF0ZXMKICAqIHRoZSBjb250ZXh0IGZvciB0aGUgbmV3IG1tIHNvIHdlIHNlZSB0aGUgbmV3IG1hcHBpbmdzLgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgYWN0aXZhdGVfY29udGV4dChzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBhY3RpdmF0ZV9jb250ZXh0KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCB1bnNpZ25lZCBpbnQgY3B1KQogewotCWdldF9tbXVfY29udGV4dChtbSk7Ci0Jc2V0X2FzaWQobW0tPmNvbnRleHQuaWQgJiBNTVVfQ09OVEVYVF9BU0lEX01BU0spOworCWdldF9tbXVfY29udGV4dChtbSwgY3B1KTsKKwlzZXRfYXNpZChjcHVfYXNpZChjcHUsIG1tKSk7CiB9CiAKIC8qIE1NVV9UVEIgaXMgdXNlZCBmb3Igb3B0aW1pemluZyB0aGUgZmF1bHQgaGFuZGxpbmcuICovCkBAIC0xMzgsMTAgKzE0MiwxNSBAQAogCQkJICAgICBzdHJ1Y3QgbW1fc3RydWN0ICpuZXh0LAogCQkJICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKIHsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCiAJaWYgKGxpa2VseShwcmV2ICE9IG5leHQpKSB7CisJCWNwdV9zZXQoY3B1LCBuZXh0LT5jcHVfdm1fbWFzayk7CiAJCXNldF9UVEIobmV4dC0+cGdkKTsKLQkJYWN0aXZhdGVfY29udGV4dChuZXh0KTsKLQl9CisJCWFjdGl2YXRlX2NvbnRleHQobmV4dCwgY3B1KTsKKwl9IGVsc2UKKwkJaWYgKCFjcHVfdGVzdF9hbmRfc2V0KGNwdSwgbmV4dC0+Y3B1X3ZtX21hc2spKQorCQkJYWN0aXZhdGVfY29udGV4dChuZXh0LCBjcHUpOwogfQogCiAjZGVmaW5lIGRlYWN0aXZhdGVfbW0odHNrLG1tKQlkbyB7IH0gd2hpbGUgKDApCkBAIC0xNTksNyArMTY4LDcgQEAKICNkZWZpbmUgZGVzdHJveV9jb250ZXh0KG1tKQkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBzZXRfYXNpZChhc2lkKQkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgZ2V0X2FzaWQoKQkJCSgwKQotI2RlZmluZSBhY3RpdmF0ZV9jb250ZXh0KG1tKQkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSBhY3RpdmF0ZV9jb250ZXh0KG1tLGNwdSkJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBzd2l0Y2hfbW0ocHJldixuZXh0LHRzaykJZG8geyB9IHdoaWxlICgwKQogI2RlZmluZSBkZWFjdGl2YXRlX21tKHRzayxtbSkJCWRvIHsgfSB3aGlsZSAoMCkKICNkZWZpbmUgYWN0aXZhdGVfbW0ocHJldixuZXh0KQkJZG8geyB9IHdoaWxlICgwKQpAQCAtMTc0LDE0ICsxODMsMTYgQEAKICAqLwogc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV9tbXUodm9pZCkKIHsKKwl1bnNpZ25lZCBpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCiAJLyogRW5hYmxlIE1NVSAqLwogCWN0cmxfb3V0bChNTVVfQ09OVFJPTF9JTklULCBNTVVDUik7CiAJY3RybF9iYXJyaWVyKCk7CiAKLQlpZiAobW11X2NvbnRleHRfY2FjaGUgPT0gTk9fQ09OVEVYVCkKLQkJbW11X2NvbnRleHRfY2FjaGUgPSBNTVVfQ09OVEVYVF9GSVJTVF9WRVJTSU9OOworCWlmIChhc2lkX2NhY2hlKGNwdSkgPT0gTk9fQ09OVEVYVCkKKwkJYXNpZF9jYWNoZShjcHUpID0gTU1VX0NPTlRFWFRfRklSU1RfVkVSU0lPTjsKIAotCXNldF9hc2lkKG1tdV9jb250ZXh0X2NhY2hlICYgTU1VX0NPTlRFWFRfQVNJRF9NQVNLKTsKKwlzZXRfYXNpZChhc2lkX2NhY2hlKGNwdSkgJiBNTVVfQ09OVEVYVF9BU0lEX01BU0spOwogfQogCiBzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9tbXUodm9pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaCBiL2luY2x1ZGUvYXNtLXNoL3BhZ2UuaAppbmRleCAzODBmZDYyLi5hYzRiNDY3IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wYWdlLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcGFnZS5oCkBAIC0xMyw2ICsxMyw4IEBACiAgICBbIFA0IGNvbnRyb2wgICBdCQkweEUwMDAwMDAwCiAgKi8KIAorI2lmZGVmIF9fS0VSTkVMX18KKwogLyogUEFHRV9TSElGVCBkZXRlcm1pbmVzIHRoZSBwYWdlIHNpemUgKi8KICNpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfNEtCKQogIyBkZWZpbmUgUEFHRV9TSElGVAkxMgpAQCAtNTEsNyArNTMsNiBAQAogI2RlZmluZSBIVUdFVExCX1BBR0VfT1JERVIJKEhQQUdFX1NISUZULVBBR0VfU0hJRlQpCiAjZW5kaWYKIAotI2lmZGVmIF9fS0VSTkVMX18KICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKIGV4dGVybiB2b2lkICgqY2xlYXJfcGFnZSkodm9pZCAqdG8pOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tc2gvcGd0YWJsZS5oCmluZGV4IDAzNmNhMjguLjkyMTRjMDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3BndGFibGUuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wZ3RhYmxlLmgKQEAgLTQzLDE3ICs0MywxNyBAQAogLyogUEdEIGJpdHMgKi8KICNkZWZpbmUgUEdESVJfU0hJRlQJKFBURV9TSElGVCArIFBURV9CSVRTKQogI2RlZmluZSBQR0RJUl9CSVRTCSgzMiAtIFBHRElSX1NISUZUKQotI2RlZmluZSBQR0RJUl9TSVpFCSgxIDw8IFBHRElSX1NISUZUKQorI2RlZmluZSBQR0RJUl9TSVpFCSgxVUwgPDwgUEdESVJfU0hJRlQpCiAjZGVmaW5lIFBHRElSX01BU0sJKH4oUEdESVJfU0laRS0xKSkKIAogLyogRW50cmllcyBwZXIgbGV2ZWwgKi8KLSNkZWZpbmUgUFRSU19QRVJfUFRFCShQQUdFX1NJWkUgLyA0KQorI2RlZmluZSBQVFJTX1BFUl9QVEUJKFBBR0VfU0laRSAvICgxIDw8IFBURV9NQUdOSVRVREUpKQogI2RlZmluZSBQVFJTX1BFUl9QR0QJKFBBR0VfU0laRSAvIDQpCiAKICNkZWZpbmUgVVNFUl9QVFJTX1BFUl9QR0QJKFRBU0tfU0laRS9QR0RJUl9TSVpFKQogI2RlZmluZSBGSVJTVF9VU0VSX0FERFJFU1MJMAogCi0jZGVmaW5lIFBURV9QSFlTX01BU0sJMHgxZmZmZjAwMAorI2RlZmluZSBQVEVfUEhZU19NQVNLCQkoMHgyMDAwMDAwMCAtIFBBR0VfU0laRSkKIAogLyoKICAqIEZpcnN0IDFNQiBtYXAgaXMgdXNlZCBieSBmaXhlZCBwdXJwb3NlLgpAQCAtNTgzLDExICs1ODMsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCBrb2Jqc2l6ZShjb25zdCB2b2lkICpvYmpwKTsKICNlbmRpZiAvKiAhQ09ORklHX01NVSAqLwogCi0jaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NINCkgfHwgZGVmaW5lZChDT05GSUdfU0g3NzA1X0NBQ0hFXzMyS0IpCi0jZGVmaW5lIF9fSEFWRV9BUkNIX1BURVBfR0VUX0FORF9DTEVBUgotZXh0ZXJuIHB0ZV90IHB0ZXBfZ2V0X2FuZF9jbGVhcihzdHJ1Y3QgbW1fc3RydWN0ICptbSwgdW5zaWduZWQgbG9uZyBhZGRyLCBwdGVfdCAqcHRlcCk7Ci0jZW5kaWYKLQogZXh0ZXJuIHBnZF90IHN3YXBwZXJfcGdfZGlyW1BUUlNfUEVSX1BHRF07CiBleHRlcm4gdm9pZCBwYWdpbmdfaW5pdCh2b2lkKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvcHJvY2Vzc29yLmggYi9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaAppbmRleCBlMjlmMmFiLi4zZTQ2YTdhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaAorKysgYi9pbmNsdWRlL2FzbS1zaC9wcm9jZXNzb3IuaApAQCAtMjcsOCArMjcsNiBAQAogI2RlZmluZSBDQ05fQ1ZSCQkweGZmMDAwMDQwCiAjZGVmaW5lIENDTl9QUlIJCTB4ZmYwMDAwNDQKIAotY29uc3QgY2hhciAqZ2V0X2NwdV9zdWJ0eXBlKHZvaWQpOwotCiAvKgogICogIENQVSB0eXBlIGFuZCBoYXJkd2FyZSBidWcgZmxhZ3MuIEtlcHQgc2VwYXJhdGVseSBmb3IgZWFjaCBDUFUuCiAgKgpAQCAtNjYsNiArNjQsNyBAQAogc3RydWN0IHNoX2NwdWluZm8gewogCXVuc2lnbmVkIGludCB0eXBlOwogCXVuc2lnbmVkIGxvbmcgbG9vcHNfcGVyX2ppZmZ5OworCXVuc2lnbmVkIGxvbmcgYXNpZF9jYWNoZTsKIAogCXN0cnVjdCBjYWNoZV9pbmZvIGljYWNoZTsJLyogUHJpbWFyeSBJLWNhY2hlICovCiAJc3RydWN0IGNhY2hlX2luZm8gZGNhY2hlOwkvKiBQcmltYXJ5IEQtY2FjaGUgKi8KQEAgLTI4OCw1ICsyODcsOCBAQAogI2RlZmluZSB2c3lzY2FsbF9pbml0KCkgZG8geyB9IHdoaWxlICgwKQogI2VuZGlmCiAKKy8qIGFyY2gvc2gva2VybmVsL3NldHVwLmMgKi8KK2NvbnN0IGNoYXIgKmdldF9jcHVfc3VidHlwZShzdHJ1Y3Qgc2hfY3B1aW5mbyAqYyk7CisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYgLyogX19BU01fU0hfUFJPQ0VTU09SX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQuaCBiL2luY2x1ZGUvYXNtLXNoL3J0czc3NTFyMmQuaAppbmRleCA3OTZiOGZjLi4xMDU2NWFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC9ydHM3NzUxcjJkLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvcnRzNzc1MXIyZC5oCkBAIC02OCw2ICs2OCwxMCBAQAogI2RlZmluZSBJUlFfUENJU0xPVDIJMTAJCS8qIFBDSSBTbG90ICMyIElSUSAqLwogI2RlZmluZQlJUlFfRVhURU5USU9OCTExCQkvKiBFWFRuIElSUSAqLwogCisvKiBhcmNoL3NoL2JvYXJkcy9yZW5lc2FzL3J0czc3NTFyMmQvaXJxLmMgKi8KK3ZvaWQgaW5pdF9ydHM3NzUxcjJkX0lSUSh2b2lkKTsKK2ludCBydHM3NzUxcjJkX2lycV9kZW11eChpbnQpOworCiAjZGVmaW5lIF9fSU9fUFJFRklYIHJ0czc3NTFyMmQKICNpbmNsdWRlIDxhc20vaW9fZ2VuZXJpYy5oPgogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC9zZXJpYWwuaCBiL2luY2x1ZGUvYXNtLXNoL3NlcmlhbC5oCmluZGV4IDg3MzQ1OTAuLjIxZjZkMzMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3NlcmlhbC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3NlcmlhbC5oCkBAIC05LDExICs5LDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogCi0jaWZkZWYgQ09ORklHX1NIX0VDMzEwNAotI2luY2x1ZGUgPGFzbS9zZXJpYWwtZWMzMTA0Lmg+Ci0jZWxpZiBkZWZpbmVkIChDT05GSUdfU0hfQklHU1VSKQotI2luY2x1ZGUgPGFzbS9zZXJpYWwtYmlnc3VyLmg+Ci0jZWxzZQogLyoKICAqIFRoaXMgYXNzdW1lcyB5b3UgaGF2ZSBhIDEuODQzMiBNSHogY2xvY2sgZm9yIHlvdXIgVUFSVC4KICAqCkBAIC0zNCwxMiArMjksOCBAQAogCiAjZWxzZQogCi0jZGVmaW5lIFNFUklBTF9QT1JUX0RGTlMJCQlcCi0JLyogVUFSVCBDTEsgICBQT1JUIElSUSAgICAgRkxBR1MgICAgICAgICovCQkJXAotCXsgMCwgQkFTRV9CQVVELCAweDNGOCwgNCwgU1REX0NPTV9GTEFHUyB9LAkvKiB0dHlTMCAqLwlcCi0JeyAwLCBCQVNFX0JBVUQsIDB4MkY4LCAzLCBTVERfQ09NX0ZMQUdTIH0JLyogdHR5UzEgKi8KKyNkZWZpbmUgU0VSSUFMX1BPUlRfREZOUwogCiAjZW5kaWYKIAotI2VuZGlmCiAjZW5kaWYgLyogX0FTTV9TRVJJQUxfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaCBiL2luY2x1ZGUvYXNtLXNoL3RocmVhZF9pbmZvLmgKaW5kZXggODc5Zjc0MS4uMjc5ZTcwYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2FzbS1zaC90aHJlYWRfaW5mby5oCkBAIC0zMiwxMiArMzIsMjAgQEAKIAogI2RlZmluZSBQUkVFTVBUX0FDVElWRQkJMHgxMDAwMDAwMAogCi0jaWZkZWYgQ09ORklHXzRLU1RBQ0tTCi0jZGVmaW5lIFRIUkVBRF9TSVpFCQkoUEFHRV9TSVpFKQorI2lmIGRlZmluZWQoQ09ORklHXzRLU1RBQ0tTKQorI2RlZmluZSBUSFJFQURfU0laRV9PUkRFUgkoMCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX1BBR0VfU0laRV80S0IpCisjZGVmaW5lIFRIUkVBRF9TSVpFX09SREVSCSgxKQorI2VsaWYgZGVmaW5lZChDT05GSUdfUEFHRV9TSVpFXzhLQikKKyNkZWZpbmUgVEhSRUFEX1NJWkVfT1JERVIJKDEpCisjZWxpZiBkZWZpbmVkKENPTkZJR19QQUdFX1NJWkVfNjRLQikKKyNkZWZpbmUgVEhSRUFEX1NJWkVfT1JERVIJKDApCiAjZWxzZQotI2RlZmluZSBUSFJFQURfU0laRQkJKFBBR0VfU0laRSAqIDIpCisjZXJyb3IgIlVua25vd24gdGhyZWFkIHNpemUiCiAjZW5kaWYKLSNkZWZpbmUgU1RBQ0tfV0FSTgkJKFRIUkVBRF9TSVpFIC8gOCkKKworI2RlZmluZSBUSFJFQURfU0laRQkoUEFHRV9TSVpFIDw8IFRIUkVBRF9TSVpFX09SREVSKQorI2RlZmluZSBTVEFDS19XQVJOCShUSFJFQURfU0laRSA+PiAzKQogCiAvKgogICogbWFjcm9zL2Z1bmN0aW9ucyBmb3IgZ2FpbmluZyBhY2Nlc3MgdG8gdGhlIHRocmVhZCBpbmZvcm1hdGlvbiBzdHJ1Y3R1cmUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3RsYmZsdXNoLmggYi9pbmNsdWRlL2FzbS1zaC90bGJmbHVzaC5oCmluZGV4IDI4YzA3M2IuLjQ1NWZiOGQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3RsYmZsdXNoLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdGxiZmx1c2guaApAQCAtNCw3ICs0LDYgQEAKIC8qCiAgKiBUTEIgZmx1c2hpbmc6CiAgKgotICogIC0gZmx1c2hfdGxiKCkgZmx1c2hlcyB0aGUgY3VycmVudCBtbSBzdHJ1Y3QgVExCcwogICogIC0gZmx1c2hfdGxiX2FsbCgpIGZsdXNoZXMgYWxsIHByb2Nlc3NlcyBUTEJzCiAgKiAgLSBmbHVzaF90bGJfbW0obW0pIGZsdXNoZXMgdGhlIHNwZWNpZmllZCBtbSBjb250ZXh0IFRMQidzCiAgKiAgLSBmbHVzaF90bGJfcGFnZSh2bWEsIHZtYWRkcikgZmx1c2hlcyBvbmUgcGFnZQpAQCAtMTIsMjAgKzExLDQ1IEBACiAgKiAgLSBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpIGZsdXNoZXMgYSByYW5nZSBvZiBrZXJuZWwgcGFnZXMKICAqICAtIGZsdXNoX3RsYl9wZ3RhYmxlcyhtbSwgc3RhcnQsIGVuZCkgZmx1c2hlcyBhIHJhbmdlIG9mIHBhZ2UgdGFibGVzCiAgKi8KK2V4dGVybiB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9hbGwodm9pZCk7CitleHRlcm4gdm9pZCBsb2NhbF9mbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOworZXh0ZXJuIHZvaWQgbG9jYWxfZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSAgdW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkgIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2V4dGVybiB2b2lkIGxvY2FsX2ZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLAorCQkJCSB1bnNpZ25lZCBsb25nIHBhZ2UpOworZXh0ZXJuIHZvaWQgbG9jYWxfZmx1c2hfdGxiX2tlcm5lbF9yYW5nZSh1bnNpZ25lZCBsb25nIHN0YXJ0LAorCQkJCQkgdW5zaWduZWQgbG9uZyBlbmQpOworZXh0ZXJuIHZvaWQgbG9jYWxfZmx1c2hfdGxiX29uZSh1bnNpZ25lZCBsb25nIGFzaWQsIHVuc2lnbmVkIGxvbmcgcGFnZSk7CiAKLWV4dGVybiB2b2lkIGZsdXNoX3RsYih2b2lkKTsKKyNpZmRlZiBDT05GSUdfU01QCisKIGV4dGVybiB2b2lkIGZsdXNoX3RsYl9hbGwodm9pZCk7CiBleHRlcm4gdm9pZCBmbHVzaF90bGJfbW0oc3RydWN0IG1tX3N0cnVjdCAqbW0pOwogZXh0ZXJuIHZvaWQgZmx1c2hfdGxiX3JhbmdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHN0YXJ0LAogCQkJICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKIGV4dGVybiB2b2lkIGZsdXNoX3RsYl9wYWdlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCB1bnNpZ25lZCBsb25nIHBhZ2UpOwotZXh0ZXJuIHZvaWQgX19mbHVzaF90bGJfcGFnZSh1bnNpZ25lZCBsb25nIGFzaWQsIHVuc2lnbmVkIGxvbmcgcGFnZSk7CitleHRlcm4gdm9pZCBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKTsKK2V4dGVybiB2b2lkIGZsdXNoX3RsYl9vbmUodW5zaWduZWQgbG9uZyBhc2lkLCB1bnNpZ25lZCBsb25nIHBhZ2UpOworCisjZWxzZQorCisjZGVmaW5lIGZsdXNoX3RsYl9hbGwoKQkJCWxvY2FsX2ZsdXNoX3RsYl9hbGwoKQorI2RlZmluZSBmbHVzaF90bGJfbW0obW0pCQlsb2NhbF9mbHVzaF90bGJfbW0obW0pCisjZGVmaW5lIGZsdXNoX3RsYl9wYWdlKHZtYSwgcGFnZSkJbG9jYWxfZmx1c2hfdGxiX3BhZ2Uodm1hLCBwYWdlKQorI2RlZmluZSBmbHVzaF90bGJfb25lKGFzaWQsIHBhZ2UpCWxvY2FsX2ZsdXNoX3RsYl9vbmUoYXNpZCwgcGFnZSkKKworI2RlZmluZSBmbHVzaF90bGJfcmFuZ2Uodm1hLCBzdGFydCwgZW5kKQlcCisJbG9jYWxfZmx1c2hfdGxiX3JhbmdlKHZtYSwgc3RhcnQsIGVuZCkKKworI2RlZmluZSBmbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpCVwKKwlsb2NhbF9mbHVzaF90bGJfa2VybmVsX3JhbmdlKHN0YXJ0LCBlbmQpCisKKyNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBmbHVzaF90bGJfcGd0YWJsZXMoc3RydWN0IG1tX3N0cnVjdCAqbW0sCiAJCQkJICAgICAgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCi17IC8qIE5vdGhpbmcgdG8gZG8gKi8KK3sKKwkvKiBOb3RoaW5nIHRvIGRvICovCiB9Ci0KLWV4dGVybiB2b2lkIGZsdXNoX3RsYl9rZXJuZWxfcmFuZ2UodW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpOwotCiAjZW5kaWYgLyogX19BU01fU0hfVExCRkxVU0hfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9hc20tc2gvdWJjLmggYi9pbmNsdWRlL2FzbS1zaC91YmMuaAppbmRleCA2OTRmNTFmLi5hZTliYmRlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1zaC91YmMuaAorKysgYi9pbmNsdWRlL2FzbS1zaC91YmMuaApAQCAtMTcsNyArMTcsNyBAQAogLyogVXNlciBCcmVhayBDb250cm9sbGVyICovCiAjaWYgZGVmaW5lZChDT05GSUdfQ1BVX1NVQlRZUEVfU0g3NzA3KSB8fCBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDc3MDkpIHx8IFwKICAgICBkZWZpbmVkKENPTkZJR19DUFVfU1VCVFlQRV9TSDczMDApCi0jZGVmaW5lIFVCQ19UWVBFX1NINzcyOQkoY3B1X2RhdGEtPnR5cGUgPT0gQ1BVX1NINzcyOSkKKyNkZWZpbmUgVUJDX1RZUEVfU0g3NzI5CShjdXJyZW50X2NwdV9kYXRhLnR5cGUgPT0gQ1BVX1NINzcyOSkKICNlbHNlCiAjZGVmaW5lIFVCQ19UWVBFX1NINzcyOQkwCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXNoL3VuaXN0ZC5oIGIvaW5jbHVkZS9hc20tc2gvdW5pc3RkLmgKaW5kZXggZjk4MjA3My4uMTdmNTI3YiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tc2gvdW5pc3RkLmgKKysrIGIvaW5jbHVkZS9hc20tc2gvdW5pc3RkLmgKQEAgLTI5MiwyMiArMjkyLDIyIEBACiAjZGVmaW5lIF9fTlJfbXFfZ2V0c2V0YXR0ciAgICAgIChfX05SX21xX29wZW4rNSkKICNkZWZpbmUgX19OUl9rZXhlY19sb2FkCQkyODMKICNkZWZpbmUgX19OUl93YWl0aWQJCTI4NAotLyogI2RlZmluZSBfX05SX3N5c19zZXRhbHRyb290CTI4NSAqLwotI2RlZmluZSBfX05SX2FkZF9rZXkJCTI4NgotI2RlZmluZSBfX05SX3JlcXVlc3Rfa2V5CTI4NwotI2RlZmluZSBfX05SX2tleWN0bAkJMjg4Ci0jZGVmaW5lIF9fTlJfaW9wcmlvX3NldAkJMjg5Ci0jZGVmaW5lIF9fTlJfaW9wcmlvX2dldAkJMjkwCi0jZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0CTI5MQotI2RlZmluZSBfX05SX2lub3RpZnlfYWRkX3dhdGNoCTI5MgotI2RlZmluZSBfX05SX2lub3RpZnlfcm1fd2F0Y2gJMjkzCisjZGVmaW5lIF9fTlJfYWRkX2tleQkJMjg1CisjZGVmaW5lIF9fTlJfcmVxdWVzdF9rZXkJMjg2CisjZGVmaW5lIF9fTlJfa2V5Y3RsCQkyODcKKyNkZWZpbmUgX19OUl9pb3ByaW9fc2V0CQkyODgKKyNkZWZpbmUgX19OUl9pb3ByaW9fZ2V0CQkyODkKKyNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQJMjkwCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9hZGRfd2F0Y2gJMjkxCisjZGVmaW5lIF9fTlJfaW5vdGlmeV9ybV93YXRjaAkyOTIKKy8qIDI5MyBpcyB1bnVzZWQgKi8KICNkZWZpbmUgX19OUl9taWdyYXRlX3BhZ2VzCTI5NAogI2RlZmluZSBfX05SX29wZW5hdAkJMjk1CiAjZGVmaW5lIF9fTlJfbWtkaXJhdAkJMjk2CiAjZGVmaW5lIF9fTlJfbWtub2RhdAkJMjk3CiAjZGVmaW5lIF9fTlJfZmNob3duYXQJCTI5OAogI2RlZmluZSBfX05SX2Z1dGltZXNhdAkJMjk5Ci0jZGVmaW5lIF9fTlJfbmV3ZnN0YXRhdAkJMzAwCisjZGVmaW5lIF9fTlJfZnN0YXRhdDY0CQkzMDAKICNkZWZpbmUgX19OUl91bmxpbmthdAkJMzAxCiAjZGVmaW5lIF9fTlJfcmVuYW1lYXQJCTMwMgogI2RlZmluZSBfX05SX2xpbmthdAkJMzAzCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1zaC92b3lhZ2VyZ3guaCBiL2luY2x1ZGUvYXNtLXNoL3ZveWFnZXJneC5oCmluZGV4IDk5YjA4MDcuLjY0YzkzNmIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXNoL3ZveWFnZXJneC5oCisrKyBiL2luY2x1ZGUvYXNtLXNoL3ZveWFnZXJneC5oCkBAIC0zMDgsNiArMzA4LDkgQEAKICNkZWZpbmUgQUM5N0NfUkVBRAkJCSgxIDw8IDE5KQogI2RlZmluZSBBQzk3Q19XRF9CSVQJCQkoMSA8PCAyKQogI2RlZmluZSBBQzk3Q19JTkRFWF9NQVNLCQkweDdmCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBhcmNoL3NoL2NjaGlwcy92b3lhZ2VyZ3gvY29uc2lzdGVudC5jICovCit2b2lkICp2b3lhZ2VyZ3hfY29uc2lzdGVudF9hbGxvYyhzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgZG1hX2FkZHJfdCAqLCBnZnBfdCk7CitpbnQgdm95YWdlcmd4X2NvbnNpc3RlbnRfZnJlZShzdHJ1Y3QgZGV2aWNlICosIHNpemVfdCwgdm9pZCAqLCBkbWFfYWRkcl90KTsKIAogI2VuZGlmIC8qIF9WT1lBR0VSX0dYX1JFR19IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvaHBldC5oIGIvaW5jbHVkZS9hc20teDg2XzY0L2hwZXQuaAppbmRleCBiMzkwOTg0Li41OWE2NmYwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS14ODZfNjQvaHBldC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC9ocGV0LmgKQEAgLTU2LDggKzU2LDE1IEBACiBleHRlcm4gaW50IGlzX2hwZXRfZW5hYmxlZCh2b2lkKTsKIGV4dGVybiBpbnQgaHBldF9ydGNfdGltZXJfaW5pdCh2b2lkKTsKIGV4dGVybiBpbnQgYXBpY19pc19jbHVzdGVyZWRfYm94KHZvaWQpOworZXh0ZXJuIGludCBocGV0X2FyY2hfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgaHBldF90aW1lcl9zdG9wX3NldF9nbyh1bnNpZ25lZCBsb25nIHRpY2spOworZXh0ZXJuIGludCBocGV0X3JlZW5hYmxlKHZvaWQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBocGV0X2NhbGlicmF0ZV90c2Modm9pZCk7CiAKIGV4dGVybiBpbnQgaHBldF91c2VfdGltZXI7CitleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X2FkZHJlc3M7CitleHRlcm4gdW5zaWduZWQgbG9uZyBocGV0X3BlcmlvZDsKK2V4dGVybiB1bnNpZ25lZCBsb25nIGhwZXRfdGljazsKIAogI2lmZGVmIENPTkZJR19IUEVUX0VNVUxBVEVfUlRDCiBleHRlcm4gaW50IGhwZXRfbWFza19ydGNfaXJxX2JpdCh1bnNpZ25lZCBsb25nIGJpdF9tYXNrKTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC9wcm90by5oIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKaW5kZXggYTZkMmZmNS4uZjU0ZjNhYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3Byb3RvLmgKQEAgLTQ1LDExICs0NSw3IEBACiAjZWxzZQogI2RlZmluZSBwbXRtcl9pb3BvcnQgMAogI2VuZGlmCi1leHRlcm4gdW5zaWduZWQgbG9uZyBsb25nIG1vbm90b25pY19iYXNlOwotZXh0ZXJuIGludCBzeXNjdGxfdnN5c2NhbGw7CiBleHRlcm4gaW50IG5vaHBldDsKLWV4dGVybiB1bnNpZ25lZCBsb25nIHZ4dGltZV9oejsKLWV4dGVybiB2b2lkIHRpbWVfaW5pdF9ndG9kKHZvaWQpOwogCiBleHRlcm4gdm9pZCBlYXJseV9wcmludGsoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdChwcmludGYsMSwyKSkpOwogCkBAIC05MSw4ICs4Nyw2IEBACiAKIGV4dGVybiBpbnQgdW5oYW5kbGVkX3NpZ25hbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgaW50IHNpZyk7CiAKLWV4dGVybiBpbnQgdW5zeW5jaHJvbml6ZWRfdHNjKHZvaWQpOwotCiBleHRlcm4gdm9pZCBzZWxlY3RfaWRsZV9yb3V0aW5lKGNvbnN0IHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7CiAKIGV4dGVybiB1bnNpZ25lZCBsb25nIHRhYmxlX3N0YXJ0LCB0YWJsZV9lbmQ7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdGltZXguaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aW1leC5oCmluZGV4IGI5ZTUzMjAuLjhjNjgwOGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC90aW1leC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC90aW1leC5oCkBAIC0xMiwzOCArMTIsMjEgQEAKICNpbmNsdWRlIDxhc20vaHBldC5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CisjaW5jbHVkZSA8YXNtL3RzYy5oPgogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAKICNkZWZpbmUgQ0xPQ0tfVElDS19SQVRFCVBJVF9USUNLX1JBVEUJLyogVW5kZXJseWluZyBIWiAqLwogCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBjeWNsZXNfdDsKLQotc3RhdGljIGlubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzICh2b2lkKQotewotCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQ7Ci0KLQlyZHRzY2xsKHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotLyogTGlrZSBnZXRfY3ljbGVzLCBidXQgbWFrZSBzdXJlIHRoZSBDUFUgaXMgc3luY2hyb25pemVkLiAqLwotc3RhdGljIF9fYWx3YXlzX2lubGluZSBjeWNsZXNfdCBnZXRfY3ljbGVzX3N5bmModm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGxvbmcgcmV0OwotCXVuc2lnbmVkIGVheDsKLQkvKiBEb24ndCBkbyBhbiBhZGRpdGlvbmFsIHN5bmMgb24gQ1BVcyB3aGVyZSB3ZSBrbm93Ci0JICAgUkRUU0MgaXMgYWxyZWFkeSBzeW5jaHJvbm91cy4gKi8KLQlhbHRlcm5hdGl2ZV9pbygiY3B1aWQiLCBBU01fTk9QMiwgWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQywKLQkJCSAgIj1hIiAoZWF4KSwgIjAiICgxKSA6ICJlYngiLCJlY3giLCJlZHgiLCJtZW1vcnkiKTsKLQlyZHRzY2xsKHJldCk7Ci0JcmV0dXJuIHJldDsKLX0KLQotZXh0ZXJuIHVuc2lnbmVkIGludCBjcHVfa2h6OwotCiBleHRlcm4gaW50IHJlYWRfY3VycmVudF90aW1lcih1bnNpZ25lZCBsb25nICp0aW1lcl92YWx1ZSk7CiAjZGVmaW5lIEFSQ0hfSEFTX1JFQURfQ1VSUkVOVF9USU1FUgkxCiAKLWV4dGVybiBzdHJ1Y3Qgdnh0aW1lX2RhdGEgdnh0aW1lOworI2RlZmluZSBVU0VDX1BFUl9USUNLIChVU0VDX1BFUl9TRUMgLyBIWikKKyNkZWZpbmUgTlNFQ19QRVJfVElDSyAoTlNFQ19QRVJfU0VDIC8gSFopCisjZGVmaW5lIEZTRUNfUEVSX1RJQ0sgKEZTRUNfUEVSX1NFQyAvIEhaKQogCisjZGVmaW5lIE5TX1NDQUxFICAgICAgICAxMCAvKiAyXjEwLCBjYXJlZnVsbHkgY2hvc2VuICovCisjZGVmaW5lIFVTX1NDQUxFICAgICAgICAzMiAvKiAyXjMyLCBhcmJpdHJhbHJpbHkgY2hvc2VuICovCisKK2V4dGVybiB2b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgc2V0X2N5YzJuc19zY2FsZSh1bnNpZ25lZCBsb25nIGtoeik7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLXg4Nl82NC90c2MuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC90c2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTBhMzY4Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9hc20teDg2XzY0L3RzYy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBsaW51eC9pbmNsdWRlL2FzbS14ODZfNjQvdHNjLmgKKyAqCisgKiB4ODZfNjQgVFNDIHJlbGF0ZWQgZnVuY3Rpb25zCisgKi8KKyNpZm5kZWYgX0FTTV94ODZfNjRfVFNDX0gKKyNkZWZpbmUgX0FTTV94ODZfNjRfVFNDX0gKKworI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KKworLyoKKyAqIFN0YW5kYXJkIHdheSB0byBhY2Nlc3MgdGhlIGN5Y2xlIGNvdW50ZXIuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGN5Y2xlc190OworCitleHRlcm4gdW5zaWduZWQgaW50IGNwdV9raHo7CitleHRlcm4gdW5zaWduZWQgaW50IHRzY19raHo7CisKK3N0YXRpYyBpbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlcyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyByZXQgPSAwOworCisjaWZuZGVmIENPTkZJR19YODZfVFNDCisJaWYgKCFjcHVfaGFzX3RzYykKKwkJcmV0dXJuIDA7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9HRU5FUklDKSB8fCBkZWZpbmVkKENPTkZJR19YODZfVFNDKQorCXJkdHNjbGwocmV0KTsKKyNlbmRpZgorCXJldHVybiByZXQ7Cit9CisKKy8qIExpa2UgZ2V0X2N5Y2xlcywgYnV0IG1ha2Ugc3VyZSB0aGUgQ1BVIGlzIHN5bmNocm9uaXplZC4gKi8KK3N0YXRpYyBfX2Fsd2F5c19pbmxpbmUgY3ljbGVzX3QgZ2V0X2N5Y2xlc19zeW5jKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIHJldDsKKyNpZmRlZiBYODZfRkVBVFVSRV9TWU5DX1JEVFNDCisJdW5zaWduZWQgZWF4OworCisJLyoKKwkgKiBEb24ndCBkbyBhbiBhZGRpdGlvbmFsIHN5bmMgb24gQ1BVcyB3aGVyZSB3ZSBrbm93CisJICogUkRUU0MgaXMgYWxyZWFkeSBzeW5jaHJvbm91czoKKwkgKi8KKwlhbHRlcm5hdGl2ZV9pbygiY3B1aWQiLCBBU01fTk9QMiwgWDg2X0ZFQVRVUkVfU1lOQ19SRFRTQywKKwkJCSAgIj1hIiAoZWF4KSwgIjAiICgxKSA6ICJlYngiLCJlY3giLCJlZHgiLCJtZW1vcnkiKTsKKyNlbHNlCisJc3luY19jb3JlKCk7CisjZW5kaWYKKwlyZHRzY2xsKHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitleHRlcm4gdm9pZCB0c2NfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG1hcmtfdHNjX3Vuc3RhYmxlKHZvaWQpOworZXh0ZXJuIGludCB1bnN5bmNocm9uaXplZF90c2Modm9pZCk7CisKKy8qCisgKiBCb290LXRpbWUgY2hlY2sgd2hldGhlciB0aGUgVFNDcyBhcmUgc3luY2hyb25pemVkIGFjcm9zcworICogYWxsIENQVXMvY29yZXM6CisgKi8KK2V4dGVybiB2b2lkIGNoZWNrX3RzY19zeW5jX3NvdXJjZShpbnQgY3B1KTsKK2V4dGVybiB2b2lkIGNoZWNrX3RzY19zeW5jX3RhcmdldCh2b2lkKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS14ODZfNjQvdnN5c2NhbGwuaCBiL2luY2x1ZGUvYXNtLXg4Nl82NC92c3lzY2FsbC5oCmluZGV4IDBjNzg0NzEuLjgyYjRhZmUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvYXNtLXg4Nl82NC92c3lzY2FsbC5oCisrKyBiL2luY2x1ZGUvYXNtLXg4Nl82NC92c3lzY2FsbC5oCkBAIC0xNiw0NiArMTYsMjcgQEAKICNpZmRlZiBfX0tFUk5FTF9fCiAjaW5jbHVkZSA8bGludXgvc2VxbG9jay5oPgogCi0jZGVmaW5lIF9fc2VjdGlvbl92eHRpbWUgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCwgX19zZWN0aW9uX18gKCIudnh0aW1lIiksIGFsaWduZWQoMTYpKSkKICNkZWZpbmUgX19zZWN0aW9uX3ZnZXRjcHVfbW9kZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi52Z2V0Y3B1X21vZGUiKSwgYWxpZ25lZCgxNikpKQogI2RlZmluZSBfX3NlY3Rpb25famlmZmllcyBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi5qaWZmaWVzIiksIGFsaWduZWQoMTYpKSkKLSNkZWZpbmUgX19zZWN0aW9uX3N5c190eiBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi5zeXNfdHoiKSwgYWxpZ25lZCgxNikpKQotI2RlZmluZSBfX3NlY3Rpb25fc3lzY3RsX3ZzeXNjYWxsIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIF9fc2VjdGlvbl9fICgiLnN5c2N0bF92c3lzY2FsbCIpLCBhbGlnbmVkKDE2KSkpCi0jZGVmaW5lIF9fc2VjdGlvbl94dGltZSBfX2F0dHJpYnV0ZV9fICgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi54dGltZSIpLCBhbGlnbmVkKDE2KSkpCi0jZGVmaW5lIF9fc2VjdGlvbl94dGltZV9sb2NrIF9fYXR0cmlidXRlX18gKCh1bnVzZWQsIF9fc2VjdGlvbl9fICgiLnh0aW1lX2xvY2siKSwgYWxpZ25lZCgxNikpKQogCi0jZGVmaW5lIFZYVElNRV9UU0MJMQotI2RlZmluZSBWWFRJTUVfSFBFVAkyCi0jZGVmaW5lIFZYVElNRV9QTVRNUgkzCisvKiBEZWZpbml0aW9ucyBmb3IgQ09ORklHX0dFTkVSSUNfVElNRSBkZWZpbml0aW9ucyAqLworI2RlZmluZSBfX3NlY3Rpb25fdnN5c2NhbGxfZ3RvZF9kYXRhIF9fYXR0cmlidXRlX18gXAorCSgodW51c2VkLCBfX3NlY3Rpb25fXyAoIi52c3lzY2FsbF9ndG9kX2RhdGEiKSxhbGlnbmVkKDE2KSkpCisjZGVmaW5lIF9fdnN5c2NhbGxfZm4gX19hdHRyaWJ1dGVfXyAoKHVudXNlZCxfX3NlY3Rpb25fXygiLnZzeXNjYWxsX2ZuIikpKQogCiAjZGVmaW5lIFZHRVRDUFVfUkRUU0NQCTEKICNkZWZpbmUgVkdFVENQVV9MU0wJMgogCi1zdHJ1Y3Qgdnh0aW1lX2RhdGEgewotCWxvbmcgaHBldF9hZGRyZXNzOwkvKiBIUEVUIGJhc2UgYWRkcmVzcyAqLwotCWludCBsYXN0OwotCXVuc2lnbmVkIGxvbmcgbGFzdF90c2M7Ci0JbG9uZyBxdW90OwotCWxvbmcgdHNjX3F1b3Q7Ci0JaW50IG1vZGU7Ci19OwotCiAjZGVmaW5lIGhwZXRfcmVhZGwoYSkgICAgICAgICAgIHJlYWRsKChjb25zdCB2b2lkIF9faW9tZW0gKilmaXhfdG9fdmlydChGSVhfSFBFVF9CQVNFKSArIGEpCiAjZGVmaW5lIGhwZXRfd3JpdGVsKGQsYSkgICAgICAgIHdyaXRlbChkLCAodm9pZCBfX2lvbWVtICopZml4X3RvX3ZpcnQoRklYX0hQRVRfQkFTRSkgKyBhKQogCi0vKiB2c3lzY2FsbCBzcGFjZSAocmVhZG9ubHkpICovCi1leHRlcm4gc3RydWN0IHZ4dGltZV9kYXRhIF9fdnh0aW1lOwogZXh0ZXJuIGludCBfX3ZnZXRjcHVfbW9kZTsKLWV4dGVybiBzdHJ1Y3QgdGltZXNwZWMgX194dGltZTsKIGV4dGVybiB2b2xhdGlsZSB1bnNpZ25lZCBsb25nIF9famlmZmllczsKLWV4dGVybiBzdHJ1Y3QgdGltZXpvbmUgX19zeXNfdHo7Ci1leHRlcm4gc2VxbG9ja190IF9feHRpbWVfbG9jazsKIAogLyoga2VybmVsIHNwYWNlICh3cml0ZWFibGUpICovCi1leHRlcm4gc3RydWN0IHZ4dGltZV9kYXRhIHZ4dGltZTsKIGV4dGVybiBpbnQgdmdldGNwdV9tb2RlOwogZXh0ZXJuIHN0cnVjdCB0aW1lem9uZSBzeXNfdHo7Ci1leHRlcm4gaW50IHN5c2N0bF92c3lzY2FsbDsKK2V4dGVybiBzdHJ1Y3QgdnN5c2NhbGxfZ3RvZF9kYXRhX3QgdnN5c2NhbGxfZ3RvZF9kYXRhOwogCiAjZW5kaWYgLyogX19LRVJORUxfXyAqLwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IDgxNWYxZmIuLjhiY2ZhYTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC03NSw3ICs3NSw3IEBACiAKIHR5cGVkZWYgaW50ICgqYWNwaV90YWJsZV9oYW5kbGVyKSAoc3RydWN0IGFjcGlfdGFibGVfaGVhZGVyICp0YWJsZSk7CiAKLXR5cGVkZWYgaW50ICgqYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIpIChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpOwordHlwZWRlZiBpbnQgKCphY3BpX3RhYmxlX2VudHJ5X2hhbmRsZXIpIChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKmhlYWRlciwgY29uc3QgdW5zaWduZWQgbG9uZyBlbmQpOwogCiBjaGFyICogX19hY3BpX21hcF90YWJsZSAodW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiB1bnNpZ25lZCBsb25nIGFjcGlfZmluZF9yc2RwICh2b2lkKTsKQEAgLTg1LDggKzg1LDEwIEBACiAKIGludCBhY3BpX3RhYmxlX2luaXQgKHZvaWQpOwogaW50IGFjcGlfdGFibGVfcGFyc2UgKGNoYXIgKmlkLCBhY3BpX3RhYmxlX2hhbmRsZXIgaGFuZGxlcik7Ci1pbnQgYWNwaV90YWJsZV9wYXJzZV9tYWR0IChlbnVtIGFjcGlfbWFkdF90eXBlIGlkLCBhY3BpX21hZHRfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpOwotaW50IGFjcGlfdGFibGVfcGFyc2Vfc3JhdCAoZW51bSBhY3BpX3NyYXRfdHlwZSBpZCwgYWNwaV9tYWR0X2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKK2ludCBfX2luaXQgYWNwaV90YWJsZV9wYXJzZV9lbnRyaWVzKGNoYXIgKmlkLCB1bnNpZ25lZCBsb25nIHRhYmxlX3NpemUsCisJaW50IGVudHJ5X2lkLCBhY3BpX3RhYmxlX2VudHJ5X2hhbmRsZXIgaGFuZGxlciwgdW5zaWduZWQgaW50IG1heF9lbnRyaWVzKTsKK2ludCBhY3BpX3RhYmxlX3BhcnNlX21hZHQgKGVudW0gYWNwaV9tYWR0X3R5cGUgaWQsIGFjcGlfdGFibGVfZW50cnlfaGFuZGxlciBoYW5kbGVyLCB1bnNpZ25lZCBpbnQgbWF4X2VudHJpZXMpOworaW50IGFjcGlfdGFibGVfcGFyc2Vfc3JhdCAoZW51bSBhY3BpX3NyYXRfdHlwZSBpZCwgYWNwaV90YWJsZV9lbnRyeV9oYW5kbGVyIGhhbmRsZXIsIHVuc2lnbmVkIGludCBtYXhfZW50cmllcyk7CiBpbnQgYWNwaV9wYXJzZV9tY2ZnIChzdHJ1Y3QgYWNwaV90YWJsZV9oZWFkZXIgKmhlYWRlcik7CiB2b2lkIGFjcGlfdGFibGVfcHJpbnRfbWFkdF9lbnRyeSAoc3RydWN0IGFjcGlfc3VidGFibGVfaGVhZGVyICptYWR0KTsKIHZvaWQgYWNwaV90YWJsZV9wcmludF9zcmF0X2VudHJ5IChzdHJ1Y3QgYWNwaV9zdWJ0YWJsZV9oZWFkZXIgKnNyYXQpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hY3BpX3BtdG1yLmggYi9pbmNsdWRlL2xpbnV4L2FjcGlfcG10bXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDBlZjFhCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9hY3BpX3BtdG1yLmgKQEAgLTAsMCArMSwzOCBAQAorI2lmbmRlZiBfQUNQSV9QTVRNUl9IXworI2RlZmluZSBfQUNQSV9QTVRNUl9IXworCisjaW5jbHVkZSA8bGludXgvY2xvY2tzb3VyY2UuaD4KKworLyogTnVtYmVyIG9mIFBNVE1SIHRpY2tzIGV4cGVjdGVkIGR1cmluZyBjYWxpYnJhdGlvbiBydW4gKi8KKyNkZWZpbmUgUE1UTVJfVElDS1NfUEVSX1NFQyAzNTc5NTQ1CisKKy8qIGxpbWl0IGl0IHRvIDI0IGJpdHMgKi8KKyNkZWZpbmUgQUNQSV9QTV9NQVNLIENMT0NLU09VUkNFX01BU0soMjQpCisKKy8qIE92ZXJydW4gdmFsdWUgKi8KKyNkZWZpbmUgQUNQSV9QTV9PVlJSVU4JKDE8PDI0KQorCisjaWZkZWYgQ09ORklHX1g4Nl9QTV9USU1FUgorCitleHRlcm4gdTMyIGFjcGlfcG1fcmVhZF92ZXJpZmllZCh2b2lkKTsKK2V4dGVybiB1MzIgcG10bXJfaW9wb3J0OworCitzdGF0aWMgaW5saW5lIHUzMiBhY3BpX3BtX3JlYWRfZWFybHkodm9pZCkKK3sKKwlpZiAoIXBtdG1yX2lvcG9ydCkKKwkJcmV0dXJuIDA7CisJLyogbWFzayB0aGUgb3V0cHV0IHRvIDI0IGJpdHMgKi8KKwlyZXR1cm4gYWNwaV9wbV9yZWFkX3ZlcmlmaWVkKCkgJiBBQ1BJX1BNX01BU0s7Cit9CisKKyNlbHNlCisKK3N0YXRpYyBpbmxpbmUgdTMyIGFjcGlfcG1fcmVhZF9lYXJseSh2b2lkKQoreworCXJldHVybiAwOworfQorCisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvYWdwX2JhY2tlbmQuaCBiL2luY2x1ZGUvbGludXgvYWdwX2JhY2tlbmQuaAppbmRleCBhNWM4YmI1Li5hYmM1MjFjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2FncF9iYWNrZW5kLmgKKysrIGIvaW5jbHVkZS9saW51eC9hZ3BfYmFja2VuZC5oCkBAIC04NywxMCArODcsMTUgQEAKIAl1MzIgcGh5c2ljYWw7CiAJdTggaXNfYm91bmQ7CiAJdTggaXNfZmx1c2hlZDsKKyAgICAgICAgdTggdm1hbGxvY19mbGFnOwogfTsKIAogI2RlZmluZSBBR1BfTk9STUFMX01FTU9SWSAwCiAKKyNkZWZpbmUgQUdQX1VTRVJfVFlQRVMgKDEgPDwgMTYpCisjZGVmaW5lIEFHUF9VU0VSX01FTU9SWSAoQUdQX1VTRVJfVFlQRVMpCisjZGVmaW5lIEFHUF9VU0VSX0NBQ0hFRF9NRU1PUlkgKEFHUF9VU0VSX1RZUEVTICsgMSkKKwogZXh0ZXJuIHN0cnVjdCBhZ3BfYnJpZGdlX2RhdGEgKmFncF9icmlkZ2U7CiBleHRlcm4gc3RydWN0IGxpc3RfaGVhZCBhZ3BfYnJpZGdlczsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9hdGEuaCBiL2luY2x1ZGUvbGludXgvYXRhLmgKaW5kZXggMThlNDAxZi4uMjcyNzM2ZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9hdGEuaAorKysgYi9pbmNsdWRlL2xpbnV4L2F0YS5oCkBAIC0zNTIsNyArMzUyLDcgQEAKIHsKIAlpZiAoYXRhX2lkX21ham9yX3ZlcnNpb24oZGV2X2lkKSA+PSA1ICYmIGF0YV9pZF9pc19zYXRhKGRldl9pZCkpCiAJCXJldHVybiAwOwkvKiBTQVRBICovCi0JaWYgKGRldl9pZFs5M10gJiAweDQwMDApCisJaWYgKChkZXZfaWRbOTNdICYgMHhFMDAwKSA9PSAweDYwMDApCiAJCXJldHVybiAwOwkvKiA4MCB3aXJlICovCiAJcmV0dXJuIDE7CiB9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaCBiL2luY2x1ZGUvbGludXgvY2xvY2tjaGlwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlYTdlN2IKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2Nsb2NrY2hpcHMuaApAQCAtMCwwICsxLDE0MiBAQAorLyogIGxpbnV4L2luY2x1ZGUvbGludXgvY2xvY2tjaGlwcy5oCisgKgorICogIFRoaXMgZmlsZSBjb250YWlucyB0aGUgc3RydWN0dXJlIGRlZmluaXRpb25zIGZvciBjbG9ja2NoaXBzLgorICoKKyAqICBJZiB5b3UgYXJlIG5vdCBhIGNsb2NrY2hpcCwgb3IgdGhlIHRpbWUgb2YgZGF5IGNvZGUsIHlvdSBzaG91bGQKKyAqICBub3QgYmUgaW5jbHVkaW5nIHRoaXMgZmlsZSEKKyAqLworI2lmbmRlZiBfTElOVVhfQ0xPQ0tDSElQU19ICisjZGVmaW5lIF9MSU5VWF9DTE9DS0NISVBTX0gKKworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTCisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja3NvdXJjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KKyNpbmNsdWRlIDxsaW51eC9rdGltZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CisKK3N0cnVjdCBjbG9ja19ldmVudF9kZXZpY2U7CisKKy8qIENsb2NrIGV2ZW50IG1vZGUgY29tbWFuZHMgKi8KK2VudW0gY2xvY2tfZXZlbnRfbW9kZSB7CisJQ0xPQ0tfRVZUX01PREVfVU5VU0VEID0gMCwKKwlDTE9DS19FVlRfTU9ERV9TSFVURE9XTiwKKwlDTE9DS19FVlRfTU9ERV9QRVJJT0RJQywKKwlDTE9DS19FVlRfTU9ERV9PTkVTSE9ULAorfTsKKworLyogQ2xvY2sgZXZlbnQgbm90aWZpY2F0aW9uIHZhbHVlcyAqLworZW51bSBjbG9ja19ldmVudF9ub2ZpdGllcnMgeworCUNMT0NLX0VWVF9OT1RJRllfQURELAorCUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OLAorCUNMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09GRiwKKwlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FTlRFUiwKKwlDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElULAorCUNMT0NLX0VWVF9OT1RJRllfU1VTUEVORCwKKwlDTE9DS19FVlRfTk9USUZZX1JFU1VNRSwKKwlDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFELAorfTsKKworLyoKKyAqIENsb2NrIGV2ZW50IGZlYXR1cmVzCisgKi8KKyNkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMJCTB4MDAwMDAxCisjZGVmaW5lIENMT0NLX0VWVF9GRUFUX09ORVNIT1QJCTB4MDAwMDAyCisvKgorICogeDg2KDY0KSBzcGVjaWZpYyBtaXNmZWF0dXJlczoKKyAqCisgKiAtIENsb2NrZXZlbnQgc291cmNlIHN0b3BzIGluIEMzIFN0YXRlIGFuZCBuZWVkcyBicm9hZGNhc3Qgc3VwcG9ydC4KKyAqIC0gTG9jYWwgQVBJQyB0aW1lciBpcyB1c2VkIGFzIGEgZHVtbXkgZGV2aWNlLgorICovCisjZGVmaW5lIENMT0NLX0VWVF9GRUFUX0MzU1RPUAkJMHgwMDAwMDQKKyNkZWZpbmUgQ0xPQ0tfRVZUX0ZFQVRfRFVNTVkJCTB4MDAwMDA4CisKKy8qKgorICogc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAtIGNsb2NrIGV2ZW50IGRldmljZSBkZXNjcmlwdG9yCisgKiBAbmFtZToJCXB0ciB0byBjbG9jayBldmVudCBuYW1lCisgKiBAaGludHM6CQl1c2FnZSBoaW50cworICogQG1heF9kZWx0YV9uczoJbWF4aW11bSBkZWx0YSB2YWx1ZSBpbiBucworICogQG1pbl9kZWx0YV9uczoJbWluaW11bSBkZWx0YSB2YWx1ZSBpbiBucworICogQG11bHQ6CQluYW5vc2Vjb25kIHRvIGN5Y2xlcyBtdWx0aXBsaWVyCisgKiBAc2hpZnQ6CQluYW5vc2Vjb25kcyB0byBjeWNsZXMgZGl2aXNvciAocG93ZXIgb2YgdHdvKQorICogQHJhdGluZzoJCXZhcmlhYmxlIHRvIHJhdGUgY2xvY2sgZXZlbnQgZGV2aWNlcworICogQGlycToJCWlycSBudW1iZXIgKG9ubHkgZm9yIG5vbiBjcHUgbG9jYWwgZGV2aWNlcykKKyAqIEBjcHVtYXNrOgkJY3B1bWFzayB0byBpbmRpY2F0ZSBmb3Igd2hpY2ggY3B1cyB0aGlzIGRldmljZSB3b3JrcworICogQHNldF9uZXh0X2V2ZW50OglzZXQgbmV4dCBldmVudAorICogQHNldF9tb2RlOgkJc2V0IG1vZGUgZnVuY3Rpb24KKyAqIEBldnRoYW5kbGVyOgkJQXNzaWduZWQgYnkgdGhlIGZyYW1ld29yayB0byBiZSBjYWxsZWQgYnkgdGhlIGxvdworICoJCQlsZXZlbCBoYW5kbGVyIG9mIHRoZSBldmVudCBzb3VyY2UKKyAqIEBicm9hZGNhc3Q6CQlmdW5jdGlvbiB0byBicm9hZGNhc3QgZXZlbnRzCisgKiBAbGlzdDoJCWxpc3QgaGVhZCBmb3IgdGhlIG1hbmFnZW1lbnQgY29kZQorICogQG1vZGU6CQlvcGVyYXRpbmcgbW9kZSBhc3NpZ25lZCBieSB0aGUgbWFuYWdlbWVudCBjb2RlCisgKiBAbmV4dF9ldmVudDoJCWxvY2FsIHN0b3JhZ2UgZm9yIHRoZSBuZXh0IGV2ZW50IGluIG9uZXNob3QgbW9kZQorICovCitzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlIHsKKwljb25zdCBjaGFyCQkqbmFtZTsKKwl1bnNpZ25lZCBpbnQJCWZlYXR1cmVzOworCXVuc2lnbmVkIGxvbmcJCW1heF9kZWx0YV9uczsKKwl1bnNpZ25lZCBsb25nCQltaW5fZGVsdGFfbnM7CisJdW5zaWduZWQgbG9uZwkJbXVsdDsKKwlpbnQJCQlzaGlmdDsKKwlpbnQJCQlyYXRpbmc7CisJaW50CQkJaXJxOworCWNwdW1hc2tfdAkJY3B1bWFzazsKKwlpbnQJCQkoKnNldF9uZXh0X2V2ZW50KSh1bnNpZ25lZCBsb25nIGV2dCwKKwkJCQkJCSAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKTsKKwl2b2lkCQkJKCpzZXRfbW9kZSkoZW51bSBjbG9ja19ldmVudF9tb2RlIG1vZGUsCisJCQkJCSAgICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopOworCXZvaWQJCQkoKmV2ZW50X2hhbmRsZXIpKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKik7CisJdm9pZAkJCSgqYnJvYWRjYXN0KShjcHVtYXNrX3QgbWFzayk7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCWVudW0gY2xvY2tfZXZlbnRfbW9kZQltb2RlOworCWt0aW1lX3QJCQluZXh0X2V2ZW50OworfTsKKworLyoKKyAqIENhbGN1bGF0ZSBhIG11bHRpcGxpY2F0aW9uIGZhY3RvciBmb3Igc2NhbGVkIG1hdGgsIHdoaWNoIGlzIHVzZWQgdG8gY29udmVydAorICogbmFub3NlY29uZHMgYmFzZWQgdmFsdWVzIHRvIGNsb2NrIHRpY2tzOgorICoKKyAqIGNsb2NrX3RpY2tzID0gKG5hbm9zZWNvbmRzICogZmFjdG9yKSA+PiBzaGlmdC4KKyAqCisgKiBkaXZfc2MgaXMgdGhlIHJlYXJyYW5nZWQgZXF1YXRpb24gdG8gY2FsY3VsYXRlIGEgZmFjdG9yIGZyb20gYSBnaXZlbiBjbG9jaworICogdGlja3MgLyBuYW5vc2Vjb25kcyByYXRpbzoKKyAqCisgKiBmYWN0b3IgPSAoY2xvY2tfdGlja3MgPDwgc2hpZnQpIC8gbmFub3NlY29uZHMKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGRpdl9zYyh1bnNpZ25lZCBsb25nIHRpY2tzLCB1bnNpZ25lZCBsb25nIG5zZWMsCisJCQkJICAgaW50IHNoaWZ0KQoreworCXVpbnQ2NF90IHRtcCA9ICgodWludDY0X3QpdGlja3MpIDw8IHNoaWZ0OworCisJZG9fZGl2KHRtcCwgbnNlYyk7CisJcmV0dXJuICh1bnNpZ25lZCBsb25nKSB0bXA7Cit9CisKKy8qIENsb2NrIGV2ZW50IGxheWVyIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY2xvY2tldmVudF9kZWx0YTJucyh1bnNpZ25lZCBsb25nIGxhdGNoLAorCQkJCQkgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0KTsKK2V4dGVybiB2b2lkIGNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworCitleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqb2xkLAorCQkJCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXcpOworZXh0ZXJuCitzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjbG9ja2V2ZW50c19yZXF1ZXN0X2RldmljZSh1bnNpZ25lZCBpbnQgZmVhdHVyZXMsCisJCQkJCQkgICAgICBjcHVtYXNrX3QgY3B1bWFzayk7CitleHRlcm4gdm9pZCBjbG9ja2V2ZW50c19yZWxlYXNlX2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfc2V0X21vZGUoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCSBlbnVtIGNsb2NrX2V2ZW50X21vZGUgbW9kZSk7CitleHRlcm4gaW50IGNsb2NrZXZlbnRzX3JlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpOworZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfdW5yZWdpc3Rlcl9ub3RpZmllcihzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKm5iKTsKK2V4dGVybiBpbnQgY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsCisJCQkJICAgICBrdGltZV90IGV4cGlyZXMsIGt0aW1lX3Qgbm93KTsKKworZXh0ZXJuIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5KHVuc2lnbmVkIGxvbmcgcmVhc29uLCB2b2lkICphcmcpOworCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgY2xvY2tldmVudHNfcmVzdW1lX2V2ZW50cyh2b2lkKSB7IH0KKyNkZWZpbmUgY2xvY2tldmVudHNfbm90aWZ5KHJlYXNvbiwgYXJnKSBkbyB7IH0gd2hpbGUgKDApCisKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaCBiL2luY2x1ZGUvbGludXgvY2xvY2tzb3VyY2UuaAppbmRleCAxNjIyZDIzLi5kYWE0OTQwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Nsb2Nrc291cmNlLmgKKysrIGIvaW5jbHVkZS9saW51eC9jbG9ja3NvdXJjZS5oCkBAIC0xMiwxMSArMTIsMTMgQEAKICNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdGltZXIuaD4KICNpbmNsdWRlIDxhc20vZGl2NjQuaD4KICNpbmNsdWRlIDxhc20vaW8uaD4KIAogLyogY2xvY2tzb3VyY2UgY3ljbGUgYmFzZSB0eXBlICovCiB0eXBlZGVmIHU2NCBjeWNsZV90Oworc3RydWN0IGNsb2Nrc291cmNlOwogCiAvKioKICAqIHN0cnVjdCBjbG9ja3NvdXJjZSAtIGhhcmR3YXJlIGFic3RyYWN0aW9uIGZvciBhIGZyZWUgcnVubmluZyBjb3VudGVyCkBAIC00NCw4ICs0Niw4IEBACiAgKgkJCXN1YnRyYWN0aW9uIG9mIG5vbiA2NCBiaXQgY291bnRlcnMKICAqIEBtdWx0OgkJY3ljbGUgdG8gbmFub3NlY29uZCBtdWx0aXBsaWVyCiAgKiBAc2hpZnQ6CQljeWNsZSB0byBuYW5vc2Vjb25kIGRpdmlzb3IgKHBvd2VyIG9mIHR3bykKLSAqIEB1cGRhdGVfY2FsbGJhY2s6CWNhbGxlZCB3aGVuIHNhZmUgdG8gYWx0ZXIgY2xvY2tzb3VyY2UgdmFsdWVzCi0gKiBAaXNfY29udGludW91czoJZGVmaW5lcyBpZiBjbG9ja3NvdXJjZSBpcyBmcmVlLXJ1bm5pbmcuCisgKiBAZmxhZ3M6CQlmbGFncyBkZXNjcmliaW5nIHNwZWNpYWwgcHJvcGVydGllcworICogQHZyZWFkOgkJdnN5c2NhbGwgYmFzZWQgcmVhZAogICogQGN5Y2xlX2ludGVydmFsOglVc2VkIGludGVybmFsbHkgYnkgdGltZWtlZXBpbmcgY29yZSwgcGxlYXNlIGlnbm9yZS4KICAqIEB4dGltZV9pbnRlcnZhbDoJVXNlZCBpbnRlcm5hbGx5IGJ5IHRpbWVrZWVwaW5nIGNvcmUsIHBsZWFzZSBpZ25vcmUuCiAgKi8KQEAgLTU3LDE1ICs1OSwzMCBAQAogCWN5Y2xlX3QgbWFzazsKIAl1MzIgbXVsdDsKIAl1MzIgc2hpZnQ7Ci0JaW50ICgqdXBkYXRlX2NhbGxiYWNrKSh2b2lkKTsKLQlpbnQgaXNfY29udGludW91czsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWN5Y2xlX3QgKCp2cmVhZCkodm9pZCk7CiAKIAkvKiB0aW1la2VlcGluZyBzcGVjaWZpYyBkYXRhLCBpZ25vcmUgKi8KIAljeWNsZV90IGN5Y2xlX2xhc3QsIGN5Y2xlX2ludGVydmFsOwogCXU2NCB4dGltZV9uc2VjLCB4dGltZV9pbnRlcnZhbDsKIAlzNjQgZXJyb3I7CisKKyNpZmRlZiBDT05GSUdfQ0xPQ0tTT1VSQ0VfV0FUQ0hET0cKKwkvKiBXYXRjaGRvZyByZWxhdGVkIGRhdGEsIHVzZWQgYnkgdGhlIGZyYW1ld29yayAqLworCXN0cnVjdCBsaXN0X2hlYWQgd2RfbGlzdDsKKwljeWNsZV90IHdkX2xhc3Q7CisjZW5kaWYKIH07CiAKKy8qCisgKiBDbG9jayBzb3VyY2UgZmxhZ3MgYml0czo6CisgKi8KKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMJCTB4MDEKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX01VU1RfVkVSSUZZCQkweDAyCisKKyNkZWZpbmUgQ0xPQ0tfU09VUkNFX1dBVENIRE9HCQkJMHgxMAorI2RlZmluZSBDTE9DS19TT1VSQ0VfVkFMSURfRk9SX0hSRVMJCTB4MjAKKwogLyogc2ltcGxpZnkgaW5pdGlhbGl6YXRpb24gb2YgbWFzayBmaWVsZCAqLwogI2RlZmluZSBDTE9DS1NPVVJDRV9NQVNLKGJpdHMpIChjeWNsZV90KShiaXRzPDY0ID8gKCgxVUxMPDxiaXRzKS0xKSA6IC0xKQogCkBAIC0xNzgsOCArMTk1LDE2IEBACiAKIAogLyogdXNlZCB0byBpbnN0YWxsIGEgbmV3IGNsb2Nrc291cmNlICovCi1pbnQgY2xvY2tzb3VyY2VfcmVnaXN0ZXIoc3RydWN0IGNsb2Nrc291cmNlKik7Ci12b2lkIGNsb2Nrc291cmNlX3Jlc2VsZWN0KHZvaWQpOwotc3RydWN0IGNsb2Nrc291cmNlKiBjbG9ja3NvdXJjZV9nZXRfbmV4dCh2b2lkKTsKK2V4dGVybiBpbnQgY2xvY2tzb3VyY2VfcmVnaXN0ZXIoc3RydWN0IGNsb2Nrc291cmNlKik7CitleHRlcm4gc3RydWN0IGNsb2Nrc291cmNlKiBjbG9ja3NvdXJjZV9nZXRfbmV4dCh2b2lkKTsKK2V4dGVybiB2b2lkIGNsb2Nrc291cmNlX2NoYW5nZV9yYXRpbmcoc3RydWN0IGNsb2Nrc291cmNlICpjcywgaW50IHJhdGluZyk7CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19USU1FX1ZTWVNDQUxMCitleHRlcm4gdm9pZCB1cGRhdGVfdnN5c2NhbGwoc3RydWN0IHRpbWVzcGVjICp0cywgc3RydWN0IGNsb2Nrc291cmNlICpjKTsKKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3ZzeXNjYWxsKHN0cnVjdCB0aW1lc3BlYyAqdHMsIHN0cnVjdCBjbG9ja3NvdXJjZSAqYykKK3sKK30KKyNlbmRpZgogCiAjZW5kaWYgLyogX0xJTlVYX0NMT0NLU09VUkNFX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY3B1ZnJlcS5oIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKaW5kZXggN2YwMDhmNi4uMDg5OWUyYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKKysrIGIvaW5jbHVkZS9saW51eC9jcHVmcmVxLmgKQEAgLTg0LDkgKzg0LDYgQEAKICAgICAgICAgdW5zaWduZWQgaW50CQlwb2xpY3k7IC8qIHNlZSBhYm92ZSAqLwogCXN0cnVjdCBjcHVmcmVxX2dvdmVybm9yCSpnb3Zlcm5vcjsgLyogc2VlIGJlbG93ICovCiAKLSAJc3RydWN0IG11dGV4CQlsb2NrOyAgIC8qIENQVSAtPnNldHBvbGljeSBvciAtPnRhcmdldCBtYXkKLQkJCQkJICAgb25seSBiZSBjYWxsZWQgb25jZSBhIHRpbWUgKi8KLQogCXN0cnVjdCB3b3JrX3N0cnVjdAl1cGRhdGU7IC8qIGlmIHVwZGF0ZV9wb2xpY3koKSBuZWVkcyB0byBiZQogCQkJCQkgKiBjYWxsZWQsIGJ1dCB5b3UncmUgaW4gSVJRIGNvbnRleHQgKi8KIApAQCAtMTcyLDExICsxNjksMTYgQEAKIAkJCQkgICB1bnNpZ25lZCBpbnQgcmVsYXRpb24pOwogCiAKLWV4dGVybiBpbnQgY3B1ZnJlcV9kcml2ZXJfZ2V0YXZnKHN0cnVjdCBjcHVmcmVxX3BvbGljeSAqcG9saWN5KTsKK2V4dGVybiBpbnQgX19jcHVmcmVxX2RyaXZlcl9nZXRhdmcoc3RydWN0IGNwdWZyZXFfcG9saWN5ICpwb2xpY3kpOwogCiBpbnQgY3B1ZnJlcV9yZWdpc3Rlcl9nb3Zlcm5vcihzdHJ1Y3QgY3B1ZnJlcV9nb3Zlcm5vciAqZ292ZXJub3IpOwogdm9pZCBjcHVmcmVxX3VucmVnaXN0ZXJfZ292ZXJub3Ioc3RydWN0IGNwdWZyZXFfZ292ZXJub3IgKmdvdmVybm9yKTsKIAoraW50IGxvY2tfcG9saWN5X3J3c2VtX3JlYWQoaW50IGNwdSk7CitpbnQgbG9ja19wb2xpY3lfcndzZW1fd3JpdGUoaW50IGNwdSk7Cit2b2lkIHVubG9ja19wb2xpY3lfcndzZW1fcmVhZChpbnQgY3B1KTsKK3ZvaWQgdW5sb2NrX3BvbGljeV9yd3NlbV93cml0ZShpbnQgY3B1KTsKKwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiAgICAgICAgICAgICAgICAgICAgICBDUFVGUkVRIERSSVZFUiBJTlRFUkZBQ0UgICAgICAgICAgICAgICAgICAgICAqCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2hhcmRpcnEuaCBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCmluZGV4IDYxMjQ3MmEuLjc4MDMwMTQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCisrKyBiL2luY2x1ZGUvbGludXgvaGFyZGlycS5oCkBAIC0xMDYsNyArMTA2LDcgQEAKICAqIGFsd2F5cyBiYWxhbmNlZCwgc28gdGhlIGludGVycnVwdGVkIHZhbHVlIG9mIC0+aGFyZGlycV9jb250ZXh0CiAgKiB3aWxsIGFsd2F5cyBiZSByZXN0b3JlZC4KICAqLwotI2RlZmluZSBpcnFfZW50ZXIoKQkJCQkJXAorI2RlZmluZSBfX2lycV9lbnRlcigpCQkJCQlcCiAJZG8gewkJCQkJCVwKIAkJYWNjb3VudF9zeXN0ZW1fdnRpbWUoY3VycmVudCk7CQlcCiAJCWFkZF9wcmVlbXB0X2NvdW50KEhBUkRJUlFfT0ZGU0VUKTsJXApAQCAtMTE0LDYgKzExNCwxMSBAQAogCX0gd2hpbGUgKDApCiAKIC8qCisgKiBFbnRlciBpcnEgY29udGV4dCAob24gTk9fSFosIHVwZGF0ZSBqaWZmaWVzKToKKyAqLworZXh0ZXJuIHZvaWQgaXJxX2VudGVyKHZvaWQpOworCisvKgogICogRXhpdCBpcnEgY29udGV4dCB3aXRob3V0IHByb2Nlc3Npbmcgc29mdGlycXM6CiAgKi8KICNkZWZpbmUgX19pcnFfZXhpdCgpCQkJCQlcCkBAIC0xMjgsNyArMTMzLDcgQEAKICAqLwogZXh0ZXJuIHZvaWQgaXJxX2V4aXQodm9pZCk7CiAKLSNkZWZpbmUgbm1pX2VudGVyKCkJCWRvIHsgbG9ja2RlcF9vZmYoKTsgaXJxX2VudGVyKCk7IH0gd2hpbGUgKDApCisjZGVmaW5lIG5taV9lbnRlcigpCQlkbyB7IGxvY2tkZXBfb2ZmKCk7IF9faXJxX2VudGVyKCk7IH0gd2hpbGUgKDApCiAjZGVmaW5lIG5taV9leGl0KCkJCWRvIHsgX19pcnFfZXhpdCgpOyBsb2NrZGVwX29uKCk7IH0gd2hpbGUgKDApCiAKICNlbmRpZiAvKiBMSU5VWF9IQVJESVJRX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaHJ0aW1lci5oIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKaW5kZXggZmNhOTMwMi4uMzdmOTI3OSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9ocnRpbWVyLmgKQEAgLTIxLDIyICsyMSw3MiBAQAogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC93YWl0Lmg+CiAKK3N0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2U7CitzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZTsKKwogLyoKICAqIE1vZGUgYXJndW1lbnRzIG9mIHh4eF9ocnRpbWVyIGZ1bmN0aW9uczoKICAqLwogZW51bSBocnRpbWVyX21vZGUgewotCUhSVElNRVJfQUJTLAkvKiBUaW1lIHZhbHVlIGlzIGFic29sdXRlICovCi0JSFJUSU1FUl9SRUwsCS8qIFRpbWUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gbm93ICovCisJSFJUSU1FUl9NT0RFX0FCUywJLyogVGltZSB2YWx1ZSBpcyBhYnNvbHV0ZSAqLworCUhSVElNRVJfTU9ERV9SRUwsCS8qIFRpbWUgdmFsdWUgaXMgcmVsYXRpdmUgdG8gbm93ICovCiB9OwogCisvKgorICogUmV0dXJuIHZhbHVlcyBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uCisgKi8KIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHsKLQlIUlRJTUVSX05PUkVTVEFSVCwKLQlIUlRJTUVSX1JFU1RBUlQsCisJSFJUSU1FUl9OT1JFU1RBUlQsCS8qIFRpbWVyIGlzIG5vdCByZXN0YXJ0ZWQgKi8KKwlIUlRJTUVSX1JFU1RBUlQsCS8qIFRpbWVyIG11c3QgYmUgcmVzdGFydGVkICovCiB9OwogCi0jZGVmaW5lIEhSVElNRVJfSU5BQ1RJVkUJKCh2b2lkICopMVVMKQorLyoKKyAqIGhydGltZXIgY2FsbGJhY2sgbW9kZXM6CisgKgorICoJSFJUSU1FUl9DQl9TT0ZUSVJROgkJQ2FsbGJhY2sgbXVzdCBydW4gaW4gc29mdGlycSBjb250ZXh0CisgKglIUlRJTUVSX0NCX0lSUVNBRkU6CQlDYWxsYmFjayBtYXkgcnVuIGluIGhhcmRpcnEgY29udGV4dAorICoJSFJUSU1FUl9DQl9JUlFTQUZFX05PX1JFU1RBUlQ6CUNhbGxiYWNrIG1heSBydW4gaW4gaGFyZGlycSBjb250ZXh0IGFuZAorICoJCQkJCWRvZXMgbm90IHJlc3RhcnQgdGhlIHRpbWVyCisgKglIUlRJTUVSX0NCX0lSUVNBRkVfTk9fU09GVElSUToJQ2FsbGJhY2sgbXVzdCBydW4gaW4gc29mdGlycSBjb250ZXh0CisgKgkJCQkJU3BlY2lhbCBtb2RlIGZvciB0aWNrIGVtdWx0YXRpb24KKyAqLworZW51bSBocnRpbWVyX2NiX21vZGUgeworCUhSVElNRVJfQ0JfU09GVElSUSwKKwlIUlRJTUVSX0NCX0lSUVNBRkUsCisJSFJUSU1FUl9DQl9JUlFTQUZFX05PX1JFU1RBUlQsCisJSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlEsCit9OwogCi1zdHJ1Y3QgaHJ0aW1lcl9iYXNlOworLyoKKyAqIFZhbHVlcyB0byB0cmFjayBzdGF0ZSBvZiB0aGUgdGltZXIKKyAqCisgKiBQb3NzaWJsZSBzdGF0ZXM6CisgKgorICogMHgwMAkJaW5hY3RpdmUKKyAqIDB4MDEJCWVucXVldWVkIGludG8gcmJ0cmVlCisgKiAweDAyCQljYWxsYmFjayBmdW5jdGlvbiBydW5uaW5nCisgKiAweDA0CQljYWxsYmFjayBwZW5kaW5nIChoaWdoIHJlc29sdXRpb24gbW9kZSkKKyAqCisgKiBTcGVjaWFsIGNhc2U6CisgKiAweDAzCQljYWxsYmFjayBmdW5jdGlvbiBydW5uaW5nIGFuZCBlbnF1ZXVlZAorICoJCSh3YXMgcmVxdWV1ZWQgb24gYW5vdGhlciBDUFUpCisgKiBUaGUgImNhbGxiYWNrIGZ1bmN0aW9uIHJ1bm5pbmcgYW5kIGVucXVldWVkIiBzdGF0dXMgaXMgb25seSBwb3NzaWJsZSBvbgorICogU01QLiBJdCBoYXBwZW5zIGZvciBleGFtcGxlIHdoZW4gYSBwb3NpeCB0aW1lciBleHBpcmVkIGFuZCB0aGUgY2FsbGJhY2sKKyAqIHF1ZXVlZCBhIHNpZ25hbC4gQmV0d2VlbiBkcm9wcGluZyB0aGUgbG9jayB3aGljaCBwcm90ZWN0cyB0aGUgcG9zaXggdGltZXIKKyAqIGFuZCByZWFjcXVpcmluZyB0aGUgYmFzZSBsb2NrIG9mIHRoZSBocnRpbWVyLCBhbm90aGVyIENQVSBjYW4gZGVsaXZlciB0aGUKKyAqIHNpZ25hbCBhbmQgcmVhcm0gdGhlIHRpbWVyLiBXZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBjYWxsYmFjayBydW5uaW5nIHN0YXRlLAorICogYXMgb3RoZXJ3aXNlIHRoZSB0aW1lciBjb3VsZCBiZSByZW1vdmVkIGJlZm9yZSB0aGUgc29mdGlycSBjb2RlIGZpbmlzaGVzIHRoZQorICogdGhlIGhhbmRsaW5nIG9mIHRoZSB0aW1lci4KKyAqCisgKiBUaGUgSFJUSU1FUl9TVEFURV9FTlFVRVVFIGJpdCBpcyBhbHdheXMgb3InZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgdG8KKyAqIHByZXNlcnZlIHRoZSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLIGJpdCBpbiB0aGUgYWJvdmUgc2NlbmFyaW8uCisgKgorICogQWxsIHN0YXRlIHRyYW5zaXRpb25zIGFyZSBwcm90ZWN0ZWQgYnkgY3B1X2Jhc2UtPmxvY2suCisgKi8KKyNkZWZpbmUgSFJUSU1FUl9TVEFURV9JTkFDVElWRQkweDAwCisjZGVmaW5lIEhSVElNRVJfU1RBVEVfRU5RVUVVRUQJMHgwMQorI2RlZmluZSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLCTB4MDIKKyNkZWZpbmUgSFJUSU1FUl9TVEFURV9QRU5ESU5HCTB4MDQKIAogLyoqCiAgKiBzdHJ1Y3QgaHJ0aW1lciAtIHRoZSBiYXNpYyBocnRpbWVyIHN0cnVjdHVyZQpAQCAtNDYsMTQgKzk2LDM0IEBACiAgKgkJd2hpY2ggdGhlIHRpbWVyIGlzIGJhc2VkLgogICogQGZ1bmN0aW9uOgl0aW1lciBleHBpcnkgY2FsbGJhY2sgZnVuY3Rpb24KICAqIEBiYXNlOglwb2ludGVyIHRvIHRoZSB0aW1lciBiYXNlIChwZXIgY3B1IGFuZCBwZXIgY2xvY2spCisgKiBAc3RhdGU6CXN0YXRlIGluZm9ybWF0aW9uIChTZWUgYml0IHZhbHVlcyBhYm92ZSkKKyAqIEBjYl9tb2RlOgloaWdoIHJlc29sdXRpb24gdGltZXIgZmVhdHVyZSB0byBzZWxlY3QgdGhlIGNhbGxiYWNrIGV4ZWN1dGlvbgorICoJCSBtb2RlCisgKiBAY2JfZW50cnk6CWxpc3QgaGVhZCB0byBlbnF1ZXVlIGFuIGV4cGlyZWQgdGltZXIgaW50byB0aGUgY2FsbGJhY2sgbGlzdAorICogQHN0YXJ0X3NpdGU6CXRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIHNpdGUgd2hlcmUgdGhlIHRpbWVyCisgKgkJd2FzIHN0YXJ0ZWQKKyAqIEBzdGFydF9jb21tOiB0aW1lciBzdGF0aXN0aWNzIGZpZWxkIHRvIHN0b3JlIHRoZSBuYW1lIG9mIHRoZSBwcm9jZXNzIHdoaWNoCisgKgkJc3RhcnRlZCB0aGUgdGltZXIKKyAqIEBzdGFydF9waWQ6IHRpbWVyIHN0YXRpc3RpY3MgZmllbGQgdG8gc3RvcmUgdGhlIHBpZCBvZiB0aGUgdGFzayB3aGljaAorICoJCXN0YXJ0ZWQgdGhlIHRpbWVyCiAgKgotICogVGhlIGhydGltZXIgc3RydWN0dXJlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgaW5pdF9ocnRpbWVyXyNDTE9DS1RZUEUoKQorICogVGhlIGhydGltZXIgc3RydWN0dXJlIG11c3QgYmUgaW5pdGlhbGl6ZWQgYnkgaHJ0aW1lcl9pbml0KCkKICAqLwogc3RydWN0IGhydGltZXIgewotCXN0cnVjdCByYl9ub2RlCQlub2RlOwotCWt0aW1lX3QJCQlleHBpcmVzOwotCWludAkJCSgqZnVuY3Rpb24pKHN0cnVjdCBocnRpbWVyICopOwotCXN0cnVjdCBocnRpbWVyX2Jhc2UJKmJhc2U7CisJc3RydWN0IHJiX25vZGUJCQlub2RlOworCWt0aW1lX3QJCQkJZXhwaXJlczsKKwllbnVtIGhydGltZXJfcmVzdGFydAkJKCpmdW5jdGlvbikoc3RydWN0IGhydGltZXIgKik7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZQkqYmFzZTsKKwl1bnNpZ25lZCBsb25nCQkJc3RhdGU7CisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCWVudW0gaHJ0aW1lcl9jYl9tb2RlCQljYl9tb2RlOworCXN0cnVjdCBsaXN0X2hlYWQJCWNiX2VudHJ5OworI2VuZGlmCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJdm9pZAkJCQkqc3RhcnRfc2l0ZTsKKwljaGFyCQkJCXN0YXJ0X2NvbW1bMTZdOworCWludAkJCQlzdGFydF9waWQ7CisjZW5kaWYKIH07CiAKIC8qKgpAQCAtNzAsMzcgKzE0MCwxMTQgQEAKIAogLyoqCiAgKiBzdHJ1Y3QgaHJ0aW1lcl9iYXNlIC0gdGhlIHRpbWVyIGJhc2UgZm9yIGEgc3BlY2lmaWMgY2xvY2sKLSAqIEBpbmRleDoJCWNsb2NrIHR5cGUgaW5kZXggZm9yIHBlcl9jcHUgc3VwcG9ydCB3aGVuIG1vdmluZyBhIHRpbWVyCi0gKgkJCXRvIGEgYmFzZSBvbiBhbm90aGVyIGNwdS4KLSAqIEBsb2NrOgkJbG9jayBwcm90ZWN0aW5nIHRoZSBiYXNlIGFuZCBhc3NvY2lhdGVkIHRpbWVycworICogQGluZGV4OgkJY2xvY2sgdHlwZSBpbmRleCBmb3IgcGVyX2NwdSBzdXBwb3J0IHdoZW4gbW92aW5nIGEKKyAqCQkJdGltZXIgdG8gYSBiYXNlIG9uIGFub3RoZXIgY3B1LgogICogQGFjdGl2ZToJCXJlZCBibGFjayB0cmVlIHJvb3Qgbm9kZSBmb3IgdGhlIGFjdGl2ZSB0aW1lcnMKICAqIEBmaXJzdDoJCXBvaW50ZXIgdG8gdGhlIHRpbWVyIG5vZGUgd2hpY2ggZXhwaXJlcyBmaXJzdAogICogQHJlc29sdXRpb246CQl0aGUgcmVzb2x1dGlvbiBvZiB0aGUgY2xvY2ssIGluIG5hbm9zZWNvbmRzCiAgKiBAZ2V0X3RpbWU6CQlmdW5jdGlvbiB0byByZXRyaWV2ZSB0aGUgY3VycmVudCB0aW1lIG9mIHRoZSBjbG9jawogICogQGdldF9zb2Z0aXJxX3RpbWU6CWZ1bmN0aW9uIHRvIHJldHJpZXZlIHRoZSBjdXJyZW50IHRpbWUgZnJvbSB0aGUgc29mdGlycQotICogQGN1cnJfdGltZXI6CQl0aGUgdGltZXIgd2hpY2ggaXMgZXhlY3V0aW5nIGEgY2FsbGJhY2sgcmlnaHQgbm93CiAgKiBAc29mdGlycV90aW1lOgl0aGUgdGltZSB3aGVuIHJ1bm5pbmcgdGhlIGhydGltZXIgcXVldWUgaW4gdGhlIHNvZnRpcnEKLSAqIEBsb2NrX2tleToJCXRoZSBsb2NrX2NsYXNzX2tleSBmb3IgdXNlIHdpdGggbG9ja2RlcAorICogQGNiX3BlbmRpbmc6CQlsaXN0IG9mIHRpbWVycyB3aGVyZSB0aGUgY2FsbGJhY2sgaXMgcGVuZGluZworICogQG9mZnNldDoJCW9mZnNldCBvZiB0aGlzIGNsb2NrIHRvIHRoZSBtb25vdG9uaWMgYmFzZQorICogQHJlcHJvZ3JhbToJCWZ1bmN0aW9uIHRvIHJlcHJvZ3JhbSB0aGUgdGltZXIgZXZlbnQKICAqLwotc3RydWN0IGhydGltZXJfYmFzZSB7CitzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlIHsKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZQkqY3B1X2Jhc2U7CiAJY2xvY2tpZF90CQlpbmRleDsKLQlzcGlubG9ja190CQlsb2NrOwogCXN0cnVjdCByYl9yb290CQlhY3RpdmU7CiAJc3RydWN0IHJiX25vZGUJCSpmaXJzdDsKIAlrdGltZV90CQkJcmVzb2x1dGlvbjsKIAlrdGltZV90CQkJKCpnZXRfdGltZSkodm9pZCk7CiAJa3RpbWVfdAkJCSgqZ2V0X3NvZnRpcnFfdGltZSkodm9pZCk7Ci0Jc3RydWN0IGhydGltZXIJCSpjdXJyX3RpbWVyOwogCWt0aW1lX3QJCQlzb2Z0aXJxX3RpbWU7Ci0Jc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGxvY2tfa2V5OworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlrdGltZV90CQkJb2Zmc2V0OworCWludAkJCSgqcmVwcm9ncmFtKShzdHJ1Y3QgaHJ0aW1lciAqdCwKKwkJCQkJICAgICBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiLAorCQkJCQkgICAgIGt0aW1lX3Qgbik7CisjZW5kaWYKIH07CiAKKyNkZWZpbmUgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVMgMgorCisvKgorICogc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgLSB0aGUgcGVyIGNwdSBjbG9jayBiYXNlcworICogQGxvY2s6CQlsb2NrIHByb3RlY3RpbmcgdGhlIGJhc2UgYW5kIGFzc29jaWF0ZWQgY2xvY2sgYmFzZXMKKyAqCQkJYW5kIHRpbWVycworICogQGxvY2tfa2V5OgkJdGhlIGxvY2tfY2xhc3Nfa2V5IGZvciB1c2Ugd2l0aCBsb2NrZGVwCisgKiBAY2xvY2tfYmFzZToJCWFycmF5IG9mIGNsb2NrIGJhc2VzIGZvciB0aGlzIGNwdQorICogQGN1cnJfdGltZXI6CQl0aGUgdGltZXIgd2hpY2ggaXMgZXhlY3V0aW5nIGEgY2FsbGJhY2sgcmlnaHQgbm93CisgKiBAZXhwaXJlc19uZXh0OglhYnNvbHV0ZSB0aW1lIG9mIHRoZSBuZXh0IGV2ZW50IHdoaWNoIHdhcyBzY2hlZHVsZWQKKyAqCQkJdmlhIGNsb2NrX3NldF9uZXh0X2V2ZW50KCkKKyAqIEBocmVzX2FjdGl2ZToJU3RhdGUgb2YgaGlnaCByZXNvbHV0aW9uIG1vZGUKKyAqIEBjaGVja19jbG9ja3M6CUluZGljdGF0b3IsIHdoZW4gc2V0IGV2YWx1YXRlIHRpbWUgc291cmNlIGFuZCBjbG9jaworICoJCQlldmVudCBkZXZpY2VzIHdoZXRoZXIgaGlnaCByZXNvbHV0aW9uIG1vZGUgY2FuIGJlCisgKgkJCWFjdGl2YXRlZC4KKyAqIEBjYl9wZW5kaW5nOgkJRXhwaXJlZCB0aW1lcnMgYXJlIG1vdmVkIGZyb20gdGhlIHJidHJlZSB0byB0aGlzCisgKgkJCWxpc3QgaW4gdGhlIHRpbWVyIGludGVycnVwdC4gVGhlIGxpc3QgaXMgcHJvY2Vzc2VkCisgKgkJCWluIHRoZSBzb2Z0aXJxLgorICogQG5yX2V2ZW50czoJCVRvdGFsIG51bWJlciBvZiB0aW1lciBpbnRlcnJ1cHQgZXZlbnRzCisgKi8KK3N0cnVjdCBocnRpbWVyX2NwdV9iYXNlIHsKKwlzcGlubG9ja190CQkJbG9jazsKKwlzdHJ1Y3QgbG9ja19jbGFzc19rZXkJCWxvY2tfa2V5OworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UJY2xvY2tfYmFzZVtIUlRJTUVSX01BWF9DTE9DS19CQVNFU107CisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCWt0aW1lX3QJCQkJZXhwaXJlc19uZXh0OworCWludAkJCQlocmVzX2FjdGl2ZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkCQljYl9wZW5kaW5nOworCXVuc2lnbmVkIGxvbmcJCQlucl9ldmVudHM7CisjZW5kaWYKK307CisKKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCitzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlOworCitleHRlcm4gdm9pZCBjbG9ja193YXNfc2V0KHZvaWQpOworZXh0ZXJuIHZvaWQgaHJ0aW1lcl9pbnRlcnJ1cHQoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KTsKKworLyoKKyAqIEluIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIHRoZSB0aW1lIHJlZmVyZW5jZSBtdXN0IGJlIHJlYWQgYWNjdXJhdGUKKyAqLworc3RhdGljIGlubGluZSBrdGltZV90IGhydGltZXJfY2JfZ2V0X3RpbWUoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXJldHVybiB0aW1lci0+YmFzZS0+Z2V0X3RpbWUoKTsKK30KKworLyoKKyAqIFRoZSByZXNvbHV0aW9uIG9mIHRoZSBjbG9ja3MuIFRoZSByZXNvbHV0aW9uIHZhbHVlIGlzIHJldHVybmVkIGluCisgKiB0aGUgY2xvY2tfZ2V0cmVzKCkgc3lzdGVtIGNhbGwgdG8gZ2l2ZSBhcHBsaWNhdGlvbiBwcm9ncmFtbWVycyBhbgorICogaWRlYSBvZiB0aGUgKGluKWFjY3VyYWN5IG9mIHRpbWVycy4gVGltZXIgdmFsdWVzIGFyZSByb3VuZGVkIHVwIHRvCisgKiB0aGlzIHJlc29sdXRpb24gdmFsdWVzLgorICovCisjIGRlZmluZSBLVElNRV9ISUdIX1JFUwkJKGt0aW1lX3QpIHsgLnR2NjQgPSAxIH0KKyMgZGVmaW5lIEtUSU1FX01PTk9UT05JQ19SRVMJS1RJTUVfSElHSF9SRVMKKworI2Vsc2UKKworIyBkZWZpbmUgS1RJTUVfTU9OT1RPTklDX1JFUwlLVElNRV9MT1dfUkVTCisKIC8qCiAgKiBjbG9ja193YXNfc2V0KCkgaXMgYSBOT1AgZm9yIG5vbi0gaGlnaC1yZXNvbHV0aW9uIHN5c3RlbXMuIFRoZQogICogdGltZS1zb3J0ZWQgb3JkZXIgZ3VhcmFudGVlcyB0aGF0IGEgdGltZXIgZG9lcyBub3QgZXhwaXJlIGVhcmx5IGFuZAogICogaXMgZXhwaXJlZCBpbiB0aGUgbmV4dCBzb2Z0aXJxIHdoZW4gdGhlIGNsb2NrIHdhcyBhZHZhbmNlZC4KICAqLwotI2RlZmluZSBjbG9ja193YXNfc2V0KCkJCWRvIHsgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9ja193YXNfc2V0KHZvaWQpIHsgfQorCisvKgorICogSW4gbm9uIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIHRoZSB0aW1lIHJlZmVyZW5jZSBpcyB0YWtlbiBmcm9tCisgKiB0aGUgYmFzZSBzb2Z0aXJxIHRpbWUgdmFyaWFibGUuCisgKi8KK3N0YXRpYyBpbmxpbmUga3RpbWVfdCBocnRpbWVyX2NiX2dldF90aW1lKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gdGltZXItPmJhc2UtPnNvZnRpcnFfdGltZTsKK30KKworI2VuZGlmCisKK2V4dGVybiBrdGltZV90IGt0aW1lX2dldCh2b2lkKTsKK2V4dGVybiBrdGltZV90IGt0aW1lX2dldF9yZWFsKHZvaWQpOwogCiAvKiBFeHBvcnRlZCB0aW1lciBmdW5jdGlvbnM6ICovCiAKQEAgLTExNCwxOSArMjYxLDMzIEBACiBleHRlcm4gaW50IGhydGltZXJfY2FuY2VsKHN0cnVjdCBocnRpbWVyICp0aW1lcik7CiBleHRlcm4gaW50IGhydGltZXJfdHJ5X3RvX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpOwogCi0jZGVmaW5lIGhydGltZXJfcmVzdGFydCh0aW1lcikgaHJ0aW1lcl9zdGFydCgodGltZXIpLCAodGltZXIpLT5leHBpcmVzLCBIUlRJTUVSX0FCUykKK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfcmVzdGFydChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJcmV0dXJuIGhydGltZXJfc3RhcnQodGltZXIsIHRpbWVyLT5leHBpcmVzLCBIUlRJTUVSX01PREVfQUJTKTsKK30KIAogLyogUXVlcnkgdGltZXJzOiAqLwogZXh0ZXJuIGt0aW1lX3QgaHJ0aW1lcl9nZXRfcmVtYWluaW5nKGNvbnN0IHN0cnVjdCBocnRpbWVyICp0aW1lcik7CiBleHRlcm4gaW50IGhydGltZXJfZ2V0X3Jlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApOwogCi0jaWZkZWYgQ09ORklHX05PX0lETEVfSFoKIGV4dGVybiBrdGltZV90IGhydGltZXJfZ2V0X25leHRfZXZlbnQodm9pZCk7Ci0jZW5kaWYKIAorLyoKKyAqIEEgdGltZXIgaXMgYWN0aXZlLCB3aGVuIGl0IGlzIGVucXVldWVkIGludG8gdGhlIHJidHJlZSBvciB0aGUgY2FsbGJhY2sKKyAqIGZ1bmN0aW9uIGlzIHJ1bm5pbmcuCisgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfYWN0aXZlKGNvbnN0IHN0cnVjdCBocnRpbWVyICp0aW1lcikKIHsKLQlyZXR1cm4gcmJfcGFyZW50KCZ0aW1lci0+bm9kZSkgIT0gJnRpbWVyLT5ub2RlOworCXJldHVybiB0aW1lci0+c3RhdGUgIT0gSFJUSU1FUl9TVEFURV9JTkFDVElWRTsKK30KKworLyoKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjaywgd2hldGhlciB0aGUgdGltZXIgaXMgb24gb25lIG9mIHRoZSBxdWV1ZXMKKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9pc19xdWV1ZWQoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXJldHVybiB0aW1lci0+c3RhdGUgJgorCQkoSFJUSU1FUl9TVEFURV9FTlFVRVVFRCB8IEhSVElNRVJfU1RBVEVfUEVORElORyk7CiB9CiAKIC8qIEZvcndhcmQgYSBocnRpbWVyIHNvIGl0IGV4cGlyZXMgYWZ0ZXIgbm93OiAqLwpAQCAtMTQ5LDQgKzMxMCw1MyBAQAogLyogQm9vdHVwIGluaXRpYWxpemF0aW9uOiAqLwogZXh0ZXJuIHZvaWQgX19pbml0IGhydGltZXJzX2luaXQodm9pZCk7CiAKKyNpZiBCSVRTX1BFUl9MT05HIDwgNjQKK2V4dGVybiB1bnNpZ25lZCBsb25nIGt0aW1lX2Rpdm5zKGNvbnN0IGt0aW1lX3Qga3QsIHM2NCBkaXYpOworI2Vsc2UgLyogQklUU19QRVJfTE9ORyA8IDY0ICovCisjIGRlZmluZSBrdGltZV9kaXZucyhrdCwgZGl2KQkJKHVuc2lnbmVkIGxvbmcpKChrdCkudHY2NCAvIChkaXYpKQorI2VuZGlmCisKKy8qIFNob3cgcGVuZGluZyB0aW1lcnM6ICovCitleHRlcm4gdm9pZCBzeXNycV90aW1lcl9saXN0X3Nob3codm9pZCk7CisKKy8qCisgKiBUaW1lci1zdGF0aXN0aWNzIGluZm86CisgKi8KKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKworZXh0ZXJuIHZvaWQgdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzKHZvaWQgKnRpbWVyLCBwaWRfdCBwaWQsIHZvaWQgKnN0YXJ0ZiwKKwkJCQkgICAgIHZvaWQgKnRpbWVyZiwgY2hhciAqIGNvbW0pOworCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwl0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModGltZXIsIHRpbWVyLT5zdGFydF9waWQsIHRpbWVyLT5zdGFydF9zaXRlLAorCQkJCSB0aW1lci0+ZnVuY3Rpb24sIHRpbWVyLT5zdGFydF9jb21tKTsKK30KKworZXh0ZXJuIHZvaWQgX190aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCBocnRpbWVyICp0aW1lciwKKwkJCQkJCSB2b2lkICphZGRyKTsKKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2hydGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCV9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyh0aW1lciwgX19idWlsdGluX3JldHVybl9hZGRyZXNzKDApKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2hydGltZXJfY2xlYXJfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJdGltZXItPnN0YXJ0X3NpdGUgPSBOVUxMOworfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19hY2NvdW50X2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c19ocnRpbWVyX2NsZWFyX3N0YXJ0X2luZm8oc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworfQorI2VuZGlmCisKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggNWE4YmEwYi4uZTVlYTE0MSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC00Miw2ICs0Miw4IEBACiAgKiBJUlFGX1NIQVJFRCAtIGFsbG93IHNoYXJpbmcgdGhlIGlycSBhbW9uZyBzZXZlcmFsIGRldmljZXMKICAqIElSUUZfUFJPQkVfU0hBUkVEIC0gc2V0IGJ5IGNhbGxlcnMgd2hlbiB0aGV5IGV4cGVjdCBzaGFyaW5nIG1pc21hdGNoZXMgdG8gb2NjdXIKICAqIElSUUZfVElNRVIgLSBGbGFnIHRvIG1hcmsgdGhpcyBpbnRlcnJ1cHQgYXMgdGltZXIgaW50ZXJydXB0CisgKiBJUlFGX1BFUkNQVSAtIEludGVycnVwdCBpcyBwZXIgY3B1CisgKiBJUlFGX05PQkFMQU5DSU5HIC0gRmxhZyB0byBleGNsdWRlIHRoaXMgaW50ZXJydXB0IGZyb20gaXJxIGJhbGFuY2luZwogICovCiAjZGVmaW5lIElSUUZfRElTQUJMRUQJCTB4MDAwMDAwMjAKICNkZWZpbmUgSVJRRl9TQU1QTEVfUkFORE9NCTB4MDAwMDAwNDAKQEAgLTQ5LDYgKzUxLDcgQEAKICNkZWZpbmUgSVJRRl9QUk9CRV9TSEFSRUQJMHgwMDAwMDEwMAogI2RlZmluZSBJUlFGX1RJTUVSCQkweDAwMDAwMjAwCiAjZGVmaW5lIElSUUZfUEVSQ1BVCQkweDAwMDAwNDAwCisjZGVmaW5lIElSUUZfTk9CQUxBTkNJTkcJMHgwMDAwMDgwMAogCiAvKgogICogTWlncmF0aW9uIGhlbHBlcnMuIFNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbiAxLzIwMDcKQEAgLTIzOSw2ICsyNDIsOSBAQAogCUJMT0NLX1NPRlRJUlEsCiAJVEFTS0xFVF9TT0ZUSVJRLAogCVNDSEVEX1NPRlRJUlEsCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCUhSVElNRVJfU09GVElSUSwKKyNlbmRpZgogfTsKIAogLyogc29mdGlycSBtYXNrIGFuZCBhY3RpdmUgZmllbGRzIG1vdmVkIHRvIGlycV9jcHVzdGF0X3QgaW4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IDU1MDRiNjcuLjE5MzlkNDIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnEuaApAQCAtMzEsNyArMzEsNyBAQAogLyoKICAqIElSUSBsaW5lIHN0YXR1cy4KICAqCi0gKiBCaXRzIDAtMTYgYXJlIHJlc2VydmVkIGZvciB0aGUgSVJRRl8qIGJpdHMgaW4gbGludXgvaW50ZXJydXB0LmgKKyAqIEJpdHMgMC03IGFyZSByZXNlcnZlZCBmb3IgdGhlIElSUUZfKiBiaXRzIGluIGxpbnV4L2ludGVycnVwdC5oCiAgKgogICogSVJRIHR5cGVzCiAgKi8KQEAgLTQ1LDI4ICs0NSwzMCBAQAogI2RlZmluZSBJUlFfVFlQRV9QUk9CRQkJMHgwMDAwMDAxMAkvKiBQcm9iaW5nIGluIHByb2dyZXNzICovCiAKIC8qIEludGVybmFsIGZsYWdzICovCi0jZGVmaW5lIElSUV9JTlBST0dSRVNTCQkweDAwMDEwMDAwCS8qIElSUSBoYW5kbGVyIGFjdGl2ZSAtIGRvIG5vdCBlbnRlciEgKi8KLSNkZWZpbmUgSVJRX0RJU0FCTEVECQkweDAwMDIwMDAwCS8qIElSUSBkaXNhYmxlZCAtIGRvIG5vdCBlbnRlciEgKi8KLSNkZWZpbmUgSVJRX1BFTkRJTkcJCTB4MDAwNDAwMDAJLyogSVJRIHBlbmRpbmcgLSByZXBsYXkgb24gZW5hYmxlICovCi0jZGVmaW5lIElSUV9SRVBMQVkJCTB4MDAwODAwMDAJLyogSVJRIGhhcyBiZWVuIHJlcGxheWVkIGJ1dCBub3QgYWNrZWQgeWV0ICovCi0jZGVmaW5lIElSUV9BVVRPREVURUNUCQkweDAwMTAwMDAwCS8qIElSUSBpcyBiZWluZyBhdXRvZGV0ZWN0ZWQgKi8KLSNkZWZpbmUgSVJRX1dBSVRJTkcJCTB4MDAyMDAwMDAJLyogSVJRIG5vdCB5ZXQgc2VlbiAtIGZvciBhdXRvZGV0ZWN0aW9uICovCi0jZGVmaW5lIElSUV9MRVZFTAkJMHgwMDQwMDAwMAkvKiBJUlEgbGV2ZWwgdHJpZ2dlcmVkICovCi0jZGVmaW5lIElSUV9NQVNLRUQJCTB4MDA4MDAwMDAJLyogSVJRIG1hc2tlZCAtIHNob3VsZG4ndCBiZSBzZWVuIGFnYWluICovCi0jZGVmaW5lIElSUV9QRVJfQ1BVCQkweDAxMDAwMDAwCS8qIElSUSBpcyBwZXIgQ1BVICovCisjZGVmaW5lIElSUV9JTlBST0dSRVNTCQkweDAwMDAwMTAwCS8qIElSUSBoYW5kbGVyIGFjdGl2ZSAtIGRvIG5vdCBlbnRlciEgKi8KKyNkZWZpbmUgSVJRX0RJU0FCTEVECQkweDAwMDAwMjAwCS8qIElSUSBkaXNhYmxlZCAtIGRvIG5vdCBlbnRlciEgKi8KKyNkZWZpbmUgSVJRX1BFTkRJTkcJCTB4MDAwMDA0MDAJLyogSVJRIHBlbmRpbmcgLSByZXBsYXkgb24gZW5hYmxlICovCisjZGVmaW5lIElSUV9SRVBMQVkJCTB4MDAwMDA4MDAJLyogSVJRIGhhcyBiZWVuIHJlcGxheWVkIGJ1dCBub3QgYWNrZWQgeWV0ICovCisjZGVmaW5lIElSUV9BVVRPREVURUNUCQkweDAwMDAxMDAwCS8qIElSUSBpcyBiZWluZyBhdXRvZGV0ZWN0ZWQgKi8KKyNkZWZpbmUgSVJRX1dBSVRJTkcJCTB4MDAwMDIwMDAJLyogSVJRIG5vdCB5ZXQgc2VlbiAtIGZvciBhdXRvZGV0ZWN0aW9uICovCisjZGVmaW5lIElSUV9MRVZFTAkJMHgwMDAwNDAwMAkvKiBJUlEgbGV2ZWwgdHJpZ2dlcmVkICovCisjZGVmaW5lIElSUV9NQVNLRUQJCTB4MDAwMDgwMDAJLyogSVJRIG1hc2tlZCAtIHNob3VsZG4ndCBiZSBzZWVuIGFnYWluICovCisjZGVmaW5lIElSUV9QRVJfQ1BVCQkweDAwMDEwMDAwCS8qIElSUSBpcyBwZXIgQ1BVICovCisjZGVmaW5lIElSUV9OT1BST0JFCQkweDAwMDIwMDAwCS8qIElSUSBpcyBub3QgdmFsaWQgZm9yIHByb2JpbmcgKi8KKyNkZWZpbmUgSVJRX05PUkVRVUVTVAkJMHgwMDA0MDAwMAkvKiBJUlEgY2Fubm90IGJlIHJlcXVlc3RlZCAqLworI2RlZmluZSBJUlFfTk9BVVRPRU4JCTB4MDAwODAwMDAJLyogSVJRIHdpbGwgbm90IGJlIGVuYWJsZWQgb24gcmVxdWVzdCBpcnEgKi8KKyNkZWZpbmUgSVJRX1dBS0VVUAkJMHgwMDEwMDAwMAkvKiBJUlEgdHJpZ2dlcnMgc3lzdGVtIHdha2V1cCAqLworI2RlZmluZSBJUlFfTU9WRV9QRU5ESU5HCTB4MDAyMDAwMDAJLyogbmVlZCB0byByZS10YXJnZXQgSVJRIGRlc3RpbmF0aW9uICovCisjZGVmaW5lIElSUV9OT19CQUxBTkNJTkcJMHgwMDQwMDAwMAkvKiBJUlEgaXMgZXhjbHVkZWQgZnJvbSBiYWxhbmNpbmcgKi8KKwogI2lmZGVmIENPTkZJR19JUlFfUEVSX0NQVQogIyBkZWZpbmUgQ0hFQ0tfSVJRX1BFUl9DUFUodmFyKSAoKHZhcikgJiBJUlFfUEVSX0NQVSkKKyMgZGVmaW5lIElSUV9OT19CQUxBTkNJTkdfTUFTSwkoSVJRX1BFUl9DUFUgfCBJUlFfTk9fQkFMQU5DSU5HKQogI2Vsc2UKICMgZGVmaW5lIENIRUNLX0lSUV9QRVJfQ1BVKHZhcikgMAorIyBkZWZpbmUgSVJRX05PX0JBTEFOQ0lOR19NQVNLCUlSUV9OT19CQUxBTkNJTkcKICNlbmRpZgogCi0jZGVmaW5lIElSUV9OT1BST0JFCQkweDAyMDAwMDAwCS8qIElSUSBpcyBub3QgdmFsaWQgZm9yIHByb2JpbmcgKi8KLSNkZWZpbmUgSVJRX05PUkVRVUVTVAkJMHgwNDAwMDAwMAkvKiBJUlEgY2Fubm90IGJlIHJlcXVlc3RlZCAqLwotI2RlZmluZSBJUlFfTk9BVVRPRU4JCTB4MDgwMDAwMDAJLyogSVJRIHdpbGwgbm90IGJlIGVuYWJsZWQgb24gcmVxdWVzdCBpcnEgKi8KLSNkZWZpbmUgSVJRX0RFTEFZRURfRElTQUJMRQkweDEwMDAwMDAwCS8qIElSUSBkaXNhYmxlIChtYXNraW5nKSBoYXBwZW5zIGRlbGF5ZWQuICovCi0jZGVmaW5lIElSUV9XQUtFVVAJCTB4MjAwMDAwMDAJLyogSVJRIHRyaWdnZXJzIHN5c3RlbSB3YWtldXAgKi8KLSNkZWZpbmUgSVJRX01PVkVfUEVORElORwkweDQwMDAwMDAwCS8qIG5lZWQgdG8gcmUtdGFyZ2V0IElSUSBkZXN0aW5hdGlvbiAqLwotCiBzdHJ1Y3QgcHJvY19kaXJfZW50cnk7CiBzdHJ1Y3QgbXNpX2Rlc2M7CiAKQEAgLTEyNyw2ICsxMjksNyBAQAogICoKICAqIEBoYW5kbGVfaXJxOgkJaGlnaGxldmVsIGlycS1ldmVudHMgaGFuZGxlciBbaWYgTlVMTCwgX19kb19JUlEoKV0KICAqIEBjaGlwOgkJbG93IGxldmVsIGludGVycnVwdCBoYXJkd2FyZSBhY2Nlc3MKKyAqIEBtc2lfZGVzYzoJCU1TSSBkZXNjcmlwdG9yCiAgKiBAaGFuZGxlcl9kYXRhOglwZXItSVJRIGRhdGEgZm9yIHRoZSBpcnFfY2hpcCBtZXRob2RzCiAgKiBAY2hpcF9kYXRhOgkJcGxhdGZvcm0tc3BlY2lmaWMgcGVyLWNoaXAgcHJpdmF0ZSBkYXRhIGZvciB0aGUgY2hpcAogICoJCQltZXRob2RzLCB0byBhbGxvdyBzaGFyZWQgY2hpcCBpbXBsZW1lbnRhdGlvbnMKQEAgLTIzNSwxMSArMjM4LDIxIEBACiAKICNlbmRpZiAvKiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSAqLwogCitleHRlcm4gaW50IGlycV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IGNwdW1hc2spOworZXh0ZXJuIGludCBpcnFfY2FuX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxKTsKKwogI2Vsc2UgLyogQ09ORklHX1NNUCAqLwogCiAjZGVmaW5lIG1vdmVfbmF0aXZlX2lycSh4KQogI2RlZmluZSBtb3ZlX21hc2tlZF9pcnEoeCkKIAorc3RhdGljIGlubGluZSBpbnQgaXJxX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgY3B1bWFzaykKK3sKKwlyZXR1cm4gLUVJTlZBTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXJxX2Nhbl9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSkgeyByZXR1cm4gMDsgfQorCiAjZW5kaWYgLyogQ09ORklHX1NNUCAqLwogCiAjaWZkZWYgQ09ORklHX0lSUUJBTEFOQ0UKQEAgLTI2MSw2ICsyNzQsMTEgQEAKIAogZXh0ZXJuIGludCBub19pcnFfYWZmaW5pdHk7CiAKK3N0YXRpYyBpbmxpbmUgaW50IGlycV9iYWxhbmNpbmdfZGlzYWJsZWQodW5zaWduZWQgaW50IGlycSkKK3sKKwlyZXR1cm4gaXJxX2Rlc2NbaXJxXS5zdGF0dXMgJiBJUlFfTk9fQkFMQU5DSU5HX01BU0s7Cit9CisKIC8qIEhhbmRsZSBpcnEgYWN0aW9uIGNoYWluczogKi8KIGV4dGVybiBpbnQgaGFuZGxlX0lSUV9ldmVudCh1bnNpZ25lZCBpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pOwogCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2ppZmZpZXMuaCBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCmluZGV4IDBlYzZlMjguLmMwODBmNjEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvamlmZmllcy5oCisrKyBiL2luY2x1ZGUvbGludXgvamlmZmllcy5oCkBAIC0xNDIsMTMgKzE0MiwxMyBAQAogICoKICAqIEFuZCBzb21lIG5vdCBzbyBvYnZpb3VzLgogICoKLSAqIE5vdGUgdGhhdCB3ZSBkb24ndCB3YW50IHRvIHJldHVybiBNQVhfTE9ORywgYmVjYXVzZQorICogTm90ZSB0aGF0IHdlIGRvbid0IHdhbnQgdG8gcmV0dXJuIExPTkdfTUFYLCBiZWNhdXNlCiAgKiBmb3IgdmFyaW91cyB0aW1lb3V0IHJlYXNvbnMgd2Ugb2Z0ZW4gZW5kIHVwIGhhdmluZwogICogdG8gd2FpdCAiamlmZmllcysxIiBpbiBvcmRlciB0byBndWFyYW50ZWUgdGhhdCB3ZSB3YWl0CiAgKiBhdCBfbGVhc3RfICJqaWZmaWVzIiAtIHNvICJqaWZmaWVzKzEiIGhhZCBiZXR0ZXIgc3RpbGwKICAqIGJlIHBvc2l0aXZlLgogICovCi0jZGVmaW5lIE1BWF9KSUZGWV9PRkZTRVQgKCh+MFVMID4+IDEpLTEpCisjZGVmaW5lIE1BWF9KSUZGWV9PRkZTRVQgKChMT05HX01BWCA+PiAxKS0xKQogCiAvKgogICogV2Ugd2FudCB0byBkbyByZWFsaXN0aWMgY29udmVyc2lvbnMgb2YgdGltZSBzbyB3ZSBuZWVkIHRvIHVzZSB0aGUgc2FtZQpAQCAtMjU5LDIwNyArMjU5LDIzIEBACiAjZW5kaWYKIAogLyoKLSAqIENvbnZlcnQgamlmZmllcyB0byBtaWxsaXNlY29uZHMgYW5kIGJhY2suCi0gKgotICogQXZvaWQgdW5uZWNlc3NhcnkgbXVsdGlwbGljYXRpb25zL2RpdmlzaW9ucyBpbiB0aGUKLSAqIHR3byBtb3N0IGNvbW1vbiBIWiBjYXNlczoKKyAqIENvbnZlcnQgdmFyaW91cyB0aW1lIHVuaXRzIHRvIGVhY2ggb3RoZXI6CiAgKi8KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGppZmZpZXNfdG9fbXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKQotewotI2lmIEhaIDw9IE1TRUNfUEVSX1NFQyAmJiAhKE1TRUNfUEVSX1NFQyAlIEhaKQotCXJldHVybiAoTVNFQ19QRVJfU0VDIC8gSFopICogajsKLSNlbGlmIEhaID4gTVNFQ19QRVJfU0VDICYmICEoSFogJSBNU0VDX1BFUl9TRUMpCi0JcmV0dXJuIChqICsgKEhaIC8gTVNFQ19QRVJfU0VDKSAtIDEpLyhIWiAvIE1TRUNfUEVSX1NFQyk7Ci0jZWxzZQotCXJldHVybiAoaiAqIE1TRUNfUEVSX1NFQykgLyBIWjsKLSNlbmRpZgotfQorZXh0ZXJuIHVuc2lnbmVkIGludCBqaWZmaWVzX3RvX21zZWNzKGNvbnN0IHVuc2lnbmVkIGxvbmcgaik7CitleHRlcm4gdW5zaWduZWQgaW50IGppZmZpZXNfdG9fdXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKTsKK2V4dGVybiB1bnNpZ25lZCBsb25nIG1zZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IG0pOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgdXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgdSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1lc3BlY190b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpOworZXh0ZXJuIHZvaWQgamlmZmllc190b190aW1lc3BlYyhjb25zdCB1bnNpZ25lZCBsb25nIGppZmZpZXMsCisJCQkJc3RydWN0IHRpbWVzcGVjICp2YWx1ZSk7CitleHRlcm4gdW5zaWduZWQgbG9uZyB0aW1ldmFsX3RvX2ppZmZpZXMoY29uc3Qgc3RydWN0IHRpbWV2YWwgKnZhbHVlKTsKK2V4dGVybiB2b2lkIGppZmZpZXNfdG9fdGltZXZhbChjb25zdCB1bnNpZ25lZCBsb25nIGppZmZpZXMsCisJCQkgICAgICAgc3RydWN0IHRpbWV2YWwgKnZhbHVlKTsKK2V4dGVybiBjbG9ja190IGppZmZpZXNfdG9fY2xvY2tfdChsb25nIHgpOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgY2xvY2tfdF90b19qaWZmaWVzKHVuc2lnbmVkIGxvbmcgeCk7CitleHRlcm4gdTY0IGppZmZpZXNfNjRfdG9fY2xvY2tfdCh1NjQgeCk7CitleHRlcm4gdTY0IG5zZWNfdG9fY2xvY2tfdCh1NjQgeCk7CiAKLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgaW50IGppZmZpZXNfdG9fdXNlY3MoY29uc3QgdW5zaWduZWQgbG9uZyBqKQotewotI2lmIEhaIDw9IFVTRUNfUEVSX1NFQyAmJiAhKFVTRUNfUEVSX1NFQyAlIEhaKQotCXJldHVybiAoVVNFQ19QRVJfU0VDIC8gSFopICogajsKLSNlbGlmIEhaID4gVVNFQ19QRVJfU0VDICYmICEoSFogJSBVU0VDX1BFUl9TRUMpCi0JcmV0dXJuIChqICsgKEhaIC8gVVNFQ19QRVJfU0VDKSAtIDEpLyhIWiAvIFVTRUNfUEVSX1NFQyk7Ci0jZWxzZQotCXJldHVybiAoaiAqIFVTRUNfUEVSX1NFQykgLyBIWjsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgbSkKLXsKLQlpZiAobSA+IGppZmZpZXNfdG9fbXNlY3MoTUFYX0pJRkZZX09GRlNFVCkpCi0JCXJldHVybiBNQVhfSklGRllfT0ZGU0VUOwotI2lmIEhaIDw9IE1TRUNfUEVSX1NFQyAmJiAhKE1TRUNfUEVSX1NFQyAlIEhaKQotCXJldHVybiAobSArIChNU0VDX1BFUl9TRUMgLyBIWikgLSAxKSAvIChNU0VDX1BFUl9TRUMgLyBIWik7Ci0jZWxpZiBIWiA+IE1TRUNfUEVSX1NFQyAmJiAhKEhaICUgTVNFQ19QRVJfU0VDKQotCXJldHVybiBtICogKEhaIC8gTVNFQ19QRVJfU0VDKTsKLSNlbHNlCi0JcmV0dXJuIChtICogSFogKyBNU0VDX1BFUl9TRUMgLSAxKSAvIE1TRUNfUEVSX1NFQzsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgdSkKLXsKLQlpZiAodSA+IGppZmZpZXNfdG9fdXNlY3MoTUFYX0pJRkZZX09GRlNFVCkpCi0JCXJldHVybiBNQVhfSklGRllfT0ZGU0VUOwotI2lmIEhaIDw9IFVTRUNfUEVSX1NFQyAmJiAhKFVTRUNfUEVSX1NFQyAlIEhaKQotCXJldHVybiAodSArIChVU0VDX1BFUl9TRUMgLyBIWikgLSAxKSAvIChVU0VDX1BFUl9TRUMgLyBIWik7Ci0jZWxpZiBIWiA+IFVTRUNfUEVSX1NFQyAmJiAhKEhaICUgVVNFQ19QRVJfU0VDKQotCXJldHVybiB1ICogKEhaIC8gVVNFQ19QRVJfU0VDKTsKLSNlbHNlCi0JcmV0dXJuICh1ICogSFogKyBVU0VDX1BFUl9TRUMgLSAxKSAvIFVTRUNfUEVSX1NFQzsKLSNlbmRpZgotfQotCi0vKgotICogVGhlIFRJQ0tfTlNFQyAtIDEgcm91bmRzIHVwIHRoZSB2YWx1ZSB0byB0aGUgbmV4dCByZXNvbHV0aW9uLiAgTm90ZQotICogdGhhdCBhIHJlbWFpbmRlciBzdWJ0cmFjdCBoZXJlIHdvdWxkIG5vdCBkbyB0aGUgcmlnaHQgdGhpbmcgYXMgdGhlCi0gKiByZXNvbHV0aW9uIHZhbHVlcyBkb24ndCBmYWxsIG9uIHNlY29uZCBib3VuZHJpZXMuICBJLmUuIHRoZSBsaW5lOgotICogbnNlYyAtPSBuc2VjICUgVElDS19OU0VDOyBpcyBOT1QgYSBjb3JyZWN0IHJlc29sdXRpb24gcm91bmRpbmcuCi0gKgotICogUmF0aGVyLCB3ZSBqdXN0IHNoaWZ0IHRoZSBiaXRzIG9mZiB0aGUgcmlnaHQuCi0gKgotICogVGhlID4+IChOU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpIGNvbnZlcnRzIHRoZSBzY2FsZWQgbnNlYwotICogdmFsdWUgdG8gYSBzY2FsZWQgc2Vjb25kIHZhbHVlLgotICovCi1zdGF0aWMgX19pbmxpbmVfXyB1bnNpZ25lZCBsb25nCi10aW1lc3BlY190b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdmFsdWUpCi17Ci0JdW5zaWduZWQgbG9uZyBzZWMgPSB2YWx1ZS0+dHZfc2VjOwotCWxvbmcgbnNlYyA9IHZhbHVlLT50dl9uc2VjICsgVElDS19OU0VDIC0gMTsKLQotCWlmIChzZWMgPj0gTUFYX1NFQ19JTl9KSUZGSUVTKXsKLQkJc2VjID0gTUFYX1NFQ19JTl9KSUZGSUVTOwotCQluc2VjID0gMDsKLQl9Ci0JcmV0dXJuICgoKHU2NClzZWMgKiBTRUNfQ09OVkVSU0lPTikgKwotCQkoKCh1NjQpbnNlYyAqIE5TRUNfQ09OVkVSU0lPTikgPj4KLQkJIChOU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpKSkgPj4gU0VDX0pJRkZJRV9TQzsKLQotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1qaWZmaWVzX3RvX3RpbWVzcGVjKGNvbnN0IHVuc2lnbmVkIGxvbmcgamlmZmllcywgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKLXsKLQkvKgotCSAqIENvbnZlcnQgamlmZmllcyB0byBuYW5vc2Vjb25kcyBhbmQgc2VwYXJhdGUgd2l0aAotCSAqIG9uZSBkaXZpZGUuCi0JICovCi0JdTY0IG5zZWMgPSAodTY0KWppZmZpZXMgKiBUSUNLX05TRUM7Ci0JdmFsdWUtPnR2X3NlYyA9IGRpdl9sb25nX2xvbmdfcmVtKG5zZWMsIE5TRUNfUEVSX1NFQywgJnZhbHVlLT50dl9uc2VjKTsKLX0KLQotLyogU2FtZSBmb3IgInRpbWV2YWwiCi0gKgotICogV2VsbCwgYWxtb3N0LiAgVGhlIHByb2JsZW0gaGVyZSBpcyB0aGF0IHRoZSByZWFsIHN5c3RlbSByZXNvbHV0aW9uIGlzCi0gKiBpbiBuYW5vc2Vjb25kcyBhbmQgdGhlIHZhbHVlIGJlaW5nIGNvbnZlcnRlZCBpcyBpbiBtaWNybyBzZWNvbmRzLgotICogQWxzbyBmb3Igc29tZSBtYWNoaW5lcyAodGhvc2UgdGhhdCB1c2UgSFogPSAxMDI0LCBpbi1wYXJ0aWN1bGFyKSwKLSAqIHRoZXJlIGlzIGEgTEFSR0UgZXJyb3IgaW4gdGhlIHRpY2sgc2l6ZSBpbiBtaWNyb3NlY29uZHMuCi0KLSAqIFRoZSBzb2x1dGlvbiB3ZSB1c2UgaXMgdG8gZG8gdGhlIHJvdW5kaW5nIEFGVEVSIHdlIGNvbnZlcnQgdGhlCi0gKiBtaWNyb3NlY29uZCBwYXJ0LiAgVGh1cyB0aGUgVVNFQ19ST1VORCwgdGhlIGJpdHMgdG8gYmUgc2hpZnRlZCBvZmYuCi0gKiBJbnN0cnVjdGlvbiB3aXNlLCB0aGlzIHNob3VsZCBjb3N0IG9ubHkgYW4gYWRkaXRpb25hbCBhZGQgd2l0aCBjYXJyeQotICogaW5zdHJ1Y3Rpb24gYWJvdmUgdGhlIHdheSBpdCB3YXMgZG9uZSBhYm92ZS4KLSAqLwotc3RhdGljIF9faW5saW5lX18gdW5zaWduZWQgbG9uZwotdGltZXZhbF90b19qaWZmaWVzKGNvbnN0IHN0cnVjdCB0aW1ldmFsICp2YWx1ZSkKLXsKLQl1bnNpZ25lZCBsb25nIHNlYyA9IHZhbHVlLT50dl9zZWM7Ci0JbG9uZyB1c2VjID0gdmFsdWUtPnR2X3VzZWM7Ci0KLQlpZiAoc2VjID49IE1BWF9TRUNfSU5fSklGRklFUyl7Ci0JCXNlYyA9IE1BWF9TRUNfSU5fSklGRklFUzsKLQkJdXNlYyA9IDA7Ci0JfQotCXJldHVybiAoKCh1NjQpc2VjICogU0VDX0NPTlZFUlNJT04pICsKLQkJKCgodTY0KXVzZWMgKiBVU0VDX0NPTlZFUlNJT04gKyBVU0VDX1JPVU5EKSA+PgotCQkgKFVTRUNfSklGRklFX1NDIC0gU0VDX0pJRkZJRV9TQykpKSA+PiBTRUNfSklGRklFX1NDOwotfQotCi1zdGF0aWMgX19pbmxpbmVfXyB2b2lkCi1qaWZmaWVzX3RvX3RpbWV2YWwoY29uc3QgdW5zaWduZWQgbG9uZyBqaWZmaWVzLCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCi17Ci0JLyoKLQkgKiBDb252ZXJ0IGppZmZpZXMgdG8gbmFub3NlY29uZHMgYW5kIHNlcGFyYXRlIHdpdGgKLQkgKiBvbmUgZGl2aWRlLgotCSAqLwotCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOwotCWxvbmcgdHZfdXNlYzsKLQotCXZhbHVlLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZ0dl91c2VjKTsKLQl0dl91c2VjIC89IE5TRUNfUEVSX1VTRUM7Ci0JdmFsdWUtPnR2X3VzZWMgPSB0dl91c2VjOwotfQotCi0vKgotICogQ29udmVydCBqaWZmaWVzL2ppZmZpZXNfNjQgdG8gY2xvY2tfdCBhbmQgYmFjay4KLSAqLwotc3RhdGljIGlubGluZSBjbG9ja190IGppZmZpZXNfdG9fY2xvY2tfdChsb25nIHgpCi17Ci0jaWYgKFRJQ0tfTlNFQyAlIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSkgPT0gMAotCXJldHVybiB4IC8gKEhaIC8gVVNFUl9IWik7Ci0jZWxzZQotCXU2NCB0bXAgPSAodTY0KXggKiBUSUNLX05TRUM7Ci0JZG9fZGl2KHRtcCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKLQlyZXR1cm4gKGxvbmcpdG1wOwotI2VuZGlmCi19Ci0KLXN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjbG9ja190X3RvX2ppZmZpZXModW5zaWduZWQgbG9uZyB4KQotewotI2lmIChIWiAlIFVTRVJfSFopPT0wCi0JaWYgKHggPj0gfjBVTCAvIChIWiAvIFVTRVJfSFopKQotCQlyZXR1cm4gfjBVTDsKLQlyZXR1cm4geCAqIChIWiAvIFVTRVJfSFopOwotI2Vsc2UKLQl1NjQgamlmOwotCi0JLyogRG9uJ3Qgd29ycnkgYWJvdXQgbG9zcyBvZiBwcmVjaXNpb24gaGVyZSAuLiAqLwotCWlmICh4ID49IH4wVUwgLyBIWiAqIFVTRVJfSFopCi0JCXJldHVybiB+MFVMOwotCi0JLyogLi4gYnV0IGRvIHRyeSB0byBjb250YWluIGl0IGhlcmUgKi8KLQlqaWYgPSB4ICogKHU2NCkgSFo7Ci0JZG9fZGl2KGppZiwgVVNFUl9IWik7Ci0JcmV0dXJuIGppZjsKLSNlbmRpZgotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBqaWZmaWVzXzY0X3RvX2Nsb2NrX3QodTY0IHgpCi17Ci0jaWYgKFRJQ0tfTlNFQyAlIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSkgPT0gMAotCWRvX2Rpdih4LCBIWiAvIFVTRVJfSFopOwotI2Vsc2UKLQkvKgotCSAqIFRoZXJlIGFyZSBiZXR0ZXIgd2F5cyB0aGF0IGRvbid0IG92ZXJmbG93IGVhcmx5LAotCSAqIGJ1dCBldmVuIHRoaXMgZG9lc24ndCBvdmVyZmxvdyBpbiBodW5kcmVkcyBvZiB5ZWFycwotCSAqIGluIDY0IGJpdHMsIHNvLi4KLQkgKi8KLQl4ICo9IFRJQ0tfTlNFQzsKLQlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKLSNlbmRpZgotCXJldHVybiB4OwotfQotCi1zdGF0aWMgaW5saW5lIHU2NCBuc2VjX3RvX2Nsb2NrX3QodTY0IHgpCi17Ci0jaWYgKE5TRUNfUEVSX1NFQyAlIFVTRVJfSFopID09IDAKLQlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKLSNlbGlmIChVU0VSX0haICUgNTEyKSA9PSAwCi0JeCAqPSBVU0VSX0haLzUxMjsKLQlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIDUxMikpOwotI2Vsc2UKLQkvKgotICAgICAgICAgKiBtYXggcmVsYXRpdmUgZXJyb3IgNS43ZS04ICgxLjhzIHBlciB5ZWFyKSBmb3IgVVNFUl9IWiA8PSAxMDI0LAotICAgICAgICAgKiBvdmVyZmxvdyBhZnRlciA2NC45OSB5ZWFycy4KLSAgICAgICAgICogZXhhY3QgZm9yIEhaPTYwLCA3MiwgOTAsIDEyMCwgMTQ0LCAxODAsIDMwMCwgNjAwLCA5MDAsIC4uLgotICAgICAgICAgKi8KLQl4ICo9IDk7Ci0JZG9fZGl2KHgsICh1bnNpZ25lZCBsb25nKSgoOXVsbCAqIE5TRUNfUEVSX1NFQyArIChVU0VSX0haLzIpKQotCSAgICAgICAgICAgICAgICAgICAgICAgICAgLyBVU0VSX0haKSk7Ci0jZW5kaWYKLQlyZXR1cm4geDsKLX0KKyNkZWZpbmUgVElNRVNUQU1QX1NJWkUJMzAKIAogI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2t0aW1lLmggYi9pbmNsdWRlL2xpbnV4L2t0aW1lLmgKaW5kZXggNzQ0NGE2My4uYzY4YzdhYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9rdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgva3RpbWUuaApAQCAtMjYxLDggKzI2MSw3IEBACiAgKiBpZGVhIG9mIHRoZSAoaW4pYWNjdXJhY3kgb2YgdGltZXJzLiBUaW1lciB2YWx1ZXMgYXJlIHJvdW5kZWQgdXAgdG8KICAqIHRoaXMgcmVzb2x1dGlvbiB2YWx1ZXMuCiAgKi8KLSNkZWZpbmUgS1RJTUVfUkVBTFRJTUVfUkVTCShrdGltZV90KXsgLnR2NjQgPSBUSUNLX05TRUMgfQotI2RlZmluZSBLVElNRV9NT05PVE9OSUNfUkVTCShrdGltZV90KXsgLnR2NjQgPSBUSUNLX05TRUMgfQorI2RlZmluZSBLVElNRV9MT1dfUkVTCQkoa3RpbWVfdCl7IC50djY0ID0gVElDS19OU0VDIH0KIAogLyogR2V0IHRoZSBtb25vdG9uaWMgdGltZSBpbiB0aW1lc3BlYyBmb3JtYXQ6ICovCiBleHRlcm4gdm9pZCBrdGltZV9nZXRfdHMoc3RydWN0IHRpbWVzcGVjICp0cyk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oIGIvaW5jbHVkZS9saW51eC9saWJhdGEuaAppbmRleCA1OTZlMGMxLi5iODcwYjIwIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2xpYmF0YS5oCisrKyBiL2luY2x1ZGUvbGludXgvbGliYXRhLmgKQEAgLTE3Miw2ICsxNzIsNyBAQAogCUFUQV9GTEFHX0RFQlVHTVNHCT0gKDEgPDwgMTMpLAogCUFUQV9GTEFHX1NFVFhGRVJfUE9MTElORz0gKDEgPDwgMTQpLCAvKiB1c2UgcG9sbGluZyBmb3IgU0VUWEZFUiAqLwogCUFUQV9GTEFHX0lHTl9TSU1QTEVYCT0gKDEgPDwgMTUpLCAvKiBpZ25vcmUgU0lNUExFWCAqLworCUFUQV9GTEFHX05PX0lPUkRZCT0gKDEgPDwgMTYpLCAvKiBjb250cm9sbGVyIGxhY2tzIGlvcmR5ICovCiAKIAkvKiBUaGUgZm9sbG93aW5nIGZsYWcgYmVsb25ncyB0byBhcC0+cGZsYWdzIGJ1dCBpcyBrZXB0IGluCiAJICogYXAtPmZsYWdzIGJlY2F1c2UgaXQncyByZWZlcmVuY2VkIGluIG1hbnkgTExEcyBhbmQgd2lsbCBiZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0LmggYi9pbmNsdWRlL2xpbnV4L25mczQuaAppbmRleCBkYjA1MTgyLi4xYmU1YmU4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L25mczQuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczQuaApAQCAtMTA1LDEyICsxMDUsMTEgQEAKIAl1aW50MzJfdAlhY2Nlc3NfbWFzazsKIAlpbnQJCXdob3R5cGU7CiAJdWlkX3QJCXdobzsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGxfYWNlOwogfTsKIAogc3RydWN0IG5mczRfYWNsIHsKIAl1aW50MzJfdAluYWNlczsKLQlzdHJ1Y3QgbGlzdF9oZWFkIGFjZV9oZWFkOworCXN0cnVjdCBuZnM0X2FjZQlhY2VzWzBdOwogfTsKIAogdHlwZWRlZiBzdHJ1Y3QgeyBjaGFyIGRhdGFbTkZTNF9WRVJJRklFUl9TSVpFXTsgfSBuZnM0X3ZlcmlmaWVyOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9uZnM0X2FjbC5oIGIvaW5jbHVkZS9saW51eC9uZnM0X2FjbC5oCmluZGV4IDIyYWZmNGQuLjQwOWI2ZTAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbmZzNF9hY2wuaAorKysgYi9pbmNsdWRlL2xpbnV4L25mczRfYWNsLmgKQEAgLTM5LDkgKzM5LDEyIEBACiAKICNpbmNsdWRlIDxsaW51eC9wb3NpeF9hY2wuaD4KIAotc3RydWN0IG5mczRfYWNsICpuZnM0X2FjbF9uZXcodm9pZCk7Ci12b2lkIG5mczRfYWNsX2ZyZWUoc3RydWN0IG5mczRfYWNsICopOwotaW50IG5mczRfYWNsX2FkZF9hY2Uoc3RydWN0IG5mczRfYWNsICosIHUzMiwgdTMyLCB1MzIsIGludCwgdWlkX3QpOworLyogTWF4aW11bSBBQ0wgd2UnbGwgYWNjZXB0IGZyb20gY2xpZW50OyBjaG9zZW4gKHNvbWV3aGF0IGFyYml0cmFyaWx5KSB0bworICogZml0IGluIGEgcGFnZTogKi8KKyNkZWZpbmUgTkZTNF9BQ0xfTUFYIDE3MAorCitzdHJ1Y3QgbmZzNF9hY2wgKm5mczRfYWNsX25ldyhpbnQpOwordm9pZCBuZnM0X2FjbF9hZGRfYWNlKHN0cnVjdCBuZnM0X2FjbCAqLCB1MzIsIHUzMiwgdTMyLCBpbnQsIHVpZF90KTsKIGludCBuZnM0X2FjbF9nZXRfd2hvdHlwZShjaGFyICosIHUzMik7CiBpbnQgbmZzNF9hY2xfd3JpdGVfd2hvKGludCB3aG8sIGNoYXIgKnApOwogaW50IG5mczRfYWNsX3Blcm1pc3Npb24oc3RydWN0IG5mczRfYWNsICphY2wsIHVpZF90IG93bmVyLCBnaWRfdCBncm91cCwKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGljay5oIGIvaW5jbHVkZS9saW51eC90aWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE3MjUyZQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbGludXgvdGljay5oCkBAIC0wLDAgKzEsMTA5IEBACisvKiAgbGludXgvaW5jbHVkZS9saW51eC90aWNrLmgKKyAqCisgKiAgVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9yIHRpY2sgcmVsYXRlZCBmdW5jdGlvbnMKKyAqCisgKi8KKyNpZm5kZWYgX0xJTlVYX1RJQ0tfSAorI2RlZmluZSBfTElOVVhfVElDS19ICisKKyNpbmNsdWRlIDxsaW51eC9jbG9ja2NoaXBzLmg+CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworCitlbnVtIHRpY2tfZGV2aWNlX21vZGUgeworCVRJQ0tERVZfTU9ERV9QRVJJT0RJQywKKwlUSUNLREVWX01PREVfT05FU0hPVCwKK307CisKK3N0cnVjdCB0aWNrX2RldmljZSB7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZXZ0ZGV2OworCWVudW0gdGlja19kZXZpY2VfbW9kZSBtb2RlOworfTsKKworZW51bSB0aWNrX25vaHpfbW9kZSB7CisJTk9IWl9NT0RFX0lOQUNUSVZFLAorCU5PSFpfTU9ERV9MT1dSRVMsCisJTk9IWl9NT0RFX0hJR0hSRVMsCit9OworCisvKioKKyAqIHN0cnVjdCB0aWNrX3NjaGVkIC0gc2NoZWQgdGljayBlbXVsYXRpb24gYW5kIG5vIGlkbGUgdGljayBjb250cm9sL3N0YXRzCisgKiBAc2NoZWRfdGltZXI6CWhydGltZXIgdG8gc2NoZWR1bGUgdGhlIHBlcmlvZGljIHRpY2sgaW4gaGlnaAorICoJCQlyZXNvbHV0aW9uIG1vZGUKKyAqIEBpZGxlX3RpY2s6CQlTdG9yZSB0aGUgbGFzdCBpZGxlIHRpY2sgZXhwaXJ5IHRpbWUgd2hlbiB0aGUgdGljaworICoJCQl0aW1lciBpcyBtb2RpZmllZCBmb3IgaWRsZSBzbGVlcHMuIFRoaXMgaXMgbmVjZXNzYXJ5CisgKgkJCXRvIHJlc3VtZSB0aGUgdGljayB0aW1lciBvcGVyYXRpb24gaW4gdGhlIHRpbWVsaW5lCisgKgkJCXdoZW4gdGhlIENQVSByZXR1cm5zIGZyb20gaWRsZQorICogQHRpY2tfc3RvcHBlZDoJSW5kaWNhdG9yIHRoYXQgdGhlIGlkbGUgdGljayBoYXMgYmVlbiBzdG9wcGVkCisgKiBAaWRsZV9qaWZmaWVzOglqaWZmaWVzIGF0IHRoZSBlbnRyeSB0byBpZGxlIGZvciBpZGxlIHRpbWUgYWNjb3VudGluZworICogQGlkbGVfY2FsbHM6CQlUb3RhbCBudW1iZXIgb2YgaWRsZSBjYWxscworICogQGlkbGVfc2xlZXBzOglOdW1iZXIgb2YgaWRsZSBjYWxscywgd2hlcmUgdGhlIHNjaGVkIHRpY2sgd2FzIHN0b3BwZWQKKyAqIEBpZGxlX2VudHJ5dGltZToJVGltZSB3aGVuIHRoZSBpZGxlIGNhbGwgd2FzIGVudGVyZWQKKyAqIEBpZGxlX3NsZWVwdGltZToJU3VtIG9mIHRoZSB0aW1lIHNsZXB0IGluIGlkbGUgd2l0aCBzY2hlZCB0aWNrIHN0b3BwZWQKKyAqLworc3RydWN0IHRpY2tfc2NoZWQgeworCXN0cnVjdCBocnRpbWVyCQkJc2NoZWRfdGltZXI7CisJdW5zaWduZWQgbG9uZwkJCWNoZWNrX2Nsb2NrczsKKwllbnVtIHRpY2tfbm9oel9tb2RlCQlub2h6X21vZGU7CisJa3RpbWVfdAkJCQlpZGxlX3RpY2s7CisJaW50CQkJCXRpY2tfc3RvcHBlZDsKKwl1bnNpZ25lZCBsb25nCQkJaWRsZV9qaWZmaWVzOworCXVuc2lnbmVkIGxvbmcJCQlpZGxlX2NhbGxzOworCXVuc2lnbmVkIGxvbmcJCQlpZGxlX3NsZWVwczsKKwlrdGltZV90CQkJCWlkbGVfZW50cnl0aW1lOworCWt0aW1lX3QJCQkJaWRsZV9zbGVlcHRpbWU7CisJdW5zaWduZWQgbG9uZwkJCWxhc3RfamlmZmllczsKKwl1bnNpZ25lZCBsb25nCQkJbmV4dF9qaWZmaWVzOworCWt0aW1lX3QJCQkJaWRsZV9leHBpcmVzOworfTsKKworZXh0ZXJuIHZvaWQgX19pbml0IHRpY2tfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgdGlja19pc19vbmVzaG90X2F2YWlsYWJsZSh2b2lkKTsKK2V4dGVybiBzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2RldmljZShpbnQgY3B1KTsKKworIyBpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCitleHRlcm4gaW50IHRpY2tfaW5pdF9oaWdocmVzKHZvaWQpOworZXh0ZXJuIGludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpOworZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9zY2hlZF90aW1lcih2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpOworIyBlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19jYW5jZWxfc2NoZWRfdGltZXIoaW50IGNwdSkgeyB9CisjIGVuZGlmIC8qIEhJR0hSRVMgKi8KKworIyBpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QKK2V4dGVybiBzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2Jyb2FkY2FzdF9kZXZpY2Uodm9pZCk7CitleHRlcm4gY3B1bWFza190ICp0aWNrX2dldF9icm9hZGNhc3RfbWFzayh2b2lkKTsKKworIyAgaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIGNwdW1hc2tfdCAqdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzayh2b2lkKTsKKyMgIGVuZGlmCisKKyMgZW5kaWYgLyogQlJPQURDQVNUICovCisKKyMgaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIHZvaWQgdGlja19jbG9ja19ub3RpZnkodm9pZCk7CitleHRlcm4gaW50IHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoaW50IGFsbG93X25vaHopOworZXh0ZXJuIHN0cnVjdCB0aWNrX3NjaGVkICp0aWNrX2dldF90aWNrX3NjaGVkKGludCBjcHUpOworIyBlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19jbG9ja19ub3RpZnkodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIGludCB0aWNrX2NoZWNrX29uZXNob3RfY2hhbmdlKGludCBhbGxvd19ub2h6KSB7IHJldHVybiAwOyB9CisjIGVuZGlmCisKKyNlbHNlIC8qIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTICovCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19pbml0KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfY2xvY2tfbm90aWZ5KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19vbmVzaG90X2NoYW5nZShpbnQgYWxsb3dfbm9oeikgeyByZXR1cm4gMDsgfQorI2VuZGlmIC8qICFDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUyAqLworCisjIGlmZGVmIENPTkZJR19OT19IWgorZXh0ZXJuIHZvaWQgdGlja19ub2h6X3N0b3Bfc2NoZWRfdGljayh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2sodm9pZCk7CitleHRlcm4gdm9pZCB0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXModm9pZCk7CisjIGVsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfbm9oel9yZXN0YXJ0X3NjaGVkX3RpY2sodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X3VwZGF0ZV9qaWZmaWVzKHZvaWQpIHsgfQorIyBlbmRpZiAvKiAhTk9fSFogKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWUuaCBiL2luY2x1ZGUvbGludXgvdGltZS5oCmluZGV4IGVjZWIxYTUuLjhlYThkZWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGltZS5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZS5oCkBAIC05Miw2ICs5Miw3IEBACiBleHRlcm4gc3RydWN0IHRpbWVzcGVjIHdhbGxfdG9fbW9ub3RvbmljOwogZXh0ZXJuIHNlcWxvY2tfdCB4dGltZV9sb2NrIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIAorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcmVhZF9wZXJzaXN0ZW50X2Nsb2NrKHZvaWQpOwogdm9pZCB0aW1la2VlcGluZ19pbml0KHZvaWQpOwogCiBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0X3NlY29uZHModm9pZCkKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvdGltZXIuaCBiL2luY2x1ZGUvbGludXgvdGltZXIuaAppbmRleCBmYjVlZGFhLi43MTkxMTNiIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3RpbWVyLmgKKysrIGIvaW5jbHVkZS9saW51eC90aW1lci5oCkBAIC0yLDYgKzIsNyBAQAogI2RlZmluZSBfTElOVVhfVElNRVJfSAogCiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aW1lLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9zdGRkZWYuaD4KIApAQCAtMTUsNiArMTYsMTEgQEAKIAl1bnNpZ25lZCBsb25nIGRhdGE7CiAKIAlzdHJ1Y3QgdHZlY190X2Jhc2VfcyAqYmFzZTsKKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKwl2b2lkICpzdGFydF9zaXRlOworCWNoYXIgc3RhcnRfY29tbVsxNl07CisJaW50IHN0YXJ0X3BpZDsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIHN0cnVjdCB0dmVjX3RfYmFzZV9zIGJvb3RfdHZlY19iYXNlczsKQEAgLTYxLDcgKzY3LDY1IEBACiBleHRlcm4gaW50IF9fbW9kX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgbG9uZyBleHBpcmVzKTsKIGV4dGVybiBpbnQgbW9kX3RpbWVyKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwgdW5zaWduZWQgbG9uZyBleHBpcmVzKTsKIAorLyoKKyAqIFJldHVybiB3aGVuIHRoZSBuZXh0IHRpbWVyLXdoZWVsIHRpbWVvdXQgb2NjdXJzIChpbiBhYnNvbHV0ZSBqaWZmaWVzKSwKKyAqIGxvY2tzIHRoZSB0aW1lciBiYXNlOgorICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKTsKKy8qCisgKiBSZXR1cm4gd2hlbiB0aGUgbmV4dCB0aW1lci13aGVlbCB0aW1lb3V0IG9jY3VycyAoaW4gYWJzb2x1dGUgamlmZmllcyksCisgKiBsb2NrcyB0aGUgdGltZXIgYmFzZSBhbmQgZG9lcyB0aGUgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZSBnaXZlbgorICogamlmZmllLgorICovCitleHRlcm4gdW5zaWduZWQgbG9uZyBnZXRfbmV4dF90aW1lcl9pbnRlcnJ1cHQodW5zaWduZWQgbG9uZyBub3cpOworCisvKgorICogVGltZXItc3RhdGlzdGljcyBpbmZvOgorICovCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisKK2V4dGVybiB2b2lkIGluaXRfdGltZXJfc3RhdHModm9pZCk7CisKK2V4dGVybiB2b2lkIHRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh2b2lkICp0aW1lciwgcGlkX3QgcGlkLCB2b2lkICpzdGFydGYsCisJCQkJICAgICB2b2lkICp0aW1lcmYsIGNoYXIgKiBjb21tKTsKKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCXRpbWVyX3N0YXRzX3VwZGF0ZV9zdGF0cyh0aW1lciwgdGltZXItPnN0YXJ0X3BpZCwgdGltZXItPnN0YXJ0X3NpdGUsCisJCQkJIHRpbWVyLT5mdW5jdGlvbiwgdGltZXItPnN0YXJ0X2NvbW0pOworfQorCitleHRlcm4gdm9pZCBfX3RpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lciwKKwkJCQkJICAgICAgIHZvaWQgKmFkZHIpOworCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworCV9fdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8odGltZXIsIF9fYnVpbHRpbl9yZXR1cm5fYWRkcmVzcygwKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB0aW1lcl9zdGF0c190aW1lcl9jbGVhcl9zdGFydF9pbmZvKHN0cnVjdCB0aW1lcl9saXN0ICp0aW1lcikKK3sKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IE5VTEw7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIGluaXRfdGltZXJfc3RhdHModm9pZCkKK3sKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyKQoreworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGltZXJfc3RhdHNfdGltZXJfY2xlYXJfc3RhcnRfaW5mbyhzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIpCit7Cit9CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgZGVsYXllZF93b3JrX3RpbWVyX2ZuKHVuc2lnbmVkIGxvbmcgX19kYXRhKTsKIAogLyoqCiAgKiBhZGRfdGltZXIgLSBzdGFydCBhIHRpbWVyCkBAIC05Niw3ICsxNjAsNyBAQAogZXh0ZXJuIHZvaWQgaW5pdF90aW1lcnModm9pZCk7CiBleHRlcm4gdm9pZCBydW5fbG9jYWxfdGltZXJzKHZvaWQpOwogc3RydWN0IGhydGltZXI7Ci1leHRlcm4gaW50IGl0X3JlYWxfZm4oc3RydWN0IGhydGltZXIgKik7CitleHRlcm4gZW51bSBocnRpbWVyX3Jlc3RhcnQgaXRfcmVhbF9mbihzdHJ1Y3QgaHJ0aW1lciAqKTsKIAogdW5zaWduZWQgbG9uZyBfX3JvdW5kX2ppZmZpZXModW5zaWduZWQgbG9uZyBqLCBpbnQgY3B1KTsKIHVuc2lnbmVkIGxvbmcgX19yb3VuZF9qaWZmaWVzX3JlbGF0aXZlKHVuc2lnbmVkIGxvbmcgaiwgaW50IGNwdSk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RpbWV4LmggYi9pbmNsdWRlL2xpbnV4L3RpbWV4LmgKaW5kZXggOWEyNGU1MC4uZGE5MjlkYiAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC90aW1leC5oCisrKyBiL2luY2x1ZGUvbGludXgvdGltZXguaApAQCAtMjg2LDYgKzI4NiwxMyBAQAogCiAjZGVmaW5lIFRJQ0tfTEVOR1RIX1NISUZUCTMyCiAKKyNpZmRlZiBDT05GSUdfTk9fSFoKKyNkZWZpbmUgTlRQX0lOVEVSVkFMX0ZSRVEgICgyKQorI2Vsc2UKKyNkZWZpbmUgTlRQX0lOVEVSVkFMX0ZSRVEgIChIWikKKyNlbmRpZgorI2RlZmluZSBOVFBfSU5URVJWQUxfTEVOR1RIIChOU0VDX1BFUl9TRUMvTlRQX0lOVEVSVkFMX0ZSRVEpCisKIC8qIFJldHVybnMgaG93IGxvbmcgdGlja3MgYXJlIGF0IHByZXNlbnQsIGluIG5zIC8gMl4oU0hJRlRfU0NBTEUtMTApLiAqLwogZXh0ZXJuIHU2NCBjdXJyZW50X3RpY2tfbGVuZ3RoKHZvaWQpOwogCmRpZmYgLS1naXQgYS9pbml0L21haW4uYyBiL2luaXQvbWFpbi5jCmluZGV4IDI0MjFlMTUuLjk1MzUwMGIgMTAwNjQ0Ci0tLSBhL2luaXQvbWFpbi5jCisrKyBiL2luaXQvbWFpbi5jCkBAIC00MCw2ICs0MCw3IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvZWZpLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L3Rhc2tzdGF0c19rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXlhY2N0Lmg+CiAjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CkBAIC01MTUsNiArNTE2LDcgQEAKICAqIGVuYWJsZSB0aGVtCiAgKi8KIAlsb2NrX2tlcm5lbCgpOworCXRpY2tfaW5pdCgpOwogCWJvb3RfY3B1X2luaXQoKTsKIAlwYWdlX2FkZHJlc3NfaW5pdCgpOwogCXByaW50ayhLRVJOX05PVElDRSk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCAwYjYyOTNkLi5kMTU0Y2M3IDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTg1OCw3ICs4NTgsNyBAQAogCWluaXRfc2lncGVuZGluZygmc2lnLT5zaGFyZWRfcGVuZGluZyk7CiAJSU5JVF9MSVNUX0hFQUQoJnNpZy0+cG9zaXhfdGltZXJzKTsKIAotCWhydGltZXJfaW5pdCgmc2lnLT5yZWFsX3RpbWVyLCBDTE9DS19NT05PVE9OSUMsIEhSVElNRVJfUkVMKTsKKwlocnRpbWVyX2luaXQoJnNpZy0+cmVhbF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKIAlzaWctPml0X3JlYWxfaW5jci50djY0ID0gMDsKIAlzaWctPnJlYWxfdGltZXIuZnVuY3Rpb24gPSBpdF9yZWFsX2ZuOwogCXNpZy0+dHNrID0gdHNrOwpkaWZmIC0tZ2l0IGEva2VybmVsL2Z1dGV4LmMgYi9rZXJuZWwvZnV0ZXguYwppbmRleCA1YTczN2RlLi5lNzQ5ZTdkIDEwMDY0NAotLS0gYS9rZXJuZWwvZnV0ZXguYworKysgYi9rZXJuZWwvZnV0ZXguYwpAQCAtMTEzNCw3ICsxMTM0LDcgQEAKIAogCWlmIChzZWMgIT0gTUFYX1NDSEVEVUxFX1RJTUVPVVQpIHsKIAkJdG8gPSAmdGltZW91dDsKLQkJaHJ0aW1lcl9pbml0KCZ0by0+dGltZXIsIENMT0NLX1JFQUxUSU1FLCBIUlRJTUVSX0FCUyk7CisJCWhydGltZXJfaW5pdCgmdG8tPnRpbWVyLCBDTE9DS19SRUFMVElNRSwgSFJUSU1FUl9NT0RFX0FCUyk7CiAJCWhydGltZXJfaW5pdF9zbGVlcGVyKHRvLCBjdXJyZW50KTsKIAkJdG8tPnRpbWVyLmV4cGlyZXMgPSBrdGltZV9zZXQoc2VjLCBuc2VjKTsKIAl9CmRpZmYgLS1naXQgYS9rZXJuZWwvaHJ0aW1lci5jIGIva2VybmVsL2hydGltZXIuYwppbmRleCBmNDRlNDk5Li40NzZjYjBjIDEwMDY0NAotLS0gYS9rZXJuZWwvaHJ0aW1lci5jCisrKyBiL2tlcm5lbC9ocnRpbWVyLmMKQEAgLTEsOCArMSw5IEBACiAvKgogICogIGxpbnV4L2tlcm5lbC9ocnRpbWVyLmMKICAqCi0gKiAgQ29weXJpZ2h0KEMpIDIwMDUsIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgotICogIENvcHlyaWdodChDKSAyMDA1LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodChDKSAyMDA1LTIwMDYsIFRob21hcyBHbGVpeG5lciA8dGdseEBsaW51dHJvbml4LmRlPgorICogIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiAgQ29weXJpZ2h0KEMpIDIwMDYtMjAwNyAgVGltZXN5cyBDb3JwLiwgVGhvbWFzIEdsZWl4bmVyCiAgKgogICogIEhpZ2gtcmVzb2x1dGlvbiBrZXJuZWwgdGltZXJzCiAgKgpAQCAtMzEsMTIgKzMyLDE3IEBACiAgKi8KIAogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2lycS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisjaW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAKQEAgLTQ1LDcgKzUxLDcgQEAKICAqCiAgKiByZXR1cm5zIHRoZSB0aW1lIGluIGt0aW1lX3QgZm9ybWF0CiAgKi8KLXN0YXRpYyBrdGltZV90IGt0aW1lX2dldCh2b2lkKQora3RpbWVfdCBrdGltZV9nZXQodm9pZCkKIHsKIAlzdHJ1Y3QgdGltZXNwZWMgbm93OwogCkBAIC01OSw3ICs2NSw3IEBACiAgKgogICogcmV0dXJucyB0aGUgdGltZSBpbiBrdGltZV90IGZvcm1hdAogICovCi1zdGF0aWMga3RpbWVfdCBrdGltZV9nZXRfcmVhbCh2b2lkKQora3RpbWVfdCBrdGltZV9nZXRfcmVhbCh2b2lkKQogewogCXN0cnVjdCB0aW1lc3BlYyBub3c7CiAKQEAgLTc5LDIxICs4NSwyMiBAQAogICogVGhpcyBlbnN1cmVzIHRoYXQgd2UgY2FwdHVyZSBlcnJvbmVvdXMgYWNjZXNzZXMgdG8gdGhlc2UgY2xvY2sgaWRzCiAgKiByYXRoZXIgdGhhbiBtb3ZpbmcgdGhlbSBpbnRvIHRoZSByYW5nZSBvZiB2YWxpZCBjbG9jayBpZCdzLgogICovCi0KLSNkZWZpbmUgTUFYX0hSVElNRVJfQkFTRVMgMgotCi1zdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGhydGltZXJfYmFzZSwgaHJ0aW1lcl9iYXNlc1tNQVhfSFJUSU1FUl9CQVNFU10pID0KK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlLCBocnRpbWVyX2Jhc2VzKSA9CiB7CisKKwkuY2xvY2tfYmFzZSA9CiAJewotCQkuaW5kZXggPSBDTE9DS19SRUFMVElNRSwKLQkJLmdldF90aW1lID0gJmt0aW1lX2dldF9yZWFsLAotCQkucmVzb2x1dGlvbiA9IEtUSU1FX1JFQUxUSU1FX1JFUywKLQl9LAotCXsKLQkJLmluZGV4ID0gQ0xPQ0tfTU9OT1RPTklDLAotCQkuZ2V0X3RpbWUgPSAma3RpbWVfZ2V0LAotCQkucmVzb2x1dGlvbiA9IEtUSU1FX01PTk9UT05JQ19SRVMsCi0JfSwKKwkJeworCQkJLmluZGV4ID0gQ0xPQ0tfUkVBTFRJTUUsCisJCQkuZ2V0X3RpbWUgPSAma3RpbWVfZ2V0X3JlYWwsCisJCQkucmVzb2x1dGlvbiA9IEtUSU1FX0xPV19SRVMsCisJCX0sCisJCXsKKwkJCS5pbmRleCA9IENMT0NLX01PTk9UT05JQywKKwkJCS5nZXRfdGltZSA9ICZrdGltZV9nZXQsCisJCQkucmVzb2x1dGlvbiA9IEtUSU1FX0xPV19SRVMsCisJCX0sCisJfQogfTsKIAogLyoqCkBAIC0xMjUsMjAgKzEzMiwzNSBAQAogICogR2V0IHRoZSBjb2Fyc2UgZ3JhaW5lZCB0aW1lIGF0IHRoZSBzb2Z0aXJxIGJhc2VkIG9uIHh0aW1lIGFuZAogICogd2FsbF90b19tb25vdG9uaWMuCiAgKi8KLXN0YXRpYyB2b2lkIGhydGltZXJfZ2V0X3NvZnRpcnFfdGltZShzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIHZvaWQgaHJ0aW1lcl9nZXRfc29mdGlycV90aW1lKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlKQogewogCWt0aW1lX3QgeHRpbSwgdG9tb25vOworCXN0cnVjdCB0aW1lc3BlYyB4dHM7CiAJdW5zaWduZWQgbG9uZyBzZXE7CiAKIAlkbyB7CiAJCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCQl4dGltID0gdGltZXNwZWNfdG9fa3RpbWUoeHRpbWUpOwotCQl0b21vbm8gPSB0aW1lc3BlY190b19rdGltZSh3YWxsX3RvX21vbm90b25pYyk7Ci0KKyNpZmRlZiBDT05GSUdfTk9fSFoKKwkJZ2V0bnN0aW1lb2ZkYXkoJnh0cyk7CisjZWxzZQorCQl4dHMgPSB4dGltZTsKKyNlbmRpZgogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwogCi0JYmFzZVtDTE9DS19SRUFMVElNRV0uc29mdGlycV90aW1lID0geHRpbTsKLQliYXNlW0NMT0NLX01PTk9UT05JQ10uc29mdGlycV90aW1lID0ga3RpbWVfYWRkKHh0aW0sIHRvbW9ubyk7CisJeHRpbSA9IHRpbWVzcGVjX3RvX2t0aW1lKHh0cyk7CisJdG9tb25vID0gdGltZXNwZWNfdG9fa3RpbWUod2FsbF90b19tb25vdG9uaWMpOworCWJhc2UtPmNsb2NrX2Jhc2VbQ0xPQ0tfUkVBTFRJTUVdLnNvZnRpcnFfdGltZSA9IHh0aW07CisJYmFzZS0+Y2xvY2tfYmFzZVtDTE9DS19NT05PVE9OSUNdLnNvZnRpcnFfdGltZSA9CisJCWt0aW1lX2FkZCh4dGltLCB0b21vbm8pOworfQorCisvKgorICogSGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrLCB3aGV0aGVyIHRoZSB0aW1lciBpcyBydW5uaW5nIHRoZSBjYWxsYmFjaworICogZnVuY3Rpb24KKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9jYWxsYmFja19ydW5uaW5nKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3sKKwlyZXR1cm4gdGltZXItPnN0YXRlICYgSFJUSU1FUl9TVEFURV9DQUxMQkFDSzsKIH0KIAogLyoKQEAgLTE0Nyw4ICsxNjksNiBAQAogICovCiAjaWZkZWYgQ09ORklHX1NNUAogCi0jZGVmaW5lIHNldF9jdXJyX3RpbWVyKGIsIHQpCQlkbyB7IChiKS0+Y3Vycl90aW1lciA9ICh0KTsgfSB3aGlsZSAoMCkKLQogLyoKICAqIFdlIGFyZSB1c2luZyBoYXNoZWQgbG9ja2luZzogaG9sZGluZyBwZXJfY3B1KGhydGltZXJfYmFzZXMpW25dLmxvY2sKICAqIG1lYW5zIHRoYXQgYWxsIHRpbWVycyB3aGljaCBhcmUgdGllZCB0byB0aGlzIGJhc2UgdmlhIHRpbWVyLT5iYXNlIGFyZQpAQCAtMTYxLDE5ICsxODEsMjAgQEAKICAqIHBvc3NpYmxlIHRvIHNldCB0aW1lci0+YmFzZSA9IE5VTEwgYW5kIGRyb3AgdGhlIGxvY2s6IHRoZSB0aW1lciByZW1haW5zCiAgKiBsb2NrZWQuCiAgKi8KLXN0YXRpYyBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpsb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCi0JCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQorc3RhdGljCitzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpsb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZmxhZ3MpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOwogCiAJZm9yICg7OykgewogCQliYXNlID0gdGltZXItPmJhc2U7CiAJCWlmIChsaWtlbHkoYmFzZSAhPSBOVUxMKSkgewotCQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJCQlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssICpmbGFncyk7CiAJCQlpZiAobGlrZWx5KGJhc2UgPT0gdGltZXItPmJhc2UpKQogCQkJCXJldHVybiBiYXNlOwogCQkJLyogVGhlIHRpbWVyIGhhcyBtaWdyYXRlZCB0byBhbm90aGVyIENQVTogKi8KLQkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXNlLT5jcHVfYmFzZS0+bG9jaywgKmZsYWdzKTsKIAkJfQogCQljcHVfcmVsYXgoKTsKIAl9CkBAIC0xODIsMTIgKzIwMywxNCBAQAogLyoKICAqIFN3aXRjaCB0aGUgdGltZXIgYmFzZSB0byB0aGUgY3VycmVudCBDUFUgd2hlbiBwb3NzaWJsZS4KICAqLwotc3RhdGljIGlubGluZSBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICoKLXN3aXRjaF9ocnRpbWVyX2Jhc2Uoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICoKK3N3aXRjaF9ocnRpbWVyX2Jhc2Uoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKm5ld19iYXNlOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKm5ld19iYXNlOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpuZXdfY3B1X2Jhc2U7CiAKLQluZXdfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpW2Jhc2UtPmluZGV4XTsKKwluZXdfY3B1X2Jhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwluZXdfYmFzZSA9ICZuZXdfY3B1X2Jhc2UtPmNsb2NrX2Jhc2VbYmFzZS0+aW5kZXhdOwogCiAJaWYgKGJhc2UgIT0gbmV3X2Jhc2UpIHsKIAkJLyoKQEAgLTE5OSwxMyArMjIyLDEzIEBACiAJCSAqIGNvbXBsZXRlZC4gVGhlcmUgaXMgbm8gY29uZmxpY3QgYXMgd2UgaG9sZCB0aGUgbG9jayB1bnRpbAogCQkgKiB0aGUgdGltZXIgaXMgZW5xdWV1ZWQuCiAJCSAqLwotCQlpZiAodW5saWtlbHkoYmFzZS0+Y3Vycl90aW1lciA9PSB0aW1lcikpCisJCWlmICh1bmxpa2VseShocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKSkKIAkJCXJldHVybiBiYXNlOwogCiAJCS8qIFNlZSB0aGUgY29tbWVudCBpbiBsb2NrX3RpbWVyX2Jhc2UoKSAqLwogCQl0aW1lci0+YmFzZSA9IE5VTEw7Ci0JCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKLQkJc3Bpbl9sb2NrKCZuZXdfYmFzZS0+bG9jayk7CisJCXNwaW5fdW5sb2NrKCZiYXNlLT5jcHVfYmFzZS0+bG9jayk7CisJCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmNwdV9iYXNlLT5sb2NrKTsKIAkJdGltZXItPmJhc2UgPSBuZXdfYmFzZTsKIAl9CiAJcmV0dXJuIG5ld19iYXNlOwpAQCAtMjEzLDE5ICsyMzYsMTcgQEAKIAogI2Vsc2UgLyogQ09ORklHX1NNUCAqLwogCi0jZGVmaW5lIHNldF9jdXJyX3RpbWVyKGIsIHQpCQlkbyB7IH0gd2hpbGUgKDApCi0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGhydGltZXJfYmFzZSAqCitzdGF0aWMgaW5saW5lIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKgogbG9ja19ocnRpbWVyX2Jhc2UoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyLCB1bnNpZ25lZCBsb25nICpmbGFncykKIHsKLQlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlID0gdGltZXItPmJhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSA9IHRpbWVyLT5iYXNlOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssICpmbGFncyk7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmNwdV9iYXNlLT5sb2NrLCAqZmxhZ3MpOwogCiAJcmV0dXJuIGJhc2U7CiB9CiAKLSNkZWZpbmUgc3dpdGNoX2hydGltZXJfYmFzZSh0LCBiKQkoYikKKyMgZGVmaW5lIHN3aXRjaF9ocnRpbWVyX2Jhc2UodCwgYikJKGIpCiAKICNlbmRpZgkvKiAhQ09ORklHX1NNUCAqLwogCkBAIC0yNTYsMTUgKzI3NywxMiBAQAogCiAJcmV0dXJuIGt0aW1lX2FkZChrdCwgdG1wKTsKIH0KLQotI2Vsc2UgLyogQ09ORklHX0tUSU1FX1NDQUxBUiAqLwotCiAjIGVuZGlmIC8qICFDT05GSUdfS1RJTUVfU0NBTEFSICovCiAKIC8qCiAgKiBEaXZpZGUgYSBrdGltZSB2YWx1ZSBieSBhIG5hbm9zZWNvbmQgdmFsdWUKICAqLwotc3RhdGljIHVuc2lnbmVkIGxvbmcga3RpbWVfZGl2bnMoY29uc3Qga3RpbWVfdCBrdCwgczY0IGRpdikKK3Vuc2lnbmVkIGxvbmcga3RpbWVfZGl2bnMoY29uc3Qga3RpbWVfdCBrdCwgczY0IGRpdikKIHsKIAl1NjQgZGNsYywgaW5jLCBkbnM7CiAJaW50IHNmdCA9IDA7CkBAIC0yODEsMTggKzI5OSwzMTEgQEAKIAogCXJldHVybiAodW5zaWduZWQgbG9uZykgZGNsYzsKIH0KLQotI2Vsc2UgLyogQklUU19QRVJfTE9ORyA8IDY0ICovCi0jIGRlZmluZSBrdGltZV9kaXZucyhrdCwgZGl2KQkJKHVuc2lnbmVkIGxvbmcpKChrdCkudHY2NCAvIChkaXYpKQogI2VuZGlmIC8qIEJJVFNfUEVSX0xPTkcgPj0gNjQgKi8KIAorLyogSGlnaCByZXNvbHV0aW9uIHRpbWVyIHJlbGF0ZWQgZnVuY3Rpb25zICovCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCisvKgorICogSGlnaCByZXNvbHV0aW9uIHRpbWVyIGVuYWJsZWQgPworICovCitzdGF0aWMgaW50IGhydGltZXJfaHJlc19lbmFibGVkIF9fcmVhZF9tb3N0bHkgID0gMTsKKworLyoKKyAqIEVuYWJsZSAvIERpc2FibGUgaGlnaCByZXNvbHV0aW9uIG1vZGUKKyAqLworc3RhdGljIGludCBfX2luaXQgc2V0dXBfaHJ0aW1lcl9ocmVzKGNoYXIgKnN0cikKK3sKKwlpZiAoIXN0cmNtcChzdHIsICJvZmYiKSkKKwkJaHJ0aW1lcl9ocmVzX2VuYWJsZWQgPSAwOworCWVsc2UgaWYgKCFzdHJjbXAoc3RyLCAib24iKSkKKwkJaHJ0aW1lcl9ocmVzX2VuYWJsZWQgPSAxOworCWVsc2UKKwkJcmV0dXJuIDA7CisJcmV0dXJuIDE7Cit9CisKK19fc2V0dXAoImhpZ2hyZXM9Iiwgc2V0dXBfaHJ0aW1lcl9ocmVzKTsKKworLyoKKyAqIGhydGltZXJfaGlnaF9yZXNfZW5hYmxlZCAtIHF1ZXJ5LCBpZiB0aGUgaGlnaHJlcyBtb2RlIGlzIGVuYWJsZWQKKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9pc19ocmVzX2VuYWJsZWQodm9pZCkKK3sKKwlyZXR1cm4gaHJ0aW1lcl9ocmVzX2VuYWJsZWQ7Cit9CisKKy8qCisgKiBJcyB0aGUgaGlnaCByZXNvbHV0aW9uIG1vZGUgYWN0aXZlID8KKyAqLworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9ocmVzX2FjdGl2ZSh2b2lkKQoreworCXJldHVybiBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpLmhyZXNfYWN0aXZlOworfQorCisvKgorICogUmVwcm9ncmFtIHRoZSBldmVudCBzb3VyY2Ugd2l0aCBjaGVja2luZyBib3RoIHF1ZXVlcyBmb3IgdGhlCisgKiBuZXh0IGV2ZW50CisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCBiYXNlLT5sb2NrIGhlbGQKKyAqLworc3RhdGljIHZvaWQgaHJ0aW1lcl9mb3JjZV9yZXByb2dyYW0oc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlKQoreworCWludCBpOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UgPSBjcHVfYmFzZS0+Y2xvY2tfYmFzZTsKKwlrdGltZV90IGV4cGlyZXM7CisKKwljcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQgPSBLVElNRV9NQVg7CisKKwlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKywgYmFzZSsrKSB7CisJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKKworCQlpZiAoIWJhc2UtPmZpcnN0KQorCQkJY29udGludWU7CisJCXRpbWVyID0gcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKTsKKwkJZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+b2Zmc2V0KTsKKwkJaWYgKGV4cGlyZXMudHY2NCA8IGNwdV9iYXNlLT5leHBpcmVzX25leHQudHY2NCkKKwkJCWNwdV9iYXNlLT5leHBpcmVzX25leHQgPSBleHBpcmVzOworCX0KKworCWlmIChjcHVfYmFzZS0+ZXhwaXJlc19uZXh0LnR2NjQgIT0gS1RJTUVfTUFYKQorCQl0aWNrX3Byb2dyYW1fZXZlbnQoY3B1X2Jhc2UtPmV4cGlyZXNfbmV4dCwgMSk7Cit9CisKKy8qCisgKiBTaGFyZWQgcmVwcm9ncmFtbWluZyBmb3IgY2xvY2tfcmVhbHRpbWUgYW5kIGNsb2NrX21vbm90b25pYworICoKKyAqIFdoZW4gYSB0aW1lciBpcyBlbnF1ZXVlZCBhbmQgZXhwaXJlcyBlYXJsaWVyIHRoYW4gdGhlIGFscmVhZHkgZW5xdWV1ZWQKKyAqIHRpbWVycywgd2UgaGF2ZSB0byBjaGVjaywgd2hldGhlciBpdCBleHBpcmVzIGVhcmxpZXIgdGhhbiB0aGUgdGltZXIgZm9yCisgKiB3aGljaCB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlIHdhcyBhcm1lZC4KKyAqCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCBiYXNlLT5jcHVfYmFzZS5sb2NrIGhlbGQKKyAqLworc3RhdGljIGludCBocnRpbWVyX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCit7CisJa3RpbWVfdCAqZXhwaXJlc19uZXh0ID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcykuZXhwaXJlc19uZXh0OworCWt0aW1lX3QgZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+b2Zmc2V0KTsKKwlpbnQgcmVzOworCisJLyoKKwkgKiBXaGVuIHRoZSBjYWxsYmFjayBpcyBydW5uaW5nLCB3ZSBkbyBub3QgcmVwcm9ncmFtIHRoZSBjbG9jayBldmVudAorCSAqIGRldmljZS4gVGhlIHRpbWVyIGNhbGxiYWNrIGlzIGVpdGhlciBydW5uaW5nIG9uIGEgZGlmZmVyZW50IENQVSBvcgorCSAqIHRoZSBjYWxsYmFjayBpcyBleGVjdXRlZCBpbiB0aGUgaHJ0aW1lcl9pbnRlcnVwdCBjb250ZXh0LiBUaGUKKwkgKiByZXByb2dyYW1taW5nIGlzIGhhbmRsZWQgZWl0aGVyIGJ5IHRoZSBzb2Z0aXJxLCB3aGljaCBjYWxsZWQgdGhlCisJICogY2FsbGJhY2sgb3IgYXQgdGhlIGVuZCBvZiB0aGUgaHJ0aW1lcl9pbnRlcnJ1cHQuCisJICovCisJaWYgKGhydGltZXJfY2FsbGJhY2tfcnVubmluZyh0aW1lcikpCisJCXJldHVybiAwOworCisJaWYgKGV4cGlyZXMudHY2NCA+PSBleHBpcmVzX25leHQtPnR2NjQpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDbG9ja2V2ZW50cyByZXR1cm5zIC1FVElNRSwgd2hlbiB0aGUgZXZlbnQgd2FzIGluIHRoZSBwYXN0LgorCSAqLworCXJlcyA9IHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzLCAwKTsKKwlpZiAoIUlTX0VSUl9WQUxVRShyZXMpKQorCQkqZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKKwlyZXR1cm4gcmVzOworfQorCisKKy8qCisgKiBSZXRyaWdnZXIgbmV4dCBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgY2xvY2sgd2FzIHNldAorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgdmlhIG9uX2VhY2hfY3B1KCkKKyAqLworc3RhdGljIHZvaWQgcmV0cmlnZ2VyX25leHRfZXZlbnQodm9pZCAqYXJnKQoreworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlOworCXN0cnVjdCB0aW1lc3BlYyByZWFsdGltZV9vZmZzZXQ7CisJdW5zaWduZWQgbG9uZyBzZXE7CisKKwlpZiAoIWhydGltZXJfaHJlc19hY3RpdmUoKSkKKwkJcmV0dXJuOworCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJc2V0X25vcm1hbGl6ZWRfdGltZXNwZWMoJnJlYWx0aW1lX29mZnNldCwKKwkJCQkJLXdhbGxfdG9fbW9ub3RvbmljLnR2X3NlYywKKwkJCQkJLXdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWMpOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCisJYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCisJLyogQWRqdXN0IENMT0NLX1JFQUxUSU1FIG9mZnNldCAqLworCXNwaW5fbG9jaygmYmFzZS0+bG9jayk7CisJYmFzZS0+Y2xvY2tfYmFzZVtDTE9DS19SRUFMVElNRV0ub2Zmc2V0ID0KKwkJdGltZXNwZWNfdG9fa3RpbWUocmVhbHRpbWVfb2Zmc2V0KTsKKworCWhydGltZXJfZm9yY2VfcmVwcm9ncmFtKGJhc2UpOworCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKK30KKworLyoKKyAqIENsb2NrIHJlYWx0aW1lIHdhcyBzZXQKKyAqCisgKiBDaGFuZ2UgdGhlIG9mZnNldCBvZiB0aGUgcmVhbHRpbWUgY2xvY2sgdnMuIHRoZSBtb25vdG9uaWMKKyAqIGNsb2NrLgorICoKKyAqIFdlIG1pZ2h0IGhhdmUgdG8gcmVwcm9ncmFtIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgaW50ZXJydXB0LiBPbgorICogU01QIHdlIGNhbGwgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyBjb2RlIHRvIHJldHJpZ2dlciBfYWxsXyBoaWdoCisgKiByZXNvbHV0aW9uIHRpbWVyIGludGVycnVwdHMuIE9uIFVQIHdlIGp1c3QgZGlzYWJsZSBpbnRlcnJ1cHRzIGFuZAorICogY2FsbCB0aGUgaGlnaCByZXNvbHV0aW9uIGludGVycnVwdCBjb2RlLgorICovCit2b2lkIGNsb2NrX3dhc19zZXQodm9pZCkKK3sKKwkvKiBSZXRyaWdnZXIgdGhlIENQVSBsb2NhbCBldmVudHMgZXZlcnl3aGVyZSAqLworCW9uX2VhY2hfY3B1KHJldHJpZ2dlcl9uZXh0X2V2ZW50LCBOVUxMLCAwLCAxKTsKK30KKworLyoKKyAqIENoZWNrLCB3aGV0aGVyIHRoZSB0aW1lciBpcyBvbiB0aGUgY2FsbGJhY2sgcGVuZGluZyBsaXN0CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfY2JfcGVuZGluZyhjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJcmV0dXJuIHRpbWVyLT5zdGF0ZSAmIEhSVElNRVJfU1RBVEVfUEVORElORzsKK30KKworLyoKKyAqIFJlbW92ZSBhIHRpbWVyIGZyb20gdGhlIGNhbGxiYWNrIHBlbmRpbmcgbGlzdAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9yZW1vdmVfY2JfcGVuZGluZyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJbGlzdF9kZWxfaW5pdCgmdGltZXItPmNiX2VudHJ5KTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIGhpZ2ggcmVzb2x1dGlvbiByZWxhdGVkIHBhcnRzIG9mIGNwdV9iYXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfaHJlcyhzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSkKK3sKKwliYXNlLT5leHBpcmVzX25leHQudHY2NCA9IEtUSU1FX01BWDsKKwliYXNlLT5ocmVzX2FjdGl2ZSA9IDA7CisJSU5JVF9MSVNUX0hFQUQoJmJhc2UtPmNiX3BlbmRpbmcpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgaGlnaCByZXNvbHV0aW9uIHJlbGF0ZWQgcGFydHMgb2YgYSBocnRpbWVyCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfdGltZXJfaHJlcyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCit7CisJSU5JVF9MSVNUX0hFQUQoJnRpbWVyLT5jYl9lbnRyeSk7Cit9CisKKy8qCisgKiBXaGVuIEhpZ2ggcmVzb2x1dGlvbiB0aW1lcnMgYXJlIGFjdGl2ZSwgdHJ5IHRvIHJlcHJvZ3JhbS4gTm90ZSwgdGhhdCBpbiBjYXNlCisgKiB0aGUgc3RhdGUgaGFzIEhSVElNRVJfU1RBVEVfQ0FMTEJBQ0sgc2V0LCBubyByZXByb2dyYW1taW5nIGFuZCBubyBleHBpcnkKKyAqIGNoZWNrIGhhcHBlbnMuIFRoZSB0aW1lciBnZXRzIGVucXVldWVkIGludG8gdGhlIHJidHJlZS4gVGhlIHJlcHJvZ3JhbW1pbmcKKyAqIGFuZCBleHBpcnkgY2hlY2sgaXMgZG9uZSBpbiB0aGUgaHJ0aW1lcl9pbnRlcnJ1cHQgb3IgaW4gdGhlIHNvZnRpcnEuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGhydGltZXJfZW5xdWV1ZV9yZXByb2dyYW0oc3RydWN0IGhydGltZXIgKnRpbWVyLAorCQkJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKK3sKKwlpZiAoYmFzZS0+Y3B1X2Jhc2UtPmhyZXNfYWN0aXZlICYmIGhydGltZXJfcmVwcm9ncmFtKHRpbWVyLCBiYXNlKSkgeworCisJCS8qIFRpbWVyIGlzIGV4cGlyZWQsIGFjdCB1cG9uIHRoZSBjYWxsYmFjayBtb2RlICovCisJCXN3aXRjaCh0aW1lci0+Y2JfbW9kZSkgeworCQljYXNlIEhSVElNRVJfQ0JfSVJRU0FGRV9OT19SRVNUQVJUOgorCQkJLyoKKwkJCSAqIFdlIGNhbiBjYWxsIHRoZSBjYWxsYmFjayBmcm9tIGhlcmUuIE5vIHJlc3RhcnQKKwkJCSAqIGhhcHBlbnMsIHNvIG5vIGRhbmdlciBvZiByZWN1cnNpb24KKwkJCSAqLworCQkJQlVHX09OKHRpbWVyLT5mdW5jdGlvbih0aW1lcikgIT0gSFJUSU1FUl9OT1JFU1RBUlQpOworCQkJcmV0dXJuIDE7CisJCWNhc2UgSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlE6CisJCQkvKgorCQkJICogVGhpcyBpcyBzb2xlbHkgZm9yIHRoZSBzY2hlZCB0aWNrIGVtdWxhdGlvbiB3aXRoCisJCQkgKiBkeW5hbWljIHRpY2sgc3VwcG9ydCB0byBlbnN1cmUgdGhhdCB3ZSBkbyBub3QKKwkJCSAqIHJlc3RhcnQgdGhlIHRpY2sgcmlnaHQgb24gdGhlIGVkZ2UgYW5kIGVuZCB1cCB3aXRoCisJCQkgKiB0aGUgdGljayB0aW1lciBpbiB0aGUgc29mdGlycSAhIFRoZSBjYWxsaW5nIHNpdGUKKwkJCSAqIHRha2VzIGNhcmUgb2YgdGhpcy4KKwkJCSAqLworCQkJcmV0dXJuIDE7CisJCWNhc2UgSFJUSU1FUl9DQl9JUlFTQUZFOgorCQljYXNlIEhSVElNRVJfQ0JfU09GVElSUToKKwkJCS8qCisJCQkgKiBNb3ZlIGV2ZXJ5dGhpbmcgZWxzZSBpbnRvIHRoZSBzb2Z0aXJxIHBlbmRpbmcgbGlzdCAhCisJCQkgKi8KKwkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5jYl9lbnRyeSwKKwkJCQkgICAgICAmYmFzZS0+Y3B1X2Jhc2UtPmNiX3BlbmRpbmcpOworCQkJdGltZXItPnN0YXRlID0gSFJUSU1FUl9TVEFURV9QRU5ESU5HOworCQkJcmFpc2Vfc29mdGlycShIUlRJTUVSX1NPRlRJUlEpOworCQkJcmV0dXJuIDE7CisJCWRlZmF1bHQ6CisJCQlCVUcoKTsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFN3aXRjaCB0byBoaWdoIHJlc29sdXRpb24gbW9kZQorICovCitzdGF0aWMgdm9pZCBocnRpbWVyX3N3aXRjaF90b19ocmVzKHZvaWQpCit7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmJhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKGJhc2UtPmhyZXNfYWN0aXZlKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlpZiAodGlja19pbml0X2hpZ2hyZXMoKSkgeworCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CisJCXJldHVybjsKKwl9CisJYmFzZS0+aHJlc19hY3RpdmUgPSAxOworCWJhc2UtPmNsb2NrX2Jhc2VbQ0xPQ0tfUkVBTFRJTUVdLnJlc29sdXRpb24gPSBLVElNRV9ISUdIX1JFUzsKKwliYXNlLT5jbG9ja19iYXNlW0NMT0NLX01PTk9UT05JQ10ucmVzb2x1dGlvbiA9IEtUSU1FX0hJR0hfUkVTOworCisJdGlja19zZXR1cF9zY2hlZF90aW1lcigpOworCisJLyogIlJldHJpZ2dlciIgdGhlIGludGVycnVwdCB0byBnZXQgdGhpbmdzIGdvaW5nICovCisJcmV0cmlnZ2VyX25leHRfZXZlbnQoTlVMTCk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIGhpZ2ggcmVzb2x1dGlvbiBtb2RlIG9uIENQVSAlZFxuIiwKKwkgICAgICAgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgaHJ0aW1lcl9ocmVzX2FjdGl2ZSh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2lzX2hyZXNfZW5hYmxlZCh2b2lkKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9zd2l0Y2hfdG9faHJlcyh2b2lkKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSkgeyB9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtKHN0cnVjdCBocnRpbWVyICp0aW1lciwKKwkJCQkJICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCBocnRpbWVyX2NiX3BlbmRpbmcoc3RydWN0IGhydGltZXIgKnRpbWVyKSB7IHJldHVybiAwOyB9CitzdGF0aWMgaW5saW5lIHZvaWQgaHJ0aW1lcl9yZW1vdmVfY2JfcGVuZGluZyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIGhydGltZXJfaW5pdF9ocmVzKHN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpiYXNlKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBocnRpbWVyX2luaXRfdGltZXJfaHJlcyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpIHsgfQorCisjZW5kaWYgLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLworCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCit2b2lkIF9fdGltZXJfc3RhdHNfaHJ0aW1lcl9zZXRfc3RhcnRfaW5mbyhzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHZvaWQgKmFkZHIpCit7CisJaWYgKHRpbWVyLT5zdGFydF9zaXRlKQorCQlyZXR1cm47CisKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IGFkZHI7CisJbWVtY3B5KHRpbWVyLT5zdGFydF9jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwl0aW1lci0+c3RhcnRfcGlkID0gY3VycmVudC0+cGlkOworfQorI2VuZGlmCisKIC8qCiAgKiBDb3VudGVycGFydCB0byBsb2NrX3RpbWVyX2Jhc2UgYWJvdmU6CiAgKi8KIHN0YXRpYyBpbmxpbmUKIHZvaWQgdW5sb2NrX2hydGltZXJfYmFzZShjb25zdCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQogewotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5iYXNlLT5sb2NrLCAqZmxhZ3MpOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpbWVyLT5iYXNlLT5jcHVfYmFzZS0+bG9jaywgKmZsYWdzKTsKIH0KIAogLyoqCkBAIC0zNDIsNyArNjUzLDggQEAKICAqIFRoZSB0aW1lciBpcyBpbnNlcnRlZCBpbiBleHBpcnkgb3JkZXIuIEluc2VydGlvbiBpbnRvIHRoZQogICogcmVkIGJsYWNrIHRyZWUgaXMgTyhsb2cobikpLiBNdXN0IGhvbGQgdGhlIGJhc2UgbG9jay4KICAqLwotc3RhdGljIHZvaWQgZW5xdWV1ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3N0YXRpYyB2b2lkIGVucXVldWVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgaW50IHJlcHJvZ3JhbSkKIHsKIAlzdHJ1Y3QgcmJfbm9kZSAqKmxpbmsgPSAmYmFzZS0+YWN0aXZlLnJiX25vZGU7CiAJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CkBAIC0zNjgsMzkgKzY4MCw4NSBAQAogCSAqIEluc2VydCB0aGUgdGltZXIgdG8gdGhlIHJidHJlZSBhbmQgY2hlY2sgd2hldGhlciBpdAogCSAqIHJlcGxhY2VzIHRoZSBmaXJzdCBwZW5kaW5nIHRpbWVyCiAJICovCisJaWYgKCFiYXNlLT5maXJzdCB8fCB0aW1lci0+ZXhwaXJlcy50djY0IDwKKwkgICAgcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKS0+ZXhwaXJlcy50djY0KSB7CisJCS8qCisJCSAqIFJlcHJvZ3JhbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlLiBXaGVuIHRoZSB0aW1lciBpcyBhbHJlYWR5CisJCSAqIGV4cGlyZWQgaHJ0aW1lcl9lbnF1ZXVlX3JlcHJvZ3JhbSBoYXMgZWl0aGVyIGNhbGxlZCB0aGUKKwkJICogY2FsbGJhY2sgb3IgYWRkZWQgaXQgdG8gdGhlIHBlbmRpbmcgbGlzdCBhbmQgcmFpc2VkIHRoZQorCQkgKiBzb2Z0aXJxLgorCQkgKgorCQkgKiBUaGlzIGlzIGEgTk9QIGZvciAhSElHSFJFUworCQkgKi8KKwkJaWYgKHJlcHJvZ3JhbSAmJiBocnRpbWVyX2VucXVldWVfcmVwcm9ncmFtKHRpbWVyLCBiYXNlKSkKKwkJCXJldHVybjsKKworCQliYXNlLT5maXJzdCA9ICZ0aW1lci0+bm9kZTsKKwl9CisKIAlyYl9saW5rX25vZGUoJnRpbWVyLT5ub2RlLCBwYXJlbnQsIGxpbmspOwogCXJiX2luc2VydF9jb2xvcigmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOwotCi0JaWYgKCFiYXNlLT5maXJzdCB8fCB0aW1lci0+ZXhwaXJlcy50djY0IDwKLQkgICAgcmJfZW50cnkoYmFzZS0+Zmlyc3QsIHN0cnVjdCBocnRpbWVyLCBub2RlKS0+ZXhwaXJlcy50djY0KQotCQliYXNlLT5maXJzdCA9ICZ0aW1lci0+bm9kZTsKKwkvKgorCSAqIEhSVElNRVJfU1RBVEVfRU5RVUVVRUQgaXMgb3InZWQgdG8gdGhlIGN1cnJlbnQgc3RhdGUgdG8gcHJlc2VydmUgdGhlCisJICogc3RhdGUgb2YgYSBwb3NzaWJseSBydW5uaW5nIGNhbGxiYWNrLgorCSAqLworCXRpbWVyLT5zdGF0ZSB8PSBIUlRJTUVSX1NUQVRFX0VOUVVFVUVEOwogfQogCiAvKgogICogX19yZW1vdmVfaHJ0aW1lciAtIGludGVybmFsIGZ1bmN0aW9uIHRvIHJlbW92ZSBhIHRpbWVyCiAgKgogICogQ2FsbGVyIG11c3QgaG9sZCB0aGUgYmFzZSBsb2NrLgorICoKKyAqIEhpZ2ggcmVzb2x1dGlvbiB0aW1lciBtb2RlIHJlcHJvZ3JhbXMgdGhlIGNsb2NrIGV2ZW50IGRldmljZSB3aGVuIHRoZQorICogdGltZXIgaXMgdGhlIG9uZSB3aGljaCBleHBpcmVzIG5leHQuIFRoZSBjYWxsZXIgY2FuIGRpc2FibGUgdGhpcyBieSBzZXR0aW5nCisgKiByZXByb2dyYW0gdG8gemVyby4gVGhpcyBpcyB1c2VmdWwsIHdoZW4gdGhlIGNvbnRleHQgZG9lcyBhIHJlcHJvZ3JhbW1pbmcKKyAqIGFueXdheSAoZS5nLiB0aW1lciBpbnRlcnJ1cHQpCiAgKi8KLXN0YXRpYyB2b2lkIF9fcmVtb3ZlX2hydGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyLCBzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlKQorc3RhdGljIHZvaWQgX19yZW1vdmVfaHJ0aW1lcihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsCisJCQkgICAgIHN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UsCisJCQkgICAgIHVuc2lnbmVkIGxvbmcgbmV3c3RhdGUsIGludCByZXByb2dyYW0pCiB7Ci0JLyoKLQkgKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHJidHJlZSBhbmQgcmVwbGFjZSB0aGUKLQkgKiBmaXJzdCBlbnRyeSBwb2ludGVyIGlmIG5lY2Vzc2FyeS4KLQkgKi8KLQlpZiAoYmFzZS0+Zmlyc3QgPT0gJnRpbWVyLT5ub2RlKQotCQliYXNlLT5maXJzdCA9IHJiX25leHQoJnRpbWVyLT5ub2RlKTsKLQlyYl9lcmFzZSgmdGltZXItPm5vZGUsICZiYXNlLT5hY3RpdmUpOwotCXJiX3NldF9wYXJlbnQoJnRpbWVyLT5ub2RlLCAmdGltZXItPm5vZGUpOworCS8qIEhpZ2ggcmVzLiBjYWxsYmFjayBsaXN0LiBOT1AgZm9yICFISUdIUkVTICovCisJaWYgKGhydGltZXJfY2JfcGVuZGluZyh0aW1lcikpCisJCWhydGltZXJfcmVtb3ZlX2NiX3BlbmRpbmcodGltZXIpOworCWVsc2UgeworCQkvKgorCQkgKiBSZW1vdmUgdGhlIHRpbWVyIGZyb20gdGhlIHJidHJlZSBhbmQgcmVwbGFjZSB0aGUKKwkJICogZmlyc3QgZW50cnkgcG9pbnRlciBpZiBuZWNlc3NhcnkuCisJCSAqLworCQlpZiAoYmFzZS0+Zmlyc3QgPT0gJnRpbWVyLT5ub2RlKSB7CisJCQliYXNlLT5maXJzdCA9IHJiX25leHQoJnRpbWVyLT5ub2RlKTsKKwkJCS8qIFJlcHJvZ3JhbSB0aGUgY2xvY2sgZXZlbnQgZGV2aWNlLiBpZiBlbmFibGVkICovCisJCQlpZiAocmVwcm9ncmFtICYmIGhydGltZXJfaHJlc19hY3RpdmUoKSkKKwkJCQlocnRpbWVyX2ZvcmNlX3JlcHJvZ3JhbShiYXNlLT5jcHVfYmFzZSk7CisJCX0KKwkJcmJfZXJhc2UoJnRpbWVyLT5ub2RlLCAmYmFzZS0+YWN0aXZlKTsKKwl9CisJdGltZXItPnN0YXRlID0gbmV3c3RhdGU7CiB9CiAKIC8qCiAgKiByZW1vdmUgaHJ0aW1lciwgY2FsbGVkIHdpdGggYmFzZSBsb2NrIGhlbGQKICAqLwogc3RhdGljIGlubGluZSBpbnQKLXJlbW92ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3JlbW92ZV9ocnRpbWVyKHN0cnVjdCBocnRpbWVyICp0aW1lciwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSkKIHsKLQlpZiAoaHJ0aW1lcl9hY3RpdmUodGltZXIpKSB7Ci0JCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIGJhc2UpOworCWlmIChocnRpbWVyX2lzX3F1ZXVlZCh0aW1lcikpIHsKKwkJaW50IHJlcHJvZ3JhbTsKKworCQkvKgorCQkgKiBSZW1vdmUgdGhlIHRpbWVyIGFuZCBmb3JjZSByZXByb2dyYW1taW5nIHdoZW4gaGlnaAorCQkgKiByZXNvbHV0aW9uIG1vZGUgaXMgYWN0aXZlIGFuZCB0aGUgdGltZXIgaXMgb24gdGhlIGN1cnJlbnQKKwkJICogQ1BVLiBJZiB3ZSByZW1vdmUgYSB0aW1lciBvbiBhbm90aGVyIENQVSwgcmVwcm9ncmFtbWluZyBpcworCQkgKiBza2lwcGVkLiBUaGUgaW50ZXJydXB0IGV2ZW50IG9uIHRoaXMgQ1BVIGlzIGZpcmVkIGFuZAorCQkgKiByZXByb2dyYW1taW5nIGhhcHBlbnMgaW4gdGhlIGludGVycnVwdCBoYW5kbGVyLiBUaGlzIGlzIGEKKwkJICogcmFyZSBjYXNlIGFuZCBsZXNzIGV4cGVuc2l2ZSB0aGFuIGEgc21wIGNhbGwuCisJCSAqLworCQl0aW1lcl9zdGF0c19ocnRpbWVyX2NsZWFyX3N0YXJ0X2luZm8odGltZXIpOworCQlyZXByb2dyYW0gPSBiYXNlLT5jcHVfYmFzZSA9PSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwgSFJUSU1FUl9TVEFURV9JTkFDVElWRSwKKwkJCQkgcmVwcm9ncmFtKTsKIAkJcmV0dXJuIDE7CiAJfQogCXJldHVybiAwOwpAQCAtNDE5LDcgKzc3Nyw3IEBACiBpbnQKIGhydGltZXJfc3RhcnQoc3RydWN0IGhydGltZXIgKnRpbWVyLCBrdGltZV90IHRpbSwgY29uc3QgZW51bSBocnRpbWVyX21vZGUgbW9kZSkKIHsKLQlzdHJ1Y3QgaHJ0aW1lcl9iYXNlICpiYXNlLCAqbmV3X2Jhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgKm5ld19iYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldDsKIApAQCAtNDMxLDcgKzc4OSw3IEBACiAJLyogU3dpdGNoIHRoZSB0aW1lciBiYXNlLCBpZiBuZWNlc3Nhcnk6ICovCiAJbmV3X2Jhc2UgPSBzd2l0Y2hfaHJ0aW1lcl9iYXNlKHRpbWVyLCBiYXNlKTsKIAotCWlmIChtb2RlID09IEhSVElNRVJfUkVMKSB7CisJaWYgKG1vZGUgPT0gSFJUSU1FUl9NT0RFX1JFTCkgewogCQl0aW0gPSBrdGltZV9hZGQodGltLCBuZXdfYmFzZS0+Z2V0X3RpbWUoKSk7CiAJCS8qCiAJCSAqIENPTkZJR19USU1FX0xPV19SRVMgaXMgYSB0ZW1wb3Jhcnkgd2F5IGZvciBhcmNoaXRlY3R1cmVzCkBAIC00NDYsNyArODA0LDkgQEAKIAl9CiAJdGltZXItPmV4cGlyZXMgPSB0aW07CiAKLQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlKTsKKwl0aW1lcl9zdGF0c19ocnRpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKKworCWVucXVldWVfaHJ0aW1lcih0aW1lciwgbmV3X2Jhc2UsIGJhc2UgPT0gbmV3X2Jhc2UpOwogCiAJdW5sb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIApAQCAtNDY2LDEzICs4MjYsMTMgQEAKICAqLwogaW50IGhydGltZXJfdHJ5X3RvX2NhbmNlbChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IC0xOwogCiAJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwogCi0JaWYgKGJhc2UtPmN1cnJfdGltZXIgIT0gdGltZXIpCisJaWYgKCFocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKQogCQlyZXQgPSByZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CiAKIAl1bmxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwpAQCAtNTA4LDE5ICs4NjgsMTkgQEAKICAqLwoga3RpbWVfdCBocnRpbWVyX2dldF9yZW1haW5pbmcoY29uc3Qgc3RydWN0IGhydGltZXIgKnRpbWVyKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2U7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWt0aW1lX3QgcmVtOwogCiAJYmFzZSA9IGxvY2tfaHJ0aW1lcl9iYXNlKHRpbWVyLCAmZmxhZ3MpOwotCXJlbSA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgdGltZXItPmJhc2UtPmdldF90aW1lKCkpOworCXJlbSA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywgYmFzZS0+Z2V0X3RpbWUoKSk7CiAJdW5sb2NrX2hydGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIAogCXJldHVybiByZW07CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2dldF9yZW1haW5pbmcpOwogCi0jaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKyNpZiBkZWZpbmVkKENPTkZJR19OT19JRExFX0haKSB8fCBkZWZpbmVkKENPTkZJR19OT19IWikKIC8qKgogICogaHJ0aW1lcl9nZXRfbmV4dF9ldmVudCAtIGdldCB0aGUgdGltZSB1bnRpbCBuZXh0IGV4cGlyeSBldmVudAogICoKQEAgLTUyOSwyNiArODg5LDMxIEBACiAgKi8KIGt0aW1lX3QgaHJ0aW1lcl9nZXRfbmV4dF9ldmVudCh2b2lkKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2Nsb2NrX2Jhc2UgKmJhc2UgPSBjcHVfYmFzZS0+Y2xvY2tfYmFzZTsKIAlrdGltZV90IGRlbHRhLCBtaW5kZWx0YSA9IHsgLnR2NjQgPSBLVElNRV9NQVggfTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IE1BWF9IUlRJTUVSX0JBU0VTOyBpKyssIGJhc2UrKykgewotCQlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdV9iYXNlLT5sb2NrLCBmbGFncyk7CiAKLQkJc3Bpbl9sb2NrX2lycXNhdmUoJmJhc2UtPmxvY2ssIGZsYWdzKTsKLQkJaWYgKCFiYXNlLT5maXJzdCkgewotCQkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+bG9jaywgZmxhZ3MpOwotCQkJY29udGludWU7CisJaWYgKCFocnRpbWVyX2hyZXNfYWN0aXZlKCkpIHsKKwkJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyssIGJhc2UrKykgeworCQkJc3RydWN0IGhydGltZXIgKnRpbWVyOworCisJCQlpZiAoIWJhc2UtPmZpcnN0KQorCQkJCWNvbnRpbnVlOworCisJCQl0aW1lciA9IHJiX2VudHJ5KGJhc2UtPmZpcnN0LCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisJCQlkZWx0YS50djY0ID0gdGltZXItPmV4cGlyZXMudHY2NDsKKwkJCWRlbHRhID0ga3RpbWVfc3ViKGRlbHRhLCBiYXNlLT5nZXRfdGltZSgpKTsKKwkJCWlmIChkZWx0YS50djY0IDwgbWluZGVsdGEudHY2NCkKKwkJCQltaW5kZWx0YS50djY0ID0gZGVsdGEudHY2NDsKIAkJfQotCQl0aW1lciA9IHJiX2VudHJ5KGJhc2UtPmZpcnN0LCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7Ci0JCWRlbHRhLnR2NjQgPSB0aW1lci0+ZXhwaXJlcy50djY0OwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZiYXNlLT5sb2NrLCBmbGFncyk7Ci0JCWRlbHRhID0ga3RpbWVfc3ViKGRlbHRhLCBiYXNlLT5nZXRfdGltZSgpKTsKLQkJaWYgKGRlbHRhLnR2NjQgPCBtaW5kZWx0YS50djY0KQotCQkJbWluZGVsdGEudHY2NCA9IGRlbHRhLnR2NjQ7CiAJfQorCisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKwogCWlmIChtaW5kZWx0YS50djY0IDwgMCkKIAkJbWluZGVsdGEudHY2NCA9IDA7CiAJcmV0dXJuIG1pbmRlbHRhOwpAQCAtNTY0LDE3ICs5MjksMjMgQEAKIHZvaWQgaHJ0aW1lcl9pbml0KHN0cnVjdCBocnRpbWVyICp0aW1lciwgY2xvY2tpZF90IGNsb2NrX2lkLAogCQkgIGVudW0gaHJ0aW1lcl9tb2RlIG1vZGUpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZXM7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlOwogCiAJbWVtc2V0KHRpbWVyLCAwLCBzaXplb2Yoc3RydWN0IGhydGltZXIpKTsKIAotCWJhc2VzID0gX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJY3B1X2Jhc2UgPSAmX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CiAKLQlpZiAoY2xvY2tfaWQgPT0gQ0xPQ0tfUkVBTFRJTUUgJiYgbW9kZSAhPSBIUlRJTUVSX0FCUykKKwlpZiAoY2xvY2tfaWQgPT0gQ0xPQ0tfUkVBTFRJTUUgJiYgbW9kZSAhPSBIUlRJTUVSX01PREVfQUJTKQogCQljbG9ja19pZCA9IENMT0NLX01PTk9UT05JQzsKIAotCXRpbWVyLT5iYXNlID0gJmJhc2VzW2Nsb2NrX2lkXTsKLQlyYl9zZXRfcGFyZW50KCZ0aW1lci0+bm9kZSwgJnRpbWVyLT5ub2RlKTsKKwl0aW1lci0+YmFzZSA9ICZjcHVfYmFzZS0+Y2xvY2tfYmFzZVtjbG9ja19pZF07CisJaHJ0aW1lcl9pbml0X3RpbWVyX2hyZXModGltZXIpOworCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJdGltZXItPnN0YXJ0X3NpdGUgPSBOVUxMOworCXRpbWVyLT5zdGFydF9waWQgPSAtMTsKKwltZW1zZXQodGltZXItPnN0YXJ0X2NvbW0sIDAsIFRBU0tfQ09NTV9MRU4pOworI2VuZGlmCiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2luaXQpOwogCkBAIC01ODgsMjEgKzk1OSwxNTkgQEAKICAqLwogaW50IGhydGltZXJfZ2V0X3Jlcyhjb25zdCBjbG9ja2lkX3Qgd2hpY2hfY2xvY2ssIHN0cnVjdCB0aW1lc3BlYyAqdHApCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZXM7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlOwogCi0JYmFzZXMgPSBfX3Jhd19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKLQkqdHAgPSBrdGltZV90b190aW1lc3BlYyhiYXNlc1t3aGljaF9jbG9ja10ucmVzb2x1dGlvbik7CisJY3B1X2Jhc2UgPSAmX19yYXdfZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJKnRwID0ga3RpbWVfdG9fdGltZXNwZWMoY3B1X2Jhc2UtPmNsb2NrX2Jhc2Vbd2hpY2hfY2xvY2tdLnJlc29sdXRpb24pOwogCiAJcmV0dXJuIDA7CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChocnRpbWVyX2dldF9yZXMpOwogCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCisvKgorICogSGlnaCByZXNvbHV0aW9uIHRpbWVyIGludGVycnVwdAorICogQ2FsbGVkIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZAorICovCit2b2lkIGhydGltZXJfaW50ZXJydXB0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UgPSAmX19nZXRfY3B1X3ZhcihocnRpbWVyX2Jhc2VzKTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpiYXNlOworCWt0aW1lX3QgZXhwaXJlc19uZXh0LCBub3c7CisJaW50IGksIHJhaXNlID0gMDsKKworCUJVR19PTighY3B1X2Jhc2UtPmhyZXNfYWN0aXZlKTsKKwljcHVfYmFzZS0+bnJfZXZlbnRzKys7CisJZGV2LT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisKKyByZXRyeToKKwlub3cgPSBrdGltZV9nZXQoKTsKKworCWV4cGlyZXNfbmV4dC50djY0ID0gS1RJTUVfTUFYOworCisJYmFzZSA9IGNwdV9iYXNlLT5jbG9ja19iYXNlOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspIHsKKwkJa3RpbWVfdCBiYXNlbm93OworCQlzdHJ1Y3QgcmJfbm9kZSAqbm9kZTsKKworCQlzcGluX2xvY2soJmNwdV9iYXNlLT5sb2NrKTsKKworCQliYXNlbm93ID0ga3RpbWVfYWRkKG5vdywgYmFzZS0+b2Zmc2V0KTsKKworCQl3aGlsZSAoKG5vZGUgPSBiYXNlLT5maXJzdCkpIHsKKwkJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKKworCQkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisKKwkJCWlmIChiYXNlbm93LnR2NjQgPCB0aW1lci0+ZXhwaXJlcy50djY0KSB7CisJCQkJa3RpbWVfdCBleHBpcmVzOworCisJCQkJZXhwaXJlcyA9IGt0aW1lX3N1Yih0aW1lci0+ZXhwaXJlcywKKwkJCQkJCSAgICBiYXNlLT5vZmZzZXQpOworCQkJCWlmIChleHBpcmVzLnR2NjQgPCBleHBpcmVzX25leHQudHY2NCkKKwkJCQkJZXhwaXJlc19uZXh0ID0gZXhwaXJlczsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogTW92ZSBzb2Z0aXJxIGNhbGxiYWNrcyB0byB0aGUgcGVuZGluZyBsaXN0ICovCisJCQlpZiAodGltZXItPmNiX21vZGUgPT0gSFJUSU1FUl9DQl9TT0ZUSVJRKSB7CisJCQkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwKKwkJCQkJCSBIUlRJTUVSX1NUQVRFX1BFTkRJTkcsIDApOworCQkJCWxpc3RfYWRkX3RhaWwoJnRpbWVyLT5jYl9lbnRyeSwKKwkJCQkJICAgICAgJmJhc2UtPmNwdV9iYXNlLT5jYl9wZW5kaW5nKTsKKwkJCQlyYWlzZSA9IDE7CisJCQkJY29udGludWU7CisJCQl9CisKKwkJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIGJhc2UsCisJCQkJCSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLLCAwKTsKKwkJCXRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcih0aW1lcik7CisKKwkJCS8qCisJCQkgKiBOb3RlOiBXZSBjbGVhciB0aGUgQ0FMTEJBQ0sgYml0IGFmdGVyCisJCQkgKiBlbnF1ZXVlX2hydGltZXIgdG8gYXZvaWQgcmVwcm9ncmFtbWluZyBvZgorCQkJICogdGhlIGV2ZW50IGhhcmR3YXJlLiBUaGlzIGhhcHBlbnMgYXQgdGhlIGVuZAorCQkJICogb2YgdGhpcyBmdW5jdGlvbiBhbnl3YXkuCisJCQkgKi8KKwkJCWlmICh0aW1lci0+ZnVuY3Rpb24odGltZXIpICE9IEhSVElNRVJfTk9SRVNUQVJUKSB7CisJCQkJQlVHX09OKHRpbWVyLT5zdGF0ZSAhPSBIUlRJTUVSX1NUQVRFX0NBTExCQUNLKTsKKwkJCQllbnF1ZXVlX2hydGltZXIodGltZXIsIGJhc2UsIDApOworCQkJfQorCQkJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOworCQl9CisJCXNwaW5fdW5sb2NrKCZjcHVfYmFzZS0+bG9jayk7CisJCWJhc2UrKzsKKwl9CisKKwljcHVfYmFzZS0+ZXhwaXJlc19uZXh0ID0gZXhwaXJlc19uZXh0OworCisJLyogUmVwcm9ncmFtbWluZyBuZWNlc3NhcnkgPyAqLworCWlmIChleHBpcmVzX25leHQudHY2NCAhPSBLVElNRV9NQVgpIHsKKwkJaWYgKHRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzX25leHQsIDApKQorCQkJZ290byByZXRyeTsKKwl9CisKKwkvKiBSYWlzZSBzb2Z0aXJxID8gKi8KKwlpZiAocmFpc2UpCisJCXJhaXNlX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRKTsKK30KKworc3RhdGljIHZvaWQgcnVuX2hydGltZXJfc29mdGlycShzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmgpCit7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlID0gJl9fZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisKKwlzcGluX2xvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJmNwdV9iYXNlLT5jYl9wZW5kaW5nKSkgeworCQllbnVtIGhydGltZXJfcmVzdGFydCAoKmZuKShzdHJ1Y3QgaHJ0aW1lciAqKTsKKwkJc3RydWN0IGhydGltZXIgKnRpbWVyOworCQlpbnQgcmVzdGFydDsKKworCQl0aW1lciA9IGxpc3RfZW50cnkoY3B1X2Jhc2UtPmNiX3BlbmRpbmcubmV4dCwKKwkJCQkgICBzdHJ1Y3QgaHJ0aW1lciwgY2JfZW50cnkpOworCisJCXRpbWVyX3N0YXRzX2FjY291bnRfaHJ0aW1lcih0aW1lcik7CisKKwkJZm4gPSB0aW1lci0+ZnVuY3Rpb247CisJCV9fcmVtb3ZlX2hydGltZXIodGltZXIsIHRpbWVyLT5iYXNlLCBIUlRJTUVSX1NUQVRFX0NBTExCQUNLLCAwKTsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwkJcmVzdGFydCA9IGZuKHRpbWVyKTsKKworCQlzcGluX2xvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CisKKwkJdGltZXItPnN0YXRlICY9IH5IUlRJTUVSX1NUQVRFX0NBTExCQUNLOworCQlpZiAocmVzdGFydCA9PSBIUlRJTUVSX1JFU1RBUlQpIHsKKwkJCUJVR19PTihocnRpbWVyX2FjdGl2ZSh0aW1lcikpOworCQkJLyoKKwkJCSAqIEVucXVldWUgdGhlIHRpbWVyLCBhbGxvdyByZXByb2dyYW1taW5nIG9mIHRoZSBldmVudAorCQkJICogZGV2aWNlCisJCQkgKi8KKwkJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgdGltZXItPmJhc2UsIDEpOworCQl9IGVsc2UgaWYgKGhydGltZXJfYWN0aXZlKHRpbWVyKSkgeworCQkJLyoKKwkJCSAqIElmIHRoZSB0aW1lciB3YXMgcmVhcm1lZCBvbiBhbm90aGVyIENQVSwgcmVwcm9ncmFtCisJCQkgKiB0aGUgZXZlbnQgZGV2aWNlLgorCQkJICovCisJCQlpZiAodGltZXItPmJhc2UtPmZpcnN0ID09ICZ0aW1lci0+bm9kZSkKKwkJCQlocnRpbWVyX3JlcHJvZ3JhbSh0aW1lciwgdGltZXItPmJhc2UpOworCQl9CisJfQorCXNwaW5fdW5sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOworfQorCisjZW5kaWYJLyogQ09ORklHX0hJR0hfUkVTX1RJTUVSUyAqLworCiAvKgogICogRXhwaXJlIHRoZSBwZXIgYmFzZSBocnRpbWVyLXF1ZXVlOgogICovCi1zdGF0aWMgaW5saW5lIHZvaWQgcnVuX2hydGltZXJfcXVldWUoc3RydWN0IGhydGltZXJfYmFzZSAqYmFzZSkKK3N0YXRpYyBpbmxpbmUgdm9pZCBydW5faHJ0aW1lcl9xdWV1ZShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqY3B1X2Jhc2UsCisJCQkJICAgICBpbnQgaW5kZXgpCiB7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSA9ICZjcHVfYmFzZS0+Y2xvY2tfYmFzZVtpbmRleF07CiAKIAlpZiAoIWJhc2UtPmZpcnN0KQogCQlyZXR1cm47CkBAIC02MTAsNTMgKzExMTksNzIgQEAKIAlpZiAoYmFzZS0+Z2V0X3NvZnRpcnFfdGltZSkKIAkJYmFzZS0+c29mdGlycV90aW1lID0gYmFzZS0+Z2V0X3NvZnRpcnFfdGltZSgpOwogCi0Jc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJc3Bpbl9sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOwogCiAJd2hpbGUgKChub2RlID0gYmFzZS0+Zmlyc3QpKSB7CiAJCXN0cnVjdCBocnRpbWVyICp0aW1lcjsKLQkJaW50ICgqZm4pKHN0cnVjdCBocnRpbWVyICopOworCQllbnVtIGhydGltZXJfcmVzdGFydCAoKmZuKShzdHJ1Y3QgaHJ0aW1lciAqKTsKIAkJaW50IHJlc3RhcnQ7CiAKIAkJdGltZXIgPSByYl9lbnRyeShub2RlLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CiAJCWlmIChiYXNlLT5zb2Z0aXJxX3RpbWUudHY2NCA8PSB0aW1lci0+ZXhwaXJlcy50djY0KQogCQkJYnJlYWs7CiAKKwkJdGltZXJfc3RhdHNfYWNjb3VudF9ocnRpbWVyKHRpbWVyKTsKKwogCQlmbiA9IHRpbWVyLT5mdW5jdGlvbjsKLQkJc2V0X2N1cnJfdGltZXIoYmFzZSwgdGltZXIpOwotCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBiYXNlKTsKLQkJc3Bpbl91bmxvY2tfaXJxKCZiYXNlLT5sb2NrKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgYmFzZSwgSFJUSU1FUl9TVEFURV9DQUxMQkFDSywgMCk7CisJCXNwaW5fdW5sb2NrX2lycSgmY3B1X2Jhc2UtPmxvY2spOwogCiAJCXJlc3RhcnQgPSBmbih0aW1lcik7CiAKLQkJc3Bpbl9sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJCXNwaW5fbG9ja19pcnEoJmNwdV9iYXNlLT5sb2NrKTsKIAorCQl0aW1lci0+c3RhdGUgJj0gfkhSVElNRVJfU1RBVEVfQ0FMTEJBQ0s7CiAJCWlmIChyZXN0YXJ0ICE9IEhSVElNRVJfTk9SRVNUQVJUKSB7CiAJCQlCVUdfT04oaHJ0aW1lcl9hY3RpdmUodGltZXIpKTsKLQkJCWVucXVldWVfaHJ0aW1lcih0aW1lciwgYmFzZSk7CisJCQllbnF1ZXVlX2hydGltZXIodGltZXIsIGJhc2UsIDApOwogCQl9CiAJfQotCXNldF9jdXJyX3RpbWVyKGJhc2UsIE5VTEwpOwotCXNwaW5fdW5sb2NrX2lycSgmYmFzZS0+bG9jayk7CisJc3Bpbl91bmxvY2tfaXJxKCZjcHVfYmFzZS0+bG9jayk7CiB9CiAKIC8qCiAgKiBDYWxsZWQgZnJvbSB0aW1lciBzb2Z0aXJxIGV2ZXJ5IGppZmZ5LCBleHBpcmUgaHJ0aW1lcnM6CisgKgorICogRm9yIEhSVCBpdHMgdGhlIGZhbGwgYmFjayBjb2RlIHRvIHJ1biB0aGUgc29mdGlycSBpbiB0aGUgdGltZXIKKyAqIHNvZnRpcnEgY29udGV4dCBpbiBjYXNlIHRoZSBocnRpbWVyIGluaXRpYWxpemF0aW9uIGZhaWxlZCBvciBoYXMKKyAqIG5vdCBiZWVuIGRvbmUgeWV0LgogICovCiB2b2lkIGhydGltZXJfcnVuX3F1ZXVlcyh2b2lkKQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZfX2dldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOwogCWludCBpOwogCi0JaHJ0aW1lcl9nZXRfc29mdGlycV90aW1lKGJhc2UpOworCWlmIChocnRpbWVyX2hyZXNfYWN0aXZlKCkpCisJCXJldHVybjsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrKQotCQlydW5faHJ0aW1lcl9xdWV1ZSgmYmFzZVtpXSk7CisJLyoKKwkgKiBUaGlzIF9pc18gdWdseTogV2UgaGF2ZSB0byBjaGVjayBpbiB0aGUgc29mdGlycSBjb250ZXh0LAorCSAqIHdoZXRoZXIgd2UgY2FuIHN3aXRjaCB0byBoaWdocmVzIGFuZCAvIG9yIG5vaHogbW9kZS4gVGhlCisJICogY2xvY2tzb3VyY2Ugc3dpdGNoIGhhcHBlbnMgaW4gdGhlIHRpbWVyIGludGVycnVwdCB3aXRoCisJICogeHRpbWVfbG9jayBoZWxkLiBOb3RpZmljYXRpb24gZnJvbSB0aGVyZSBvbmx5IHNldHMgdGhlCisJICogY2hlY2sgYml0IGluIHRoZSB0aWNrX29uZXNob3QgY29kZSwgb3RoZXJ3aXNlIHdlIG1pZ2h0CisJICogZGVhZGxvY2sgdnMuIHh0aW1lX2xvY2suCisJICovCisJaWYgKHRpY2tfY2hlY2tfb25lc2hvdF9jaGFuZ2UoIWhydGltZXJfaXNfaHJlc19lbmFibGVkKCkpKQorCQlocnRpbWVyX3N3aXRjaF90b19ocmVzKCk7CisKKwlocnRpbWVyX2dldF9zb2Z0aXJxX3RpbWUoY3B1X2Jhc2UpOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspCisJCXJ1bl9ocnRpbWVyX3F1ZXVlKGNwdV9iYXNlLCBpKTsKIH0KIAogLyoKICAqIFNsZWVwIHJlbGF0ZWQgZnVuY3Rpb25zOgogICovCi1zdGF0aWMgaW50IGhydGltZXJfd2FrZXVwKHN0cnVjdCBocnRpbWVyICp0aW1lcikKK3N0YXRpYyBlbnVtIGhydGltZXJfcmVzdGFydCBocnRpbWVyX3dha2V1cChzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCiB7CiAJc3RydWN0IGhydGltZXJfc2xlZXBlciAqdCA9CiAJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IGhydGltZXJfc2xlZXBlciwgdGltZXIpOwpAQCAtNjczLDYgKzEyMDEsOSBAQAogewogCXNsLT50aW1lci5mdW5jdGlvbiA9IGhydGltZXJfd2FrZXVwOwogCXNsLT50YXNrID0gdGFzazsKKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisJc2wtPnRpbWVyLmNiX21vZGUgPSBIUlRJTUVSX0NCX0lSUVNBRkVfTk9fUkVTVEFSVDsKKyNlbmRpZgogfQogCiBzdGF0aWMgaW50IF9fc2NoZWQgZG9fbmFub3NsZWVwKHN0cnVjdCBocnRpbWVyX3NsZWVwZXIgKnQsIGVudW0gaHJ0aW1lcl9tb2RlIG1vZGUpCkBAIC02ODMsMTAgKzEyMTQsMTEgQEAKIAkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKIAkJaHJ0aW1lcl9zdGFydCgmdC0+dGltZXIsIHQtPnRpbWVyLmV4cGlyZXMsIG1vZGUpOwogCi0JCXNjaGVkdWxlKCk7CisJCWlmIChsaWtlbHkodC0+dGFzaykpCisJCQlzY2hlZHVsZSgpOwogCiAJCWhydGltZXJfY2FuY2VsKCZ0LT50aW1lcik7Ci0JCW1vZGUgPSBIUlRJTUVSX0FCUzsKKwkJbW9kZSA9IEhSVElNRVJfTU9ERV9BQlM7CiAKIAl9IHdoaWxlICh0LT50YXNrICYmICFzaWduYWxfcGVuZGluZyhjdXJyZW50KSk7CiAKQEAgLTcwMiwxMCArMTIzNCwxMCBAQAogCiAJcmVzdGFydC0+Zm4gPSBkb19ub19yZXN0YXJ0X3N5c2NhbGw7CiAKLQlocnRpbWVyX2luaXQoJnQudGltZXIsIHJlc3RhcnQtPmFyZzAsIEhSVElNRVJfQUJTKTsKKwlocnRpbWVyX2luaXQoJnQudGltZXIsIHJlc3RhcnQtPmFyZzAsIEhSVElNRVJfTU9ERV9BQlMpOwogCXQudGltZXIuZXhwaXJlcy50djY0ID0gKCh1NjQpcmVzdGFydC0+YXJnMyA8PCAzMikgfCAodTY0KSByZXN0YXJ0LT5hcmcyOwogCi0JaWYgKGRvX25hbm9zbGVlcCgmdCwgSFJUSU1FUl9BQlMpKQorCWlmIChkb19uYW5vc2xlZXAoJnQsIEhSVElNRVJfTU9ERV9BQlMpKQogCQlyZXR1cm4gMDsKIAogCXJtdHAgPSAoc3RydWN0IHRpbWVzcGVjIF9fdXNlciAqKSByZXN0YXJ0LT5hcmcxOwpAQCAtNzM4LDcgKzEyNzAsNyBAQAogCQlyZXR1cm4gMDsKIAogCS8qIEFic29sdXRlIHRpbWVycyBkbyBub3QgdXBkYXRlIHRoZSBybXRwIHZhbHVlIGFuZCByZXN0YXJ0OiAqLwotCWlmIChtb2RlID09IEhSVElNRVJfQUJTKQorCWlmIChtb2RlID09IEhSVElNRVJfTU9ERV9BQlMpCiAJCXJldHVybiAtRVJFU1RBUlROT0hBTkQ7CiAKIAlpZiAocm10cCkgewpAQCAtNzcxLDcgKzEzMDMsNyBAQAogCWlmICghdGltZXNwZWNfdmFsaWQoJnR1KSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXR1cm4gaHJ0aW1lcl9uYW5vc2xlZXAoJnR1LCBybXRwLCBIUlRJTUVSX1JFTCwgQ0xPQ0tfTU9OT1RPTklDKTsKKwlyZXR1cm4gaHJ0aW1lcl9uYW5vc2xlZXAoJnR1LCBybXRwLCBIUlRJTUVSX01PREVfUkVMLCBDTE9DS19NT05PVE9OSUMpOwogfQogCiAvKgpAQCAtNzc5LDU2ICsxMzExLDYwIEBACiAgKi8KIHN0YXRpYyB2b2lkIF9fZGV2aW5pdCBpbml0X2hydGltZXJzX2NwdShpbnQgY3B1KQogewotCXN0cnVjdCBocnRpbWVyX2Jhc2UgKmJhc2UgPSBwZXJfY3B1KGhydGltZXJfYmFzZXMsIGNwdSk7CisJc3RydWN0IGhydGltZXJfY3B1X2Jhc2UgKmNwdV9iYXNlID0gJnBlcl9jcHUoaHJ0aW1lcl9iYXNlcywgY3B1KTsKIAlpbnQgaTsKIAotCWZvciAoaSA9IDA7IGkgPCBNQVhfSFJUSU1FUl9CQVNFUzsgaSsrLCBiYXNlKyspIHsKLQkJc3Bpbl9sb2NrX2luaXQoJmJhc2UtPmxvY2spOwotCQlsb2NrZGVwX3NldF9jbGFzcygmYmFzZS0+bG9jaywgJmJhc2UtPmxvY2tfa2V5KTsKLQl9CisJc3Bpbl9sb2NrX2luaXQoJmNwdV9iYXNlLT5sb2NrKTsKKwlsb2NrZGVwX3NldF9jbGFzcygmY3B1X2Jhc2UtPmxvY2ssICZjcHVfYmFzZS0+bG9ja19rZXkpOworCisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspCisJCWNwdV9iYXNlLT5jbG9ja19iYXNlW2ldLmNwdV9iYXNlID0gY3B1X2Jhc2U7CisKKwlocnRpbWVyX2luaXRfaHJlcyhjcHVfYmFzZSk7CiB9CiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAotc3RhdGljIHZvaWQgbWlncmF0ZV9ocnRpbWVyX2xpc3Qoc3RydWN0IGhydGltZXJfYmFzZSAqb2xkX2Jhc2UsCi0JCQkJc3RydWN0IGhydGltZXJfYmFzZSAqbmV3X2Jhc2UpCitzdGF0aWMgdm9pZCBtaWdyYXRlX2hydGltZXJfbGlzdChzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpvbGRfYmFzZSwKKwkJCQlzdHJ1Y3QgaHJ0aW1lcl9jbG9ja19iYXNlICpuZXdfYmFzZSkKIHsKIAlzdHJ1Y3QgaHJ0aW1lciAqdGltZXI7CiAJc3RydWN0IHJiX25vZGUgKm5vZGU7CiAKIAl3aGlsZSAoKG5vZGUgPSByYl9maXJzdCgmb2xkX2Jhc2UtPmFjdGl2ZSkpKSB7CiAJCXRpbWVyID0gcmJfZW50cnkobm9kZSwgc3RydWN0IGhydGltZXIsIG5vZGUpOwotCQlfX3JlbW92ZV9ocnRpbWVyKHRpbWVyLCBvbGRfYmFzZSk7CisJCUJVR19PTihocnRpbWVyX2NhbGxiYWNrX3J1bm5pbmcodGltZXIpKTsKKwkJX19yZW1vdmVfaHJ0aW1lcih0aW1lciwgb2xkX2Jhc2UsIEhSVElNRVJfU1RBVEVfSU5BQ1RJVkUsIDApOwogCQl0aW1lci0+YmFzZSA9IG5ld19iYXNlOwotCQllbnF1ZXVlX2hydGltZXIodGltZXIsIG5ld19iYXNlKTsKKwkJLyoKKwkJICogRW5xdWV1ZSB0aGUgdGltZXIuIEFsbG93IHJlcHJvZ3JhbW1pbmcgb2YgdGhlIGV2ZW50IGRldmljZQorCQkgKi8KKwkJZW5xdWV1ZV9ocnRpbWVyKHRpbWVyLCBuZXdfYmFzZSwgMSk7CiAJfQogfQogCiBzdGF0aWMgdm9pZCBtaWdyYXRlX2hydGltZXJzKGludCBjcHUpCiB7Ci0Jc3RydWN0IGhydGltZXJfYmFzZSAqb2xkX2Jhc2UsICpuZXdfYmFzZTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqb2xkX2Jhc2UsICpuZXdfYmFzZTsKIAlpbnQgaTsKIAogCUJVR19PTihjcHVfb25saW5lKGNwdSkpOwotCW9sZF9iYXNlID0gcGVyX2NwdShocnRpbWVyX2Jhc2VzLCBjcHUpOwotCW5ld19iYXNlID0gZ2V0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CisJb2xkX2Jhc2UgPSAmcGVyX2NwdShocnRpbWVyX2Jhc2VzLCBjcHUpOworCW5ld19iYXNlID0gJmdldF9jcHVfdmFyKGhydGltZXJfYmFzZXMpOworCisJdGlja19jYW5jZWxfc2NoZWRfdGltZXIoY3B1KTsKIAogCWxvY2FsX2lycV9kaXNhYmxlKCk7CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0hSVElNRVJfQkFTRVM7IGkrKykgeworCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmxvY2spOworCXNwaW5fbG9jaygmb2xkX2Jhc2UtPmxvY2spOwogCi0JCXNwaW5fbG9jaygmbmV3X2Jhc2UtPmxvY2spOwotCQlzcGluX2xvY2soJm9sZF9iYXNlLT5sb2NrKTsKLQotCQlCVUdfT04ob2xkX2Jhc2UtPmN1cnJfdGltZXIpOwotCi0JCW1pZ3JhdGVfaHJ0aW1lcl9saXN0KG9sZF9iYXNlLCBuZXdfYmFzZSk7Ci0KLQkJc3Bpbl91bmxvY2soJm9sZF9iYXNlLT5sb2NrKTsKLQkJc3Bpbl91bmxvY2soJm5ld19iYXNlLT5sb2NrKTsKLQkJb2xkX2Jhc2UrKzsKLQkJbmV3X2Jhc2UrKzsKKwlmb3IgKGkgPSAwOyBpIDwgSFJUSU1FUl9NQVhfQ0xPQ0tfQkFTRVM7IGkrKykgeworCQltaWdyYXRlX2hydGltZXJfbGlzdCgmb2xkX2Jhc2UtPmNsb2NrX2Jhc2VbaV0sCisJCQkJICAgICAmbmV3X2Jhc2UtPmNsb2NrX2Jhc2VbaV0pOwogCX0KKwlzcGluX3VubG9jaygmb2xkX2Jhc2UtPmxvY2spOworCXNwaW5fdW5sb2NrKCZuZXdfYmFzZS0+bG9jayk7CiAKIAlsb2NhbF9pcnFfZW5hYmxlKCk7CiAJcHV0X2NwdV92YXIoaHJ0aW1lcl9iYXNlcyk7CkBAIC04NDgsNiArMTM4NCw3IEBACiAKICNpZmRlZiBDT05GSUdfSE9UUExVR19DUFUKIAljYXNlIENQVV9ERUFEOgorCQljbG9ja2V2ZW50c19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9DUFVfREVBRCwgJmNwdSk7CiAJCW1pZ3JhdGVfaHJ0aW1lcnMoY3B1KTsKIAkJYnJlYWs7CiAjZW5kaWYKQEAgLTg2OCw1ICsxNDA1LDggQEAKIAlocnRpbWVyX2NwdV9ub3RpZnkoJmhydGltZXJzX25iLCAodW5zaWduZWQgbG9uZylDUFVfVVBfUFJFUEFSRSwKIAkJCSAgKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwogCXJlZ2lzdGVyX2NwdV9ub3RpZmllcigmaHJ0aW1lcnNfbmIpOworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlvcGVuX3NvZnRpcnEoSFJUSU1FUl9TT0ZUSVJRLCBydW5faHJ0aW1lcl9zb2Z0aXJxLCBOVUxMKTsKKyNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL2NoaXAuYyBiL2tlcm5lbC9pcnEvY2hpcC5jCmluZGV4IDQ3NWU4YTcuLjAxMzNmNGYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvY2hpcC5jCisrKyBiL2tlcm5lbC9pcnEvY2hpcC5jCkBAIC0xNjgsNyArMTY4LDcgQEAKIC8qKgogICoJc2V0X2lycV9kYXRhIC0gc2V0IGlycSB0eXBlIGRhdGEgZm9yIGFuIGlycQogICoJQGlycToJSW50ZXJydXB0IG51bWJlcgotICoJQGRhdGE6CVBvaW50ZXIgdG8gaW50ZXJydXB0IHNwZWNpZmljIGRhdGEKKyAqCUBlbnRyeToJUG9pbnRlciB0byBNU0kgZGVzY3JpcHRvciBkYXRhCiAgKgogICoJU2V0IHRoZSBoYXJkd2FyZSBpcnEgY29udHJvbGxlciBkYXRhIGZvciBhbiBpcnEKICAqLwpAQCAtMjMwLDEwICsyMzAsNiBAQAogICovCiBzdGF0aWMgdm9pZCBkZWZhdWx0X2Rpc2FibGUodW5zaWduZWQgaW50IGlycSkKIHsKLQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfZGVzYyArIGlycTsKLQotCWlmICghKGRlc2MtPnN0YXR1cyAmIElSUV9ERUxBWUVEX0RJU0FCTEUpKQotCQlkZXNjLT5jaGlwLT5tYXNrKGlycSk7CiB9CiAKIC8qCkBAIC0yOTgsMTMgKzI5NCwxOCBAQAogCiAJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKSkKIAkJZ290byBvdXRfdW5sb2NrOwotCWRlc2MtPnN0YXR1cyAmPSB+KElSUV9SRVBMQVkgfCBJUlFfV0FJVElORyk7CiAJa3N0YXRfY3B1KGNwdSkuaXJxc1tpcnFdKys7CiAKIAlhY3Rpb24gPSBkZXNjLT5hY3Rpb247Ci0JaWYgKHVubGlrZWx5KCFhY3Rpb24gfHwgKGRlc2MtPnN0YXR1cyAmIElSUV9ESVNBQkxFRCkpKQorCWlmICh1bmxpa2VseSghYWN0aW9uIHx8IChkZXNjLT5zdGF0dXMgJiBJUlFfRElTQUJMRUQpKSkgeworCQlpZiAoZGVzYy0+Y2hpcC0+bWFzaykKKwkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKKwkJZGVzYy0+c3RhdHVzICY9IH4oSVJRX1JFUExBWSB8IElSUV9XQUlUSU5HKTsKKwkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRU5ESU5HOwogCQlnb3RvIG91dF91bmxvY2s7CisJfQogCisJZGVzYy0+c3RhdHVzICY9IH4oSVJRX1JFUExBWSB8IElSUV9XQUlUSU5HIHwgSVJRX1BFTkRJTkcpOwogCWRlc2MtPnN0YXR1cyB8PSBJUlFfSU5QUk9HUkVTUzsKIAlzcGluX3VubG9jaygmZGVzYy0+bG9jayk7CiAKQEAgLTM5NiwxMSArMzk3LDEzIEBACiAKIAkvKgogCSAqIElmIGl0cyBkaXNhYmxlZCBvciBubyBhY3Rpb24gYXZhaWxhYmxlCi0JICoga2VlcCBpdCBtYXNrZWQgYW5kIGdldCBvdXQgb2YgaGVyZQorCSAqIHRoZW4gbWFzayBpdCBhbmQgZ2V0IG91dCBvZiBoZXJlOgogCSAqLwogCWFjdGlvbiA9IGRlc2MtPmFjdGlvbjsKIAlpZiAodW5saWtlbHkoIWFjdGlvbiB8fCAoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkpIHsKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRU5ESU5HOworCQlpZiAoZGVzYy0+Y2hpcC0+bWFzaykKKwkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC01NjIsMTAgKzU2NSw4IEBACiAKIAkvKiBVbmluc3RhbGw/ICovCiAJaWYgKGhhbmRsZSA9PSBoYW5kbGVfYmFkX2lycSkgewotCQlpZiAoZGVzYy0+Y2hpcCAhPSAmbm9faXJxX2NoaXApIHsKLQkJCWRlc2MtPmNoaXAtPm1hc2soaXJxKTsKLQkJCWRlc2MtPmNoaXAtPmFjayhpcnEpOwotCQl9CisJCWlmIChkZXNjLT5jaGlwICE9ICZub19pcnFfY2hpcCkKKwkJCW1hc2tfYWNrX2lycShkZXNjLCBpcnEpOwogCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0RJU0FCTEVEOwogCQlkZXNjLT5kZXB0aCA9IDE7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9tYW5hZ2UuYyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKaW5kZXggYWNjNWQ5Zi4uNTU5N2MxNSAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9tYW5hZ2UuYworKysgYi9rZXJuZWwvaXJxL21hbmFnZS5jCkBAIC0zOCw2ICszOCw0NiBAQAogfQogRVhQT1JUX1NZTUJPTChzeW5jaHJvbml6ZV9pcnEpOwogCisvKioKKyAqCWlycV9jYW5fc2V0X2FmZmluaXR5IC0gQ2hlY2sgaWYgdGhlIGFmZmluaXR5IG9mIGEgZ2l2ZW4gaXJxIGNhbiBiZSBzZXQKKyAqCUBpcnE6CQlJbnRlcnJ1cHQgdG8gY2hlY2sKKyAqCisgKi8KK2ludCBpcnFfY2FuX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV9kZXNjICsgaXJxOworCisJaWYgKENIRUNLX0lSUV9QRVJfQ1BVKGRlc2MtPnN0YXR1cykgfHwgIWRlc2MtPmNoaXAgfHwKKwkgICAgIWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworLyoqCisgKglpcnFfc2V0X2FmZmluaXR5IC0gU2V0IHRoZSBpcnEgYWZmaW5pdHkgb2YgYSBnaXZlbiBpcnEKKyAqCUBpcnE6CQlJbnRlcnJ1cHQgdG8gc2V0IGFmZmluaXR5CisgKglAY3B1bWFzazoJY3B1bWFzaworICoKKyAqLworaW50IGlycV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY3B1bWFza190IGNwdW1hc2spCit7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX2Rlc2MgKyBpcnE7CisKKwlpZiAoIWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzZXRfYmFsYW5jZV9pcnFfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKworI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCisJc2V0X3BlbmRpbmdfaXJxKGlycSwgY3B1bWFzayk7CisjZWxzZQorCWRlc2MtPmFmZmluaXR5ID0gY3B1bWFzazsKKwlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKyNlbmRpZgorCXJldHVybiAwOworfQorCiAjZW5kaWYKIAogLyoqCkBAIC0yODEsNiArMzIxLDEwIEBACiAJaWYgKG5ldy0+ZmxhZ3MgJiBJUlFGX1BFUkNQVSkKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9QRVJfQ1BVOwogI2VuZGlmCisJLyogRXhjbHVkZSBJUlEgZnJvbSBiYWxhbmNpbmcgKi8KKwlpZiAobmV3LT5mbGFncyAmIElSUUZfTk9CQUxBTkNJTkcpCisJCWRlc2MtPnN0YXR1cyB8PSBJUlFfTk9fQkFMQU5DSU5HOworCiAJaWYgKCFzaGFyZWQpIHsKIAkJaXJxX2NoaXBfc2V0X2RlZmF1bHRzKGRlc2MtPmNoaXApOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL3Byb2MuYyBiL2tlcm5lbC9pcnEvcHJvYy5jCmluZGV4IDZkM2JlMDYuLjJkYjkxZWIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvcHJvYy5jCisrKyBiL2tlcm5lbC9pcnEvcHJvYy5jCkBAIC0xNiwyNiArMTYsNiBAQAogCiAjaWZkZWYgQ09ORklHX1NNUAogCi0jaWZkZWYgQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEKLXZvaWQgcHJvY19zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNwdW1hc2tfdCBtYXNrX3ZhbCkKLXsKLQlzZXRfYmFsYW5jZV9pcnFfYWZmaW5pdHkoaXJxLCBtYXNrX3ZhbCk7Ci0KLQkvKgotCSAqIFNhdmUgdGhlc2UgYXdheSBmb3IgbGF0ZXIgdXNlLiBSZS1wcm9nYW0gd2hlbiB0aGUKLQkgKiBpbnRlcnJ1cHQgaXMgcGVuZGluZwotCSAqLwotCXNldF9wZW5kaW5nX2lycShpcnEsIG1hc2tfdmFsKTsKLX0KLSNlbHNlCi12b2lkIHByb2Nfc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjcHVtYXNrX3QgbWFza192YWwpCi17Ci0Jc2V0X2JhbGFuY2VfaXJxX2FmZmluaXR5KGlycSwgbWFza192YWwpOwotCWlycV9kZXNjW2lycV0uYWZmaW5pdHkgPSBtYXNrX3ZhbDsKLQlpcnFfZGVzY1tpcnFdLmNoaXAtPnNldF9hZmZpbml0eShpcnEsIG1hc2tfdmFsKTsKLX0KLSNlbmRpZgotCiBzdGF0aWMgaW50IGlycV9hZmZpbml0eV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsCiAJCQkJICBpbnQgY291bnQsIGludCAqZW9mLCB2b2lkICpkYXRhKQogewpAQCAtNTUsNyArMzUsNyBAQAogCWNwdW1hc2tfdCBuZXdfdmFsdWUsIHRtcDsKIAogCWlmICghaXJxX2Rlc2NbaXJxXS5jaGlwLT5zZXRfYWZmaW5pdHkgfHwgbm9faXJxX2FmZmluaXR5IHx8Ci0JCQkJQ0hFQ0tfSVJRX1BFUl9DUFUoaXJxX2Rlc2NbaXJxXS5zdGF0dXMpKQorCSAgICBpcnFfYmFsYW5jaW5nX2Rpc2FibGVkKGlycSkpCiAJCXJldHVybiAtRUlPOwogCiAJZXJyID0gY3B1bWFza19wYXJzZV91c2VyKGJ1ZmZlciwgY291bnQsIG5ld192YWx1ZSk7CkBAIC03Myw3ICs1Myw3IEBACiAJCSAgIGNvZGUgdG8gc2V0IGRlZmF1bHQgU01QIGFmZmluaXR5LiAqLwogCQlyZXR1cm4gc2VsZWN0X3NtcF9hZmZpbml0eShpcnEpID8gLUVJTlZBTCA6IGZ1bGxfY291bnQ7CiAKLQlwcm9jX3NldF9pcnFfYWZmaW5pdHkoaXJxLCBuZXdfdmFsdWUpOworCWlycV9zZXRfYWZmaW5pdHkoaXJxLCBuZXdfdmFsdWUpOwogCiAJcmV0dXJuIGZ1bGxfY291bnQ7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvaXRpbWVyLmMgYi9rZXJuZWwvaXRpbWVyLmMKaW5kZXggMjA0ZWQ3OS4uMzA3YzZhNiAxMDA2NDQKLS0tIGEva2VybmVsL2l0aW1lci5jCisrKyBiL2tlcm5lbC9pdGltZXIuYwpAQCAtMTI4LDE4ICsxMjgsMTMgQEAKIC8qCiAgKiBUaGUgdGltZXIgaXMgYXV0b21hZ2ljYWxseSByZXN0YXJ0ZWQsIHdoZW4gaW50ZXJ2YWwgIT0gMAogICovCi1pbnQgaXRfcmVhbF9mbihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCitlbnVtIGhydGltZXJfcmVzdGFydCBpdF9yZWFsX2ZuKHN0cnVjdCBocnRpbWVyICp0aW1lcikKIHsKIAlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2lnID0KIAkgICAgY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCwgcmVhbF90aW1lcik7CiAKIAlzZW5kX2dyb3VwX3NpZ19pbmZvKFNJR0FMUk0sIFNFTkRfU0lHX1BSSVYsIHNpZy0+dHNrKTsKIAotCWlmIChzaWctPml0X3JlYWxfaW5jci50djY0ICE9IDApIHsKLQkJaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLCB0aW1lci0+YmFzZS0+c29mdGlycV90aW1lLAotCQkJCXNpZy0+aXRfcmVhbF9pbmNyKTsKLQkJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKLQl9CiAJcmV0dXJuIEhSVElNRVJfTk9SRVNUQVJUOwogfQogCkBAIC0yMzEsMTEgKzIyNiwxNCBAQAogCQkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQkJZ290byBhZ2FpbjsKIAkJfQotCQl0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyID0KLQkJCXRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X2ludGVydmFsKTsKIAkJZXhwaXJlcyA9IHRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X3ZhbHVlKTsKLQkJaWYgKGV4cGlyZXMudHY2NCAhPSAwKQotCQkJaHJ0aW1lcl9zdGFydCh0aW1lciwgZXhwaXJlcywgSFJUSU1FUl9SRUwpOworCQlpZiAoZXhwaXJlcy50djY0ICE9IDApIHsKKwkJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IgPQorCQkJCXRpbWV2YWxfdG9fa3RpbWUodmFsdWUtPml0X2ludGVydmFsKTsKKwkJCWhydGltZXJfc3RhcnQodGltZXIsIGV4cGlyZXMsIEhSVElNRVJfTU9ERV9SRUwpOworCQl9IGVsc2UKKwkJCXRzay0+c2lnbmFsLT5pdF9yZWFsX2luY3IudHY2NCA9IDA7CisKIAkJc3Bpbl91bmxvY2tfaXJxKCZ0c2stPnNpZ2hhbmQtPnNpZ2xvY2spOwogCQlicmVhazsKIAljYXNlIElUSU1FUl9WSVJUVUFMOgpkaWZmIC0tZ2l0IGEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYyBiL2tlcm5lbC9wb3NpeC1jcHUtdGltZXJzLmMKaW5kZXggN2MzZTFlNi4uNjU3Zjc3NiAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LWNwdS10aW1lcnMuYworKysgYi9rZXJuZWwvcG9zaXgtY3B1LXRpbWVycy5jCkBAIC0zMDQsNyArMzA0LDcgQEAKIAkJICogc2hvdWxkIGJlIGFibGUgdG8gc2VlIGl0LgogCQkgKi8KIAkJc3RydWN0IHRhc2tfc3RydWN0ICpwOwotCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQlyY3VfcmVhZF9sb2NrKCk7CiAJCXAgPSBmaW5kX3Rhc2tfYnlfcGlkKHBpZCk7CiAJCWlmIChwKSB7CiAJCQlpZiAoQ1BVQ0xPQ0tfUEVSVEhSRUFEKHdoaWNoX2Nsb2NrKSkgewpAQCAtMzEyLDEyICszMTIsMTcgQEAKIAkJCQkJZXJyb3IgPSBjcHVfY2xvY2tfc2FtcGxlKHdoaWNoX2Nsb2NrLAogCQkJCQkJCQkgcCwgJnJ0bik7CiAJCQkJfQotCQkJfSBlbHNlIGlmIChwLT50Z2lkID09IHBpZCAmJiBwLT5zaWduYWwpIHsKLQkJCQllcnJvciA9IGNwdV9jbG9ja19zYW1wbGVfZ3JvdXAod2hpY2hfY2xvY2ssCi0JCQkJCQkJICAgICAgIHAsICZydG4pOworCQkJfSBlbHNlIHsKKwkJCQlyZWFkX2xvY2soJnRhc2tsaXN0X2xvY2spOworCQkJCWlmIChwLT50Z2lkID09IHBpZCAmJiBwLT5zaWduYWwpIHsKKwkJCQkJZXJyb3IgPQorCQkJCQkgICAgY3B1X2Nsb2NrX3NhbXBsZV9ncm91cCh3aGljaF9jbG9jaywKKwkJCQkJCQkgICAgICAgICAgIHAsICZydG4pOworCQkJCX0KKwkJCQlyZWFkX3VubG9jaygmdGFza2xpc3RfbG9jayk7CiAJCQl9CiAJCX0KLQkJcmVhZF91bmxvY2soJnRhc2tsaXN0X2xvY2spOworCQlyY3VfcmVhZF91bmxvY2soKTsKIAl9CiAKIAlpZiAoZXJyb3IpCmRpZmYgLS1naXQgYS9rZXJuZWwvcG9zaXgtdGltZXJzLmMgYi9rZXJuZWwvcG9zaXgtdGltZXJzLmMKaW5kZXggYTFiZjYxNi4uNDQzMThjYSAxMDA2NDQKLS0tIGEva2VybmVsL3Bvc2l4LXRpbWVycy5jCisrKyBiL2tlcm5lbC9wb3NpeC10aW1lcnMuYwpAQCAtMTQ1LDcgKzE0NSw3IEBACiAJCQkgICAgc3RydWN0IGl0aW1lcnNwZWMgKiwgc3RydWN0IGl0aW1lcnNwZWMgKik7CiBzdGF0aWMgaW50IGNvbW1vbl90aW1lcl9kZWwoc3RydWN0IGtfaXRpbWVyICp0aW1lcik7CiAKLXN0YXRpYyBpbnQgcG9zaXhfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKmRhdGEpOworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHBvc2l4X3RpbWVyX2ZuKHN0cnVjdCBocnRpbWVyICpkYXRhKTsKIAogc3RhdGljIHN0cnVjdCBrX2l0aW1lciAqbG9ja190aW1lcih0aW1lcl90IHRpbWVyX2lkLCB1bnNpZ25lZCBsb25nICpmbGFncyk7CiAKQEAgLTMzNCwxMiArMzM0LDEyIEBACiAKICAqIFRoaXMgY29kZSBpcyBmb3IgQ0xPQ0tfUkVBTFRJTUUqIGFuZCBDTE9DS19NT05PVE9OSUMqIHRpbWVycy4KICAqLwotc3RhdGljIGludCBwb3NpeF90aW1lcl9mbihzdHJ1Y3QgaHJ0aW1lciAqdGltZXIpCitzdGF0aWMgZW51bSBocnRpbWVyX3Jlc3RhcnQgcG9zaXhfdGltZXJfZm4oc3RydWN0IGhydGltZXIgKnRpbWVyKQogewogCXN0cnVjdCBrX2l0aW1lciAqdGltcjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBzaV9wcml2YXRlID0gMDsKLQlpbnQgcmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CisJZW51bSBocnRpbWVyX3Jlc3RhcnQgcmV0ID0gSFJUSU1FUl9OT1JFU1RBUlQ7CiAKIAl0aW1yID0gY29udGFpbmVyX29mKHRpbWVyLCBzdHJ1Y3Qga19pdGltZXIsIGl0LnJlYWwudGltZXIpOwogCXNwaW5fbG9ja19pcnFzYXZlKCZ0aW1yLT5pdF9sb2NrLCBmbGFncyk7CkBAIC0zNTYsNyArMzU2LDcgQEAKIAkJaWYgKHRpbXItPml0LnJlYWwuaW50ZXJ2YWwudHY2NCAhPSAwKSB7CiAJCQl0aW1yLT5pdF9vdmVycnVuICs9CiAJCQkJaHJ0aW1lcl9mb3J3YXJkKHRpbWVyLAotCQkJCQkJdGltZXItPmJhc2UtPnNvZnRpcnFfdGltZSwKKwkJCQkJCWhydGltZXJfY2JfZ2V0X3RpbWUodGltZXIpLAogCQkJCQkJdGltci0+aXQucmVhbC5pbnRlcnZhbCk7CiAJCQlyZXQgPSBIUlRJTUVSX1JFU1RBUlQ7CiAJCQkrK3RpbXItPml0X3JlcXVldWVfcGVuZGluZzsKQEAgLTcyMiw3ICs3MjIsNyBAQAogCWlmICghbmV3X3NldHRpbmctPml0X3ZhbHVlLnR2X3NlYyAmJiAhbmV3X3NldHRpbmctPml0X3ZhbHVlLnR2X25zZWMpCiAJCXJldHVybiAwOwogCi0JbW9kZSA9IGZsYWdzICYgVElNRVJfQUJTVElNRSA/IEhSVElNRVJfQUJTIDogSFJUSU1FUl9SRUw7CisJbW9kZSA9IGZsYWdzICYgVElNRVJfQUJTVElNRSA/IEhSVElNRVJfTU9ERV9BQlMgOiBIUlRJTUVSX01PREVfUkVMOwogCWhydGltZXJfaW5pdCgmdGltci0+aXQucmVhbC50aW1lciwgdGltci0+aXRfY2xvY2ssIG1vZGUpOwogCXRpbXItPml0LnJlYWwudGltZXIuZnVuY3Rpb24gPSBwb3NpeF90aW1lcl9mbjsKIApAQCAtNzM0LDcgKzczNCw3IEBACiAJLyogU0lHRVZfTk9ORSB0aW1lcnMgYXJlIG5vdCBxdWV1ZWQgISBTZWUgY29tbW9uX3RpbWVyX2dldCAqLwogCWlmICgoKHRpbXItPml0X3NpZ2V2X25vdGlmeSAmIH5TSUdFVl9USFJFQURfSUQpID09IFNJR0VWX05PTkUpKSB7CiAJCS8qIFNldHVwIGNvcnJlY3QgZXhwaXJ5IHRpbWUgZm9yIHJlbGF0aXZlIHRpbWVycyAqLwotCQlpZiAobW9kZSA9PSBIUlRJTUVSX1JFTCkKKwkJaWYgKG1vZGUgPT0gSFJUSU1FUl9NT0RFX1JFTCkKIAkJCXRpbWVyLT5leHBpcmVzID0ga3RpbWVfYWRkKHRpbWVyLT5leHBpcmVzLAogCQkJCQkJICAgdGltZXItPmJhc2UtPmdldF90aW1lKCkpOwogCQlyZXR1cm4gMDsKQEAgLTk1MCw3ICs5NTAsOCBAQAogCQkJIHN0cnVjdCB0aW1lc3BlYyAqdHNhdmUsIHN0cnVjdCB0aW1lc3BlYyBfX3VzZXIgKnJtdHApCiB7CiAJcmV0dXJuIGhydGltZXJfbmFub3NsZWVwKHRzYXZlLCBybXRwLCBmbGFncyAmIFRJTUVSX0FCU1RJTUUgPwotCQkJCSBIUlRJTUVSX0FCUyA6IEhSVElNRVJfUkVMLCB3aGljaF9jbG9jayk7CisJCQkJIEhSVElNRVJfTU9ERV9BQlMgOiBIUlRJTUVSX01PREVfUkVMLAorCQkJCSB3aGljaF9jbG9jayk7CiB9CiAKIGFzbWxpbmthZ2UgbG9uZwpkaWZmIC0tZ2l0IGEva2VybmVsL3J0bXV0ZXguYyBiL2tlcm5lbC9ydG11dGV4LmMKaW5kZXggNGFiMTdkYS4uMTgwOTc4YyAxMDA2NDQKLS0tIGEva2VybmVsL3J0bXV0ZXguYworKysgYi9rZXJuZWwvcnRtdXRleC5jCkBAIC02MjUsNyArNjI1LDcgQEAKIAkvKiBTZXR1cCB0aGUgdGltZXIsIHdoZW4gdGltZW91dCAhPSBOVUxMICovCiAJaWYgKHVubGlrZWx5KHRpbWVvdXQpKQogCQlocnRpbWVyX3N0YXJ0KCZ0aW1lb3V0LT50aW1lciwgdGltZW91dC0+dGltZXIuZXhwaXJlcywKLQkJCSAgICAgIEhSVElNRVJfQUJTKTsKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwogCiAJZm9yICg7OykgewogCQkvKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jazogKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9zaWduYWwuYyBiL2tlcm5lbC9zaWduYWwuYwppbmRleCA4MDcyZTU2Li5lMmE3ZDRiIDEwMDY0NAotLS0gYS9rZXJuZWwvc2lnbmFsLmMKKysrIGIva2VybmVsL3NpZ25hbC5jCkBAIC00NTYsMjYgKzQ1Niw1MCBAQAogaW50IGRlcXVldWVfc2lnbmFsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLCBzaWdzZXRfdCAqbWFzaywgc2lnaW5mb190ICppbmZvKQogewogCWludCBzaWduciA9IF9fZGVxdWV1ZV9zaWduYWwoJnRzay0+cGVuZGluZywgbWFzaywgaW5mbyk7Ci0JaWYgKCFzaWducikKKwlpZiAoIXNpZ25yKSB7CiAJCXNpZ25yID0gX19kZXF1ZXVlX3NpZ25hbCgmdHNrLT5zaWduYWwtPnNoYXJlZF9wZW5kaW5nLAogCQkJCQkgbWFzaywgaW5mbyk7CisJCS8qCisJCSAqIGl0aW1lciBzaWduYWwgPworCQkgKgorCQkgKiBpdGltZXJzIGFyZSBwcm9jZXNzIHNoYXJlZCBhbmQgd2UgcmVzdGFydCBwZXJpb2RpYworCQkgKiBpdGltZXJzIGluIHRoZSBzaWduYWwgZGVsaXZlcnkgcGF0aCB0byBwcmV2ZW50IERvUworCQkgKiBhdHRhY2tzIGluIHRoZSBoaWdoIHJlc29sdXRpb24gdGltZXIgY2FzZS4gVGhpcyBpcworCQkgKiBjb21wbGlhbnQgd2l0aCB0aGUgb2xkIHdheSBvZiBzZWxmIHJlc3RhcnRpbmcKKwkJICogaXRpbWVycywgYXMgdGhlIFNJR0FMUk0gaXMgYSBsZWdhY3kgc2lnbmFsIGFuZCBvbmx5CisJCSAqIHF1ZXVlZCBvbmNlLiBDaGFuZ2luZyB0aGUgcmVzdGFydCBiZWhhdmlvdXIgdG8KKwkJICogcmVzdGFydCB0aGUgdGltZXIgaW4gdGhlIHNpZ25hbCBkZXF1ZXVlIHBhdGggaXMKKwkJICogcmVkdWNpbmcgdGhlIHRpbWVyIG5vaXNlIG9uIGhlYXZ5IGxvYWRlZCAhaGlnaHJlcworCQkgKiBzeXN0ZW1zIHRvby4KKwkJICovCisJCWlmICh1bmxpa2VseShzaWduciA9PSBTSUdBTFJNKSkgeworCQkJc3RydWN0IGhydGltZXIgKnRtciA9ICZ0c2stPnNpZ25hbC0+cmVhbF90aW1lcjsKKworCQkJaWYgKCFocnRpbWVyX2lzX3F1ZXVlZCh0bXIpICYmCisJCQkgICAgdHNrLT5zaWduYWwtPml0X3JlYWxfaW5jci50djY0ICE9IDApIHsKKwkJCQlocnRpbWVyX2ZvcndhcmQodG1yLCB0bXItPmJhc2UtPmdldF90aW1lKCksCisJCQkJCQl0c2stPnNpZ25hbC0+aXRfcmVhbF9pbmNyKTsKKwkJCQlocnRpbWVyX3Jlc3RhcnQodG1yKTsKKwkJCX0KKwkJfQorCX0KIAlyZWNhbGNfc2lncGVuZGluZ190c2sodHNrKTsKLSAJaWYgKHNpZ25yICYmIHVubGlrZWx5KHNpZ19rZXJuZWxfc3RvcChzaWducikpKSB7Ci0gCQkvKgotIAkJICogU2V0IGEgbWFya2VyIHRoYXQgd2UgaGF2ZSBkZXF1ZXVlZCBhIHN0b3Agc2lnbmFsLiAgT3VyCi0gCQkgKiBjYWxsZXIgbWlnaHQgcmVsZWFzZSB0aGUgc2lnbG9jayBhbmQgdGhlbiB0aGUgcGVuZGluZwotIAkJICogc3RvcCBzaWduYWwgaXQgaXMgYWJvdXQgdG8gcHJvY2VzcyBpcyBubyBsb25nZXIgaW4gdGhlCi0gCQkgKiBwZW5kaW5nIGJpdG1hc2tzLCBidXQgbXVzdCBzdGlsbCBiZSBjbGVhcmVkIGJ5IGEgU0lHQ09OVAotIAkJICogKGFuZCBvdmVycnVsZWQgYnkgYSBTSUdLSUxMKS4gIFNvIHRob3NlIGNhc2VzIGNsZWFyIHRoaXMKLSAJCSAqIHNoYXJlZCBmbGFnIGFmdGVyIHdlJ3ZlIHNldCBpdC4gIE5vdGUgdGhhdCB0aGlzIGZsYWcgbWF5Ci0gCQkgKiByZW1haW4gc2V0IGFmdGVyIHRoZSBzaWduYWwgd2UgcmV0dXJuIGlzIGlnbm9yZWQgb3IKLSAJCSAqIGhhbmRsZWQuICBUaGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgaXRzIG9ubHkgcHVycG9zZQotIAkJICogaXMgdG8gYWxlcnQgc3RvcC1zaWduYWwgcHJvY2Vzc2luZyBjb2RlIHdoZW4gYW5vdGhlcgotIAkJICogcHJvY2Vzc29yIGhhcyBjb21lIGFsb25nIGFuZCBjbGVhcmVkIHRoZSBmbGFnLgotIAkJICovCi0gCQlpZiAoISh0c2stPnNpZ25hbC0+ZmxhZ3MgJiBTSUdOQUxfR1JPVVBfRVhJVCkpCi0gCQkJdHNrLT5zaWduYWwtPmZsYWdzIHw9IFNJR05BTF9TVE9QX0RFUVVFVUVEOwotIAl9CisJaWYgKHNpZ25yICYmIHVubGlrZWx5KHNpZ19rZXJuZWxfc3RvcChzaWducikpKSB7CisJCS8qCisJCSAqIFNldCBhIG1hcmtlciB0aGF0IHdlIGhhdmUgZGVxdWV1ZWQgYSBzdG9wIHNpZ25hbC4gIE91cgorCQkgKiBjYWxsZXIgbWlnaHQgcmVsZWFzZSB0aGUgc2lnbG9jayBhbmQgdGhlbiB0aGUgcGVuZGluZworCQkgKiBzdG9wIHNpZ25hbCBpdCBpcyBhYm91dCB0byBwcm9jZXNzIGlzIG5vIGxvbmdlciBpbiB0aGUKKwkJICogcGVuZGluZyBiaXRtYXNrcywgYnV0IG11c3Qgc3RpbGwgYmUgY2xlYXJlZCBieSBhIFNJR0NPTlQKKwkJICogKGFuZCBvdmVycnVsZWQgYnkgYSBTSUdLSUxMKS4gIFNvIHRob3NlIGNhc2VzIGNsZWFyIHRoaXMKKwkJICogc2hhcmVkIGZsYWcgYWZ0ZXIgd2UndmUgc2V0IGl0LiAgTm90ZSB0aGF0IHRoaXMgZmxhZyBtYXkKKwkJICogcmVtYWluIHNldCBhZnRlciB0aGUgc2lnbmFsIHdlIHJldHVybiBpcyBpZ25vcmVkIG9yCisJCSAqIGhhbmRsZWQuICBUaGF0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UgaXRzIG9ubHkgcHVycG9zZQorCQkgKiBpcyB0byBhbGVydCBzdG9wLXNpZ25hbCBwcm9jZXNzaW5nIGNvZGUgd2hlbiBhbm90aGVyCisJCSAqIHByb2Nlc3NvciBoYXMgY29tZSBhbG9uZyBhbmQgY2xlYXJlZCB0aGUgZmxhZy4KKwkJICovCisJCWlmICghKHRzay0+c2lnbmFsLT5mbGFncyAmIFNJR05BTF9HUk9VUF9FWElUKSkKKwkJCXRzay0+c2lnbmFsLT5mbGFncyB8PSBTSUdOQUxfU1RPUF9ERVFVRVVFRDsKKwl9CiAJaWYgKCBzaWduciAmJgogCSAgICAgKChpbmZvLT5zaV9jb2RlICYgX19TSV9NQVNLKSA9PSBfX1NJX1RJTUVSKSAmJgogCSAgICAgaW5mby0+c2lfc3lzX3ByaXZhdGUpewpkaWZmIC0tZ2l0IGEva2VybmVsL3NvZnRpcnEuYyBiL2tlcm5lbC9zb2Z0aXJxLmMKaW5kZXggOTE4ZTUyZC4uOGI3NTAwOCAxMDA2NDQKLS0tIGEva2VybmVsL3NvZnRpcnEuYworKysgYi9rZXJuZWwvc29mdGlycS5jCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8bGludXgva3RocmVhZC5oPgogI2luY2x1ZGUgPGxpbnV4L3JjdXBkYXRlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogLyoKQEAgLTI3Myw2ICsyNzQsMTggQEAKIAogI2VuZGlmCiAKKy8qCisgKiBFbnRlciBhbiBpbnRlcnJ1cHQgY29udGV4dC4KKyAqLwordm9pZCBpcnFfZW50ZXIodm9pZCkKK3sKKwlfX2lycV9lbnRlcigpOworI2lmZGVmIENPTkZJR19OT19IWgorCWlmIChpZGxlX2NwdShzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQl0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXMoKTsKKyNlbmRpZgorfQorCiAjaWZkZWYgX19BUkNIX0lSUV9FWElUX0lSUVNfRElTQUJMRUQKICMgZGVmaW5lIGludm9rZV9zb2Z0aXJxKCkJX19kb19zb2Z0aXJxKCkKICNlbHNlCkBAIC0yODksNiArMzAyLDEyIEBACiAJc3ViX3ByZWVtcHRfY291bnQoSVJRX0VYSVRfT0ZGU0VUKTsKIAlpZiAoIWluX2ludGVycnVwdCgpICYmIGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKQogCQlpbnZva2Vfc29mdGlycSgpOworCisjaWZkZWYgQ09ORklHX05PX0haCisJLyogTWFrZSBzdXJlIHRoYXQgdGltZXIgd2hlZWwgdXBkYXRlcyBhcmUgcHJvcGFnYXRlZCAqLworCWlmICghaW5faW50ZXJydXB0KCkgJiYgaWRsZV9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKSAmJiAhbmVlZF9yZXNjaGVkKCkpCisJCXRpY2tfbm9oel9zdG9wX3NjaGVkX3RpY2soKTsKKyNlbmRpZgogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKIH0KIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUuYyBiL2tlcm5lbC90aW1lLmMKaW5kZXggMGUwMTdiZmYuLmM2YzgwZWE1IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS5jCisrKyBiL2tlcm5lbC90aW1lLmMKQEAgLTQ3MCw2ICs0NzAsMjYwIEBACiAJcmV0dXJuIHR2OwogfQogCisvKgorICogQ29udmVydCBqaWZmaWVzIHRvIG1pbGxpc2Vjb25kcyBhbmQgYmFjay4KKyAqCisgKiBBdm9pZCB1bm5lY2Vzc2FyeSBtdWx0aXBsaWNhdGlvbnMvZGl2aXNpb25zIGluIHRoZQorICogdHdvIG1vc3QgY29tbW9uIEhaIGNhc2VzOgorICovCit1bnNpZ25lZCBpbnQgamlmZmllc190b19tc2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopCit7CisjaWYgSFogPD0gTVNFQ19QRVJfU0VDICYmICEoTVNFQ19QRVJfU0VDICUgSFopCisJcmV0dXJuIChNU0VDX1BFUl9TRUMgLyBIWikgKiBqOworI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKKwlyZXR1cm4gKGogKyAoSFogLyBNU0VDX1BFUl9TRUMpIC0gMSkvKEhaIC8gTVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJcmV0dXJuIChqICogTVNFQ19QRVJfU0VDKSAvIEhaOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGppZmZpZXNfdG9fbXNlY3MpOworCit1bnNpZ25lZCBpbnQgamlmZmllc190b191c2Vjcyhjb25zdCB1bnNpZ25lZCBsb25nIGopCit7CisjaWYgSFogPD0gVVNFQ19QRVJfU0VDICYmICEoVVNFQ19QRVJfU0VDICUgSFopCisJcmV0dXJuIChVU0VDX1BFUl9TRUMgLyBIWikgKiBqOworI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKKwlyZXR1cm4gKGogKyAoSFogLyBVU0VDX1BFUl9TRUMpIC0gMSkvKEhaIC8gVVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJcmV0dXJuIChqICogVVNFQ19QRVJfU0VDKSAvIEhaOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGppZmZpZXNfdG9fdXNlY3MpOworCisvKgorICogV2hlbiB3ZSBjb252ZXJ0IHRvIGppZmZpZXMgdGhlbiB3ZSBpbnRlcnByZXQgaW5jb21pbmcgdmFsdWVzCisgKiB0aGUgZm9sbG93aW5nIHdheToKKyAqCisgKiAtIG5lZ2F0aXZlIHZhbHVlcyBtZWFuICdpbmZpbml0ZSB0aW1lb3V0JyAoTUFYX0pJRkZZX09GRlNFVCkKKyAqCisgKiAtICd0b28gbGFyZ2UnIHZhbHVlcyBbdGhhdCB3b3VsZCByZXN1bHQgaW4gbGFyZ2VyIHRoYW4KKyAqICAgTUFYX0pJRkZZX09GRlNFVCB2YWx1ZXNdIG1lYW4gJ2luZmluaXRlIHRpbWVvdXQnIHRvby4KKyAqCisgKiAtIGFsbCBvdGhlciB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBqaWZmaWVzIGJ5IGVpdGhlciBtdWx0aXBseWluZworICogICB0aGUgaW5wdXQgdmFsdWUgYnkgYSBmYWN0b3Igb3IgZGl2aWRpbmcgaXQgd2l0aCBhIGZhY3RvcgorICoKKyAqIFdlIG11c3QgYWxzbyBiZSBjYXJlZnVsIGFib3V0IDMyLWJpdCBvdmVyZmxvd3MuCisgKi8KK3Vuc2lnbmVkIGxvbmcgbXNlY3NfdG9famlmZmllcyhjb25zdCB1bnNpZ25lZCBpbnQgbSkKK3sKKwkvKgorCSAqIE5lZ2F0aXZlIHZhbHVlLCBtZWFucyBpbmZpbml0ZSB0aW1lb3V0OgorCSAqLworCWlmICgoaW50KW0gPCAwKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKworI2lmIEhaIDw9IE1TRUNfUEVSX1NFQyAmJiAhKE1TRUNfUEVSX1NFQyAlIEhaKQorCS8qCisJICogSFogaXMgZXF1YWwgdG8gb3Igc21hbGxlciB0aGFuIDEwMDAsIGFuZCAxMDAwIGlzIGEgbmljZQorCSAqIHJvdW5kIG11bHRpcGxlIG9mIEhaLCBkaXZpZGUgd2l0aCB0aGUgZmFjdG9yIGJldHdlZW4gdGhlbSwKKwkgKiBidXQgcm91bmQgdXB3YXJkczoKKwkgKi8KKwlyZXR1cm4gKG0gKyAoTVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoTVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBNU0VDX1BFUl9TRUMgJiYgIShIWiAlIE1TRUNfUEVSX1NFQykKKwkvKgorCSAqIEhaIGlzIGxhcmdlciB0aGFuIDEwMDAsIGFuZCBIWiBpcyBhIG5pY2Ugcm91bmQgbXVsdGlwbGUgb2YKKwkgKiAxMDAwIC0gc2ltcGx5IG11bHRpcGx5IHdpdGggdGhlIGZhY3RvciBiZXR3ZWVuIHRoZW0uCisJICoKKwkgKiBCdXQgZmlyc3QgbWFrZSBzdXJlIHRoZSBtdWx0aXBsaWNhdGlvbiByZXN1bHQgY2Fubm90CisJICogb3ZlcmZsb3c6CisJICovCisJaWYgKG0gPiBqaWZmaWVzX3RvX21zZWNzKE1BWF9KSUZGWV9PRkZTRVQpKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKworCXJldHVybiBtICogKEhaIC8gTVNFQ19QRVJfU0VDKTsKKyNlbHNlCisJLyoKKwkgKiBHZW5lcmljIGNhc2UgLSBtdWx0aXBseSwgcm91bmQgYW5kIGRpdmlkZS4gQnV0IGZpcnN0CisJICogY2hlY2sgdGhhdCBpZiB3ZSBhcmUgZG9pbmcgYSBuZXQgbXVsdGlwbGljYXRpb24sIHRoYXQKKwkgKiB3ZSB3b3VsZG50IG92ZXJmbG93OgorCSAqLworCWlmIChIWiA+IE1TRUNfUEVSX1NFQyAmJiBtID4gamlmZmllc190b19tc2VjcyhNQVhfSklGRllfT0ZGU0VUKSkKKwkJcmV0dXJuIE1BWF9KSUZGWV9PRkZTRVQ7CisKKwlyZXR1cm4gKG0gKiBIWiArIE1TRUNfUEVSX1NFQyAtIDEpIC8gTVNFQ19QRVJfU0VDOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKG1zZWNzX3RvX2ppZmZpZXMpOworCit1bnNpZ25lZCBsb25nIHVzZWNzX3RvX2ppZmZpZXMoY29uc3QgdW5zaWduZWQgaW50IHUpCit7CisJaWYgKHUgPiBqaWZmaWVzX3RvX3VzZWNzKE1BWF9KSUZGWV9PRkZTRVQpKQorCQlyZXR1cm4gTUFYX0pJRkZZX09GRlNFVDsKKyNpZiBIWiA8PSBVU0VDX1BFUl9TRUMgJiYgIShVU0VDX1BFUl9TRUMgJSBIWikKKwlyZXR1cm4gKHUgKyAoVVNFQ19QRVJfU0VDIC8gSFopIC0gMSkgLyAoVVNFQ19QRVJfU0VDIC8gSFopOworI2VsaWYgSFogPiBVU0VDX1BFUl9TRUMgJiYgIShIWiAlIFVTRUNfUEVSX1NFQykKKwlyZXR1cm4gdSAqIChIWiAvIFVTRUNfUEVSX1NFQyk7CisjZWxzZQorCXJldHVybiAodSAqIEhaICsgVVNFQ19QRVJfU0VDIC0gMSkgLyBVU0VDX1BFUl9TRUM7CisjZW5kaWYKK30KK0VYUE9SVF9TWU1CT0wodXNlY3NfdG9famlmZmllcyk7CisKKy8qCisgKiBUaGUgVElDS19OU0VDIC0gMSByb3VuZHMgdXAgdGhlIHZhbHVlIHRvIHRoZSBuZXh0IHJlc29sdXRpb24uICBOb3RlCisgKiB0aGF0IGEgcmVtYWluZGVyIHN1YnRyYWN0IGhlcmUgd291bGQgbm90IGRvIHRoZSByaWdodCB0aGluZyBhcyB0aGUKKyAqIHJlc29sdXRpb24gdmFsdWVzIGRvbid0IGZhbGwgb24gc2Vjb25kIGJvdW5kcmllcy4gIEkuZS4gdGhlIGxpbmU6CisgKiBuc2VjIC09IG5zZWMgJSBUSUNLX05TRUM7IGlzIE5PVCBhIGNvcnJlY3QgcmVzb2x1dGlvbiByb3VuZGluZy4KKyAqCisgKiBSYXRoZXIsIHdlIGp1c3Qgc2hpZnQgdGhlIGJpdHMgb2ZmIHRoZSByaWdodC4KKyAqCisgKiBUaGUgPj4gKE5TRUNfSklGRklFX1NDIC0gU0VDX0pJRkZJRV9TQykgY29udmVydHMgdGhlIHNjYWxlZCBuc2VjCisgKiB2YWx1ZSB0byBhIHNjYWxlZCBzZWNvbmQgdmFsdWUuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3RpbWVzcGVjX3RvX2ppZmZpZXMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNlYyA9IHZhbHVlLT50dl9zZWM7CisJbG9uZyBuc2VjID0gdmFsdWUtPnR2X25zZWMgKyBUSUNLX05TRUMgLSAxOworCisJaWYgKHNlYyA+PSBNQVhfU0VDX0lOX0pJRkZJRVMpeworCQlzZWMgPSBNQVhfU0VDX0lOX0pJRkZJRVM7CisJCW5zZWMgPSAwOworCX0KKwlyZXR1cm4gKCgodTY0KXNlYyAqIFNFQ19DT05WRVJTSU9OKSArCisJCSgoKHU2NCluc2VjICogTlNFQ19DT05WRVJTSU9OKSA+PgorCQkgKE5TRUNfSklGRklFX1NDIC0gU0VDX0pJRkZJRV9TQykpKSA+PiBTRUNfSklGRklFX1NDOworCit9CitFWFBPUlRfU1lNQk9MKHRpbWVzcGVjX3RvX2ppZmZpZXMpOworCit2b2lkCitqaWZmaWVzX3RvX3RpbWVzcGVjKGNvbnN0IHVuc2lnbmVkIGxvbmcgamlmZmllcywgc3RydWN0IHRpbWVzcGVjICp2YWx1ZSkKK3sKKwkvKgorCSAqIENvbnZlcnQgamlmZmllcyB0byBuYW5vc2Vjb25kcyBhbmQgc2VwYXJhdGUgd2l0aAorCSAqIG9uZSBkaXZpZGUuCisJICovCisJdTY0IG5zZWMgPSAodTY0KWppZmZpZXMgKiBUSUNLX05TRUM7CisJdmFsdWUtPnR2X3NlYyA9IGRpdl9sb25nX2xvbmdfcmVtKG5zZWMsIE5TRUNfUEVSX1NFQywgJnZhbHVlLT50dl9uc2VjKTsKK30KK0VYUE9SVF9TWU1CT0woamlmZmllc190b190aW1lc3BlYyk7CisKKy8qIFNhbWUgZm9yICJ0aW1ldmFsIgorICoKKyAqIFdlbGwsIGFsbW9zdC4gIFRoZSBwcm9ibGVtIGhlcmUgaXMgdGhhdCB0aGUgcmVhbCBzeXN0ZW0gcmVzb2x1dGlvbiBpcworICogaW4gbmFub3NlY29uZHMgYW5kIHRoZSB2YWx1ZSBiZWluZyBjb252ZXJ0ZWQgaXMgaW4gbWljcm8gc2Vjb25kcy4KKyAqIEFsc28gZm9yIHNvbWUgbWFjaGluZXMgKHRob3NlIHRoYXQgdXNlIEhaID0gMTAyNCwgaW4tcGFydGljdWxhciksCisgKiB0aGVyZSBpcyBhIExBUkdFIGVycm9yIGluIHRoZSB0aWNrIHNpemUgaW4gbWljcm9zZWNvbmRzLgorCisgKiBUaGUgc29sdXRpb24gd2UgdXNlIGlzIHRvIGRvIHRoZSByb3VuZGluZyBBRlRFUiB3ZSBjb252ZXJ0IHRoZQorICogbWljcm9zZWNvbmQgcGFydC4gIFRodXMgdGhlIFVTRUNfUk9VTkQsIHRoZSBiaXRzIHRvIGJlIHNoaWZ0ZWQgb2ZmLgorICogSW5zdHJ1Y3Rpb24gd2lzZSwgdGhpcyBzaG91bGQgY29zdCBvbmx5IGFuIGFkZGl0aW9uYWwgYWRkIHdpdGggY2FycnkKKyAqIGluc3RydWN0aW9uIGFib3ZlIHRoZSB3YXkgaXQgd2FzIGRvbmUgYWJvdmUuCisgKi8KK3Vuc2lnbmVkIGxvbmcKK3RpbWV2YWxfdG9famlmZmllcyhjb25zdCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCit7CisJdW5zaWduZWQgbG9uZyBzZWMgPSB2YWx1ZS0+dHZfc2VjOworCWxvbmcgdXNlYyA9IHZhbHVlLT50dl91c2VjOworCisJaWYgKHNlYyA+PSBNQVhfU0VDX0lOX0pJRkZJRVMpeworCQlzZWMgPSBNQVhfU0VDX0lOX0pJRkZJRVM7CisJCXVzZWMgPSAwOworCX0KKwlyZXR1cm4gKCgodTY0KXNlYyAqIFNFQ19DT05WRVJTSU9OKSArCisJCSgoKHU2NCl1c2VjICogVVNFQ19DT05WRVJTSU9OICsgVVNFQ19ST1VORCkgPj4KKwkJIChVU0VDX0pJRkZJRV9TQyAtIFNFQ19KSUZGSUVfU0MpKSkgPj4gU0VDX0pJRkZJRV9TQzsKK30KKwordm9pZCBqaWZmaWVzX3RvX3RpbWV2YWwoY29uc3QgdW5zaWduZWQgbG9uZyBqaWZmaWVzLCBzdHJ1Y3QgdGltZXZhbCAqdmFsdWUpCit7CisJLyoKKwkgKiBDb252ZXJ0IGppZmZpZXMgdG8gbmFub3NlY29uZHMgYW5kIHNlcGFyYXRlIHdpdGgKKwkgKiBvbmUgZGl2aWRlLgorCSAqLworCXU2NCBuc2VjID0gKHU2NClqaWZmaWVzICogVElDS19OU0VDOworCWxvbmcgdHZfdXNlYzsKKworCXZhbHVlLT50dl9zZWMgPSBkaXZfbG9uZ19sb25nX3JlbShuc2VjLCBOU0VDX1BFUl9TRUMsICZ0dl91c2VjKTsKKwl0dl91c2VjIC89IE5TRUNfUEVSX1VTRUM7CisJdmFsdWUtPnR2X3VzZWMgPSB0dl91c2VjOworfQorCisvKgorICogQ29udmVydCBqaWZmaWVzL2ppZmZpZXNfNjQgdG8gY2xvY2tfdCBhbmQgYmFjay4KKyAqLworY2xvY2tfdCBqaWZmaWVzX3RvX2Nsb2NrX3QobG9uZyB4KQoreworI2lmIChUSUNLX05TRUMgJSAoTlNFQ19QRVJfU0VDIC8gVVNFUl9IWikpID09IDAKKwlyZXR1cm4geCAvIChIWiAvIFVTRVJfSFopOworI2Vsc2UKKwl1NjQgdG1wID0gKHU2NCl4ICogVElDS19OU0VDOworCWRvX2Rpdih0bXAsIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSk7CisJcmV0dXJuIChsb25nKXRtcDsKKyNlbmRpZgorfQorRVhQT1JUX1NZTUJPTChqaWZmaWVzX3RvX2Nsb2NrX3QpOworCit1bnNpZ25lZCBsb25nIGNsb2NrX3RfdG9famlmZmllcyh1bnNpZ25lZCBsb25nIHgpCit7CisjaWYgKEhaICUgVVNFUl9IWik9PTAKKwlpZiAoeCA+PSB+MFVMIC8gKEhaIC8gVVNFUl9IWikpCisJCXJldHVybiB+MFVMOworCXJldHVybiB4ICogKEhaIC8gVVNFUl9IWik7CisjZWxzZQorCXU2NCBqaWY7CisKKwkvKiBEb24ndCB3b3JyeSBhYm91dCBsb3NzIG9mIHByZWNpc2lvbiBoZXJlIC4uICovCisJaWYgKHggPj0gfjBVTCAvIEhaICogVVNFUl9IWikKKwkJcmV0dXJuIH4wVUw7CisKKwkvKiAuLiBidXQgZG8gdHJ5IHRvIGNvbnRhaW4gaXQgaGVyZSAqLworCWppZiA9IHggKiAodTY0KSBIWjsKKwlkb19kaXYoamlmLCBVU0VSX0haKTsKKwlyZXR1cm4gamlmOworI2VuZGlmCit9CitFWFBPUlRfU1lNQk9MKGNsb2NrX3RfdG9famlmZmllcyk7CisKK3U2NCBqaWZmaWVzXzY0X3RvX2Nsb2NrX3QodTY0IHgpCit7CisjaWYgKFRJQ0tfTlNFQyAlIChOU0VDX1BFUl9TRUMgLyBVU0VSX0haKSkgPT0gMAorCWRvX2Rpdih4LCBIWiAvIFVTRVJfSFopOworI2Vsc2UKKwkvKgorCSAqIFRoZXJlIGFyZSBiZXR0ZXIgd2F5cyB0aGF0IGRvbid0IG92ZXJmbG93IGVhcmx5LAorCSAqIGJ1dCBldmVuIHRoaXMgZG9lc24ndCBvdmVyZmxvdyBpbiBodW5kcmVkcyBvZiB5ZWFycworCSAqIGluIDY0IGJpdHMsIHNvLi4KKwkgKi8KKwl4ICo9IFRJQ0tfTlNFQzsKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKKyNlbmRpZgorCXJldHVybiB4OworfQorCitFWFBPUlRfU1lNQk9MKGppZmZpZXNfNjRfdG9fY2xvY2tfdCk7CisKK3U2NCBuc2VjX3RvX2Nsb2NrX3QodTY0IHgpCit7CisjaWYgKE5TRUNfUEVSX1NFQyAlIFVTRVJfSFopID09IDAKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIFVTRVJfSFopKTsKKyNlbGlmIChVU0VSX0haICUgNTEyKSA9PSAwCisJeCAqPSBVU0VSX0haLzUxMjsKKwlkb19kaXYoeCwgKE5TRUNfUEVSX1NFQyAvIDUxMikpOworI2Vsc2UKKwkvKgorICAgICAgICAgKiBtYXggcmVsYXRpdmUgZXJyb3IgNS43ZS04ICgxLjhzIHBlciB5ZWFyKSBmb3IgVVNFUl9IWiA8PSAxMDI0LAorICAgICAgICAgKiBvdmVyZmxvdyBhZnRlciA2NC45OSB5ZWFycy4KKyAgICAgICAgICogZXhhY3QgZm9yIEhaPTYwLCA3MiwgOTAsIDEyMCwgMTQ0LCAxODAsIDMwMCwgNjAwLCA5MDAsIC4uLgorICAgICAgICAgKi8KKwl4ICo9IDk7CisJZG9fZGl2KHgsICh1bnNpZ25lZCBsb25nKSgoOXVsbCAqIE5TRUNfUEVSX1NFQyArIChVU0VSX0haLzIpKSAvCisJCQkJICBVU0VSX0haKSk7CisjZW5kaWYKKwlyZXR1cm4geDsKK30KKwogI2lmIChCSVRTX1BFUl9MT05HIDwgNjQpCiB1NjQgZ2V0X2ppZmZpZXNfNjQodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL0tjb25maWcgYi9rZXJuZWwvdGltZS9LY29uZmlnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjM1MTEKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdGltZS9LY29uZmlnCkBAIC0wLDAgKzEsMjUgQEAKKyMKKyMgVGltZXIgc3Vic3lzdGVtIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjCitjb25maWcgVElDS19PTkVTSE9UCisJYm9vbAorCWRlZmF1bHQgbgorCitjb25maWcgTk9fSFoKKwlib29sICJUaWNrbGVzcyBTeXN0ZW0gKER5bmFtaWMgVGlja3MpIgorCWRlcGVuZHMgb24gR0VORVJJQ19USU1FICYmIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlzZWxlY3QgVElDS19PTkVTSE9UCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBhIHRpY2tsZXNzIHN5c3RlbTogdGltZXIgaW50ZXJydXB0cyB3aWxsCisJICBvbmx5IHRyaWdnZXIgb24gYW4gYXMtbmVlZGVkIGJhc2lzIGJvdGggd2hlbiB0aGUgc3lzdGVtIGlzCisJICBidXN5IGFuZCB3aGVuIHRoZSBzeXN0ZW0gaXMgaWRsZS4KKworY29uZmlnIEhJR0hfUkVTX1RJTUVSUworCWJvb2wgIkhpZ2ggUmVzb2x1dGlvbiBUaW1lciBTdXBwb3J0IgorCWRlcGVuZHMgb24gR0VORVJJQ19USU1FICYmIEdFTkVSSUNfQ0xPQ0tFVkVOVFMKKwlzZWxlY3QgVElDS19PTkVTSE9UCisJaGVscAorCSAgVGhpcyBvcHRpb24gZW5hYmxlcyBoaWdoIHJlc29sdXRpb24gdGltZXIgc3VwcG9ydC4gSWYgeW91cgorCSAgaGFyZHdhcmUgaXMgbm90IGNhcGFibGUgdGhlbiB0aGlzIG9wdGlvbiBvbmx5IGluY3JlYXNlcworCSAgdGhlIHNpemUgb2YgdGhlIGtlcm5lbCBpbWFnZS4KKwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvTWFrZWZpbGUgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQppbmRleCA2MWEzOTA3Li45M2JjY2JhIDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS9NYWtlZmlsZQorKysgYi9rZXJuZWwvdGltZS9NYWtlZmlsZQpAQCAtMSArMSw4IEBACi1vYmoteSArPSBudHAubyBjbG9ja3NvdXJjZS5vIGppZmZpZXMubworb2JqLXkgKz0gbnRwLm8gY2xvY2tzb3VyY2UubyBqaWZmaWVzLm8gdGltZXJfbGlzdC5vCisKK29iai0kKENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTKQkJKz0gY2xvY2tldmVudHMubworb2JqLSQoQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFMpCQkrPSB0aWNrLWNvbW1vbi5vCitvYmotJChDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UU19CUk9BRENBU1QpCSs9IHRpY2stYnJvYWRjYXN0Lm8KK29iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1vbmVzaG90Lm8KK29iai0kKENPTkZJR19USUNLX09ORVNIT1QpCQkJKz0gdGljay1zY2hlZC5vCitvYmotJChDT05GSUdfVElNRVJfU1RBVFMpCQkJKz0gdGltZXJfc3RhdHMubwpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvY2xvY2tldmVudHMuYyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc5MzJlYQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL2Nsb2NrZXZlbnRzLmMKQEAgLTAsMCArMSwzNDUgQEAKKy8qCisgKiBsaW51eC9rZXJuZWwvdGltZS9jbG9ja2V2ZW50cy5jCisgKgorICogVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB3aGljaCBtYW5hZ2UgY2xvY2sgZXZlbnQgZGV2aWNlcy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9zbXAuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNkZXYuaD4KKworLyogVGhlIHJlZ2lzdGVyZWQgY2xvY2sgZXZlbnQgZGV2aWNlcyAqLworc3RhdGljIExJU1RfSEVBRChjbG9ja2V2ZW50X2RldmljZXMpOworc3RhdGljIExJU1RfSEVBRChjbG9ja2V2ZW50c19yZWxlYXNlZCk7CisKKy8qIE5vdGlmaWNhdGlvbiBmb3IgY2xvY2sgZXZlbnRzICovCitzdGF0aWMgUkFXX05PVElGSUVSX0hFQUQoY2xvY2tldmVudHNfY2hhaW4pOworCisvKiBQcm90ZWN0aW9uIGZvciB0aGUgYWJvdmUgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0soY2xvY2tldmVudHNfbG9jayk7CisKKy8qKgorICogY2xvY2tldmVudHNfZGVsdGEybnMgLSBDb252ZXJ0IGEgbGF0Y2ggdmFsdWUgKGRldmljZSB0aWNrcykgdG8gbmFub3NlY29uZHMKKyAqIEBsYXRjaDoJdmFsdWUgdG8gY29udmVydAorICogQGV2dDoJcG9pbnRlciB0byBjbG9jayBldmVudCBkZXZpY2UgZGVzY3JpcHRvcgorICoKKyAqIE1hdGggaGVscGVyLCByZXR1cm5zIGxhdGNoIHZhbHVlIGNvbnZlcnRlZCB0byBuYW5vc2Vjb25kcyAoYm91bmQgY2hlY2tlZCkKKyAqLwordW5zaWduZWQgbG9uZyBjbG9ja2V2ZW50X2RlbHRhMm5zKHVuc2lnbmVkIGxvbmcgbGF0Y2gsCisJCQkJICBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpldnQpCit7CisJdTY0IGNsYyA9ICgodTY0KSBsYXRjaCA8PCBldnQtPnNoaWZ0KTsKKworCWRvX2RpdihjbGMsIGV2dC0+bXVsdCk7CisJaWYgKGNsYyA8IDEwMDApCisJCWNsYyA9IDEwMDA7CisJaWYgKGNsYyA+IExPTkdfTUFYKQorCQljbGMgPSBMT05HX01BWDsKKworCXJldHVybiAodW5zaWduZWQgbG9uZykgY2xjOworfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3NldF9tb2RlIC0gc2V0IHRoZSBvcGVyYXRpbmcgbW9kZSBvZiBhIGNsb2NrIGV2ZW50IGRldmljZQorICogQGRldjoJZGV2aWNlIHRvIG1vZGlmeQorICogQG1vZGU6CW5ldyBtb2RlCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkICEKKyAqLwordm9pZCBjbG9ja2V2ZW50c19zZXRfbW9kZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYsCisJCQkJIGVudW0gY2xvY2tfZXZlbnRfbW9kZSBtb2RlKQoreworCWlmIChkZXYtPm1vZGUgIT0gbW9kZSkgeworCQlkZXYtPnNldF9tb2RlKG1vZGUsIGRldik7CisJCWRldi0+bW9kZSA9IG1vZGU7CisJfQorfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQgLSBSZXByb2dyYW0gdGhlIGNsb2NrIGV2ZW50IGRldmljZS4KKyAqIEBleHBpcmVzOglhYnNvbHV0ZSBleHBpcnkgdGltZSAobW9ub3RvbmljIGNsb2NrKQorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRVRJTUUgd2hlbiB0aGUgZXZlbnQgaXMgaW4gdGhlIHBhc3QuCisgKi8KK2ludCBjbG9ja2V2ZW50c19wcm9ncmFtX2V2ZW50KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwga3RpbWVfdCBleHBpcmVzLAorCQkJICAgICAga3RpbWVfdCBub3cpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGNsYzsKKwlpbnQ2NF90IGRlbHRhOworCisJZGVsdGEgPSBrdGltZV90b19ucyhrdGltZV9zdWIoZXhwaXJlcywgbm93KSk7CisKKwlpZiAoZGVsdGEgPD0gMCkKKwkJcmV0dXJuIC1FVElNRTsKKworCWRldi0+bmV4dF9ldmVudCA9IGV4cGlyZXM7CisKKwlpZiAoZGV2LT5tb2RlID09IENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKQorCQlyZXR1cm4gMDsKKworCWlmIChkZWx0YSA+IGRldi0+bWF4X2RlbHRhX25zKQorCQlkZWx0YSA9IGRldi0+bWF4X2RlbHRhX25zOworCWlmIChkZWx0YSA8IGRldi0+bWluX2RlbHRhX25zKQorCQlkZWx0YSA9IGRldi0+bWluX2RlbHRhX25zOworCisJY2xjID0gZGVsdGEgKiBkZXYtPm11bHQ7CisJY2xjID4+PSBkZXYtPnNoaWZ0OworCisJcmV0dXJuIGRldi0+c2V0X25leHRfZXZlbnQoKHVuc2lnbmVkIGxvbmcpIGNsYywgZGV2KTsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19yZWdpc3Rlcl9ub3RpZmllciAtIHJlZ2lzdGVyIGEgY2xvY2sgZXZlbnRzIGNoYW5nZSBsaXN0ZW5lcgorICovCitpbnQgY2xvY2tldmVudHNfcmVnaXN0ZXJfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYikKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKKwlyZXQgPSByYXdfbm90aWZpZXJfY2hhaW5fcmVnaXN0ZXIoJmNsb2NrZXZlbnRzX2NoYWluLCBuYik7CisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIHJldDsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c191bnJlZ2lzdGVyX25vdGlmaWVyIC0gdW5yZWdpc3RlciBhIGNsb2NrIGV2ZW50cyBjaGFuZ2UgbGlzdGVuZXIKKyAqLwordm9pZCBjbG9ja2V2ZW50c191bnJlZ2lzdGVyX25vdGlmaWVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIpCit7CisJc3Bpbl9sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKKwlyYXdfbm90aWZpZXJfY2hhaW5fdW5yZWdpc3RlcigmY2xvY2tldmVudHNfY2hhaW4sIG5iKTsKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qCisgKiBOb3RpZnkgYWJvdXQgYSBjbG9jayBldmVudCBjaGFuZ2UuIENhbGxlZCB3aXRoIGNsb2NrZXZlbnRzX2xvY2sKKyAqIGhlbGQuCisgKi8KK3N0YXRpYyB2b2lkIGNsb2NrZXZlbnRzX2RvX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqZGV2KQoreworCXJhd19ub3RpZmllcl9jYWxsX2NoYWluKCZjbG9ja2V2ZW50c19jaGFpbiwgcmVhc29uLCBkZXYpOworfQorCisvKgorICogQ2FsbGVkIGFmdGVyIGEgbm90aWZ5IGFkZCB0byBtYWtlIGRldmljZXMgYXZhaWxibGUgd2hpY2ggd2VyZQorICogcmVsZWFzZWQgZnJvbSB0aGUgbm90aWZpZXIgY2FsbC4KKyAqLworc3RhdGljIHZvaWQgY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKHZvaWQpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2OworCisJd2hpbGUgKCFsaXN0X2VtcHR5KCZjbG9ja2V2ZW50c19yZWxlYXNlZCkpIHsKKwkJZGV2ID0gbGlzdF9lbnRyeShjbG9ja2V2ZW50c19yZWxlYXNlZC5uZXh0LAorCQkJCSBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKKwkJbGlzdF9kZWwoJmRldi0+bGlzdCk7CisJCWxpc3RfYWRkKCZkZXYtPmxpc3QsICZjbG9ja2V2ZW50X2RldmljZXMpOworCQljbG9ja2V2ZW50c19kb19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9BREQsIGRldik7CisJfQorfQorCisvKioKKyAqIGNsb2NrZXZlbnRzX3JlZ2lzdGVyX2RldmljZSAtIHJlZ2lzdGVyIGEgY2xvY2sgZXZlbnQgZGV2aWNlCisgKiBAZGV2OglkZXZpY2UgdG8gcmVnaXN0ZXIKKyAqLwordm9pZCBjbG9ja2V2ZW50c19yZWdpc3Rlcl9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCUJVR19PTihkZXYtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEKTsKKworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisKKwlsaXN0X2FkZCgmZGV2LT5saXN0LCAmY2xvY2tldmVudF9kZXZpY2VzKTsKKwljbG9ja2V2ZW50c19kb19ub3RpZnkoQ0xPQ0tfRVZUX05PVElGWV9BREQsIGRldik7CisJY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKCk7CisKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qCisgKiBOb29wIGhhbmRsZXIgd2hlbiB3ZSBzaHV0IGRvd24gYW4gZXZlbnQgZGV2aWNlCisgKi8KK3N0YXRpYyB2b2lkIGNsb2NrZXZlbnRzX2hhbmRsZV9ub29wKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UgLSByZWxlYXNlIGFuZCByZXF1ZXN0IGNsb2NrIGRldmljZXMKKyAqIEBvbGQ6CWRldmljZSB0byByZWxlYXNlIChjYW4gYmUgTlVMTCkKKyAqIEBuZXc6CWRldmljZSB0byByZXF1ZXN0IChjYW4gYmUgTlVMTCkKKyAqCisgKiBDYWxsZWQgZnJvbSB0aGUgbm90aWZpZXIgY2hhaW4uIGNsb2NrZXZlbnRzX2xvY2sgaXMgaGVsZCBhbHJlYWR5CisgKi8KK3ZvaWQgY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm9sZCwKKwkJCQkgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3KQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyoKKwkgKiBDYWxsZXIgcmVsZWFzZXMgYSBjbG9jayBldmVudCBkZXZpY2UuIFdlIHF1ZXVlIGl0IGludG8gdGhlCisJICogcmVsZWFzZWQgbGlzdCBhbmQgZG8gYSBub3RpZnkgYWRkIGxhdGVyLgorCSAqLworCWlmIChvbGQpIHsKKwkJb2xkLT5ldmVudF9oYW5kbGVyID0gY2xvY2tldmVudHNfaGFuZGxlX25vb3A7CisJCWNsb2NrZXZlbnRzX3NldF9tb2RlKG9sZCwgQ0xPQ0tfRVZUX01PREVfVU5VU0VEKTsKKwkJbGlzdF9kZWwoJm9sZC0+bGlzdCk7CisJCWxpc3RfYWRkKCZvbGQtPmxpc3QsICZjbG9ja2V2ZW50c19yZWxlYXNlZCk7CisJfQorCisJaWYgKG5ldykgeworCQlCVUdfT04obmV3LT5tb2RlICE9IENMT0NLX0VWVF9NT0RFX1VOVVNFRCk7CisJCWNsb2NrZXZlbnRzX3NldF9tb2RlKG5ldywgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCX0KKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKy8qKgorICogY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UKKyAqLworc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY2xvY2tldmVudHNfcmVxdWVzdF9kZXZpY2UodW5zaWduZWQgaW50IGZlYXR1cmVzLAorCQkJCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqY3VyLCAqZGV2ID0gTlVMTDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisKKwlzcGluX2xvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJbGlzdF9mb3JfZWFjaCh0bXAsICZjbG9ja2V2ZW50X2RldmljZXMpIHsKKwkJY3VyID0gbGlzdF9lbnRyeSh0bXAsIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGxpc3QpOworCisJCWlmICgoY3VyLT5mZWF0dXJlcyAmIGZlYXR1cmVzKSA9PSBmZWF0dXJlcyAmJgorCQkgICAgY3B1c19lcXVhbChjcHVtYXNrLCBjdXItPmNwdW1hc2spKSB7CisJCQlpZiAoIWRldiB8fCBkZXYtPnJhdGluZyA8IGN1ci0+cmF0aW5nKQorCQkJCWRldiA9IGN1cjsKKwkJfQorCX0KKworCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShOVUxMLCBkZXYpOworCisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIGRldjsKK30KKworLyoqCisgKiBjbG9ja2V2ZW50c19yZWxlYXNlX2RldmljZQorICovCit2b2lkIGNsb2NrZXZlbnRzX3JlbGVhc2VfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzcGluX2xvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJY2xvY2tldmVudHNfZXhjaGFuZ2VfZGV2aWNlKGRldiwgTlVMTCk7CisJY2xvY2tldmVudHNfbm90aWZ5X3JlbGVhc2VkKCk7CisKKwlzcGluX3VubG9jaygmY2xvY2tldmVudHNfbG9jayk7Cit9CisKKy8qKgorICogY2xvY2tldmVudHNfbm90aWZ5IC0gbm90aWZpY2F0aW9uIGFib3V0IHJlbGV2YW50IGV2ZW50cworICovCit2b2lkIGNsb2NrZXZlbnRzX25vdGlmeSh1bnNpZ25lZCBsb25nIHJlYXNvbiwgdm9pZCAqYXJnKQoreworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisJY2xvY2tldmVudHNfZG9fbm90aWZ5KHJlYXNvbiwgYXJnKTsKKworCXN3aXRjaCAocmVhc29uKSB7CisJY2FzZSBDTE9DS19FVlRfTk9USUZZX0NQVV9ERUFEOgorCQkvKgorCQkgKiBVbnJlZ2lzdGVyIHRoZSBjbG9jayBldmVudCBkZXZpY2VzIHdoaWNoIHdlcmUKKwkJICogcmVsZWFzZWQgZnJvbSB0aGUgdXNlcnMgaW4gdGhlIG5vdGlmeSBjaGFpbi4KKwkJICovCisJCXdoaWxlICghbGlzdF9lbXB0eSgmY2xvY2tldmVudHNfcmVsZWFzZWQpKSB7CisJCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXY7CisKKwkJCWRldiA9IGxpc3RfZW50cnkoY2xvY2tldmVudHNfcmVsZWFzZWQubmV4dCwKKwkJCQkJIHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UsIGxpc3QpOworCQkJbGlzdF9kZWwoJmRldi0+bGlzdCk7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXNwaW5fdW5sb2NrKCZjbG9ja2V2ZW50c19sb2NrKTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGNsb2NrZXZlbnRzX25vdGlmeSk7CisKKyNpZmRlZiBDT05GSUdfU1lTRlMKKworLyoqCisgKiBjbG9ja2V2ZW50c19zaG93X3JlZ2lzdGVyZWQgLSBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgY2xvY2tldmVudHMKKyAqIEBkZXY6CXVudXNlZAorICogQGJ1ZjoJY2hhciBidWZmZXIgdG8gYmUgZmlsbGVkIHdpdGggY2xvY2sgZXZlbnRzIGxpc3QKKyAqCisgKiBQcm92aWRlcyBzeXNmcyBpbnRlcmZhY2UgZm9yIGxpc3RpbmcgcmVnaXN0ZXJlZCBjbG9jayBldmVudCBkZXZpY2VzCisgKi8KK3N0YXRpYyBzc2l6ZV90IGNsb2NrZXZlbnRzX3Nob3dfcmVnaXN0ZXJlZChzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LCBjaGFyICpidWYpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOworCWNoYXIgKnAgPSBidWY7CisJaW50IGNwdTsKKworCXNwaW5fbG9jaygmY2xvY2tldmVudHNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2NrZXZlbnRfZGV2aWNlcykgeworCQlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpjZTsKKworCQljZSA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlLCBsaXN0KTsKKwkJcCArPSBzcHJpbnRmKHAsICIlLTIwcyBGOiUwNHggTTolZCIsIGNlLT5uYW1lLAorCQkJICAgICBjZS0+ZmVhdHVyZXMsIGNlLT5tb2RlKTsKKwkJcCArPSBzcHJpbnRmKHAsICIgQzoiKTsKKwkJaWYgKCFjcHVzX2VxdWFsKGNlLT5jcHVtYXNrLCBjcHVfcG9zc2libGVfbWFwKSkgeworCQkJZm9yX2VhY2hfY3B1X21hc2soY3B1LCBjZS0+Y3B1bWFzaykKKwkJCQlwICs9IHNwcmludGYocCwgIiAlZCIsIGNwdSk7CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogRklYTUU6IEFkZCB0aGUgY3B1IHdoaWNoIGlzIGhhbmRsaW5nIHRoaXMgc3Vja2VyCisJCQkgKi8KKwkJfQorCQlwICs9IHNwcmludGYocCwgIlxuIik7CisJfQorCisJc3Bpbl91bmxvY2soJmNsb2NrZXZlbnRzX2xvY2spOworCisJcmV0dXJuIHAgLSBidWY7Cit9CisKKy8qCisgKiBTeXNmcyBzZXR1cCBiaXRzOgorICovCitzdGF0aWMgU1lTREVWX0FUVFIocmVnaXN0ZXJlZCwgMDYwMCwKKwkJICAgY2xvY2tldmVudHNfc2hvd19yZWdpc3RlcmVkLCBOVUxMKTsKKworc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgY2xvY2tldmVudHNfc3lzY2xhc3MgPSB7CisJc2V0X2tzZXRfbmFtZSgiY2xvY2tldmVudHMiKSwKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzX2RldmljZSBjbG9ja2V2ZW50c19zeXNfZGV2aWNlID0geworCS5pZAk9IDAsCisJLmNscwk9ICZjbG9ja2V2ZW50c19zeXNjbGFzcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGNsb2NrZXZlbnRzX3N5c2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyb3IgPSBzeXNkZXZfY2xhc3NfcmVnaXN0ZXIoJmNsb2NrZXZlbnRzX3N5c2NsYXNzKTsKKworCWlmICghZXJyb3IpCisJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZjbG9ja2V2ZW50c19zeXNfZGV2aWNlKTsKKwlpZiAoIWVycm9yKQorCQllcnJvciA9IHN5c2Rldl9jcmVhdGVfZmlsZSgKKwkJCQkmY2xvY2tldmVudHNfc3lzX2RldmljZSwKKwkJCQkmYXR0cl9yZWdpc3RlcmVkKTsKKwlyZXR1cm4gZXJyb3I7Cit9CitkZXZpY2VfaW5pdGNhbGwoY2xvY2tldmVudHNfc3lzZnNfaW5pdCk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMgYi9rZXJuZWwvdGltZS9jbG9ja3NvdXJjZS5jCmluZGV4IGQ5ZWYxNzYuLjE5M2EwNzkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lL2Nsb2Nrc291cmNlLmMKKysrIGIva2VybmVsL3RpbWUvY2xvY2tzb3VyY2UuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPiAvKiBmb3Igc3Bpbl91bmxvY2tfaXJxKCkgdXNpbmcgcHJlZW1wdF9jb3VudCgpIG02OGsgKi8KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAKIC8qIFhYWCAtIFdvdWxkIGxpa2UgYSBiZXR0ZXIgd2F5IGZvciBpbml0aWFsaXppbmcgY3Vycl9jbG9ja3NvdXJjZSAqLwogZXh0ZXJuIHN0cnVjdCBjbG9ja3NvdXJjZSBjbG9ja3NvdXJjZV9qaWZmaWVzOwpAQCAtNDgsNiArNDksNyBAQAogICovCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpjdXJyX2Nsb2Nrc291cmNlID0gJmNsb2Nrc291cmNlX2ppZmZpZXM7CiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpuZXh0X2Nsb2Nrc291cmNlOworc3RhdGljIHN0cnVjdCBjbG9ja3NvdXJjZSAqY2xvY2tzb3VyY2Vfb3ZlcnJpZGU7CiBzdGF0aWMgTElTVF9IRUFEKGNsb2Nrc291cmNlX2xpc3QpOwogc3RhdGljIERFRklORV9TUElOTE9DSyhjbG9ja3NvdXJjZV9sb2NrKTsKIHN0YXRpYyBjaGFyIG92ZXJyaWRlX25hbWVbMzJdOwpAQCAtNjIsOSArNjQsMTIzIEBACiAJZmluaXNoZWRfYm9vdGluZyA9IDE7CiAJcmV0dXJuIDA7CiB9Ci0KIGxhdGVfaW5pdGNhbGwoY2xvY2tzb3VyY2VfZG9uZV9ib290aW5nKTsKIAorI2lmZGVmIENPTkZJR19DTE9DS1NPVVJDRV9XQVRDSERPRworc3RhdGljIExJU1RfSEVBRCh3YXRjaGRvZ19saXN0KTsKK3N0YXRpYyBzdHJ1Y3QgY2xvY2tzb3VyY2UgKndhdGNoZG9nOworc3RhdGljIHN0cnVjdCB0aW1lcl9saXN0IHdhdGNoZG9nX3RpbWVyOworc3RhdGljIERFRklORV9TUElOTE9DSyh3YXRjaGRvZ19sb2NrKTsKK3N0YXRpYyBjeWNsZV90IHdhdGNoZG9nX2xhc3Q7CisvKgorICogSW50ZXJ2YWw6IDAuNXNlYyBUcmVzaG9sZDogMC4wNjI1cworICovCisjZGVmaW5lIFdBVENIRE9HX0lOVEVSVkFMIChIWiA+PiAxKQorI2RlZmluZSBXQVRDSERPR19UUkVTSE9MRCAoTlNFQ19QRVJfU0VDID4+IDQpCisKK3N0YXRpYyB2b2lkIGNsb2Nrc291cmNlX3JhdGV3ZChzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCBpbnQ2NF90IGRlbHRhKQoreworCWlmIChkZWx0YSA+IC1XQVRDSERPR19UUkVTSE9MRCAmJiBkZWx0YSA8IFdBVENIRE9HX1RSRVNIT0xEKQorCQlyZXR1cm47CisKKwlwcmludGsoS0VSTl9XQVJOSU5HICJDbG9ja3NvdXJjZSAlcyB1bnN0YWJsZSAoZGVsdGEgPSAlTGQgbnMpXG4iLAorCSAgICAgICBjcy0+bmFtZSwgZGVsdGEpOworCWNzLT5mbGFncyAmPSB+KENMT0NLX1NPVVJDRV9WQUxJRF9GT1JfSFJFUyB8IENMT0NLX1NPVVJDRV9XQVRDSERPRyk7CisJY2xvY2tzb3VyY2VfY2hhbmdlX3JhdGluZyhjcywgMCk7CisJY3MtPmZsYWdzICY9IH5DTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJbGlzdF9kZWwoJmNzLT53ZF9saXN0KTsKK30KKworc3RhdGljIHZvaWQgY2xvY2tzb3VyY2Vfd2F0Y2hkb2codW5zaWduZWQgbG9uZyBkYXRhKQoreworCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3MsICp0bXA7CisJY3ljbGVfdCBjc25vdywgd2Rub3c7CisJaW50NjRfdCB3ZF9uc2VjLCBjc19uc2VjOworCisJc3Bpbl9sb2NrKCZ3YXRjaGRvZ19sb2NrKTsKKworCXdkbm93ID0gd2F0Y2hkb2ctPnJlYWQoKTsKKwl3ZF9uc2VjID0gY3ljMm5zKHdhdGNoZG9nLCAod2Rub3cgLSB3YXRjaGRvZ19sYXN0KSAmIHdhdGNoZG9nLT5tYXNrKTsKKwl3YXRjaGRvZ19sYXN0ID0gd2Rub3c7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoY3MsIHRtcCwgJndhdGNoZG9nX2xpc3QsIHdkX2xpc3QpIHsKKwkJY3Nub3cgPSBjcy0+cmVhZCgpOworCQkvKiBJbml0aWFsaXplZCA/ICovCisJCWlmICghKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9XQVRDSERPRykpIHsKKwkJCWlmICgoY3MtPmZsYWdzICYgQ0xPQ0tfU09VUkNFX0lTX0NPTlRJTlVPVVMpICYmCisJCQkgICAgKHdhdGNoZG9nLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKSkgeworCQkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfVkFMSURfRk9SX0hSRVM7CisJCQkJLyoKKwkJCQkgKiBXZSBqdXN0IG1hcmtlZCB0aGUgY2xvY2tzb3VyY2UgYXMKKwkJCQkgKiBoaWdocmVzLWNhcGFibGUsIG5vdGlmeSB0aGUgcmVzdCBvZiB0aGUKKwkJCQkgKiBzeXN0ZW0gYXMgd2VsbCBzbyB0aGF0IHdlIHRyYW5zaXRpb24KKwkJCQkgKiBpbnRvIGhpZ2gtcmVzIG1vZGU6CisJCQkJICovCisJCQkJdGlja19jbG9ja19ub3RpZnkoKTsKKwkJCX0KKwkJCWNzLT5mbGFncyB8PSBDTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJCQljcy0+d2RfbGFzdCA9IGNzbm93OworCQl9IGVsc2UgeworCQkJY3NfbnNlYyA9IGN5YzJucyhjcywgKGNzbm93IC0gY3MtPndkX2xhc3QpICYgY3MtPm1hc2spOworCQkJY3MtPndkX2xhc3QgPSBjc25vdzsKKwkJCS8qIENoZWNrIHRoZSBkZWx0YS4gTWlnaHQgcmVtb3ZlIGZyb20gdGhlIGxpc3QgISAqLworCQkJY2xvY2tzb3VyY2VfcmF0ZXdkKGNzLCBjc19uc2VjIC0gd2RfbnNlYyk7CisJCX0KKwl9CisKKwlpZiAoIWxpc3RfZW1wdHkoJndhdGNoZG9nX2xpc3QpKSB7CisJCV9fbW9kX3RpbWVyKCZ3YXRjaGRvZ190aW1lciwKKwkJCSAgICB3YXRjaGRvZ190aW1lci5leHBpcmVzICsgV0FUQ0hET0dfSU5URVJWQUwpOworCX0KKwlzcGluX3VubG9jaygmd2F0Y2hkb2dfbG9jayk7Cit9CitzdGF0aWMgdm9pZCBjbG9ja3NvdXJjZV9jaGVja193YXRjaGRvZyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzKQoreworCXN0cnVjdCBjbG9ja3NvdXJjZSAqY3NlOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmd2F0Y2hkb2dfbG9jaywgZmxhZ3MpOworCWlmIChjcy0+ZmxhZ3MgJiBDTE9DS19TT1VSQ0VfTVVTVF9WRVJJRlkpIHsKKwkJaW50IHN0YXJ0ZWQgPSAhbGlzdF9lbXB0eSgmd2F0Y2hkb2dfbGlzdCk7CisKKwkJbGlzdF9hZGQoJmNzLT53ZF9saXN0LCAmd2F0Y2hkb2dfbGlzdCk7CisJCWlmICghc3RhcnRlZCAmJiB3YXRjaGRvZykgeworCQkJd2F0Y2hkb2dfbGFzdCA9IHdhdGNoZG9nLT5yZWFkKCk7CisJCQl3YXRjaGRvZ190aW1lci5leHBpcmVzID0gamlmZmllcyArIFdBVENIRE9HX0lOVEVSVkFMOworCQkJYWRkX3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCX0KKwl9IGVsc2UgaWYgKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKSB7CisJCQljcy0+ZmxhZ3MgfD0gQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTOworCisJCWlmICghd2F0Y2hkb2cgfHwgY3MtPnJhdGluZyA+IHdhdGNoZG9nLT5yYXRpbmcpIHsKKwkJCWlmICh3YXRjaGRvZykKKwkJCQlkZWxfdGltZXIoJndhdGNoZG9nX3RpbWVyKTsKKwkJCXdhdGNoZG9nID0gY3M7CisJCQlpbml0X3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCQl3YXRjaGRvZ190aW1lci5mdW5jdGlvbiA9IGNsb2Nrc291cmNlX3dhdGNoZG9nOworCisJCQkvKiBSZXNldCB3YXRjaGRvZyBjeWNsZXMgKi8KKwkJCWxpc3RfZm9yX2VhY2hfZW50cnkoY3NlLCAmd2F0Y2hkb2dfbGlzdCwgd2RfbGlzdCkKKwkJCQljc2UtPmZsYWdzICY9IH5DTE9DS19TT1VSQ0VfV0FUQ0hET0c7CisJCQkvKiBTdGFydCBpZiBsaXN0IGlzIG5vdCBlbXB0eSAqLworCQkJaWYgKCFsaXN0X2VtcHR5KCZ3YXRjaGRvZ19saXN0KSkgeworCQkJCXdhdGNoZG9nX2xhc3QgPSB3YXRjaGRvZy0+cmVhZCgpOworCQkJCXdhdGNoZG9nX3RpbWVyLmV4cGlyZXMgPQorCQkJCQlqaWZmaWVzICsgV0FUQ0hET0dfSU5URVJWQUw7CisJCQkJYWRkX3RpbWVyKCZ3YXRjaGRvZ190aW1lcik7CisJCQl9CisJCX0KKwl9CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmd2F0Y2hkb2dfbG9jaywgZmxhZ3MpOworfQorI2Vsc2UKK3N0YXRpYyB2b2lkIGNsb2Nrc291cmNlX2NoZWNrX3dhdGNoZG9nKHN0cnVjdCBjbG9ja3NvdXJjZSAqY3MpCit7CisJaWYgKGNzLT5mbGFncyAmIENMT0NLX1NPVVJDRV9JU19DT05USU5VT1VTKQorCQljcy0+ZmxhZ3MgfD0gQ0xPQ0tfU09VUkNFX1ZBTElEX0ZPUl9IUkVTOworfQorI2VuZGlmCisKIC8qKgogICogY2xvY2tzb3VyY2VfZ2V0X25leHQgLSBSZXR1cm5zIHRoZSBzZWxlY3RlZCBjbG9ja3NvdXJjZQogICoKQEAgLTg0LDYwICsyMDAsNTQgQEAKIH0KIAogLyoqCi0gKiBzZWxlY3RfY2xvY2tzb3VyY2UgLSBGaW5kcyB0aGUgYmVzdCByZWdpc3RlcmVkIGNsb2Nrc291cmNlLgorICogc2VsZWN0X2Nsb2Nrc291cmNlIC0gU2VsZWN0cyB0aGUgYmVzdCByZWdpc3RlcmVkIGNsb2Nrc291cmNlLgogICoKICAqIFByaXZhdGUgZnVuY3Rpb24uIE11c3QgaG9sZCBjbG9ja3NvdXJjZV9sb2NrIHdoZW4gY2FsbGVkLgogICoKLSAqIExvb2tzIHRocm91Z2ggdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCBjbG9ja3NvdXJjZXMsIHJldHVybmluZwotICogdGhlIG9uZSB3aXRoIHRoZSBoaWdoZXN0IHJhdGluZyB2YWx1ZS4gSWYgdGhlcmUgaXMgYSBjbG9ja3NvdXJjZQotICogbmFtZSB0aGF0IG1hdGNoZXMgdGhlIG92ZXJyaWRlIHN0cmluZywgaXQgcmV0dXJucyB0aGF0IGNsb2Nrc291cmNlLgorICogU2VsZWN0IHRoZSBjbG9ja3NvdXJjZSB3aXRoIHRoZSBiZXN0IHJhdGluZywgb3IgdGhlIGNsb2Nrc291cmNlLAorICogd2hpY2ggaXMgc2VsZWN0ZWQgYnkgdXNlcnNwYWNlIG92ZXJyaWRlLgogICovCiBzdGF0aWMgc3RydWN0IGNsb2Nrc291cmNlICpzZWxlY3RfY2xvY2tzb3VyY2Uodm9pZCkKIHsKLQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmJlc3QgPSBOVUxMOwotCXN0cnVjdCBsaXN0X2hlYWQgKnRtcDsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm5leHQ7CiAKLQlsaXN0X2Zvcl9lYWNoKHRtcCwgJmNsb2Nrc291cmNlX2xpc3QpIHsKLQkJc3RydWN0IGNsb2Nrc291cmNlICpzcmM7CisJaWYgKGxpc3RfZW1wdHkoJmNsb2Nrc291cmNlX2xpc3QpKQorCQlyZXR1cm4gTlVMTDsKIAotCQlzcmMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKLQkJaWYgKCFiZXN0KQotCQkJYmVzdCA9IHNyYzsKKwlpZiAoY2xvY2tzb3VyY2Vfb3ZlcnJpZGUpCisJCW5leHQgPSBjbG9ja3NvdXJjZV9vdmVycmlkZTsKKwllbHNlCisJCW5leHQgPSBsaXN0X2VudHJ5KGNsb2Nrc291cmNlX2xpc3QubmV4dCwgc3RydWN0IGNsb2Nrc291cmNlLAorCQkJCSAgbGlzdCk7CiAKLQkJLyogY2hlY2sgZm9yIG92ZXJyaWRlOiAqLwotCQlpZiAoc3RybGVuKHNyYy0+bmFtZSkgPT0gc3RybGVuKG92ZXJyaWRlX25hbWUpICYmCi0JCSAgICAhc3RyY21wKHNyYy0+bmFtZSwgb3ZlcnJpZGVfbmFtZSkpIHsKLQkJCWJlc3QgPSBzcmM7Ci0JCQlicmVhazsKLQkJfQotCQkvKiBwaWNrIHRoZSBoaWdoZXN0IHJhdGluZzogKi8KLQkJaWYgKHNyYy0+cmF0aW5nID4gYmVzdC0+cmF0aW5nKQotCQkgCWJlc3QgPSBzcmM7Ci0JfQorCWlmIChuZXh0ID09IGN1cnJfY2xvY2tzb3VyY2UpCisJCXJldHVybiBOVUxMOwogCi0JcmV0dXJuIGJlc3Q7CisJcmV0dXJuIG5leHQ7CiB9CiAKLS8qKgotICogaXNfcmVnaXN0ZXJlZF9zb3VyY2UgLSBDaGVja3MgaWYgY2xvY2tzb3VyY2UgaXMgcmVnaXN0ZXJlZAotICogQGM6CQlwb2ludGVyIHRvIGEgY2xvY2tzb3VyY2UKLSAqCi0gKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbi4gTXVzdCBob2xkIGNsb2Nrc291cmNlX2xvY2sgd2hlbiBjYWxsZWQuCi0gKgotICogUmV0dXJucyBvbmUgaWYgdGhlIGNsb2Nrc291cmNlIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgemVybyBvdGhlcndpc2UuCisvKgorICogRW5xdWV1ZSB0aGUgY2xvY2tzb3VyY2Ugc29ydGVkIGJ5IHJhdGluZwogICovCi1zdGF0aWMgaW50IGlzX3JlZ2lzdGVyZWRfc291cmNlKHN0cnVjdCBjbG9ja3NvdXJjZSAqYykKK3N0YXRpYyBpbnQgY2xvY2tzb3VyY2VfZW5xdWV1ZShzdHJ1Y3QgY2xvY2tzb3VyY2UgKmMpCiB7Ci0JaW50IGxlbiA9IHN0cmxlbihjLT5uYW1lKTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICp0bXA7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wLCAqZW50cnkgPSAmY2xvY2tzb3VyY2VfbGlzdDsKIAogCWxpc3RfZm9yX2VhY2godG1wLCAmY2xvY2tzb3VyY2VfbGlzdCkgewotCQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKnNyYzsKKwkJc3RydWN0IGNsb2Nrc291cmNlICpjczsKIAotCQlzcmMgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKLQkJaWYgKHN0cmxlbihzcmMtPm5hbWUpID09IGxlbiAmJgkhc3RyY21wKHNyYy0+bmFtZSwgYy0+bmFtZSkpCi0JCQlyZXR1cm4gMTsKKwkJY3MgPSBsaXN0X2VudHJ5KHRtcCwgc3RydWN0IGNsb2Nrc291cmNlLCBsaXN0KTsKKwkJaWYgKGNzID09IGMpCisJCQlyZXR1cm4gLUVCVVNZOworCQkvKiBLZWVwIHRyYWNrIG9mIHRoZSBwbGFjZSwgd2hlcmUgdG8gaW5zZXJ0ICovCisJCWlmIChjcy0+cmF0aW5nID49IGMtPnJhdGluZykKKwkJCWVudHJ5ID0gdG1wOwogCX0KKwlsaXN0X2FkZCgmYy0+bGlzdCwgZW50cnkpOworCisJaWYgKHN0cmxlbihjLT5uYW1lKSA9PSBzdHJsZW4ob3ZlcnJpZGVfbmFtZSkgJiYKKwkgICAgIXN0cmNtcChjLT5uYW1lLCBvdmVycmlkZV9uYW1lKSkKKwkJY2xvY2tzb3VyY2Vfb3ZlcnJpZGUgPSBjOwogCiAJcmV0dXJuIDA7CiB9CkBAIC0xNTAsNDIgKzI2MCwzNSBAQAogICovCiBpbnQgY2xvY2tzb3VyY2VfcmVnaXN0ZXIoc3RydWN0IGNsb2Nrc291cmNlICpjKQogewotCWludCByZXQgPSAwOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IHJldDsKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZjbG9ja3NvdXJjZV9sb2NrLCBmbGFncyk7Ci0JLyogY2hlY2sgaWYgY2xvY2tzb3VyY2UgaXMgYWxyZWFkeSByZWdpc3RlcmVkICovCi0JaWYgKGlzX3JlZ2lzdGVyZWRfc291cmNlKGMpKSB7Ci0JCXByaW50aygicmVnaXN0ZXJfY2xvY2tzb3VyY2U6IENhbm5vdCByZWdpc3RlciAlcy4gIgotCQkgICAgICAgIkFscmVhZHkgcmVnaXN0ZXJlZCEiLCBjLT5uYW1lKTsKLQkJcmV0ID0gLUVCVVNZOwotCX0gZWxzZSB7Ci0JCS8qIHJlZ2lzdGVyIGl0ICovCi0gCQlsaXN0X2FkZCgmYy0+bGlzdCwgJmNsb2Nrc291cmNlX2xpc3QpOwotCQkvKiBzY2FuIHRoZSByZWdpc3RlcmVkIGNsb2Nrc291cmNlcywgYW5kIHBpY2sgdGhlIGJlc3Qgb25lICovCisJcmV0ID0gY2xvY2tzb3VyY2VfZW5xdWV1ZShjKTsKKwlpZiAoIXJldCkKIAkJbmV4dF9jbG9ja3NvdXJjZSA9IHNlbGVjdF9jbG9ja3NvdXJjZSgpOwotCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjbG9ja3NvdXJjZV9sb2NrLCBmbGFncyk7CisJaWYgKCFyZXQpCisJCWNsb2Nrc291cmNlX2NoZWNrX3dhdGNoZG9nKGMpOwogCXJldHVybiByZXQ7CiB9CiBFWFBPUlRfU1lNQk9MKGNsb2Nrc291cmNlX3JlZ2lzdGVyKTsKIAogLyoqCi0gKiBjbG9ja3NvdXJjZV9yZXNlbGVjdCAtIFJlc2NhbiBsaXN0IGZvciBuZXh0IGNsb2Nrc291cmNlCisgKiBjbG9ja3NvdXJjZV9jaGFuZ2VfcmF0aW5nIC0gQ2hhbmdlIHRoZSByYXRpbmcgb2YgYSByZWdpc3RlcmVkIGNsb2Nrc291cmNlCiAgKgotICogQSBxdWljayBoZWxwZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBpZiBhIGNsb2Nrc291cmNlIGNoYW5nZXMgaXRzCi0gKiByYXRpbmcuIEZvcmNlcyB0aGUgY2xvY2tzb3VyY2UgbGlzdCB0byBiZSByZS1zY2FubmVkIGZvciB0aGUgYmVzdAotICogY2xvY2tzb3VyY2UuCiAgKi8KLXZvaWQgY2xvY2tzb3VyY2VfcmVzZWxlY3Qodm9pZCkKK3ZvaWQgY2xvY2tzb3VyY2VfY2hhbmdlX3JhdGluZyhzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzLCBpbnQgcmF0aW5nKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOworCWxpc3RfZGVsKCZjcy0+bGlzdCk7CisJY3MtPnJhdGluZyA9IHJhdGluZzsKKwljbG9ja3NvdXJjZV9lbnF1ZXVlKGNzKTsKIAluZXh0X2Nsb2Nrc291cmNlID0gc2VsZWN0X2Nsb2Nrc291cmNlKCk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmY2xvY2tzb3VyY2VfbG9jaywgZmxhZ3MpOwogfQotRVhQT1JUX1NZTUJPTChjbG9ja3NvdXJjZV9yZXNlbGVjdCk7CiAKICNpZmRlZiBDT05GSUdfU1lTRlMKIC8qKgpAQCAtMjIxLDcgKzMyNCwxMSBAQAogc3RhdGljIHNzaXplX3Qgc3lzZnNfb3ZlcnJpZGVfY2xvY2tzb3VyY2Uoc3RydWN0IHN5c19kZXZpY2UgKmRldiwKIAkJCQkJICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKIHsKKwlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm92ciA9IE5VTEw7CisJc3RydWN0IGxpc3RfaGVhZCAqdG1wOwogCXNpemVfdCByZXQgPSBjb3VudDsKKwlpbnQgbGVuOworCiAJLyogc3RyaW5ncyBmcm9tIHN5c2ZzIHdyaXRlIGFyZSBub3QgMCB0ZXJtaW5hdGVkISAqLwogCWlmIChjb3VudCA+PSBzaXplb2Yob3ZlcnJpZGVfbmFtZSkpCiAJCXJldHVybiAtRUlOVkFMOwpAQCAtMjI5LDE3ICszMzYsMzIgQEAKIAkvKiBzdHJpcCBvZiBcbjogKi8KIAlpZiAoYnVmW2NvdW50LTFdID09ICdcbicpCiAJCWNvdW50LS07Ci0JaWYgKGNvdW50IDwgMSkKLQkJcmV0dXJuIC1FSU5WQUw7CiAKIAlzcGluX2xvY2tfaXJxKCZjbG9ja3NvdXJjZV9sb2NrKTsKIAotCS8qIGNvcHkgdGhlIG5hbWUgZ2l2ZW46ICovCi0JbWVtY3B5KG92ZXJyaWRlX25hbWUsIGJ1ZiwgY291bnQpOworCWlmIChjb3VudCA+IDApCisJCW1lbWNweShvdmVycmlkZV9uYW1lLCBidWYsIGNvdW50KTsKIAlvdmVycmlkZV9uYW1lW2NvdW50XSA9IDA7CiAKLQkvKiB0cnkgdG8gc2VsZWN0IGl0OiAqLwotCW5leHRfY2xvY2tzb3VyY2UgPSBzZWxlY3RfY2xvY2tzb3VyY2UoKTsKKwlsZW4gPSBzdHJsZW4ob3ZlcnJpZGVfbmFtZSk7CisJaWYgKGxlbikgeworCQlvdnIgPSBjbG9ja3NvdXJjZV9vdmVycmlkZTsKKwkJLyogdHJ5IHRvIHNlbGVjdCBpdDogKi8KKwkJbGlzdF9mb3JfZWFjaCh0bXAsICZjbG9ja3NvdXJjZV9saXN0KSB7CisJCQlzdHJ1Y3QgY2xvY2tzb3VyY2UgKmNzOworCisJCQljcyA9IGxpc3RfZW50cnkodG1wLCBzdHJ1Y3QgY2xvY2tzb3VyY2UsIGxpc3QpOworCQkJaWYgKHN0cmxlbihjcy0+bmFtZSkgPT0gbGVuICYmCisJCQkgICAgIXN0cmNtcChjcy0+bmFtZSwgb3ZlcnJpZGVfbmFtZSkpCisJCQkJb3ZyID0gY3M7CisJCX0KKwl9CisKKwkvKiBSZXNlbGVjdCwgd2hlbiB0aGUgb3ZlcnJpZGUgbmFtZSBoYXMgY2hhbmdlZCAqLworCWlmIChvdnIgIT0gY2xvY2tzb3VyY2Vfb3ZlcnJpZGUpIHsKKwkJY2xvY2tzb3VyY2Vfb3ZlcnJpZGUgPSBvdnI7CisJCW5leHRfY2xvY2tzb3VyY2UgPSBzZWxlY3RfY2xvY2tzb3VyY2UoKTsKKwl9CiAKIAlzcGluX3VubG9ja19pcnEoJmNsb2Nrc291cmNlX2xvY2spOwogCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS9qaWZmaWVzLmMgYi9rZXJuZWwvdGltZS9qaWZmaWVzLmMKaW5kZXggYTk5YjJhNi4uM2JlOGRhOCAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvamlmZmllcy5jCisrKyBiL2tlcm5lbC90aW1lL2ppZmZpZXMuYwpAQCAtNjIsNyArNjIsNiBAQAogCS5tYXNrCQk9IDB4ZmZmZmZmZmYsIC8qMzJiaXRzKi8KIAkubXVsdAkJPSBOU0VDX1BFUl9KSUZGWSA8PCBKSUZGSUVTX1NISUZULCAvKiBkZXRhaWxzIGFib3ZlICovCiAJLnNoaWZ0CQk9IEpJRkZJRVNfU0hJRlQsCi0JLmlzX2NvbnRpbnVvdXMJPSAwLCAvKiB0aWNrIGJhc2VkLCBub3QgZnJlZSBydW5uaW5nICovCiB9OwogCiBzdGF0aWMgaW50IF9faW5pdCBpbml0X2ppZmZpZXNfY2xvY2tzb3VyY2Uodm9pZCkKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL250cC5jIGIva2VybmVsL3RpbWUvbnRwLmMKaW5kZXggM2FmZWFhMy4uZWIxMjUwOSAxMDA2NDQKLS0tIGEva2VybmVsL3RpbWUvbnRwLmMKKysrIGIva2VybmVsL3RpbWUvbnRwLmMKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2RlZmluZSBNQVhfVElDS0FESgkJNTAwCQkvKiBtaWNyb3NlY3MgKi8KICNkZWZpbmUgTUFYX1RJQ0tBREpfU0NBTEVECSgoKHU2NCkoTUFYX1RJQ0tBREogKiBOU0VDX1BFUl9VU0VDKSA8PCBcCi0JCQkJICBUSUNLX0xFTkdUSF9TSElGVCkgLyBIWikKKwkJCQkgIFRJQ0tfTEVOR1RIX1NISUZUKSAvIE5UUF9JTlRFUlZBTF9GUkVRKQogCiAvKgogICogcGhhc2UtbG9jayBsb29wIHZhcmlhYmxlcwpAQCAtNDYsMTMgKzQ2LDE3IEBACiAKIHN0YXRpYyB2b2lkIG50cF91cGRhdGVfZnJlcXVlbmN5KHZvaWQpCiB7Ci0JdGlja19sZW5ndGhfYmFzZSA9ICh1NjQpKHRpY2tfdXNlYyAqIE5TRUNfUEVSX1VTRUMgKiBVU0VSX0haKSA8PCBUSUNLX0xFTkdUSF9TSElGVDsKLQl0aWNrX2xlbmd0aF9iYXNlICs9IChzNjQpQ0xPQ0tfVElDS19BREpVU1QgPDwgVElDS19MRU5HVEhfU0hJRlQ7Ci0JdGlja19sZW5ndGhfYmFzZSArPSAoczY0KXRpbWVfZnJlcSA8PCAoVElDS19MRU5HVEhfU0hJRlQgLSBTSElGVF9OU0VDKTsKKwl1NjQgc2Vjb25kX2xlbmd0aCA9ICh1NjQpKHRpY2tfdXNlYyAqIE5TRUNfUEVSX1VTRUMgKiBVU0VSX0haKQorCQkJCTw8IFRJQ0tfTEVOR1RIX1NISUZUOworCXNlY29uZF9sZW5ndGggKz0gKHM2NClDTE9DS19USUNLX0FESlVTVCA8PCBUSUNLX0xFTkdUSF9TSElGVDsKKwlzZWNvbmRfbGVuZ3RoICs9IChzNjQpdGltZV9mcmVxIDw8IChUSUNLX0xFTkdUSF9TSElGVCAtIFNISUZUX05TRUMpOwogCi0JZG9fZGl2KHRpY2tfbGVuZ3RoX2Jhc2UsIEhaKTsKKwl0aWNrX2xlbmd0aF9iYXNlID0gc2Vjb25kX2xlbmd0aDsKIAotCXRpY2tfbnNlYyA9IHRpY2tfbGVuZ3RoX2Jhc2UgPj4gVElDS19MRU5HVEhfU0hJRlQ7CisJZG9fZGl2KHNlY29uZF9sZW5ndGgsIEhaKTsKKwl0aWNrX25zZWMgPSBzZWNvbmRfbGVuZ3RoID4+IFRJQ0tfTEVOR1RIX1NISUZUOworCisJZG9fZGl2KHRpY2tfbGVuZ3RoX2Jhc2UsIE5UUF9JTlRFUlZBTF9GUkVRKTsKIH0KIAogLyoqCkBAIC0xNjIsNyArMTY2LDcgQEAKIAkJCXRpY2tfbGVuZ3RoIC09IE1BWF9USUNLQURKX1NDQUxFRDsKIAkJfSBlbHNlIHsKIAkJCXRpY2tfbGVuZ3RoICs9IChzNjQpKHRpbWVfYWRqdXN0ICogTlNFQ19QRVJfVVNFQyAvCi0JCQkJCSAgICAgSFopIDw8IFRJQ0tfTEVOR1RIX1NISUZUOworCQkJCQlOVFBfSU5URVJWQUxfRlJFUSkgPDwgVElDS19MRU5HVEhfU0hJRlQ7CiAJCQl0aW1lX2FkanVzdCA9IDA7CiAJCX0KIAl9CkBAIC0yMzksNyArMjQzLDggQEAKIAkJICAgIHJlc3VsdCA9IC1FSU5WQUw7CiAJCSAgICBnb3RvIGxlYXZlOwogCQl9Ci0JCXRpbWVfZnJlcSA9ICgoczY0KXR4Yy0+ZnJlcSAqIE5TRUNfUEVSX1VTRUMpID4+IChTSElGVF9VU0VDIC0gU0hJRlRfTlNFQyk7CisJCXRpbWVfZnJlcSA9ICgoczY0KXR4Yy0+ZnJlcSAqIE5TRUNfUEVSX1VTRUMpCisJCQkJPj4gKFNISUZUX1VTRUMgLSBTSElGVF9OU0VDKTsKIAkgICAgfQogCiAJICAgIGlmICh0eGMtPm1vZGVzICYgQURKX01BWEVSUk9SKSB7CkBAIC0zMDksNyArMzE0LDggQEAKIAkJICAgIGZyZXFfYWRqICs9IHRpbWVfZnJlcTsKIAkJICAgIGZyZXFfYWRqID0gbWluKGZyZXFfYWRqLCAoczY0KU1BWEZSRVFfTlNFQyk7CiAJCSAgICB0aW1lX2ZyZXEgPSBtYXgoZnJlcV9hZGosIChzNjQpLU1BWEZSRVFfTlNFQyk7Ci0JCSAgICB0aW1lX29mZnNldCA9ICh0aW1lX29mZnNldCAvIEhaKSA8PCBTSElGVF9VUERBVEU7CisJCSAgICB0aW1lX29mZnNldCA9ICh0aW1lX29mZnNldCAvIE5UUF9JTlRFUlZBTF9GUkVRKQorCQkgICAgCQkJPDwgU0hJRlRfVVBEQVRFOwogCQl9IC8qIFNUQV9QTEwgKi8KIAkgICAgfSAvKiB0eGMtPm1vZGVzICYgQURKX09GRlNFVCAqLwogCSAgICBpZiAodHhjLT5tb2RlcyAmIEFESl9USUNLKQpAQCAtMzI0LDggKzMzMCwxMCBAQAogCWlmICgodHhjLT5tb2RlcyAmIEFESl9PRkZTRVRfU0lOR0xFU0hPVCkgPT0gQURKX09GRlNFVF9TSU5HTEVTSE9UKQogCSAgICB0eGMtPm9mZnNldAkgICA9IHNhdmVfYWRqdXN0OwogCWVsc2UKLQkgICAgdHhjLT5vZmZzZXQgICAgPSBzaGlmdF9yaWdodCh0aW1lX29mZnNldCwgU0hJRlRfVVBEQVRFKSAqIEhaIC8gMTAwMDsKLQl0eGMtPmZyZXEJICAgPSAodGltZV9mcmVxIC8gTlNFQ19QRVJfVVNFQykgPDwgKFNISUZUX1VTRUMgLSBTSElGVF9OU0VDKTsKKwkgICAgdHhjLT5vZmZzZXQgICAgPSBzaGlmdF9yaWdodCh0aW1lX29mZnNldCwgU0hJRlRfVVBEQVRFKQorCSAgICAJCQkqIE5UUF9JTlRFUlZBTF9GUkVRIC8gMTAwMDsKKwl0eGMtPmZyZXEJICAgPSAodGltZV9mcmVxIC8gTlNFQ19QRVJfVVNFQykKKwkJCQk8PCAoU0hJRlRfVVNFQyAtIFNISUZUX05TRUMpOwogCXR4Yy0+bWF4ZXJyb3IJICAgPSB0aW1lX21heGVycm9yOwogCXR4Yy0+ZXN0ZXJyb3IJICAgPSB0aW1lX2VzdGVycm9yOwogCXR4Yy0+c3RhdHVzCSAgID0gdGltZV9zdGF0dXM7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWJyb2FkY2FzdC5jIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmIzZWZlCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1icm9hZGNhc3QuYwpAQCAtMCwwICsxLDQ4MCBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stYnJvYWRjYXN0LmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIHdoaWNoIGVtdWxhdGUgYSBsb2NhbCBjbG9jay1ldmVudAorICogZGV2aWNlIHZpYSBhIGJyb2FkY2FzdCBldmVudCBzb3VyY2UuCisgKgorICogQ29weXJpZ2h0KEMpIDIwMDUtMjAwNiwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA3LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogQ29weXJpZ2h0KEMpIDIwMDYtMjAwNywgVGltZXN5cyBDb3JwLiwgVGhvbWFzIEdsZWl4bmVyCisgKgorICogVGhpcyBjb2RlIGlzIGxpY2VuY2VkIHVuZGVyIHRoZSBHUEwgdmVyc2lvbiAyLiBGb3IgZGV0YWlscyBzZWUKKyAqIGtlcm5lbC1iYXNlL0NPUFlJTkcuCisgKi8KKyNpbmNsdWRlIDxsaW51eC9jcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnIuaD4KKyNpbmNsdWRlIDxsaW51eC9ocnRpbWVyLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorCisjaW5jbHVkZSAidGljay1pbnRlcm5hbC5oIgorCisvKgorICogQnJvYWRjYXN0IHN1cHBvcnQgZm9yIGJyb2tlbiB4ODYgaGFyZHdhcmUsIHdoZXJlIHRoZSBsb2NhbCBhcGljCisgKiB0aW1lciBzdG9wcyBpbiBDMyBzdGF0ZS4KKyAqLworCitzdHJ1Y3QgdGlja19kZXZpY2UgdGlja19icm9hZGNhc3RfZGV2aWNlOworc3RhdGljIGNwdW1hc2tfdCB0aWNrX2Jyb2FkY2FzdF9tYXNrOworc3RhdGljIERFRklORV9TUElOTE9DSyh0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKKworLyoKKyAqIERlYnVnZ2luZzogc2VlIHRpbWVyX2xpc3QuYworICovCitzdHJ1Y3QgdGlja19kZXZpY2UgKnRpY2tfZ2V0X2Jyb2FkY2FzdF9kZXZpY2Uodm9pZCkKK3sKKwlyZXR1cm4gJnRpY2tfYnJvYWRjYXN0X2RldmljZTsKK30KKworY3B1bWFza190ICp0aWNrX2dldF9icm9hZGNhc3RfbWFzayh2b2lkKQoreworCXJldHVybiAmdGlja19icm9hZGNhc3RfbWFzazsKK30KKworLyoKKyAqIFN0YXJ0IHRoZSBkZXZpY2UgaW4gcGVyaW9kaWMgbW9kZQorICovCitzdGF0aWMgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zdGFydF9wZXJpb2RpYyhzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwlpZiAoYmMgJiYgYmMtPm1vZGUgPT0gQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pCisJCXRpY2tfc2V0dXBfcGVyaW9kaWMoYmMsIDEpOworfQorCisvKgorICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgY2FuIGJlIHV0aWxpemVkIGFzIGJyb2FkY2FzdCBkZXZpY2U6CisgKi8KK2ludCB0aWNrX2NoZWNrX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCWlmICh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2IHx8CisJICAgIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfQzNTVE9QKSkKKwkJcmV0dXJuIDA7CisKKwljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoTlVMTCwgZGV2KTsKKwl0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2ID0gZGV2OworCWlmICghY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkKKwkJdGlja19icm9hZGNhc3Rfc3RhcnRfcGVyaW9kaWMoZGV2KTsKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgZGV2aWNlIGlzIHRoZSBicm9hZGNhc3QgZGV2aWNlCisgKi8KK2ludCB0aWNrX2lzX2Jyb2FkY2FzdF9kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2KQoreworCXJldHVybiAoZGV2ICYmIHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXYgPT0gZGV2KTsKK30KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgZGV2aWNlIGlzIGRpc2Z1bmN0aW9uYWwgYW5kIGEgcGxhY2UgaG9sZGVyLCB3aGljaAorICogbmVlZHMgdG8gYmUgaGFuZGxlZCBieSB0aGUgYnJvYWRjYXN0IGRldmljZS4KKyAqLworaW50IHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGNwdSkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCByZXQgPSAwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCS8qCisJICogRGV2aWNlcyBtaWdodCBiZSByZWdpc3RlcmVkIHdpdGggYm90aCBwZXJpb2RpYyBhbmQgb25lc2hvdAorCSAqIG1vZGUgZGlzYWJsZWQuIFRoaXMgc2lnbmFscywgdGhhdCB0aGUgZGV2aWNlIG5lZWRzIHRvIGJlCisJICogb3BlcmF0ZWQgZnJvbSB0aGUgYnJvYWRjYXN0IGRldmljZSBhbmQgaXMgYSBwbGFjZWhvbGRlciBmb3IKKwkgKiB0aGUgY3B1IGxvY2FsIGRldmljZS4KKwkgKi8KKwlpZiAoIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSkgeworCQlkZXYtPmV2ZW50X2hhbmRsZXIgPSB0aWNrX2hhbmRsZV9wZXJpb2RpYzsKKwkJY3B1X3NldChjcHUsIHRpY2tfYnJvYWRjYXN0X21hc2spOworCQl0aWNrX2Jyb2FkY2FzdF9zdGFydF9wZXJpb2RpYyh0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2KTsKKwkJcmV0ID0gMTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEJyb2FkY2FzdCB0aGUgZXZlbnQgdG8gdGhlIGNwdXMsIHdoaWNoIGFyZSBzZXQgaW4gdGhlIG1hc2sKKyAqLworaW50IHRpY2tfZG9fYnJvYWRjYXN0KGNwdW1hc2tfdCBtYXNrKQoreworCWludCByZXQgPSAwLCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKworCS8qCisJICogQ2hlY2ssIGlmIHRoZSBjdXJyZW50IGNwdSBpcyBpbiB0aGUgbWFzaworCSAqLworCWlmIChjcHVfaXNzZXQoY3B1LCBtYXNrKSkgeworCQljcHVfY2xlYXIoY3B1LCBtYXNrKTsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCXRkLT5ldnRkZXYtPmV2ZW50X2hhbmRsZXIodGQtPmV2dGRldik7CisJCXJldCA9IDE7CisJfQorCisJaWYgKCFjcHVzX2VtcHR5KG1hc2spKSB7CisJCS8qCisJCSAqIEl0IG1pZ2h0IGJlIG5lY2Vzc2FyeSB0byBhY3R1YWxseSBjaGVjayB3aGV0aGVyIHRoZSBkZXZpY2VzCisJCSAqIGhhdmUgZGlmZmVyZW50IGJyb2FkY2FzdCBmdW5jdGlvbnMuIEZvciBub3csIGp1c3QgdXNlIHRoZQorCQkgKiBvbmUgb2YgdGhlIGZpcnN0IGRldmljZS4gVGhpcyB3b3JrcyBhcyBsb25nIGFzIHdlIGhhdmUgdGhpcworCQkgKiBtaXNmZWF0dXJlIG9ubHkgb24geDg2IChsYXBpYykKKwkJICovCisJCWNwdSA9IGZpcnN0X2NwdShtYXNrKTsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCXRkLT5ldnRkZXYtPmJyb2FkY2FzdChtYXNrKTsKKwkJcmV0ID0gMTsKKwl9CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIFBlcmlvZGljIGJyb2FkY2FzdDoKKyAqIC0gaW52b2tlIHRoZSBicm9hZGNhc3QgaGFuZGxlcnMKKyAqLworc3RhdGljIHZvaWQgdGlja19kb19wZXJpb2RpY19icm9hZGNhc3Qodm9pZCkKK3sKKwljcHVtYXNrX3QgbWFzazsKKworCXNwaW5fbG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7CisKKwljcHVzX2FuZChtYXNrLCBjcHVfb25saW5lX21hcCwgdGlja19icm9hZGNhc3RfbWFzayk7CisJdGlja19kb19icm9hZGNhc3QobWFzayk7CisKKwlzcGluX3VubG9jaygmdGlja19icm9hZGNhc3RfbG9jayk7Cit9CisKKy8qCisgKiBFdmVudCBoYW5kbGVyIGZvciBwZXJpb2RpYyBicm9hZGNhc3QgdGlja3MKKyAqLworc3RhdGljIHZvaWQgdGlja19oYW5kbGVfcGVyaW9kaWNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlkZXYtPm5leHRfZXZlbnQudHY2NCA9IEtUSU1FX01BWDsKKworCXRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KCk7CisKKwkvKgorCSAqIFRoZSBkZXZpY2UgaXMgaW4gcGVyaW9kaWMgbW9kZS4gTm8gcmVwcm9ncmFtbWluZyBuZWNlc3Nhcnk6CisJICovCisJaWYgKGRldi0+bW9kZSA9PSBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQykKKwkJcmV0dXJuOworCisJLyoKKwkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCisJICogcGVyaW9kaWMgbW9kZToKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWt0aW1lX3QgbmV4dCA9IGt0aW1lX2FkZChkZXYtPm5leHRfZXZlbnQsIHRpY2tfcGVyaW9kKTsKKworCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBrdGltZV9nZXQoKSkpCisJCQlyZXR1cm47CisJCXRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KCk7CisJfQorfQorCisvKgorICogUG93ZXJzdGF0ZSBpbmZvcm1hdGlvbjogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlCisgKiBhZmZlY3RlZCBkZXZpY2VzIG1pZ2h0IHN0b3AKKyAqLworc3RhdGljIHZvaWQgdGlja19kb19icm9hZGNhc3Rfb25fb2ZmKHZvaWQgKndoeSkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYywgKmRldjsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCXVuc2lnbmVkIGxvbmcgZmxhZ3MsICpyZWFzb24gPSB3aHk7CisJaW50IGNwdTsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJZGV2ID0gdGQtPmV2dGRldjsKKwliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisKKwkvKgorCSAqIElzIHRoZSBkZXZpY2UgaW4gYnJvYWRjYXN0IG1vZGUgZm9yZXZlciBvciBpcyBpdCBub3QKKwkgKiBhZmZlY3RlZCBieSB0aGUgcG93ZXJzdGF0ZSA/CisJICovCisJaWYgKCFkZXYgfHwgIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSB8fAorCSAgICAhKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQorCQlnb3RvIG91dDsKKworCWlmICgqcmVhc29uID09IENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OKSB7CisJCWlmICghY3B1X2lzc2V0KGNwdSwgdGlja19icm9hZGNhc3RfbWFzaykpIHsKKwkJCWNwdV9zZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9tYXNrKTsKKwkJCWlmICh0ZC0+bW9kZSA9PSBUSUNLREVWX01PREVfUEVSSU9ESUMpCisJCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LAorCQkJCQkJICAgICBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCX0KKwl9IGVsc2UgeworCQlpZiAoY3B1X2lzc2V0KGNwdSwgdGlja19icm9hZGNhc3RfbWFzaykpIHsKKwkJCWNwdV9jbGVhcihjcHUsIHRpY2tfYnJvYWRjYXN0X21hc2spOworCQkJaWYgKHRkLT5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJCQl0aWNrX3NldHVwX3BlcmlvZGljKGRldiwgMCk7CisJCX0KKwl9CisKKwlpZiAoY3B1c19lbXB0eSh0aWNrX2Jyb2FkY2FzdF9tYXNrKSkKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoYmMsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwllbHNlIHsKKwkJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJCXRpY2tfYnJvYWRjYXN0X3N0YXJ0X3BlcmlvZGljKGJjKTsKKwkJZWxzZQorCQkJdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChiYyk7CisJfQorb3V0OgorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIFBvd2Vyc3RhdGUgaW5mb3JtYXRpb246IFRoZSBzeXN0ZW0gZW50ZXJzL2xlYXZlcyBhIHN0YXRlLCB3aGVyZQorICogYWZmZWN0ZWQgZGV2aWNlcyBtaWdodCBzdG9wLgorICovCit2b2lkIHRpY2tfYnJvYWRjYXN0X29uX29mZih1bnNpZ25lZCBsb25nIHJlYXNvbiwgaW50ICpvbmNwdSkKK3sKKwlpbnQgY3B1ID0gZ2V0X2NwdSgpOworCisJaWYgKGNwdSA9PSAqb25jcHUpCisJCXRpY2tfZG9fYnJvYWRjYXN0X29uX29mZigmcmVhc29uKTsKKwllbHNlCisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZSgqb25jcHUsIHRpY2tfZG9fYnJvYWRjYXN0X29uX29mZiwKKwkJCQkJICZyZWFzb24sIDEsIDEpOworCXB1dF9jcHUoKTsKK30KKworLyoKKyAqIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBkZXBlbmRpbmcgb24gYnJvYWRjYXN0IG9uL29mZgorICovCit2b2lkIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KQoreworCWlmICghYnJvYWRjYXN0KQorCQlkZXYtPmV2ZW50X2hhbmRsZXIgPSB0aWNrX2hhbmRsZV9wZXJpb2RpYzsKKwllbHNlCisJCWRldi0+ZXZlbnRfaGFuZGxlciA9IHRpY2tfaGFuZGxlX3BlcmlvZGljX2Jyb2FkY2FzdDsKK30KKworLyoKKyAqIFJlbW92ZSBhIENQVSBmcm9tIGJyb2FkY2FzdGluZworICovCit2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCAqY3B1cCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBjcHUgPSAqY3B1cDsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7CisKKwliYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisJY3B1X2NsZWFyKGNwdSwgdGlja19icm9hZGNhc3RfbWFzayk7CisKKwlpZiAodGlja19icm9hZGNhc3RfZGV2aWNlLm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKSB7CisJCWlmIChiYyAmJiBjcHVzX2VtcHR5KHRpY2tfYnJvYWRjYXN0X21hc2spKQorCQkJY2xvY2tldmVudHNfc2V0X21vZGUoYmMsIENMT0NLX0VWVF9NT0RFX1NIVVRET1dOKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7Cit9CisKKyNpZmRlZiBDT05GSUdfVElDS19PTkVTSE9UCisKK3N0YXRpYyBjcHVtYXNrX3QgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOworCisvKgorICogRGVidWdnaW5nOiBzZWUgdGltZXJfbGlzdC5jCisgKi8KK2NwdW1hc2tfdCAqdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzayh2b2lkKQoreworCXJldHVybiAmdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOworfQorCitzdGF0aWMgaW50IHRpY2tfYnJvYWRjYXN0X3NldF9ldmVudChrdGltZV90IGV4cGlyZXMsIGludCBmb3JjZSkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYyA9IHRpY2tfYnJvYWRjYXN0X2RldmljZS5ldnRkZXY7CisJa3RpbWVfdCBub3cgPSBrdGltZV9nZXQoKTsKKwlpbnQgcmVzOworCisJZm9yKDs7KSB7CisJCXJlcyA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoYmMsIGV4cGlyZXMsIG5vdyk7CisJCWlmICghcmVzIHx8ICFmb3JjZSkKKwkJCXJldHVybiByZXM7CisJCW5vdyA9IGt0aW1lX2dldCgpOworCQlleHBpcmVzID0ga3RpbWVfYWRkKG5vdywga3RpbWVfc2V0KDAsIGJjLT5taW5fZGVsdGFfbnMpKTsKKwl9Cit9CisKKy8qCisgKiBSZXByb2dyYW0gdGhlIGJyb2FkY2FzdCBkZXZpY2U6CisgKgorICogQ2FsbGVkIHdpdGggdGlja19icm9hZGNhc3RfbG9jayBoZWxkIGFuZCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICovCitzdGF0aWMgaW50IHRpY2tfYnJvYWRjYXN0X3JlcHJvZ3JhbSh2b2lkKQoreworCWt0aW1lX3QgZXhwaXJlcyA9IHsgLnR2NjQgPSBLVElNRV9NQVggfTsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCWludCBjcHU7CisKKwkvKgorCSAqIEZpbmQgdGhlIGV2ZW50IHdoaWNoIGV4cGlyZXMgbmV4dDoKKwkgKi8KKwlmb3IgKGNwdSA9IGZpcnN0X2NwdSh0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOyBjcHUgIT0gTlJfQ1BVUzsKKwkgICAgIGNwdSA9IG5leHRfY3B1KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKSkgeworCQl0ZCA9ICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKKwkJaWYgKHRkLT5ldnRkZXYtPm5leHRfZXZlbnQudHY2NCA8IGV4cGlyZXMudHY2NCkKKwkJCWV4cGlyZXMgPSB0ZC0+ZXZ0ZGV2LT5uZXh0X2V2ZW50OworCX0KKworCWlmIChleHBpcmVzLnR2NjQgPT0gS1RJTUVfTUFYKQorCQlyZXR1cm4gMDsKKworCXJldHVybiB0aWNrX2Jyb2FkY2FzdF9zZXRfZXZlbnQoZXhwaXJlcywgMCk7Cit9CisKKy8qCisgKiBIYW5kbGUgb25lc2hvdCBtb2RlIGJyb2FkY2FzdGluZworICovCitzdGF0aWMgdm9pZCB0aWNrX2hhbmRsZV9vbmVzaG90X2Jyb2FkY2FzdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKwljcHVtYXNrX3QgbWFzazsKKwlrdGltZV90IG5vdzsKKwlpbnQgY3B1OworCisJc3Bpbl9sb2NrKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrKTsKK2FnYWluOgorCWRldi0+bmV4dF9ldmVudC50djY0ID0gS1RJTUVfTUFYOworCW1hc2sgPSBDUFVfTUFTS19OT05FOworCW5vdyA9IGt0aW1lX2dldCgpOworCS8qIEZpbmQgYWxsIGV4cGlyZWQgZXZlbnRzICovCisJZm9yIChjcHUgPSBmaXJzdF9jcHUodGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKTsgY3B1ICE9IE5SX0NQVVM7CisJICAgICBjcHUgPSBuZXh0X2NwdShjcHUsIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzaykpIHsKKwkJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJCWlmICh0ZC0+ZXZ0ZGV2LT5uZXh0X2V2ZW50LnR2NjQgPD0gbm93LnR2NjQpCisJCQljcHVfc2V0KGNwdSwgbWFzayk7CisJfQorCisJLyoKKwkgKiBXYWtldXAgdGhlIGNwdXMgd2hpY2ggaGF2ZSBhbiBleHBpcmVkIGV2ZW50LiBUaGUgYnJvYWRjYXN0CisJICogZGV2aWNlIGlzIHJlcHJvZ3JhbW1lZCBpbiB0aGUgcmV0dXJuIGZyb20gaWRsZSBjb2RlLgorCSAqLworCWlmICghdGlja19kb19icm9hZGNhc3QobWFzaykpIHsKKwkJLyoKKwkJICogVGhlIGdsb2JhbCBldmVudCBkaWQgbm90IGV4cGlyZSBhbnkgQ1BVIGxvY2FsCisJCSAqIGV2ZW50cy4gVGhpcyBoYXBwZW5zIGluIGR5bnRpY2sgbW9kZSwgYXMgdGhlCisJCSAqIG1heGltdW0gUElUIGRlbHRhIGlzIHF1aXRlIHNtYWxsLgorCQkgKi8KKwkJaWYgKHRpY2tfYnJvYWRjYXN0X3JlcHJvZ3JhbSgpKQorCQkJZ290byBhZ2FpbjsKKwl9CisJc3Bpbl91bmxvY2soJnRpY2tfYnJvYWRjYXN0X2xvY2spOworfQorCisvKgorICogUG93ZXJzdGF0ZSBpbmZvcm1hdGlvbjogVGhlIHN5c3RlbSBlbnRlcnMvbGVhdmVzIGEgc3RhdGUsIHdoZXJlCisgKiBhZmZlY3RlZCBkZXZpY2VzIG1pZ2h0IHN0b3AKKyAqLwordm9pZCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wodW5zaWduZWQgbG9uZyByZWFzb24pCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMsICpkZXY7CisJc3RydWN0IHRpY2tfZGV2aWNlICp0ZDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjcHU7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOworCisJLyoKKwkgKiBQZXJpb2RpYyBtb2RlIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlIGVudGVyL2V4aXQgb2YgcG93ZXIKKwkgKiBzdGF0ZXMKKwkgKi8KKwlpZiAodGlja19icm9hZGNhc3RfZGV2aWNlLm1vZGUgPT0gVElDS0RFVl9NT0RFX1BFUklPRElDKQorCQlnb3RvIG91dDsKKworCWJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJZGV2ID0gdGQtPmV2dGRldjsKKworCWlmICghKGRldi0+ZmVhdHVyZXMgJiBDTE9DS19FVlRfRkVBVF9DM1NUT1ApKQorCQlnb3RvIG91dDsKKworCWlmIChyZWFzb24gPT0gQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVIpIHsKKwkJaWYgKCFjcHVfaXNzZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CisJCQljcHVfc2V0KGNwdSwgdGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrKTsKKwkJCWNsb2NrZXZlbnRzX3NldF9tb2RlKGRldiwgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCQkJaWYgKGRldi0+bmV4dF9ldmVudC50djY0IDwgYmMtPm5leHRfZXZlbnQudHY2NCkKKwkJCQl0aWNrX2Jyb2FkY2FzdF9zZXRfZXZlbnQoZGV2LT5uZXh0X2V2ZW50LCAxKTsKKwkJfQorCX0gZWxzZSB7CisJCWlmIChjcHVfaXNzZXQoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spKSB7CisJCQljcHVfY2xlYXIoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOworCQkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwkJCWlmIChkZXYtPm5leHRfZXZlbnQudHY2NCAhPSBLVElNRV9NQVgpCisJCQkJdGlja19wcm9ncmFtX2V2ZW50KGRldi0+bmV4dF9ldmVudCwgMSk7CisJCX0KKwl9CisKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2Jyb2FkY2FzdF9sb2NrLCBmbGFncyk7Cit9CisKKy8qKgorICogdGlja19icm9hZGNhc3Rfc2V0dXBfaGlnaHJlcyAtIHNldHVwIHRoZSBicm9hZGNhc3QgZGV2aWNlIGZvciBoaWdocmVzCisgKi8KK3ZvaWQgdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYykKK3sKKwlpZiAoYmMtPm1vZGUgIT0gQ0xPQ0tfRVZUX01PREVfT05FU0hPVCkgeworCQliYy0+ZXZlbnRfaGFuZGxlciA9IHRpY2tfaGFuZGxlX29uZXNob3RfYnJvYWRjYXN0OworCQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisJCWJjLT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisJfQorfQorCisvKgorICogU2VsZWN0IG9uZXNob3Qgb3BlcmF0aW5nIG1vZGUgZm9yIHRoZSBicm9hZGNhc3QgZGV2aWNlCisgKi8KK3ZvaWQgdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3Qodm9pZCkKK3sKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpiYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCXRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID0gVElDS0RFVl9NT0RFX09ORVNIT1Q7CisJYmMgPSB0aWNrX2Jyb2FkY2FzdF9kZXZpY2UuZXZ0ZGV2OworCWlmIChiYykKKwkJdGlja19icm9hZGNhc3Rfc2V0dXBfb25lc2hvdChiYyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGlja19icm9hZGNhc3RfbG9jaywgZmxhZ3MpOworfQorCisKKy8qCisgKiBSZW1vdmUgYSBkZWFkIENQVSBmcm9tIGJyb2FkY2FzdGluZworICovCit2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgaW50IGNwdSA9ICpjcHVwOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKKworCWJjID0gdGlja19icm9hZGNhc3RfZGV2aWNlLmV2dGRldjsKKwljcHVfY2xlYXIoY3B1LCB0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X21hc2spOworCisJaWYgKHRpY2tfYnJvYWRjYXN0X2RldmljZS5tb2RlID09IFRJQ0tERVZfTU9ERV9PTkVTSE9UKSB7CisJCWlmIChiYyAmJiBjcHVzX2VtcHR5KHRpY2tfYnJvYWRjYXN0X29uZXNob3RfbWFzaykpCisJCQljbG9ja2V2ZW50c19zZXRfbW9kZShiYywgQ0xPQ0tfRVZUX01PREVfU0hVVERPV04pOworCX0KKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfYnJvYWRjYXN0X2xvY2ssIGZsYWdzKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aWNrLWNvbW1vbi5jIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTAwZTM0Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1jb21tb24uYwpAQCAtMCwwICsxLDM0NiBAQAorLyoKKyAqIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stY29tbW9uLmMKKyAqCisgKiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGJhc2UgZnVuY3Rpb25zIHRvIG1hbmFnZSBwZXJpb2RpYyB0aWNrCisgKiByZWxhdGVkIGV2ZW50cy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlICJ0aWNrLWludGVybmFsLmgiCisKKy8qCisgKiBUaWNrIGRldmljZXMKKyAqLworREVGSU5FX1BFUl9DUFUoc3RydWN0IHRpY2tfZGV2aWNlLCB0aWNrX2NwdV9kZXZpY2UpOworLyoKKyAqIFRpY2sgbmV4dCBldmVudDoga2VlcHMgdHJhY2sgb2YgdGhlIHRpY2sgdGltZQorICovCitrdGltZV90IHRpY2tfbmV4dF9wZXJpb2Q7CitrdGltZV90IHRpY2tfcGVyaW9kOworc3RhdGljIGludCB0aWNrX2RvX3RpbWVyX2NwdSA9IC0xOworREVGSU5FX1NQSU5MT0NLKHRpY2tfZGV2aWNlX2xvY2spOworCisvKgorICogRGVidWdnaW5nOiBzZWUgdGltZXJfbGlzdC5jCisgKi8KK3N0cnVjdCB0aWNrX2RldmljZSAqdGlja19nZXRfZGV2aWNlKGludCBjcHUpCit7CisJcmV0dXJuICZwZXJfY3B1KHRpY2tfY3B1X2RldmljZSwgY3B1KTsKK30KKworLyoqCisgKiB0aWNrX2lzX29uZXNob3RfYXZhaWxhYmxlIC0gY2hlY2sgZm9yIGEgb25lc2hvdCBjYXBhYmxlIGV2ZW50IGRldmljZQorICovCitpbnQgdGlja19pc19vbmVzaG90X2F2YWlsYWJsZSh2b2lkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiA9IF9fZ2V0X2NwdV92YXIodGlja19jcHVfZGV2aWNlKS5ldnRkZXY7CisKKwlyZXR1cm4gZGV2ICYmIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCk7Cit9CisKKy8qCisgKiBQZXJpb2RpYyB0aWNrCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfcGVyaW9kaWMoaW50IGNwdSkKK3sKKwlpZiAodGlja19kb190aW1lcl9jcHUgPT0gY3B1KSB7CisJCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJCS8qIEtlZXAgdHJhY2sgb2YgdGhlIG5leHQgdGljayBldmVudCAqLworCQl0aWNrX25leHRfcGVyaW9kID0ga3RpbWVfYWRkKHRpY2tfbmV4dF9wZXJpb2QsIHRpY2tfcGVyaW9kKTsKKworCQlkb190aW1lcigxKTsKKwkJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwl9CisKKwl1cGRhdGVfcHJvY2Vzc190aW1lcyh1c2VyX21vZGUoZ2V0X2lycV9yZWdzKCkpKTsKKwlwcm9maWxlX3RpY2soQ1BVX1BST0ZJTElORyk7Cit9CisKKy8qCisgKiBFdmVudCBoYW5kbGVyIGZvciBwZXJpb2RpYyB0aWNrcworICovCit2b2lkIHRpY2tfaGFuZGxlX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCisJdGlja19wZXJpb2RpYyhjcHUpOworCisJaWYgKGRldi0+bW9kZSAhPSBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKQorCQlyZXR1cm47CisJLyoKKwkgKiBTZXR1cCB0aGUgbmV4dCBwZXJpb2QgZm9yIGRldmljZXMsIHdoaWNoIGRvIG5vdCBoYXZlCisJICogcGVyaW9kaWMgbW9kZToKKwkgKi8KKwlmb3IgKDs7KSB7CisJCWt0aW1lX3QgbmV4dCA9IGt0aW1lX2FkZChkZXYtPm5leHRfZXZlbnQsIHRpY2tfcGVyaW9kKTsKKworCQlpZiAoIWNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBuZXh0LCBrdGltZV9nZXQoKSkpCisJCQlyZXR1cm47CisJCXRpY2tfcGVyaW9kaWMoY3B1KTsKKwl9Cit9CisKKy8qCisgKiBTZXR1cCB0aGUgZGV2aWNlIGZvciBhIHBlcmlvZGljIHRpY2sKKyAqLwordm9pZCB0aWNrX3NldHVwX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGJyb2FkY2FzdCkKK3sKKwl0aWNrX3NldF9wZXJpb2RpY19oYW5kbGVyKGRldiwgYnJvYWRjYXN0KTsKKworCS8qIEJyb2FkY2FzdCBzZXR1cCA/ICovCisJaWYgKCF0aWNrX2RldmljZV9pc19mdW5jdGlvbmFsKGRldikpCisJCXJldHVybjsKKworCWlmIChkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfUEVSSU9ESUMpIHsKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9QRVJJT0RJQyk7CisJfSBlbHNlIHsKKwkJdW5zaWduZWQgbG9uZyBzZXE7CisJCWt0aW1lX3QgbmV4dDsKKworCQlkbyB7CisJCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJCW5leHQgPSB0aWNrX25leHRfcGVyaW9kOworCQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKKworCQljbG9ja2V2ZW50c19zZXRfbW9kZShkZXYsIENMT0NLX0VWVF9NT0RFX09ORVNIT1QpOworCisJCWZvciAoOzspIHsKKwkJCWlmICghY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChkZXYsIG5leHQsIGt0aW1lX2dldCgpKSkKKwkJCQlyZXR1cm47CisJCQluZXh0ID0ga3RpbWVfYWRkKG5leHQsIHRpY2tfcGVyaW9kKTsKKwkJfQorCX0KK30KKworLyoKKyAqIFNldHVwIHRoZSB0aWNrIGRldmljZQorICovCitzdGF0aWMgdm9pZCB0aWNrX3NldHVwX2RldmljZShzdHJ1Y3QgdGlja19kZXZpY2UgKnRkLAorCQkJICAgICAgc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3ZGV2LCBpbnQgY3B1LAorCQkJICAgICAgY3B1bWFza190IGNwdW1hc2spCit7CisJa3RpbWVfdCBuZXh0X2V2ZW50OworCXZvaWQgKCpoYW5kbGVyKShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICopID0gTlVMTDsKKworCS8qCisJICogRmlyc3QgZGV2aWNlIHNldHVwID8KKwkgKi8KKwlpZiAoIXRkLT5ldnRkZXYpIHsKKwkJLyoKKwkJICogSWYgbm8gY3B1IHRvb2sgdGhlIGRvX3RpbWVyIHVwZGF0ZSwgYXNzaWduIGl0IHRvCisJCSAqIHRoaXMgY3B1OgorCQkgKi8KKwkJaWYgKHRpY2tfZG9fdGltZXJfY3B1ID09IC0xKSB7CisJCQl0aWNrX2RvX3RpbWVyX2NwdSA9IGNwdTsKKwkJCXRpY2tfbmV4dF9wZXJpb2QgPSBrdGltZV9nZXQoKTsKKwkJCXRpY2tfcGVyaW9kID0ga3RpbWVfc2V0KDAsIE5TRUNfUEVSX1NFQyAvIEhaKTsKKwkJfQorCisJCS8qCisJCSAqIFN0YXJ0dXAgaW4gcGVyaW9kaWMgbW9kZSBmaXJzdC4KKwkJICovCisJCXRkLT5tb2RlID0gVElDS0RFVl9NT0RFX1BFUklPRElDOworCX0gZWxzZSB7CisJCWhhbmRsZXIgPSB0ZC0+ZXZ0ZGV2LT5ldmVudF9oYW5kbGVyOworCQluZXh0X2V2ZW50ID0gdGQtPmV2dGRldi0+bmV4dF9ldmVudDsKKwl9CisKKwl0ZC0+ZXZ0ZGV2ID0gbmV3ZGV2OworCisJLyoKKwkgKiBXaGVuIHRoZSBkZXZpY2UgaXMgbm90IHBlciBjcHUsIHBpbiB0aGUgaW50ZXJydXB0IHRvIHRoZQorCSAqIGN1cnJlbnQgY3B1OgorCSAqLworCWlmICghY3B1c19lcXVhbChuZXdkZXYtPmNwdW1hc2ssIGNwdW1hc2spKQorCQlpcnFfc2V0X2FmZmluaXR5KG5ld2Rldi0+aXJxLCBjcHVtYXNrKTsKKworCS8qCisJICogV2hlbiBnbG9iYWwgYnJvYWRjYXN0aW5nIGlzIGFjdGl2ZSwgY2hlY2sgaWYgdGhlIGN1cnJlbnQKKwkgKiBkZXZpY2UgaXMgcmVnaXN0ZXJlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBicm9hZGNhc3QgbW9kZS4KKwkgKiBUaGlzIGFsbG93cyB1cyB0byBoYW5kbGUgdGhpcyB4ODYgbWlzZmVhdHVyZSBpbiBhIGdlbmVyaWMKKwkgKiB3YXkuCisJICovCisJaWYgKHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KG5ld2RldiwgY3B1KSkKKwkJcmV0dXJuOworCisJaWYgKHRkLT5tb2RlID09IFRJQ0tERVZfTU9ERV9QRVJJT0RJQykKKwkJdGlja19zZXR1cF9wZXJpb2RpYyhuZXdkZXYsIDApOworCWVsc2UKKwkJdGlja19zZXR1cF9vbmVzaG90KG5ld2RldiwgaGFuZGxlciwgbmV4dF9ldmVudCk7Cit9CisKKy8qCisgKiBDaGVjaywgaWYgdGhlIG5ldyByZWdpc3RlcmVkIGRldmljZSBzaG91bGQgYmUgdXNlZC4KKyAqLworc3RhdGljIGludCB0aWNrX2NoZWNrX25ld19kZXZpY2Uoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqbmV3ZGV2KQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmN1cmRldjsKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkOworCWludCBjcHUsIHJldCA9IE5PVElGWV9PSzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWNwdW1hc2tfdCBjcHVtYXNrOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwlpZiAoIWNwdV9pc3NldChjcHUsIG5ld2Rldi0+Y3B1bWFzaykpCisJCWdvdG8gb3V0OworCisJdGQgPSAmcGVyX2NwdSh0aWNrX2NwdV9kZXZpY2UsIGNwdSk7CisJY3VyZGV2ID0gdGQtPmV2dGRldjsKKwljcHVtYXNrID0gY3B1bWFza19vZl9jcHUoY3B1KTsKKworCS8qIGNwdSBsb2NhbCBkZXZpY2UgPyAqLworCWlmICghY3B1c19lcXVhbChuZXdkZXYtPmNwdW1hc2ssIGNwdW1hc2spKSB7CisKKwkJLyoKKwkJICogSWYgdGhlIGNwdSBhZmZpbml0eSBvZiB0aGUgZGV2aWNlIGludGVycnVwdCBjYW4gbm90CisJCSAqIGJlIHNldCwgaWdub3JlIGl0LgorCQkgKi8KKwkJaWYgKCFpcnFfY2FuX3NldF9hZmZpbml0eShuZXdkZXYtPmlycSkpCisJCQlnb3RvIG91dF9iYzsKKworCQkvKgorCQkgKiBJZiB3ZSBoYXZlIGEgY3B1IGxvY2FsIGRldmljZSBhbHJlYWR5LCBkbyBub3QgcmVwbGFjZSBpdAorCQkgKiBieSBhIG5vbiBjcHUgbG9jYWwgZGV2aWNlCisJCSAqLworCQlpZiAoY3VyZGV2ICYmIGNwdXNfZXF1YWwoY3VyZGV2LT5jcHVtYXNrLCBjcHVtYXNrKSkKKwkJCWdvdG8gb3V0X2JjOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBhbiBhY3RpdmUgZGV2aWNlLCB0aGVuIGNoZWNrIHRoZSByYXRpbmcgYW5kIHRoZSBvbmVzaG90CisJICogZmVhdHVyZS4KKwkgKi8KKwlpZiAoY3VyZGV2KSB7CisJCS8qCisJCSAqIFByZWZlciBvbmUgc2hvdCBjYXBhYmxlIGRldmljZXMgIQorCQkgKi8KKwkJaWYgKChjdXJkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCkgJiYKKwkJICAgICEobmV3ZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX09ORVNIT1QpKQorCQkJZ290byBvdXRfYmM7CisJCS8qCisJCSAqIENoZWNrIHRoZSByYXRpbmcKKwkJICovCisJCWlmIChjdXJkZXYtPnJhdGluZyA+PSBuZXdkZXYtPnJhdGluZykKKwkJCWdvdG8gb3V0X2JjOworCX0KKworCS8qCisJICogUmVwbGFjZSB0aGUgZXZlbnR1YWxseSBleGlzdGluZyBkZXZpY2UgYnkgdGhlIG5ldworCSAqIGRldmljZS4gSWYgdGhlIGN1cnJlbnQgZGV2aWNlIGlzIHRoZSBicm9hZGNhc3QgZGV2aWNlLCBkbworCSAqIG5vdCBnaXZlIGl0IGJhY2sgdG8gdGhlIGNsb2NrZXZlbnRzIGxheWVyICEKKwkgKi8KKwlpZiAodGlja19pc19icm9hZGNhc3RfZGV2aWNlKGN1cmRldikpIHsKKwkJY2xvY2tldmVudHNfc2V0X21vZGUoY3VyZGV2LCBDTE9DS19FVlRfTU9ERV9TSFVURE9XTik7CisJCWN1cmRldiA9IE5VTEw7CisJfQorCWNsb2NrZXZlbnRzX2V4Y2hhbmdlX2RldmljZShjdXJkZXYsIG5ld2Rldik7CisJdGlja19zZXR1cF9kZXZpY2UodGQsIG5ld2RldiwgY3B1LCBjcHVtYXNrKTsKKwlpZiAobmV3ZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX09ORVNIT1QpCisJCXRpY2tfb25lc2hvdF9ub3RpZnkoKTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwlyZXR1cm4gTk9USUZZX1NUT1A7CisKK291dF9iYzoKKwkvKgorCSAqIENhbiB0aGUgbmV3IGRldmljZSBiZSB1c2VkIGFzIGEgYnJvYWRjYXN0IGRldmljZSA/CisJICovCisJaWYgKHRpY2tfY2hlY2tfYnJvYWRjYXN0X2RldmljZShuZXdkZXYpKQorCQlyZXQgPSBOT1RJRllfU1RPUDsKK291dDoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0aWNrX2RldmljZV9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogU2h1dGRvd24gYW4gZXZlbnQgZGV2aWNlIG9uIGEgZ2l2ZW4gY3B1OgorICoKKyAqIFRoaXMgaXMgY2FsbGVkIG9uIGEgbGlmZSBDUFUsIHdoZW4gYSBDUFUgaXMgZGVhZC4gU28gd2UgY2Fubm90CisgKiBhY2Nlc3MgdGhlIGhhcmR3YXJlIGRldmljZSBpdHNlbGYuCisgKiBXZSBqdXN0IHNldCB0aGUgbW9kZSBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGxpc3RzLgorICovCitzdGF0aWMgdm9pZCB0aWNrX3NodXRkb3duKHVuc2lnbmVkIGludCAqY3B1cCkKK3sKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkID0gJnBlcl9jcHUodGlja19jcHVfZGV2aWNlLCAqY3B1cCk7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gdGQtPmV2dGRldjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKKwl0ZC0+bW9kZSA9IFRJQ0tERVZfTU9ERV9QRVJJT0RJQzsKKwlpZiAoZGV2KSB7CisJCS8qCisJCSAqIFByZXZlbnQgdGhhdCB0aGUgY2xvY2sgZXZlbnRzIGxheWVyIHRyaWVzIHRvIGNhbGwKKwkJICogdGhlIHNldCBtb2RlIGZ1bmN0aW9uIQorCQkgKi8KKwkJZGV2LT5tb2RlID0gQ0xPQ0tfRVZUX01PREVfVU5VU0VEOworCQljbG9ja2V2ZW50c19leGNoYW5nZV9kZXZpY2UoZGV2LCBOVUxMKTsKKwkJdGQtPmV2dGRldiA9IE5VTEw7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRpY2tfZGV2aWNlX2xvY2ssIGZsYWdzKTsKK30KKworLyoKKyAqIE5vdGlmaWNhdGlvbiBhYm91dCBjbG9jayBldmVudCBkZXZpY2VzCisgKi8KK3N0YXRpYyBpbnQgdGlja19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyByZWFzb24sCisJCQkgICAgICAgdm9pZCAqZGV2KQoreworCXN3aXRjaCAocmVhc29uKSB7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQUREOgorCQlyZXR1cm4gdGlja19jaGVja19uZXdfZGV2aWNlKGRldik7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQlJPQURDQVNUX09OOgorCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfT0ZGOgorCQl0aWNrX2Jyb2FkY2FzdF9vbl9vZmYocmVhc29uLCBkZXYpOworCQlicmVhazsKKworCWNhc2UgQ0xPQ0tfRVZUX05PVElGWV9CUk9BRENBU1RfRU5URVI6CisJY2FzZSBDTE9DS19FVlRfTk9USUZZX0JST0FEQ0FTVF9FWElUOgorCQl0aWNrX2Jyb2FkY2FzdF9vbmVzaG90X2NvbnRyb2wocmVhc29uKTsKKwkJYnJlYWs7CisKKwljYXNlIENMT0NLX0VWVF9OT1RJRllfQ1BVX0RFQUQ6CisJCXRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QoZGV2KTsKKwkJdGlja19zaHV0ZG93bl9icm9hZGNhc3QoZGV2KTsKKwkJdGlja19zaHV0ZG93bihkZXYpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgdGlja19ub3RpZmllciA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHRpY2tfbm90aWZ5LAorfTsKKworLyoqCisgKiB0aWNrX2luaXQgLSBpbml0aWFsaXplIHRoZSB0aWNrIGNvbnRyb2wKKyAqCisgKiBSZWdpc3RlciB0aGUgbm90aWZpZXIgd2l0aCB0aGUgY2xvY2tldmVudHMgZnJhbWV3b3JrCisgKi8KK3ZvaWQgX19pbml0IHRpY2tfaW5pdCh2b2lkKQoreworCWNsb2NrZXZlbnRzX3JlZ2lzdGVyX25vdGlmaWVyKCZ0aWNrX25vdGlmaWVyKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaCBiL2tlcm5lbC90aW1lL3RpY2staW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDg2MWEwCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogdGljayBpbnRlcm5hbCB2YXJpYWJsZSBhbmQgZnVuY3Rpb25zIHVzZWQgYnkgbG93L2hpZ2ggcmVzIGNvZGUKKyAqLworREVDTEFSRV9QRVJfQ1BVKHN0cnVjdCB0aWNrX2RldmljZSwgdGlja19jcHVfZGV2aWNlKTsKK2V4dGVybiBzcGlubG9ja190IHRpY2tfZGV2aWNlX2xvY2s7CitleHRlcm4ga3RpbWVfdCB0aWNrX25leHRfcGVyaW9kOworZXh0ZXJuIGt0aW1lX3QgdGlja19wZXJpb2Q7CisKK2V4dGVybiB2b2lkIHRpY2tfc2V0dXBfcGVyaW9kaWMoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgYnJvYWRjYXN0KTsKK2V4dGVybiB2b2lkIHRpY2tfaGFuZGxlX3BlcmlvZGljKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CisKKy8qCisgKiBOT19IWiAvIGhpZ2ggcmVzb2x1dGlvbiB0aW1lciBzaGFyZWQgY29kZQorICovCisjaWZkZWYgQ09ORklHX1RJQ0tfT05FU0hPVAorZXh0ZXJuIHZvaWQgdGlja19zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKm5ld2RldiwKKwkJCSAgICAgICB2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCSAgICAgICBrdGltZV90IG5leHRldnQpOworZXh0ZXJuIGludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpOworZXh0ZXJuIHZvaWQgdGlja19vbmVzaG90X25vdGlmeSh2b2lkKTsKK2V4dGVybiBpbnQgdGlja19zd2l0Y2hfdG9fb25lc2hvdCh2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSk7CisKKyMgaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCitleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKTsKK2V4dGVybiB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbik7CitleHRlcm4gdm9pZCB0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCh2b2lkKTsKK2V4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0X29uZXNob3QodW5zaWduZWQgaW50ICpjcHVwKTsKKyMgZWxzZSAvKiBCUk9BRENBU1QgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX2Jyb2FkY2FzdF9zZXR1cF9vbmVzaG90KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmJjKQoreworCUJVRygpOworfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X29uZXNob3RfY29udHJvbCh1bnNpZ25lZCBsb25nIHJlYXNvbikgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfc3dpdGNoX3RvX29uZXNob3Qodm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3Rfb25lc2hvdCh1bnNpZ25lZCBpbnQgKmNwdXApIHsgfQorIyBlbmRpZiAvKiAhQlJPQURDQVNUICovCisKKyNlbHNlIC8qICFPTkVTSE9UICovCitzdGF0aWMgaW5saW5lCit2b2lkIHRpY2tfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXdkZXYsCisJCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCWt0aW1lX3QgbmV4dGV2dCkKK3sKKwlCVUcoKTsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfcHJvZ3JhbV9ldmVudChrdGltZV90IGV4cGlyZXMsIGludCBmb3JjZSkKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX29uZXNob3Rfbm90aWZ5KHZvaWQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X3NldHVwX29uZXNob3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqYmMpCit7CisJQlVHKCk7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19icm9hZGNhc3Rfb25lc2hvdF9jb250cm9sKHVuc2lnbmVkIGxvbmcgcmVhc29uKSB7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCB0aWNrX3NodXRkb3duX2Jyb2FkY2FzdF9vbmVzaG90KHVuc2lnbmVkIGludCAqY3B1cCkgeyB9CisjZW5kaWYgLyogIVRJQ0tfT05FU0hPVCAqLworCisvKgorICogQnJvYWRjYXN0aW5nIHN1cHBvcnQKKyAqLworI2lmZGVmIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JST0FEQ0FTVAorZXh0ZXJuIGludCB0aWNrX2RvX2Jyb2FkY2FzdChjcHVtYXNrX3QgbWFzayk7CisKK2V4dGVybiBpbnQgdGlja19kZXZpY2VfdXNlc19icm9hZGNhc3Qoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LCBpbnQgY3B1KTsKK2V4dGVybiBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldik7CitleHRlcm4gaW50IHRpY2tfaXNfYnJvYWRjYXN0X2RldmljZShzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpOworZXh0ZXJuIHZvaWQgdGlja19icm9hZGNhc3Rfb25fb2ZmKHVuc2lnbmVkIGxvbmcgcmVhc29uLCBpbnQgKm9uY3B1KTsKK2V4dGVybiB2b2lkIHRpY2tfc2h1dGRvd25fYnJvYWRjYXN0KHVuc2lnbmVkIGludCAqY3B1cCk7CisKK2V4dGVybiB2b2lkCit0aWNrX3NldF9wZXJpb2RpY19oYW5kbGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwgaW50IGJyb2FkY2FzdCk7CisKKyNlbHNlIC8qICFCUk9BRENBU1QgKi8KKworc3RhdGljIGlubGluZSBpbnQgdGlja19jaGVja19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgdGlja19pc19icm9hZGNhc3RfZGV2aWNlKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KK3N0YXRpYyBpbmxpbmUgaW50IHRpY2tfZGV2aWNlX3VzZXNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiwKKwkJCQkJICAgICBpbnQgY3B1KQoreworCXJldHVybiAwOworfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfZG9fcGVyaW9kaWNfYnJvYWRjYXN0KHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmQpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIHRpY2tfYnJvYWRjYXN0X29uX29mZih1bnNpZ25lZCBsb25nIHJlYXNvbiwgaW50ICpvbmNwdSkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19zaHV0ZG93bl9icm9hZGNhc3QodW5zaWduZWQgaW50ICpjcHVwKSB7IH0KKworLyoKKyAqIFNldCB0aGUgcGVyaW9kaWMgaGFuZGxlciBpbiBub24gYnJvYWRjYXN0IG1vZGUKKyAqLworc3RhdGljIGlubGluZSB2b2lkIHRpY2tfc2V0X3BlcmlvZGljX2hhbmRsZXIoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2LAorCQkJCQkgICAgIGludCBicm9hZGNhc3QpCit7CisJZGV2LT5ldmVudF9oYW5kbGVyID0gdGlja19oYW5kbGVfcGVyaW9kaWM7Cit9CisjZW5kaWYgLyogIUJST0FEQ0FTVCAqLworCisvKgorICogQ2hlY2ssIGlmIHRoZSBkZXZpY2UgaXMgZnVuY3Rpb25hbCBvciBhIGR1bW15IGZvciBicm9hZGNhc3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgdGlja19kZXZpY2VfaXNfZnVuY3Rpb25hbChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYpCit7CisJcmV0dXJuICEoZGV2LT5mZWF0dXJlcyAmIENMT0NLX0VWVF9GRUFUX0RVTU1ZKTsKK30KZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jIGIva2VybmVsL3RpbWUvdGljay1vbmVzaG90LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU4YjdmZgotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL3RpY2stb25lc2hvdC5jCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBsaW51eC9rZXJuZWwvdGltZS90aWNrLW9uZXNob3QuYworICoKKyAqIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgd2hpY2ggbWFuYWdlIGhpZ2ggcmVzb2x1dGlvbiB0aWNrCisgKiByZWxhdGVkIGV2ZW50cy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodChDKSAyMDA1LTIwMDcsIFJlZCBIYXQsIEluYy4sIEluZ28gTW9sbmFyCisgKiBDb3B5cmlnaHQoQykgMjAwNi0yMDA3LCBUaW1lc3lzIENvcnAuLCBUaG9tYXMgR2xlaXhuZXIKKyAqCisgKiBUaGlzIGNvZGUgaXMgbGljZW5jZWQgdW5kZXIgdGhlIEdQTCB2ZXJzaW9uIDIuIEZvciBkZXRhaWxzIHNlZQorICoga2VybmVsLWJhc2UvQ09QWUlORy4KKyAqLworI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorI2luY2x1ZGUgPGxpbnV4L2Vyci5oPgorI2luY2x1ZGUgPGxpbnV4L2hydGltZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9pcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9wcm9maWxlLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlICJ0aWNrLWludGVybmFsLmgiCisKKy8qKgorICogdGlja19wcm9ncmFtX2V2ZW50CisgKi8KK2ludCB0aWNrX3Byb2dyYW1fZXZlbnQoa3RpbWVfdCBleHBpcmVzLCBpbnQgZm9yY2UpCit7CisJc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqZGV2ID0gX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9kZXZpY2UpLmV2dGRldjsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IHJldCA9IGNsb2NrZXZlbnRzX3Byb2dyYW1fZXZlbnQoZGV2LCBleHBpcmVzLCBub3cpOworCisJCWlmICghcmV0IHx8ICFmb3JjZSkKKwkJCXJldHVybiByZXQ7CisJCW5vdyA9IGt0aW1lX2dldCgpOworCQlleHBpcmVzID0ga3RpbWVfYWRkKG5vdywga3RpbWVfc2V0KDAsIGRldi0+bWluX2RlbHRhX25zKSk7CisJfQorfQorCisvKioKKyAqIHRpY2tfc2V0dXBfb25lc2hvdCAtIHNldHVwIHRoZSBldmVudCBkZXZpY2UgZm9yIG9uZXNob3QgbW9kZSAoaHJlcyBvciBub2h6KQorICovCit2b2lkIHRpY2tfc2V0dXBfb25lc2hvdChzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpuZXdkZXYsCisJCQl2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSwKKwkJCWt0aW1lX3QgbmV4dF9ldmVudCkKK3sKKwluZXdkZXYtPmV2ZW50X2hhbmRsZXIgPSBoYW5kbGVyOworCWNsb2NrZXZlbnRzX3NldF9tb2RlKG5ld2RldiwgQ0xPQ0tfRVZUX01PREVfT05FU0hPVCk7CisJY2xvY2tldmVudHNfcHJvZ3JhbV9ldmVudChuZXdkZXYsIG5leHRfZXZlbnQsIGt0aW1lX2dldCgpKTsKK30KKworLyoqCisgKiB0aWNrX3N3aXRjaF90b19vbmVzaG90IC0gc3dpdGNoIHRvIG9uZXNob3QgbW9kZQorICovCitpbnQgdGlja19zd2l0Y2hfdG9fb25lc2hvdCh2b2lkICgqaGFuZGxlcikoc3RydWN0IGNsb2NrX2V2ZW50X2RldmljZSAqKSkKK3sKKwlzdHJ1Y3QgdGlja19kZXZpY2UgKnRkID0gJl9fZ2V0X2NwdV92YXIodGlja19jcHVfZGV2aWNlKTsKKwlzdHJ1Y3QgY2xvY2tfZXZlbnRfZGV2aWNlICpkZXYgPSB0ZC0+ZXZ0ZGV2OworCisJaWYgKCFkZXYgfHwgIShkZXYtPmZlYXR1cmVzICYgQ0xPQ0tfRVZUX0ZFQVRfT05FU0hPVCkgfHwKKwkgICAgIXRpY2tfZGV2aWNlX2lzX2Z1bmN0aW9uYWwoZGV2KSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0ZC0+bW9kZSA9IFRJQ0tERVZfTU9ERV9PTkVTSE9UOworCWRldi0+ZXZlbnRfaGFuZGxlciA9IGhhbmRsZXI7CisJY2xvY2tldmVudHNfc2V0X21vZGUoZGV2LCBDTE9DS19FVlRfTU9ERV9PTkVTSE9UKTsKKwl0aWNrX2Jyb2FkY2FzdF9zd2l0Y2hfdG9fb25lc2hvdCgpOworCXJldHVybiAwOworfQorCisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworLyoqCisgKiB0aWNrX2luaXRfaGlnaHJlcyAtIHN3aXRjaCB0byBoaWdoIHJlc29sdXRpb24gbW9kZQorICoKKyAqIENhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQuCisgKi8KK2ludCB0aWNrX2luaXRfaGlnaHJlcyh2b2lkKQoreworCXJldHVybiB0aWNrX3N3aXRjaF90b19vbmVzaG90KGhydGltZXJfaW50ZXJydXB0KTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWUvdGljay1zY2hlZC5jIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZTQxZjdmCi0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RpbWUvdGljay1zY2hlZC5jCkBAIC0wLDAgKzEsNTYzIEBACisvKgorICogIGxpbnV4L2tlcm5lbC90aW1lL3RpY2stc2NoZWQuYworICoKKyAqICBDb3B5cmlnaHQoQykgMjAwNS0yMDA2LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICBDb3B5cmlnaHQoQykgMjAwNS0yMDA3LCBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodChDKSAyMDA2LTIwMDcgIFRpbWVzeXMgQ29ycC4sIFRob21hcyBHbGVpeG5lcgorICoKKyAqICBObyBpZGxlIHRpY2sgaW1wbGVtZW50YXRpb24gZm9yIGxvdyBhbmQgaGlnaCByZXNvbHV0aW9uIHRpbWVycworICoKKyAqICBTdGFydGVkIGJ5OiBUaG9tYXMgR2xlaXhuZXIgYW5kIEluZ28gTW9sbmFyCisgKgorICogIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvZXJyLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdGljay5oPgorCisjaW5jbHVkZSAidGljay1pbnRlcm5hbC5oIgorCisvKgorICogUGVyIGNwdSBub2h6IGNvbnRyb2wgc3RydWN0dXJlCisgKi8KK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgdGlja19zY2hlZCwgdGlja19jcHVfc2NoZWQpOworCisvKgorICogVGhlIHRpbWUsIHdoZW4gdGhlIGxhc3QgamlmZnkgdXBkYXRlIGhhcHBlbmVkLiBQcm90ZWN0ZWQgYnkgeHRpbWVfbG9jay4KKyAqLworc3RhdGljIGt0aW1lX3QgbGFzdF9qaWZmaWVzX3VwZGF0ZTsKKworc3RydWN0IHRpY2tfc2NoZWQgKnRpY2tfZ2V0X3RpY2tfc2NoZWQoaW50IGNwdSkKK3sKKwlyZXR1cm4gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7Cit9CisKKy8qCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGludGVycnVwdHMgZGlzYWJsZWQgIQorICovCitzdGF0aWMgdm9pZCB0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQoa3RpbWVfdCBub3cpCit7CisJdW5zaWduZWQgbG9uZyB0aWNrcyA9IDA7CisJa3RpbWVfdCBkZWx0YTsKKworCS8qIFJlZXZhbHV0ZSB3aXRoIHh0aW1lX2xvY2sgaGVsZCAqLworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCisJZGVsdGEgPSBrdGltZV9zdWIobm93LCBsYXN0X2ppZmZpZXNfdXBkYXRlKTsKKwlpZiAoZGVsdGEudHY2NCA+PSB0aWNrX3BlcmlvZC50djY0KSB7CisKKwkJZGVsdGEgPSBrdGltZV9zdWIoZGVsdGEsIHRpY2tfcGVyaW9kKTsKKwkJbGFzdF9qaWZmaWVzX3VwZGF0ZSA9IGt0aW1lX2FkZChsYXN0X2ppZmZpZXNfdXBkYXRlLAorCQkJCQkJdGlja19wZXJpb2QpOworCisJCS8qIFNsb3cgcGF0aCBmb3IgbG9uZyB0aW1lb3V0cyAqLworCQlpZiAodW5saWtlbHkoZGVsdGEudHY2NCA+PSB0aWNrX3BlcmlvZC50djY0KSkgeworCQkJczY0IGluY3IgPSBrdGltZV90b19ucyh0aWNrX3BlcmlvZCk7CisKKwkJCXRpY2tzID0ga3RpbWVfZGl2bnMoZGVsdGEsIGluY3IpOworCisJCQlsYXN0X2ppZmZpZXNfdXBkYXRlID0ga3RpbWVfYWRkX25zKGxhc3RfamlmZmllc191cGRhdGUsCisJCQkJCQkJICAgaW5jciAqIHRpY2tzKTsKKwkJfQorCQlkb190aW1lcigrK3RpY2tzKTsKKwl9CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgYW5kIHJldHVybiByZXRyaWV2ZSB0aGUgamlmZmllcyB1cGRhdGUuCisgKi8KK3N0YXRpYyBrdGltZV90IHRpY2tfaW5pdF9qaWZmeV91cGRhdGUodm9pZCkKK3sKKwlrdGltZV90IHBlcmlvZDsKKworCXdyaXRlX3NlcWxvY2soJnh0aW1lX2xvY2spOworCS8qIERpZCB3ZSBzdGFydCB0aGUgamlmZmllcyB1cGRhdGUgeWV0ID8gKi8KKwlpZiAobGFzdF9qaWZmaWVzX3VwZGF0ZS50djY0ID09IDApCisJCWxhc3RfamlmZmllc191cGRhdGUgPSB0aWNrX25leHRfcGVyaW9kOworCXBlcmlvZCA9IGxhc3RfamlmZmllc191cGRhdGU7CisJd3JpdGVfc2VxdW5sb2NrKCZ4dGltZV9sb2NrKTsKKwlyZXR1cm4gcGVyaW9kOworfQorCisvKgorICogTk9IWiAtIGFrYSBkeW5hbWljIHRpY2sgZnVuY3Rpb25hbGl0eQorICovCisjaWZkZWYgQ09ORklHX05PX0haCisvKgorICogTk8gSFogZW5hYmxlZCA/CisgKi8KK3N0YXRpYyBpbnQgdGlja19ub2h6X2VuYWJsZWQgX19yZWFkX21vc3RseSAgPSAxOworCisvKgorICogRW5hYmxlIC8gRGlzYWJsZSB0aWNrbGVzcyBtb2RlCisgKi8KK3N0YXRpYyBpbnQgX19pbml0IHNldHVwX3RpY2tfbm9oeihjaGFyICpzdHIpCit7CisJaWYgKCFzdHJjbXAoc3RyLCAib2ZmIikpCisJCXRpY2tfbm9oel9lbmFibGVkID0gMDsKKwllbHNlIGlmICghc3RyY21wKHN0ciwgIm9uIikpCisJCXRpY2tfbm9oel9lbmFibGVkID0gMTsKKwllbHNlCisJCXJldHVybiAwOworCXJldHVybiAxOworfQorCitfX3NldHVwKCJub2h6PSIsIHNldHVwX3RpY2tfbm9oeik7CisKKy8qKgorICogdGlja19ub2h6X3VwZGF0ZV9qaWZmaWVzIC0gdXBkYXRlIGppZmZpZXMgd2hlbiBpZGxlIHdhcyBpbnRlcnJ1cHRlZAorICoKKyAqIENhbGxlZCBmcm9tIGludGVycnVwdCBlbnRyeSB3aGVuIHRoZSBDUFUgd2FzIGlkbGUKKyAqCisgKiBJbiBjYXNlIHRoZSBzY2hlZF90aWNrIHdhcyBzdG9wcGVkIG9uIHRoaXMgQ1BVLCB3ZSBoYXZlIHRvIGNoZWNrIGlmIGppZmZpZXMKKyAqIG11c3QgYmUgdXBkYXRlZC4gT3RoZXJ3aXNlIGFuIGludGVycnVwdCBoYW5kbGVyIGNvdWxkIHVzZSBhIHN0YWxlIGppZmZ5CisgKiB2YWx1ZS4gV2UgZG8gdGhpcyB1bmNvbmRpdGlvbmFsbHkgb24gYW55IGNwdSwgYXMgd2UgZG9uJ3Qga25vdyB3aGV0aGVyIHRoZQorICogY3B1LCB3aGljaCBoYXMgdGhlIHVwZGF0ZSB0YXNrIGFzc2lnbmVkIGlzIGluIGEgbG9uZyBzbGVlcC4KKyAqLwordm9pZCB0aWNrX25vaHpfdXBkYXRlX2ppZmZpZXModm9pZCkKK3sKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZwZXJfY3B1KHRpY2tfY3B1X3NjaGVkLCBjcHUpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJa3RpbWVfdCBub3c7CisKKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQpCisJCXJldHVybjsKKworCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCW5vdyA9IGt0aW1lX2dldCgpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoqCisgKiB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrIC0gc3RvcCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzaworICoKKyAqIFdoZW4gdGhlIG5leHQgZXZlbnQgaXMgbW9yZSB0aGFuIGEgdGljayBpbnRvIHRoZSBmdXR1cmUsIHN0b3AgdGhlIGlkbGUgdGljaworICogQ2FsbGVkIGVpdGhlciBmcm9tIHRoZSBpZGxlIGxvb3Agb3IgZnJvbSBpcnFfZXhpdCgpIHdoZW4gYW4gaWRsZSBwZXJpb2Qgd2FzCisgKiBqdXN0IGludGVycnVwdGVkIGJ5IGFuIGludGVycnVwdCB3aGljaCBkaWQgbm90IGNhdXNlIGEgcmVzY2hlZHVsZS4KKyAqLwordm9pZCB0aWNrX25vaHpfc3RvcF9zY2hlZF90aWNrKHZvaWQpCit7CisJdW5zaWduZWQgbG9uZyBzZXEsIGxhc3RfamlmZmllcywgbmV4dF9qaWZmaWVzLCBkZWx0YV9qaWZmaWVzLCBmbGFnczsKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHM7CisJa3RpbWVfdCBsYXN0X3VwZGF0ZSwgZXhwaXJlcywgbm93LCBkZWx0YTsKKwlpbnQgY3B1OworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCXRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisKKwlpZiAodW5saWtlbHkodHMtPm5vaHpfbW9kZSA9PSBOT0haX01PREVfSU5BQ1RJVkUpKQorCQlnb3RvIGVuZDsKKworCWlmIChuZWVkX3Jlc2NoZWQoKSkKKwkJZ290byBlbmQ7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJQlVHX09OKGxvY2FsX3NvZnRpcnFfcGVuZGluZygpKTsKKworCW5vdyA9IGt0aW1lX2dldCgpOworCS8qCisJICogV2hlbiBjYWxsZWQgZnJvbSBpcnFfZXhpdCB3ZSBuZWVkIHRvIGFjY291bnQgdGhlIGlkbGUgc2xlZXAgdGltZQorCSAqIGNvcnJlY3RseS4KKwkgKi8KKwlpZiAodHMtPnRpY2tfc3RvcHBlZCkgeworCQlkZWx0YSA9IGt0aW1lX3N1Yihub3csIHRzLT5pZGxlX2VudHJ5dGltZSk7CisJCXRzLT5pZGxlX3NsZWVwdGltZSA9IGt0aW1lX2FkZCh0cy0+aWRsZV9zbGVlcHRpbWUsIGRlbHRhKTsKKwl9CisKKwl0cy0+aWRsZV9lbnRyeXRpbWUgPSBub3c7CisJdHMtPmlkbGVfY2FsbHMrKzsKKworCS8qIFJlYWQgamlmZmllcyBhbmQgdGhlIHRpbWUgd2hlbiBqaWZmaWVzIHdlcmUgdXBkYXRlZCBsYXN0ICovCisJZG8geworCQlzZXEgPSByZWFkX3NlcWJlZ2luKCZ4dGltZV9sb2NrKTsKKwkJbGFzdF91cGRhdGUgPSBsYXN0X2ppZmZpZXNfdXBkYXRlOworCQlsYXN0X2ppZmZpZXMgPSBqaWZmaWVzOworCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCisJLyogR2V0IHRoZSBuZXh0IHRpbWVyIHdoZWVsIHRpbWVyICovCisJbmV4dF9qaWZmaWVzID0gZ2V0X25leHRfdGltZXJfaW50ZXJydXB0KGxhc3RfamlmZmllcyk7CisJZGVsdGFfamlmZmllcyA9IG5leHRfamlmZmllcyAtIGxhc3RfamlmZmllczsKKworCS8qCisJICogRG8gbm90IHN0b3AgdGhlIHRpY2ssIGlmIHdlIGFyZSBvbmx5IG9uZSBvZmYKKwkgKiBvciBpZiB0aGUgY3B1IGlzIHJlcXVpcmVkIGZvciByY3UKKwkgKi8KKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQgJiYgKGRlbHRhX2ppZmZpZXMgPT0gMSB8fCByY3VfbmVlZHNfY3B1KGNwdSkpKQorCQlnb3RvIG91dDsKKworCS8qIFNjaGVkdWxlIHRoZSB0aWNrLCBpZiB3ZSBhcmUgYXQgbGVhc3Qgb25lIGppZmZpZSBvZmYgKi8KKwlpZiAoKGxvbmcpZGVsdGFfamlmZmllcyA+PSAxKSB7CisKKwkJaWYgKHJjdV9uZWVkc19jcHUoY3B1KSkKKwkJCWRlbHRhX2ppZmZpZXMgPSAxOworCQllbHNlCisJCQljcHVfc2V0KGNwdSwgbm9oel9jcHVfbWFzayk7CisJCS8qCisJCSAqIG5vaHpfc3RvcF9zY2hlZF90aWNrIGNhbiBiZSBjYWxsZWQgc2V2ZXJhbCB0aW1lcyBiZWZvcmUKKwkJICogdGhlIG5vaHpfcmVzdGFydF9zY2hlZF90aWNrIGlzIGNhbGxlZC4gVGhpcyBoYXBwZW5zIHdoZW4KKwkJICogaW50ZXJydXB0cyBhcnJpdmUgd2hpY2ggZG8gbm90IGNhdXNlIGEgcmVzY2hlZHVsZS4gSW4gdGhlCisJCSAqIGZpcnN0IGNhbGwgd2Ugc2F2ZSB0aGUgY3VycmVudCB0aWNrIHRpbWUsIHNvIHdlIGNhbiByZXN0YXJ0CisJCSAqIHRoZSBzY2hlZHVsZXIgdGljayBpbiBub2h6X3Jlc3RhcnRfc2NoZWRfdGljay4KKwkJICovCisJCWlmICghdHMtPnRpY2tfc3RvcHBlZCkgeworCQkJdHMtPmlkbGVfdGljayA9IHRzLT5zY2hlZF90aW1lci5leHBpcmVzOworCQkJdHMtPnRpY2tfc3RvcHBlZCA9IDE7CisJCQl0cy0+aWRsZV9qaWZmaWVzID0gbGFzdF9qaWZmaWVzOworCQl9CisJCS8qCisJCSAqIGNhbGN1bGF0ZSB0aGUgZXhwaXJ5IHRpbWUgZm9yIHRoZSBuZXh0IHRpbWVyIHdoZWVsCisJCSAqIHRpbWVyCisJCSAqLworCQlleHBpcmVzID0ga3RpbWVfYWRkX25zKGxhc3RfdXBkYXRlLCB0aWNrX3BlcmlvZC50djY0ICoKKwkJCQkgICAgICAgZGVsdGFfamlmZmllcyk7CisJCXRzLT5pZGxlX2V4cGlyZXMgPSBleHBpcmVzOworCQl0cy0+aWRsZV9zbGVlcHMrKzsKKworCQlpZiAodHMtPm5vaHpfbW9kZSA9PSBOT0haX01PREVfSElHSFJFUykgeworCQkJaHJ0aW1lcl9zdGFydCgmdHMtPnNjaGVkX3RpbWVyLCBleHBpcmVzLAorCQkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOworCQkJLyogQ2hlY2ssIGlmIHRoZSB0aW1lciB3YXMgYWxyZWFkeSBpbiB0aGUgcGFzdCAqLworCQkJaWYgKGhydGltZXJfYWN0aXZlKCZ0cy0+c2NoZWRfdGltZXIpKQorCQkJCWdvdG8gb3V0OworCQl9IGVsc2UgaWYoIXRpY2tfcHJvZ3JhbV9ldmVudChleHBpcmVzLCAwKSkKKwkJCQlnb3RvIG91dDsKKwkJLyoKKwkJICogV2UgYXJlIHBhc3QgdGhlIGV2ZW50IGFscmVhZHkuIFNvIHdlIGNyb3NzZWQgYQorCQkgKiBqaWZmaWUgYm91bmRhcnkuIFVwZGF0ZSBqaWZmaWVzIGFuZCByYWlzZSB0aGUKKwkJICogc29mdGlycS4KKwkJICovCisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChrdGltZV9nZXQoKSk7CisJCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCX0KKwlyYWlzZV9zb2Z0aXJxX2lycW9mZihUSU1FUl9TT0ZUSVJRKTsKK291dDoKKwl0cy0+bmV4dF9qaWZmaWVzID0gbmV4dF9qaWZmaWVzOworCXRzLT5sYXN0X2ppZmZpZXMgPSBsYXN0X2ppZmZpZXM7CitlbmQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKioKKyAqIG5vaHpfcmVzdGFydF9zY2hlZF90aWNrIC0gcmVzdGFydCB0aGUgaWRsZSB0aWNrIGZyb20gdGhlIGlkbGUgdGFzaworICoKKyAqIFJlc3RhcnQgdGhlIGlkbGUgdGljayB3aGVuIHRoZSBDUFUgaXMgd29rZW4gdXAgZnJvbSBpZGxlCisgKi8KK3ZvaWQgdGlja19ub2h6X3Jlc3RhcnRfc2NoZWRfdGljayh2b2lkKQoreworCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisJdW5zaWduZWQgbG9uZyB0aWNrczsKKwlrdGltZV90IG5vdywgZGVsdGE7CisKKwlpZiAoIXRzLT50aWNrX3N0b3BwZWQpCisJCXJldHVybjsKKworCS8qIFVwZGF0ZSBqaWZmaWVzIGZpcnN0ICovCisJbm93ID0ga3RpbWVfZ2V0KCk7CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCWNwdV9jbGVhcihjcHUsIG5vaHpfY3B1X21hc2spOworCisJLyogQWNjb3VudCB0aGUgaWRsZSB0aW1lICovCisJZGVsdGEgPSBrdGltZV9zdWIobm93LCB0cy0+aWRsZV9lbnRyeXRpbWUpOworCXRzLT5pZGxlX3NsZWVwdGltZSA9IGt0aW1lX2FkZCh0cy0+aWRsZV9zbGVlcHRpbWUsIGRlbHRhKTsKKworCS8qCisJICogV2Ugc3RvcHBlZCB0aGUgdGljayBpbiBpZGxlLiBVcGRhdGUgcHJvY2VzcyB0aW1lcyB3b3VsZCBtaXNzIHRoZQorCSAqIHRpbWUgd2Ugc2xlcHQgYXMgdXBkYXRlX3Byb2Nlc3NfdGltZXMgZG9lcyBvbmx5IGEgMSB0aWNrCisJICogYWNjb3VudGluZy4gRW5mb3JjZSB0aGF0IHRoaXMgaXMgYWNjb3VudGVkIHRvIGlkbGUgIQorCSAqLworCXRpY2tzID0gamlmZmllcyAtIHRzLT5pZGxlX2ppZmZpZXM7CisJLyoKKwkgKiBXZSBtaWdodCBiZSBvbmUgb2ZmLiBEbyBub3QgcmFuZG9tbHkgYWNjb3VudCBhIGh1Z2UgbnVtYmVyIG9mIHRpY2tzIQorCSAqLworCWlmICh0aWNrcyAmJiB0aWNrcyA8IExPTkdfTUFYKSB7CisJCWFkZF9wcmVlbXB0X2NvdW50KEhBUkRJUlFfT0ZGU0VUKTsKKwkJYWNjb3VudF9zeXN0ZW1fdGltZShjdXJyZW50LCBIQVJESVJRX09GRlNFVCwKKwkJCQkgICAgamlmZmllc190b19jcHV0aW1lKHRpY2tzKSk7CisJCXN1Yl9wcmVlbXB0X2NvdW50KEhBUkRJUlFfT0ZGU0VUKTsKKwl9CisKKwkvKgorCSAqIENhbmNlbCB0aGUgc2NoZWR1bGVkIHRpbWVyIGFuZCByZXN0b3JlIHRoZSB0aWNrCisJICovCisJdHMtPnRpY2tfc3RvcHBlZCAgPSAwOworCWhydGltZXJfY2FuY2VsKCZ0cy0+c2NoZWRfdGltZXIpOworCXRzLT5zY2hlZF90aW1lci5leHBpcmVzID0gdHMtPmlkbGVfdGljazsKKworCXdoaWxlICgxKSB7CisJCS8qIEZvcndhcmQgdGhlIHRpbWUgdG8gZXhwaXJlIGluIHRoZSBmdXR1cmUgKi8KKwkJaHJ0aW1lcl9mb3J3YXJkKCZ0cy0+c2NoZWRfdGltZXIsIG5vdywgdGlja19wZXJpb2QpOworCisJCWlmICh0cy0+bm9oel9tb2RlID09IE5PSFpfTU9ERV9ISUdIUkVTKSB7CisJCQlocnRpbWVyX3N0YXJ0KCZ0cy0+c2NoZWRfdGltZXIsCisJCQkJICAgICAgdHMtPnNjaGVkX3RpbWVyLmV4cGlyZXMsCisJCQkJICAgICAgSFJUSU1FUl9NT0RFX0FCUyk7CisJCQkvKiBDaGVjaywgaWYgdGhlIHRpbWVyIHdhcyBhbHJlYWR5IGluIHRoZSBwYXN0ICovCisJCQlpZiAoaHJ0aW1lcl9hY3RpdmUoJnRzLT5zY2hlZF90aW1lcikpCisJCQkJYnJlYWs7CisJCX0gZWxzZSB7CisJCQlpZiAoIXRpY2tfcHJvZ3JhbV9ldmVudCh0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywgMCkpCisJCQkJYnJlYWs7CisJCX0KKwkJLyogVXBkYXRlIGppZmZpZXMgYW5kIHJlcmVhZCB0aW1lICovCisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCQlub3cgPSBrdGltZV9nZXQoKTsKKwl9CisJbG9jYWxfaXJxX2VuYWJsZSgpOworfQorCitzdGF0aWMgaW50IHRpY2tfbm9oel9yZXByb2dyYW0oc3RydWN0IHRpY2tfc2NoZWQgKnRzLCBrdGltZV90IG5vdykKK3sKKwlocnRpbWVyX2ZvcndhcmQoJnRzLT5zY2hlZF90aW1lciwgbm93LCB0aWNrX3BlcmlvZCk7CisJcmV0dXJuIHRpY2tfcHJvZ3JhbV9ldmVudCh0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywgMCk7Cit9CisKKy8qCisgKiBUaGUgbm9oeiBsb3cgcmVzIGludGVycnVwdCBoYW5kbGVyCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfbm9oel9oYW5kbGVyKHN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHMgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9zY2hlZCk7CisJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJZGV2LT5uZXh0X2V2ZW50LnR2NjQgPSBLVElNRV9NQVg7CisKKwkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgbmVlZCBhbiB1cGRhdGUgKi8KKwl0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQobm93KTsKKworCS8qCisJICogV2hlbiB3ZSBhcmUgaWRsZSBhbmQgdGhlIHRpY2sgaXMgc3RvcHBlZCwgd2UgaGF2ZSB0byB0b3VjaAorCSAqIHRoZSB3YXRjaGRvZyBhcyB3ZSBtaWdodCBub3Qgc2NoZWR1bGUgZm9yIGEgcmVhbGx5IGxvbmcKKwkgKiB0aW1lLiBUaGlzIGhhcHBlbnMgb24gY29tcGxldGUgaWRsZSBTTVAgc3lzdGVtcyB3aGlsZQorCSAqIHdhaXRpbmcgb24gdGhlIGxvZ2luIHByb21wdC4gV2UgYWxzbyBpbmNyZW1lbnQgdGhlICJzdGFydAorCSAqIG9mIGlkbGUiIGppZmZ5IHN0YW1wIHNvIHRoZSBpZGxlIGFjY291bnRpbmcgYWRqdXN0bWVudCB3ZQorCSAqIGRvIHdoZW4gd2UgZ28gYnVzeSBhZ2FpbiBkb2VzIG5vdCBhY2NvdW50IHRvbyBtdWNoIHRpY2tzLgorCSAqLworCWlmICh0cy0+dGlja19zdG9wcGVkKSB7CisJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkJdHMtPmlkbGVfamlmZmllcysrOworCX0KKworCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJcHJvZmlsZV90aWNrKENQVV9QUk9GSUxJTkcpOworCisJLyogRG8gbm90IHJlc3RhcnQsIHdoZW4gd2UgYXJlIGluIHRoZSBpZGxlIGxvb3AgKi8KKwlpZiAodHMtPnRpY2tfc3RvcHBlZCkKKwkJcmV0dXJuOworCisJd2hpbGUgKHRpY2tfbm9oel9yZXByb2dyYW0odHMsIG5vdykpIHsKKwkJbm93ID0ga3RpbWVfZ2V0KCk7CisJCXRpY2tfZG9fdXBkYXRlX2ppZmZpZXM2NChub3cpOworCX0KK30KKworLyoqCisgKiB0aWNrX25vaHpfc3dpdGNoX3RvX25vaHogLSBzd2l0Y2ggdG8gbm9oeiBtb2RlCisgKi8KK3N0YXRpYyB2b2lkIHRpY2tfbm9oel9zd2l0Y2hfdG9fbm9oeih2b2lkKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKwlrdGltZV90IG5leHQ7CisKKwlpZiAoIXRpY2tfbm9oel9lbmFibGVkKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfZGlzYWJsZSgpOworCWlmICh0aWNrX3N3aXRjaF90b19vbmVzaG90KHRpY2tfbm9oel9oYW5kbGVyKSkgeworCQlsb2NhbF9pcnFfZW5hYmxlKCk7CisJCXJldHVybjsKKwl9CisKKwl0cy0+bm9oel9tb2RlID0gTk9IWl9NT0RFX0xPV1JFUzsKKworCS8qCisJICogUmVjeWNsZSB0aGUgaHJ0aW1lciBpbiB0cywgc28gd2UgY2FuIHNoYXJlIHRoZQorCSAqIGhydGltZXJfZm9yd2FyZCB3aXRoIHRoZSBoaWdocmVzIGNvZGUuCisJICovCisJaHJ0aW1lcl9pbml0KCZ0cy0+c2NoZWRfdGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX0FCUyk7CisJLyogR2V0IHRoZSBuZXh0IHBlcmlvZCAqLworCW5leHQgPSB0aWNrX2luaXRfamlmZnlfdXBkYXRlKCk7CisKKwlmb3IgKDs7KSB7CisJCXRzLT5zY2hlZF90aW1lci5leHBpcmVzID0gbmV4dDsKKwkJaWYgKCF0aWNrX3Byb2dyYW1fZXZlbnQobmV4dCwgMCkpCisJCQlicmVhazsKKwkJbmV4dCA9IGt0aW1lX2FkZChuZXh0LCB0aWNrX3BlcmlvZCk7CisJfQorCWxvY2FsX2lycV9lbmFibGUoKTsKKworCXByaW50ayhLRVJOX0lORk8gIlN3aXRjaGVkIHRvIE5PSHogbW9kZSBvbiBDUFUgIyVkXG4iLAorCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCisjZWxzZQorCitzdGF0aWMgaW5saW5lIHZvaWQgdGlja19ub2h6X3N3aXRjaF90b19ub2h6KHZvaWQpIHsgfQorCisjZW5kaWYgLyogTk9fSFogKi8KKworLyoKKyAqIEhpZ2ggcmVzb2x1dGlvbiB0aW1lciBzcGVjaWZpYyBjb2RlCisgKi8KKyNpZmRlZiBDT05GSUdfSElHSF9SRVNfVElNRVJTCisvKgorICogV2UgcmVhcm0gdGhlIHRpbWVyIHVudGlsIHdlIGdldCBkaXNhYmxlZCBieSB0aGUgaWRsZSBjb2RlCisgKiBDYWxsZWQgd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkIGFuZCB0aW1lci0+YmFzZS0+Y3B1X2Jhc2UtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHRpY2tfc2NoZWRfdGltZXIoc3RydWN0IGhydGltZXIgKnRpbWVyKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9CisJCWNvbnRhaW5lcl9vZih0aW1lciwgc3RydWN0IHRpY2tfc2NoZWQsIHNjaGVkX3RpbWVyKTsKKwlzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSAqYmFzZSA9IHRpbWVyLT5iYXNlLT5jcHVfYmFzZTsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOworCWt0aW1lX3Qgbm93ID0ga3RpbWVfZ2V0KCk7CisKKwkvKiBDaGVjaywgaWYgdGhlIGppZmZpZXMgbmVlZCBhbiB1cGRhdGUgKi8KKwl0aWNrX2RvX3VwZGF0ZV9qaWZmaWVzNjQobm93KTsKKworCS8qCisJICogRG8gbm90IGNhbGwsIHdoZW4gd2UgYXJlIG5vdCBpbiBpcnEgY29udGV4dCBhbmQgaGF2ZQorCSAqIG5vIHZhbGlkIHJlZ3MgcG9pbnRlcgorCSAqLworCWlmIChyZWdzKSB7CisJCS8qCisJCSAqIFdoZW4gd2UgYXJlIGlkbGUgYW5kIHRoZSB0aWNrIGlzIHN0b3BwZWQsIHdlIGhhdmUgdG8gdG91Y2gKKwkJICogdGhlIHdhdGNoZG9nIGFzIHdlIG1pZ2h0IG5vdCBzY2hlZHVsZSBmb3IgYSByZWFsbHkgbG9uZworCQkgKiB0aW1lLiBUaGlzIGhhcHBlbnMgb24gY29tcGxldGUgaWRsZSBTTVAgc3lzdGVtcyB3aGlsZQorCQkgKiB3YWl0aW5nIG9uIHRoZSBsb2dpbiBwcm9tcHQuIFdlIGFsc28gaW5jcmVtZW50IHRoZSAic3RhcnQgb2YKKwkJICogaWRsZSIgamlmZnkgc3RhbXAgc28gdGhlIGlkbGUgYWNjb3VudGluZyBhZGp1c3RtZW50IHdlIGRvCisJCSAqIHdoZW4gd2UgZ28gYnVzeSBhZ2FpbiBkb2VzIG5vdCBhY2NvdW50IHRvbyBtdWNoIHRpY2tzLgorCQkgKi8KKwkJaWYgKHRzLT50aWNrX3N0b3BwZWQpIHsKKwkJCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkJCXRzLT5pZGxlX2ppZmZpZXMrKzsKKwkJfQorCQkvKgorCQkgKiB1cGRhdGVfcHJvY2Vzc190aW1lcygpIG1pZ2h0IHRha2UgdGFza2xpc3RfbG9jaywgaGVuY2UKKwkJICogZHJvcCB0aGUgYmFzZSBsb2NrLiBzY2hlZC10aWNrIGhydGltZXJzIGFyZSBwZXItQ1BVIGFuZAorCQkgKiBuZXZlciBhY2Nlc3NpYmxlIGJ5IHVzZXJzcGFjZSBBUElzLCBzbyB0aGlzIGlzIHNhZmUgdG8gZG8uCisJCSAqLworCQlzcGluX3VubG9jaygmYmFzZS0+bG9jayk7CisJCXVwZGF0ZV9wcm9jZXNzX3RpbWVzKHVzZXJfbW9kZShyZWdzKSk7CisJCXByb2ZpbGVfdGljayhDUFVfUFJPRklMSU5HKTsKKwkJc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKKwl9CisKKwkvKiBEbyBub3QgcmVzdGFydCwgd2hlbiB3ZSBhcmUgaW4gdGhlIGlkbGUgbG9vcCAqLworCWlmICh0cy0+dGlja19zdG9wcGVkKQorCQlyZXR1cm4gSFJUSU1FUl9OT1JFU1RBUlQ7CisKKwlocnRpbWVyX2ZvcndhcmQodGltZXIsIG5vdywgdGlja19wZXJpb2QpOworCisJcmV0dXJuIEhSVElNRVJfUkVTVEFSVDsKK30KKworLyoqCisgKiB0aWNrX3NldHVwX3NjaGVkX3RpbWVyIC0gc2V0dXAgdGhlIHRpY2sgZW11bGF0aW9uIHRpbWVyCisgKi8KK3ZvaWQgdGlja19zZXR1cF9zY2hlZF90aW1lcih2b2lkKQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKwlrdGltZV90IG5vdyA9IGt0aW1lX2dldCgpOworCisJLyoKKwkgKiBFbXVsYXRlIHRpY2sgcHJvY2Vzc2luZyB2aWEgcGVyLUNQVSBocnRpbWVyczoKKwkgKi8KKwlocnRpbWVyX2luaXQoJnRzLT5zY2hlZF90aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwl0cy0+c2NoZWRfdGltZXIuZnVuY3Rpb24gPSB0aWNrX3NjaGVkX3RpbWVyOworCXRzLT5zY2hlZF90aW1lci5jYl9tb2RlID0gSFJUSU1FUl9DQl9JUlFTQUZFX05PX1NPRlRJUlE7CisKKwkvKiBHZXQgdGhlIG5leHQgcGVyaW9kICovCisJdHMtPnNjaGVkX3RpbWVyLmV4cGlyZXMgPSB0aWNrX2luaXRfamlmZnlfdXBkYXRlKCk7CisKKwlmb3IgKDs7KSB7CisJCWhydGltZXJfZm9yd2FyZCgmdHMtPnNjaGVkX3RpbWVyLCBub3csIHRpY2tfcGVyaW9kKTsKKwkJaHJ0aW1lcl9zdGFydCgmdHMtPnNjaGVkX3RpbWVyLCB0cy0+c2NoZWRfdGltZXIuZXhwaXJlcywKKwkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOworCQkvKiBDaGVjaywgaWYgdGhlIHRpbWVyIHdhcyBhbHJlYWR5IGluIHRoZSBwYXN0ICovCisJCWlmIChocnRpbWVyX2FjdGl2ZSgmdHMtPnNjaGVkX3RpbWVyKSkKKwkJCWJyZWFrOworCQlub3cgPSBrdGltZV9nZXQoKTsKKwl9CisKKyNpZmRlZiBDT05GSUdfTk9fSFoKKwlpZiAodGlja19ub2h6X2VuYWJsZWQpCisJCXRzLT5ub2h6X21vZGUgPSBOT0haX01PREVfSElHSFJFUzsKKyNlbmRpZgorfQorCit2b2lkIHRpY2tfY2FuY2VsX3NjaGVkX3RpbWVyKGludCBjcHUpCit7CisJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gJnBlcl9jcHUodGlja19jcHVfc2NoZWQsIGNwdSk7CisKKwlpZiAodHMtPnNjaGVkX3RpbWVyLmJhc2UpCisJCWhydGltZXJfY2FuY2VsKCZ0cy0+c2NoZWRfdGltZXIpOworCXRzLT50aWNrX3N0b3BwZWQgPSAwOworCXRzLT5ub2h6X21vZGUgPSBOT0haX01PREVfSU5BQ1RJVkU7Cit9CisjZW5kaWYgLyogSElHSF9SRVNfVElNRVJTICovCisKKy8qKgorICogQXN5bmMgbm90aWZpY2F0aW9uIGFib3V0IGNsb2Nrc291cmNlIGNoYW5nZXMKKyAqLwordm9pZCB0aWNrX2Nsb2NrX25vdGlmeSh2b2lkKQoreworCWludCBjcHU7CisKKwlmb3JfZWFjaF9wb3NzaWJsZV9jcHUoY3B1KQorCQlzZXRfYml0KDAsICZwZXJfY3B1KHRpY2tfY3B1X3NjaGVkLCBjcHUpLmNoZWNrX2Nsb2Nrcyk7Cit9CisKKy8qCisgKiBBc3luYyBub3RpZmljYXRpb24gYWJvdXQgY2xvY2sgZXZlbnQgY2hhbmdlcworICovCit2b2lkIHRpY2tfb25lc2hvdF9ub3RpZnkodm9pZCkKK3sKKwlzdHJ1Y3QgdGlja19zY2hlZCAqdHMgPSAmX19nZXRfY3B1X3Zhcih0aWNrX2NwdV9zY2hlZCk7CisKKwlzZXRfYml0KDAsICZ0cy0+Y2hlY2tfY2xvY2tzKTsKK30KKworLyoqCisgKiBDaGVjaywgaWYgYSBjaGFuZ2UgaGFwcGVuZWQsIHdoaWNoIG1ha2VzIG9uZXNob3QgcG9zc2libGUuCisgKgorICogQ2FsbGVkIGN5Y2xpYyBmcm9tIHRoZSBocnRpbWVyIHNvZnRpcnEgKGRyaXZlbiBieSB0aGUgdGltZXIKKyAqIHNvZnRpcnEpIGFsbG93X25vaHogc2lnbmFscywgdGhhdCB3ZSBjYW4gc3dpdGNoIGludG8gbG93LXJlcyBub2h6CisgKiBtb2RlLCBiZWNhdXNlIGhpZ2ggcmVzb2x1dGlvbiB0aW1lcnMgYXJlIGRpc2FibGVkIChlaXRoZXIgY29tcGlsZQorICogb3IgcnVudGltZSkuCisgKi8KK2ludCB0aWNrX2NoZWNrX29uZXNob3RfY2hhbmdlKGludCBhbGxvd19ub2h6KQoreworCXN0cnVjdCB0aWNrX3NjaGVkICp0cyA9ICZfX2dldF9jcHVfdmFyKHRpY2tfY3B1X3NjaGVkKTsKKworCWlmICghdGVzdF9hbmRfY2xlYXJfYml0KDAsICZ0cy0+Y2hlY2tfY2xvY2tzKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAodHMtPm5vaHpfbW9kZSAhPSBOT0haX01PREVfSU5BQ1RJVkUpCisJCXJldHVybiAwOworCisJaWYgKCF0aW1la2VlcGluZ19pc19jb250aW51b3VzKCkgfHwgIXRpY2tfaXNfb25lc2hvdF9hdmFpbGFibGUoKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoIWFsbG93X25vaHopCisJCXJldHVybiAxOworCisJdGlja19ub2h6X3N3aXRjaF90b19ub2h6KCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMgYi9rZXJuZWwvdGltZS90aW1lcl9saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgyYzYzNQotLS0gL2Rldi9udWxsCisrKyBiL2tlcm5lbC90aW1lL3RpbWVyX2xpc3QuYwpAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIGtlcm5lbC90aW1lL3RpbWVyX2xpc3QuYworICoKKyAqIExpc3QgcGVuZGluZyB0aW1lcnMKKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKyNpbmNsdWRlIDxsaW51eC90aWNrLmg+CisKKyNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgorCit0eXBlZGVmIHZvaWQgKCpwcmludF9mbl90KShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHVuc2lnbmVkIGludCAqY2xhc3Nlcyk7CisKK0RFQ0xBUkVfUEVSX0NQVShzdHJ1Y3QgaHJ0aW1lcl9jcHVfYmFzZSwgaHJ0aW1lcl9iYXNlcyk7CisKKy8qCisgKiBUaGlzIGFsbG93cyBwcmludGluZyBib3RoIHRvIC9wcm9jL3RpbWVyX2xpc3QgYW5kCisgKiB0byB0aGUgY29uc29sZSAob24gU3lzUnEtUSk6CisgKi8KKyNkZWZpbmUgU0VRX3ByaW50ZihtLCB4Li4uKQkJCVwKKyBkbyB7CQkJCQkJXAorCWlmIChtKQkJCQkJXAorCQlzZXFfcHJpbnRmKG0sIHgpOwkJXAorCWVsc2UJCQkJCVwKKwkJcHJpbnRrKHgpOwkJCVwKKyB9IHdoaWxlICgwKQorCitzdGF0aWMgdm9pZCBwcmludF9uYW1lX29mZnNldChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnN5bSkKK3sKKwl1bnNpZ25lZCBsb25nIGFkZHIgPSAodW5zaWduZWQgbG9uZylzeW07CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJY29uc3QgY2hhciAqc3ltX25hbWU7CisJY2hhciAqbW9kbmFtZTsKKworCXN5bV9uYW1lID0ga2FsbHN5bXNfbG9va3VwKGFkZHIsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJaWYgKHN5bV9uYW1lKQorCQlTRVFfcHJpbnRmKG0sICIlcyIsIHN5bV9uYW1lKTsKKwllbHNlCisJCVNFUV9wcmludGYobSwgIjwlcD4iLCBzeW0pOworfQorCitzdGF0aWMgdm9pZAorcHJpbnRfdGltZXIoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgaHJ0aW1lciAqdGltZXIsIGludCBpZHgsIHU2NCBub3cpCit7CisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJY2hhciB0bXBbVEFTS19DT01NX0xFTiArIDFdOworI2VuZGlmCisJU0VRX3ByaW50ZihtLCAiICMlZDogIiwgaWR4KTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lcik7CisJU0VRX3ByaW50ZihtLCAiLCAiKTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lci0+ZnVuY3Rpb24pOworCVNFUV9wcmludGYobSwgIiwgUzolMDJseCIsIHRpbWVyLT5zdGF0ZSk7CisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCisJU0VRX3ByaW50ZihtLCAiLCAiKTsKKwlwcmludF9uYW1lX29mZnNldChtLCB0aW1lci0+c3RhcnRfc2l0ZSk7CisJbWVtY3B5KHRtcCwgdGltZXItPnN0YXJ0X2NvbW0sIFRBU0tfQ09NTV9MRU4pOworCXRtcFtUQVNLX0NPTU1fTEVOXSA9IDA7CisJU0VRX3ByaW50ZihtLCAiLCAlcy8lZCIsIHRtcCwgdGltZXItPnN0YXJ0X3BpZCk7CisjZW5kaWYKKwlTRVFfcHJpbnRmKG0sICJcbiIpOworCVNFUV9wcmludGYobSwgIiAjIGV4cGlyZXMgYXQgJUxkIG5zZWNzIFtpbiAlTGQgbnNlY3NdXG4iLAorCQkodW5zaWduZWQgbG9uZyBsb25nKWt0aW1lX3RvX25zKHRpbWVyLT5leHBpcmVzKSwKKwkJKHVuc2lnbmVkIGxvbmcgbG9uZykoa3RpbWVfdG9fbnModGltZXItPmV4cGlyZXMpIC0gbm93KSk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9hY3RpdmVfdGltZXJzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwKKwkJICAgIHU2NCBub3cpCit7CisJc3RydWN0IGhydGltZXIgKnRpbWVyLCB0bXA7CisJdW5zaWduZWQgbG9uZyBuZXh0ID0gMCwgaTsKKwlzdHJ1Y3QgcmJfbm9kZSAqY3VycjsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCituZXh0X29uZToKKwlpID0gMDsKKwlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKworCWN1cnIgPSBiYXNlLT5maXJzdDsKKwkvKgorCSAqIENydWRlIGJ1dCB3ZSBoYXZlIHRvIGRvIHRoaXMgTyhOKk4pIHRoaW5nLCBiZWNhdXNlCisJICogd2UgaGF2ZSB0byB1bmxvY2sgdGhlIGJhc2Ugd2hlbiBwcmludGluZzoKKwkgKi8KKwl3aGlsZSAoY3VyciAmJiBpIDwgbmV4dCkgeworCQljdXJyID0gcmJfbmV4dChjdXJyKTsKKwkJaSsrOworCX0KKworCWlmIChjdXJyKSB7CisKKwkJdGltZXIgPSByYl9lbnRyeShjdXJyLCBzdHJ1Y3QgaHJ0aW1lciwgbm9kZSk7CisJCXRtcCA9ICp0aW1lcjsKKwkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmYmFzZS0+Y3B1X2Jhc2UtPmxvY2ssIGZsYWdzKTsKKworCQlwcmludF90aW1lcihtLCAmdG1wLCBpLCBub3cpOworCQluZXh0Kys7CisJCWdvdG8gbmV4dF9vbmU7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJhc2UtPmNwdV9iYXNlLT5sb2NrLCBmbGFncyk7Cit9CisKK3N0YXRpYyB2b2lkCitwcmludF9iYXNlKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGhydGltZXJfY2xvY2tfYmFzZSAqYmFzZSwgdTY0IG5vdykKK3sKKwlTRVFfcHJpbnRmKG0sICIgIC5pbmRleDogICAgICAlZFxuIiwKKwkJCWJhc2UtPmluZGV4KTsKKwlTRVFfcHJpbnRmKG0sICIgIC5yZXNvbHV0aW9uOiAlTGQgbnNlY3NcbiIsCisJCQkodW5zaWduZWQgbG9uZyBsb25nKWt0aW1lX3RvX25zKGJhc2UtPnJlc29sdXRpb24pKTsKKwlTRVFfcHJpbnRmKG0sICAgIiAgLmdldF90aW1lOiAgICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGJhc2UtPmdldF90aW1lKTsKKwlTRVFfcHJpbnRmKG0sICAgIlxuIik7CisjaWZkZWYgQ09ORklHX0hJR0hfUkVTX1RJTUVSUworCVNFUV9wcmludGYobSwgIiAgLm9mZnNldDogICAgICVMZCBuc2Vjc1xuIiwKKwkJCWt0aW1lX3RvX25zKGJhc2UtPm9mZnNldCkpOworI2VuZGlmCisJU0VRX3ByaW50ZihtLCAgICJhY3RpdmUgdGltZXJzOlxuIik7CisJcHJpbnRfYWN0aXZlX3RpbWVycyhtLCBiYXNlLCBub3cpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9jcHUoc3RydWN0IHNlcV9maWxlICptLCBpbnQgY3B1LCB1NjQgbm93KQoreworCXN0cnVjdCBocnRpbWVyX2NwdV9iYXNlICpjcHVfYmFzZSA9ICZwZXJfY3B1KGhydGltZXJfYmFzZXMsIGNwdSk7CisJaW50IGk7CisKKwlTRVFfcHJpbnRmKG0sICJcbmNwdTogJWRcbiIsIGNwdSk7CisJZm9yIChpID0gMDsgaSA8IEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTOyBpKyspIHsKKwkJU0VRX3ByaW50ZihtLCAiIGNsb2NrICVkOlxuIiwgaSk7CisJCXByaW50X2Jhc2UobSwgY3B1X2Jhc2UtPmNsb2NrX2Jhc2UgKyBpLCBub3cpOworCX0KKyNkZWZpbmUgUCh4KSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0xNXM6ICVMZFxuIiwgI3gsICh1NjQpKGNwdV9iYXNlLT54KSkKKyNkZWZpbmUgUF9ucyh4KSBcCisJU0VRX3ByaW50ZihtLCAiICAuJS0xNXM6ICVMZCBuc2Vjc1xuIiwgI3gsIFwKKwkJKHU2NCkoa3RpbWVfdG9fbnMoY3B1X2Jhc2UtPngpKSkKKworI2lmZGVmIENPTkZJR19ISUdIX1JFU19USU1FUlMKKwlQX25zKGV4cGlyZXNfbmV4dCk7CisJUChocmVzX2FjdGl2ZSk7CisJUChucl9ldmVudHMpOworI2VuZGlmCisjdW5kZWYgUAorI3VuZGVmIFBfbnMKKworI2lmZGVmIENPTkZJR19USUNLX09ORVNIT1QKKyMgZGVmaW5lIFAoeCkgXAorCVNFUV9wcmludGYobSwgIiAgLiUtMTVzOiAlTGRcbiIsICN4LCAodTY0KSh0cy0+eCkpCisjIGRlZmluZSBQX25zKHgpIFwKKwlTRVFfcHJpbnRmKG0sICIgIC4lLTE1czogJUxkIG5zZWNzXG4iLCAjeCwgXAorCQkodTY0KShrdGltZV90b19ucyh0cy0+eCkpKQorCXsKKwkJc3RydWN0IHRpY2tfc2NoZWQgKnRzID0gdGlja19nZXRfdGlja19zY2hlZChjcHUpOworCQlQKG5vaHpfbW9kZSk7CisJCVBfbnMoaWRsZV90aWNrKTsKKwkJUCh0aWNrX3N0b3BwZWQpOworCQlQKGlkbGVfamlmZmllcyk7CisJCVAoaWRsZV9jYWxscyk7CisJCVAoaWRsZV9zbGVlcHMpOworCQlQX25zKGlkbGVfZW50cnl0aW1lKTsKKwkJUF9ucyhpZGxlX3NsZWVwdGltZSk7CisJCVAobGFzdF9qaWZmaWVzKTsKKwkJUChuZXh0X2ppZmZpZXMpOworCQlQX25zKGlkbGVfZXhwaXJlcyk7CisJCVNFUV9wcmludGYobSwgImppZmZpZXM6ICVMZFxuIiwgKHU2NClqaWZmaWVzKTsKKwl9CisjZW5kaWYKKworI3VuZGVmIFAKKyN1bmRlZiBQX25zCit9CisKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19DTE9DS0VWRU5UUworc3RhdGljIHZvaWQKK3ByaW50X3RpY2tkZXZpY2Uoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdGlja19kZXZpY2UgKnRkKQoreworCXN0cnVjdCBjbG9ja19ldmVudF9kZXZpY2UgKmRldiA9IHRkLT5ldnRkZXY7CisKKwlTRVFfcHJpbnRmKG0sICJcblRpY2sgRGV2aWNlOiBtb2RlOiAgICAgJWRcbiIsIHRkLT5tb2RlKTsKKworCVNFUV9wcmludGYobSwgIkNsb2NrIEV2ZW50IERldmljZTogIik7CisJaWYgKCFkZXYpIHsKKwkJU0VRX3ByaW50ZihtLCAiPE5VTEw+XG4iKTsKKwkJcmV0dXJuOworCX0KKwlTRVFfcHJpbnRmKG0sICIlc1xuIiwgZGV2LT5uYW1lKTsKKwlTRVFfcHJpbnRmKG0sICIgbWF4X2RlbHRhX25zOiAgICVsZFxuIiwgZGV2LT5tYXhfZGVsdGFfbnMpOworCVNFUV9wcmludGYobSwgIiBtaW5fZGVsdGFfbnM6ICAgJWxkXG4iLCBkZXYtPm1pbl9kZWx0YV9ucyk7CisJU0VRX3ByaW50ZihtLCAiIG11bHQ6ICAgICAgICAgICAlbGRcbiIsIGRldi0+bXVsdCk7CisJU0VRX3ByaW50ZihtLCAiIHNoaWZ0OiAgICAgICAgICAlZFxuIiwgZGV2LT5zaGlmdCk7CisJU0VRX3ByaW50ZihtLCAiIG1vZGU6ICAgICAgICAgICAlZFxuIiwgZGV2LT5tb2RlKTsKKwlTRVFfcHJpbnRmKG0sICIgbmV4dF9ldmVudDogICAgICVMZCBuc2Vjc1xuIiwKKwkJICAgKHVuc2lnbmVkIGxvbmcgbG9uZykga3RpbWVfdG9fbnMoZGV2LT5uZXh0X2V2ZW50KSk7CisKKwlTRVFfcHJpbnRmKG0sICIgc2V0X25leHRfZXZlbnQ6ICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+c2V0X25leHRfZXZlbnQpOworCVNFUV9wcmludGYobSwgIlxuIik7CisKKwlTRVFfcHJpbnRmKG0sICIgc2V0X21vZGU6ICAgICAgICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+c2V0X21vZGUpOworCVNFUV9wcmludGYobSwgIlxuIik7CisKKwlTRVFfcHJpbnRmKG0sICIgZXZlbnRfaGFuZGxlcjogICIpOworCXByaW50X25hbWVfb2Zmc2V0KG0sIGRldi0+ZXZlbnRfaGFuZGxlcik7CisJU0VRX3ByaW50ZihtLCAiXG4iKTsKK30KKworc3RhdGljIHZvaWQgdGltZXJfbGlzdF9zaG93X3RpY2tkZXZpY2VzKHN0cnVjdCBzZXFfZmlsZSAqbSkKK3sKKwlpbnQgY3B1OworCisjaWZkZWYgQ09ORklHX0dFTkVSSUNfQ0xPQ0tFVkVOVFNfQlJPQURDQVNUCisJcHJpbnRfdGlja2RldmljZShtLCB0aWNrX2dldF9icm9hZGNhc3RfZGV2aWNlKCkpOworCVNFUV9wcmludGYobSwgInRpY2tfYnJvYWRjYXN0X21hc2s6ICUwOGx4XG4iLAorCQkgICB0aWNrX2dldF9icm9hZGNhc3RfbWFzaygpLT5iaXRzWzBdKTsKKyNpZmRlZiBDT05GSUdfVElDS19PTkVTSE9UCisJU0VRX3ByaW50ZihtLCAidGlja19icm9hZGNhc3Rfb25lc2hvdF9tYXNrOiAlMDhseFxuIiwKKwkJICAgdGlja19nZXRfYnJvYWRjYXN0X29uZXNob3RfbWFzaygpLT5iaXRzWzBdKTsKKyNlbmRpZgorCVNFUV9wcmludGYobSwgIlxuIik7CisjZW5kaWYKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJICAgcHJpbnRfdGlja2RldmljZShtLCB0aWNrX2dldF9kZXZpY2UoY3B1KSk7CisJU0VRX3ByaW50ZihtLCAiXG4iKTsKK30KKyNlbHNlCitzdGF0aWMgdm9pZCB0aW1lcl9saXN0X3Nob3dfdGlja2RldmljZXMoc3RydWN0IHNlcV9maWxlICptKSB7IH0KKyNlbmRpZgorCitzdGF0aWMgaW50IHRpbWVyX2xpc3Rfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCit7CisJdTY0IG5vdyA9IGt0aW1lX3RvX25zKGt0aW1lX2dldCgpKTsKKwlpbnQgY3B1OworCisJU0VRX3ByaW50ZihtLCAiVGltZXIgTGlzdCBWZXJzaW9uOiB2MC4zXG4iKTsKKwlTRVFfcHJpbnRmKG0sICJIUlRJTUVSX01BWF9DTE9DS19CQVNFUzogJWRcbiIsIEhSVElNRVJfTUFYX0NMT0NLX0JBU0VTKTsKKwlTRVFfcHJpbnRmKG0sICJub3cgYXQgJUxkIG5zZWNzXG4iLCAodW5zaWduZWQgbG9uZyBsb25nKW5vdyk7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJcHJpbnRfY3B1KG0sIGNwdSwgbm93KTsKKworCVNFUV9wcmludGYobSwgIlxuIik7CisJdGltZXJfbGlzdF9zaG93X3RpY2tkZXZpY2VzKG0pOworCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3lzcnFfdGltZXJfbGlzdF9zaG93KHZvaWQpCit7CisJdGltZXJfbGlzdF9zaG93KE5VTEwsIE5VTEwpOworfQorCitzdGF0aWMgaW50IHRpbWVyX2xpc3Rfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgdGltZXJfbGlzdF9zaG93LCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgdGltZXJfbGlzdF9mb3BzID0geworCS5vcGVuCQk9IHRpbWVyX2xpc3Rfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkubGxzZWVrCQk9IHNlcV9sc2VlaywKKwkucmVsZWFzZQk9IHNlcV9yZWxlYXNlLAorfTsKKworc3RhdGljIGludCBfX2luaXQgaW5pdF90aW1lcl9saXN0X3Byb2Nmcyh2b2lkKQoreworCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqcGU7CisKKwlwZSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJ0aW1lcl9saXN0IiwgMDY0NCwgTlVMTCk7CisJaWYgKCFwZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZS0+cHJvY19mb3BzID0gJnRpbWVyX2xpc3RfZm9wczsKKworCXJldHVybiAwOworfQorX19pbml0Y2FsbChpbml0X3RpbWVyX2xpc3RfcHJvY2ZzKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90aW1lL3RpbWVyX3N0YXRzLmMgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYzQ4ODIKLS0tIC9kZXYvbnVsbAorKysgYi9rZXJuZWwvdGltZS90aW1lcl9zdGF0cy5jCkBAIC0wLDAgKzEsNDExIEBACisvKgorICoga2VybmVsL3RpbWUvdGltZXJfc3RhdHMuYworICoKKyAqIENvbGxlY3QgdGltZXIgdXNhZ2Ugc3RhdGlzdGljcy4KKyAqCisgKiBDb3B5cmlnaHQoQykgMjAwNiwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqIENvcHlyaWdodChDKSAyMDA2IFRpbWVzeXMgQ29ycC4sIFRob21hcyBHbGVpeG5lciA8dGdseEB0aW1lc3lzLmNvbT4KKyAqCisgKiB0aW1lcl9zdGF0cyBpcyBiYXNlZCBvbiB0aW1lcl90b3AsIGEgc2ltaWxhciBmdW5jdGlvbmFsaXR5IHdoaWNoIHdhcyBwYXJ0IG9mCisgKiBDb24gS29saXZhcyBkeW50aWNrIHBhdGNoIHNldC4gSXQgd2FzIGRldmVsb3BlZCBieSBEYW5pZWwgUGV0cmluaSBhdCB0aGUKKyAqIEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhIC0gSU5kVCAtIE1hbmF1cy4gdGltZXJfdG9wJ3MgZGVzaWduIHdhcyBiYXNlZAorICogb24gZHluYW1pYyBhbGxvY2F0aW9uIG9mIHRoZSBzdGF0aXN0aWNzIGVudHJpZXMgYW5kIGxpbmVhciBzZWFyY2ggYmFzZWQKKyAqIGxvb2t1cCBjb21iaW5lZCB3aXRoIGEgZ2xvYmFsIGxvY2ssIHJhdGhlciB0aGFuIHRoZSBzdGF0aWMgYXJyYXksIGhhc2gKKyAqIGFuZCBwZXItQ1BVIGxvY2tpbmcgd2hpY2ggaXMgdXNlZCBieSB0aW1lcl9zdGF0cy4gSXQgd2FzIHdyaXR0ZW4gZm9yIHRoZQorICogcHJlIGhydGltZXIga2VybmVsIGNvZGUgYW5kIHRoZXJlZm9yZSBkaWQgbm90IHRha2UgaHJ0aW1lcnMgaW50byBhY2NvdW50LgorICogTmV2ZXJ0aGVsZXNzIGl0IHByb3ZpZGVkIHRoZSBiYXNlIGZvciB0aGUgdGltZXJfc3RhdHMgaW1wbGVtZW50YXRpb24gYW5kCisgKiB3YXMgYSBoZWxwZnVsIHNvdXJjZSBvZiBpbnNwaXJhdGlvbi4gS3Vkb3MgdG8gRGFuaWVsIGFuZCB0aGUgTm9raWEgZm9sa3MKKyAqIGZvciB0aGlzIGVmZm9ydC4KKyAqCisgKiB0aW1lcl90b3AuYyBpcworICoJQ29weXJpZ2h0IChDKSAyMDA1IEluc3RpdHV0byBOb2tpYSBkZSBUZWNub2xvZ2lhIC0gSU5kVCAtIE1hbmF1cworICoJV3JpdHRlbiBieSBEYW5pZWwgUGV0cmluaSA8ZC5wZW5zYXRvckBnbWFpbC5jb20+CisgKgl0aW1lcl90b3AuYyB3YXMgcmVsZWFzZWQgdW5kZXIgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMgorICoKKyAqIFdlIGV4cG9ydCB0aGUgYWRkcmVzc2VzIGFuZCBjb3VudGluZyBvZiB0aW1lciBmdW5jdGlvbnMgYmVpbmcgY2FsbGVkLAorICogdGhlIHBpZCBhbmQgY21kbGluZSBmcm9tIHRoZSBvd25lciBwcm9jZXNzIGlmIGFwcGxpY2FibGUuCisgKgorICogU3RhcnQvc3RvcCBkYXRhIGNvbGxlY3Rpb246CisgKiAjIGVjaG8gMVswXSA+L3Byb2MvdGltZXJfc3RhdHMKKyAqCisgKiBEaXNwbGF5IHRoZSBpbmZvcm1hdGlvbiBjb2xsZWN0ZWQgc28gZmFyOgorICogIyBjYXQgL3Byb2MvdGltZXJfc3RhdHMKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgYXMKKyAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+CisjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KKworI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CisKKy8qCisgKiBUaGlzIGlzIG91ciBiYXNpYyB1bml0IG9mIGludGVyZXN0OiBhIHRpbWVyIGV4cGlyeSBldmVudCBpZGVudGlmaWVkCisgKiBieSB0aGUgdGltZXIsIGl0cyBzdGFydC9leHBpcmUgZnVuY3Rpb25zIGFuZCB0aGUgUElEIG9mIHRoZSB0YXNrIHRoYXQKKyAqIHN0YXJ0ZWQgdGhlIHRpbWVyLiBXZSBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIGV2ZW50IGhhcHBlbnM6CisgKi8KK3N0cnVjdCBlbnRyeSB7CisJLyoKKwkgKiBIYXNoIGxpc3Q6CisJICovCisJc3RydWN0IGVudHJ5CQkqbmV4dDsKKworCS8qCisJICogSGFzaCBrZXlzOgorCSAqLworCXZvaWQJCQkqdGltZXI7CisJdm9pZAkJCSpzdGFydF9mdW5jOworCXZvaWQJCQkqZXhwaXJlX2Z1bmM7CisJcGlkX3QJCQlwaWQ7CisKKwkvKgorCSAqIE51bWJlciBvZiB0aW1lb3V0IGV2ZW50czoKKwkgKi8KKwl1bnNpZ25lZCBsb25nCQljb3VudDsKKworCS8qCisJICogV2Ugc2F2ZSB0aGUgY29tbWFuZC1saW5lIHN0cmluZyB0byBwcmVzZXJ2ZQorCSAqIHRoaXMgaW5mb3JtYXRpb24gcGFzdCB0YXNrIGV4aXQ6CisJICovCisJY2hhcgkJCWNvbW1bVEFTS19DT01NX0xFTiArIDFdOworCit9IF9fX19jYWNoZWxpbmVfYWxpZ25lZF9pbl9zbXA7CisKKy8qCisgKiBTcGlubG9jayBwcm90ZWN0aW5nIHRoZSB0YWJsZXMgLSBub3QgdGFrZW4gZHVyaW5nIGxvb2t1cDoKKyAqLworc3RhdGljIERFRklORV9TUElOTE9DSyh0YWJsZV9sb2NrKTsKKworLyoKKyAqIFBlci1DUFUgbG9va3VwIGxvY2tzIGZvciBmYXN0IGhhc2ggbG9va3VwOgorICovCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3BpbmxvY2tfdCwgbG9va3VwX2xvY2spOworCisvKgorICogTXV0ZXggdG8gc2VyaWFsaXplIHN0YXRlIGNoYW5nZXMgd2l0aCBzaG93LXN0YXRzIGFjdGl2aXRpZXM6CisgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoc2hvd19tdXRleCk7CisKKy8qCisgKiBDb2xsZWN0aW9uIHN0YXR1cywgYWN0aXZlL2luYWN0aXZlOgorICovCitzdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgYWN0aXZlOworCisvKgorICogQmVnaW5uaW5nL2VuZCB0aW1lc3RhbXBzIG9mIG1lYXN1cmVtZW50OgorICovCitzdGF0aWMga3RpbWVfdCB0aW1lX3N0YXJ0LCB0aW1lX3N0b3A7CisKKy8qCisgKiB0c3RhdCBlbnRyeSBzdHJ1Y3RzIG9ubHkgZ2V0IGFsbG9jYXRlZCB3aGlsZSBjb2xsZWN0aW9uIGlzCisgKiBhY3RpdmUgYW5kIG5ldmVyIGZyZWVkIGR1cmluZyB0aGF0IHRpbWUgLSB0aGlzIHNpbXBsaWZpZXMKKyAqIHRoaW5ncyBxdWl0ZSBhIGJpdC4KKyAqCisgKiBUaGV5IGdldCBmcmVlZCB3aGVuIGEgbmV3IGNvbGxlY3Rpb24gcGVyaW9kIGlzIHN0YXJ0ZWQuCisgKi8KKyNkZWZpbmUgTUFYX0VOVFJJRVNfQklUUwkxMAorI2RlZmluZSBNQVhfRU5UUklFUwkJKDFVTCA8PCBNQVhfRU5UUklFU19CSVRTKQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyBucl9lbnRyaWVzOworc3RhdGljIHN0cnVjdCBlbnRyeSBlbnRyaWVzW01BWF9FTlRSSUVTXTsKKworc3RhdGljIGF0b21pY190IG92ZXJmbG93X2NvdW50OworCitzdGF0aWMgdm9pZCByZXNldF9lbnRyaWVzKHZvaWQpCit7CisJbnJfZW50cmllcyA9IDA7CisJbWVtc2V0KGVudHJpZXMsIDAsIHNpemVvZihlbnRyaWVzKSk7CisJYXRvbWljX3NldCgmb3ZlcmZsb3dfY291bnQsIDApOworfQorCitzdGF0aWMgc3RydWN0IGVudHJ5ICphbGxvY19lbnRyeSh2b2lkKQoreworCWlmIChucl9lbnRyaWVzID49IE1BWF9FTlRSSUVTKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiBlbnRyaWVzICsgbnJfZW50cmllcysrOworfQorCisvKgorICogVGhlIGVudHJpZXMgYXJlIGluIGEgaGFzaC10YWJsZSwgZm9yIGZhc3QgbG9va3VwOgorICovCisjZGVmaW5lIFRTVEFUX0hBU0hfQklUUwkJKE1BWF9FTlRSSUVTX0JJVFMgLSAxKQorI2RlZmluZSBUU1RBVF9IQVNIX1NJWkUJCSgxVUwgPDwgVFNUQVRfSEFTSF9CSVRTKQorI2RlZmluZSBUU1RBVF9IQVNIX01BU0sJCShUU1RBVF9IQVNIX1NJWkUgLSAxKQorCisjZGVmaW5lIF9fdHN0YXRfaGFzaGZuKGVudHJ5KQkJCQkJCVwKKwkoKCh1bnNpZ25lZCBsb25nKShlbnRyeSktPnRpbWVyICAgICAgIF4JCQkJXAorCSAgKHVuc2lnbmVkIGxvbmcpKGVudHJ5KS0+c3RhcnRfZnVuYyAgXgkJCQlcCisJICAodW5zaWduZWQgbG9uZykoZW50cnkpLT5leHBpcmVfZnVuYyBeCQkJCVwKKwkgICh1bnNpZ25lZCBsb25nKShlbnRyeSktPnBpZAkJKSAmIFRTVEFUX0hBU0hfTUFTSykKKworI2RlZmluZSB0c3RhdF9oYXNoZW50cnkoZW50cnkpCSh0c3RhdF9oYXNoX3RhYmxlICsgX190c3RhdF9oYXNoZm4oZW50cnkpKQorCitzdGF0aWMgc3RydWN0IGVudHJ5ICp0c3RhdF9oYXNoX3RhYmxlW1RTVEFUX0hBU0hfU0laRV0gX19yZWFkX21vc3RseTsKKworc3RhdGljIGludCBtYXRjaF9lbnRyaWVzKHN0cnVjdCBlbnRyeSAqZW50cnkxLCBzdHJ1Y3QgZW50cnkgKmVudHJ5MikKK3sKKwlyZXR1cm4gZW50cnkxLT50aW1lciAgICAgICA9PSBlbnRyeTItPnRpbWVyCSAgJiYKKwkgICAgICAgZW50cnkxLT5zdGFydF9mdW5jICA9PSBlbnRyeTItPnN0YXJ0X2Z1bmMgICYmCisJICAgICAgIGVudHJ5MS0+ZXhwaXJlX2Z1bmMgPT0gZW50cnkyLT5leHBpcmVfZnVuYyAmJgorCSAgICAgICBlbnRyeTEtPnBpZAkgICA9PSBlbnRyeTItPnBpZDsKK30KKworLyoKKyAqIExvb2sgdXAgd2hldGhlciBhbiBlbnRyeSBtYXRjaGluZyB0aGlzIGl0ZW0gaXMgcHJlc2VudAorICogaW4gdGhlIGhhc2ggYWxyZWFkeS4gTXVzdCBiZSBjYWxsZWQgd2l0aCBpcnFzIG9mZiBhbmQgdGhlCisgKiBsb29rdXAgbG9jayBoZWxkOgorICovCitzdGF0aWMgc3RydWN0IGVudHJ5ICp0c3RhdF9sb29rdXAoc3RydWN0IGVudHJ5ICplbnRyeSwgY2hhciAqY29tbSkKK3sKKwlzdHJ1Y3QgZW50cnkgKipoZWFkLCAqY3VyciwgKnByZXY7CisKKwloZWFkID0gdHN0YXRfaGFzaGVudHJ5KGVudHJ5KTsKKwljdXJyID0gKmhlYWQ7CisKKwkvKgorCSAqIFRoZSBmYXN0cGF0aCBpcyB3aGVuIHRoZSBlbnRyeSBpcyBhbHJlYWR5IGhhc2hlZCwKKwkgKiB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvb2t1cCBsb2NrIGhlbGQsIGJ1dCB3aXRoIHRoZQorCSAqIHRhYmxlIGxvY2sgbm90IGhlbGQ6CisJICovCisJd2hpbGUgKGN1cnIpIHsKKwkJaWYgKG1hdGNoX2VudHJpZXMoY3VyciwgZW50cnkpKQorCQkJcmV0dXJuIGN1cnI7CisKKwkJY3VyciA9IGN1cnItPm5leHQ7CisJfQorCS8qCisJICogU2xvd3BhdGg6IGFsbG9jYXRlLCBzZXQgdXAgYW5kIGxpbmsgYSBuZXcgaGFzaCBlbnRyeToKKwkgKi8KKwlwcmV2ID0gTlVMTDsKKwljdXJyID0gKmhlYWQ7CisKKwlzcGluX2xvY2soJnRhYmxlX2xvY2spOworCS8qCisJICogTWFrZSBzdXJlIHdlIGhhdmUgbm90IHJhY2VkIHdpdGggYW5vdGhlciBDUFU6CisJICovCisJd2hpbGUgKGN1cnIpIHsKKwkJaWYgKG1hdGNoX2VudHJpZXMoY3VyciwgZW50cnkpKQorCQkJZ290byBvdXRfdW5sb2NrOworCisJCXByZXYgPSBjdXJyOworCQljdXJyID0gY3Vyci0+bmV4dDsKKwl9CisKKwljdXJyID0gYWxsb2NfZW50cnkoKTsKKwlpZiAoY3VycikgeworCQkqY3VyciA9ICplbnRyeTsKKwkJY3Vyci0+Y291bnQgPSAwOworCQltZW1jcHkoY3Vyci0+Y29tbSwgY29tbSwgVEFTS19DT01NX0xFTik7CisJCWlmIChwcmV2KQorCQkJcHJldi0+bmV4dCA9IGN1cnI7CisJCWVsc2UKKwkJCSpoZWFkID0gY3VycjsKKwkJY3Vyci0+bmV4dCA9IE5VTEw7CisJfQorIG91dF91bmxvY2s6CisJc3Bpbl91bmxvY2soJnRhYmxlX2xvY2spOworCisJcmV0dXJuIGN1cnI7Cit9CisKKy8qKgorICogdGltZXJfc3RhdHNfdXBkYXRlX3N0YXRzIC0gVXBkYXRlIHRoZSBzdGF0aXN0aWNzIGZvciBhIHRpbWVyLgorICogQHRpbWVyOglwb2ludGVyIHRvIGVpdGhlciBhIHRpbWVyX2xpc3Qgb3IgYSBocnRpbWVyCisgKiBAcGlkOgl0aGUgcGlkIG9mIHRoZSB0YXNrIHdoaWNoIHNldCB1cCB0aGUgdGltZXIKKyAqIEBzdGFydGY6CXBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHdoaWNoIGRpZCB0aGUgdGltZXIgc2V0dXAKKyAqIEB0aW1lcmY6CXBvaW50ZXIgdG8gdGhlIHRpbWVyIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSB0aW1lcgorICogQGNvbW06CW5hbWUgb2YgdGhlIHByb2Nlc3Mgd2hpY2ggc2V0IHVwIHRoZSB0aW1lcgorICoKKyAqIFdoZW4gdGhlIHRpbWVyIGlzIGFscmVhZHkgcmVnaXN0ZXJlZCwgdGhlbiB0aGUgZXZlbnQgY291bnRlciBpcworICogaW5jcmVtZW50ZWQuIE90aGVyd2lzZSB0aGUgdGltZXIgaXMgcmVnaXN0ZXJlZCBpbiBhIGZyZWUgc2xvdC4KKyAqLwordm9pZCB0aW1lcl9zdGF0c191cGRhdGVfc3RhdHModm9pZCAqdGltZXIsIHBpZF90IHBpZCwgdm9pZCAqc3RhcnRmLAorCQkJICAgICAgdm9pZCAqdGltZXJmLCBjaGFyICogY29tbSkKK3sKKwkvKgorCSAqIEl0IGRvZXNudCBtYXR0ZXIgd2hpY2ggbG9jayB3ZSB0YWtlOgorCSAqLworCXNwaW5sb2NrX3QgKmxvY2sgPSAmcGVyX2NwdShsb29rdXBfbG9jaywgcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7CisJc3RydWN0IGVudHJ5ICplbnRyeSwgaW5wdXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWlucHV0LnRpbWVyID0gdGltZXI7CisJaW5wdXQuc3RhcnRfZnVuYyA9IHN0YXJ0ZjsKKwlpbnB1dC5leHBpcmVfZnVuYyA9IHRpbWVyZjsKKwlpbnB1dC5waWQgPSBwaWQ7CisKKwlzcGluX2xvY2tfaXJxc2F2ZShsb2NrLCBmbGFncyk7CisJaWYgKCFhY3RpdmUpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWVudHJ5ID0gdHN0YXRfbG9va3VwKCZpbnB1dCwgY29tbSk7CisJaWYgKGxpa2VseShlbnRyeSkpCisJCWVudHJ5LT5jb3VudCsrOworCWVsc2UKKwkJYXRvbWljX2luYygmb3ZlcmZsb3dfY291bnQpOworCisgb3V0X3VubG9jazoKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKGxvY2ssIGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbmFtZV9vZmZzZXQoc3RydWN0IHNlcV9maWxlICptLCB1bnNpZ25lZCBsb25nIGFkZHIpCit7CisJY2hhciBuYW1lYnVmW0tTWU1fTkFNRV9MRU4rMV07CisJdW5zaWduZWQgbG9uZyBzaXplLCBvZmZzZXQ7CisJY29uc3QgY2hhciAqc3ltX25hbWU7CisJY2hhciAqbW9kbmFtZTsKKworCXN5bV9uYW1lID0ga2FsbHN5bXNfbG9va3VwKGFkZHIsICZzaXplLCAmb2Zmc2V0LCAmbW9kbmFtZSwgbmFtZWJ1Zik7CisJaWYgKHN5bV9uYW1lKQorCQlzZXFfcHJpbnRmKG0sICIlcyIsIHN5bV9uYW1lKTsKKwllbHNlCisJCXNlcV9wcmludGYobSwgIjwlcD4iLCAodm9pZCAqKWFkZHIpOworfQorCitzdGF0aWMgaW50IHRzdGF0c19zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgdGltZXNwZWMgcGVyaW9kOworCXN0cnVjdCBlbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBtczsKKwlsb25nIGV2ZW50cyA9IDA7CisJa3RpbWVfdCB0aW1lOworCWludCBpOworCisJbXV0ZXhfbG9jaygmc2hvd19tdXRleCk7CisJLyoKKwkgKiBJZiBzdGlsbCBhY3RpdmUgdGhlbiBjYWxjdWxhdGUgdXAgdG8gbm93OgorCSAqLworCWlmIChhY3RpdmUpCisJCXRpbWVfc3RvcCA9IGt0aW1lX2dldCgpOworCisJdGltZSA9IGt0aW1lX3N1Yih0aW1lX3N0b3AsIHRpbWVfc3RhcnQpOworCisJcGVyaW9kID0ga3RpbWVfdG9fdGltZXNwZWModGltZSk7CisJbXMgPSBwZXJpb2QudHZfbnNlYyAvIDEwMDAwMDA7CisKKwlzZXFfcHV0cyhtLCAiVGltZXIgU3RhdHMgVmVyc2lvbjogdjAuMVxuIik7CisJc2VxX3ByaW50ZihtLCAiU2FtcGxlIHBlcmlvZDogJWxkLiUwM2xkIHNcbiIsIHBlcmlvZC50dl9zZWMsIG1zKTsKKwlpZiAoYXRvbWljX3JlYWQoJm92ZXJmbG93X2NvdW50KSkKKwkJc2VxX3ByaW50ZihtLCAiT3ZlcmZsb3c6ICVkIGVudHJpZXNcbiIsCisJCQlhdG9taWNfcmVhZCgmb3ZlcmZsb3dfY291bnQpKTsKKworCWZvciAoaSA9IDA7IGkgPCBucl9lbnRyaWVzOyBpKyspIHsKKwkJZW50cnkgPSBlbnRyaWVzICsgaTsKKwkJc2VxX3ByaW50ZihtLCAiJTRsdSwgJTVkICUtMTZzICIsCisJCQkJZW50cnktPmNvdW50LCBlbnRyeS0+cGlkLCBlbnRyeS0+Y29tbSk7CisKKwkJcHJpbnRfbmFtZV9vZmZzZXQobSwgKHVuc2lnbmVkIGxvbmcpZW50cnktPnN0YXJ0X2Z1bmMpOworCQlzZXFfcHV0cyhtLCAiICgiKTsKKwkJcHJpbnRfbmFtZV9vZmZzZXQobSwgKHVuc2lnbmVkIGxvbmcpZW50cnktPmV4cGlyZV9mdW5jKTsKKwkJc2VxX3B1dHMobSwgIilcbiIpOworCisJCWV2ZW50cyArPSBlbnRyeS0+Y291bnQ7CisJfQorCisJbXMgKz0gcGVyaW9kLnR2X3NlYyAqIDEwMDA7CisJaWYgKCFtcykKKwkJbXMgPSAxOworCisJaWYgKGV2ZW50cyAmJiBwZXJpb2QudHZfc2VjKQorCQlzZXFfcHJpbnRmKG0sICIlbGQgdG90YWwgZXZlbnRzLCAlbGQuJWxkIGV2ZW50cy9zZWNcbiIsIGV2ZW50cywKKwkJCSAgIGV2ZW50cyAvIHBlcmlvZC50dl9zZWMsIGV2ZW50cyAqIDEwMDAgLyBtcyk7CisJZWxzZQorCQlzZXFfcHJpbnRmKG0sICIlbGQgdG90YWwgZXZlbnRzXG4iLCBldmVudHMpOworCisJbXV0ZXhfdW5sb2NrKCZzaG93X211dGV4KTsKKworCXJldHVybiAwOworfQorCisvKgorICogQWZ0ZXIgYSBzdGF0ZSBjaGFuZ2UsIG1ha2Ugc3VyZSBhbGwgY29uY3VycmVudCBsb29rdXAvdXBkYXRlCisgKiBhY3Rpdml0aWVzIGhhdmUgc3RvcHBlZDoKKyAqLworc3RhdGljIHZvaWQgc3luY19hY2Nlc3Modm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBjcHU7CisKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQlzcGluX2xvY2tfaXJxc2F2ZSgmcGVyX2NwdShsb29rdXBfbG9jaywgY3B1KSwgZmxhZ3MpOworCQkvKiBub3RoaW5nICovCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnBlcl9jcHUobG9va3VwX2xvY2ssIGNwdSksIGZsYWdzKTsKKwl9Cit9CisKK3N0YXRpYyBzc2l6ZV90IHRzdGF0c193cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgICBzaXplX3QgY291bnQsIGxvZmZfdCAqb2ZmcykKK3sKKwljaGFyIGN0bFsyXTsKKworCWlmIChjb3VudCAhPSAyIHx8ICpvZmZzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChjb3B5X2Zyb21fdXNlcihjdGwsIGJ1ZiwgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCW11dGV4X2xvY2soJnNob3dfbXV0ZXgpOworCXN3aXRjaCAoY3RsWzBdKSB7CisJY2FzZSAnMCc6CisJCWlmIChhY3RpdmUpIHsKKwkJCWFjdGl2ZSA9IDA7CisJCQl0aW1lX3N0b3AgPSBrdGltZV9nZXQoKTsKKwkJCXN5bmNfYWNjZXNzKCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSAnMSc6CisJCWlmICghYWN0aXZlKSB7CisJCQlyZXNldF9lbnRyaWVzKCk7CisJCQl0aW1lX3N0YXJ0ID0ga3RpbWVfZ2V0KCk7CisJCQlhY3RpdmUgPSAxOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvdW50ID0gLUVJTlZBTDsKKwl9CisJbXV0ZXhfdW5sb2NrKCZzaG93X211dGV4KTsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCB0c3RhdHNfb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlyZXR1cm4gc2luZ2xlX29wZW4oZmlscCwgdHN0YXRzX3Nob3csIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0c3RhdHNfZm9wcyA9IHsKKwkub3BlbgkJPSB0c3RhdHNfb3BlbiwKKwkucmVhZAkJPSBzZXFfcmVhZCwKKwkud3JpdGUJCT0gdHN0YXRzX3dyaXRlLAorCS5sbHNlZWsJCT0gc2VxX2xzZWVrLAorCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsCit9OworCit2b2lkIF9faW5pdCBpbml0X3RpbWVyX3N0YXRzKHZvaWQpCit7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpCisJCXNwaW5fbG9ja19pbml0KCZwZXJfY3B1KGxvb2t1cF9sb2NrLCBjcHUpKTsKK30KKworc3RhdGljIGludCBfX2luaXQgaW5pdF90c3RhdHNfcHJvY2ZzKHZvaWQpCit7CisJc3RydWN0IHByb2NfZGlyX2VudHJ5ICpwZTsKKworCXBlID0gY3JlYXRlX3Byb2NfZW50cnkoInRpbWVyX3N0YXRzIiwgMDY0NCwgTlVMTCk7CisJaWYgKCFwZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlwZS0+cHJvY19mb3BzID0gJnRzdGF0c19mb3BzOworCisJcmV0dXJuIDA7Cit9CitfX2luaXRjYWxsKGluaXRfdHN0YXRzX3Byb2Nmcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZXIuYyBiL2tlcm5lbC90aW1lci5jCmluZGV4IDQ5MDIxODEuLmNiMWI4NmEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90aW1lci5jCisrKyBiL2tlcm5lbC90aW1lci5jCkBAIC0zNCw2ICszNCw4IEBACiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzY2FsbHMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogCiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxhc20vdW5pc3RkLmg+CkBAIC0yNjIsNiArMjY0LDE4IEBACiAJbGlzdF9hZGRfdGFpbCgmdGltZXItPmVudHJ5LCB2ZWMpOwogfQogCisjaWZkZWYgQ09ORklHX1RJTUVSX1NUQVRTCit2b2lkIF9fdGltZXJfc3RhdHNfdGltZXJfc2V0X3N0YXJ0X2luZm8oc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLCB2b2lkICphZGRyKQoreworCWlmICh0aW1lci0+c3RhcnRfc2l0ZSkKKwkJcmV0dXJuOworCisJdGltZXItPnN0YXJ0X3NpdGUgPSBhZGRyOworCW1lbWNweSh0aW1lci0+c3RhcnRfY29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJdGltZXItPnN0YXJ0X3BpZCA9IGN1cnJlbnQtPnBpZDsKK30KKyNlbmRpZgorCiAvKioKICAqIGluaXRfdGltZXIgLSBpbml0aWFsaXplIGEgdGltZXIuCiAgKiBAdGltZXI6IHRoZSB0aW1lciB0byBiZSBpbml0aWFsaXplZApAQCAtMjczLDExICsyODcsMTYgQEAKIHsKIAl0aW1lci0+ZW50cnkubmV4dCA9IE5VTEw7CiAJdGltZXItPmJhc2UgPSBfX3Jhd19nZXRfY3B1X3Zhcih0dmVjX2Jhc2VzKTsKKyNpZmRlZiBDT05GSUdfVElNRVJfU1RBVFMKKwl0aW1lci0+c3RhcnRfc2l0ZSA9IE5VTEw7CisJdGltZXItPnN0YXJ0X3BpZCA9IC0xOworCW1lbXNldCh0aW1lci0+c3RhcnRfY29tbSwgMCwgVEFTS19DT01NX0xFTik7CisjZW5kaWYKIH0KIEVYUE9SVF9TWU1CT0woaW5pdF90aW1lcik7CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZXRhY2hfdGltZXIoc3RydWN0IHRpbWVyX2xpc3QgKnRpbWVyLAotCQkJCQlpbnQgY2xlYXJfcGVuZGluZykKKwkJCQlpbnQgY2xlYXJfcGVuZGluZykKIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSA9ICZ0aW1lci0+ZW50cnk7CiAKQEAgLTMyNCw2ICszNDMsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKKwl0aW1lcl9zdGF0c190aW1lcl9zZXRfc3RhcnRfaW5mbyh0aW1lcik7CiAJQlVHX09OKCF0aW1lci0+ZnVuY3Rpb24pOwogCiAJYmFzZSA9IGxvY2tfdGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKQEAgLTM3NCw2ICszOTQsNyBAQAogCXR2ZWNfYmFzZV90ICpiYXNlID0gcGVyX2NwdSh0dmVjX2Jhc2VzLCBjcHUpOwogICAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKICAgCUJVR19PTih0aW1lcl9wZW5kaW5nKHRpbWVyKSB8fCAhdGltZXItPmZ1bmN0aW9uKTsKIAlzcGluX2xvY2tfaXJxc2F2ZSgmYmFzZS0+bG9jaywgZmxhZ3MpOwogCXRpbWVyLT5iYXNlID0gYmFzZTsKQEAgLTQwNiw2ICs0MjcsNyBAQAogewogCUJVR19PTighdGltZXItPmZ1bmN0aW9uKTsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKIAkvKgogCSAqIFRoaXMgaXMgYSBjb21tb24gb3B0aW1pemF0aW9uIHRyaWdnZXJlZCBieSB0aGUKIAkgKiBuZXR3b3JraW5nIGNvZGUgLSBpZiB0aGUgdGltZXIgaXMgcmUtbW9kaWZpZWQKQEAgLTQzNiw2ICs0NTgsNyBAQAogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IHJldCA9IDA7CiAKKwl0aW1lcl9zdGF0c190aW1lcl9jbGVhcl9zdGFydF9pbmZvKHRpbWVyKTsKIAlpZiAodGltZXJfcGVuZGluZyh0aW1lcikpIHsKIAkJYmFzZSA9IGxvY2tfdGltZXJfYmFzZSh0aW1lciwgJmZsYWdzKTsKIAkJaWYgKHRpbWVyX3BlbmRpbmcodGltZXIpKSB7CkBAIC01NjksNiArNTkyLDggQEAKICAJCQlmbiA9IHRpbWVyLT5mdW5jdGlvbjsKICAJCQlkYXRhID0gdGltZXItPmRhdGE7CiAKKwkJCXRpbWVyX3N0YXRzX2FjY291bnRfdGltZXIodGltZXIpOworCiAJCQlzZXRfcnVubmluZ190aW1lcihiYXNlLCB0aW1lcik7CiAJCQlkZXRhY2hfdGltZXIodGltZXIsIDEpOwogCQkJc3Bpbl91bmxvY2tfaXJxKCZiYXNlLT5sb2NrKTsKQEAgLTU5MSwxMDUgKzYxNiwxMjQgQEAKIAlzcGluX3VubG9ja19pcnEoJmJhc2UtPmxvY2spOwogfQogCi0jaWZkZWYgQ09ORklHX05PX0lETEVfSFoKKyNpZiBkZWZpbmVkKENPTkZJR19OT19JRExFX0haKSB8fCBkZWZpbmVkKENPTkZJR19OT19IWikKIC8qCiAgKiBGaW5kIG91dCB3aGVuIHRoZSBuZXh0IHRpbWVyIGV2ZW50IGlzIGR1ZSB0byBoYXBwZW4uIFRoaXMKICAqIGlzIHVzZWQgb24gUy8zOTAgdG8gc3RvcCBhbGwgYWN0aXZpdHkgd2hlbiBhIGNwdXMgaXMgaWRsZS4KICAqIFRoaXMgZnVuY3Rpb25zIG5lZWRzIHRvIGJlIGNhbGxlZCBkaXNhYmxlZC4KICAqLwotdW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKQorc3RhdGljIHVuc2lnbmVkIGxvbmcgX19uZXh0X3RpbWVyX2ludGVycnVwdCh0dmVjX2Jhc2VfdCAqYmFzZSkKIHsKLQl0dmVjX2Jhc2VfdCAqYmFzZTsKLQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0OworCXVuc2lnbmVkIGxvbmcgdGltZXJfamlmZmllcyA9IGJhc2UtPnRpbWVyX2ppZmZpZXM7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzID0gdGltZXJfamlmZmllcyArIChMT05HX01BWCA+PiAxKTsKKwlpbnQgaW5kZXgsIHNsb3QsIGFycmF5LCBmb3VuZCA9IDA7CiAJc3RydWN0IHRpbWVyX2xpc3QgKm50ZTsKLQl1bnNpZ25lZCBsb25nIGV4cGlyZXM7Ci0JdW5zaWduZWQgbG9uZyBocl9leHBpcmVzID0gTUFYX0pJRkZZX09GRlNFVDsKLQlrdGltZV90IGhyX2RlbHRhOwogCXR2ZWNfdCAqdmFycmF5WzRdOwotCWludCBpLCBqOwotCi0JaHJfZGVsdGEgPSBocnRpbWVyX2dldF9uZXh0X2V2ZW50KCk7Ci0JaWYgKGhyX2RlbHRhLnR2NjQgIT0gS1RJTUVfTUFYKSB7Ci0JCXN0cnVjdCB0aW1lc3BlYyB0c2RlbHRhOwotCQl0c2RlbHRhID0ga3RpbWVfdG9fdGltZXNwZWMoaHJfZGVsdGEpOwotCQlocl9leHBpcmVzID0gdGltZXNwZWNfdG9famlmZmllcygmdHNkZWx0YSk7Ci0JCWlmIChocl9leHBpcmVzIDwgMykKLQkJCXJldHVybiBocl9leHBpcmVzICsgamlmZmllczsKLQl9Ci0JaHJfZXhwaXJlcyArPSBqaWZmaWVzOwotCi0JYmFzZSA9IF9fZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7Ci0Jc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKLQlleHBpcmVzID0gYmFzZS0+dGltZXJfamlmZmllcyArIChMT05HX01BWCA+PiAxKTsKLQlsaXN0ID0gTlVMTDsKIAogCS8qIExvb2sgZm9yIHRpbWVyIGV2ZW50cyBpbiB0djEuICovCi0JaiA9IGJhc2UtPnRpbWVyX2ppZmZpZXMgJiBUVlJfTUFTSzsKKwlpbmRleCA9IHNsb3QgPSB0aW1lcl9qaWZmaWVzICYgVFZSX01BU0s7CiAJZG8gewotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG50ZSwgYmFzZS0+dHYxLnZlYyArIGosIGVudHJ5KSB7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkobnRlLCBiYXNlLT50djEudmVjICsgc2xvdCwgZW50cnkpIHsKKwkJCWZvdW5kID0gMTsKIAkJCWV4cGlyZXMgPSBudGUtPmV4cGlyZXM7Ci0JCQlpZiAoaiA8IChiYXNlLT50aW1lcl9qaWZmaWVzICYgVFZSX01BU0spKQotCQkJCWxpc3QgPSBiYXNlLT50djIudmVjICsgKElOREVYKDApKTsKLQkJCWdvdG8gZm91bmQ7CisJCQkvKiBMb29rIGF0IHRoZSBjYXNjYWRlIGJ1Y2tldChzKT8gKi8KKwkJCWlmICghaW5kZXggfHwgc2xvdCA8IGluZGV4KQorCQkJCWdvdG8gY2FzY2FkZTsKKwkJCXJldHVybiBleHBpcmVzOwogCQl9Ci0JCWogPSAoaiArIDEpICYgVFZSX01BU0s7Ci0JfSB3aGlsZSAoaiAhPSAoYmFzZS0+dGltZXJfamlmZmllcyAmIFRWUl9NQVNLKSk7CisJCXNsb3QgPSAoc2xvdCArIDEpICYgVFZSX01BU0s7CisJfSB3aGlsZSAoc2xvdCAhPSBpbmRleCk7CisKK2Nhc2NhZGU6CisJLyogQ2FsY3VsYXRlIHRoZSBuZXh0IGNhc2NhZGUgZXZlbnQgKi8KKwlpZiAoaW5kZXgpCisJCXRpbWVyX2ppZmZpZXMgKz0gVFZSX1NJWkUgLSBpbmRleDsKKwl0aW1lcl9qaWZmaWVzID4+PSBUVlJfQklUUzsKIAogCS8qIENoZWNrIHR2Mi10djUuICovCiAJdmFycmF5WzBdID0gJmJhc2UtPnR2MjsKIAl2YXJyYXlbMV0gPSAmYmFzZS0+dHYzOwogCXZhcnJheVsyXSA9ICZiYXNlLT50djQ7CiAJdmFycmF5WzNdID0gJmJhc2UtPnR2NTsKLQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0JCWogPSBJTkRFWChpKTsKKworCWZvciAoYXJyYXkgPSAwOyBhcnJheSA8IDQ7IGFycmF5KyspIHsKKwkJdHZlY190ICp2YXJwID0gdmFycmF5W2FycmF5XTsKKworCQlpbmRleCA9IHNsb3QgPSB0aW1lcl9qaWZmaWVzICYgVFZOX01BU0s7CiAJCWRvIHsKLQkJCWlmIChsaXN0X2VtcHR5KHZhcnJheVtpXS0+dmVjICsgaikpIHsKLQkJCQlqID0gKGogKyAxKSAmIFRWTl9NQVNLOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJbGlzdF9mb3JfZWFjaF9lbnRyeShudGUsIHZhcnJheVtpXS0+dmVjICsgaiwgZW50cnkpCisJCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KG50ZSwgdmFycC0+dmVjICsgc2xvdCwgZW50cnkpIHsKKwkJCQlmb3VuZCA9IDE7CiAJCQkJaWYgKHRpbWVfYmVmb3JlKG50ZS0+ZXhwaXJlcywgZXhwaXJlcykpCiAJCQkJCWV4cGlyZXMgPSBudGUtPmV4cGlyZXM7Ci0JCQlpZiAoaiA8IChJTkRFWChpKSkgJiYgaSA8IDMpCi0JCQkJbGlzdCA9IHZhcnJheVtpICsgMV0tPnZlYyArIChJTkRFWChpICsgMSkpOwotCQkJZ290byBmb3VuZDsKLQkJfSB3aGlsZSAoaiAhPSAoSU5ERVgoaSkpKTsKKwkJCX0KKwkJCS8qCisJCQkgKiBEbyB3ZSBzdGlsbCBzZWFyY2ggZm9yIHRoZSBmaXJzdCB0aW1lciBvciBhcmUKKwkJCSAqIHdlIGxvb2tpbmcgdXAgdGhlIGNhc2NhZGUgYnVja2V0cyA/CisJCQkgKi8KKwkJCWlmIChmb3VuZCkgeworCQkJCS8qIExvb2sgYXQgdGhlIGNhc2NhZGUgYnVja2V0KHMpPyAqLworCQkJCWlmICghaW5kZXggfHwgc2xvdCA8IGluZGV4KQorCQkJCQlicmVhazsKKwkJCQlyZXR1cm4gZXhwaXJlczsKKwkJCX0KKwkJCXNsb3QgPSAoc2xvdCArIDEpICYgVFZOX01BU0s7CisJCX0gd2hpbGUgKHNsb3QgIT0gaW5kZXgpOworCisJCWlmIChpbmRleCkKKwkJCXRpbWVyX2ppZmZpZXMgKz0gVFZOX1NJWkUgLSBpbmRleDsKKwkJdGltZXJfamlmZmllcyA+Pj0gVFZOX0JJVFM7CiAJfQotZm91bmQ6Ci0JaWYgKGxpc3QpIHsKLQkJLyoKLQkJICogVGhlIHNlYXJjaCB3cmFwcGVkLiBXZSBuZWVkIHRvIGxvb2sgYXQgdGhlIG5leHQgbGlzdAotCQkgKiBmcm9tIG5leHQgdHYgZWxlbWVudCB0aGF0IHdvdWxkIGNhc2NhZGUgaW50byB0diBlbGVtZW50Ci0JCSAqIHdoZXJlIHdlIGZvdW5kIHRoZSB0aW1lciBlbGVtZW50LgotCQkgKi8KLQkJbGlzdF9mb3JfZWFjaF9lbnRyeShudGUsIGxpc3QsIGVudHJ5KSB7Ci0JCQlpZiAodGltZV9iZWZvcmUobnRlLT5leHBpcmVzLCBleHBpcmVzKSkKLQkJCQlleHBpcmVzID0gbnRlLT5leHBpcmVzOwotCQl9Ci0JfQotCXNwaW5fdW5sb2NrKCZiYXNlLT5sb2NrKTsKLQotCS8qCi0JICogSXQgY2FuIGhhcHBlbiB0aGF0IG90aGVyIENQVXMgc2VydmljZSB0aW1lciBJUlFzIGFuZCBpbmNyZW1lbnQKLQkgKiBqaWZmaWVzLCBidXQgd2UgaGF2ZSBub3QgeWV0IGdvdCBhIGxvY2FsIHRpbWVyIHRpY2sgdG8gcHJvY2VzcwotCSAqIHRoZSB0aW1lciB3aGVlbHMuICBJbiB0aGF0IGNhc2UsIHRoZSBleHBpcnkgdGltZSBjYW4gYmUgYmVmb3JlCi0JICogamlmZmllcywgYnV0IHNpbmNlIHRoZSBoaWdoLXJlc29sdXRpb24gdGltZXIgaGVyZSBpcyByZWxhdGl2ZSB0bwotCSAqIGppZmZpZXMsIHRoZSBkZWZhdWx0IGV4cHJlc3Npb24gd2hlbiBoaWdoLXJlc29sdXRpb24gdGltZXJzIGFyZQotCSAqIG5vdCBhY3RpdmUsCi0JICoKLQkgKiAgIHRpbWVfYmVmb3JlKE1BWF9KSUZGWV9PRkZTRVQgKyBqaWZmaWVzLCBleHBpcmVzKQotCSAqCi0JICogd291bGQgZmFsc2VseSBldmFsdWF0ZSB0byB0cnVlLiAgSWYgdGhhdCBpcyB0aGUgY2FzZSwganVzdAotCSAqIHJldHVybiBqaWZmaWVzIHNvIHRoYXQgd2UgY2FuIGltbWVkaWF0ZWx5IGZpcmUgdGhlIGxvY2FsIHRpbWVyCi0JICovCi0JaWYgKHRpbWVfYmVmb3JlKGV4cGlyZXMsIGppZmZpZXMpKQotCQlyZXR1cm4gamlmZmllczsKLQotCWlmICh0aW1lX2JlZm9yZShocl9leHBpcmVzLCBleHBpcmVzKSkKLQkJcmV0dXJuIGhyX2V4cGlyZXM7Ci0KIAlyZXR1cm4gZXhwaXJlczsKIH0KKworLyoKKyAqIENoZWNrLCBpZiB0aGUgbmV4dCBocnRpbWVyIGV2ZW50IGlzIGJlZm9yZSB0aGUgbmV4dCB0aW1lciB3aGVlbAorICogZXZlbnQ6CisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGNtcF9uZXh0X2hydGltZXJfZXZlbnQodW5zaWduZWQgbG9uZyBub3csCisJCQkJCSAgICB1bnNpZ25lZCBsb25nIGV4cGlyZXMpCit7CisJa3RpbWVfdCBocl9kZWx0YSA9IGhydGltZXJfZ2V0X25leHRfZXZlbnQoKTsKKwlzdHJ1Y3QgdGltZXNwZWMgdHNkZWx0YTsKKworCWlmIChocl9kZWx0YS50djY0ID09IEtUSU1FX01BWCkKKwkJcmV0dXJuIGV4cGlyZXM7CisKKwlpZiAoaHJfZGVsdGEudHY2NCA8PSBUSUNLX05TRUMpCisJCXJldHVybiBub3c7CisKKwl0c2RlbHRhID0ga3RpbWVfdG9fdGltZXNwZWMoaHJfZGVsdGEpOworCW5vdyArPSB0aW1lc3BlY190b19qaWZmaWVzKCZ0c2RlbHRhKTsKKwlpZiAodGltZV9iZWZvcmUobm93LCBleHBpcmVzKSkKKwkJcmV0dXJuIG5vdzsKKwlyZXR1cm4gZXhwaXJlczsKK30KKworLyoqCisgKiBuZXh0X3RpbWVyX2ludGVycnVwdCAtIHJldHVybiB0aGUgamlmZnkgb2YgdGhlIG5leHQgcGVuZGluZyB0aW1lcgorICovCit1bnNpZ25lZCBsb25nIGdldF9uZXh0X3RpbWVyX2ludGVycnVwdCh1bnNpZ25lZCBsb25nIG5vdykKK3sKKwl0dmVjX2Jhc2VfdCAqYmFzZSA9IF9fZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7CisJdW5zaWduZWQgbG9uZyBleHBpcmVzOworCisJc3Bpbl9sb2NrKCZiYXNlLT5sb2NrKTsKKwlleHBpcmVzID0gX19uZXh0X3RpbWVyX2ludGVycnVwdChiYXNlKTsKKwlzcGluX3VubG9jaygmYmFzZS0+bG9jayk7CisKKwlpZiAodGltZV9iZWZvcmVfZXEoZXhwaXJlcywgbm93KSkKKwkJcmV0dXJuIG5vdzsKKworCXJldHVybiBjbXBfbmV4dF9ocnRpbWVyX2V2ZW50KG5vdywgZXhwaXJlcyk7Cit9CisKKyNpZmRlZiBDT05GSUdfTk9fSURMRV9IWgordW5zaWduZWQgbG9uZyBuZXh0X3RpbWVyX2ludGVycnVwdCh2b2lkKQoreworCXJldHVybiBnZXRfbmV4dF90aW1lcl9pbnRlcnJ1cHQoamlmZmllcyk7Cit9CisjZW5kaWYKKwogI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC04MzIsMzIgKzg3NiwzNSBAQAogICoKICAqIEFjY3VtdWxhdGVzIGN1cnJlbnQgdGltZSBpbnRlcnZhbCBhbmQgaW5pdGlhbGl6ZXMgbmV3IGNsb2Nrc291cmNlCiAgKi8KLXN0YXRpYyBpbnQgY2hhbmdlX2Nsb2Nrc291cmNlKHZvaWQpCitzdGF0aWMgdm9pZCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkKIHsKIAlzdHJ1Y3QgY2xvY2tzb3VyY2UgKm5ldzsKIAljeWNsZV90IG5vdzsKIAl1NjQgbnNlYzsKLQluZXcgPSBjbG9ja3NvdXJjZV9nZXRfbmV4dCgpOwotCWlmIChjbG9jayAhPSBuZXcpIHsKLQkJbm93ID0gY2xvY2tzb3VyY2VfcmVhZChuZXcpOwotCQluc2VjID0gIF9fZ2V0X25zZWNfb2Zmc2V0KCk7Ci0JCXRpbWVzcGVjX2FkZF9ucygmeHRpbWUsIG5zZWMpOwogCi0JCWNsb2NrID0gbmV3OwotCQljbG9jay0+Y3ljbGVfbGFzdCA9IG5vdzsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiVGltZTogJXMgY2xvY2tzb3VyY2UgaGFzIGJlZW4gaW5zdGFsbGVkLlxuIiwKLQkJICAgICAgIGNsb2NrLT5uYW1lKTsKLQkJcmV0dXJuIDE7Ci0JfSBlbHNlIGlmIChjbG9jay0+dXBkYXRlX2NhbGxiYWNrKSB7Ci0JCXJldHVybiBjbG9jay0+dXBkYXRlX2NhbGxiYWNrKCk7Ci0JfQotCXJldHVybiAwOworCW5ldyA9IGNsb2Nrc291cmNlX2dldF9uZXh0KCk7CisKKwlpZiAoY2xvY2sgPT0gbmV3KQorCQlyZXR1cm47CisKKwlub3cgPSBjbG9ja3NvdXJjZV9yZWFkKG5ldyk7CisJbnNlYyA9ICBfX2dldF9uc2VjX29mZnNldCgpOworCXRpbWVzcGVjX2FkZF9ucygmeHRpbWUsIG5zZWMpOworCisJY2xvY2sgPSBuZXc7CisJY2xvY2stPmN5Y2xlX2xhc3QgPSBub3c7CisKKwljbG9jay0+ZXJyb3IgPSAwOworCWNsb2NrLT54dGltZV9uc2VjID0gMDsKKwljbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwoY2xvY2ssIE5UUF9JTlRFUlZBTF9MRU5HVEgpOworCisJdGlja19jbG9ja19ub3RpZnkoKTsKKworCXByaW50ayhLRVJOX0lORk8gIlRpbWU6ICVzIGNsb2Nrc291cmNlIGhhcyBiZWVuIGluc3RhbGxlZC5cbiIsCisJICAgICAgIGNsb2NrLT5uYW1lKTsKIH0KICNlbHNlCi1zdGF0aWMgaW5saW5lIGludCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkKLXsKLQlyZXR1cm4gMDsKLX0KK3N0YXRpYyBpbmxpbmUgdm9pZCBjaGFuZ2VfY2xvY2tzb3VyY2Uodm9pZCkgeyB9CiAjZW5kaWYKIAogLyoqCkBAIC04NzEsMzMgKzkxOCw1NiBAQAogCWRvIHsKIAkJc2VxID0gcmVhZF9zZXFiZWdpbigmeHRpbWVfbG9jayk7CiAKLQkJcmV0ID0gY2xvY2stPmlzX2NvbnRpbnVvdXM7CisJCXJldCA9IGNsb2NrLT5mbGFncyAmIENMT0NLX1NPVVJDRV9WQUxJRF9GT1JfSFJFUzsKIAogCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOwogCiAJcmV0dXJuIHJldDsKIH0KIAorLyoqCisgKiByZWFkX3BlcnNpc3RlbnRfY2xvY2sgLSAgUmV0dXJuIHRpbWUgaW4gc2Vjb25kcyBmcm9tIHRoZSBwZXJzaXN0ZW50IGNsb2NrLgorICoKKyAqIFdlYWsgZHVtbXkgZnVuY3Rpb24gZm9yIGFyY2hlcyB0aGF0IGRvIG5vdCB5ZXQgc3VwcG9ydCBpdC4KKyAqIFJldHVybnMgc2Vjb25kcyBmcm9tIGVwb2NoIHVzaW5nIHRoZSBiYXR0ZXJ5IGJhY2tlZCBwZXJzaXN0ZW50IGNsb2NrLgorICogUmV0dXJucyB6ZXJvIGlmIHVuc3VwcG9ydGVkLgorICoKKyAqICBYWFggLSBEbyBiZSBzdXJlIHRvIHJlbW92ZSBpdCBvbmNlIGFsbCBhcmNoZXMgaW1wbGVtZW50IGl0LgorICovCit1bnNpZ25lZCBsb25nIF9fYXR0cmlidXRlX18oKHdlYWspKSByZWFkX3BlcnNpc3RlbnRfY2xvY2sodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKwogLyoKICAqIHRpbWVrZWVwaW5nX2luaXQgLSBJbml0aWFsaXplcyB0aGUgY2xvY2tzb3VyY2UgYW5kIGNvbW1vbiB0aW1la2VlcGluZyB2YWx1ZXMKICAqLwogdm9pZCBfX2luaXQgdGltZWtlZXBpbmdfaW5pdCh2b2lkKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJdW5zaWduZWQgbG9uZyBzZWMgPSByZWFkX3BlcnNpc3RlbnRfY2xvY2soKTsKIAogCXdyaXRlX3NlcWxvY2tfaXJxc2F2ZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCiAJbnRwX2NsZWFyKCk7CiAKIAljbG9jayA9IGNsb2Nrc291cmNlX2dldF9uZXh0KCk7Ci0JY2xvY2tzb3VyY2VfY2FsY3VsYXRlX2ludGVydmFsKGNsb2NrLCB0aWNrX25zZWMpOworCWNsb2Nrc291cmNlX2NhbGN1bGF0ZV9pbnRlcnZhbChjbG9jaywgTlRQX0lOVEVSVkFMX0xFTkdUSCk7CiAJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKIAorCXh0aW1lLnR2X3NlYyA9IHNlYzsKKwl4dGltZS50dl9uc2VjID0gMDsKKwlzZXRfbm9ybWFsaXplZF90aW1lc3BlYygmd2FsbF90b19tb25vdG9uaWMsCisJCS14dGltZS50dl9zZWMsIC14dGltZS50dl9uc2VjKTsKKwogCXdyaXRlX3NlcXVubG9ja19pcnFyZXN0b3JlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiB9CiAKLQorLyogZmxhZyBmb3IgaWYgdGltZWtlZXBpbmcgaXMgc3VzcGVuZGVkICovCiBzdGF0aWMgaW50IHRpbWVrZWVwaW5nX3N1c3BlbmRlZDsKKy8qIHRpbWUgaW4gc2Vjb25kcyB3aGVuIHN1c3BlbmQgYmVnYW4gKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZTsKKwogLyoqCiAgKiB0aW1la2VlcGluZ19yZXN1bWUgLSBSZXN1bWVzIHRoZSBnZW5lcmljIHRpbWVrZWVwaW5nIHN1YnN5c3RlbS4KICAqIEBkZXY6CXVudXNlZApAQCAtOTA5LDEzICs5NzksMjYgQEAKIHN0YXRpYyBpbnQgdGltZWtlZXBpbmdfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCiB7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBsb25nIG5vdyA9IHJlYWRfcGVyc2lzdGVudF9jbG9jaygpOwogCiAJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7Ci0JLyogcmVzdGFydCB0aGUgbGFzdCBjeWNsZSB2YWx1ZSAqLworCisJaWYgKG5vdyAmJiAobm93ID4gdGltZWtlZXBpbmdfc3VzcGVuZF90aW1lKSkgeworCQl1bnNpZ25lZCBsb25nIHNsZWVwX2xlbmd0aCA9IG5vdyAtIHRpbWVrZWVwaW5nX3N1c3BlbmRfdGltZTsKKworCQl4dGltZS50dl9zZWMgKz0gc2xlZXBfbGVuZ3RoOworCQl3YWxsX3RvX21vbm90b25pYy50dl9zZWMgLT0gc2xlZXBfbGVuZ3RoOworCX0KKwkvKiByZS1iYXNlIHRoZSBsYXN0IGN5Y2xlIHZhbHVlICovCiAJY2xvY2stPmN5Y2xlX2xhc3QgPSBjbG9ja3NvdXJjZV9yZWFkKGNsb2NrKTsKIAljbG9jay0+ZXJyb3IgPSAwOwogCXRpbWVrZWVwaW5nX3N1c3BlbmRlZCA9IDA7CiAJd3JpdGVfc2VxdW5sb2NrX2lycXJlc3RvcmUoJnh0aW1lX2xvY2ssIGZsYWdzKTsKKworCXRvdWNoX3NvZnRsb2NrdXBfd2F0Y2hkb2coKTsKKwkvKiBSZXN1bWUgaHJ0aW1lcnMgKi8KKwljbG9ja193YXNfc2V0KCk7CisKIAlyZXR1cm4gMDsKIH0KIApAQCAtOTI1LDYgKzEwMDgsNyBAQAogCiAJd3JpdGVfc2VxbG9ja19pcnFzYXZlKCZ4dGltZV9sb2NrLCBmbGFncyk7CiAJdGltZWtlZXBpbmdfc3VzcGVuZGVkID0gMTsKKwl0aW1la2VlcGluZ19zdXNwZW5kX3RpbWUgPSByZWFkX3BlcnNpc3RlbnRfY2xvY2soKTsKIAl3cml0ZV9zZXF1bmxvY2tfaXJxcmVzdG9yZSgmeHRpbWVfbG9jaywgZmxhZ3MpOwogCXJldHVybiAwOwogfQpAQCAtMTA4OSwxMSArMTE3Myw4IEBACiAJY2xvY2stPnh0aW1lX25zZWMgLT0gKHM2NCl4dGltZS50dl9uc2VjIDw8IGNsb2NrLT5zaGlmdDsKIAogCS8qIGNoZWNrIHRvIHNlZSBpZiB0aGVyZSBpcyBhIG5ldyBjbG9ja3NvdXJjZSB0byB1c2UgKi8KLQlpZiAoY2hhbmdlX2Nsb2Nrc291cmNlKCkpIHsKLQkJY2xvY2stPmVycm9yID0gMDsKLQkJY2xvY2stPnh0aW1lX25zZWMgPSAwOwotCQljbG9ja3NvdXJjZV9jYWxjdWxhdGVfaW50ZXJ2YWwoY2xvY2ssIHRpY2tfbnNlYyk7Ci0JfQorCWNoYW5nZV9jbG9ja3NvdXJjZSgpOworCXVwZGF0ZV92c3lzY2FsbCgmeHRpbWUsIGNsb2NrKTsKIH0KIAogLyoKQEAgLTExNzMsNyArMTI1NCw4IEBACiB7CiAJdHZlY19iYXNlX3QgKmJhc2UgPSBfX2dldF9jcHVfdmFyKHR2ZWNfYmFzZXMpOwogCi0gCWhydGltZXJfcnVuX3F1ZXVlcygpOworCWhydGltZXJfcnVuX3F1ZXVlcygpOworCiAJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmFzZS0+dGltZXJfamlmZmllcykpCiAJCV9fcnVuX3RpbWVycyhiYXNlKTsKIH0KQEAgLTE2MTksNiArMTcwMSw4IEBACiAJaW50IGVyciA9IHRpbWVyX2NwdV9ub3RpZnkoJnRpbWVyc19uYiwgKHVuc2lnbmVkIGxvbmcpQ1BVX1VQX1BSRVBBUkUsCiAJCQkJKHZvaWQgKikobG9uZylzbXBfcHJvY2Vzc29yX2lkKCkpOwogCisJaW5pdF90aW1lcl9zdGF0cygpOworCiAJQlVHX09OKGVyciA9PSBOT1RJRllfQkFEKTsKIAlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnRpbWVyc19uYik7CiAJb3Blbl9zb2Z0aXJxKFRJTUVSX1NPRlRJUlEsIHJ1bl90aW1lcl9zb2Z0aXJxLCBOVUxMKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC90c2FjY3QuYyBiL2tlcm5lbC90c2FjY3QuYwppbmRleCBiYWFjYzM2Li42NThmNjM4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHNhY2N0LmMKKysrIGIva2VybmVsL3RzYWNjdC5jCkBAIC0yMiw4ICsyMiw2IEBACiAjaW5jbHVkZSA8bGludXgvYWNjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2ppZmZpZXMuaD4KIAotCi0jZGVmaW5lIFVTRUNfUEVSX1RJQ0sJKFVTRUNfUEVSX1NFQy9IWikKIC8qCiAgKiBmaWxsIGluIGJhc2ljIGFjY291bnRpbmcgZmllbGRzCiAgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCAwMjBkMWZmLi5iNmZhNWU2IDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0yMTgsNyArMjE4LDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHF1ZXVlX3dvcmspOwogCi1zdGF0aWMgdm9pZCBkZWxheWVkX3dvcmtfdGltZXJfZm4odW5zaWduZWQgbG9uZyBfX2RhdGEpCit2b2lkIGRlbGF5ZWRfd29ya190aW1lcl9mbih1bnNpZ25lZCBsb25nIF9fZGF0YSkKIHsKIAlzdHJ1Y3QgZGVsYXllZF93b3JrICpkd29yayA9IChzdHJ1Y3QgZGVsYXllZF93b3JrICopX19kYXRhOwogCXN0cnVjdCB3b3JrcXVldWVfc3RydWN0ICp3cSA9IGdldF93cV9kYXRhKCZkd29yay0+d29yayk7CkBAIC0yNDUsNiArMjQ1LDcgQEAKIAlzdHJ1Y3QgdGltZXJfbGlzdCAqdGltZXIgPSAmZHdvcmstPnRpbWVyOwogCXN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayA9ICZkd29yay0+d29yazsKIAorCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKHRpbWVyKTsKIAlpZiAoZGVsYXkgPT0gMCkKIAkJcmV0dXJuIHF1ZXVlX3dvcmsod3EsIHdvcmspOwogCkBAIC01OTMsOCArNTk0LDEwIEBACiAgKiBBZnRlciB3YWl0aW5nIGZvciBhIGdpdmVuIHRpbWUgdGhpcyBwdXRzIGEgam9iIGluIHRoZSBrZXJuZWwtZ2xvYmFsCiAgKiB3b3JrcXVldWUuCiAgKi8KLWludCBmYXN0Y2FsbCBzY2hlZHVsZV9kZWxheWVkX3dvcmsoc3RydWN0IGRlbGF5ZWRfd29yayAqZHdvcmssIHVuc2lnbmVkIGxvbmcgZGVsYXkpCitpbnQgZmFzdGNhbGwgc2NoZWR1bGVfZGVsYXllZF93b3JrKHN0cnVjdCBkZWxheWVkX3dvcmsgKmR3b3JrLAorCQkJCQl1bnNpZ25lZCBsb25nIGRlbGF5KQogeworCXRpbWVyX3N0YXRzX3RpbWVyX3NldF9zdGFydF9pbmZvKCZkd29yay0+dGltZXIpOwogCXJldHVybiBxdWV1ZV9kZWxheWVkX3dvcmsoa2V2ZW50ZF93cSwgZHdvcmssIGRlbGF5KTsKIH0KIEVYUE9SVF9TWU1CT0woc2NoZWR1bGVfZGVsYXllZF93b3JrKTsKZGlmZiAtLWdpdCBhL2xpYi9LY29uZmlnLmRlYnVnIGIvbGliL0tjb25maWcuZGVidWcKaW5kZXggNjNmMDRjMS4uNDQ0OGY5MSAxMDA2NDQKLS0tIGEvbGliL0tjb25maWcuZGVidWcKKysrIGIvbGliL0tjb25maWcuZGVidWcKQEAgLTEzNCw2ICsxMzQsMTcgQEAKIAkgIGFwcGxpY2F0aW9uLCB5b3UgY2FuIHNheSBOIHRvIGF2b2lkIHRoZSB2ZXJ5IHNsaWdodCBvdmVyaGVhZAogCSAgdGhpcyBhZGRzLgogCitjb25maWcgVElNRVJfU1RBVFMKKwlib29sICJDb2xsZWN0IGtlcm5lbCB0aW1lcnMgc3RhdGlzdGljcyIKKwlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBQUk9DX0ZTCisJaGVscAorCSAgSWYgeW91IHNheSBZIGhlcmUsIGFkZGl0aW9uYWwgY29kZSB3aWxsIGJlIGluc2VydGVkIGludG8gdGhlCisJICB0aW1lciByb3V0aW5lcyB0byBjb2xsZWN0IHN0YXRpc3RpY3MgYWJvdXQga2VybmVsIHRpbWVycyBiZWluZworCSAgcmVwcm9ncmFtbWVkLiBUaGUgc3RhdGlzdGljcyBjYW4gYmUgcmVhZCBmcm9tIC9wcm9jL3RpbWVyX3N0YXRzLgorCSAgVGhlIHN0YXRpc3RpY3MgY29sbGVjdGlvbiBpcyBzdGFydGVkIGJ5IHdyaXRpbmcgMSB0byAvcHJvYy90aW1lcl9zdGF0cywKKwkgIHdyaXRpbmcgMCBzdG9wcyBpdC4gVGhpcyBmZWF0dXJlIGlzIHVzZWZ1bCB0byBjb2xsZWN0IGluZm9ybWF0aW9uCisJICBhYm91dCB0aW1lciB1c2FnZSBwYXR0ZXJucyBpbiBrZXJuZWwgYW5kIHVzZXJzcGFjZS4KKwogY29uZmlnIERFQlVHX1NMQUIKIAlib29sICJEZWJ1ZyBzbGFiIG1lbW9yeSBhbGxvY2F0aW9ucyIKIAlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTCAmJiBTTEFCCmRpZmYgLS1naXQgYS9saWIvZGV2cmVzLmMgYi9saWIvZGV2cmVzLmMKaW5kZXggMmE2NjhkZC4uZWIzODg0OSAxMDA2NDQKLS0tIGEvbGliL2RldnJlcy5jCisrKyBiL2xpYi9kZXZyZXMuYwpAQCAtMjc0LDIxICsyNzQsMjEgQEAKIAogCQlyYyA9IHBjaV9yZXF1ZXN0X3JlZ2lvbihwZGV2LCBpLCBuYW1lKTsKIAkJaWYgKHJjKQotCQkJZ290byBlcnJfcmVnaW9uOworCQkJZ290byBlcnJfaW52YWw7CiAKIAkJcmMgPSAtRU5PTUVNOwogCQlpZiAoIXBjaW1faW9tYXAocGRldiwgaSwgMCkpCi0JCQlnb3RvIGVycl9pb21hcDsKKwkJCWdvdG8gZXJyX3JlZ2lvbjsKIAl9CiAKIAlyZXR1cm4gMDsKIAotIGVycl9pb21hcDoKLQlwY2ltX2lvdW5tYXAocGRldiwgaW9tYXBbaV0pOwogIGVycl9yZWdpb246CiAJcGNpX3JlbGVhc2VfcmVnaW9uKHBkZXYsIGkpOwogIGVycl9pbnZhbDoKIAl3aGlsZSAoLS1pID49IDApIHsKKwkJaWYgKCEobWFzayAmICgxIDw8IGkpKSkKKwkJCWNvbnRpbnVlOwogCQlwY2ltX2lvdW5tYXAocGRldiwgaW9tYXBbaV0pOwogCQlwY2lfcmVsZWFzZV9yZWdpb24ocGRldiwgaSk7CiAJfQpkaWZmIC0tZ2l0IGEvbW0vZmlsZW1hcC5jIGIvbW0vZmlsZW1hcC5jCmluZGV4IDAwNDE0ODQuLmQxMDYwYjggMTAwNjQ0Ci0tLSBhL21tL2ZpbGVtYXAuYworKysgYi9tbS9maWxlbWFwLmMKQEAgLTIwNzksMjEgKzIwNzksMjcgQEAKIAkJLyogTGltaXQgdGhlIHNpemUgb2YgdGhlIGNvcHkgdG8gdGhlIGNhbGxlcidzIHdyaXRlIHNpemUgKi8KIAkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGNvdW50KTsKIAotCQkvKgotCQkgKiBMaW1pdCB0aGUgc2l6ZSBvZiB0aGUgY29weSB0byB0aGF0IG9mIHRoZSBjdXJyZW50IHNlZ21lbnQsCi0JCSAqIGJlY2F1c2UgZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoKSBkb2Vzbid0IGtub3cgaG93IHRvIHdhbGsKLQkJICogc2VnbWVudHMuCisJCS8qIFdlIG9ubHkgbmVlZCB0byB3b3JyeSBhYm91dCBwcmVmYXVsdGluZyB3aGVuIHdyaXRlcyBhcmUgZnJvbQorCQkgKiB1c2VyLXNwYWNlLiAgTkZTZCB1c2VzIHZmc193cml0ZXYgd2l0aCBzZXZlcmFsIG5vbi1hbGlnbmVkCisJCSAqIHNlZ21lbnRzIGluIHRoZSB2ZWN0b3IsIGFuZCBsaW1pdGluZyB0byBvbmUgc2VnbWVudCBhIHRpbWUgaXMKKwkJICogYSBub3RpY2VhYmxlIHBlcmZvcm1hbmNlIGZvciByZS13cml0ZQogCQkgKi8KLQkJYnl0ZXMgPSBtaW4oYnl0ZXMsIGN1cl9pb3YtPmlvdl9sZW4gLSBpb3ZfYmFzZSk7CisJCWlmICghc2VnbWVudF9lcShnZXRfZnMoKSwgS0VSTkVMX0RTKSkgeworCQkJLyoKKwkJCSAqIExpbWl0IHRoZSBzaXplIG9mIHRoZSBjb3B5IHRvIHRoYXQgb2YgdGhlIGN1cnJlbnQKKwkJCSAqIHNlZ21lbnQsIGJlY2F1c2UgZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoKSBkb2Vzbid0CisJCQkgKiBrbm93IGhvdyB0byB3YWxrIHNlZ21lbnRzLgorCQkJICovCisJCQlieXRlcyA9IG1pbihieXRlcywgY3VyX2lvdi0+aW92X2xlbiAtIGlvdl9iYXNlKTsKIAotCQkvKgotCQkgKiBCcmluZyBpbiB0aGUgdXNlciBwYWdlIHRoYXQgd2Ugd2lsbCBjb3B5IGZyb20gX2ZpcnN0Xy4KLQkJICogT3RoZXJ3aXNlIHRoZXJlJ3MgYSBuYXN0eSBkZWFkbG9jayBvbiBjb3B5aW5nIGZyb20gdGhlCi0JCSAqIHNhbWUgcGFnZSBhcyB3ZSdyZSB3cml0aW5nIHRvLCB3aXRob3V0IGl0IGJlaW5nIG1hcmtlZAotCQkgKiB1cC10by1kYXRlLgotCQkgKi8KLQkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7Ci0KKwkJCS8qCisJCQkgKiBCcmluZyBpbiB0aGUgdXNlciBwYWdlIHRoYXQgd2Ugd2lsbCBjb3B5IGZyb20KKwkJCSAqIF9maXJzdF8uICBPdGhlcndpc2UgdGhlcmUncyBhIG5hc3R5IGRlYWRsb2NrIG9uCisJCQkgKiBjb3B5aW5nIGZyb20gdGhlIHNhbWUgcGFnZSBhcyB3ZSdyZSB3cml0aW5nIHRvLAorCQkJICogd2l0aG91dCBpdCBiZWluZyBtYXJrZWQgdXAtdG8tZGF0ZS4KKwkJCSAqLworCQkJZmF1bHRfaW5fcGFnZXNfcmVhZGFibGUoYnVmLCBieXRlcyk7CisJCX0KIAkJcGFnZSA9IF9fZ3JhYl9jYWNoZV9wYWdlKG1hcHBpbmcsaW5kZXgsJmNhY2hlZF9wYWdlLCZscnVfcHZlYyk7CiAJCWlmICghcGFnZSkgewogCQkJc3RhdHVzID0gLUVOT01FTTsKZGlmZiAtLWdpdCBhL21tL21pbmNvcmUuYyBiL21tL21pbmNvcmUuYwppbmRleCA5NWM1ZjQ5Li41ZWZlMGRlIDEwMDY0NAotLS0gYS9tbS9taW5jb3JlLmMKKysrIGIvbW0vbWluY29yZS5jCkBAIC03Nyw4ICs3NywxNiBAQAogCSAqIFBURSBhcnJheSBmb3Igb3VyIGFkZHJlc3MuCiAJICovCiAJbnIgPSBQVFJTX1BFUl9QVEUgLSAoKGFkZHIgPj4gUEFHRV9TSElGVCkgJiAoUFRSU19QRVJfUFRFLTEpKTsKLQlpZiAobnIgPiBwYWdlcykKLQkJbnIgPSBwYWdlczsKKworCS8qCisJICogRG9uJ3Qgb3ZlcnJ1biB0aGlzIHZtYQorCSAqLworCW5yID0gbWluKG5yLCAodm1hLT52bV9lbmQgLSBhZGRyKSA+PiBQQUdFX1NISUZUKTsKKworCS8qCisJICogRG9uJ3QgcmV0dXJuIG1vcmUgdGhhbiB0aGUgY2FsbGVyIGFza2VkIGZvcgorCSAqLworCW5yID0gbWluKG5yLCBwYWdlcyk7CiAKIAlwZ2QgPSBwZ2Rfb2Zmc2V0KHZtYS0+dm1fbW0sIGFkZHIpOwogCWlmIChwZ2Rfbm9uZV9vcl9jbGVhcl9iYWQocGdkKSkKQEAgLTExNiwxMCArMTI0LDE3IEBACiAJCQkJLyogbWlncmF0aW9uIGVudHJpZXMgYXJlIGFsd2F5cyB1cHRvZGF0ZSAqLwogCQkJCXByZXNlbnQgPSAxOwogCQkJfSBlbHNlIHsKKyNpZmRlZiBDT05GSUdfU1dBUAogCQkJCXBnb2ZmID0gZW50cnkudmFsOwogCQkJCXByZXNlbnQgPSBtaW5jb3JlX3BhZ2UoJnN3YXBwZXJfc3BhY2UsIHBnb2ZmKTsKKyNlbHNlCisJCQkJV0FSTl9PTigxKTsKKwkJCQlwcmVzZW50ID0gMTsKKyNlbmRpZgogCQkJfQogCQl9CisKKwkJdmVjW2ldID0gcHJlc2VudDsKIAl9CiAJcHRlX3VubWFwX3VubG9jayhwdGVwLTEsIHB0bCk7CiAKQEAgLTEzMCw2ICsxNDUsOSBAQAogCQlwZ29mZiA9IGxpbmVhcl9wYWdlX2luZGV4KHZtYSwgYWRkcik7CiAJCWZvciAoaSA9IDA7IGkgPCBucjsgaSsrLCBwZ29mZisrKQogCQkJdmVjW2ldID0gbWluY29yZV9wYWdlKHZtYS0+dm1fZmlsZS0+Zl9tYXBwaW5nLCBwZ29mZik7CisJfSBlbHNlIHsKKwkJZm9yIChpID0gMDsgaSA8IG5yOyBpKyspCisJCQl2ZWNbaV0gPSAwOwogCX0KIAogCXJldHVybiBucjsK