ZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1jYWNoZV9kaXNhYmxlIGIvRG9jdW1lbnRhdGlvbi9BQkkvdGVzdGluZy9zeXNmcy1kZXZpY2VzLWNhY2hlX2Rpc2FibGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc1YmI0ZgotLS0gL2Rldi9udWxsCisrKyBiL0RvY3VtZW50YXRpb24vQUJJL3Rlc3Rpbmcvc3lzZnMtZGV2aWNlcy1jYWNoZV9kaXNhYmxlCkBAIC0wLDAgKzEsMTggQEAKK1doYXQ6ICAgICAgL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1Ki9jYWNoZS9pbmRleCovY2FjaGVfZGlzYWJsZV9YCitEYXRlOiAgICAgIEF1Z3VzdCAyMDA4CitLZXJuZWxWZXJzaW9uOgkyLjYuMjcKK0NvbnRhY3Q6CW1hcmsubGFuZ3Nkb3JmQGFtZC5jb20KK0Rlc2NyaXB0aW9uOglUaGVzZSBmaWxlcyBleGlzdCBpbiBldmVyeSBjcHUncyBjYWNoZSBpbmRleCBkaXJlY3Rvcmllcy4KKwkJVGhlcmUgYXJlIGN1cnJlbnRseSAyIGNhY2hlX2Rpc2FibGVfIyBmaWxlcyBpbiBlYWNoCisJCWRpcmVjdG9yeS4gIFJlYWRpbmcgZnJvbSB0aGVzZSBmaWxlcyBvbiBhIHN1cHBvcnRlZAorCQlwcm9jZXNzb3Igd2lsbCByZXR1cm4gdGhhdCBjYWNoZSBkaXNhYmxlIGluZGV4IHZhbHVlCisJCWZvciB0aGF0IHByb2Nlc3NvciBhbmQgbm9kZS4gIFdyaXRpbmcgdG8gb25lIG9mIHRoZXNlCisJCWZpbGVzIHdpbGwgY2F1c2UgdGhlIHNwZWNpZmljZWQgY2FjaGUgaW5kZXggdG8gYmUgZGlzYWJsZWQuCisKKwkJQ3VycmVudGx5LCBvbmx5IEFNRCBGYW1pbHkgMTBoIFByb2Nlc3NvcnMgc3VwcG9ydCBjYWNoZSBpbmRleAorCQlkaXNhYmxlLCBhbmQgb25seSBmb3IgdGhlaXIgTDMgY2FjaGVzLiAgU2VlIHRoZSBCSU9TIGFuZAorCQlLZXJuZWwgRGV2ZWxvcGVyJ3MgR3VpZGUgYXQKKwkJaHR0cDovL3d3dy5hbWQuY29tL3VzLWVuL2Fzc2V0cy9jb250ZW50X3R5cGUvd2hpdGVfcGFwZXJzX2FuZF90ZWNoX2RvY3MvMzExMTYtUHVibGljLUdILUJLREdfMy4yMF8yLTQtMDkucGRmCisJCWZvciBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGFuZCBvdGhlciBkZXRhaWxzIG9uIHRoZQorCQljYWNoZSBpbmRleCBkaXNhYmxlLgorVXNlcnM6ICAgIGpvYWNoaW0uZGVndWFyYUBhbWQuY29tCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0IGIvRG9jdW1lbnRhdGlvbi9ETUEtQVBJLnR4dAppbmRleCBkOWFhNDNkLi4yNWZiOGJjIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RNQS1BUEkudHh0CisrKyBiL0RvY3VtZW50YXRpb24vRE1BLUFQSS50eHQKQEAgLTcwNCwxMiArNzA0LDI0IEBACiAJCQkJVGhlIGN1cnJlbnQgbnVtYmVyIG9mIGZyZWUgZG1hX2RlYnVnX2VudHJpZXMKIAkJCQlpbiB0aGUgYWxsb2NhdG9yLgogCisJZG1hLWFwaS9kcml2ZXItZmlsdGVyCisJCQkJWW91IGNhbiB3cml0ZSBhIG5hbWUgb2YgYSBkcml2ZXIgaW50byB0aGlzIGZpbGUKKwkJCQl0byBsaW1pdCB0aGUgZGVidWcgb3V0cHV0IHRvIHJlcXVlc3RzIGZyb20gdGhhdAorCQkJCXBhcnRpY3VsYXIgZHJpdmVyLiBXcml0ZSBhbiBlbXB0eSBzdHJpbmcgdG8KKwkJCQl0aGF0IGZpbGUgdG8gZGlzYWJsZSB0aGUgZmlsdGVyIGFuZCBzZWUKKwkJCQlhbGwgZXJyb3JzIGFnYWluLgorCiBJZiB5b3UgaGF2ZSB0aGlzIGNvZGUgY29tcGlsZWQgaW50byB5b3VyIGtlcm5lbCBpdCB3aWxsIGJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KIElmIHlvdSB3YW50IHRvIGJvb3Qgd2l0aG91dCB0aGUgYm9va2tlZXBpbmcgYW55d2F5IHlvdSBjYW4gcHJvdmlkZQogJ2RtYV9kZWJ1Zz1vZmYnIGFzIGEgYm9vdCBwYXJhbWV0ZXIuIFRoaXMgd2lsbCBkaXNhYmxlIERNQS1BUEkgZGVidWdnaW5nLgogTm90aWNlIHRoYXQgeW91IGNhbiBub3QgZW5hYmxlIGl0IGFnYWluIGF0IHJ1bnRpbWUuIFlvdSBoYXZlIHRvIHJlYm9vdCB0byBkbwogc28uCiAKK0lmIHlvdSB3YW50IHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcyBvbmx5IGZvciBhIHNwZWNpYWwgZGV2aWNlIGRyaXZlciB5b3UgY2FuCitzcGVjaWZ5IHRoZSBkbWFfZGVidWdfZHJpdmVyPTxkcml2ZXJuYW1lPiBwYXJhbWV0ZXIuIFRoaXMgd2lsbCBlbmFibGUgdGhlCitkcml2ZXIgZmlsdGVyIGF0IGJvb3QgdGltZS4gVGhlIGRlYnVnIGNvZGUgd2lsbCBvbmx5IHByaW50IGVycm9ycyBmb3IgdGhhdAorZHJpdmVyIGFmdGVyd2FyZHMuIFRoaXMgZmlsdGVyIGNhbiBiZSBkaXNhYmxlZCBvciBjaGFuZ2VkIGxhdGVyIHVzaW5nIGRlYnVnZnMuCisKIFdoZW4gdGhlIGNvZGUgZGlzYWJsZXMgaXRzZWxmIGF0IHJ1bnRpbWUgdGhpcyBpcyBtb3N0IGxpa2VseSBiZWNhdXNlIGl0IHJhbgogb3V0IG9mIGRtYV9kZWJ1Z19lbnRyaWVzLiBUaGVzZSBlbnRyaWVzIGFyZSBwcmVhbGxvY2F0ZWQgYXQgYm9vdC4gVGhlIG51bWJlcgogb2YgcHJlYWxsb2NhdGVkIGVudHJpZXMgaXMgZGVmaW5lZCBwZXIgYXJjaGl0ZWN0dXJlLiBJZiBpdCBpcyB0b28gbG93IGZvciB5b3UKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZSBiL0RvY3VtZW50YXRpb24vRG9jQm9vay9NYWtlZmlsZQppbmRleCBiMWViNjYxLi45NjMyNDQ0IDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svTWFrZWZpbGUKKysrIGIvRG9jdW1lbnRhdGlvbi9Eb2NCb29rL01ha2VmaWxlCkBAIC0xMyw3ICsxMyw4IEBACiAJICAgIGdhZGdldC54bWwgbGliYXRhLnhtbCBtdGRuYW5kLnhtbCBsaWJycy54bWwgcmFwaWRpby54bWwgXAogCSAgICBnZW5lcmljaXJxLnhtbCBzMzkwLWRyaXZlcnMueG1sIHVpby1ob3d0by54bWwgc2NzaS54bWwgXAogCSAgICBtYWM4MDIxMS54bWwgZGVidWdvYmplY3RzLnhtbCBzaC54bWwgcmVndWxhdG9yLnhtbCBcCi0JICAgIGFsc2EtZHJpdmVyLWFwaS54bWwgd3JpdGluZy1hbi1hbHNhLWRyaXZlci54bWwKKwkgICAgYWxzYS1kcml2ZXItYXBpLnhtbCB3cml0aW5nLWFuLWFsc2EtZHJpdmVyLnhtbCBcCisJICAgIHRyYWNlcG9pbnQueG1sCiAKICMjIwogIyBUaGUgYnVpbGQgcHJvY2VzcyBpcyBhcyBmb2xsb3dzICh0YXJnZXRzKToKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vRG9jQm9vay90cmFjZXBvaW50LnRtcGwgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdHJhY2Vwb2ludC50bXBsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzU2ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL0RvY0Jvb2svdHJhY2Vwb2ludC50bXBsCkBAIC0wLDAgKzEsODkgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IURPQ1RZUEUgYm9vayBQVUJMSUMgIi0vL09BU0lTLy9EVEQgRG9jQm9vayBYTUwgVjQuMS4yLy9FTiIKKwkiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFtdPgorCis8Ym9vayBpZD0iVHJhY2Vwb2ludHMiPgorIDxib29raW5mbz4KKyAgPHRpdGxlPlRoZSBMaW51eCBLZXJuZWwgVHJhY2Vwb2ludCBBUEk8L3RpdGxlPgorCisgIDxhdXRob3Jncm91cD4KKyAgIDxhdXRob3I+CisgICAgPGZpcnN0bmFtZT5KYXNvbjwvZmlyc3RuYW1lPgorICAgIDxzdXJuYW1lPkJhcm9uPC9zdXJuYW1lPgorICAgIDxhZmZpbGlhdGlvbj4KKyAgICAgPGFkZHJlc3M+CisgICAgICA8ZW1haWw+amJhcm9uQHJlZGhhdC5jb208L2VtYWlsPgorICAgICA8L2FkZHJlc3M+CisgICAgPC9hZmZpbGlhdGlvbj4KKyAgIDwvYXV0aG9yPgorICA8L2F1dGhvcmdyb3VwPgorCisgIDxsZWdhbG5vdGljZT4KKyAgIDxwYXJhPgorICAgICBUaGlzIGRvY3VtZW50YXRpb24gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUKKyAgICAgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICAgICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKKyAgICAgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlcgorICAgICB2ZXJzaW9uLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZQorICAgICB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkCisgICAgIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4KKyAgICAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICAgPC9wYXJhPgorCisgICA8cGFyYT4KKyAgICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCisgICAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAgICAgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKKyAgICAgTUEgMDIxMTEtMTMwNyBVU0EKKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIEZvciBtb3JlIGRldGFpbHMgc2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIHNvdXJjZQorICAgICBkaXN0cmlidXRpb24gb2YgTGludXguCisgICA8L3BhcmE+CisgIDwvbGVnYWxub3RpY2U+CisgPC9ib29raW5mbz4KKworIDx0b2M+PC90b2M+CisgIDxjaGFwdGVyIGlkPSJpbnRybyI+CisgICA8dGl0bGU+SW50cm9kdWN0aW9uPC90aXRsZT4KKyAgIDxwYXJhPgorICAgICBUcmFjZXBvaW50cyBhcmUgc3RhdGljIHByb2JlIHBvaW50cyB0aGF0IGFyZSBsb2NhdGVkIGluIHN0cmF0ZWdpYyBwb2ludHMKKyAgICAgdGhyb3VnaG91dCB0aGUga2VybmVsLiAnUHJvYmVzJyByZWdpc3Rlci91bnJlZ2lzdGVyIHdpdGggdHJhY2Vwb2ludHMKKyAgICAgdmlhIGEgY2FsbGJhY2sgbWVjaGFuaXNtLiBUaGUgJ3Byb2JlcycgYXJlIHN0cmljdGx5IHR5cGVkIGZ1bmN0aW9ucyB0aGF0CisgICAgIGFyZSBwYXNzZWQgYSB1bmlxdWUgc2V0IG9mIHBhcmFtZXRlcnMgZGVmaW5lZCBieSBlYWNoIHRyYWNlcG9pbnQuCisgICA8L3BhcmE+CisKKyAgIDxwYXJhPgorICAgICBGcm9tIHRoaXMgc2ltcGxlIGNhbGxiYWNrIG1lY2hhbmlzbSwgJ3Byb2JlcycgY2FuIGJlIHVzZWQgdG8gcHJvZmlsZSwgZGVidWcsCisgICAgIGFuZCB1bmRlcnN0YW5kIGtlcm5lbCBiZWhhdmlvci4gVGhlcmUgYXJlIGEgbnVtYmVyIG9mIHRvb2xzIHRoYXQgcHJvdmlkZSBhCisgICAgIGZyYW1ld29yayBmb3IgdXNpbmcgJ3Byb2JlcycuIFRoZXNlIHRvb2xzIGluY2x1ZGUgU3lzdGVtdGFwLCBmdHJhY2UsIGFuZAorICAgICBMVFRuZy4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIFRyYWNlcG9pbnRzIGFyZSBkZWZpbmVkIGluIGEgbnVtYmVyIG9mIGhlYWRlciBmaWxlcyB2aWEgdmFyaW91cyBtYWNyb3MuIFRodXMsCisgICAgIHRoZSBwdXJwb3NlIG9mIHRoaXMgZG9jdW1lbnQgaXMgdG8gcHJvdmlkZSBhIGNsZWFyIGFjY291bnRpbmcgb2YgdGhlIGF2YWlsYWJsZQorICAgICB0cmFjZXBvaW50cy4gVGhlIGludGVudGlvbiBpcyB0byB1bmRlcnN0YW5kIG5vdCBvbmx5IHdoYXQgdHJhY2Vwb2ludHMgYXJlCisgICAgIGF2YWlsYWJsZSBidXQgYWxzbyB0byB1bmRlcnN0YW5kIHdoZXJlIGZ1dHVyZSB0cmFjZXBvaW50cyBtaWdodCBiZSBhZGRlZC4KKyAgIDwvcGFyYT4KKworICAgPHBhcmE+CisgICAgIFRoZSBBUEkgcHJlc2VudGVkIGhhcyBmdW5jdGlvbnMgb2YgdGhlIGZvcm06CisgICAgIDxmdW5jdGlvbj50cmFjZV90cmFjZXBvaW50bmFtZShmdW5jdGlvbiBwYXJhbWV0ZXJzKTwvZnVuY3Rpb24+LiBUaGVzZSBhcmUgdGhlCisgICAgIHRyYWNlcG9pbnRzIGNhbGxiYWNrcyB0aGF0IGFyZSBmb3VuZCB0aHJvdWdob3V0IHRoZSBjb2RlLiBSZWdpc3RlcmluZyBhbmQKKyAgICAgdW5yZWdpc3RlcmluZyBwcm9iZXMgd2l0aCB0aGVzZSBjYWxsYmFjayBzaXRlcyBpcyBjb3ZlcmVkIGluIHRoZQorICAgICA8ZmlsZW5hbWU+RG9jdW1lbnRhdGlvbi90cmFjZS8qPC9maWxlbmFtZT4gZGlyZWN0b3J5LgorICAgPC9wYXJhPgorICA8L2NoYXB0ZXI+CisKKyAgPGNoYXB0ZXIgaWQ9ImlycSI+CisgICA8dGl0bGU+SVJRPC90aXRsZT4KKyFJaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmgKKyAgPC9jaGFwdGVyPgorCis8L2Jvb2s+CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL1JDVS90cmFjZS50eHQKaW5kZXggMDY4ODQ4Mi4uMDJjY2VkMSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9SQ1UvdHJhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vUkNVL3RyYWNlLnR4dApAQCAtMTkyLDIzICsxOTIsMjQgQEAKIFRoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1ZGF0YSIgbG9va3MgYXMgZm9sbG93czoKIAogcmN1OgotICAwIGM9NDAxMSBnPTQwMTIgcHE9MSBwcWM9NDAxMSBxcD0wIHJwZnE9MSBycD0zYzJhIGR0PTIzMzAxLzczIGRuPTIgZGY9MTg4MiBvZj0wIHJpPTIxMjYgcWw9MiBiPTEwCi0gIDEgYz00MDExIGc9NDAxMiBwcT0xIHBxYz00MDExIHFwPTAgcnBmcT0zIHJwPTM5YTYgZHQ9NzgwNzMvMSBkbj0yIGRmPTE0MDIgb2Y9MCByaT0xODc1IHFsPTQ2IGI9MTAKLSAgMiBjPTQwMTAgZz00MDEwIHBxPTEgcHFjPTQwMTAgcXA9MCBycGZxPS01IHJwPTFkMTIgZHQ9MTY2NDYvMCBkbj0yIGRmPTMxNDAgb2Y9MCByaT0yMDgwIHFsPTAgYj0xMAotICAzIGM9NDAxMiBnPTQwMTMgcHE9MSBwcWM9NDAxMiBxcD0xIHJwZnE9MyBycD0yYjUwIGR0PTIxMTU5LzEgZG49MiBkZj0yMjMwIG9mPTAgcmk9MTkyMyBxbD03MiBiPTEwCi0gIDQgYz00MDEyIGc9NDAxMyBwcT0xIHBxYz00MDEyIHFwPTEgcnBmcT0zIHJwPTE2NDQgZHQ9NTc4My8xIGRuPTIgZGY9MzM0OCBvZj0wIHJpPTI4MDUgcWw9NyBiPTEwCi0gIDUgYz00MDEyIGc9NDAxMyBwcT0wIHBxYz00MDExIHFwPTEgcnBmcT0zIHJwPTFhYWMgZHQ9NTg3OS8xIGRuPTIgZGY9MzE0MCBvZj0wIHJpPTIwNjYgcWw9MTAgYj0xMAotICA2IGM9NDAxMiBnPTQwMTMgcHE9MSBwcWM9NDAxMiBxcD0xIHJwZnE9MyBycD1lZDggZHQ9NTg0Ny8xIGRuPTIgZGY9Mzc5NyBvZj0wIHJpPTEyNjYgcWw9MTAgYj0xMAotICA3IGM9NDAxMiBnPTQwMTMgcHE9MSBwcWM9NDAxMiBxcD0xIHJwZnE9MyBycD0xZmEyIGR0PTYxOTkvMSBkbj0yIGRmPTI3OTUgb2Y9MCByaT0yMTYyIHFsPTI4IGI9MTAKK3JjdToKKyAgMCBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD0xMDk1MS8xIGRuPTAgZGY9MTEwMSBvZj0wIHJpPTM2IHFsPTAgYj0xMAorICAxIGM9MTc4MjkgZz0xNzgyOSBwcT0xIHBxYz0xNzgyOSBxcD0wIGR0PTE2MTE3LzEgZG49MCBkZj0xMDE1IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgMiBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD0xNDQ1LzEgZG49MCBkZj0xODM5IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgMyBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD02NjgxLzEgZG49MCBkZj0xNTQ1IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgNCBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD0xMDAzLzEgZG49MCBkZj0xOTkyIG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgNSBjPTE3ODI5IGc9MTc4MzAgcHE9MSBwcWM9MTc4MjkgcXA9MSBkdD0zODg3LzEgZG49MCBkZj0zMzMxIG9mPTAgcmk9NCBxbD0yIGI9MTAKKyAgNiBjPTE3ODI5IGc9MTc4MjkgcHE9MSBwcWM9MTc4MjkgcXA9MCBkdD04NTkvMSBkbj0wIGRmPTMyMjQgb2Y9MCByaT0wIHFsPTAgYj0xMAorICA3IGM9MTc4MjkgZz0xNzgzMCBwcT0wIHBxYz0xNzgyOSBxcD0xIGR0PTM3NjEvMSBkbj0wIGRmPTE4MTggb2Y9MCByaT0wIHFsPTIgYj0xMAogcmN1X2JoOgotICAwIGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0wIHJwZnE9LTE0NSBycD0yMWQ2IGR0PTIzMzAxLzczIGRuPTIgZGY9MCBvZj0wIHJpPTAgcWw9MCBiPTEwCi0gIDEgYz0tMjY4IGc9LTI2OCBwcT0xIHBxYz0tMjY4IHFwPTEgcnBmcT0tMTcwIHJwPTIwY2UgZHQ9NzgwNzMvMSBkbj0yIGRmPTI2IG9mPTAgcmk9NSBxbD0wIGI9MTAKLSAgMiBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MSBycGZxPS04MyBycD1mYmQgZHQ9MTY2NDYvMCBkbj0yIGRmPTI4IG9mPTAgcmk9NCBxbD0wIGI9MTAKLSAgMyBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MCBycGZxPS0xMDUgcnA9MTc4YyBkdD0yMTE1OS8xIGRuPTIgZGY9Mjggb2Y9MCByaT0yIHFsPTAgYj0xMAotICA0IGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0xIHJwZnE9LTMwIHJwPWI1NCBkdD01NzgzLzEgZG49MiBkZj0zMiBvZj0wIHJpPTAgcWw9MCBiPTEwCi0gIDUgYz0tMjY4IGc9LTI2OCBwcT0xIHBxYz0tMjY4IHFwPTEgcnBmcT0tMjkgcnA9ZGY1IGR0PTU4NzkvMSBkbj0yIGRmPTMwIG9mPTAgcmk9MyBxbD0wIGI9MTAKLSAgNiBjPS0yNjggZz0tMjY4IHBxPTEgcHFjPS0yNjggcXA9MSBycGZxPS0yOCBycD03ODggZHQ9NTg0Ny8xIGRuPTIgZGY9MzIgb2Y9MCByaT0wIHFsPTAgYj0xMAotICA3IGM9LTI2OCBnPS0yNjggcHE9MSBwcWM9LTI2OCBxcD0xIHJwZnE9LTUzIHJwPTEwOTggZHQ9NjE5OS8xIGRuPTIgZGY9MzAgb2Y9MCByaT0zIHFsPTAgYj0xMAorICAwIGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTEwOTUxLzEgZG49MCBkZj0wIG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgMSBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD0xNjExNy8xIGRuPTAgZGY9MTMgb2Y9MCByaT0wIHFsPTAgYj0xMAorICAyIGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTE0NDUvMSBkbj0wIGRmPTE1IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgMyBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD02NjgxLzEgZG49MCBkZj05IG9mPTAgcmk9MCBxbD0wIGI9MTAKKyAgNCBjPS0yNzUgZz0tMjc1IHBxPTEgcHFjPS0yNzUgcXA9MCBkdD0xMDAzLzEgZG49MCBkZj0xNSBvZj0wIHJpPTAgcWw9MCBiPTEwCisgIDUgYz0tMjc1IGc9LTI3NSBwcT0xIHBxYz0tMjc1IHFwPTAgZHQ9Mzg4Ny8xIGRuPTAgZGY9MTUgb2Y9MCByaT0wIHFsPTAgYj0xMAorICA2IGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTg1OS8xIGRuPTAgZGY9MTUgb2Y9MCByaT0wIHFsPTAgYj0xMAorICA3IGM9LTI3NSBnPS0yNzUgcHE9MSBwcWM9LTI3NSBxcD0wIGR0PTM3NjEvMSBkbj0wIGRmPTE1IG9mPTAgcmk9MCBxbD0wIGI9MTAKIAogVGhlIGZpcnN0IHNlY3Rpb24gbGlzdHMgdGhlIHJjdV9kYXRhIHN0cnVjdHVyZXMgZm9yIHJjdSwgdGhlIHNlY29uZCBmb3IKIHJjdV9iaC4gIEVhY2ggc2VjdGlvbiBoYXMgb25lIGxpbmUgcGVyIENQVSwgb3IgZWlnaHQgZm9yIHRoaXMgOC1DUFUgc3lzdGVtLgpAQCAtMjUzLDEyICsyNTQsNiBAQAogbwkicXAiIGluZGljYXRlcyB0aGF0IFJDVSBzdGlsbCBleHBlY3RzIGEgcXVpZXNjZW50IHN0YXRlIGZyb20KIAl0aGlzIENQVS4KIAotbwkicnBmcSIgaXMgdGhlIG51bWJlciBvZiByY3VfcGVuZGluZygpIGNhbGxzIG9uIHRoaXMgQ1BVIHJlcXVpcmVkCi0JdG8gaW5kdWNlIHRoaXMgQ1BVIHRvIGludm9rZSBmb3JjZV9xdWllc2NlbnRfc3RhdGUoKS4KLQotbwkicnAiIGlzIGxvdy1vcmRlciBmb3VyIGhleCBkaWdpdHMgb2YgdGhlIGNvdW50IG9mIGhvdyBtYW55IHRpbWVzCi0JcmN1X3BlbmRpbmcoKSBoYXMgYmVlbiBpbnZva2VkIG9uIHRoaXMgQ1BVLgotCiBvCSJkdCIgaXMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGR5bnRpY2sgY291bnRlciB0aGF0IGlzIGluY3JlbWVudGVkCiAJd2hlbiBlbnRlcmluZyBvciBsZWF2aW5nIGR5bnRpY2tzIGlkbGUgc3RhdGUsIGVpdGhlciBieSB0aGUKIAlzY2hlZHVsZXIgb3IgYnkgaXJxLiAgVGhlIG51bWJlciBhZnRlciB0aGUgIi8iIGlzIHRoZSBpbnRlcnJ1cHQKQEAgLTMwNSw2ICszMDAsOSBAQAogCW9mIFJDVSBjYWxsYmFja3MgaXMgcmVhZHkgdG8gaW52b2tlLCB0aGVuIHRoZSByZW1haW5kZXIgd2lsbAogCWJlIGRlZmVycmVkLgogCitUaGVyZSBpcyBhbHNvIGFuIHJjdS9yY3VkYXRhLmNzdiBmaWxlIHdpdGggdGhlIHNhbWUgaW5mb3JtYXRpb24gaW4KK2NvbW1hLXNlcGFyYXRlZC12YXJpYWJsZSBzcHJlYWRzaGVldCBmb3JtYXQuCisKIAogVGhlIG91dHB1dCBvZiAiY2F0IHJjdS9yY3VncCIgbG9va3MgYXMgZm9sbG93czoKIApAQCAtNDExLDMgKzQwOSw2MyBAQAogCQlGb3IgZXhhbXBsZSwgdGhlIGZpcnN0IGVudHJ5IGF0IHRoZSBsb3dlc3QgbGV2ZWwgc2hvd3MKIAkJIl4wIiwgaW5kaWNhdGluZyB0aGF0IGl0IGNvcnJlc3BvbmRzIHRvIGJpdCB6ZXJvIGluCiAJCXRoZSBmaXJzdCBlbnRyeSBhdCB0aGUgbWlkZGxlIGxldmVsLgorCisKK1RoZSBvdXRwdXQgb2YgImNhdCByY3UvcmN1X3BlbmRpbmciIGxvb2tzIGFzIGZvbGxvd3M6CisKK3JjdToKKyAgMCBucD0yNTU4OTIgcXNwPTUzOTM2IGNicj0wIGNuZz0xNDQxNyBncGM9MTAwMzMgZ3BzPTI0MzIwIG5mPTY0NDUgbm49MTQ2NzQxCisgIDEgbnA9MjYxMjI0IHFzcD01NDYzOCBjYnI9MCBjbmc9MjU3MjMgZ3BjPTE2MzEwIGdwcz0yODQ5IG5mPTU5MTIgbm49MTU1NzkyCisgIDIgbnA9MjM3NDk2IHFzcD00OTY2NCBjYnI9MCBjbmc9Mjc2MiBncGM9NDU0NzggZ3BzPTE3NjIgbmY9MTIwMSBubj0xMzY2MjkKKyAgMyBucD0yMzYyNDkgcXNwPTQ4NzY2IGNicj0wIGNuZz0yODYgZ3BjPTQ4MDQ5IGdwcz0xMjE4IG5mPTIwNyBubj0xMzc3MjMKKyAgNCBucD0yMjEzMTAgcXNwPTQ2ODUwIGNicj0wIGNuZz0yNiBncGM9NDMxNjEgZ3BzPTQ2MzQgbmY9MzUyOSBubj0xMjMxMTAKKyAgNSBucD0yMzczMzIgcXNwPTQ4NDQ5IGNicj0wIGNuZz01NCBncGM9NDc5MjAgZ3BzPTMyNTIgbmY9MjAxIG5uPTEzNzQ1NgorICA2IG5wPTIxOTk5NSBxc3A9NDY3MTggY2JyPTAgY25nPTUwIGdwYz00MjA5OCBncHM9NjA5MyBuZj00MjAyIG5uPTEyMDgzNAorICA3IG5wPTI0OTg5MyBxc3A9NDkzOTAgY2JyPTAgY25nPTcyIGdwYz0zODQwMCBncHM9MTcxMDIgbmY9NDEgbm49MTQ0ODg4CityY3VfYmg6CisgIDAgbnA9MTQ2NzQxIHFzcD0xNDE5IGNicj0wIGNuZz02IGdwYz0wIGdwcz0wIG5mPTIgbm49MTQ1MzE0CisgIDEgbnA9MTU1NzkyIHFzcD0xMjU5NyBjYnI9MCBjbmc9MCBncGM9NCBncHM9OCBuZj0zIG5uPTE0MzE4MAorICAyIG5wPTEzNjYyOSBxc3A9MTg2ODAgY2JyPTAgY25nPTAgZ3BjPTcgZ3BzPTYgbmY9MCBubj0xMTc5MzYKKyAgMyBucD0xMzc3MjMgcXNwPTI4NDMgY2JyPTAgY25nPTAgZ3BjPTEwIGdwcz03IG5mPTAgbm49MTM0ODYzCisgIDQgbnA9MTIzMTEwIHFzcD0xMjQzMyBjYnI9MCBjbmc9MCBncGM9NCBncHM9MiBuZj0wIG5uPTExMDY3MQorICA1IG5wPTEzNzQ1NiBxc3A9NDIxMCBjYnI9MCBjbmc9MCBncGM9NiBncHM9NSBuZj0wIG5uPTEzMzIzNQorICA2IG5wPTEyMDgzNCBxc3A9OTkwMiBjYnI9MCBjbmc9MCBncGM9NiBncHM9MyBuZj0yIG5uPTExMDkyMQorICA3IG5wPTE0NDg4OCBxc3A9MjYzMzYgY2JyPTAgY25nPTAgZ3BjPTggZ3BzPTIgbmY9MCBubj0xMTg1NDIKKworQXMgYWx3YXlzLCB0aGlzIGlzIG9uY2UgYWdhaW4gc3BsaXQgaW50byAicmN1IiBhbmQgInJjdV9iaCIgcG9ydGlvbnMuCitUaGUgZmllbGRzIGFyZSBhcyBmb2xsb3dzOgorCitvCSJucCIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IF9fcmN1X3BlbmRpbmcoKSBoYXMgYmVlbiBpbnZva2VkCisJZm9yIHRoZSBjb3JyZXNwb25kaW5nIGZsYXZvciBvZiBSQ1UuCisKK28JInFzcCIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoZSBSQ1Ugd2FzIHdhaXRpbmcgZm9yIGEKKwlxdWllc2NlbnQgc3RhdGUgZnJvbSB0aGlzIENQVS4KKworbwkiY2JyIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhpcyBDUFUgaGFkIFJDVSBjYWxsYmFja3MKKwl0aGF0IGhhZCBwYXNzZWQgdGhyb3VnaCBhIGdyYWNlIHBlcmlvZCwgYW5kIHdlcmUgdGh1cyByZWFkeQorCXRvIGJlIGludm9rZWQuCisKK28JImNuZyIgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IHRoaXMgQ1BVIG5lZWRlZCBhbm90aGVyCisJZ3JhY2UgcGVyaW9kIHdoaWxlIFJDVSB3YXMgaWRsZS4KKworbwkiZ3BjIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYW4gb2xkIGdyYWNlIHBlcmlvZCBoYWQKKwljb21wbGV0ZWQsIGJ1dCB0aGlzIENQVSB3YXMgbm90IHlldCBhd2FyZSBvZiBpdC4KKworbwkiZ3BzIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYSBuZXcgZ3JhY2UgcGVyaW9kIGhhZCBzdGFydGVkLAorCWJ1dCB0aGlzIENQVSB3YXMgbm90IHlldCBhd2FyZSBvZiBpdC4KKworbwkibmYiIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGlzIENQVSBzdXNwZWN0ZWQgdGhhdCB0aGUKKwljdXJyZW50IGdyYWNlIHBlcmlvZCBoYWQgcnVuIGZvciB0b28gbG9uZywgYW5kIHRodXMgbmVlZGVkIHRvCisJYmUgZm9yY2VkLgorCisJUGxlYXNlIG5vdGUgdGhhdCAiZm9yY2luZyIgY29uc2lzdHMgb2Ygc2VuZGluZyByZXNjaGVkIElQSXMKKwl0byBob2xkb3V0IENQVXMuICBJZiB0aGF0IENQVSByZWFsbHkgc3RpbGwgaXMgaW4gYW4gb2xkIFJDVQorCXJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLCB0aGVuIHdlIHJlYWxseSBkbyBoYXZlIHRvIHdhaXQgZm9yIGl0LgorCVRoZSBhc3N1bXB0aW9uIGJlaGluZyAiZm9yY2luZyIgaXMgdGhhdCB0aGUgQ1BVIGlzIG5vdCBzdGlsbCBpbgorCWFuIG9sZCBSQ1UgcmVhZC1zaWRlIGNyaXRpY2FsIHNlY3Rpb24sIGJ1dCBoYXMgbm90IHlldCByZXNwb25kZWQKKwlmb3Igc29tZSBvdGhlciByZWFzb24uCisKK28JIm5uIiBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgdGhpcyBDUFUgbmVlZGVkIG5vdGhpbmcuICBBbGVydAorCXJlYWRlcnMgd2lsbCBub3RlIHRoYXQgdGhlIHJjdSAibm4iIG51bWJlciBmb3IgYSBnaXZlbiBDUFUgdmVyeQorCWNsb3NlbHkgbWF0Y2hlcyB0aGUgcmN1X2JoICJucCIgbnVtYmVyIGZvciB0aGF0IHNhbWUgQ1BVLiAgVGhpcworCWlzIGR1ZSB0byBzaG9ydC1jaXJjdWl0IGV2YWx1YXRpb24gaW4gcmN1X3BlbmRpbmcoKS4KZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vZnV0ZXgtcmVxdWV1ZS1waS50eHQgYi9Eb2N1bWVudGF0aW9uL2Z1dGV4LXJlcXVldWUtcGkudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzFmZjQKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL2Z1dGV4LXJlcXVldWUtcGkudHh0CkBAIC0wLDAgKzEsMTMxIEBACitGdXRleCBSZXF1ZXVlIFBJCistLS0tLS0tLS0tLS0tLS0tCisKK1JlcXVldWVpbmcgb2YgdGFza3MgZnJvbSBhIG5vbi1QSSBmdXRleCB0byBhIFBJIGZ1dGV4IHJlcXVpcmVzCitzcGVjaWFsIGhhbmRsaW5nIGluIG9yZGVyIHRvIGVuc3VyZSB0aGUgdW5kZXJseWluZyBydF9tdXRleCBpcyBuZXZlcgorbGVmdCB3aXRob3V0IGFuIG93bmVyIGlmIGl0IGhhcyB3YWl0ZXJzOyBkb2luZyBzbyB3b3VsZCBicmVhayB0aGUgUEkKK2Jvb3N0aW5nIGxvZ2ljIFtzZWUgcnQtbXV0ZXgtZGVzZ2luLnR4dF0gRm9yIHRoZSBwdXJwb3NlcyBvZgorYnJldml0eSwgdGhpcyBhY3Rpb24gd2lsbCBiZSByZWZlcnJlZCB0byBhcyAicmVxdWV1ZV9waSIgdGhyb3VnaG91dAordGhpcyBkb2N1bWVudC4gIFByaW9yaXR5IGluaGVyaXRhbmNlIGlzIGFiYnJldmlhdGVkIHRocm91Z2hvdXQgYXMKKyJQSSIuCisKK01vdGl2YXRpb24KKy0tLS0tLS0tLS0KKworV2l0aG91dCByZXF1ZXVlX3BpLCB0aGUgZ2xpYmMgaW1wbGVtZW50YXRpb24gb2YKK3B0aHJlYWRfY29uZF9icm9hZGNhc3QoKSBtdXN0IHJlc29ydCB0byB3YWtpbmcgYWxsIHRoZSB0YXNrcyB3YWl0aW5nCitvbiBhIHB0aHJlYWRfY29uZHZhciBhbmQgbGV0dGluZyB0aGVtIHRyeSB0byBzb3J0IG91dCB3aGljaCB0YXNrCitnZXRzIHRvIHJ1biBmaXJzdCBpbiBjbGFzc2ljIHRodW5kZXJpbmctaGVyZCBmb3JtYXRpb24uICBBbiBpZGVhbAoraW1wbGVtZW50YXRpb24gd291bGQgd2FrZSB0aGUgaGlnaGVzdC1wcmlvcml0eSB3YWl0ZXIsIGFuZCBsZWF2ZSB0aGUKK3Jlc3QgdG8gdGhlIG5hdHVyYWwgd2FrZXVwIGluaGVyZW50IGluIHVubG9ja2luZyB0aGUgbXV0ZXgKK2Fzc29jaWF0ZWQgd2l0aCB0aGUgY29uZHZhci4KKworQ29uc2lkZXIgdGhlIHNpbXBsaWZpZWQgZ2xpYmMgY2FsbHM6CisKKy8qIGNhbGxlciBtdXN0IGxvY2sgbXV0ZXggKi8KK3B0aHJlYWRfY29uZF93YWl0KGNvbmQsIG11dGV4KQoreworCWxvY2soY29uZC0+X19kYXRhLl9fbG9jayk7CisJdW5sb2NrKG11dGV4KTsKKwlkbyB7CisJICAgdW5sb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCSAgIGZ1dGV4X3dhaXQoY29uZC0+X19kYXRhLl9fZnV0ZXgpOworCSAgIGxvY2soY29uZC0+X19kYXRhLl9fbG9jayk7CisJfSB3aGlsZSguLi4pCisJdW5sb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCWxvY2sobXV0ZXgpOworfQorCitwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KGNvbmQpCit7CisJbG9jayhjb25kLT5fX2RhdGEuX19sb2NrKTsKKwl1bmxvY2soY29uZC0+X19kYXRhLl9fbG9jayk7CisJZnV0ZXhfcmVxdWV1ZShjb25kLT5kYXRhLl9fZnV0ZXgsIGNvbmQtPm11dGV4KTsKK30KKworT25jZSBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCkgcmVxdWV1ZXMgdGhlIHRhc2tzLCB0aGUgY29uZC0+bXV0ZXgKK2hhcyB3YWl0ZXJzLiBOb3RlIHRoYXQgcHRocmVhZF9jb25kX3dhaXQoKSBhdHRlbXB0cyB0byBsb2NrIHRoZQorbXV0ZXggb25seSBhZnRlciBpdCBoYXMgcmV0dXJuZWQgdG8gdXNlciBzcGFjZS4gIFRoaXMgd2lsbCBsZWF2ZSB0aGUKK3VuZGVybHlpbmcgcnRfbXV0ZXggd2l0aCB3YWl0ZXJzLCBhbmQgbm8gb3duZXIsIGJyZWFraW5nIHRoZQorcHJldmlvdXNseSBtZW50aW9uZWQgUEktYm9vc3RpbmcgYWxnb3JpdGhtcy4KKworSW4gb3JkZXIgdG8gc3VwcG9ydCBQSS1hd2FyZSBwdGhyZWFkX2NvbmR2YXIncywgdGhlIGtlcm5lbCBuZWVkcyB0bworYmUgYWJsZSB0byByZXF1ZXVlIHRhc2tzIHRvIFBJIGZ1dGV4ZXMuICBUaGlzIHN1cHBvcnQgaW1wbGllcyB0aGF0Cit1cG9uIGEgc3VjY2Vzc2Z1bCBmdXRleF93YWl0IHN5c3RlbSBjYWxsLCB0aGUgY2FsbGVyIHdvdWxkIHJldHVybiB0bwordXNlciBzcGFjZSBhbHJlYWR5IGhvbGRpbmcgdGhlIFBJIGZ1dGV4LiAgVGhlIGdsaWJjIGltcGxlbWVudGF0aW9uCit3b3VsZCBiZSBtb2RpZmllZCBhcyBmb2xsb3dzOgorCisKKy8qIGNhbGxlciBtdXN0IGxvY2sgbXV0ZXggKi8KK3B0aHJlYWRfY29uZF93YWl0X3BpKGNvbmQsIG11dGV4KQoreworCWxvY2soY29uZC0+X19kYXRhLl9fbG9jayk7CisJdW5sb2NrKG11dGV4KTsKKwlkbyB7CisJICAgdW5sb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCSAgIGZ1dGV4X3dhaXRfcmVxdWV1ZV9waShjb25kLT5fX2RhdGEuX19mdXRleCk7CisJICAgbG9jayhjb25kLT5fX2RhdGEuX19sb2NrKTsKKwl9IHdoaWxlKC4uLikKKwl1bmxvY2soY29uZC0+X19kYXRhLl9fbG9jayk7CisgICAgICAgIC8qIHRoZSBrZXJuZWwgYWNxdWlyZWQgdGhlIHRoZSBtdXRleCBmb3IgdXMgKi8KK30KKworcHRocmVhZF9jb25kX2Jyb2FkY2FzdF9waShjb25kKQoreworCWxvY2soY29uZC0+X19kYXRhLl9fbG9jayk7CisJdW5sb2NrKGNvbmQtPl9fZGF0YS5fX2xvY2spOworCWZ1dGV4X3JlcXVldWVfcGkoY29uZC0+ZGF0YS5fX2Z1dGV4LCBjb25kLT5tdXRleCk7Cit9CisKK1RoZSBhY3R1YWwgZ2xpYmMgaW1wbGVtZW50YXRpb24gd2lsbCBsaWtlbHkgdGVzdCBmb3IgUEkgYW5kIG1ha2UgdGhlCituZWNlc3NhcnkgY2hhbmdlcyBpbnNpZGUgdGhlIGV4aXN0aW5nIGNhbGxzIHJhdGhlciB0aGFuIGNyZWF0aW5nIG5ldworY2FsbHMgZm9yIHRoZSBQSSBjYXNlcy4gIFNpbWlsYXIgY2hhbmdlcyBhcmUgbmVlZGVkIGZvcgorcHRocmVhZF9jb25kX3RpbWVkd2FpdCgpIGFuZCBwdGhyZWFkX2NvbmRfc2lnbmFsKCkuCisKK0ltcGxlbWVudGF0aW9uCistLS0tLS0tLS0tLS0tLQorCitJbiBvcmRlciB0byBlbnN1cmUgdGhlIHJ0X211dGV4IGhhcyBhbiBvd25lciBpZiBpdCBoYXMgd2FpdGVycywgaXQKK2lzIG5lY2Vzc2FyeSBmb3IgYm90aCB0aGUgcmVxdWV1ZSBjb2RlLCBhcyB3ZWxsIGFzIHRoZSB3YWl0aW5nIGNvZGUsCit0byBiZSBhYmxlIHRvIGFjcXVpcmUgdGhlIHJ0X211dGV4IGJlZm9yZSByZXR1cm5pbmcgdG8gdXNlciBzcGFjZS4KK1RoZSByZXF1ZXVlIGNvZGUgY2Fubm90IHNpbXBseSB3YWtlIHRoZSB3YWl0ZXIgYW5kIGxlYXZlIGl0IHRvCithY3F1aXJlIHRoZSBydF9tdXRleCBhcyBpdCB3b3VsZCBvcGVuIGEgcmFjZSB3aW5kb3cgYmV0d2VlbiB0aGUKK3JlcXVldWUgY2FsbCByZXR1cm5pbmcgdG8gdXNlciBzcGFjZSBhbmQgdGhlIHdhaXRlciB3YWtpbmcgYW5kCitzdGFydGluZyB0byBydW4uICBUaGlzIGlzIGVzcGVjaWFsbHkgdHJ1ZSBpbiB0aGUgdW5jb250ZW5kZWQgY2FzZS4KKworVGhlIHNvbHV0aW9uIGludm9sdmVzIHR3byBuZXcgcnRfbXV0ZXggaGVscGVyIHJvdXRpbmVzLAorcnRfbXV0ZXhfc3RhcnRfcHJveHlfbG9jaygpIGFuZCBydF9tdXRleF9maW5pc2hfcHJveHlfbG9jaygpLCB3aGljaAorYWxsb3cgdGhlIHJlcXVldWUgY29kZSB0byBhY3F1aXJlIGFuIHVuY29udGVuZGVkIHJ0X211dGV4IG9uIGJlaGFsZgorb2YgdGhlIHdhaXRlciBhbmQgdG8gZW5xdWV1ZSB0aGUgd2FpdGVyIG9uIGEgY29udGVuZGVkIHJ0X211dGV4LgorVHdvIG5ldyBzeXN0ZW0gY2FsbHMgcHJvdmlkZSB0aGUga2VybmVsPC0+dXNlciBpbnRlcmZhY2UgdG8KK3JlcXVldWVfcGk6IEZVVEVYX1dBSVRfUkVRVUVVRV9QSSBhbmQgRlVURVhfUkVRVUVVRV9DTVBfUEkuCisKK0ZVVEVYX1dBSVRfUkVRVUVVRV9QSSBpcyBjYWxsZWQgYnkgdGhlIHdhaXRlciAocHRocmVhZF9jb25kX3dhaXQoKQorYW5kIHB0aHJlYWRfY29uZF90aW1lZHdhaXQoKSkgdG8gYmxvY2sgb24gdGhlIGluaXRpYWwgZnV0ZXggYW5kIHdhaXQKK3RvIGJlIHJlcXVldWVkIHRvIGEgUEktYXdhcmUgZnV0ZXguICBUaGUgaW1wbGVtZW50YXRpb24gaXMgdGhlCityZXN1bHQgb2YgYSBoaWdoLXNwZWVkIGNvbGxpc2lvbiBiZXR3ZWVuIGZ1dGV4X3dhaXQoKSBhbmQKK2Z1dGV4X2xvY2tfcGkoKSwgd2l0aCBzb21lIGV4dHJhIGxvZ2ljIHRvIGNoZWNrIGZvciB0aGUgYWRkaXRpb25hbAord2FrZS11cCBzY2VuYXJpb3MuCisKK0ZVVEVYX1JFUVVFVUVfQ01QX1BJIGlzIGNhbGxlZCBieSB0aGUgd2FrZXIKKyhwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCkgYW5kIHB0aHJlYWRfY29uZF9zaWduYWwoKSkgdG8gcmVxdWV1ZSBhbmQKK3Bvc3NpYmx5IHdha2UgdGhlIHdhaXRpbmcgdGFza3MuIEludGVybmFsbHksIHRoaXMgc3lzdGVtIGNhbGwgaXMKK3N0aWxsIGhhbmRsZWQgYnkgZnV0ZXhfcmVxdWV1ZSAoYnkgcGFzc2luZyByZXF1ZXVlX3BpPTEpLiAgQmVmb3JlCityZXF1ZXVlaW5nLCBmdXRleF9yZXF1ZXVlKCkgYXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgcmVxdWV1ZSB0YXJnZXQKK1BJIGZ1dGV4IG9uIGJlaGFsZiBvZiB0aGUgdG9wIHdhaXRlci4gIElmIGl0IGNhbiwgdGhpcyB3YWl0ZXIgaXMKK3dva2VuLiAgZnV0ZXhfcmVxdWV1ZSgpIHRoZW4gcHJvY2VlZHMgdG8gcmVxdWV1ZSB0aGUgcmVtYWluaW5nCitucl93YWtlK25yX3JlcXVldWUgdGFza3MgdG8gdGhlIFBJIGZ1dGV4LCBjYWxsaW5nCitydF9tdXRleF9zdGFydF9wcm94eV9sb2NrKCkgcHJpb3IgdG8gZWFjaCByZXF1ZXVlIHRvIHByZXBhcmUgdGhlCit0YXNrIGFzIGEgd2FpdGVyIG9uIHRoZSB1bmRlcmx5aW5nIHJ0X211dGV4LiAgSXQgaXMgcG9zc2libGUgdGhhdAordGhlIGxvY2sgY2FuIGJlIGFjcXVpcmVkIGF0IHRoaXMgc3RhZ2UgYXMgd2VsbCwgaWYgc28sIHRoZSBuZXh0Cit3YWl0ZXIgaXMgd29rZW4gdG8gZmluaXNoIHRoZSBhY3F1aXNpdGlvbiBvZiB0aGUgbG9jay4KKworRlVURVhfUkVRVUVVRV9QSSBhY2NlcHRzIG5yX3dha2UgYW5kIG5yX3JlcXVldWUgYXMgYXJndW1lbnRzLCBidXQKK3RoZWlyIHN1bSBpcyBhbGwgdGhhdCByZWFsbHkgbWF0dGVycy4gIGZ1dGV4X3JlcXVldWUoKSB3aWxsIHdha2Ugb3IKK3JlcXVldWUgdXAgdG8gbnJfd2FrZSArIG5yX3JlcXVldWUgdGFza3MuICBJdCB3aWxsIHdha2Ugb25seSBhcyBtYW55Cit0YXNrcyBhcyBpdCBjYW4gYWNxdWlyZSB0aGUgbG9jayBmb3IsIHdoaWNoIGluIHRoZSBtYWpvcml0eSBvZiBjYXNlcworc2hvdWxkIGJlIDAgYXMgZ29vZCBwcm9ncmFtbWluZyBwcmFjdGljZSBkaWN0YXRlcyB0aGF0IHRoZSBjYWxsZXIgb2YKK2VpdGhlciBwdGhyZWFkX2NvbmRfYnJvYWRjYXN0KCkgb3IgcHRocmVhZF9jb25kX3NpZ25hbCgpIGFjcXVpcmUgdGhlCittdXRleCBwcmlvciB0byBtYWtpbmcgdGhlIGNhbGwuIEZVVEVYX1JFUVVFVUVfUEkgcmVxdWlyZXMgdGhhdAorbnJfd2FrZT0xLiAgbnJfcmVxdWV1ZSBzaG91bGQgYmUgSU5UX01BWCBmb3IgYnJvYWRjYXN0IGFuZCAwIGZvcgorc2lnbmFsLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9rZXJuZWwtcGFyYW1ldGVycy50eHQgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAppbmRleCAxOWQ4M2UxLi40YTNjMjIwIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL2tlcm5lbC1wYXJhbWV0ZXJzLnR4dApAQCAtNTYsNyArNTYsNiBAQAogCUlTQVBOUAlJU0EgUG5QIGNvZGUgaXMgZW5hYmxlZC4KIAlJU0ROCUFwcHJvcHJpYXRlIElTRE4gc3VwcG9ydCBpcyBlbmFibGVkLgogCUpPWQlBcHByb3ByaWF0ZSBqb3lzdGljayBzdXBwb3J0IGlzIGVuYWJsZWQuCi0JS01FTVRSQUNFIGttZW10cmFjZSBpcyBlbmFibGVkLgogCUxJQkFUQSAgTGliYXRhIGRyaXZlciBpcyBlbmFibGVkCiAJTFAJUHJpbnRlciBzdXBwb3J0IGlzIGVuYWJsZWQuCiAJTE9PUAlMb29wYmFjayBkZXZpY2Ugc3VwcG9ydCBpcyBlbmFibGVkLgpAQCAtMzI5LDExICszMjgsNiBAQAogCQkJCSAgICBmbHVzaGVkIGJlZm9yZSB0aGV5IHdpbGwgYmUgcmV1c2VkLCB3aGljaAogCQkJCSAgICBpcyBhIGxvdCBvZiBmYXN0ZXIKIAotCWFtZF9pb21tdV9zaXplPSBbSFcsWDg2LTY0XQotCQkJRGVmaW5lIHRoZSBzaXplIG9mIHRoZSBhcGVydHVyZSBmb3IgdGhlIEFNRCBJT01NVQotCQkJZHJpdmVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgotCQkJJzMyTScsICc2NE0nIChkZWZhdWx0KSwgJzEyOE0nLCAnMjU2TScsICc1MTJNJywgJzFHJwotCiAJYW1pam95Lm1hcD0JW0hXLEpPWV0gQW1pZ2Egam95c3RpY2sgc3VwcG9ydAogCQkJTWFwIG9mIGRldmljZXMgYXR0YWNoZWQgdG8gSk9ZMERBVCBhbmQgSk9ZMURBVAogCQkJRm9ybWF0OiA8YT4sPGI+CkBAIC02NDYsNiArNjQwLDEzIEBACiAJCQlETUEtQVBJIGRlYnVnZ2luZyBjb2RlIGRpc2FibGVzIGl0c2VsZiBiZWNhdXNlIHRoZQogCQkJYXJjaGl0ZWN0dXJhbCBkZWZhdWx0IGlzIHRvbyBsb3cuCiAKKwlkbWFfZGVidWdfZHJpdmVyPTxkcml2ZXJfbmFtZT4KKwkJCVdpdGggdGhpcyBvcHRpb24gdGhlIERNQS1BUEkgZGVidWdnaW5nIGRyaXZlcgorCQkJZmlsdGVyIGZlYXR1cmUgY2FuIGJlIGVuYWJsZWQgYXQgYm9vdCB0aW1lLiBKdXN0CisJCQlwYXNzIHRoZSBkcml2ZXIgdG8gZmlsdGVyIGZvciBhcyB0aGUgcGFyYW1ldGVyLgorCQkJVGhlIGZpbHRlciBjYW4gYmUgZGlzYWJsZWQgb3IgY2hhbmdlZCB0byBhbm90aGVyCisJCQlkcml2ZXIgbGF0ZXIgdXNpbmcgc3lzZnMuCisKIAlkc2NjNC5zZXR1cD0JW05FVF0KIAogCWR0YzMxODFlPQlbSFcsU0NTSV0KQEAgLTc1MiwxMiArNzUzLDI1IEBACiAJCQlpYTY0X3BhbF9jYWNoZV9mbHVzaCBpbnN0ZWFkIG9mIFNBTF9DQUNIRV9GTFVTSC4KIAogCWZ0cmFjZT1bdHJhY2VyXQotCQkJW2Z0cmFjZV0gd2lsbCBzZXQgYW5kIHN0YXJ0IHRoZSBzcGVjaWZpZWQgdHJhY2VyCisJCQlbRlRSQUNFXSB3aWxsIHNldCBhbmQgc3RhcnQgdGhlIHNwZWNpZmllZCB0cmFjZXIKIAkJCWFzIGVhcmx5IGFzIHBvc3NpYmxlIGluIG9yZGVyIHRvIGZhY2lsaXRhdGUgZWFybHkKIAkJCWJvb3QgZGVidWdnaW5nLgogCiAJZnRyYWNlX2R1bXBfb25fb29wcwotCQkJW2Z0cmFjZV0gd2lsbCBkdW1wIHRoZSB0cmFjZSBidWZmZXJzIG9uIG9vcHMuCisJCQlbRlRSQUNFXSB3aWxsIGR1bXAgdGhlIHRyYWNlIGJ1ZmZlcnMgb24gb29wcy4KKworCWZ0cmFjZV9maWx0ZXI9W2Z1bmN0aW9uLWxpc3RdCisJCQlbRlRSQUNFXSBMaW1pdCB0aGUgZnVuY3Rpb25zIHRyYWNlZCBieSB0aGUgZnVuY3Rpb24KKwkJCXRyYWNlciBhdCBib290IHVwLiBmdW5jdGlvbi1saXN0IGlzIGEgY29tbWEgc2VwYXJhdGVkCisJCQlsaXN0IG9mIGZ1bmN0aW9ucy4gVGhpcyBsaXN0IGNhbiBiZSBjaGFuZ2VkIGF0IHJ1bgorCQkJdGltZSBieSB0aGUgc2V0X2Z0cmFjZV9maWx0ZXIgZmlsZSBpbiB0aGUgZGVidWdmcworCQkJdHJhY2luZyBkaXJlY3RvcnkuIAorCisJZnRyYWNlX25vdHJhY2U9W2Z1bmN0aW9uLWxpc3RdCisJCQlbRlRSQUNFXSBEbyBub3QgdHJhY2UgdGhlIGZ1bmN0aW9ucyBzcGVjaWZpZWQgaW4KKwkJCWZ1bmN0aW9uLWxpc3QuIFRoaXMgbGlzdCBjYW4gYmUgY2hhbmdlZCBhdCBydW4gdGltZQorCQkJYnkgdGhlIHNldF9mdHJhY2Vfbm90cmFjZSBmaWxlIGluIHRoZSBkZWJ1Z2ZzCisJCQl0cmFjaW5nIGRpcmVjdG9yeS4KIAogCWdhbWVjb24ubWFwWzJ8M109CiAJCQlbSFcsSk9ZXSBNdWx0aXN5c3RlbSBqb3lzdGljayBhbmQgTkVTL1NORVMvUFNYIHBhZApAQCAtMTA1NCwxNSArMTA2OCw2IEBACiAJCQl1c2UgdGhlIEhpZ2hNZW0gem9uZSBpZiBpdCBleGlzdHMsIGFuZCB0aGUgTm9ybWFsCiAJCQl6b25lIGlmIGl0IGRvZXMgbm90LgogCi0Ja21lbXRyYWNlLmVuYWJsZT0JW0tOTCxLTUVNVFJBQ0VdIEZvcm1hdDogeyB5ZXMgfCBubyB9Ci0JCQkJQ29udHJvbHMgd2hldGhlciBrbWVtdHJhY2UgaXMgZW5hYmxlZAotCQkJCWF0IGJvb3QtdGltZS4KLQotCWttZW10cmFjZS5zdWJidWZzPW4JW0tOTCxLTUVNVFJBQ0VdIE92ZXJyaWRlcyB0aGUgbnVtYmVyIG9mCi0JCQlzdWJidWZzIGttZW10cmFjZSdzIHJlbGF5IGNoYW5uZWwgaGFzLiBTZXQgdGhpcwotCQkJaGlnaGVyIHRoYW4gZGVmYXVsdCAoS01FTVRSQUNFX05fU1VCQlVGUyBpbiBjb2RlKSBpZgotCQkJeW91IGV4cGVyaWVuY2UgYnVmZmVyIG92ZXJydW5zLgotCiAJa2dkYm9jPQkJW0hXXSBrZ2RiIG92ZXIgY29uc29sZXMuCiAJCQlSZXF1aXJlcyBhIHR0eSBkcml2ZXIgdGhhdCBzdXBwb3J0cyBjb25zb2xlIHBvbGxpbmcuCiAJCQkob25seSBzZXJpYWwgc3Vwb3J0ZWQgZm9yIG5vdykKQEAgLTE1NzUsNiArMTU4MCw5IEBACiAJbm9pbml0cmQJW1JBTV0gVGVsbHMgdGhlIGtlcm5lbCBub3QgdG8gbG9hZCBhbnkgY29uZmlndXJlZAogCQkJaW5pdGlhbCBSQU0gZGlzay4KIAorCW5vaW50cmVtYXAJW1g4Ni02NCwgSW50ZWwtSU9NTVVdIERvIG5vdCBlbmFibGUgaW50ZXJydXB0CisJCQlyZW1hcHBpbmcuCisKIAlub2ludHJvdXRlCVtJQS02NF0KIAogCW5vaml0dGVyCVtJQTY0XSBEaXNhYmxlcyBqaXR0ZXIgY2hlY2tpbmcgZm9yIElUQyB0aW1lcnMuCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQgYi9Eb2N1bWVudGF0aW9uL21lbW9yeS1iYXJyaWVycy50eHQKaW5kZXggZjViNzEyNy4uN2Y1ODA5ZSAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi9tZW1vcnktYmFycmllcnMudHh0CisrKyBiL0RvY3VtZW50YXRpb24vbWVtb3J5LWJhcnJpZXJzLnR4dApAQCAtMzEsNiArMzEsNyBAQAogCiAgICAgIC0gTG9ja2luZyBmdW5jdGlvbnMuCiAgICAgIC0gSW50ZXJydXB0IGRpc2FibGluZyBmdW5jdGlvbnMuCisgICAgIC0gU2xlZXAgYW5kIHdha2UtdXAgZnVuY3Rpb25zLgogICAgICAtIE1pc2NlbGxhbmVvdXMgZnVuY3Rpb25zLgogCiAgKCopIEludGVyLUNQVSBsb2NraW5nIGJhcnJpZXIgZWZmZWN0cy4KQEAgLTEyMTcsNiArMTIxOCwxMzIgQEAKIG90aGVyIG1lYW5zLgogCiAKK1NMRUVQIEFORCBXQUtFLVVQIEZVTkNUSU9OUworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1NsZWVwaW5nIGFuZCB3YWtpbmcgb24gYW4gZXZlbnQgZmxhZ2dlZCBpbiBnbG9iYWwgZGF0YSBjYW4gYmUgdmlld2VkIGFzIGFuCitpbnRlcmFjdGlvbiBiZXR3ZWVuIHR3byBwaWVjZXMgb2YgZGF0YTogdGhlIHRhc2sgc3RhdGUgb2YgdGhlIHRhc2sgd2FpdGluZyBmb3IKK3RoZSBldmVudCBhbmQgdGhlIGdsb2JhbCBkYXRhIHVzZWQgdG8gaW5kaWNhdGUgdGhlIGV2ZW50LiAgVG8gbWFrZSBzdXJlIHRoYXQKK3RoZXNlIGFwcGVhciB0byBoYXBwZW4gaW4gdGhlIHJpZ2h0IG9yZGVyLCB0aGUgcHJpbWl0aXZlcyB0byBiZWdpbiB0aGUgcHJvY2Vzcworb2YgZ29pbmcgdG8gc2xlZXAsIGFuZCB0aGUgcHJpbWl0aXZlcyB0byBpbml0aWF0ZSBhIHdha2UgdXAgaW1wbHkgY2VydGFpbgorYmFycmllcnMuCisKK0ZpcnN0bHksIHRoZSBzbGVlcGVyIG5vcm1hbGx5IGZvbGxvd3Mgc29tZXRoaW5nIGxpa2UgdGhpcyBzZXF1ZW5jZSBvZiBldmVudHM6CisKKwlmb3IgKDs7KSB7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfVU5JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGV2ZW50X2luZGljYXRlZCkKKwkJCWJyZWFrOworCQlzY2hlZHVsZSgpOworCX0KKworQSBnZW5lcmFsIG1lbW9yeSBiYXJyaWVyIGlzIGludGVycG9sYXRlZCBhdXRvbWF0aWNhbGx5IGJ5IHNldF9jdXJyZW50X3N0YXRlKCkKK2FmdGVyIGl0IGhhcyBhbHRlcmVkIHRoZSB0YXNrIHN0YXRlOgorCisJQ1BVIDEKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisJc2V0X2N1cnJlbnRfc3RhdGUoKTsKKwkgIHNldF9tYigpOworCSAgICBTVE9SRSBjdXJyZW50LT5zdGF0ZQorCSAgICA8Z2VuZXJhbCBiYXJyaWVyPgorCUxPQUQgZXZlbnRfaW5kaWNhdGVkCisKK3NldF9jdXJyZW50X3N0YXRlKCkgbWF5IGJlIHdyYXBwZWQgYnk6CisKKwlwcmVwYXJlX3RvX3dhaXQoKTsKKwlwcmVwYXJlX3RvX3dhaXRfZXhjbHVzaXZlKCk7CisKK3doaWNoIHRoZXJlZm9yZSBhbHNvIGltcGx5IGEgZ2VuZXJhbCBtZW1vcnkgYmFycmllciBhZnRlciBzZXR0aW5nIHRoZSBzdGF0ZS4KK1RoZSB3aG9sZSBzZXF1ZW5jZSBhYm92ZSBpcyBhdmFpbGFibGUgaW4gdmFyaW91cyBjYW5uZWQgZm9ybXMsIGFsbCBvZiB3aGljaAoraW50ZXJwb2xhdGUgdGhlIG1lbW9yeSBiYXJyaWVyIGluIHRoZSByaWdodCBwbGFjZToKKworCXdhaXRfZXZlbnQoKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGUoKTsKKwl3YWl0X2V2ZW50X2ludGVycnVwdGlibGVfZXhjbHVzaXZlKCk7CisJd2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlX3RpbWVvdXQoKTsKKwl3YWl0X2V2ZW50X2tpbGxhYmxlKCk7CisJd2FpdF9ldmVudF90aW1lb3V0KCk7CisJd2FpdF9vbl9iaXQoKTsKKwl3YWl0X29uX2JpdF9sb2NrKCk7CisKKworU2Vjb25kbHksIGNvZGUgdGhhdCBwZXJmb3JtcyBhIHdha2UgdXAgbm9ybWFsbHkgZm9sbG93cyBzb21ldGhpbmcgbGlrZSB0aGlzOgorCisJZXZlbnRfaW5kaWNhdGVkID0gMTsKKwl3YWtlX3VwKCZldmVudF93YWl0X3F1ZXVlKTsKKworb3I6CisKKwlldmVudF9pbmRpY2F0ZWQgPSAxOworCXdha2VfdXBfcHJvY2VzcyhldmVudF9kYWVtb24pOworCitBIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGlzIGltcGxpZWQgYnkgd2FrZV91cCgpIGFuZCBjby4gaWYgYW5kIG9ubHkgaWYgdGhleSB3YWtlCitzb21ldGhpbmcgdXAuICBUaGUgYmFycmllciBvY2N1cnMgYmVmb3JlIHRoZSB0YXNrIHN0YXRlIGlzIGNsZWFyZWQsIGFuZCBzbyBzaXRzCitiZXR3ZWVuIHRoZSBTVE9SRSB0byBpbmRpY2F0ZSB0aGUgZXZlbnQgYW5kIHRoZSBTVE9SRSB0byBzZXQgVEFTS19SVU5OSU5HOgorCisJQ1BVIDEJCQkJQ1BVIDIKKwk9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwlzZXRfY3VycmVudF9zdGF0ZSgpOwkJU1RPUkUgZXZlbnRfaW5kaWNhdGVkCisJICBzZXRfbWIoKTsJCQl3YWtlX3VwKCk7CisJICAgIFNUT1JFIGN1cnJlbnQtPnN0YXRlCSAgPHdyaXRlIGJhcnJpZXI+CisJICAgIDxnZW5lcmFsIGJhcnJpZXI+CQkgIFNUT1JFIGN1cnJlbnQtPnN0YXRlCisJTE9BRCBldmVudF9pbmRpY2F0ZWQKKworVGhlIGF2YWlsYWJsZSB3YWtlciBmdW5jdGlvbnMgaW5jbHVkZToKKworCWNvbXBsZXRlKCk7CisJd2FrZV91cCgpOworCXdha2VfdXBfYWxsKCk7CisJd2FrZV91cF9iaXQoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGUoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfYWxsKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX25yKCk7CisJd2FrZV91cF9pbnRlcnJ1cHRpYmxlX3BvbGwoKTsKKwl3YWtlX3VwX2ludGVycnVwdGlibGVfc3luYygpOworCXdha2VfdXBfaW50ZXJydXB0aWJsZV9zeW5jX3BvbGwoKTsKKwl3YWtlX3VwX2xvY2tlZCgpOworCXdha2VfdXBfbG9ja2VkX3BvbGwoKTsKKwl3YWtlX3VwX25yKCk7CisJd2FrZV91cF9wb2xsKCk7CisJd2FrZV91cF9wcm9jZXNzKCk7CisKKworWyFdIE5vdGUgdGhhdCB0aGUgbWVtb3J5IGJhcnJpZXJzIGltcGxpZWQgYnkgdGhlIHNsZWVwZXIgYW5kIHRoZSB3YWtlciBkbyBfbm90Xworb3JkZXIgbXVsdGlwbGUgc3RvcmVzIGJlZm9yZSB0aGUgd2FrZS11cCB3aXRoIHJlc3BlY3QgdG8gbG9hZHMgb2YgdGhvc2Ugc3RvcmVkCit2YWx1ZXMgYWZ0ZXIgdGhlIHNsZWVwZXIgaGFzIGNhbGxlZCBzZXRfY3VycmVudF9zdGF0ZSgpLiAgRm9yIGluc3RhbmNlLCBpZiB0aGUKK3NsZWVwZXIgZG9lczoKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJaWYgKGV2ZW50X2luZGljYXRlZCkKKwkJYnJlYWs7CisJX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOworCWRvX3NvbWV0aGluZyhteV9kYXRhKTsKKworYW5kIHRoZSB3YWtlciBkb2VzOgorCisJbXlfZGF0YSA9IHZhbHVlOworCWV2ZW50X2luZGljYXRlZCA9IDE7CisJd2FrZV91cCgmZXZlbnRfd2FpdF9xdWV1ZSk7CisKK3RoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgdGhlIGNoYW5nZSB0byBldmVudF9pbmRpY2F0ZWQgd2lsbCBiZSBwZXJjZWl2ZWQgYnkKK3RoZSBzbGVlcGVyIGFzIGNvbWluZyBhZnRlciB0aGUgY2hhbmdlIHRvIG15X2RhdGEuICBJbiBzdWNoIGEgY2lyY3Vtc3RhbmNlLCB0aGUKK2NvZGUgb24gYm90aCBzaWRlcyBtdXN0IGludGVycG9sYXRlIGl0cyBvd24gbWVtb3J5IGJhcnJpZXJzIGJldHdlZW4gdGhlCitzZXBhcmF0ZSBkYXRhIGFjY2Vzc2VzLiAgVGh1cyB0aGUgYWJvdmUgc2xlZXBlciBvdWdodCB0byBkbzoKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJaWYgKGV2ZW50X2luZGljYXRlZCkgeworCQlzbXBfcm1iKCk7CisJCWRvX3NvbWV0aGluZyhteV9kYXRhKTsKKwl9CisKK2FuZCB0aGUgd2FrZXIgc2hvdWxkIGRvOgorCisJbXlfZGF0YSA9IHZhbHVlOworCXNtcF93bWIoKTsKKwlldmVudF9pbmRpY2F0ZWQgPSAxOworCXdha2VfdXAoJmV2ZW50X3dhaXRfcXVldWUpOworCisKIE1JU0NFTExBTkVPVVMgRlVOQ1RJT05TCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0xMzY2LDcgKzE0OTMsNyBAQAogCiBVbmRlciBub3JtYWwgb3BlcmF0aW9uLCBtZW1vcnkgb3BlcmF0aW9uIHJlb3JkZXJpbmcgaXMgZ2VuZXJhbGx5IG5vdCBnb2luZyB0bwogYmUgYSBwcm9ibGVtIGFzIGEgc2luZ2xlLXRocmVhZGVkIGxpbmVhciBwaWVjZSBvZiBjb2RlIHdpbGwgc3RpbGwgYXBwZWFyIHRvCi13b3JrIGNvcnJlY3RseSwgZXZlbiBpZiBpdCdzIGluIGFuIFNNUCBrZXJuZWwuICBUaGVyZSBhcmUsIGhvd2V2ZXIsIHRocmVlCit3b3JrIGNvcnJlY3RseSwgZXZlbiBpZiBpdCdzIGluIGFuIFNNUCBrZXJuZWwuICBUaGVyZSBhcmUsIGhvd2V2ZXIsIGZvdXIKIGNpcmN1bXN0YW5jZXMgaW4gd2hpY2ggcmVvcmRlcmluZyBkZWZpbml0ZWx5IF9jb3VsZF8gYmUgYSBwcm9ibGVtOgogCiAgKCopIEludGVycHJvY2Vzc29yIGludGVyYWN0aW9uLgpkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtcnQtZ3JvdXAudHh0IGIvRG9jdW1lbnRhdGlvbi9zY2hlZHVsZXIvc2NoZWQtcnQtZ3JvdXAudHh0CmluZGV4IDViYTRkM2YuLjFkZjdmOWMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24vc2NoZWR1bGVyL3NjaGVkLXJ0LWdyb3VwLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3NjaGVkdWxlci9zY2hlZC1ydC1ncm91cC50eHQKQEAgLTQsNiArNCw3IEBACiBDT05URU5UUwogPT09PT09PT0KIAorMC4gV0FSTklORwogMS4gT3ZlcnZpZXcKICAgMS4xIFRoZSBwcm9ibGVtCiAgIDEuMiBUaGUgc29sdXRpb24KQEAgLTE0LDYgKzE1LDIzIEBACiAzLiBGdXR1cmUgcGxhbnMKIAogCiswLiBXQVJOSU5HCis9PT09PT09PT09CisKKyBGaWRkbGluZyB3aXRoIHRoZXNlIHNldHRpbmdzIGNhbiByZXN1bHQgaW4gYW4gdW5zdGFibGUgc3lzdGVtLCB0aGUga25vYnMgYXJlCisgcm9vdCBvbmx5IGFuZCBhc3N1bWVzIHJvb3Qga25vd3Mgd2hhdCBoZSBpcyBkb2luZy4KKworTW9zdCBub3RhYmxlOgorCisgKiB2ZXJ5IHNtYWxsIHZhbHVlcyBpbiBzY2hlZF9ydF9wZXJpb2RfdXMgY2FuIHJlc3VsdCBpbiBhbiB1bnN0YWJsZQorICAgc3lzdGVtIHdoZW4gdGhlIHBlcmlvZCBpcyBzbWFsbGVyIHRoYW4gZWl0aGVyIHRoZSBhdmFpbGFibGUgaHJ0aW1lcgorICAgcmVzb2x1dGlvbiwgb3IgdGhlIHRpbWUgaXQgdGFrZXMgdG8gaGFuZGxlIHRoZSBidWRnZXQgcmVmcmVzaCBpdHNlbGYuCisKKyAqIHZlcnkgc21hbGwgdmFsdWVzIGluIHNjaGVkX3J0X3J1bnRpbWVfdXMgY2FuIHJlc3VsdCBpbiBhbiB1bnN0YWJsZQorICAgc3lzdGVtIHdoZW4gdGhlIHJ1bnRpbWUgaXMgc28gc21hbGwgdGhlIHN5c3RlbSBoYXMgZGlmZmljdWx0eSBtYWtpbmcKKyAgIGZvcndhcmQgcHJvZ3Jlc3MgKE5PVEU6IHRoZSBtaWdyYXRpb24gdGhyZWFkIGFuZCBrc3RvcG1hY2hpbmUgYm90aAorICAgYXJlIHJlYWwtdGltZSBwcm9jZXNzZXMpLgorCiAxLiBPdmVydmlldwogPT09PT09PT09PT0KIApAQCAtMTY5LDcgKzE4Nyw3IEBACiAKIEltcGxlbWVudGluZyBTQ0hFRF9FREYgbWlnaHQgdGFrZSBhIHdoaWxlIHRvIGNvbXBsZXRlLiBQcmlvcml0eSBJbmhlcml0YW5jZSBpcwogdGhlIGJpZ2dlc3QgY2hhbGxlbmdlIGFzIHRoZSBjdXJyZW50IGxpbnV4IFBJIGluZnJhc3RydWN0dXJlIGlzIGdlYXJlZCB0b3dhcmRzCi10aGUgbGltaXRlZCBzdGF0aWMgcHJpb3JpdHkgbGV2ZWxzIDAtMTM5LiBXaXRoIGRlYWRsaW5lIHNjaGVkdWxpbmcgeW91IG5lZWQgdG8KK3RoZSBsaW1pdGVkIHN0YXRpYyBwcmlvcml0eSBsZXZlbHMgMC05OS4gV2l0aCBkZWFkbGluZSBzY2hlZHVsaW5nIHlvdSBuZWVkIHRvCiBkbyBkZWFkbGluZSBpbmhlcml0YW5jZSAoc2luY2UgcHJpb3JpdHkgaXMgaW52ZXJzZWx5IHByb3BvcnRpb25hbCB0byB0aGUKIGRlYWRsaW5lIGRlbHRhIChkZWFkbGluZSAtIG5vdykuCiAKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24vdHJhY2UvZXZlbnRzLnR4dCBiL0RvY3VtZW50YXRpb24vdHJhY2UvZXZlbnRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTU3ZDc1Ci0tLSAvZGV2L251bGwKKysrIGIvRG9jdW1lbnRhdGlvbi90cmFjZS9ldmVudHMudHh0CkBAIC0wLDAgKzEsOTAgQEAKKwkJCSAgICAgRXZlbnQgVHJhY2luZworCisJCURvY3VtZW50YXRpb24gd3JpdHRlbiBieSBUaGVvZG9yZSBUcydvCisJCQlVcGRhdGVkIGJ5IExpIFplZmFuCisKKzEuIEludHJvZHVjdGlvbgorPT09PT09PT09PT09PT09CisKK1RyYWNlcG9pbnRzIChzZWUgRG9jdW1lbnRhdGlvbi90cmFjZS90cmFjZXBvaW50cy50eHQpIGNhbiBiZSB1c2VkCit3aXRob3V0IGNyZWF0aW5nIGN1c3RvbSBrZXJuZWwgbW9kdWxlcyB0byByZWdpc3RlciBwcm9iZSBmdW5jdGlvbnMKK3VzaW5nIHRoZSBldmVudCB0cmFjaW5nIGluZnJhc3RydWN0dXJlLgorCitOb3QgYWxsIHRyYWNlcG9pbnRzIGNhbiBiZSB0cmFjZWQgdXNpbmcgdGhlIGV2ZW50IHRyYWNpbmcgc3lzdGVtOwordGhlIGtlcm5lbCBkZXZlbG9wZXIgbXVzdCBwcm92aWRlIGNvZGUgc25pcHBldHMgd2hpY2ggZGVmaW5lIGhvdyB0aGUKK3RyYWNpbmcgaW5mb3JtYXRpb24gaXMgc2F2ZWQgaW50byB0aGUgdHJhY2luZyBidWZmZXIsIGFuZCBob3cgdGhlCit0cmFjaW5nIGluZm9ybWF0aW9uIHNob3VsZCBiZSBwcmludGVkLgorCisyLiBVc2luZyBFdmVudCBUcmFjaW5nCis9PT09PT09PT09PT09PT09PT09PT09CisKKzIuMSBWaWEgdGhlICdzZXRfZXZlbnQnIGludGVyZmFjZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBldmVudHMgd2hpY2ggYXJlIGF2YWlsYWJsZSBmb3IgdHJhY2luZyBjYW4gYmUgZm91bmQgaW4gdGhlIGZpbGUKKy9kZWJ1Zy90cmFjaW5nL2F2YWlsYWJsZV9ldmVudHMuCisKK1RvIGVuYWJsZSBhIHBhcnRpY3VsYXIgZXZlbnQsIHN1Y2ggYXMgJ3NjaGVkX3dha2V1cCcsIHNpbXBseSBlY2hvIGl0Cit0byAvZGVidWcvdHJhY2luZy9zZXRfZXZlbnQuIEZvciBleGFtcGxlOgorCisJIyBlY2hvIHNjaGVkX3dha2V1cCA+PiAvZGVidWcvdHJhY2luZy9zZXRfZXZlbnQKKworWyBOb3RlOiAnPj4nIGlzIG5lY2Vzc2FyeSwgb3RoZXJ3aXNlIGl0IHdpbGwgZmlyc3RseSBkaXNhYmxlCisgIGFsbCB0aGUgZXZlbnRzLiBdCisKK1RvIGRpc2FibGUgYW4gZXZlbnQsIGVjaG8gdGhlIGV2ZW50IG5hbWUgdG8gdGhlIHNldF9ldmVudCBmaWxlIHByZWZpeGVkCit3aXRoIGFuIGV4Y2xhbWF0aW9uIHBvaW50OgorCisJIyBlY2hvICchc2NoZWRfd2FrZXVwJyA+PiAvZGVidWcvdHJhY2luZy9zZXRfZXZlbnQKKworVG8gZGlzYWJsZSBhbGwgZXZlbnRzLCBlY2hvIGFuIGVtcHR5IGxpbmUgdG8gdGhlIHNldF9ldmVudCBmaWxlOgorCisJIyBlY2hvID4gL2RlYnVnL3RyYWNpbmcvc2V0X2V2ZW50CisKK1RvIGVuYWJsZSBhbGwgZXZlbnRzLCBlY2hvICcqOionIG9yICcqOicgdG8gdGhlIHNldF9ldmVudCBmaWxlOgorCisJIyBlY2hvICo6KiA+IC9kZWJ1Zy90cmFjaW5nL3NldF9ldmVudAorCitUaGUgZXZlbnRzIGFyZSBvcmdhbml6ZWQgaW50byBzdWJzeXN0ZW1zLCBzdWNoIGFzIGV4dDQsIGlycSwgc2NoZWQsCitldGMuLCBhbmQgYSBmdWxsIGV2ZW50IG5hbWUgbG9va3MgbGlrZSB0aGlzOiA8c3Vic3lzdGVtPjo8ZXZlbnQ+LiAgVGhlCitzdWJzeXN0ZW0gbmFtZSBpcyBvcHRpb25hbCwgYnV0IGl0IGlzIGRpc3BsYXllZCBpbiB0aGUgYXZhaWxhYmxlX2V2ZW50cworZmlsZS4gIEFsbCBvZiB0aGUgZXZlbnRzIGluIGEgc3Vic3lzdGVtIGNhbiBiZSBzcGVjaWZpZWQgdmlhIHRoZSBzeW50YXgKKyI8c3Vic3lzdGVtPjoqIjsgZm9yIGV4YW1wbGUsIHRvIGVuYWJsZSBhbGwgaXJxIGV2ZW50cywgeW91IGNhbiB1c2UgdGhlCitjb21tYW5kOgorCisJIyBlY2hvICdpcnE6KicgPiAvZGVidWcvdHJhY2luZy9zZXRfZXZlbnQKKworMi4yIFZpYSB0aGUgJ2VuYWJsZScgdG9nZ2xlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworVGhlIGV2ZW50cyBhdmFpbGFibGUgYXJlIGFsc28gbGlzdGVkIGluIC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy8gaGllcmFyY2h5CitvZiBkaXJlY3Rvcmllcy4KKworVG8gZW5hYmxlIGV2ZW50ICdzY2hlZF93YWtldXAnOgorCisJIyBlY2hvIDEgPiAvZGVidWcvdHJhY2luZy9ldmVudHMvc2NoZWQvc2NoZWRfd2FrZXVwL2VuYWJsZQorCitUbyBkaXNhYmxlIGl0OgorCisJIyBlY2hvIDAgPiAvZGVidWcvdHJhY2luZy9ldmVudHMvc2NoZWQvc2NoZWRfd2FrZXVwL2VuYWJsZQorCitUbyBlbmFibGUgYWxsIGV2ZW50cyBpbiBzY2hlZCBzdWJzeXN0ZW06CisKKwkjIGVjaG8gMSA+IC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9zY2hlZC9lbmFibGUKKworVG8gZWFuYmxlIGFsbCBldmVudHM6CisKKwkjIGVjaG8gMSA+IC9kZWJ1Zy90cmFjaW5nL2V2ZW50cy9lbmFibGUKKworV2hlbiByZWFkaW5nIG9uZSBvZiB0aGVzZSBlbmFibGUgZmlsZXMsIHRoZXJlIGFyZSBmb3VyIHJlc3VsdHM6CisKKyAwIC0gYWxsIGV2ZW50cyB0aGlzIGZpbGUgYWZmZWN0cyBhcmUgZGlzYWJsZWQKKyAxIC0gYWxsIGV2ZW50cyB0aGlzIGZpbGUgYWZmZWN0cyBhcmUgZW5hYmxlZAorIFggLSB0aGVyZSBpcyBhIG1peHR1cmUgb2YgZXZlbnRzIGVuYWJsZWQgYW5kIGRpc2FibGVkCisgPyAtIHRoaXMgZmlsZSBkb2VzIG5vdCBhZmZlY3QgYW55IGV2ZW50CisKKzMuIERlZmluaW5nIGFuIGV2ZW50LWVuYWJsZWQgdHJhY2Vwb2ludAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1NlZSBUaGUgZXhhbXBsZSBwcm92aWRlZCBpbiBzYW1wbGVzL3RyYWNlX2V2ZW50cworCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL2Z0cmFjZS50eHQKaW5kZXggZmQ5YTNlNi4uMmE4MmQ4NiAxMDA2NDQKLS0tIGEvRG9jdW1lbnRhdGlvbi90cmFjZS9mdHJhY2UudHh0CisrKyBiL0RvY3VtZW50YXRpb24vdHJhY2UvZnRyYWNlLnR4dApAQCAtMTc5LDcgKzE3OSw3IEBACiAKIAlGdW5jdGlvbiBjYWxsIHRyYWNlciB0byB0cmFjZSBhbGwga2VybmVsIGZ1bmN0aW9ucy4KIAotICAiZnVuY3Rpb25fZ3JhcGhfdHJhY2VyIgorICAiZnVuY3Rpb25fZ3JhcGgiCiAKIAlTaW1pbGFyIHRvIHRoZSBmdW5jdGlvbiB0cmFjZXIgZXhjZXB0IHRoYXQgdGhlCiAJZnVuY3Rpb24gdHJhY2VyIHByb2JlcyB0aGUgZnVuY3Rpb25zIG9uIHRoZWlyIGVudHJ5CkBAIC01MTgsOSArNTE4LDE4IEBACiB2YWx1ZXMgc3RhcnRpbmcgYXQgMTAwIChuaWNlIC0yMCkuIEJlbG93IGlzIGEgcXVpY2sgY2hhcnQgdG8gbWFwCiB0aGUga2VybmVsIHByaW9yaXR5IHRvIHVzZXIgbGFuZCBwcmlvcml0aWVzLgogCi0gIEtlcm5lbCBwcmlvcml0eTogMCB0byA5OSAgICA9PT4gdXNlciBSVCBwcmlvcml0eSA5OSB0byAwCi0gIEtlcm5lbCBwcmlvcml0eTogMTAwIHRvIDEzOSA9PT4gdXNlciBuaWNlIC0yMCB0byAxOQotICBLZXJuZWwgcHJpb3JpdHk6IDE0MCAgICAgICAgPT0+IGlkbGUgdGFzayBwcmlvcml0eQorICAgS2VybmVsIFNwYWNlICAgICAgICAgICAgICAgICAgICAgVXNlciBTcGFjZQorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgMChoaWdoKSB0byAgOTgobG93KSAgICAgdXNlciBSVCBwcmlvcml0eSA5OShoaWdoKSB0byAxKGxvdykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggU0NIRURfUlIgb3IgU0NIRURfRklGTworIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICA5OSAgICAgICAgICAgICAgICAgICAgICAgc2NoZWRfcHJpb3JpdHkgaXMgbm90IHVzZWQgaW4gc2NoZWR1bGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjaXNpb25zKGl0IG11c3QgYmUgc3BlY2lmaWVkIGFzIDApCisgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgMTAwKGhpZ2gpIHRvIDEzOShsb3cpICAgICB1c2VyIG5pY2UgLTIwKGhpZ2gpIHRvIDE5KGxvdykKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAxNDAgICAgICAgICAgICAgICAgICAgICAgIGlkbGUgdGFzayBwcmlvcml0eQorIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBUaGUgdGFzayBzdGF0ZXMgYXJlOgogCmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3RyYWNlL3Bvd2VyLnR4dCBiL0RvY3VtZW50YXRpb24vdHJhY2UvcG93ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkODA1ZTEKLS0tIC9kZXYvbnVsbAorKysgYi9Eb2N1bWVudGF0aW9uL3RyYWNlL3Bvd2VyLnR4dApAQCAtMCwwICsxLDE3IEBACitUaGUgcG93ZXIgdHJhY2VyIGNvbGxlY3RzIGRldGFpbGVkIGluZm9ybWF0aW9uIGFib3V0IEMtc3RhdGUgYW5kIFAtc3RhdGUKK3RyYW5zaXRpb25zLCBpbnN0ZWFkIG9mIGp1c3QgbG9va2luZyBhdCB0aGUgaGlnaC1sZXZlbCAiYXZlcmFnZSIKK2luZm9ybWF0aW9uLgorCitUaGVyZSBpcyBhIGhlbHBlciBzY3JpcHQgZm91bmQgaW4gc2NyaXBzL3RyYWNpbmcvcG93ZXIucGwgaW4gdGhlIGtlcm5lbAorc291cmNlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBwYXJzZSB0aGlzIGluZm9ybWF0aW9uIGFuZCBjcmVhdGUgYQorU2NhbGFibGUgVmVjdG9yIEdyYXBoaWNzIChTVkcpIHBpY3R1cmUgZnJvbSB0aGUgdHJhY2UgZGF0YS4KKworVG8gdXNlIHRoaXMgdHJhY2VyOgorCisJZWNobyAwID4gL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy90cmFjaW5nX2VuYWJsZWQKKwllY2hvIHBvd2VyID4gL3N5cy9rZXJuZWwvZGVidWcvdHJhY2luZy9jdXJyZW50X3RyYWNlcgorCWVjaG8gMSA+IC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvdHJhY2luZ19lbmFibGVkCisJc2xlZXAgMQorCWVjaG8gMCA+IC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvdHJhY2luZ19lbmFibGVkCisJY2F0IC9zeXMva2VybmVsL2RlYnVnL3RyYWNpbmcvdHJhY2UgfCBcCisJCXBlcmwgc2NyaXB0cy90cmFjaW5nL3Bvd2VyLnBsID4gb3V0LnN2CmRpZmYgLS1naXQgYS9Eb2N1bWVudGF0aW9uL3g4Ni9ib290LnR4dCBiL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0CmluZGV4IGUwMjAzNjYuLjhkYTNhNzkgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0CisrKyBiL0RvY3VtZW50YXRpb24veDg2L2Jvb3QudHh0CkBAIC01MCw2ICs1MCwxMCBAQAogUHJvdG9jb2wgMi4wOToJKEtlcm5lbCAyLjYuMjYpIEFkZGVkIGEgZmllbGQgb2YgNjQtYml0IHBoeXNpY2FsCiAJCXBvaW50ZXIgdG8gc2luZ2xlIGxpbmtlZCBsaXN0IG9mIHN0cnVjdAlzZXR1cF9kYXRhLgogCitQcm90b2NvbCAyLjEwOgkoS2VybmVsIDIuNi4zMSkgQWRkZWQgYSBwcm90b2NvbCBmb3IgcmVsYXhlZCBhbGlnbm1lbnQKKwkJYmV5b25kIHRoZSBrZXJuZWxfYWxpZ25tZW50IGFkZGVkLCBuZXcgaW5pdF9zaXplIGFuZAorCQlwcmVmX2FkZHJlc3MgZmllbGRzLiAgQWRkZWQgZXh0ZW5kZWQgYm9vdCBsb2FkZXIgSURzLgorCiAqKioqIE1FTU9SWSBMQVlPVVQKIAogVGhlIHRyYWRpdGlvbmFsIG1lbW9yeSBtYXAgZm9yIHRoZSBrZXJuZWwgbG9hZGVyLCB1c2VkIGZvciBJbWFnZSBvcgpAQCAtMTY4LDEyICsxNzIsMTMgQEAKIDAyMUMvNAkyLjAwKwlyYW1kaXNrX3NpemUJaW5pdHJkIHNpemUgKHNldCBieSBib290IGxvYWRlcikKIDAyMjAvNAkyLjAwKwlib290c2VjdF9rbHVkZ2UJRE8gTk9UIFVTRSAtIGZvciBib290c2VjdC5TIHVzZSBvbmx5CiAwMjI0LzIJMi4wMSsJaGVhcF9lbmRfcHRyCUZyZWUgbWVtb3J5IGFmdGVyIHNldHVwIGVuZAotMDIyNi8yCU4vQQlwYWQxCQlVbnVzZWQKKzAyMjYvMQkyLjAyKygzIGV4dF9sb2FkZXJfdmVyCUV4dGVuZGVkIGJvb3QgbG9hZGVyIHZlcnNpb24KKzAyMjcvMQkyLjAyKygzCWV4dF9sb2FkZXJfdHlwZQlFeHRlbmRlZCBib290IGxvYWRlciBJRAogMDIyOC80CTIuMDIrCWNtZF9saW5lX3B0cgkzMi1iaXQgcG9pbnRlciB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZQogMDIyQy80CTIuMDMrCXJhbWRpc2tfbWF4CUhpZ2hlc3QgbGVnYWwgaW5pdHJkIGFkZHJlc3MKIDAyMzAvNAkyLjA1KwlrZXJuZWxfYWxpZ25tZW50IFBoeXNpY2FsIGFkZHIgYWxpZ25tZW50IHJlcXVpcmVkIGZvciBrZXJuZWwKIDAyMzQvMQkyLjA1KwlyZWxvY2F0YWJsZV9rZXJuZWwgV2hldGhlciBrZXJuZWwgaXMgcmVsb2NhdGFibGUgb3Igbm90Ci0wMjM1LzEJTi9BCXBhZDIJCVVudXNlZAorMDIzNS8xCTIuMTArCW1pbl9hbGlnbm1lbnQJTWluaW11bSBhbGlnbm1lbnQsIGFzIGEgcG93ZXIgb2YgdHdvCiAwMjM2LzIJTi9BCXBhZDMJCVVudXNlZAogMDIzOC80CTIuMDYrCWNtZGxpbmVfc2l6ZQlNYXhpbXVtIHNpemUgb2YgdGhlIGtlcm5lbCBjb21tYW5kIGxpbmUKIDAyM0MvNAkyLjA3KwloYXJkd2FyZV9zdWJhcmNoIEhhcmR3YXJlIHN1YmFyY2hpdGVjdHVyZQpAQCAtMTgyLDYgKzE4Nyw4IEBACiAwMjRDLzQJMi4wOCsJcGF5bG9hZF9sZW5ndGgJTGVuZ3RoIG9mIGtlcm5lbCBwYXlsb2FkCiAwMjUwLzgJMi4wOSsJc2V0dXBfZGF0YQk2NC1iaXQgcGh5c2ljYWwgcG9pbnRlciB0byBsaW5rZWQgbGlzdAogCQkJCW9mIHN0cnVjdCBzZXR1cF9kYXRhCiswMjU4LzgJMi4xMCsJcHJlZl9hZGRyZXNzCVByZWZlcnJlZCBsb2FkaW5nIGFkZHJlc3MKKzAyNjAvNAkyLjEwKwlpbml0X3NpemUJTGluZWFyIG1lbW9yeSByZXF1aXJlZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24KIAogKDEpIEZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgaWYgdGhlIHNldHVwX3NlY3RzIGZpZWxkIGNvbnRhaW5zIDAsIHRoZQogICAgIHJlYWwgdmFsdWUgaXMgNC4KQEAgLTE5MCw2ICsxOTcsOCBAQAogICAgIGZpZWxkIGFyZSB1bnVzYWJsZSwgd2hpY2ggbWVhbnMgdGhlIHNpemUgb2YgYSBiekltYWdlIGtlcm5lbAogICAgIGNhbm5vdCBiZSBkZXRlcm1pbmVkLgogCisoMykgSWdub3JlZCwgYnV0IHNhZmUgdG8gc2V0LCBmb3IgYm9vdCBwcm90b2NvbHMgMi4wMi0yLjA5LgorCiBJZiB0aGUgIkhkclMiICgweDUzNzI2NDQ4KSBtYWdpYyBudW1iZXIgaXMgbm90IGZvdW5kIGF0IG9mZnNldCAweDIwMiwKIHRoZSBib290IHByb3RvY29sIHZlcnNpb24gaXMgIm9sZCIuICBMb2FkaW5nIGFuIG9sZCBrZXJuZWwsIHRoZQogZm9sbG93aW5nIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGFzc3VtZWQ6CkBAIC0zNDMsMTggKzM1MiwzMiBAQAogICAweFRWIGhlcmUsIHdoZXJlIFQgaXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIGJvb3QgbG9hZGVyIGFuZCBWIGlzCiAgIGEgdmVyc2lvbiBudW1iZXIuICBPdGhlcndpc2UsIGVudGVyIDB4RkYgaGVyZS4KIAorICBGb3IgYm9vdCBsb2FkZXIgSURzIGFib3ZlIFQgPSAweEQsIHdyaXRlIFQgPSAweEUgdG8gdGhpcyBmaWVsZCBhbmQKKyAgd3JpdGUgdGhlIGV4dGVuZGVkIElEIG1pbnVzIDB4MTAgdG8gdGhlIGV4dF9sb2FkZXJfdHlwZSBmaWVsZC4KKyAgU2ltaWxhcmx5LCB0aGUgZXh0X2xvYWRlcl92ZXIgZmllbGQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBtb3JlIHRoYW4KKyAgZm91ciBiaXRzIGZvciB0aGUgYm9vdGxvYWRlciB2ZXJzaW9uLgorCisgIEZvciBleGFtcGxlLCBmb3IgVCA9IDB4MTUsIFYgPSAweDIzNCwgd3JpdGU6CisKKyAgdHlwZV9vZl9sb2FkZXIgIDwtIDB4RTQKKyAgZXh0X2xvYWRlcl90eXBlIDwtIDB4MDUKKyAgZXh0X2xvYWRlcl92ZXIgIDwtIDB4MjMKKwogICBBc3NpZ25lZCBib290IGxvYWRlciBpZHM6CiAJMCAgTElMTwkJCSgweDAwIHJlc2VydmVkIGZvciBwcmUtMi4wMCBib290bG9hZGVyKQogCTEgIExvYWRsaW4KIAkyICBib290c2VjdC1sb2FkZXIJKDB4MjAsIGFsbCBvdGhlciB2YWx1ZXMgcmVzZXJ2ZWQpCi0JMyAgU1lTTElOVVgKLQk0ICBFdGhlckJvb3QKKwkzICBTeXNsaW51eAorCTQgIEV0aGVyYm9vdC9nUFhFCiAJNSAgRUxJTE8KIAk3ICBHUlVCCi0JOCAgVS1CT09UCisJOCAgVS1Cb290CiAJOSAgWGVuCiAJQSAgR3VqaW4KIAlCICBRZW11CisJQyAgQXJjdHVydXMgTmV0d29ya3MgdUNib290bG9hZGVyCisJRSAgRXh0ZW5kZWQJCShzZWUgZXh0X2xvYWRlcl90eXBlKQorCUYgIFNwZWNpYWwJCSgweEZGID0gdW5kZWZpbmVkKQogCiAgIFBsZWFzZSBjb250YWN0IDxocGFAenl0b3IuY29tPiBpZiB5b3UgbmVlZCBhIGJvb3Rsb2FkZXIgSUQKICAgdmFsdWUgYXNzaWduZWQuCkBAIC00NTMsNiArNDc2LDM1IEBACiAgIFNldCB0aGlzIGZpZWxkIHRvIHRoZSBvZmZzZXQgKGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgcmVhbC1tb2RlCiAgIGNvZGUpIG9mIHRoZSBlbmQgb2YgdGhlIHNldHVwIHN0YWNrL2hlYXAsIG1pbnVzIDB4MDIwMC4KIAorRmllbGQgbmFtZToJZXh0X2xvYWRlcl92ZXIKK1R5cGU6CQl3cml0ZSAob3B0aW9uYWwpCitPZmZzZXQvc2l6ZToJMHgyMjYvMQorUHJvdG9jb2w6CTIuMDIrCisKKyAgVGhpcyBmaWVsZCBpcyB1c2VkIGFzIGFuIGV4dGVuc2lvbiBvZiB0aGUgdmVyc2lvbiBudW1iZXIgaW4gdGhlCisgIHR5cGVfb2ZfbG9hZGVyIGZpZWxkLiAgVGhlIHRvdGFsIHZlcnNpb24gbnVtYmVyIGlzIGNvbnNpZGVyZWQgdG8gYmUKKyAgKHR5cGVfb2ZfbG9hZGVyICYgMHgwZikgKyAoZXh0X2xvYWRlcl92ZXIgPDwgNCkuCisKKyAgVGhlIHVzZSBvZiB0aGlzIGZpZWxkIGlzIGJvb3QgbG9hZGVyIHNwZWNpZmljLiAgSWYgbm90IHdyaXR0ZW4sIGl0CisgIGlzIHplcm8uCisKKyAgS2VybmVscyBwcmlvciB0byAyLjYuMzEgZGlkIG5vdCByZWNvZ25pemUgdGhpcyBmaWVsZCwgYnV0IGl0IGlzIHNhZmUKKyAgdG8gd3JpdGUgZm9yIHByb3RvY29sIHZlcnNpb24gMi4wMiBvciBoaWdoZXIuCisKK0ZpZWxkIG5hbWU6CWV4dF9sb2FkZXJfdHlwZQorVHlwZToJCXdyaXRlIChvYmxpZ2F0b3J5IGlmICh0eXBlX29mX2xvYWRlciAmIDB4ZjApID09IDB4ZTApCitPZmZzZXQvc2l6ZToJMHgyMjcvMQorUHJvdG9jb2w6CTIuMDIrCisKKyAgVGhpcyBmaWVsZCBpcyB1c2VkIGFzIGFuIGV4dGVuc2lvbiBvZiB0aGUgdHlwZSBudW1iZXIgaW4KKyAgdHlwZV9vZl9sb2FkZXIgZmllbGQuICBJZiB0aGUgdHlwZSBpbiB0eXBlX29mX2xvYWRlciBpcyAweEUsIHRoZW4KKyAgdGhlIGFjdHVhbCB0eXBlIGlzIChleHRfbG9hZGVyX3R5cGUgKyAweDEwKS4KKworICBUaGlzIGZpZWxkIGlzIGlnbm9yZWQgaWYgdGhlIHR5cGUgaW4gdHlwZV9vZl9sb2FkZXIgaXMgbm90IDB4RS4KKworICBLZXJuZWxzIHByaW9yIHRvIDIuNi4zMSBkaWQgbm90IHJlY29nbml6ZSB0aGlzIGZpZWxkLCBidXQgaXQgaXMgc2FmZQorICB0byB3cml0ZSBmb3IgcHJvdG9jb2wgdmVyc2lvbiAyLjAyIG9yIGhpZ2hlci4KKwogRmllbGQgbmFtZToJY21kX2xpbmVfcHRyCiBUeXBlOgkJd3JpdGUgKG9ibGlnYXRvcnkpCiBPZmZzZXQvc2l6ZToJMHgyMjgvNApAQCAtNDgyLDExICs1MzQsMTkgQEAKICAgMHgzN0ZGRkZGRiwgeW91IGNhbiBzdGFydCB5b3VyIHJhbWRpc2sgYXQgMHgzN0ZFMDAwMC4pCiAKIEZpZWxkIG5hbWU6CWtlcm5lbF9hbGlnbm1lbnQKLVR5cGU6CQlyZWFkIChyZWxvYykKK1R5cGU6CQlyZWFkL21vZGlmeSAocmVsb2MpCiBPZmZzZXQvc2l6ZToJMHgyMzAvNAotUHJvdG9jb2w6CTIuMDUrCitQcm90b2NvbDoJMi4wNSsgKHJlYWQpLCAyLjEwKyAobW9kaWZ5KQogCi0gIEFsaWdubWVudCB1bml0IHJlcXVpcmVkIGJ5IHRoZSBrZXJuZWwgKGlmIHJlbG9jYXRhYmxlX2tlcm5lbCBpcyB0cnVlLikKKyAgQWxpZ25tZW50IHVuaXQgcmVxdWlyZWQgYnkgdGhlIGtlcm5lbCAoaWYgcmVsb2NhdGFibGVfa2VybmVsIGlzCisgIHRydWUuKSAgQSByZWxvY2F0YWJsZSBrZXJuZWwgdGhhdCBpcyBsb2FkZWQgYXQgYW4gYWxpZ25tZW50CisgIGluY29tcGF0aWJsZSB3aXRoIHRoZSB2YWx1ZSBpbiB0aGlzIGZpZWxkIHdpbGwgYmUgcmVhbGlnbmVkIGR1cmluZworICBrZXJuZWwgaW5pdGlhbGl6YXRpb24uCisKKyAgU3RhcnRpbmcgd2l0aCBwcm90b2NvbCB2ZXJzaW9uIDIuMTAsIHRoaXMgcmVmbGVjdHMgdGhlIGtlcm5lbAorICBhbGlnbm1lbnQgcHJlZmVycmVkIGZvciBvcHRpbWFsIHBlcmZvcm1hbmNlOyBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlCisgIGxvYWRlciB0byBtb2RpZnkgdGhpcyBmaWVsZCB0byBwZXJtaXQgYSBsZXNzZXIgYWxpZ25tZW50LiAgU2VlIHRoZQorICBtaW5fYWxpZ25tZW50IGFuZCBwcmVmX2FkZHJlc3MgZmllbGQgYmVsb3cuCiAKIEZpZWxkIG5hbWU6CXJlbG9jYXRhYmxlX2tlcm5lbAogVHlwZToJCXJlYWQgKHJlbG9jKQpAQCAtNDk4LDYgKzU1OCwyMiBAQAogICBBZnRlciBsb2FkaW5nLCB0aGUgYm9vdCBsb2FkZXIgbXVzdCBzZXQgdGhlIGNvZGUzMl9zdGFydCBmaWVsZCB0bwogICBwb2ludCB0byB0aGUgbG9hZGVkIGNvZGUsIG9yIHRvIGEgYm9vdCBsb2FkZXIgaG9vay4KIAorRmllbGQgbmFtZToJbWluX2FsaWdubWVudAorVHlwZToJCXJlYWQgKHJlbG9jKQorT2Zmc2V0L3NpemU6CTB4MjM1LzEKK1Byb3RvY29sOgkyLjEwKworCisgIFRoaXMgZmllbGQsIGlmIG5vbnplcm8sIGluZGljYXRlcyBhcyBhIHBvd2VyIG9mIHR3byB0aGUgbWluaW11bQorICBhbGlnbm1lbnQgcmVxdWlyZWQsIGFzIG9wcG9zZWQgdG8gcHJlZmVycmVkLCBieSB0aGUga2VybmVsIHRvIGJvb3QuCisgIElmIGEgYm9vdCBsb2FkZXIgbWFrZXMgdXNlIG9mIHRoaXMgZmllbGQsIGl0IHNob3VsZCB1cGRhdGUgdGhlCisgIGtlcm5lbF9hbGlnbm1lbnQgZmllbGQgd2l0aCB0aGUgYWxpZ25tZW50IHVuaXQgZGVzaXJlZDsgdHlwaWNhbGx5OgorCisJa2VybmVsX2FsaWdubWVudCA9IDEgPDwgbWluX2FsaWdubWVudAorCisgIFRoZXJlIG1heSBiZSBhIGNvbnNpZGVyYWJsZSBwZXJmb3JtYW5jZSBjb3N0IHdpdGggYW4gZXhjZXNzaXZlbHkKKyAgbWlzYWxpZ25lZCBrZXJuZWwuICBUaGVyZWZvcmUsIGEgbG9hZGVyIHNob3VsZCB0eXBpY2FsbHkgdHJ5IGVhY2gKKyAgcG93ZXItb2YtdHdvIGFsaWdubWVudCBmcm9tIGtlcm5lbF9hbGlnbm1lbnQgZG93biB0byB0aGlzIGFsaWdubWVudC4KKwogRmllbGQgbmFtZToJY21kbGluZV9zaXplCiBUeXBlOgkJcmVhZAogT2Zmc2V0L3NpemU6CTB4MjM4LzQKQEAgLTU4Miw2ICs2NTgsMzYgQEAKICAgc3VyZSB0byBjb25zaWRlciB0aGUgY2FzZSB3aGVyZSB0aGUgbGlua2VkIGxpc3QgYWxyZWFkeSBjb250YWlucwogICBlbnRyaWVzLgogCitGaWVsZCBuYW1lOglwcmVmX2FkZHJlc3MKK1R5cGU6CQlyZWFkIChyZWxvYykKK09mZnNldC9zaXplOgkweDI1OC84CitQcm90b2NvbDoJMi4xMCsKKworICBUaGlzIGZpZWxkLCBpZiBub256ZXJvLCByZXByZXNlbnRzIGEgcHJlZmVycmVkIGxvYWQgYWRkcmVzcyBmb3IgdGhlCisgIGtlcm5lbC4gIEEgcmVsb2NhdGluZyBib290bG9hZGVyIHNob3VsZCBhdHRlbXB0IHRvIGxvYWQgYXQgdGhpcworICBhZGRyZXNzIGlmIHBvc3NpYmxlLgorCisgIEEgbm9uLXJlbG9jYXRhYmxlIGtlcm5lbCB3aWxsIHVuY29uZGl0aW9uYWxseSBtb3ZlIGl0c2VsZiBhbmQgdG8gcnVuCisgIGF0IHRoaXMgYWRkcmVzcy4KKworRmllbGQgbmFtZToJaW5pdF9zaXplCitUeXBlOgkJcmVhZAorT2Zmc2V0L3NpemU6CTB4MjVjLzQKKworICBUaGlzIGZpZWxkIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIGxpbmVhciBjb250aWd1b3VzIG1lbW9yeSBzdGFydGluZworICBhdCB0aGUga2VybmVsIHJ1bnRpbWUgc3RhcnQgYWRkcmVzcyB0aGF0IHRoZSBrZXJuZWwgbmVlZHMgYmVmb3JlIGl0CisgIGlzIGNhcGFibGUgb2YgZXhhbWluaW5nIGl0cyBtZW1vcnkgbWFwLiAgVGhpcyBpcyBub3QgdGhlIHNhbWUgdGhpbmcKKyAgYXMgdGhlIHRvdGFsIGFtb3VudCBvZiBtZW1vcnkgdGhlIGtlcm5lbCBuZWVkcyB0byBib290LCBidXQgaXQgY2FuCisgIGJlIHVzZWQgYnkgYSByZWxvY2F0aW5nIGJvb3QgbG9hZGVyIHRvIGhlbHAgc2VsZWN0IGEgc2FmZSBsb2FkCisgIGFkZHJlc3MgZm9yIHRoZSBrZXJuZWwuCisKKyAgVGhlIGtlcm5lbCBydW50aW1lIHN0YXJ0IGFkZHJlc3MgaXMgZGV0ZXJtaW5lZCBieSB0aGUgZm9sbG93aW5nIGFsZ29yaXRobToKKworICBpZiAocmVsb2NhdGFibGVfa2VybmVsKQorCXJ1bnRpbWVfc3RhcnQgPSBhbGlnbl91cChsb2FkX2FkZHJlc3MsIGtlcm5lbF9hbGlnbm1lbnQpCisgIGVsc2UKKwlydW50aW1lX3N0YXJ0ID0gcHJlZl9hZGRyZXNzCisKIAogKioqKiBUSEUgSU1BR0UgQ0hFQ0tTVU0KIApkaWZmIC0tZ2l0IGEvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvYm9vdC1vcHRpb25zLnR4dAppbmRleCAzNGMxMzA0Li4yZGI1ODkzIDEwMDY0NAotLS0gYS9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvYm9vdC1vcHRpb25zLnR4dAorKysgYi9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvYm9vdC1vcHRpb25zLnR4dApAQCAtMTUwLDExICsxNTAsNiBAQAogCQlPdGhlcndpc2UsIHRoZSByZW1haW5pbmcgc3lzdGVtIFJBTSBpcyBhbGxvY2F0ZWQgdG8gYW4KIAkJYWRkaXRpb25hbCBub2RlLgogCi0gIG51bWE9aG90YWRkPXBlcmNlbnQKLQkJT25seSBhbGxvdyBob3RhZGQgbWVtb3J5IHRvIHByZWFsbG9jYXRlIHBhZ2Ugc3RydWN0dXJlcyB1cHRvCi0JCXBlcmNlbnQgb2YgYWxyZWFkeSBhdmFpbGFibGUgbWVtb3J5LgotCQludW1hPWhvdGFkZD0wIHdpbGwgZGlzYWJsZSBob3RhZGQgbWVtb3J5LgotCiBBQ1BJCiAKICAgYWNwaT1vZmYJRG9uJ3QgZW5hYmxlIEFDUEkKZGlmZiAtLWdpdCBhL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9tbS50eHQgYi9Eb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0CmluZGV4IDI5YjUyYjEuLmQ2NDk4ZTMgMTAwNjQ0Ci0tLSBhL0RvY3VtZW50YXRpb24veDg2L3g4Nl82NC9tbS50eHQKKysrIGIvRG9jdW1lbnRhdGlvbi94ODYveDg2XzY0L21tLnR4dApAQCAtNiwxMCArNiwxMSBAQAogMDAwMDAwMDAwMDAwMDAwMCAtIDAwMDA3ZmZmZmZmZmZmZmYgKD00NyBiaXRzKSB1c2VyIHNwYWNlLCBkaWZmZXJlbnQgcGVyIG1tCiBob2xlIGNhdXNlZCBieSBbNDg6NjNdIHNpZ24gZXh0ZW5zaW9uCiBmZmZmODAwMDAwMDAwMDAwIC0gZmZmZjgwZmZmZmZmZmZmZiAoPTQwIGJpdHMpIGd1YXJkIGhvbGUKLWZmZmY4ODAwMDAwMDAwMDAgLSBmZmZmYzBmZmZmZmZmZmZmICg9NTcgVEIpIGRpcmVjdCBtYXBwaW5nIG9mIGFsbCBwaHlzLiBtZW1vcnkKLWZmZmZjMTAwMDAwMDAwMDAgLSBmZmZmYzFmZmZmZmZmZmZmICg9NDAgYml0cykgaG9sZQotZmZmZmMyMDAwMDAwMDAwMCAtIGZmZmZlMWZmZmZmZmZmZmYgKD00NSBiaXRzKSB2bWFsbG9jL2lvcmVtYXAgc3BhY2UKLWZmZmZlMjAwMDAwMDAwMDAgLSBmZmZmZTJmZmZmZmZmZmZmICg9NDAgYml0cykgdmlydHVhbCBtZW1vcnkgbWFwICgxVEIpCitmZmZmODgwMDAwMDAwMDAwIC0gZmZmZmM3ZmZmZmZmZmZmZiAoPTY0IFRCKSBkaXJlY3QgbWFwcGluZyBvZiBhbGwgcGh5cy4gbWVtb3J5CitmZmZmYzgwMDAwMDAwMDAwIC0gZmZmZmM4ZmZmZmZmZmZmZiAoPTQwIGJpdHMpIGhvbGUKK2ZmZmZjOTAwMDAwMDAwMDAgLSBmZmZmZThmZmZmZmZmZmZmICg9NDUgYml0cykgdm1hbGxvYy9pb3JlbWFwIHNwYWNlCitmZmZmZTkwMDAwMDAwMDAwIC0gZmZmZmU5ZmZmZmZmZmZmZiAoPTQwIGJpdHMpIGhvbGUKK2ZmZmZlYTAwMDAwMDAwMDAgLSBmZmZmZWFmZmZmZmZmZmZmICg9NDAgYml0cykgdmlydHVhbCBtZW1vcnkgbWFwICgxVEIpCiAuLi4gdW51c2VkIGhvbGUgLi4uCiBmZmZmZmZmZjgwMDAwMDAwIC0gZmZmZmZmZmZhMDAwMDAwMCAoPTUxMiBNQikgIGtlcm5lbCB0ZXh0IG1hcHBpbmcsIGZyb20gcGh5cyAwCiBmZmZmZmZmZmEwMDAwMDAwIC0gZmZmZmZmZmZmZmYwMDAwMCAoPTE1MzYgTUIpIG1vZHVsZSBtYXBwaW5nIHNwYWNlCmRpZmYgLS1naXQgYS9NQUlOVEFJTkVSUyBiL01BSU5UQUlORVJTCmluZGV4IGNmNGFiZGQuLmZkMjRhZjIgMTAwNjQ0Ci0tLSBhL01BSU5UQUlORVJTCisrKyBiL01BSU5UQUlORVJTCkBAIC00MzkyLDYgKzQzOTIsMTYgQEAKIEY6CWluY2x1ZGUvbGludXgvZGVsYXlhY2N0LmgKIEY6CWtlcm5lbC9kZWxheWFjY3QuYwogCitQRVJGT1JNQU5DRSBDT1VOVEVSIFNVQlNZU1RFTQorUDoJUGV0ZXIgWmlqbHN0cmEKK006CWEucC56aWpsc3RyYUBjaGVsbG8ubmwKK1A6CVBhdWwgTWFja2VycmFzCitNOglwYXVsdXNAc2FtYmEub3JnCitQOglJbmdvIE1vbG5hcgorTToJbWluZ29AZWx0ZS5odQorTDoJbGludXgta2VybmVsQHZnZXIua2VybmVsLm9yZworUzoJU3VwcG9ydGVkCisKIFBFUlNPTkFMSVRZIEhBTkRMSU5HCiBQOglDaHJpc3RvcGggSGVsbHdpZwogTToJaGNoQGluZnJhZGVhZC5vcmcKZGlmZiAtLWdpdCBhL2FyY2gvYWxwaGEva2VybmVsL3N5c19kcDI2NC5jIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKaW5kZXggOWM5ZDFmZC4uNWJkNTI1OSAxMDA2NDQKLS0tIGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKKysrIGIvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX2RwMjY0LmMKQEAgLTE3NiwyMiArMTc2LDI2IEBACiAJfQogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogZHAyNjRfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSkKIHsgCiAJc3Bpbl9sb2NrKCZkcDI2NF9pcnFfbG9jayk7CiAJY3B1X3NldF9pcnFfYWZmaW5pdHkoaXJxLCAqYWZmaW5pdHkpOwogCXRzdW5hbWlfdXBkYXRlX2lycV9odyhjYWNoZWRfaXJxX21hc2spOwogCXNwaW5fdW5sb2NrKCZkcDI2NF9pcnFfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGNsaXBwZXJfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICphZmZpbml0eSkKIHsgCiAJc3Bpbl9sb2NrKCZkcDI2NF9pcnFfbG9jayk7CiAJY3B1X3NldF9pcnFfYWZmaW5pdHkoaXJxIC0gMTYsICphZmZpbml0eSk7CiAJdHN1bmFtaV91cGRhdGVfaXJxX2h3KGNhY2hlZF9pcnFfbWFzayk7CiAJc3Bpbl91bmxvY2soJmRwMjY0X2lycV9sb2NrKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IGh3X2ludGVycnVwdF90eXBlIGRwMjY0X2lycV90eXBlID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9hbHBoYS9rZXJuZWwvc3lzX3RpdGFuLmMgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYwppbmRleCAyN2Y4NDBhLi44ZGQyMzllIDEwMDY0NAotLS0gYS9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYworKysgYi9hcmNoL2FscGhhL2tlcm5lbC9zeXNfdGl0YW4uYwpAQCAtMTU3LDEzICsxNTcsMTUgQEAKIAogfQogCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogdGl0YW5fc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHkpCiB7IAogCXNwaW5fbG9jaygmdGl0YW5faXJxX2xvY2spOwogCXRpdGFuX2NwdV9zZXRfaXJxX2FmZmluaXR5KGlycSAtIDE2LCAqYWZmaW5pdHkpOwogCXRpdGFuX3VwZGF0ZV9pcnFfaHcodGl0YW5fY2FjaGVkX2lycV9tYXNrKTsKIAlzcGluX3VubG9jaygmdGl0YW5faXJxX2xvY2spOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB2b2lkCmRpZmYgLS1naXQgYS9hcmNoL2FybS9jb21tb24vZ2ljLmMgYi9hcmNoL2FybS9jb21tb24vZ2ljLmMKaW5kZXggM2UxNzE0Yy4uNjY0YzdiOCAxMDA2NDQKLS0tIGEvYXJjaC9hcm0vY29tbW9uL2dpYy5jCisrKyBiL2FyY2gvYXJtL2NvbW1vbi9naWMuYwpAQCAtMTA5LDcgKzEwOSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBnaWNfc2V0X2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFza192YWwpCitzdGF0aWMgaW50IGdpY19zZXRfY3B1KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrX3ZhbCkKIHsKIAl2b2lkIF9faW9tZW0gKnJlZyA9IGdpY19kaXN0X2Jhc2UoaXJxKSArIEdJQ19ESVNUX1RBUkdFVCArIChnaWNfaXJxKGlycSkgJiB+Myk7CiAJdW5zaWduZWQgaW50IHNoaWZ0ID0gKGlycSAlIDQpICogODsKQEAgLTEyMiw2ICsxMjIsOCBAQAogCXZhbCB8PSAxIDw8IChjcHUgKyBzaGlmdCk7CiAJd3JpdGVsKHZhbCwgcmVnKTsKIAlzcGluX3VubG9jaygmaXJxX2NvbnRyb2xsZXJfbG9jayk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2lycS5jIGIvYXJjaC9jcmlzL2FyY2gtdjMyL2tlcm5lbC9pcnEuYwppbmRleCBkZjM5MjVjLi5kNzBiNDQ1IDEwMDY0NAotLS0gYS9hcmNoL2NyaXMvYXJjaC12MzIva2VybmVsL2lycS5jCisrKyBiL2FyY2gvY3Jpcy9hcmNoLXYzMi9rZXJuZWwvaXJxLmMKQEAgLTMyNSwxMiArMzI1LDE0IEBACiB7CiB9CiAKLXZvaWQgc2V0X2FmZmluaXR5X2NyaXN2MzJfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQoraW50IHNldF9hZmZpbml0eV9jcmlzdjMyX2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXNwaW5fbG9ja19pcnFzYXZlKCZpcnFfbG9jaywgZmxhZ3MpOwogCWlycV9hbGxvY2F0aW9uc1tpcnEgLSBGSVJTVF9JUlFdLm1hc2sgPSAqZGVzdDsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZpcnFfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgY3Jpc3YzMl9pcnFfdHlwZSA9IHsKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9ocC9zaW0vaHBzaW1faXJxLmMgYi9hcmNoL2lhNjQvaHAvc2ltL2hwc2ltX2lycS5jCmluZGV4IGNjMGEzMTguLmFjYjUwNDcgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9ocC9zaW0vaHBzaW1faXJxLmMKKysrIGIvYXJjaC9pYTY0L2hwL3NpbS9ocHNpbV9pcnEuYwpAQCAtMjEsOSArMjEsMTAgQEAKIHsKIH0KIAotc3RhdGljIHZvaWQKK3N0YXRpYyBpbnQKIGhwc2ltX3NldF9hZmZpbml0eV9ub29wKHVuc2lnbmVkIGludCBhLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYikKIHsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBod19pbnRlcnJ1cHRfdHlwZSBpcnFfdHlwZV9ocF9zaW0gPSB7CmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL2FjcGkuYyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCmluZGV4IDU1MTAzMTcuLmJhZWM2ZjAgMTAwNjQ0Ci0tLSBhL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvYWNwaS5jCkBAIC02MzYsNyArNjM2LDcgQEAKICAqIHN1Y2Nlc3M6IHJldHVybiBJUlEgbnVtYmVyICg+PTApCiAgKiBmYWlsdXJlOiByZXR1cm4gPCAwCiAgKi8KLWludCBhY3BpX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQoraW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGdzaSwgaW50IHRyaWdnZXJpbmcsIGludCBwb2xhcml0eSkKIHsKIAlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfUExBVEZPUk0pCiAJCXJldHVybiBnc2k7CkBAIC02NzgsNyArNjc4LDggQEAKIAogCWZhZHQgPSAoc3RydWN0IGFjcGlfdGFibGVfZmFkdCAqKWZhZHRfaGVhZGVyOwogCi0JYWNwaV9yZWdpc3Rlcl9nc2koZmFkdC0+c2NpX2ludGVycnVwdCwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsIEFDUElfQUNUSVZFX0xPVyk7CisJYWNwaV9yZWdpc3Rlcl9nc2koTlVMTCwgZmFkdC0+c2NpX2ludGVycnVwdCwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsCisJCQkJIEFDUElfQUNUSVZFX0xPVyk7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9rZXJuZWwvaW9zYXBpYy5jIGIvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKaW5kZXggMTY2ZTBkOC4uZjkyY2VmNCAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKKysrIGIvYXJjaC9pYTY0L2tlcm5lbC9pb3NhcGljLmMKQEAgLTMyOSw3ICszMjksNyBAQAogfQogCiAKLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBpb3NhcGljX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKICNpZmRlZiBDT05GSUdfU01QCkBAIC0zNDMsMTUgKzM0MywxNSBAQAogCiAJY3B1ID0gY3B1bWFza19maXJzdF9hbmQoY3B1X29ubGluZV9tYXNrLCBtYXNrKTsKIAlpZiAoY3B1ID49IG5yX2NwdV9pZHMpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJaWYgKGlycV9wcmVwYXJlX21vdmUoaXJxLCBjcHUpKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCWRlc3QgPSBjcHVfcGh5c2ljYWxfaWQoY3B1KTsKIAogCWlmICghaW9zYXBpY19pbnRyX2luZm9baXJxXS5jb3VudCkKLQkJcmV0dXJuOwkJCS8qIG5vdCBhbiBJT1NBUElDIGludGVycnVwdCAqLworCQlyZXR1cm4gLTE7CQkJLyogbm90IGFuIElPU0FQSUMgaW50ZXJydXB0ICovCiAKIAlzZXRfaXJxX2FmZmluaXR5X2luZm8oaXJxLCBkZXN0LCByZWRpcik7CiAKQEAgLTM3Niw3ICszNzYsOSBAQAogCQlpb3NhcGljX3dyaXRlKGlvc2FwaWMsIElPU0FQSUNfUlRFX0hJR0gocnRlX2luZGV4KSwgaGlnaDMyKTsKIAkJaW9zYXBpY193cml0ZShpb3NhcGljLCBJT1NBUElDX1JURV9MT1cocnRlX2luZGV4KSwgbG93MzIpOwogCX0KKwogI2VuZGlmCisJcmV0dXJuIDA7CiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMgYi9hcmNoL2lhNjQva2VybmVsL21zaV9pYTY0LmMKaW5kZXggMmIxNWUyMy4uMGY4YWRlOSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L2tlcm5lbC9tc2lfaWE2NC5jCisrKyBiL2FyY2gvaWE2NC9rZXJuZWwvbXNpX2lhNjQuYwpAQCAtMTIsNyArMTIsNyBAQAogc3RhdGljIHN0cnVjdCBpcnFfY2hpcAlpYTY0X21zaV9jaGlwOwogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgaWE2NF9zZXRfbXNpX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLAorc3RhdGljIGludCBpYTY0X3NldF9tc2lfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsCiAJCQkJICAgICAgY29uc3QgY3B1bWFza190ICpjcHVfbWFzaykKIHsKIAlzdHJ1Y3QgbXNpX21zZyBtc2c7CkBAIC0yMCwxMCArMjAsMTAgQEAKIAlpbnQgY3B1ID0gZmlyc3RfY3B1KCpjcHVfbWFzayk7CiAKIAlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAlpZiAoaXJxX3ByZXBhcmVfbW92ZShpcnEsIGNwdSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJcmVhZF9tc2lfbXNnKGlycSwgJm1zZyk7CiAKQEAgLTM5LDYgKzM5LDggQEAKIAogCXdyaXRlX21zaV9tc2coaXJxLCAmbXNnKTsKIAljcHVtYXNrX2NvcHkoaXJxX2Rlc2NbaXJxXS5hZmZpbml0eSwgY3B1bWFza19vZihjcHUpKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApAQCAtMTMwLDE3ICsxMzIsMTcgQEAKIAogI2lmZGVmIENPTkZJR19ETUFSCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgZG1hcl9tc2lfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQorc3RhdGljIGludCBkbWFyX21zaV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJc3RydWN0IGlycV9jZmcgKmNmZyA9IGlycV9jZmcgKyBpcnE7CiAJc3RydWN0IG1zaV9tc2cgbXNnOwogCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0KG1hc2spOwogCiAJaWYgKCFjcHVfb25saW5lKGNwdSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJaWYgKGlycV9wcmVwYXJlX21vdmUoaXJxLCBjcHUpKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCWRtYXJfbXNpX3JlYWQoaXJxLCAmbXNnKTsKIApAQCAtMTUxLDYgKzE1Myw4IEBACiAKIAlkbWFyX21zaV93cml0ZShpcnEsICZtc2cpOwogCWNwdW1hc2tfY29weShpcnFfZGVzY1tpcnFdLmFmZmluaXR5LCBtYXNrKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KIApkaWZmIC0tZ2l0IGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvaXJxLmMKaW5kZXggNjZmZDcwNS4uNzY0ZjI2YSAxMDA2NDQKLS0tIGEvYXJjaC9pYTY0L3NuL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL2lhNjQvc24va2VybmVsL2lycS5jCkBAIC0yMjcsNyArMjI3LDcgQEAKIAlyZXR1cm4gbmV3X2lycV9pbmZvOwogfQogCi1zdGF0aWMgdm9pZCBzbl9zZXRfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQorc3RhdGljIGludCBzbl9zZXRfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXN0cnVjdCBzbl9pcnFfaW5mbyAqc25faXJxX2luZm8sICpzbl9pcnFfaW5mb19zYWZlOwogCW5hc2lkX3QgbmFzaWQ7CkBAIC0yMzksNiArMjM5LDggQEAKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoc25faXJxX2luZm8sIHNuX2lycV9pbmZvX3NhZmUsCiAJCQkJIHNuX2lycV9saFtpcnFdLCBsaXN0KQogCQkodm9pZClzbl9yZXRhcmdldF92ZWN0b3Ioc25faXJxX2luZm8sIG5hc2lkLCBzbGljZSk7CisKKwlyZXR1cm4gMDsKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKZGlmZiAtLWdpdCBhL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMgYi9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jCmluZGV4IDgxZTQyODkuLmZiYmZiOTcwIDEwMDY0NAotLS0gYS9hcmNoL2lhNjQvc24va2VybmVsL21zaV9zbi5jCisrKyBiL2FyY2gvaWE2NC9zbi9rZXJuZWwvbXNpX3NuLmMKQEAgLTE1MSw3ICsxNTEsNyBAQAogfQogCiAjaWZkZWYgQ09ORklHX1NNUAotc3RhdGljIHZvaWQgc25fc2V0X21zaV9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwKK3N0YXRpYyBpbnQgc25fc2V0X21zaV9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwKIAkJCQkgICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdV9tYXNrKQogewogCXN0cnVjdCBtc2lfbXNnIG1zZzsKQEAgLTE2OCw3ICsxNjgsNyBAQAogCWNwdSA9IGNwdW1hc2tfZmlyc3QoY3B1X21hc2spOwogCXNuX2lycV9pbmZvID0gc25fbXNpX2luZm9baXJxXS5zbl9pcnFfaW5mbzsKIAlpZiAoc25faXJxX2luZm8gPT0gTlVMTCB8fCBzbl9pcnFfaW5mby0+aXJxX2ludF9iaXQgPj0gMCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAkvKgogCSAqIFJlbGVhc2UgWElPIHJlc291cmNlcyBmb3IgdGhlIG9sZCBNU0kgUENJIGFkZHJlc3MKQEAgLTE4OSw3ICsxODksNyBAQAogCW5ld19pcnFfaW5mbyA9IHNuX3JldGFyZ2V0X3ZlY3Rvcihzbl9pcnFfaW5mbywgbmFzaWQsIHNsaWNlKTsKIAlzbl9tc2lfaW5mb1tpcnFdLnNuX2lycV9pbmZvID0gbmV3X2lycV9pbmZvOwogCWlmIChuZXdfaXJxX2luZm8gPT0gTlVMTCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAkvKgogCSAqIE1hcCB0aGUgeGlvIGFkZHJlc3MgaW50byBidXMgc3BhY2UKQEAgLTIwNiw2ICsyMDYsOCBAQAogCiAJd3JpdGVfbXNpX21zZyhpcnEsICZtc2cpOwogCWNwdW1hc2tfY29weShpcnFfZGVzY1tpcnFdLmFmZmluaXR5LCBjcHVfbWFzayk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYyBiL2FyY2gvbWlwcy9jYXZpdW0tb2N0ZW9uL29jdGVvbi1pcnEuYwppbmRleCAxYzE5YWY4Li5kM2EwYzgxIDEwMDY0NAotLS0gYS9hcmNoL21pcHMvY2F2aXVtLW9jdGVvbi9vY3Rlb24taXJxLmMKKysrIGIvYXJjaC9taXBzL2Nhdml1bS1vY3Rlb24vb2N0ZW9uLWlycS5jCkBAIC0xNzcsNyArMTc3LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCitzdGF0aWMgaW50IG9jdGVvbl9pcnFfY2l1MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCiB7CiAJaW50IGNwdTsKIAlpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9XT1JLUTA7CS8qIEJpdCAwLTYzIG9mIEVOMCAqLwpAQCAtMTk5LDYgKzE5OSw4IEBACiAJICovCiAJY3ZteF9yZWFkX2NzcihDVk1YX0NJVV9JTlRYX0VOMChjdm14X2dldF9jb3JlX251bSgpICogMikpOwogCXdyaXRlX3VubG9jaygmb2N0ZW9uX2lycV9jaXUwX3J3bG9jayk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCkBAIC0yOTIsNyArMjk0LDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIG9jdGVvbl9pcnFfY2l1MV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCitzdGF0aWMgaW50IG9jdGVvbl9pcnFfY2l1MV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCiB7CiAJaW50IGNwdTsKIAlpbnQgYml0ID0gaXJxIC0gT0NURU9OX0lSUV9XRE9HMDsJLyogQml0IDAtNjMgb2YgRU4xICovCkBAIC0zMTUsNiArMzE3LDggQEAKIAkgKi8KIAljdm14X3JlYWRfY3NyKENWTVhfQ0lVX0lOVFhfRU4xKGN2bXhfZ2V0X2NvcmVfbnVtKCkgKiAyICsgMSkpOwogCXdyaXRlX3VubG9jaygmb2N0ZW9uX2lycV9jaXUxX3J3bG9jayk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXJxLmggYi9hcmNoL21pcHMvaW5jbHVkZS9hc20vaXJxLmgKaW5kZXggMzIxNGFkZS4uNGYxZWVkMSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL2luY2x1ZGUvYXNtL2lycS5oCisrKyBiL2FyY2gvbWlwcy9pbmNsdWRlL2FzbS9pcnEuaApAQCAtNDksNyArNDksNyBAQAogI2lmZGVmIENPTkZJR19NSVBTX01UX1NNVENfSVJRQUZGCiAjaW5jbHVkZSA8bGludXgvY3B1bWFzay5oPgogCi1leHRlcm4gdm9pZCBwbGF0X3NldF9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwKK2V4dGVybiBpbnQgcGxhdF9zZXRfaXJxX2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsCiAJCQkJICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHkpOwogZXh0ZXJuIHZvaWQgc210Y19mb3J3YXJkX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC9taXBzL2tlcm5lbC9pcnEtZ2ljLmMgYi9hcmNoL21pcHMva2VybmVsL2lycS1naWMuYwppbmRleCA4N2RlYjhmLi4zZjQzYzJlIDEwMDY0NAotLS0gYS9hcmNoL21pcHMva2VybmVsL2lycS1naWMuYworKysgYi9hcmNoL21pcHMva2VybmVsL2lycS1naWMuYwpAQCAtMTU1LDcgKzE1NSw3IEBACiAKIHN0YXRpYyBERUZJTkVfU1BJTkxPQ0soZ2ljX2xvY2spOwogCi1zdGF0aWMgdm9pZCBnaWNfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKQorc3RhdGljIGludCBnaWNfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKQogewogCWNwdW1hc2tfdAl0bXAgPSBDUFVfTUFTS19OT05FOwogCXVuc2lnbmVkIGxvbmcJZmxhZ3M7CkBAIC0xNjYsNyArMTY2LDcgQEAKIAogCWNwdW1hc2tfYW5kKCZ0bXAsIGNwdW1hc2ssIGNwdV9vbmxpbmVfbWFzayk7CiAJaWYgKGNwdXNfZW1wdHkodG1wKSkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAkvKiBBc3N1bXB0aW9uIDogY3B1bWFzayByZWZlcnMgdG8gYSBzaW5nbGUgQ1BVICovCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmdpY19sb2NrLCBmbGFncyk7CkBAIC0xOTAsNiArMTkwLDcgQEAKIAljcHVtYXNrX2NvcHkoaXJxX2Rlc2NbaXJxXS5hZmZpbml0eSwgY3B1bWFzayk7CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZ2ljX2xvY2ssIGZsYWdzKTsKIAorCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9tdGktbWFsdGEvbWFsdGEtc210Yy5jIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zbXRjLmMKaW5kZXggNWJhMzE4OC4uNDk5ZmZlNSAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zbXRjLmMKKysrIGIvYXJjaC9taXBzL210aS1tYWx0YS9tYWx0YS1zbXRjLmMKQEAgLTExNCw3ICsxMTQsNyBAQAogICovCiAKIAotdm9pZCBwbGF0X3NldF9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmFmZmluaXR5KQoraW50IHBsYXRfc2V0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqYWZmaW5pdHkpCiB7CiAJY3B1bWFza190IHRtYXNrOwogCWludCBjcHUgPSAwOwpAQCAtMTU2LDUgKzE1Niw3IEBACiAKIAkvKiBEbyBhbnkgZ2VuZXJpYyBTTVRDIElSUSBhZmZpbml0eSBzZXR1cCAqLwogCXNtdGNfc2V0X2lycV9hZmZpbml0eShpcnEsIHRtYXNrKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmIC8qIENPTkZJR19NSVBTX01UX1NNVENfSVJRQUZGICovCmRpZmYgLS1naXQgYS9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMgYi9hcmNoL21pcHMvc2lieXRlL2JjbTE0ODAvaXJxLmMKaW5kZXggYzE0N2M0Yi4uNjkwZGUwNiAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9iY20xNDgwL2lycS5jCisrKyBiL2FyY2gvbWlwcy9zaWJ5dGUvYmNtMTQ4MC9pcnEuYwpAQCAtNTAsNyArNTAsNyBAQAogc3RhdGljIHZvaWQgZGlzYWJsZV9iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGFja19iY20xNDgwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBiY20xNDgwX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CitzdGF0aWMgaW50IGJjbTE0ODBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1BDSQpAQCAtMTA5LDcgKzEwOSw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBiY20xNDgwX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3N0YXRpYyBpbnQgYmNtMTQ4MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJaW50IGkgPSAwLCBvbGRfY3B1LCBjcHUsIGludF9vbiwgazsKIAl1NjQgY3VyX2ludHM7CkBAIC0xMTgsNyArMTE4LDcgQEAKIAogCWlmIChjcHVtYXNrX3dlaWdodChtYXNrKSAhPSAxKSB7CiAJCXByaW50aygiYXR0ZW1wdGVkIHRvIHNldCBpcnEgYWZmaW5pdHkgZm9yIGlycSAlZCB0byBtdWx0aXBsZSBDUFVzXG4iLCBpcnEpOwotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAl9CiAJaSA9IGNwdW1hc2tfZmlyc3QobWFzayk7CiAKQEAgLTE1Miw2ICsxNTIsOCBAQAogCQl9CiAJfQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmJjbTE0ODBfaW1yX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvbWlwcy9zaWJ5dGUvc2IxMjUwL2lycS5jIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKaW5kZXggMzhjYjk5OC4uNDA5ZGVjNyAxMDA2NDQKLS0tIGEvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKKysrIGIvYXJjaC9taXBzL3NpYnl0ZS9zYjEyNTAvaXJxLmMKQEAgLTUwLDcgKzUwLDcgQEAKIHN0YXRpYyB2b2lkIGRpc2FibGVfc2IxMjUwX2lycSh1bnNpZ25lZCBpbnQgaXJxKTsKIHN0YXRpYyB2b2lkIGFja19zYjEyNTBfaXJxKHVuc2lnbmVkIGludCBpcnEpOwogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIHNiMTI1MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spOworc3RhdGljIGludCBzYjEyNTBfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1NJQllURV9IQVNfTERUCkBAIC0xMDMsNyArMTAzLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIHNiMTI1MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCitzdGF0aWMgaW50IHNiMTI1MF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJaW50IGkgPSAwLCBvbGRfY3B1LCBjcHUsIGludF9vbjsKIAl1NjQgY3VyX2ludHM7CkBAIC0xMTMsNyArMTEzLDcgQEAKIAogCWlmIChjcHVtYXNrX3dlaWdodChtYXNrKSA+IDEpIHsKIAkJcHJpbnRrKCJhdHRlbXB0ZWQgdG8gc2V0IGlycSBhZmZpbml0eSBmb3IgaXJxICVkIHRvIG11bHRpcGxlIENQVXNcbiIsIGlycSk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCX0KIAogCS8qIENvbnZlcnQgbG9naWNhbCBDUFUgdG8gcGh5c2ljYWwgQ1BVICovCkBAIC0xNDMsNiArMTQzLDggQEAKIAkJCQkJUl9JTVJfSU5URVJSVVBUX01BU0spKTsKIAl9CiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmc2IxMjUwX2ltcl9sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMgYi9hcmNoL3BhcmlzYy9rZXJuZWwvaXJxLmMKaW5kZXggNGVhNDIyOS4uODAwN2YxZSAxMDA2NDQKLS0tIGEvYXJjaC9wYXJpc2Mva2VybmVsL2lycS5jCisrKyBiL2FyY2gvcGFyaXNjL2tlcm5lbC9pcnEuYwpAQCAtMTMwLDE1ICsxMzAsMTcgQEAKIAlyZXR1cm4gY3B1X2Rlc3Q7CiB9CiAKLXN0YXRpYyB2b2lkIGNwdV9zZXRfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQorc3RhdGljIGludCBjcHVfc2V0X2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCkKIHsKIAlpbnQgY3B1X2Rlc3Q7CiAKIAljcHVfZGVzdCA9IGNwdV9jaGVja19hZmZpbml0eShpcnEsIGRlc3QpOwogCWlmIChjcHVfZGVzdCA8IDApCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJY3B1bWFza19jb3B5KCZpcnFfZGVzY1tpcnFdLmFmZmluaXR5LCBkZXN0KTsKKworCXJldHVybiAwOwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9od19pcnEuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9od19pcnEuaAppbmRleCBiN2UwMzRiLi4yMGE0NGQwIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vaHdfaXJxLmgKKysrIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL2h3X2lycS5oCkBAIC0xMzEsNSArMTMxLDQ0IEBACiAgKi8KIHN0cnVjdCBpcnFfY2hpcDsKIAorI2lmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdGVzdF9wZXJmX2NvdW50ZXJfcGVuZGluZyh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgeDsKKworCWFzbSB2b2xhdGlsZSgibGJ6ICUwLCUxKDEzKSIKKwkJOiAiPXIiICh4KQorCQk6ICJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBwZXJmX2NvdW50ZXJfcGVuZGluZykpKTsKKwlyZXR1cm4geDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wZXJmX2NvdW50ZXJfcGVuZGluZyh2b2lkKQoreworCWFzbSB2b2xhdGlsZSgic3RiICUwLCUxKDEzKSIgOiA6CisJCSJyIiAoMSksCisJCSJpIiAob2Zmc2V0b2Yoc3RydWN0IHBhY2Ffc3RydWN0LCBwZXJmX2NvdW50ZXJfcGVuZGluZykpKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3BlcmZfY291bnRlcl9wZW5kaW5nKHZvaWQpCit7CisJYXNtIHZvbGF0aWxlKCJzdGIgJTAsJTEoMTMpIiA6IDoKKwkJInIiICgwKSwKKwkJImkiIChvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHBlcmZfY291bnRlcl9wZW5kaW5nKSkpOworfQorCitleHRlcm4gdm9pZCBwZXJmX2NvdW50ZXJfZG9fcGVuZGluZyh2b2lkKTsKKworI2Vsc2UKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHRlc3RfcGVyZl9jb3VudGVyX3BlbmRpbmcodm9pZCkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHNldF9wZXJmX2NvdW50ZXJfcGVuZGluZyh2b2lkKSB7fQorc3RhdGljIGlubGluZSB2b2lkIGNsZWFyX3BlcmZfY291bnRlcl9wZW5kaW5nKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9jb3VudGVyX2RvX3BlbmRpbmcodm9pZCkge30KKyNlbmRpZiAvKiBDT05GSUdfUEVSRl9DT1VOVEVSUyAqLworCiAjZW5kaWYJLyogX19LRVJORUxfXyAqLwogI2VuZGlmCS8qIF9BU01fUE9XRVJQQ19IV19JUlFfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaCBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wYWNhLmgKaW5kZXggMDgyYjNhZS4uNmVmMDU1NyAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3BhY2EuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGFjYS5oCkBAIC05OSw2ICs5OSw3IEBACiAJdTggc29mdF9lbmFibGVkOwkJLyogaXJxIHNvZnQtZW5hYmxlIGZsYWcgKi8KIAl1OCBoYXJkX2VuYWJsZWQ7CQkvKiBzZXQgaWYgaXJxcyBhcmUgZW5hYmxlZCBpbiBNU1IgKi8KIAl1OCBpb19zeW5jOwkJCS8qIHdyaXRlbCgpIG5lZWRzIHNwaW5fdW5sb2NrIHN5bmMgKi8KKwl1OCBwZXJmX2NvdW50ZXJfcGVuZGluZzsJLyogUE0gaW50ZXJydXB0IHdoaWxlIHNvZnQtZGlzYWJsZWQgKi8KIAogCS8qIFN0dWZmIGZvciBhY2N1cmF0ZSB0aW1lIGFjY291bnRpbmcgKi8KIAl1NjQgdXNlcl90aW1lOwkJCS8qIGFjY3VtdWxhdGVkIHVzZXJtb2RlIFRCIHRpY2tzICovCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGVyZl9jb3VudGVyLmggYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcGVyZl9jb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M3Yzg4NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9wZXJmX2NvdW50ZXIuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogUGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IC0gUG93ZXJQQy1zcGVjaWZpYyBkZWZpbml0aW9ucy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisKKyNkZWZpbmUgTUFYX0hXQ09VTlRFUlMJCTgKKyNkZWZpbmUgTUFYX0VWRU5UX0FMVEVSTkFUSVZFUwk4CisjZGVmaW5lIE1BWF9MSU1JVEVEX0hXQ09VTlRFUlMJMgorCisvKgorICogVGhpcyBzdHJ1Y3QgcHJvdmlkZXMgdGhlIGNvbnN0YW50cyBhbmQgZnVuY3Rpb25zIG5lZWRlZCB0bworICogZGVzY3JpYmUgdGhlIFBNVSBvbiBhIHBhcnRpY3VsYXIgUE9XRVItZmFtaWx5IENQVS4KKyAqLworc3RydWN0IHBvd2VyX3BtdSB7CisJaW50CW5fY291bnRlcjsKKwlpbnQJbWF4X2FsdGVybmF0aXZlczsKKwl1NjQJYWRkX2ZpZWxkczsKKwl1NjQJdGVzdF9hZGRlcjsKKwlpbnQJKCpjb21wdXRlX21tY3IpKHU2NCBldmVudHNbXSwgaW50IG5fZXYsCisJCQkJdW5zaWduZWQgaW50IGh3Y1tdLCB1NjQgbW1jcltdKTsKKwlpbnQJKCpnZXRfY29uc3RyYWludCkodTY0IGV2ZW50LCB1NjQgKm1za3AsIHU2NCAqdmFscCk7CisJaW50CSgqZ2V0X2FsdGVybmF0aXZlcykodTY0IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MsCisJCQkJICAgIHU2NCBhbHRbXSk7CisJdm9pZAkoKmRpc2FibGVfcG1jKSh1bnNpZ25lZCBpbnQgcG1jLCB1NjQgbW1jcltdKTsKKwlpbnQJKCpsaW1pdGVkX3BtY19ldmVudCkodTY0IGV2ZW50KTsKKwl1MzIJZmxhZ3M7CisJaW50CW5fZ2VuZXJpYzsKKwlpbnQJKmdlbmVyaWNfZXZlbnRzOworCWludAkoKmNhY2hlX2V2ZW50cylbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkgICAgICAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJICAgICAgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdOworfTsKKworZXh0ZXJuIHN0cnVjdCBwb3dlcl9wbXUgKnBwbXU7CisKKy8qCisgKiBWYWx1ZXMgZm9yIHBvd2VyX3BtdS5mbGFncworICovCisjZGVmaW5lIFBQTVVfTElNSVRFRF9QTUM1XzYJMQkvKiBQTUM1LzYgaGF2ZSBsaW1pdGVkIGZ1bmN0aW9uICovCisjZGVmaW5lIFBQTVVfQUxUX1NJUFIJCTIJLyogdXNlcyBhbHRlcm5hdGUgcG9zbiBmb3IgU0lQUi9IViAqLworCisvKgorICogVmFsdWVzIGZvciBmbGFncyB0byBnZXRfYWx0ZXJuYXRpdmVzKCkKKyAqLworI2RlZmluZSBQUE1VX0xJTUlURURfUE1DX09LCTEJLyogY2FuIHB1dCB0aGlzIG9uIGEgbGltaXRlZCBQTUMgKi8KKyNkZWZpbmUgUFBNVV9MSU1JVEVEX1BNQ19SRVFECTIJLyogaGF2ZSB0byBwdXQgdGhpcyBvbiBhIGxpbWl0ZWQgUE1DICovCisjZGVmaW5lIFBQTVVfT05MWV9DT1VOVF9SVU4JNAkvKiBvbmx5IGNvdW50aW5nIGluIHJ1biBzdGF0ZSAqLworCitzdHJ1Y3QgcHRfcmVnczsKK2V4dGVybiB1bnNpZ25lZCBsb25nIHBlcmZfbWlzY19mbGFncyhzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisjZGVmaW5lIHBlcmZfbWlzY19mbGFncyhyZWdzKQlwZXJmX21pc2NfZmxhZ3MocmVncykKKworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGVyZl9pbnN0cnVjdGlvbl9wb2ludGVyKHN0cnVjdCBwdF9yZWdzICpyZWdzKTsKKworLyoKKyAqIFRoZSBwb3dlcl9wbXUuZ2V0X2NvbnN0cmFpbnQgZnVuY3Rpb24gcmV0dXJucyBhIDY0LWJpdCB2YWx1ZSBhbmQKKyAqIGEgNjQtYml0IG1hc2sgdGhhdCBleHByZXNzIHRoZSBjb25zdHJhaW50cyBiZXR3ZWVuIHRoaXMgZXZlbnQgYW5kCisgKiBvdGhlciBldmVudHMuCisgKgorICogVGhlIHZhbHVlIGFuZCBtYXNrIGFyZSBkaXZpZGVkIHVwIGludG8gKG5vbi1vdmVybGFwcGluZykgYml0ZmllbGRzCisgKiBvZiB0aHJlZSBkaWZmZXJlbnQgdHlwZXM6CisgKgorICogU2VsZWN0IGZpZWxkOiB0aGlzIGV4cHJlc3NlcyB0aGUgY29uc3RyYWludCB0aGF0IHNvbWUgc2V0IG9mIGJpdHMKKyAqIGluIE1NQ1IqIG5lZWRzIHRvIGJlIHNldCB0byBhIHNwZWNpZmljIHZhbHVlIGZvciB0aGlzIGV2ZW50LiAgRm9yIGEKKyAqIHNlbGVjdCBmaWVsZCwgdGhlIG1hc2sgY29udGFpbnMgMXMgaW4gZXZlcnkgYml0IG9mIHRoZSBmaWVsZCwgYW5kCisgKiB0aGUgdmFsdWUgY29udGFpbnMgYSB1bmlxdWUgdmFsdWUgZm9yIGVhY2ggcG9zc2libGUgc2V0dGluZyBvZiB0aGUKKyAqIE1NQ1IqIGJpdHMuICBUaGUgY29uc3RyYWludCBjaGVja2luZyBjb2RlIHdpbGwgZW5zdXJlIHRoYXQgdHdvIGV2ZW50cworICogdGhhdCBzZXQgdGhlIHNhbWUgZmllbGQgaW4gdGhlaXIgbWFza3MgaGF2ZSB0aGUgc2FtZSB2YWx1ZSBpbiB0aGVpcgorICogdmFsdWUgZHdvcmRzLgorICoKKyAqIEFkZCBmaWVsZDogdGhpcyBleHByZXNzZXMgdGhlIGNvbnN0cmFpbnQgdGhhdCB0aGVyZSBjYW4gYmUgYXQgbW9zdAorICogTiBldmVudHMgaW4gYSBwYXJ0aWN1bGFyIGNsYXNzLiAgQSBmaWVsZCBvZiBrIGJpdHMgY2FuIGJlIHVzZWQgZm9yCisgKiBOIDw9IDJeKGstMSkgLSAxLiAgVGhlIG1hc2sgaGFzIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgZmllbGQKKyAqIHNldCAoYW5kIHRoZSBvdGhlciBiaXRzIDApLCBhbmQgdGhlIHZhbHVlIGhhcyBvbmx5IHRoZSBsZWFzdCBzaWduaWZpY2FudAorICogYml0IG9mIHRoZSBmaWVsZCBzZXQuICBJbiBhZGRpdGlvbiwgdGhlICdhZGRfZmllbGRzJyBhbmQgJ3Rlc3RfYWRkZXInCisgKiBpbiB0aGUgc3RydWN0IHBvd2VyX3BtdSBmb3IgdGhpcyBwcm9jZXNzb3IgY29tZSBpbnRvIHBsYXkuICBUaGUKKyAqIGFkZF9maWVsZHMgdmFsdWUgY29udGFpbnMgMSBpbiB0aGUgTFNCIG9mIHRoZSBmaWVsZCwgYW5kIHRoZQorICogdGVzdF9hZGRlciBjb250YWlucyAyXihrLTEpIC0gMSAtIE4gaW4gdGhlIGZpZWxkLgorICoKKyAqIE5BTkQgZmllbGQ6IHRoaXMgZXhwcmVzc2VzIHRoZSBjb25zdHJhaW50IHRoYXQgeW91IG1heSBub3QgaGF2ZSBldmVudHMKKyAqIGluIGFsbCBvZiBhIHNldCBvZiBjbGFzc2VzLiAgKEZvciBleGFtcGxlLCBvbiBQUEM5NzAsIHlvdSBjYW4ndCBzZWxlY3QKKyAqIGV2ZW50cyBmcm9tIHRoZSBGUFUsIElTVSBhbmQgSURVIHNpbXVsdGFuZW91c2x5LCBhbHRob3VnaCBhbnkgdHdvIGFyZQorICogcG9zc2libGUuKSAgRm9yIE4gY2xhc3NlcywgdGhlIGZpZWxkIGlzIE4rMSBiaXRzIHdpZGUsIGFuZCBlYWNoIGNsYXNzCisgKiBpcyBhc3NpZ25lZCBvbmUgYml0IGZyb20gdGhlIGxlYXN0LXNpZ25pZmljYW50IE4gYml0cy4gIFRoZSBtYXNrIGhhcworICogb25seSB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgc2V0LCBhbmQgdGhlIHZhbHVlIGhhcyBvbmx5IHRoZSBiaXQKKyAqIGZvciB0aGUgZXZlbnQncyBjbGFzcyBzZXQuICBUaGUgdGVzdF9hZGRlciBoYXMgdGhlIGxlYXN0IHNpZ25pZmljYW50CisgKiBiaXQgc2V0IGluIHRoZSBmaWVsZC4KKyAqCisgKiBJZiBhbiBldmVudCBpcyBub3Qgc3ViamVjdCB0byB0aGUgY29uc3RyYWludCBleHByZXNzZWQgYnkgYSBwYXJ0aWN1bGFyCisgKiBmaWVsZCwgdGhlbiBpdCB3aWxsIGhhdmUgMCBpbiBib3RoIHRoZSBtYXNrIGFuZCB2YWx1ZSBmb3IgdGhhdCBmaWVsZC4KKyAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3JlZy5oCmluZGV4IGU4MDE4ZDUuLmZiMzU5YjAgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9yZWcuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vcmVnLmgKQEAgLTQ5MiwxMSArNDkyLDEzIEBACiAjZGVmaW5lICAgTU1DUjBfRkNIVgkweDAwMDAwMDAxVUwgLyogZnJlZXplIGNvbmRpdGlvbnMgaW4gaHlwZXJ2aXNvciBtb2RlICovCiAjZGVmaW5lIFNQUk5fTU1DUjEJNzk4CiAjZGVmaW5lIFNQUk5fTU1DUkEJMHgzMTIKKyNkZWZpbmUgICBNTUNSQV9TRFNZTkMJMHg4MDAwMDAwMFVMIC8qIFNEQVIgc3luY2VkIHdpdGggU0lBUiAqLwogI2RlZmluZSAgIE1NQ1JBX1NJSFYJMHgxMDAwMDAwMFVMIC8qIHN0YXRlIG9mIE1TUiBIViB3aGVuIFNJQVIgc2V0ICovCiAjZGVmaW5lICAgTU1DUkFfU0lQUgkweDA4MDAwMDAwVUwgLyogc3RhdGUgb2YgTVNSIFBSIHdoZW4gU0lBUiBzZXQgKi8KICNkZWZpbmUgICBNTUNSQV9TTE9UCTB4MDcwMDAwMDBVTCAvKiBTTE9UIGJpdHMgKDM3LTM5KSAqLwogI2RlZmluZSAgIE1NQ1JBX1NMT1RfU0hJRlQJMjQKICNkZWZpbmUgICBNTUNSQV9TQU1QTEVfRU5BQkxFIDB4MDAwMDAwMDFVTCAvKiBlbmFibGUgc2FtcGxpbmcgKi8KKyNkZWZpbmUgICBQT1dFUjZfTU1DUkFfU0RTWU5DIDB4MDAwMDA4MDAwMDAwMDAwMFVMTAkvKiBTREFSL1NJQVIgc3luY2VkICovCiAjZGVmaW5lICAgUE9XRVI2X01NQ1JBX1NJSFYgICAweDAwMDAwNDAwMDAwMDAwMDBVTEwKICNkZWZpbmUgICBQT1dFUjZfTU1DUkFfU0lQUiAgIDB4MDAwMDAyMDAwMDAwMDAwMFVMTAogI2RlZmluZSAgIFBPV0VSNl9NTUNSQV9USFJNCTB4MDAwMDAwMjBVTApkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3N5c3RibC5oCmluZGV4IGQ5OGEzMGQuLmEwYjkyZGUgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS9zeXN0YmwuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vc3lzdGJsLmgKQEAgLTMyMiw2ICszMjIsNiBAQAogU1lTQ0FMTF9TUFUoZHVwMykKIFNZU0NBTExfU1BVKHBpcGUyKQogU1lTQ0FMTChpbm90aWZ5X2luaXQxKQotU1lTQ0FMTChuaV9zeXNjYWxsKQorU1lTQ0FMTF9TUFUocGVyZl9jb3VudGVyX29wZW4pCiBDT01QQVRfU1lTX1NQVShwcmVhZHYpCiBDT01QQVRfU1lTX1NQVShwd3JpdGV2KQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIGIvYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oCmluZGV4IDNmMDZmOGUuLjRiYWRhYzIgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9pbmNsdWRlL2FzbS91bmlzdGQuaAorKysgYi9hcmNoL3Bvd2VycGMvaW5jbHVkZS9hc20vdW5pc3RkLmgKQEAgLTM0MSw2ICszNDEsNyBAQAogI2RlZmluZSBfX05SX2R1cDMJCTMxNgogI2RlZmluZSBfX05SX3BpcGUyCQkzMTcKICNkZWZpbmUgX19OUl9pbm90aWZ5X2luaXQxCTMxOAorI2RlZmluZSBfX05SX3BlcmZfY291bnRlcl9vcGVuCTMxOQogI2RlZmluZSBfX05SX3ByZWFkdgkJMzIwCiAjZGVmaW5lIF9fTlJfcHdyaXRldgkJMzIxCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUgYi9hcmNoL3Bvd2VycGMva2VybmVsL01ha2VmaWxlCmluZGV4IDcxOTAxZmIuLmEyYzY4MzQgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9NYWtlZmlsZQpAQCAtOTQsNiArOTQsOSBAQAogCiBvYmotJChDT05GSUdfRFlOQU1JQ19GVFJBQ0UpCSs9IGZ0cmFjZS5vCiBvYmotJChDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSKQkrPSBmdHJhY2Uubworb2JqLSQoQ09ORklHX1BFUkZfQ09VTlRFUlMpCSs9IHBlcmZfY291bnRlci5vIHBvd2VyNC1wbXUubyBwcGM5NzAtcG11Lm8gXAorCQkJCSAgIHBvd2VyNS1wbXUubyBwb3dlcjUrLXBtdS5vIHBvd2VyNi1wbXUubyBcCisJCQkJICAgcG93ZXI3LXBtdS5vCiAKIG9iai0kKENPTkZJR184WFhfTUlOSU1BTF9GUEVNVSkgKz0gc29mdGVtdTh4eC5vCiAKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvYXNtLW9mZnNldHMuYwppbmRleCAxZTQwYmMwLi5lOTgxZDFjIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2FzbS1vZmZzZXRzLmMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9hc20tb2Zmc2V0cy5jCkBAIC0xMzEsNiArMTMxLDcgQEAKIAlERUZJTkUoUEFDQUtNU1IsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwga2VybmVsX21zcikpOwogCURFRklORShQQUNBU09GVElSUUVOLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNvZnRfZW5hYmxlZCkpOwogCURFRklORShQQUNBSEFSRElSUUVOLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGhhcmRfZW5hYmxlZCkpOworCURFRklORShQQUNBUEVSRlBFTkQsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgcGVyZl9jb3VudGVyX3BlbmRpbmcpKTsKIAlERUZJTkUoUEFDQVNMQkNBQ0hFLCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIHNsYl9jYWNoZSkpOwogCURFRklORShQQUNBU0xCQ0FDSEVQVFIsIG9mZnNldG9mKHN0cnVjdCBwYWNhX3N0cnVjdCwgc2xiX2NhY2hlX3B0cikpOwogCURFRklORShQQUNBQ09OVEVYVElELCBvZmZzZXRvZihzdHJ1Y3QgcGFjYV9zdHJ1Y3QsIGNvbnRleHQuaWQpKTsKZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvZW50cnlfNjQuUwppbmRleCBhYmZjMzIzLi40M2UwNzM0IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMva2VybmVsL2VudHJ5XzY0LlMKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9lbnRyeV82NC5TCkBAIC01MjYsNiArNTI2LDE1IEBACiAyOgogCVRSQUNFX0FORF9SRVNUT1JFX0lSUShyNSk7CiAKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworCS8qIGNoZWNrIHBhY2EtPnBlcmZfY291bnRlcl9wZW5kaW5nIGlmIHdlJ3JlIGVuYWJsaW5nIGludHMgKi8KKwlsYnoJcjMsUEFDQVBFUkZQRU5EKHIxMykKKwlhbmQuCXIzLHIzLHI1CisJYmVxCTI3ZgorCWJsCS5wZXJmX2NvdW50ZXJfZG9fcGVuZGluZworMjc6CisjZW5kaWYgLyogQ09ORklHX1BFUkZfQ09VTlRFUlMgKi8KKwogCS8qIGV4dHJhY3QgRUUgYml0IGFuZCB1c2UgaXQgdG8gcmVzdG9yZSBwYWNhLT5oYXJkX2VuYWJsZWQgKi8KIAlsZAlyMyxfTVNSKHIxKQogCXJsZGljbAlyNCxyMyw0OSw2MwkJLyogcjAgPSAocjMgPj4gMTUpICYgMSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvaXJxLmMKaW5kZXggOGMxYTQ5Ni4uZmVmZjc5MiAxMDA2NDQKLS0tIGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9pcnEuYworKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL2lycS5jCkBAIC0xMzUsNiArMTM1LDExIEBACiAJCQlpc2VyaWVzX2hhbmRsZV9pbnRlcnJ1cHRzKCk7CiAJfQogCisJaWYgKHRlc3RfcGVyZl9jb3VudGVyX3BlbmRpbmcoKSkgeworCQljbGVhcl9wZXJmX2NvdW50ZXJfcGVuZGluZygpOworCQlwZXJmX2NvdW50ZXJfZG9fcGVuZGluZygpOworCX0KKwogCS8qCiAJICogaWYgKGdldF9wYWNhKCktPmhhcmRfZW5hYmxlZCkgcmV0dXJuOwogCSAqIEJ1dCBhZ2FpbiB3ZSBuZWVkIHRvIHRha2UgY2FyZSB0aGF0IGdjYyBnZXRzIGhhcmRfZW5hYmxlZCBkaXJlY3RseQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wZXJmX2NvdW50ZXIuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9jb3VudGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIyMDIzOAotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcGVyZl9jb3VudGVyLmMKQEAgLTAsMCArMSwxMjYzIEBACisvKgorICogUGVyZm9ybWFuY2UgY291bnRlciBzdXBwb3J0IC0gcG93ZXJwYyBhcmNoaXRlY3R1cmUgY29kZQorICoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorI2luY2x1ZGUgPGFzbS9wbWMuaD4KKyNpbmNsdWRlIDxhc20vbWFjaGRlcC5oPgorI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgorI2luY2x1ZGUgPGFzbS9wdHJhY2UuaD4KKworc3RydWN0IGNwdV9od19jb3VudGVycyB7CisJaW50IG5fY291bnRlcnM7CisJaW50IG5fcGVyY3B1OworCWludCBkaXNhYmxlZDsKKwlpbnQgbl9hZGRlZDsKKwlpbnQgbl9saW1pdGVkOworCXU4ICBwbWNzX2VuYWJsZWQ7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcltNQVhfSFdDT1VOVEVSU107CisJdTY0IGV2ZW50c1tNQVhfSFdDT1VOVEVSU107CisJdW5zaWduZWQgaW50IGZsYWdzW01BWF9IV0NPVU5URVJTXTsKKwl1NjQgbW1jclszXTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpsaW1pdGVkX2NvdW50ZXJbTUFYX0xJTUlURURfSFdDT1VOVEVSU107CisJdTggIGxpbWl0ZWRfaHdpZHhbTUFYX0xJTUlURURfSFdDT1VOVEVSU107Cit9OworREVGSU5FX1BFUl9DUFUoc3RydWN0IGNwdV9od19jb3VudGVycywgY3B1X2h3X2NvdW50ZXJzKTsKKworc3RydWN0IHBvd2VyX3BtdSAqcHBtdTsKKworLyoKKyAqIE5vcm1hbGx5LCB0byBpZ25vcmUga2VybmVsIGV2ZW50cyB3ZSBzZXQgdGhlIEZDUyAoZnJlZXplIGNvdW50ZXJzCisgKiBpbiBzdXBlcnZpc29yIG1vZGUpIGJpdCBpbiBNTUNSMCwgYnV0IGlmIHRoZSBrZXJuZWwgcnVucyB3aXRoIHRoZQorICogaHlwZXJ2aXNvciBiaXQgc2V0IGluIHRoZSBNU1IsIG9yIGlmIHdlIGFyZSBydW5uaW5nIG9uIGEgcHJvY2Vzc29yCisgKiB3aGVyZSB0aGUgaHlwZXJ2aXNvciBiaXQgaXMgZm9yY2VkIHRvIDEgKGFzIG9uIEFwcGxlIEc1IHByb2Nlc3NvcnMpLAorICogdGhlbiB3ZSBuZWVkIHRvIHVzZSB0aGUgRkNIViBiaXQgdG8gaWdub3JlIGtlcm5lbCBldmVudHMuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBpbnQgZnJlZXplX2NvdW50ZXJzX2tlcm5lbCA9IE1NQ1IwX0ZDUzsKKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK3ZvaWQgcGVyZl9jb3VudGVyX3ByaW50X2RlYnVnKHZvaWQpCit7Cit9CisKKy8qCisgKiBSZWFkIG9uZSBwZXJmb3JtYW5jZSBtb25pdG9yIGNvdW50ZXIgKFBNQykuCisgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIHJlYWRfcG1jKGludCBpZHgpCit7CisJdW5zaWduZWQgbG9uZyB2YWw7CisKKwlzd2l0Y2ggKGlkeCkgeworCWNhc2UgMToKKwkJdmFsID0gbWZzcHIoU1BSTl9QTUMxKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQl2YWwgPSBtZnNwcihTUFJOX1BNQzIpOworCQlicmVhazsKKwljYXNlIDM6CisJCXZhbCA9IG1mc3ByKFNQUk5fUE1DMyk7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJdmFsID0gbWZzcHIoU1BSTl9QTUM0KTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQl2YWwgPSBtZnNwcihTUFJOX1BNQzUpOworCQlicmVhazsKKwljYXNlIDY6CisJCXZhbCA9IG1mc3ByKFNQUk5fUE1DNik7CisJCWJyZWFrOworCWNhc2UgNzoKKwkJdmFsID0gbWZzcHIoU1BSTl9QTUM3KTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQl2YWwgPSBtZnNwcihTUFJOX1BNQzgpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGsoS0VSTl9FUlIgIm9vcHMgdHJ5aW5nIHRvIHJlYWQgUE1DJWRcbiIsIGlkeCk7CisJCXZhbCA9IDA7CisJfQorCXJldHVybiB2YWw7Cit9CisKKy8qCisgKiBXcml0ZSBvbmUgUE1DLgorICovCitzdGF0aWMgdm9pZCB3cml0ZV9wbWMoaW50IGlkeCwgdW5zaWduZWQgbG9uZyB2YWwpCit7CisJc3dpdGNoIChpZHgpIHsKKwljYXNlIDE6CisJCW10c3ByKFNQUk5fUE1DMSwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQltdHNwcihTUFJOX1BNQzIsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgMzoKKwkJbXRzcHIoU1BSTl9QTUMzLCB2YWwpOworCQlicmVhazsKKwljYXNlIDQ6CisJCW10c3ByKFNQUk5fUE1DNCwgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSA1OgorCQltdHNwcihTUFJOX1BNQzUsIHZhbCk7CisJCWJyZWFrOworCWNhc2UgNjoKKwkJbXRzcHIoU1BSTl9QTUM2LCB2YWwpOworCQlicmVhazsKKwljYXNlIDc6CisJCW10c3ByKFNQUk5fUE1DNywgdmFsKTsKKwkJYnJlYWs7CisJY2FzZSA4OgorCQltdHNwcihTUFJOX1BNQzgsIHZhbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXByaW50ayhLRVJOX0VSUiAib29wcyB0cnlpbmcgdG8gd3JpdGUgUE1DJWRcbiIsIGlkeCk7CisJfQorfQorCisvKgorICogQ2hlY2sgaWYgYSBzZXQgb2YgZXZlbnRzIGNhbiBhbGwgZ28gb24gdGhlIFBNVSBhdCBvbmNlLgorICogSWYgdGhleSBjYW4ndCwgdGhpcyB3aWxsIGxvb2sgYXQgYWx0ZXJuYXRpdmUgY29kZXMgZm9yIHRoZSBldmVudHMKKyAqIGFuZCBzZWUgaWYgYW55IGNvbWJpbmF0aW9uIG9mIGFsdGVybmF0aXZlIGNvZGVzIGlzIGZlYXNpYmxlLgorICogVGhlIGZlYXNpYmxlIHNldCBpcyByZXR1cm5lZCBpbiBldmVudFtdLgorICovCitzdGF0aWMgaW50IHBvd2VyX2NoZWNrX2NvbnN0cmFpbnRzKHU2NCBldmVudFtdLCB1bnNpZ25lZCBpbnQgY2ZsYWdzW10sCisJCQkJICAgaW50IG5fZXYpCit7CisJdTY0IG1hc2ssIHZhbHVlLCBudjsKKwl1NjQgYWx0ZXJuYXRpdmVzW01BWF9IV0NPVU5URVJTXVtNQVhfRVZFTlRfQUxURVJOQVRJVkVTXTsKKwl1NjQgYW1hc2tzW01BWF9IV0NPVU5URVJTXVtNQVhfRVZFTlRfQUxURVJOQVRJVkVTXTsKKwl1NjQgYXZhbHVlc1tNQVhfSFdDT1VOVEVSU11bTUFYX0VWRU5UX0FMVEVSTkFUSVZFU107CisJdTY0IHNtYXNrc1tNQVhfSFdDT1VOVEVSU10sIHN2YWx1ZXNbTUFYX0hXQ09VTlRFUlNdOworCWludCBuX2FsdFtNQVhfSFdDT1VOVEVSU10sIGNob2ljZVtNQVhfSFdDT1VOVEVSU107CisJaW50IGksIGo7CisJdTY0IGFkZGYgPSBwcG11LT5hZGRfZmllbGRzOworCXU2NCB0YWRkID0gcHBtdS0+dGVzdF9hZGRlcjsKKworCWlmIChuX2V2ID4gcHBtdS0+bl9jb3VudGVyKQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaXJzdCBzZWUgaWYgdGhlIGV2ZW50cyB3aWxsIGdvIG9uIGFzLWlzICovCisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlpZiAoKGNmbGFnc1tpXSAmIFBQTVVfTElNSVRFRF9QTUNfUkVRRCkKKwkJICAgICYmICFwcG11LT5saW1pdGVkX3BtY19ldmVudChldmVudFtpXSkpIHsKKwkJCXBwbXUtPmdldF9hbHRlcm5hdGl2ZXMoZXZlbnRbaV0sIGNmbGFnc1tpXSwKKwkJCQkJICAgICAgIGFsdGVybmF0aXZlc1tpXSk7CisJCQlldmVudFtpXSA9IGFsdGVybmF0aXZlc1tpXVswXTsKKwkJfQorCQlpZiAocHBtdS0+Z2V0X2NvbnN0cmFpbnQoZXZlbnRbaV0sICZhbWFza3NbaV1bMF0sCisJCQkJCSAmYXZhbHVlc1tpXVswXSkpCisJCQlyZXR1cm4gLTE7CisJfQorCXZhbHVlID0gbWFzayA9IDA7CisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQludiA9ICh2YWx1ZSB8IGF2YWx1ZXNbaV1bMF0pICsgKHZhbHVlICYgYXZhbHVlc1tpXVswXSAmIGFkZGYpOworCQlpZiAoKCgobnYgKyB0YWRkKSBeIHZhbHVlKSAmIG1hc2spICE9IDAgfHwKKwkJICAgICgoKG52ICsgdGFkZCkgXiBhdmFsdWVzW2ldWzBdKSAmIGFtYXNrc1tpXVswXSkgIT0gMCkKKwkJCWJyZWFrOworCQl2YWx1ZSA9IG52OworCQltYXNrIHw9IGFtYXNrc1tpXVswXTsKKwl9CisJaWYgKGkgPT0gbl9ldikKKwkJcmV0dXJuIDA7CS8qIGFsbCBPSyAqLworCisJLyogZG9lc24ndCB3b3JrLCBnYXRoZXIgYWx0ZXJuYXRpdmVzLi4uICovCisJaWYgKCFwcG11LT5nZXRfYWx0ZXJuYXRpdmVzKQorCQlyZXR1cm4gLTE7CisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQljaG9pY2VbaV0gPSAwOworCQluX2FsdFtpXSA9IHBwbXUtPmdldF9hbHRlcm5hdGl2ZXMoZXZlbnRbaV0sIGNmbGFnc1tpXSwKKwkJCQkJCSAgYWx0ZXJuYXRpdmVzW2ldKTsKKwkJZm9yIChqID0gMTsgaiA8IG5fYWx0W2ldOyArK2opCisJCQlwcG11LT5nZXRfY29uc3RyYWludChhbHRlcm5hdGl2ZXNbaV1bal0sCisJCQkJCSAgICAgJmFtYXNrc1tpXVtqXSwgJmF2YWx1ZXNbaV1bal0pOworCX0KKworCS8qIGVudW1lcmF0ZSBhbGwgcG9zc2liaWxpdGllcyBhbmQgc2VlIGlmIGFueSB3aWxsIHdvcmsgKi8KKwlpID0gMDsKKwlqID0gLTE7CisJdmFsdWUgPSBtYXNrID0gbnYgPSAwOworCXdoaWxlIChpIDwgbl9ldikgeworCQlpZiAoaiA+PSAwKSB7CisJCQkvKiB3ZSdyZSBiYWNrdHJhY2tpbmcsIHJlc3RvcmUgY29udGV4dCAqLworCQkJdmFsdWUgPSBzdmFsdWVzW2ldOworCQkJbWFzayA9IHNtYXNrc1tpXTsKKwkJCWogPSBjaG9pY2VbaV07CisJCX0KKwkJLyoKKwkJICogU2VlIGlmIGFueSBhbHRlcm5hdGl2ZSBrIGZvciBldmVudCBpLAorCQkgKiB3aGVyZSBrID4gaiwgd2lsbCBzYXRpc2Z5IHRoZSBjb25zdHJhaW50cy4KKwkJICovCisJCXdoaWxlICgrK2ogPCBuX2FsdFtpXSkgeworCQkJbnYgPSAodmFsdWUgfCBhdmFsdWVzW2ldW2pdKSArCisJCQkJKHZhbHVlICYgYXZhbHVlc1tpXVtqXSAmIGFkZGYpOworCQkJaWYgKCgoKG52ICsgdGFkZCkgXiB2YWx1ZSkgJiBtYXNrKSA9PSAwICYmCisJCQkgICAgKCgobnYgKyB0YWRkKSBeIGF2YWx1ZXNbaV1bal0pCisJCQkgICAgICYgYW1hc2tzW2ldW2pdKSA9PSAwKQorCQkJCWJyZWFrOworCQl9CisJCWlmIChqID49IG5fYWx0W2ldKSB7CisJCQkvKgorCQkJICogTm8gZmVhc2libGUgYWx0ZXJuYXRpdmUsIGJhY2t0cmFjaworCQkJICogdG8gZXZlbnQgaS0xIGFuZCBjb250aW51ZSBlbnVtZXJhdGluZyBpdHMKKwkJCSAqIGFsdGVybmF0aXZlcyBmcm9tIHdoZXJlIHdlIGdvdCB1cCB0by4KKwkJCSAqLworCQkJaWYgKC0taSA8IDApCisJCQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJLyoKKwkJCSAqIEZvdW5kIGEgZmVhc2libGUgYWx0ZXJuYXRpdmUgZm9yIGV2ZW50IGksCisJCQkgKiByZW1lbWJlciB3aGVyZSB3ZSBnb3QgdXAgdG8gd2l0aCB0aGlzIGV2ZW50LAorCQkJICogZ28gb24gdG8gdGhlIG5leHQgZXZlbnQsIGFuZCBzdGFydCB3aXRoCisJCQkgKiB0aGUgZmlyc3QgYWx0ZXJuYXRpdmUgZm9yIGl0LgorCQkJICovCisJCQljaG9pY2VbaV0gPSBqOworCQkJc3ZhbHVlc1tpXSA9IHZhbHVlOworCQkJc21hc2tzW2ldID0gbWFzazsKKwkJCXZhbHVlID0gbnY7CisJCQltYXNrIHw9IGFtYXNrc1tpXVtqXTsKKwkJCSsraTsKKwkJCWogPSAtMTsKKwkJfQorCX0KKworCS8qIE9LLCB3ZSBoYXZlIGEgZmVhc2libGUgY29tYmluYXRpb24sIHRlbGwgdGhlIGNhbGxlciB0aGUgc29sdXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgbl9ldjsgKytpKQorCQlldmVudFtpXSA9IGFsdGVybmF0aXZlc1tpXVtjaG9pY2VbaV1dOworCXJldHVybiAwOworfQorCisvKgorICogQ2hlY2sgaWYgbmV3bHktYWRkZWQgY291bnRlcnMgaGF2ZSBjb25zaXN0ZW50IHNldHRpbmdzIGZvcgorICogZXhjbHVkZV97dXNlcixrZXJuZWwsaHZ9IHdpdGggZWFjaCBvdGhlciBhbmQgYW55IHByZXZpb3VzbHkKKyAqIGFkZGVkIGNvdW50ZXJzLgorICovCitzdGF0aWMgaW50IGNoZWNrX2V4Y2x1ZGVzKHN0cnVjdCBwZXJmX2NvdW50ZXIgKipjdHJzLCB1bnNpZ25lZCBpbnQgY2ZsYWdzW10sCisJCQkgIGludCBuX3ByZXYsIGludCBuX25ldykKK3sKKwlpbnQgZXUgPSAwLCBlayA9IDAsIGVoID0gMDsKKwlpbnQgaSwgbiwgZmlyc3Q7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCW4gPSBuX3ByZXYgKyBuX25ldzsKKwlpZiAobiA8PSAxKQorCQlyZXR1cm4gMDsKKworCWZpcnN0ID0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisJCWlmIChjZmxhZ3NbaV0gJiBQUE1VX0xJTUlURURfUE1DX09LKSB7CisJCQljZmxhZ3NbaV0gJj0gflBQTVVfTElNSVRFRF9QTUNfUkVRRDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWNvdW50ZXIgPSBjdHJzW2ldOworCQlpZiAoZmlyc3QpIHsKKwkJCWV1ID0gY291bnRlci0+YXR0ci5leGNsdWRlX3VzZXI7CisJCQllayA9IGNvdW50ZXItPmF0dHIuZXhjbHVkZV9rZXJuZWw7CisJCQllaCA9IGNvdW50ZXItPmF0dHIuZXhjbHVkZV9odjsKKwkJCWZpcnN0ID0gMDsKKwkJfSBlbHNlIGlmIChjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfdXNlciAhPSBldSB8fAorCQkJICAgY291bnRlci0+YXR0ci5leGNsdWRlX2tlcm5lbCAhPSBlayB8fAorCQkJICAgY291bnRlci0+YXR0ci5leGNsdWRlX2h2ICE9IGVoKSB7CisJCQlyZXR1cm4gLUVBR0FJTjsKKwkJfQorCX0KKworCWlmIChldSB8fCBlayB8fCBlaCkKKwkJZm9yIChpID0gMDsgaSA8IG47ICsraSkKKwkJCWlmIChjZmxhZ3NbaV0gJiBQUE1VX0xJTUlURURfUE1DX09LKQorCQkJCWNmbGFnc1tpXSB8PSBQUE1VX0xJTUlURURfUE1DX1JFUUQ7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG93ZXJfcG11X3JlYWQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlsb25nIHZhbCwgZGVsdGEsIHByZXY7CisKKwlpZiAoIWNvdW50ZXItPmh3LmlkeCkKKwkJcmV0dXJuOworCS8qCisJICogUGVyZm9ybWFuY2UgbW9uaXRvciBpbnRlcnJ1cHRzIGNvbWUgZXZlbiB3aGVuIGludGVycnVwdHMKKwkgKiBhcmUgc29mdC1kaXNhYmxlZCwgYXMgbG9uZyBhcyBpbnRlcnJ1cHRzIGFyZSBoYXJkLWVuYWJsZWQuCisJICogVGhlcmVmb3JlIHdlIHRyZWF0IHRoZW0gbGlrZSBOTUlzLgorCSAqLworCWRvIHsKKwkJcHJldiA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmh3LnByZXZfY291bnQpOworCQliYXJyaWVyKCk7CisJCXZhbCA9IHJlYWRfcG1jKGNvdW50ZXItPmh3LmlkeCk7CisJfSB3aGlsZSAoYXRvbWljNjRfY21weGNoZygmY291bnRlci0+aHcucHJldl9jb3VudCwgcHJldiwgdmFsKSAhPSBwcmV2KTsKKworCS8qIFRoZSBjb3VudGVycyBhcmUgb25seSAzMiBiaXRzIHdpZGUgKi8KKwlkZWx0YSA9ICh2YWwgLSBwcmV2KSAmIDB4ZmZmZmZmZmZ1bDsKKwlhdG9taWM2NF9hZGQoZGVsdGEsICZjb3VudGVyLT5jb3VudCk7CisJYXRvbWljNjRfc3ViKGRlbHRhLCAmY291bnRlci0+aHcucGVyaW9kX2xlZnQpOworfQorCisvKgorICogT24gc29tZSBtYWNoaW5lcywgUE1DNSBhbmQgUE1DNiBjYW4ndCBiZSB3cml0dGVuLCBkb24ndCByZXNwZWN0CisgKiB0aGUgZnJlZXplIGNvbmRpdGlvbnMsIGFuZCBkb24ndCBnZW5lcmF0ZSBpbnRlcnJ1cHRzLiAgVGhpcyB0ZWxscworICogdXMgaWYgYGNvdW50ZXInIGlzIHVzaW5nIHN1Y2ggYSBQTUMuCisgKi8KK3N0YXRpYyBpbnQgaXNfbGltaXRlZF9wbWMoaW50IHBtY251bSkKK3sKKwlyZXR1cm4gKHBwbXUtPmZsYWdzICYgUFBNVV9MSU1JVEVEX1BNQzVfNikKKwkJJiYgKHBtY251bSA9PSA1IHx8IHBtY251bSA9PSA2KTsKK30KKworc3RhdGljIHZvaWQgZnJlZXplX2xpbWl0ZWRfY291bnRlcnMoc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1aHcsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgcG1jNSwgdW5zaWduZWQgbG9uZyBwbWM2KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJdTY0IHZhbCwgcHJldiwgZGVsdGE7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgY3B1aHctPm5fbGltaXRlZDsgKytpKSB7CisJCWNvdW50ZXIgPSBjcHVody0+bGltaXRlZF9jb3VudGVyW2ldOworCQlpZiAoIWNvdW50ZXItPmh3LmlkeCkKKwkJCWNvbnRpbnVlOworCQl2YWwgPSAoY291bnRlci0+aHcuaWR4ID09IDUpID8gcG1jNSA6IHBtYzY7CisJCXByZXYgPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyLT5ody5wcmV2X2NvdW50KTsKKwkJY291bnRlci0+aHcuaWR4ID0gMDsKKwkJZGVsdGEgPSAodmFsIC0gcHJldikgJiAweGZmZmZmZmZmdWw7CisJCWF0b21pYzY0X2FkZChkZWx0YSwgJmNvdW50ZXItPmNvdW50KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRoYXdfbGltaXRlZF9jb3VudGVycyhzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVodywKKwkJCQkgIHVuc2lnbmVkIGxvbmcgcG1jNSwgdW5zaWduZWQgbG9uZyBwbWM2KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJdTY0IHZhbDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBjcHVody0+bl9saW1pdGVkOyArK2kpIHsKKwkJY291bnRlciA9IGNwdWh3LT5saW1pdGVkX2NvdW50ZXJbaV07CisJCWNvdW50ZXItPmh3LmlkeCA9IGNwdWh3LT5saW1pdGVkX2h3aWR4W2ldOworCQl2YWwgPSAoY291bnRlci0+aHcuaWR4ID09IDUpID8gcG1jNSA6IHBtYzY7CisJCWF0b21pYzY0X3NldCgmY291bnRlci0+aHcucHJldl9jb3VudCwgdmFsKTsKKwkJcGVyZl9jb3VudGVyX3VwZGF0ZV91c2VycGFnZShjb3VudGVyKTsKKwl9Cit9CisKKy8qCisgKiBTaW5jZSBsaW1pdGVkIGNvdW50ZXJzIGRvbid0IHJlc3BlY3QgdGhlIGZyZWV6ZSBjb25kaXRpb25zLCB3ZQorICogaGF2ZSB0byByZWFkIHRoZW0gaW1tZWRpYXRlbHkgYWZ0ZXIgZnJlZXppbmcgb3IgdW5mcmVlemluZyB0aGUKKyAqIG90aGVyIGNvdW50ZXJzLiAgV2UgdHJ5IHRvIGtlZXAgdGhlIHZhbHVlcyBmcm9tIHRoZSBsaW1pdGVkCisgKiBjb3VudGVycyBhcyBjb25zaXN0ZW50IGFzIHBvc3NpYmxlIGJ5IGtlZXBpbmcgdGhlIGRlbGF5IChpbgorICogY3ljbGVzIGFuZCBpbnN0cnVjdGlvbnMpIGJldHdlZW4gZnJlZXppbmcvdW5mcmVlemluZyBhbmQgcmVhZGluZworICogdGhlIGxpbWl0ZWQgY291bnRlcnMgYXMgc21hbGwgYW5kIGNvbnNpc3RlbnQgYXMgcG9zc2libGUuCisgKiBUaGVyZWZvcmUsIGlmIGFueSBsaW1pdGVkIGNvdW50ZXJzIGFyZSBpbiB1c2UsIHdlIHJlYWQgdGhlbQorICogYm90aCwgYW5kIGFsd2F5cyBpbiB0aGUgc2FtZSBvcmRlciwgdG8gbWluaW1pemUgdmFyaWFiaWxpdHksCisgKiBhbmQgZG8gaXQgaW5zaWRlIHRoZSBzYW1lIGFzbSB0aGF0IHdyaXRlcyBNTUNSMC4KKyAqLworc3RhdGljIHZvaWQgd3JpdGVfbW1jcjAoc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1aHcsIHVuc2lnbmVkIGxvbmcgbW1jcjApCit7CisJdW5zaWduZWQgbG9uZyBwbWM1LCBwbWM2OworCisJaWYgKCFjcHVody0+bl9saW1pdGVkKSB7CisJCW10c3ByKFNQUk5fTU1DUjAsIG1tY3IwKTsKKwkJcmV0dXJuOworCX0KKworCS8qCisJICogV3JpdGUgTU1DUjAsIHRoZW4gcmVhZCBQTUM1IGFuZCBQTUM2IGltbWVkaWF0ZWx5LgorCSAqIFRvIGVuc3VyZSB3ZSBkb24ndCBnZXQgYSBwZXJmb3JtYW5jZSBtb25pdG9yIGludGVycnVwdAorCSAqIGJldHdlZW4gd3JpdGluZyBNTUNSMCBhbmQgZnJlZXppbmcvdGhhd2luZyB0aGUgbGltaXRlZAorCSAqIGNvdW50ZXJzLCB3ZSBmaXJzdCB3cml0ZSBNTUNSMCB3aXRoIHRoZSBjb3VudGVyIG92ZXJmbG93CisJICogaW50ZXJydXB0IGVuYWJsZSBiaXRzIHR1cm5lZCBvZmYuCisJICovCisJYXNtIHZvbGF0aWxlKCJtdHNwciAlMywlMjsgbWZzcHIgJTAsJTQ7IG1mc3ByICUxLCU1IgorCQkgICAgIDogIj0mciIgKHBtYzUpLCAiPSZyIiAocG1jNikKKwkJICAgICA6ICJyIiAobW1jcjAgJiB+KE1NQ1IwX1BNQzFDRSB8IE1NQ1IwX1BNQ2pDRSkpLAorCQkgICAgICAgImkiIChTUFJOX01NQ1IwKSwKKwkJICAgICAgICJpIiAoU1BSTl9QTUM1KSwgImkiIChTUFJOX1BNQzYpKTsKKworCWlmIChtbWNyMCAmIE1NQ1IwX0ZDKQorCQlmcmVlemVfbGltaXRlZF9jb3VudGVycyhjcHVodywgcG1jNSwgcG1jNik7CisJZWxzZQorCQl0aGF3X2xpbWl0ZWRfY291bnRlcnMoY3B1aHcsIHBtYzUsIHBtYzYpOworCisJLyoKKwkgKiBXcml0ZSB0aGUgZnVsbCBNTUNSMCBpbmNsdWRpbmcgdGhlIGNvdW50ZXIgb3ZlcmZsb3cgaW50ZXJydXB0CisJICogZW5hYmxlIGJpdHMsIGlmIG5lY2Vzc2FyeS4KKwkgKi8KKwlpZiAobW1jcjAgJiAoTU1DUjBfUE1DMUNFIHwgTU1DUjBfUE1DakNFKSkKKwkJbXRzcHIoU1BSTl9NTUNSMCwgbW1jcjApOworfQorCisvKgorICogRGlzYWJsZSBhbGwgY291bnRlcnMgdG8gcHJldmVudCBQTVUgaW50ZXJydXB0cyBhbmQgdG8gYWxsb3cKKyAqIGNvdW50ZXJzIHRvIGJlIGFkZGVkIG9yIHJlbW92ZWQuCisgKi8KK3ZvaWQgaHdfcGVyZl9kaXNhYmxlKHZvaWQpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1aHc7CisJdW5zaWduZWQgbG9uZyByZXQ7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwljcHVodyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisKKwlyZXQgPSBjcHVody0+ZGlzYWJsZWQ7CisJaWYgKCFyZXQpIHsKKwkJY3B1aHctPmRpc2FibGVkID0gMTsKKwkJY3B1aHctPm5fYWRkZWQgPSAwOworCisJCS8qCisJCSAqIENoZWNrIGlmIHdlIGV2ZXIgZW5hYmxlZCB0aGUgUE1VIG9uIHRoaXMgY3B1LgorCQkgKi8KKwkJaWYgKCFjcHVody0+cG1jc19lbmFibGVkKSB7CisJCQlpZiAocHBjX21kLmVuYWJsZV9wbWNzKQorCQkJCXBwY19tZC5lbmFibGVfcG1jcygpOworCQkJY3B1aHctPnBtY3NfZW5hYmxlZCA9IDE7CisJCX0KKworCQkvKgorCQkgKiBEaXNhYmxlIGluc3RydWN0aW9uIHNhbXBsaW5nIGlmIGl0IHdhcyBlbmFibGVkCisJCSAqLworCQlpZiAoY3B1aHctPm1tY3JbMl0gJiBNTUNSQV9TQU1QTEVfRU5BQkxFKSB7CisJCQltdHNwcihTUFJOX01NQ1JBLAorCQkJICAgICAgY3B1aHctPm1tY3JbMl0gJiB+TU1DUkFfU0FNUExFX0VOQUJMRSk7CisJCQltYigpOworCQl9CisKKwkJLyoKKwkJICogU2V0IHRoZSAnZnJlZXplIGNvdW50ZXJzJyBiaXQuCisJCSAqIFRoZSBiYXJyaWVyIGlzIHRvIG1ha2Ugc3VyZSB0aGUgbXRzcHIgaGFzIGJlZW4KKwkJICogZXhlY3V0ZWQgYW5kIHRoZSBQTVUgaGFzIGZyb3plbiB0aGUgY291bnRlcnMKKwkJICogYmVmb3JlIHdlIHJldHVybi4KKwkJICovCisJCXdyaXRlX21tY3IwKGNwdWh3LCBtZnNwcihTUFJOX01NQ1IwKSB8IE1NQ1IwX0ZDKTsKKwkJbWIoKTsKKwl9CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCisvKgorICogUmUtZW5hYmxlIGFsbCBjb3VudGVycyBpZiBkaXNhYmxlID09IDAuCisgKiBJZiB3ZSB3ZXJlIHByZXZpb3VzbHkgZGlzYWJsZWQgYW5kIGNvdW50ZXJzIHdlcmUgYWRkZWQsIHRoZW4KKyAqIHB1dCB0aGUgbmV3IGNvbmZpZyBvbiB0aGUgUE1VLgorICovCit2b2lkIGh3X3BlcmZfZW5hYmxlKHZvaWQpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVodzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWxvbmcgaTsKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlzNjQgbGVmdDsKKwl1bnNpZ25lZCBpbnQgaHdjX2luZGV4W01BWF9IV0NPVU5URVJTXTsKKwlpbnQgbl9saW07CisJaW50IGlkeDsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwljcHVodyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJaWYgKCFjcHVody0+ZGlzYWJsZWQpIHsKKwkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCQlyZXR1cm47CisJfQorCWNwdWh3LT5kaXNhYmxlZCA9IDA7CisKKwkvKgorCSAqIElmIHdlIGRpZG4ndCBjaGFuZ2UgYW55dGhpbmcsIG9yIG9ubHkgcmVtb3ZlZCBjb3VudGVycywKKwkgKiBubyBuZWVkIHRvIHJlY2FsY3VsYXRlIE1NQ1IqIHNldHRpbmdzIGFuZCByZXNldCB0aGUgUE1Dcy4KKwkgKiBKdXN0IHJlZW5hYmxlIHRoZSBQTVUgd2l0aCB0aGUgY3VycmVudCBNTUNSKiBzZXR0aW5ncworCSAqIChwb3NzaWJseSB1cGRhdGVkIGZvciByZW1vdmFsIG9mIGNvdW50ZXJzKS4KKwkgKi8KKwlpZiAoIWNwdWh3LT5uX2FkZGVkKSB7CisJCW10c3ByKFNQUk5fTU1DUkEsIGNwdWh3LT5tbWNyWzJdICYgfk1NQ1JBX1NBTVBMRV9FTkFCTEUpOworCQltdHNwcihTUFJOX01NQ1IxLCBjcHVody0+bW1jclsxXSk7CisJCWlmIChjcHVody0+bl9jb3VudGVycyA9PSAwKQorCQkJZ2V0X2xwcGFjYSgpLT5wbWNyZWdzX2luX3VzZSA9IDA7CisJCWdvdG8gb3V0X2VuYWJsZTsKKwl9CisKKwkvKgorCSAqIENvbXB1dGUgTU1DUiogdmFsdWVzIGZvciB0aGUgbmV3IHNldCBvZiBjb3VudGVycworCSAqLworCWlmIChwcG11LT5jb21wdXRlX21tY3IoY3B1aHctPmV2ZW50cywgY3B1aHctPm5fY291bnRlcnMsIGh3Y19pbmRleCwKKwkJCSAgICAgICBjcHVody0+bW1jcikpIHsKKwkJLyogc2hvdWxkbid0IGV2ZXIgZ2V0IGhlcmUgKi8KKwkJcHJpbnRrKEtFUk5fRVJSICJvb3BzIGNvbXB1dGVfbW1jciBmYWlsZWRcbiIpOworCQlnb3RvIG91dDsKKwl9CisKKwkvKgorCSAqIEFkZCBpbiBNTUNSMCBmcmVlemUgYml0cyBjb3JyZXNwb25kaW5nIHRvIHRoZQorCSAqIGF0dHIuZXhjbHVkZV8qIGJpdHMgZm9yIHRoZSBmaXJzdCBjb3VudGVyLgorCSAqIFdlIGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoYXQgYWxsIGNvdW50ZXJzIGhhdmUgdGhlCisJICogc2FtZSB2YWx1ZXMgZm9yIHRoZXNlIGJpdHMgYXMgdGhlIGZpcnN0IGNvdW50ZXIuCisJICovCisJY291bnRlciA9IGNwdWh3LT5jb3VudGVyWzBdOworCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfdXNlcikKKwkJY3B1aHctPm1tY3JbMF0gfD0gTU1DUjBfRkNQOworCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfa2VybmVsKQorCQljcHVody0+bW1jclswXSB8PSBmcmVlemVfY291bnRlcnNfa2VybmVsOworCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfaHYpCisJCWNwdWh3LT5tbWNyWzBdIHw9IE1NQ1IwX0ZDSFY7CisKKwkvKgorCSAqIFdyaXRlIHRoZSBuZXcgY29uZmlndXJhdGlvbiB0byBNTUNSKiB3aXRoIHRoZSBmcmVlemUKKwkgKiBiaXQgc2V0IGFuZCBzZXQgdGhlIGhhcmR3YXJlIGNvdW50ZXJzIHRvIHRoZWlyIGluaXRpYWwgdmFsdWVzLgorCSAqIFRoZW4gdW5mcmVlemUgdGhlIGNvdW50ZXJzLgorCSAqLworCWdldF9scHBhY2EoKS0+cG1jcmVnc19pbl91c2UgPSAxOworCW10c3ByKFNQUk5fTU1DUkEsIGNwdWh3LT5tbWNyWzJdICYgfk1NQ1JBX1NBTVBMRV9FTkFCTEUpOworCW10c3ByKFNQUk5fTU1DUjEsIGNwdWh3LT5tbWNyWzFdKTsKKwltdHNwcihTUFJOX01NQ1IwLCAoY3B1aHctPm1tY3JbMF0gJiB+KE1NQ1IwX1BNQzFDRSB8IE1NQ1IwX1BNQ2pDRSkpCisJCQkJfCBNTUNSMF9GQyk7CisKKwkvKgorCSAqIFJlYWQgb2ZmIGFueSBwcmUtZXhpc3RpbmcgY291bnRlcnMgdGhhdCBuZWVkIHRvIG1vdmUKKwkgKiB0byBhbm90aGVyIFBNQy4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgY3B1aHctPm5fY291bnRlcnM7ICsraSkgeworCQljb3VudGVyID0gY3B1aHctPmNvdW50ZXJbaV07CisJCWlmIChjb3VudGVyLT5ody5pZHggJiYgY291bnRlci0+aHcuaWR4ICE9IGh3Y19pbmRleFtpXSArIDEpIHsKKwkJCXBvd2VyX3BtdV9yZWFkKGNvdW50ZXIpOworCQkJd3JpdGVfcG1jKGNvdW50ZXItPmh3LmlkeCwgMCk7CisJCQljb3VudGVyLT5ody5pZHggPSAwOworCQl9CisJfQorCisJLyoKKwkgKiBJbml0aWFsaXplIHRoZSBQTUNzIGZvciBhbGwgdGhlIG5ldyBhbmQgbW92ZWQgY291bnRlcnMuCisJICovCisJY3B1aHctPm5fbGltaXRlZCA9IG5fbGltID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY3B1aHctPm5fY291bnRlcnM7ICsraSkgeworCQljb3VudGVyID0gY3B1aHctPmNvdW50ZXJbaV07CisJCWlmIChjb3VudGVyLT5ody5pZHgpCisJCQljb250aW51ZTsKKwkJaWR4ID0gaHdjX2luZGV4W2ldICsgMTsKKwkJaWYgKGlzX2xpbWl0ZWRfcG1jKGlkeCkpIHsKKwkJCWNwdWh3LT5saW1pdGVkX2NvdW50ZXJbbl9saW1dID0gY291bnRlcjsKKwkJCWNwdWh3LT5saW1pdGVkX2h3aWR4W25fbGltXSA9IGlkeDsKKwkJCSsrbl9saW07CisJCQljb250aW51ZTsKKwkJfQorCQl2YWwgPSAwOworCQlpZiAoY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZCkgeworCQkJbGVmdCA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmh3LnBlcmlvZF9sZWZ0KTsKKwkJCWlmIChsZWZ0IDwgMHg4MDAwMDAwMEwpCisJCQkJdmFsID0gMHg4MDAwMDAwMEwgLSBsZWZ0OworCQl9CisJCWF0b21pYzY0X3NldCgmY291bnRlci0+aHcucHJldl9jb3VudCwgdmFsKTsKKwkJY291bnRlci0+aHcuaWR4ID0gaWR4OworCQl3cml0ZV9wbWMoaWR4LCB2YWwpOworCQlwZXJmX2NvdW50ZXJfdXBkYXRlX3VzZXJwYWdlKGNvdW50ZXIpOworCX0KKwljcHVody0+bl9saW1pdGVkID0gbl9saW07CisJY3B1aHctPm1tY3JbMF0gfD0gTU1DUjBfUE1YRSB8IE1NQ1IwX0ZDRUNFOworCisgb3V0X2VuYWJsZToKKwltYigpOworCXdyaXRlX21tY3IwKGNwdWh3LCBjcHVody0+bW1jclswXSk7CisKKwkvKgorCSAqIEVuYWJsZSBpbnN0cnVjdGlvbiBzYW1wbGluZyBpZiBuZWNlc3NhcnkKKwkgKi8KKwlpZiAoY3B1aHctPm1tY3JbMl0gJiBNTUNSQV9TQU1QTEVfRU5BQkxFKSB7CisJCW1iKCk7CisJCW10c3ByKFNQUk5fTU1DUkEsIGNwdWh3LT5tbWNyWzJdKTsKKwl9CisKKyBvdXQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW50IGNvbGxlY3RfZXZlbnRzKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmdyb3VwLCBpbnQgbWF4X2NvdW50LAorCQkJICBzdHJ1Y3QgcGVyZl9jb3VudGVyICpjdHJzW10sIHU2NCAqZXZlbnRzLAorCQkJICB1bnNpZ25lZCBpbnQgKmZsYWdzKQoreworCWludCBuID0gMDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJaWYgKCFpc19zb2Z0d2FyZV9jb3VudGVyKGdyb3VwKSkgeworCQlpZiAobiA+PSBtYXhfY291bnQpCisJCQlyZXR1cm4gLTE7CisJCWN0cnNbbl0gPSBncm91cDsKKwkJZmxhZ3Nbbl0gPSBncm91cC0+aHcuY291bnRlcl9iYXNlOworCQlldmVudHNbbisrXSA9IGdyb3VwLT5ody5jb25maWc7CisJfQorCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmdyb3VwLT5zaWJsaW5nX2xpc3QsIGxpc3RfZW50cnkpIHsKKwkJaWYgKCFpc19zb2Z0d2FyZV9jb3VudGVyKGNvdW50ZXIpICYmCisJCSAgICBjb3VudGVyLT5zdGF0ZSAhPSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGKSB7CisJCQlpZiAobiA+PSBtYXhfY291bnQpCisJCQkJcmV0dXJuIC0xOworCQkJY3Ryc1tuXSA9IGNvdW50ZXI7CisJCQlmbGFnc1tuXSA9IGNvdW50ZXItPmh3LmNvdW50ZXJfYmFzZTsKKwkJCWV2ZW50c1tuKytdID0gY291bnRlci0+aHcuY29uZmlnOworCQl9CisJfQorCXJldHVybiBuOworfQorCitzdGF0aWMgdm9pZCBjb3VudGVyX3NjaGVkX2luKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIGludCBjcHUpCit7CisJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFOworCWNvdW50ZXItPm9uY3B1ID0gY3B1OworCWNvdW50ZXItPnRzdGFtcF9ydW5uaW5nICs9IGNvdW50ZXItPmN0eC0+dGltZSAtIGNvdW50ZXItPnRzdGFtcF9zdG9wcGVkOworCWlmIChpc19zb2Z0d2FyZV9jb3VudGVyKGNvdW50ZXIpKQorCQljb3VudGVyLT5wbXUtPmVuYWJsZShjb3VudGVyKTsKK30KKworLyoKKyAqIENhbGxlZCB0byBlbmFibGUgYSB3aG9sZSBncm91cCBvZiBjb3VudGVycy4KKyAqIFJldHVybnMgMSBpZiB0aGUgZ3JvdXAgd2FzIGVuYWJsZWQsIG9yIC1FQUdBSU4gaWYgaXQgY291bGQgbm90IGJlLgorICogQXNzdW1lcyB0aGUgY2FsbGVyIGhhcyBkaXNhYmxlZCBpbnRlcnJ1cHRzIGFuZCBoYXMKKyAqIGZyb3plbiB0aGUgUE1VIHdpdGggaHdfcGVyZl9zYXZlX2Rpc2FibGUuCisgKi8KK2ludCBod19wZXJmX2dyb3VwX3NjaGVkX2luKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmdyb3VwX2xlYWRlciwKKwkgICAgICAgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkgICAgICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsIGludCBjcHUpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1aHc7CisJbG9uZyBpLCBuLCBuMDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpzdWI7CisKKwljcHVodyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJbjAgPSBjcHVody0+bl9jb3VudGVyczsKKwluID0gY29sbGVjdF9ldmVudHMoZ3JvdXBfbGVhZGVyLCBwcG11LT5uX2NvdW50ZXIgLSBuMCwKKwkJCSAgICZjcHVody0+Y291bnRlcltuMF0sICZjcHVody0+ZXZlbnRzW24wXSwKKwkJCSAgICZjcHVody0+ZmxhZ3NbbjBdKTsKKwlpZiAobiA8IDApCisJCXJldHVybiAtRUFHQUlOOworCWlmIChjaGVja19leGNsdWRlcyhjcHVody0+Y291bnRlciwgY3B1aHctPmZsYWdzLCBuMCwgbikpCisJCXJldHVybiAtRUFHQUlOOworCWkgPSBwb3dlcl9jaGVja19jb25zdHJhaW50cyhjcHVody0+ZXZlbnRzLCBjcHVody0+ZmxhZ3MsIG4gKyBuMCk7CisJaWYgKGkgPCAwKQorCQlyZXR1cm4gLUVBR0FJTjsKKwljcHVody0+bl9jb3VudGVycyA9IG4wICsgbjsKKwljcHVody0+bl9hZGRlZCArPSBuOworCisJLyoKKwkgKiBPSywgdGhpcyBncm91cCBjYW4gZ28gb247IHVwZGF0ZSBjb3VudGVyIHN0YXRlcyBldGMuLAorCSAqIGFuZCBlbmFibGUgYW55IHNvZnR3YXJlIGNvdW50ZXJzCisJICovCisJZm9yIChpID0gbjA7IGkgPCBuMCArIG47ICsraSkKKwkJY3B1aHctPmNvdW50ZXJbaV0tPmh3LmNvbmZpZyA9IGNwdWh3LT5ldmVudHNbaV07CisJY3B1Y3R4LT5hY3RpdmVfb25jcHUgKz0gbjsKKwluID0gMTsKKwljb3VudGVyX3NjaGVkX2luKGdyb3VwX2xlYWRlciwgY3B1KTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YiwgJmdyb3VwX2xlYWRlci0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KSB7CisJCWlmIChzdWItPnN0YXRlICE9IFBFUkZfQ09VTlRFUl9TVEFURV9PRkYpIHsKKwkJCWNvdW50ZXJfc2NoZWRfaW4oc3ViLCBjcHUpOworCQkJKytuOworCQl9CisJfQorCWN0eC0+bnJfYWN0aXZlICs9IG47CisKKwlyZXR1cm4gMTsKK30KKworLyoKKyAqIEFkZCBhIGNvdW50ZXIgdG8gdGhlIFBNVS4KKyAqIElmIGFsbCBjb3VudGVycyBhcmUgbm90IGFscmVhZHkgZnJvemVuLCB0aGVuIHdlIGRpc2FibGUgYW5kCisgKiByZS1lbmFibGUgdGhlIFBNVSBpbiBvcmRlciB0byBnZXQgaHdfcGVyZl9lbmFibGUgdG8gZG8gdGhlCisgKiBhY3R1YWwgd29yayBvZiByZWNvbmZpZ3VyaW5nIHRoZSBQTVUuCisgKi8KK3N0YXRpYyBpbnQgcG93ZXJfcG11X2VuYWJsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWh3OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IG4wOworCWludCByZXQgPSAtRUFHQUlOOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXBlcmZfZGlzYWJsZSgpOworCisJLyoKKwkgKiBBZGQgdGhlIGNvdW50ZXIgdG8gdGhlIGxpc3QgKGlmIHRoZXJlIGlzIHJvb20pCisJICogYW5kIGNoZWNrIHdoZXRoZXIgdGhlIHRvdGFsIHNldCBpcyBzdGlsbCBmZWFzaWJsZS4KKwkgKi8KKwljcHVodyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJbjAgPSBjcHVody0+bl9jb3VudGVyczsKKwlpZiAobjAgPj0gcHBtdS0+bl9jb3VudGVyKQorCQlnb3RvIG91dDsKKwljcHVody0+Y291bnRlcltuMF0gPSBjb3VudGVyOworCWNwdWh3LT5ldmVudHNbbjBdID0gY291bnRlci0+aHcuY29uZmlnOworCWNwdWh3LT5mbGFnc1tuMF0gPSBjb3VudGVyLT5ody5jb3VudGVyX2Jhc2U7CisJaWYgKGNoZWNrX2V4Y2x1ZGVzKGNwdWh3LT5jb3VudGVyLCBjcHVody0+ZmxhZ3MsIG4wLCAxKSkKKwkJZ290byBvdXQ7CisJaWYgKHBvd2VyX2NoZWNrX2NvbnN0cmFpbnRzKGNwdWh3LT5ldmVudHMsIGNwdWh3LT5mbGFncywgbjAgKyAxKSkKKwkJZ290byBvdXQ7CisKKwljb3VudGVyLT5ody5jb25maWcgPSBjcHVody0+ZXZlbnRzW24wXTsKKwkrK2NwdWh3LT5uX2NvdW50ZXJzOworCSsrY3B1aHctPm5fYWRkZWQ7CisKKwlyZXQgPSAwOworIG91dDoKKwlwZXJmX2VuYWJsZSgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogUmVtb3ZlIGEgY291bnRlciBmcm9tIHRoZSBQTVUuCisgKi8KK3N0YXRpYyB2b2lkIHBvd2VyX3BtdV9kaXNhYmxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1aHc7CisJbG9uZyBpOworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcGVyZl9kaXNhYmxlKCk7CisKKwlwb3dlcl9wbXVfcmVhZChjb3VudGVyKTsKKworCWNwdWh3ID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2NvdW50ZXJzKTsKKwlmb3IgKGkgPSAwOyBpIDwgY3B1aHctPm5fY291bnRlcnM7ICsraSkgeworCQlpZiAoY291bnRlciA9PSBjcHVody0+Y291bnRlcltpXSkgeworCQkJd2hpbGUgKCsraSA8IGNwdWh3LT5uX2NvdW50ZXJzKQorCQkJCWNwdWh3LT5jb3VudGVyW2ktMV0gPSBjcHVody0+Y291bnRlcltpXTsKKwkJCS0tY3B1aHctPm5fY291bnRlcnM7CisJCQlwcG11LT5kaXNhYmxlX3BtYyhjb3VudGVyLT5ody5pZHggLSAxLCBjcHVody0+bW1jcik7CisJCQlpZiAoY291bnRlci0+aHcuaWR4KSB7CisJCQkJd3JpdGVfcG1jKGNvdW50ZXItPmh3LmlkeCwgMCk7CisJCQkJY291bnRlci0+aHcuaWR4ID0gMDsKKwkJCX0KKwkJCXBlcmZfY291bnRlcl91cGRhdGVfdXNlcnBhZ2UoY291bnRlcik7CisJCQlicmVhazsKKwkJfQorCX0KKwlmb3IgKGkgPSAwOyBpIDwgY3B1aHctPm5fbGltaXRlZDsgKytpKQorCQlpZiAoY291bnRlciA9PSBjcHVody0+bGltaXRlZF9jb3VudGVyW2ldKQorCQkJYnJlYWs7CisJaWYgKGkgPCBjcHVody0+bl9saW1pdGVkKSB7CisJCXdoaWxlICgrK2kgPCBjcHVody0+bl9saW1pdGVkKSB7CisJCQljcHVody0+bGltaXRlZF9jb3VudGVyW2ktMV0gPSBjcHVody0+bGltaXRlZF9jb3VudGVyW2ldOworCQkJY3B1aHctPmxpbWl0ZWRfaHdpZHhbaS0xXSA9IGNwdWh3LT5saW1pdGVkX2h3aWR4W2ldOworCQl9CisJCS0tY3B1aHctPm5fbGltaXRlZDsKKwl9CisJaWYgKGNwdWh3LT5uX2NvdW50ZXJzID09IDApIHsKKwkJLyogZGlzYWJsZSBleGNlcHRpb25zIGlmIG5vIGNvdW50ZXJzIGFyZSBydW5uaW5nICovCisJCWNwdWh3LT5tbWNyWzBdICY9IH4oTU1DUjBfUE1YRSB8IE1NQ1IwX0ZDRUNFKTsKKwl9CisKKwlwZXJmX2VuYWJsZSgpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworLyoKKyAqIFJlLWVuYWJsZSBpbnRlcnJ1cHRzIG9uIGEgY291bnRlciBhZnRlciB0aGV5IHdlcmUgdGhyb3R0bGVkCisgKiBiZWNhdXNlIHRoZXkgd2VyZSBjb21pbmcgdG9vIGZhc3QuCisgKi8KK3N0YXRpYyB2b2lkIHBvd2VyX3BtdV91bnRocm90dGxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJczY0IHZhbCwgbGVmdDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFjb3VudGVyLT5ody5pZHggfHwgIWNvdW50ZXItPmh3LnNhbXBsZV9wZXJpb2QpCisJCXJldHVybjsKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJcGVyZl9kaXNhYmxlKCk7CisJcG93ZXJfcG11X3JlYWQoY291bnRlcik7CisJbGVmdCA9IGNvdW50ZXItPmh3LnNhbXBsZV9wZXJpb2Q7CisJY291bnRlci0+aHcubGFzdF9wZXJpb2QgPSBsZWZ0OworCXZhbCA9IDA7CisJaWYgKGxlZnQgPCAweDgwMDAwMDAwTCkKKwkJdmFsID0gMHg4MDAwMDAwMEwgLSBsZWZ0OworCXdyaXRlX3BtYyhjb3VudGVyLT5ody5pZHgsIHZhbCk7CisJYXRvbWljNjRfc2V0KCZjb3VudGVyLT5ody5wcmV2X2NvdW50LCB2YWwpOworCWF0b21pYzY0X3NldCgmY291bnRlci0+aHcucGVyaW9kX2xlZnQsIGxlZnQpOworCXBlcmZfY291bnRlcl91cGRhdGVfdXNlcnBhZ2UoY291bnRlcik7CisJcGVyZl9lbmFibGUoKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKK3N0cnVjdCBwbXUgcG93ZXJfcG11ID0geworCS5lbmFibGUJCT0gcG93ZXJfcG11X2VuYWJsZSwKKwkuZGlzYWJsZQk9IHBvd2VyX3BtdV9kaXNhYmxlLAorCS5yZWFkCQk9IHBvd2VyX3BtdV9yZWFkLAorCS51bnRocm90dGxlCT0gcG93ZXJfcG11X3VudGhyb3R0bGUsCit9OworCisvKgorICogUmV0dXJuIDEgaWYgd2UgbWlnaHQgYmUgYWJsZSB0byBwdXQgY291bnRlciBvbiBhIGxpbWl0ZWQgUE1DLAorICogb3IgMCBpZiBub3QuCisgKiBBIGNvdW50ZXIgY2FuIG9ubHkgZ28gb24gYSBsaW1pdGVkIFBNQyBpZiBpdCBjb3VudHMgc29tZXRoaW5nCisgKiB0aGF0IGEgbGltaXRlZCBQTUMgY2FuIGNvdW50LCBkb2Vzbid0IHJlcXVpcmUgaW50ZXJydXB0cywgYW5kCisgKiBkb2Vzbid0IGV4Y2x1ZGUgYW55IHByb2Nlc3NvciBtb2RlLgorICovCitzdGF0aWMgaW50IGNhbl9nb19vbl9saW1pdGVkX3BtYyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCB1NjQgZXYsCisJCQkJIHVuc2lnbmVkIGludCBmbGFncykKK3sKKwlpbnQgbjsKKwl1NjQgYWx0W01BWF9FVkVOVF9BTFRFUk5BVElWRVNdOworCisJaWYgKGNvdW50ZXItPmF0dHIuZXhjbHVkZV91c2VyCisJICAgIHx8IGNvdW50ZXItPmF0dHIuZXhjbHVkZV9rZXJuZWwKKwkgICAgfHwgY291bnRlci0+YXR0ci5leGNsdWRlX2h2CisJICAgIHx8IGNvdW50ZXItPmF0dHIuc2FtcGxlX3BlcmlvZCkKKwkJcmV0dXJuIDA7CisKKwlpZiAocHBtdS0+bGltaXRlZF9wbWNfZXZlbnQoZXYpKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogVGhlIHJlcXVlc3RlZCBldmVudCBpc24ndCBvbiBhIGxpbWl0ZWQgUE1DIGFscmVhZHk7CisJICogc2VlIGlmIGFueSBhbHRlcm5hdGl2ZSBjb2RlIGdvZXMgb24gYSBsaW1pdGVkIFBNQy4KKwkgKi8KKwlpZiAoIXBwbXUtPmdldF9hbHRlcm5hdGl2ZXMpCisJCXJldHVybiAwOworCisJZmxhZ3MgfD0gUFBNVV9MSU1JVEVEX1BNQ19PSyB8IFBQTVVfTElNSVRFRF9QTUNfUkVRRDsKKwluID0gcHBtdS0+Z2V0X2FsdGVybmF0aXZlcyhldiwgZmxhZ3MsIGFsdCk7CisKKwlyZXR1cm4gbiA+IDA7Cit9CisKKy8qCisgKiBGaW5kIGFuIGFsdGVybmF0aXZlIGV2ZW50IHRoYXQgZ29lcyBvbiBhIG5vcm1hbCBQTUMsIGlmIHBvc3NpYmxlLAorICogYW5kIHJldHVybiB0aGUgZXZlbnQgY29kZSwgb3IgMCBpZiB0aGVyZSBpcyBubyBzdWNoIGFsdGVybmF0aXZlLgorICogKE5vdGU6IGV2ZW50IGNvZGUgMCBpcyAiZG9uJ3QgY291bnQiIG9uIGFsbCBtYWNoaW5lcy4pCisgKi8KK3N0YXRpYyB1NjQgbm9ybWFsX3BtY19hbHRlcm5hdGl2ZSh1NjQgZXYsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJdTY0IGFsdFtNQVhfRVZFTlRfQUxURVJOQVRJVkVTXTsKKwlpbnQgbjsKKworCWZsYWdzICY9IH4oUFBNVV9MSU1JVEVEX1BNQ19PSyB8IFBQTVVfTElNSVRFRF9QTUNfUkVRRCk7CisJbiA9IHBwbXUtPmdldF9hbHRlcm5hdGl2ZXMoZXYsIGZsYWdzLCBhbHQpOworCWlmICghbikKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGFsdFswXTsKK30KKworLyogTnVtYmVyIG9mIHBlcmZfY291bnRlcnMgY291bnRpbmcgaGFyZHdhcmUgZXZlbnRzICovCitzdGF0aWMgYXRvbWljX3QgbnVtX2NvdW50ZXJzOworLyogVXNlZCB0byBhdm9pZCByYWNlcyBpbiBjYWxsaW5nIHJlc2VydmUvcmVsZWFzZV9wbWNfaGFyZHdhcmUgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgocG1jX3Jlc2VydmVfbXV0ZXgpOworCisvKgorICogUmVsZWFzZSB0aGUgUE1VIGlmIHRoaXMgaXMgdGhlIGxhc3QgcGVyZl9jb3VudGVyLgorICovCitzdGF0aWMgdm9pZCBod19wZXJmX2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWlmICghYXRvbWljX2FkZF91bmxlc3MoJm51bV9jb3VudGVycywgLTEsIDEpKSB7CisJCW11dGV4X2xvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwkJaWYgKGF0b21pY19kZWNfcmV0dXJuKCZudW1fY291bnRlcnMpID09IDApCisJCQlyZWxlYXNlX3BtY19oYXJkd2FyZSgpOworCQltdXRleF91bmxvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwl9Cit9CisKKy8qCisgKiBUcmFuc2xhdGUgYSBnZW5lcmljIGNhY2hlIGV2ZW50IGNvbmZpZyB0byBhIHJhdyBldmVudCBjb2RlLgorICovCitzdGF0aWMgaW50IGh3X3BlcmZfY2FjaGVfZXZlbnQodTY0IGNvbmZpZywgdTY0ICpldmVudHApCit7CisJdW5zaWduZWQgbG9uZyB0eXBlLCBvcCwgcmVzdWx0OworCWludCBldjsKKworCWlmICghcHBtdS0+Y2FjaGVfZXZlbnRzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIHVucGFjayBjb25maWcgKi8KKwl0eXBlID0gY29uZmlnICYgMHhmZjsKKwlvcCA9IChjb25maWcgPj4gOCkgJiAweGZmOworCXJlc3VsdCA9IChjb25maWcgPj4gMTYpICYgMHhmZjsKKworCWlmICh0eXBlID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYIHx8CisJICAgIG9wID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYIHx8CisJICAgIHJlc3VsdCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJZXYgPSAoKnBwbXUtPmNhY2hlX2V2ZW50cylbdHlwZV1bb3BdW3Jlc3VsdF07CisJaWYgKGV2ID09IDApCisJCXJldHVybiAtRU9QTk9UU1VQUDsKKwlpZiAoZXYgPT0gLTEpCisJCXJldHVybiAtRUlOVkFMOworCSpldmVudHAgPSBldjsKKwlyZXR1cm4gMDsKK30KKworY29uc3Qgc3RydWN0IHBtdSAqaHdfcGVyZl9jb3VudGVyX2luaXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwl1NjQgZXY7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjdHJzW01BWF9IV0NPVU5URVJTXTsKKwl1NjQgZXZlbnRzW01BWF9IV0NPVU5URVJTXTsKKwl1bnNpZ25lZCBpbnQgY2ZsYWdzW01BWF9IV0NPVU5URVJTXTsKKwlpbnQgbjsKKwlpbnQgZXJyOworCisJaWYgKCFwcG11KQorCQlyZXR1cm4gRVJSX1BUUigtRU5YSU8pOworCXN3aXRjaCAoY291bnRlci0+YXR0ci50eXBlKSB7CisJY2FzZSBQRVJGX1RZUEVfSEFSRFdBUkU6CisJCWV2ID0gY291bnRlci0+YXR0ci5jb25maWc7CisJCWlmIChldiA+PSBwcG11LT5uX2dlbmVyaWMgfHwgcHBtdS0+Z2VuZXJpY19ldmVudHNbZXZdID09IDApCisJCQlyZXR1cm4gRVJSX1BUUigtRU9QTk9UU1VQUCk7CisJCWV2ID0gcHBtdS0+Z2VuZXJpY19ldmVudHNbZXZdOworCQlicmVhazsKKwljYXNlIFBFUkZfVFlQRV9IV19DQUNIRToKKwkJZXJyID0gaHdfcGVyZl9jYWNoZV9ldmVudChjb3VudGVyLT5hdHRyLmNvbmZpZywgJmV2KTsKKwkJaWYgKGVycikKKwkJCXJldHVybiBFUlJfUFRSKGVycik7CisJCWJyZWFrOworCWNhc2UgUEVSRl9UWVBFX1JBVzoKKwkJZXYgPSBjb3VudGVyLT5hdHRyLmNvbmZpZzsKKwkJYnJlYWs7CisJfQorCWNvdW50ZXItPmh3LmNvbmZpZ19iYXNlID0gZXY7CisJY291bnRlci0+aHcuaWR4ID0gMDsKKworCS8qCisJICogSWYgd2UgYXJlIG5vdCBydW5uaW5nIG9uIGEgaHlwZXJ2aXNvciwgZm9yY2UgdGhlCisJICogZXhjbHVkZV9odiBiaXQgdG8gMCBzbyB0aGF0IHdlIGRvbid0IGNhcmUgd2hhdAorCSAqIHRoZSB1c2VyIHNldCBpdCB0by4KKwkgKi8KKwlpZiAoIWZpcm13YXJlX2hhc19mZWF0dXJlKEZXX0ZFQVRVUkVfTFBBUikpCisJCWNvdW50ZXItPmF0dHIuZXhjbHVkZV9odiA9IDA7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBwZXItdGFzayBjb3VudGVyLCB0aGVuIHdlIGNhbiB1c2UKKwkgKiBQTV9SVU5fKiBldmVudHMgaW50ZXJjaGFuZ2VhYmx5IHdpdGggdGhlaXIgbm9uIFJVTl8qCisJICogZXF1aXZhbGVudHMsIGUuZy4gUE1fUlVOX0NZQyBpbnN0ZWFkIG9mIFBNX0NZQy4KKwkgKiBYWFggd2Ugc2hvdWxkIGNoZWNrIGlmIHRoZSB0YXNrIGlzIGFuIGlkbGUgdGFzay4KKwkgKi8KKwlmbGFncyA9IDA7CisJaWYgKGNvdW50ZXItPmN0eC0+dGFzaykKKwkJZmxhZ3MgfD0gUFBNVV9PTkxZX0NPVU5UX1JVTjsKKworCS8qCisJICogSWYgdGhpcyBtYWNoaW5lIGhhcyBsaW1pdGVkIGNvdW50ZXJzLCBjaGVjayB3aGV0aGVyIHRoaXMKKwkgKiBldmVudCBjb3VsZCBnbyBvbiBhIGxpbWl0ZWQgY291bnRlci4KKwkgKi8KKwlpZiAocHBtdS0+ZmxhZ3MgJiBQUE1VX0xJTUlURURfUE1DNV82KSB7CisJCWlmIChjYW5fZ29fb25fbGltaXRlZF9wbWMoY291bnRlciwgZXYsIGZsYWdzKSkgeworCQkJZmxhZ3MgfD0gUFBNVV9MSU1JVEVEX1BNQ19PSzsKKwkJfSBlbHNlIGlmIChwcG11LT5saW1pdGVkX3BtY19ldmVudChldikpIHsKKwkJCS8qCisJCQkgKiBUaGUgcmVxdWVzdGVkIGV2ZW50IGlzIG9uIGEgbGltaXRlZCBQTUMsCisJCQkgKiBidXQgd2UgY2FuJ3QgdXNlIGEgbGltaXRlZCBQTUM7IHNlZSBpZiBhbnkKKwkJCSAqIGFsdGVybmF0aXZlIGdvZXMgb24gYSBub3JtYWwgUE1DLgorCQkJICovCisJCQlldiA9IG5vcm1hbF9wbWNfYWx0ZXJuYXRpdmUoZXYsIGZsYWdzKTsKKwkJCWlmICghZXYpCisJCQkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoaXMgaXMgaW4gYSBncm91cCwgY2hlY2sgaWYgaXQgY2FuIGdvIG9uIHdpdGggYWxsIHRoZQorCSAqIG90aGVyIGhhcmR3YXJlIGNvdW50ZXJzIGluIHRoZSBncm91cC4gIFdlIGFzc3VtZSB0aGUgY291bnRlcgorCSAqIGhhc24ndCBiZWVuIGxpbmtlZCBpbnRvIGl0cyBsZWFkZXIncyBzaWJsaW5nIGxpc3QgYXQgdGhpcyBwb2ludC4KKwkgKi8KKwluID0gMDsKKwlpZiAoY291bnRlci0+Z3JvdXBfbGVhZGVyICE9IGNvdW50ZXIpIHsKKwkJbiA9IGNvbGxlY3RfZXZlbnRzKGNvdW50ZXItPmdyb3VwX2xlYWRlciwgcHBtdS0+bl9jb3VudGVyIC0gMSwKKwkJCQkgICBjdHJzLCBldmVudHMsIGNmbGFncyk7CisJCWlmIChuIDwgMCkKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCX0KKwlldmVudHNbbl0gPSBldjsKKwljdHJzW25dID0gY291bnRlcjsKKwljZmxhZ3Nbbl0gPSBmbGFnczsKKwlpZiAoY2hlY2tfZXhjbHVkZXMoY3RycywgY2ZsYWdzLCBuLCAxKSkKKwkJcmV0dXJuIEVSUl9QVFIoLUVJTlZBTCk7CisJaWYgKHBvd2VyX2NoZWNrX2NvbnN0cmFpbnRzKGV2ZW50cywgY2ZsYWdzLCBuICsgMSkpCisJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCisJY291bnRlci0+aHcuY29uZmlnID0gZXZlbnRzW25dOworCWNvdW50ZXItPmh3LmNvdW50ZXJfYmFzZSA9IGNmbGFnc1tuXTsKKwljb3VudGVyLT5ody5sYXN0X3BlcmlvZCA9IGNvdW50ZXItPmh3LnNhbXBsZV9wZXJpb2Q7CisJYXRvbWljNjRfc2V0KCZjb3VudGVyLT5ody5wZXJpb2RfbGVmdCwgY291bnRlci0+aHcubGFzdF9wZXJpb2QpOworCisJLyoKKwkgKiBTZWUgaWYgd2UgbmVlZCB0byByZXNlcnZlIHRoZSBQTVUuCisJICogSWYgbm8gY291bnRlcnMgYXJlIGN1cnJlbnRseSBpbiB1c2UsIHRoZW4gd2UgaGF2ZSB0byB0YWtlIGEKKwkgKiBtdXRleCB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCByYWNlIHdpdGggYW5vdGhlciB0YXNrIGRvaW5nCisJICogcmVzZXJ2ZV9wbWNfaGFyZHdhcmUgb3IgcmVsZWFzZV9wbWNfaGFyZHdhcmUuCisJICovCisJZXJyID0gMDsKKwlpZiAoIWF0b21pY19pbmNfbm90X3plcm8oJm51bV9jb3VudGVycykpIHsKKwkJbXV0ZXhfbG9jaygmcG1jX3Jlc2VydmVfbXV0ZXgpOworCQlpZiAoYXRvbWljX3JlYWQoJm51bV9jb3VudGVycykgPT0gMCAmJgorCQkgICAgcmVzZXJ2ZV9wbWNfaGFyZHdhcmUocGVyZl9jb3VudGVyX2ludGVycnVwdCkpCisJCQllcnIgPSAtRUJVU1k7CisJCWVsc2UKKwkJCWF0b21pY19pbmMoJm51bV9jb3VudGVycyk7CisJCW11dGV4X3VubG9jaygmcG1jX3Jlc2VydmVfbXV0ZXgpOworCX0KKwljb3VudGVyLT5kZXN0cm95ID0gaHdfcGVyZl9jb3VudGVyX2Rlc3Ryb3k7CisKKwlpZiAoZXJyKQorCQlyZXR1cm4gRVJSX1BUUihlcnIpOworCXJldHVybiAmcG93ZXJfcG11OworfQorCisvKgorICogQSBjb3VudGVyIGhhcyBvdmVyZmxvd2VkOyB1cGRhdGUgaXRzIGNvdW50IGFuZCByZWNvcmQKKyAqIHRoaW5ncyBpZiByZXF1ZXN0ZWQuICBOb3RlIHRoYXQgaW50ZXJydXB0cyBhcmUgaGFyZC1kaXNhYmxlZAorICogaGVyZSBzbyB0aGVyZSBpcyBubyBwb3NzaWJpbGl0eSBvZiBiZWluZyBpbnRlcnJ1cHRlZC4KKyAqLworc3RhdGljIHZvaWQgcmVjb3JkX2FuZF9yZXN0YXJ0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIGxvbmcgdmFsLAorCQkJICAgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCBpbnQgbm1pKQoreworCXU2NCBwZXJpb2QgPSBjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kOworCXM2NCBwcmV2LCBkZWx0YSwgbGVmdDsKKwlpbnQgcmVjb3JkID0gMDsKKwl1NjQgYWRkciwgbW1jcmEsIHNkc3luYzsKKworCS8qIHdlIGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgaW50ZXJydXB0cyBoZXJlICovCisJcHJldiA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmh3LnByZXZfY291bnQpOworCWRlbHRhID0gKHZhbCAtIHByZXYpICYgMHhmZmZmZmZmZnVsOworCWF0b21pYzY0X2FkZChkZWx0YSwgJmNvdW50ZXItPmNvdW50KTsKKworCS8qCisJICogU2VlIGlmIHRoZSB0b3RhbCBwZXJpb2QgZm9yIHRoaXMgY291bnRlciBoYXMgZXhwaXJlZCwKKwkgKiBhbmQgdXBkYXRlIGZvciB0aGUgbmV4dCBwZXJpb2QuCisJICovCisJdmFsID0gMDsKKwlsZWZ0ID0gYXRvbWljNjRfcmVhZCgmY291bnRlci0+aHcucGVyaW9kX2xlZnQpIC0gZGVsdGE7CisJaWYgKHBlcmlvZCkgeworCQlpZiAobGVmdCA8PSAwKSB7CisJCQlsZWZ0ICs9IHBlcmlvZDsKKwkJCWlmIChsZWZ0IDw9IDApCisJCQkJbGVmdCA9IHBlcmlvZDsKKwkJCXJlY29yZCA9IDE7CisJCX0KKwkJaWYgKGxlZnQgPCAweDgwMDAwMDAwTCkKKwkJCXZhbCA9IDB4ODAwMDAwMDBMIC0gbGVmdDsKKwl9CisKKwkvKgorCSAqIEZpbmFsbHkgcmVjb3JkIGRhdGEgaWYgcmVxdWVzdGVkLgorCSAqLworCWlmIChyZWNvcmQpIHsKKwkJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YSA9IHsKKwkJCS5yZWdzCT0gcmVncywKKwkJCS5hZGRyCT0gMCwKKwkJCS5wZXJpb2QJPSBjb3VudGVyLT5ody5sYXN0X3BlcmlvZCwKKwkJfTsKKworCQlpZiAoY291bnRlci0+YXR0ci5zYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0FERFIpIHsKKwkJCS8qCisJCQkgKiBUaGUgdXNlciB3YW50cyBhIGRhdGEgYWRkcmVzcyByZWNvcmRlZC4KKwkJCSAqIElmIHdlJ3JlIG5vdCBkb2luZyBpbnN0cnVjdGlvbiBzYW1wbGluZywKKwkJCSAqIGdpdmUgdGhlbSB0aGUgU0RBUiAoc2FtcGxlZCBkYXRhIGFkZHJlc3MpLgorCQkJICogSWYgd2UgYXJlIGRvaW5nIGluc3RydWN0aW9uIHNhbXBsaW5nLCB0aGVuIG9ubHkKKwkJCSAqIGdpdmUgdGhlbSB0aGUgU0RBUiBpZiBpdCBjb3JyZXNwb25kcyB0byB0aGUKKwkJCSAqIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gYnkgU0lBUjsgdGhpcyBpcyBpbmRpY2F0ZWQKKwkJCSAqIGJ5IHRoZSBbUE9XRVI2X11NTUNSQV9TRFNZTkMgYml0IGluIE1NQ1JBLgorCQkJICovCisJCQltbWNyYSA9IHJlZ3MtPmRzaXNyOworCQkJc2RzeW5jID0gKHBwbXUtPmZsYWdzICYgUFBNVV9BTFRfU0lQUikgPworCQkJCVBPV0VSNl9NTUNSQV9TRFNZTkMgOiBNTUNSQV9TRFNZTkM7CisJCQlpZiAoIShtbWNyYSAmIE1NQ1JBX1NBTVBMRV9FTkFCTEUpIHx8IChtbWNyYSAmIHNkc3luYykpCisJCQkJZGF0YS5hZGRyID0gbWZzcHIoU1BSTl9TREFSKTsKKwkJfQorCQlpZiAocGVyZl9jb3VudGVyX292ZXJmbG93KGNvdW50ZXIsIG5taSwgJmRhdGEpKSB7CisJCQkvKgorCQkJICogSW50ZXJydXB0cyBhcmUgY29taW5nIHRvbyBmYXN0IC0gdGhyb3R0bGUgdGhlbQorCQkJICogYnkgc2V0dGluZyB0aGUgY291bnRlciB0byAwLCBzbyBpdCB3aWxsIGJlCisJCQkgKiBhdCBsZWFzdCAyXjMwIGN5Y2xlcyB1bnRpbCB0aGUgbmV4dCBpbnRlcnJ1cHQKKwkJCSAqIChhc3N1bWluZyBlYWNoIGNvdW50ZXIgY291bnRzIGF0IG1vc3QgMiBjb3VudHMKKwkJCSAqIHBlciBjeWNsZSkuCisJCQkgKi8KKwkJCXZhbCA9IDA7CisJCQlsZWZ0ID0gfjBVTEwgPj4gMTsKKwkJfQorCX0KKworCXdyaXRlX3BtYyhjb3VudGVyLT5ody5pZHgsIHZhbCk7CisJYXRvbWljNjRfc2V0KCZjb3VudGVyLT5ody5wcmV2X2NvdW50LCB2YWwpOworCWF0b21pYzY0X3NldCgmY291bnRlci0+aHcucGVyaW9kX2xlZnQsIGxlZnQpOworCXBlcmZfY291bnRlcl91cGRhdGVfdXNlcnBhZ2UoY291bnRlcik7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBnZW5lcmljIGNvZGUgdG8gZ2V0IHRoZSBtaXNjIGZsYWdzIChpLmUuIHByb2Nlc3NvciBtb2RlKQorICogZm9yIGFuIGV2ZW50LgorICovCit1bnNpZ25lZCBsb25nIHBlcmZfbWlzY19mbGFncyhzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwl1bnNpZ25lZCBsb25nIG1tY3JhOworCisJaWYgKFRSQVAocmVncykgIT0gMHhmMDApIHsKKwkJLyogbm90IGEgUE1VIGludGVycnVwdCAqLworCQlyZXR1cm4gdXNlcl9tb2RlKHJlZ3MpID8gUEVSRl9FVkVOVF9NSVNDX1VTRVIgOgorCQkJUEVSRl9FVkVOVF9NSVNDX0tFUk5FTDsKKwl9CisKKwltbWNyYSA9IHJlZ3MtPmRzaXNyOworCWlmIChwcG11LT5mbGFncyAmIFBQTVVfQUxUX1NJUFIpIHsKKwkJaWYgKG1tY3JhICYgUE9XRVI2X01NQ1JBX1NJSFYpCisJCQlyZXR1cm4gUEVSRl9FVkVOVF9NSVNDX0hZUEVSVklTT1I7CisJCXJldHVybiAobW1jcmEgJiBQT1dFUjZfTU1DUkFfU0lQUikgPyBQRVJGX0VWRU5UX01JU0NfVVNFUiA6CisJCQlQRVJGX0VWRU5UX01JU0NfS0VSTkVMOworCX0KKwlpZiAobW1jcmEgJiBNTUNSQV9TSUhWKQorCQlyZXR1cm4gUEVSRl9FVkVOVF9NSVNDX0hZUEVSVklTT1I7CisJcmV0dXJuIChtbWNyYSAmIE1NQ1JBX1NJUFIpID8gUEVSRl9FVkVOVF9NSVNDX1VTRVIgOgorCQkJUEVSRl9FVkVOVF9NSVNDX0tFUk5FTDsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIGdlbmVyaWMgY29kZSB0byBnZXQgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIKKyAqIGZvciBhbiBldmVudC4KKyAqLwordW5zaWduZWQgbG9uZyBwZXJmX2luc3RydWN0aW9uX3BvaW50ZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJdW5zaWduZWQgbG9uZyBtbWNyYTsKKwl1bnNpZ25lZCBsb25nIGlwOworCXVuc2lnbmVkIGxvbmcgc2xvdDsKKworCWlmIChUUkFQKHJlZ3MpICE9IDB4ZjAwKQorCQlyZXR1cm4gcmVncy0+bmlwOwkvKiBub3QgYSBQTVUgaW50ZXJydXB0ICovCisKKwlpcCA9IG1mc3ByKFNQUk5fU0lBUik7CisJbW1jcmEgPSByZWdzLT5kc2lzcjsKKwlpZiAoKG1tY3JhICYgTU1DUkFfU0FNUExFX0VOQUJMRSkgJiYgIShwcG11LT5mbGFncyAmIFBQTVVfQUxUX1NJUFIpKSB7CisJCXNsb3QgPSAobW1jcmEgJiBNTUNSQV9TTE9UKSA+PiBNTUNSQV9TTE9UX1NISUZUOworCQlpZiAoc2xvdCA+IDEpCisJCQlpcCArPSA0ICogKHNsb3QgLSAxKTsKKwl9CisJcmV0dXJuIGlwOworfQorCisvKgorICogUGVyZm9ybWFuY2UgbW9uaXRvciBpbnRlcnJ1cHQgc3R1ZmYKKyAqLworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpbnQgaTsKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVodyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKwlsb25nIHZhbDsKKwlpbnQgZm91bmQgPSAwOworCWludCBubWk7CisKKwlpZiAoY3B1aHctPm5fbGltaXRlZCkKKwkJZnJlZXplX2xpbWl0ZWRfY291bnRlcnMoY3B1aHcsIG1mc3ByKFNQUk5fUE1DNSksCisJCQkJCW1mc3ByKFNQUk5fUE1DNikpOworCisJLyoKKwkgKiBPdmVybG9hZCByZWdzLT5kc2lzciB0byBzdG9yZSBNTUNSQSBzbyB3ZSBvbmx5IG5lZWQgdG8gcmVhZCBpdCBvbmNlLgorCSAqLworCXJlZ3MtPmRzaXNyID0gbWZzcHIoU1BSTl9NTUNSQSk7CisKKwkvKgorCSAqIElmIGludGVycnVwdHMgd2VyZSBzb2Z0LWRpc2FibGVkIHdoZW4gdGhpcyBQTVUgaW50ZXJydXB0CisJICogb2NjdXJyZWQsIHRyZWF0IGl0IGFzIGFuIE5NSS4KKwkgKi8KKwlubWkgPSAhcmVncy0+c29mdGU7CisJaWYgKG5taSkKKwkJbm1pX2VudGVyKCk7CisJZWxzZQorCQlpcnFfZW50ZXIoKTsKKworCWZvciAoaSA9IDA7IGkgPCBjcHVody0+bl9jb3VudGVyczsgKytpKSB7CisJCWNvdW50ZXIgPSBjcHVody0+Y291bnRlcltpXTsKKwkJaWYgKCFjb3VudGVyLT5ody5pZHggfHwgaXNfbGltaXRlZF9wbWMoY291bnRlci0+aHcuaWR4KSkKKwkJCWNvbnRpbnVlOworCQl2YWwgPSByZWFkX3BtYyhjb3VudGVyLT5ody5pZHgpOworCQlpZiAoKGludCl2YWwgPCAwKSB7CisJCQkvKiBjb3VudGVyIGhhcyBvdmVyZmxvd2VkICovCisJCQlmb3VuZCA9IDE7CisJCQlyZWNvcmRfYW5kX3Jlc3RhcnQoY291bnRlciwgdmFsLCByZWdzLCBubWkpOworCQl9CisJfQorCisJLyoKKwkgKiBJbiBjYXNlIHdlIGRpZG4ndCBmaW5kIGFuZCByZXNldCB0aGUgY291bnRlciB0aGF0IGNhdXNlZAorCSAqIHRoZSBpbnRlcnJ1cHQsIHNjYW4gYWxsIGNvdW50ZXJzIGFuZCByZXNldCBhbnkgdGhhdCBhcmUKKwkgKiBuZWdhdGl2ZSwgdG8gYXZvaWQgZ2V0dGluZyBjb250aW51YWwgaW50ZXJydXB0cy4KKwkgKiBBbnkgdGhhdCB3ZSBwcm9jZXNzZWQgaW4gdGhlIHByZXZpb3VzIGxvb3Agd2lsbCBub3QgYmUgbmVnYXRpdmUuCisJICovCisJaWYgKCFmb3VuZCkgeworCQlmb3IgKGkgPSAwOyBpIDwgcHBtdS0+bl9jb3VudGVyOyArK2kpIHsKKwkJCWlmIChpc19saW1pdGVkX3BtYyhpICsgMSkpCisJCQkJY29udGludWU7CisJCQl2YWwgPSByZWFkX3BtYyhpICsgMSk7CisJCQlpZiAoKGludCl2YWwgPCAwKQorCQkJCXdyaXRlX3BtYyhpICsgMSwgMCk7CisJCX0KKwl9CisKKwkvKgorCSAqIFJlc2V0IE1NQ1IwIHRvIGl0cyBub3JtYWwgdmFsdWUuICBUaGlzIHdpbGwgc2V0IFBNWEUgYW5kCisJICogY2xlYXIgRkMgKGZyZWV6ZSBjb3VudGVycykgYW5kIFBNQU8gKHBlcmYgbW9uIGFsZXJ0IG9jY3VycmVkKQorCSAqIGFuZCB0aHVzIGFsbG93IGludGVycnVwdHMgdG8gb2NjdXIgYWdhaW4uCisJICogWFhYIG1pZ2h0IHdhbnQgdG8gdXNlIE1TUi5QTSB0byBrZWVwIHRoZSBjb3VudGVycyBmcm96ZW4gdW50aWwKKwkgKiB3ZSBnZXQgYmFjayBvdXQgb2YgdGhpcyBpbnRlcnJ1cHQuCisJICovCisJd3JpdGVfbW1jcjAoY3B1aHcsIGNwdWh3LT5tbWNyWzBdKTsKKworCWlmIChubWkpCisJCW5taV9leGl0KCk7CisJZWxzZQorCQlpcnFfZXhpdCgpOworfQorCit2b2lkIGh3X3BlcmZfY291bnRlcl9zZXR1cChpbnQgY3B1KQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWh3ID0gJnBlcl9jcHUoY3B1X2h3X2NvdW50ZXJzLCBjcHUpOworCisJbWVtc2V0KGNwdWh3LCAwLCBzaXplb2YoKmNwdWh3KSk7CisJY3B1aHctPm1tY3JbMF0gPSBNTUNSMF9GQzsKK30KKworZXh0ZXJuIHN0cnVjdCBwb3dlcl9wbXUgcG93ZXI0X3BtdTsKK2V4dGVybiBzdHJ1Y3QgcG93ZXJfcG11IHBwYzk3MF9wbXU7CitleHRlcm4gc3RydWN0IHBvd2VyX3BtdSBwb3dlcjVfcG11OworZXh0ZXJuIHN0cnVjdCBwb3dlcl9wbXUgcG93ZXI1cF9wbXU7CitleHRlcm4gc3RydWN0IHBvd2VyX3BtdSBwb3dlcjZfcG11OworZXh0ZXJuIHN0cnVjdCBwb3dlcl9wbXUgcG93ZXI3X3BtdTsKKworc3RhdGljIGludCBpbml0X3BlcmZfY291bnRlcnModm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHB2cjsKKworCS8qIFhYWCBzaG91bGQgZ2V0IHRoaXMgZnJvbSBjcHV0YWJsZSAqLworCXB2ciA9IG1mc3ByKFNQUk5fUFZSKTsKKwlzd2l0Y2ggKFBWUl9WRVIocHZyKSkgeworCWNhc2UgUFZfUE9XRVI0OgorCWNhc2UgUFZfUE9XRVI0cDoKKwkJcHBtdSA9ICZwb3dlcjRfcG11OworCQlicmVhazsKKwljYXNlIFBWXzk3MDoKKwljYXNlIFBWXzk3MEZYOgorCWNhc2UgUFZfOTcwTVA6CisJCXBwbXUgPSAmcHBjOTcwX3BtdTsKKwkJYnJlYWs7CisJY2FzZSBQVl9QT1dFUjU6CisJCXBwbXUgPSAmcG93ZXI1X3BtdTsKKwkJYnJlYWs7CisJY2FzZSBQVl9QT1dFUjVwOgorCQlwcG11ID0gJnBvd2VyNXBfcG11OworCQlicmVhazsKKwljYXNlIDB4M2U6CisJCXBwbXUgPSAmcG93ZXI2X3BtdTsKKwkJYnJlYWs7CisJY2FzZSAweDNmOgorCQlwcG11ID0gJnBvd2VyN19wbXU7CisJCWJyZWFrOworCX0KKworCS8qCisJICogVXNlIEZDSFYgdG8gaWdub3JlIGtlcm5lbCBldmVudHMgaWYgTVNSLkhWIGlzIHNldC4KKwkgKi8KKwlpZiAobWZtc3IoKSAmIE1TUl9IVikKKwkJZnJlZXplX2NvdW50ZXJzX2tlcm5lbCA9IE1NQ1IwX0ZDSFY7CisKKwlyZXR1cm4gMDsKK30KKworYXJjaF9pbml0Y2FsbChpbml0X3BlcmZfY291bnRlcnMpOwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjQtcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNC1wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2JkMzA4Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjQtcG11LmMKQEAgLTAsMCArMSw1OTggQEAKKy8qCisgKiBQZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQgZm9yIFBPV0VSNCAoR1ApIGFuZCBQT1dFUjQrIChHUSkgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOSBQYXVsIE1hY2tlcnJhcywgSUJNIENvcnBvcmF0aW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KKyNpbmNsdWRlIDxhc20vcmVnLmg+CisKKy8qCisgKiBCaXRzIGluIGV2ZW50IGNvZGUgZm9yIFBPV0VSNAorICovCisjZGVmaW5lIFBNX1BNQ19TSAkxMgkvKiBQTUMgbnVtYmVyICgxLWJhc2VkKSBmb3IgZGlyZWN0IGV2ZW50cyAqLworI2RlZmluZSBQTV9QTUNfTVNLCTB4ZgorI2RlZmluZSBQTV9VTklUX1NICTgJLyogVFRNTVVYIG51bWJlciBhbmQgc2V0dGluZyAtIHVuaXQgc2VsZWN0ICovCisjZGVmaW5lIFBNX1VOSVRfTVNLCTB4ZgorI2RlZmluZSBQTV9MT1dFUl9TSAk2CisjZGVmaW5lIFBNX0xPV0VSX01TSwkxCisjZGVmaW5lIFBNX0xPV0VSX01TS1MJMHg0MAorI2RlZmluZSBQTV9CWVRFX1NICTQJLyogQnl0ZSBudW1iZXIgb2YgZXZlbnQgYnVzIHRvIHVzZSAqLworI2RlZmluZSBQTV9CWVRFX01TSwkzCisjZGVmaW5lIFBNX1BNQ1NFTF9NU0sJNworCisvKgorICogVW5pdCBjb2RlIHZhbHVlcworICovCisjZGVmaW5lIFBNX0ZQVQkJMQorI2RlZmluZSBQTV9JU1UxCQkyCisjZGVmaW5lIFBNX0lGVQkJMworI2RlZmluZSBQTV9JRFUwCQk0CisjZGVmaW5lIFBNX0lTVTFfQUxUCTYKKyNkZWZpbmUgUE1fSVNVMgkJNworI2RlZmluZSBQTV9JRlVfQUxUCTgKKyNkZWZpbmUgUE1fTFNVMAkJOQorI2RlZmluZSBQTV9MU1UxCQkweGMKKyNkZWZpbmUgUE1fR1BTCQkweGYKKworLyoKKyAqIEJpdHMgaW4gTU1DUjAgZm9yIFBPV0VSNAorICovCisjZGVmaW5lIE1NQ1IwX1BNQzFTRUxfU0gJOAorI2RlZmluZSBNTUNSMF9QTUMyU0VMX1NICTEKKyNkZWZpbmUgTU1DUl9QTUNTRUxfTVNLCQkweDFmCisKKy8qCisgKiBCaXRzIGluIE1NQ1IxIGZvciBQT1dFUjQKKyAqLworI2RlZmluZSBNTUNSMV9UVE0wU0VMX1NICTYyCisjZGVmaW5lIE1NQ1IxX1RUQzBTRUxfU0gJNjEKKyNkZWZpbmUgTU1DUjFfVFRNMVNFTF9TSAk1OQorI2RlZmluZSBNTUNSMV9UVEMxU0VMX1NICTU4CisjZGVmaW5lIE1NQ1IxX1RUTTJTRUxfU0gJNTYKKyNkZWZpbmUgTU1DUjFfVFRDMlNFTF9TSAk1NQorI2RlZmluZSBNTUNSMV9UVE0zU0VMX1NICTUzCisjZGVmaW5lIE1NQ1IxX1RUQzNTRUxfU0gJNTIKKyNkZWZpbmUgTU1DUjFfVFRNU0VMX01TSwkzCisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzBTRUxfU0gJNTAKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHMVNFTF9TSAk0OAorI2RlZmluZSBNTUNSMV9URF9DUF9EQkcyU0VMX1NICTQ2CisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzNTRUxfU0gJNDQKKyNkZWZpbmUgTU1DUjFfREVCVUcwU0VMX1NICTQzCisjZGVmaW5lIE1NQ1IxX0RFQlVHMVNFTF9TSAk0MgorI2RlZmluZSBNTUNSMV9ERUJVRzJTRUxfU0gJNDEKKyNkZWZpbmUgTU1DUjFfREVCVUczU0VMX1NICTQwCisjZGVmaW5lIE1NQ1IxX1BNQzFfQURERVJfU0VMX1NICTM5CisjZGVmaW5lIE1NQ1IxX1BNQzJfQURERVJfU0VMX1NICTM4CisjZGVmaW5lIE1NQ1IxX1BNQzZfQURERVJfU0VMX1NICTM3CisjZGVmaW5lIE1NQ1IxX1BNQzVfQURERVJfU0VMX1NICTM2CisjZGVmaW5lIE1NQ1IxX1BNQzhfQURERVJfU0VMX1NICTM1CisjZGVmaW5lIE1NQ1IxX1BNQzdfQURERVJfU0VMX1NICTM0CisjZGVmaW5lIE1NQ1IxX1BNQzNfQURERVJfU0VMX1NICTMzCisjZGVmaW5lIE1NQ1IxX1BNQzRfQURERVJfU0VMX1NICTMyCisjZGVmaW5lIE1NQ1IxX1BNQzNTRUxfU0gJMjcKKyNkZWZpbmUgTU1DUjFfUE1DNFNFTF9TSAkyMgorI2RlZmluZSBNTUNSMV9QTUM1U0VMX1NICTE3CisjZGVmaW5lIE1NQ1IxX1BNQzZTRUxfU0gJMTIKKyNkZWZpbmUgTU1DUjFfUE1DN1NFTF9TSAk3CisjZGVmaW5lIE1NQ1IxX1BNQzhTRUxfU0gJMgkvKiBub3RlIGJpdCAwIGlzIGluIE1NQ1JBIGZvciBHUCAqLworCitzdGF0aWMgc2hvcnQgbW1jcjFfYWRkZXJfYml0c1s4XSA9IHsKKwlNTUNSMV9QTUMxX0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUMyX0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUMzX0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM0X0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM1X0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM2X0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM3X0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM4X0FEREVSX1NFTF9TSAorfTsKKworLyoKKyAqIEJpdHMgaW4gTU1DUkEKKyAqLworI2RlZmluZSBNTUNSQV9QTUM4U0VMMF9TSAkxNwkvKiBQTUM4U0VMIGJpdCAwIGZvciBHUCAqLworCisvKgorICogTGF5b3V0IG9mIGNvbnN0cmFpbnQgYml0czoKKyAqIDY2NjY1NTU1NTU1NTU1NDQ0NDQ0NDQ0NDMzMzMzMzMzMzMyMjIyMjIyMjIyMTExMTExMTExMTAwMDAwMDAwMDAKKyAqIDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTAKKyAqICAgICAgICB8WyAgPlsgID5bICAgPnx8fFsgID5bICA+PCAgPjwgID48ICA+PCAgPjw+PD48Pjw+PD48Pjw+PD4KKyAqICAgICAgICB8IFVDMSBVQzIgVUMzIHx8fCBQUzEgUFMyIEIwICBCMSAgQjIgIEIzIFAxUDJQM1A0UDVQNlA3UDgKKyAqIAkgIFxTTVBMCSAgICAgICAgfHxcVFRDM1NFTAorICogCQkgICAgICAgIHxcVFRDX0lGVV9TRUwKKyAqIAkJICAgICAgICBcVFRNMlNFTDAKKyAqCisgKiBTTVBMIC0gU0FNUExFX0VOQUJMRSBjb25zdHJhaW50CisgKiAgICAgNTY6IFNBTVBMRV9FTkFCTEUgdmFsdWUgMHgwMTAwXzAwMDBfMDAwMF8wMDAwCisgKgorICogVUMxIC0gdW5pdCBjb25zdHJhaW50IDE6IGNhbid0IGhhdmUgYWxsIHRocmVlIG9mIEZQVS9JU1UxL0lEVTB8SVNVMgorICogICAgIDU1OiBVQzEgZXJyb3IgMHgwMDgwXzAwMDBfMDAwMF8wMDAwCisgKiAgICAgNTQ6IEZQVSBldmVudHMgbmVlZGVkIDB4MDA0MF8wMDAwXzAwMDBfMDAwMAorICogICAgIDUzOiBJU1UxIGV2ZW50cyBuZWVkZWQgMHgwMDIwXzAwMDBfMDAwMF8wMDAwCisgKiAgICAgNTI6IElEVTB8SVNVMiBldmVudHMgbmVlZGVkIDB4MDAxMF8wMDAwXzAwMDBfMDAwMAorICoKKyAqIFVDMiAtIHVuaXQgY29uc3RyYWludCAyOiBjYW4ndCBoYXZlIGFsbCB0aHJlZSBvZiBGUFUvSUZVL0xTVTAKKyAqICAgICA1MTogVUMyIGVycm9yIDB4MDAwOF8wMDAwXzAwMDBfMDAwMAorICogICAgIDUwOiBGUFUgZXZlbnRzIG5lZWRlZCAweDAwMDRfMDAwMF8wMDAwXzAwMDAKKyAqICAgICA0OTogSUZVIGV2ZW50cyBuZWVkZWQgMHgwMDAyXzAwMDBfMDAwMF8wMDAwCisgKiAgICAgNDg6IExTVTAgZXZlbnRzIG5lZWRlZCAweDAwMDFfMDAwMF8wMDAwXzAwMDAKKyAqCisgKiBVQzMgLSB1bml0IGNvbnN0cmFpbnQgMzogY2FuJ3QgaGF2ZSBhbGwgZm91ciBvZiBMU1UwL0lGVS9JRFUwfElTVTIvSVNVMQorICogICAgIDQ3OiBVQzMgZXJyb3IgMHg4MDAwXzAwMDBfMDAwMAorICogICAgIDQ2OiBMU1UwIGV2ZW50cyBuZWVkZWQgMHg0MDAwXzAwMDBfMDAwMAorICogICAgIDQ1OiBJRlUgZXZlbnRzIG5lZWRlZCAweDIwMDBfMDAwMF8wMDAwCisgKiAgICAgNDQ6IElEVTB8SVNVMiBldmVudHMgbmVlZGVkIDB4MTAwMF8wMDAwXzAwMDAKKyAqICAgICA0MzogSVNVMSBldmVudHMgbmVlZGVkIDB4MDgwMF8wMDAwXzAwMDAKKyAqCisgKiBUVE0yU0VMMAorICogICAgIDQyOiAwID0gSURVMCBldmVudHMgbmVlZGVkCisgKiAgICAgCSAgIDEgPSBJU1UyIGV2ZW50cyBuZWVkZWQgMHgwNDAwXzAwMDBfMDAwMAorICoKKyAqIFRUQ19JRlVfU0VMCisgKiAgICAgNDE6IDAgPSBJRlUuVSBldmVudHMgbmVlZGVkCisgKiAgICAgCSAgIDEgPSBJRlUuTCBldmVudHMgbmVlZGVkIDB4MDIwMF8wMDAwXzAwMDAKKyAqCisgKiBUVEMzU0VMCisgKiAgICAgNDA6IDAgPSBMU1UxLlUgZXZlbnRzIG5lZWRlZAorICogICAgIAkgICAxID0gTFNVMS5MIGV2ZW50cyBuZWVkZWQgMHgwMTAwXzAwMDBfMDAwMAorICoKKyAqIFBTMQorICogICAgIDM5OiBQUzEgZXJyb3IgMHgwMDgwXzAwMDBfMDAwMAorICogICAgIDM2LTM4OiBjb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUMxLzIvNS82IDB4MDA3MF8wMDAwXzAwMDAKKyAqCisgKiBQUzIKKyAqICAgICAzNTogUFMyIGVycm9yIDB4MDAwOF8wMDAwXzAwMDAKKyAqICAgICAzMi0zNDogY291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMy80LzcvOCAweDAwMDdfMDAwMF8wMDAwCisgKgorICogQjAKKyAqICAgICAyOC0zMTogQnl0ZSAwIGV2ZW50IHNvdXJjZSAweGYwMDBfMDAwMAorICogICAgIAkgICAxID0gRlBVCisgKiAJICAgMiA9IElTVTEKKyAqIAkgICAzID0gSUZVCisgKiAJICAgNCA9IElEVTAKKyAqIAkgICA3ID0gSVNVMgorICogCSAgIDkgPSBMU1UwCisgKiAJICAgYyA9IExTVTEKKyAqIAkgICBmID0gR1BTCisgKgorICogQjEsIEIyLCBCMworICogICAgIDI0LTI3LCAyMC0yMywgMTYtMTk6IEJ5dGUgMSwgMiwgMyBldmVudCBzb3VyY2VzCisgKgorICogUDgKKyAqICAgICAxNTogUDggZXJyb3IgMHg4MDAwCisgKiAgICAgMTQtMTU6IENvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzgKKyAqCisgKiBQMS4uUDcKKyAqICAgICAwLTEzOiBDb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUMxLi5QTUM3CisgKgorICogTm90ZTogdGhpcyBkb2Vzbid0IGFsbG93IGV2ZW50cyB1c2luZyBJRlUuVSB0byBiZSBjb21iaW5lZCB3aXRoIGV2ZW50cworICogdXNpbmcgSUZVLkwsIHRob3VnaCB0aGF0IGlzIGZlYXNpYmxlICh1c2luZyBUVE0wIGFuZCBUVE0yKS4gIEhvd2V2ZXIKKyAqIHRoZXJlIGFyZSBubyBsaXN0ZWQgZXZlbnRzIGZvciBJRlUuTCAodGhleSBhcmUgZGVidWcgZXZlbnRzIG5vdAorICogdmVyaWZpZWQgZm9yIHBlcmZvcm1hbmNlIG1vbml0b3JpbmcpIHNvIHRoaXMgc2hvdWxkbid0IGNhdXNlIGEKKyAqIHByb2JsZW0uCisgKi8KKworc3RhdGljIHN0cnVjdCB1bml0aW5mbyB7CisJdTY0CXZhbHVlLCBtYXNrOworCWludAl1bml0OworCWludAlsb3dlcmJpdDsKK30gcDRfdW5pdGluZm9bMTZdID0geworCVtQTV9GUFVdICA9IHsgMHg0NDAwMDAwMDAwMDAwMHVsbCwgMHg4ODAwMDAwMDAwMDAwMHVsbCwgUE1fRlBVLCAwIH0sCisJW1BNX0lTVTFdID0geyAweDIwMDgwMDAwMDAwMDAwdWxsLCAweDg4MDAwMDAwMDAwMDAwdWxsLCBQTV9JU1UxLCAwIH0sCisJW1BNX0lTVTFfQUxUXSA9CisJCSAgICB7IDB4MjAwODAwMDAwMDAwMDB1bGwsIDB4ODgwMDAwMDAwMDAwMDB1bGwsIFBNX0lTVTEsIDAgfSwKKwlbUE1fSUZVXSAgPSB7IDB4MDIyMDAwMDAwMDAwMDB1bGwsIDB4MDg4MjAwMDAwMDAwMDB1bGwsIFBNX0lGVSwgNDEgfSwKKwlbUE1fSUZVX0FMVF0gPQorCQkgICAgeyAweDAyMjAwMDAwMDAwMDAwdWxsLCAweDA4ODIwMDAwMDAwMDAwdWxsLCBQTV9JRlUsIDQxIH0sCisJW1BNX0lEVTBdID0geyAweDEwMTAwMDAwMDAwMDAwdWxsLCAweDgwODQwMDAwMDAwMDAwdWxsLCBQTV9JRFUwLCAxIH0sCisJW1BNX0lTVTJdID0geyAweDEwMTQwMDAwMDAwMDAwdWxsLCAweDgwODQwMDAwMDAwMDAwdWxsLCBQTV9JU1UyLCAwIH0sCisJW1BNX0xTVTBdID0geyAweDAxNDAwMDAwMDAwMDAwdWxsLCAweDA4ODAwMDAwMDAwMDAwdWxsLCBQTV9MU1UwLCAwIH0sCisJW1BNX0xTVTFdID0geyAweDAwMDAwMDAwMDAwMDAwdWxsLCAweDAwMDEwMDAwMDAwMDAwdWxsLCBQTV9MU1UxLCA0MCB9LAorCVtQTV9HUFNdICA9IHsgMHgwMDAwMDAwMDAwMDAwMHVsbCwgMHgwMDAwMDAwMDAwMDAwMHVsbCwgUE1fR1BTLCAwIH0KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRpcmVjdF9tYXJrZWRfZXZlbnRbOF0gPSB7CisJKDE8PDIpIHwgKDE8PDMpLAkvKiBQTUMxOiBQTV9NUktfR1JQX0RJU1AsIFBNX01SS19TVF9DTVBMICovCisJKDE8PDMpIHwgKDE8PDUpLAkvKiBQTUMyOiBQTV9USFJFU0hfVElNRU8sIFBNX01SS19CUlVfRklOICovCisJKDE8PDMpLAkJCS8qIFBNQzM6IFBNX01SS19TVF9DTVBMX0lOVCAqLworCSgxPDw0KSB8ICgxPDw1KSwJLyogUE1DNDogUE1fTVJLX0dSUF9DTVBMLCBQTV9NUktfQ1JVX0ZJTiAqLworCSgxPDw0KSB8ICgxPDw1KSwJLyogUE1DNTogUE1fTVJLX0dSUF9USU1FTyAqLworCSgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSwKKwkJLyogUE1DNjogUE1fTVJLX1NUX0dQUywgUE1fTVJLX0ZYVV9GSU4sIFBNX01SS19HUlBfSVNTVUVEICovCisJKDE8PDQpIHwgKDE8PDUpLAkvKiBQTUM3OiBQTV9NUktfRlBVX0ZJTiwgUE1fTVJLX0lOU1RfRklOICovCisJKDE8PDQpLAkJCS8qIFBNQzg6IFBNX01SS19MU1VfRklOICovCit9OworCisvKgorICogUmV0dXJucyAxIGlmIGV2ZW50IGNvdW50cyB0aGluZ3MgcmVsYXRpbmcgdG8gbWFya2VkIGluc3RydWN0aW9ucworICogYW5kIHRodXMgbmVlZHMgdGhlIE1NQ1JBX1NBTVBMRV9FTkFCTEUgYml0IHNldCwgb3IgMCBpZiBub3QuCisgKi8KK3N0YXRpYyBpbnQgcDRfbWFya2VkX2luc3RyX2V2ZW50KHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBwc2VsLCB1bml0LCBieXRlLCBiaXQ7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJcHNlbCA9IGV2ZW50ICYgUE1fUE1DU0VMX01TSzsKKwlpZiAocG1jKSB7CisJCWlmIChkaXJlY3RfbWFya2VkX2V2ZW50W3BtYyAtIDFdICYgKDEgPDwgcHNlbCkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHBzZWwgPT0gMCkJCS8qIGFkZCBldmVudHMgKi8KKwkJCWJpdCA9IChwbWMgPD0gNCk/IHBtYyAtIDE6IDggLSBwbWM7CisJCWVsc2UgaWYgKHBzZWwgPT0gNikJLyogZGVjb2RlIGV2ZW50cyAqLworCQkJYml0ID0gNDsKKwkJZWxzZQorCQkJcmV0dXJuIDA7CisJfSBlbHNlCisJCWJpdCA9IHBzZWw7CisKKwlieXRlID0gKGV2ZW50ID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJdW5pdCA9IChldmVudCA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCW1hc2sgPSAwOworCXN3aXRjaCAodW5pdCkgeworCWNhc2UgUE1fTFNVMToKKwkJaWYgKGV2ZW50ICYgUE1fTE9XRVJfTVNLUykKKwkJCW1hc2sgPSAxIDw8IDI4OwkJLyogYnl0ZSA3IGJpdCA0ICovCisJCWVsc2UKKwkJCW1hc2sgPSA2IDw8IDI0OwkJLyogYnl0ZSAzIGJpdHMgMSBhbmQgMiAqLworCQlicmVhazsKKwljYXNlIFBNX0xTVTA6CisJCS8qIGJ5dGUgMywgYml0IDM7IGJ5dGUgMiBiaXRzIDAsMiwzLDQsNTsgYnl0ZSAxICovCisJCW1hc2sgPSAweDA4M2RmZjAwOworCX0KKwlyZXR1cm4gKG1hc2sgPj4gKGJ5dGUgKiA4ICsgYml0KSkgJiAxOworfQorCitzdGF0aWMgaW50IHA0X2dldF9jb25zdHJhaW50KHU2NCBldmVudCwgdTY0ICptYXNrcCwgdTY0ICp2YWxwKQoreworCWludCBwbWMsIGJ5dGUsIHVuaXQsIGxvd2VyLCBzaDsKKwl1NjQgbWFzayA9IDAsIHZhbHVlID0gMDsKKwlpbnQgZ3JwID0gLTE7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJaWYgKHBtYykgeworCQlpZiAocG1jID4gOCkKKwkJCXJldHVybiAtMTsKKwkJc2ggPSAocG1jIC0gMSkgKiAyOworCQltYXNrIHw9IDIgPDwgc2g7CisJCXZhbHVlIHw9IDEgPDwgc2g7CisJCWdycCA9ICgocG1jIC0gMSkgPj4gMSkgJiAxOworCX0KKwl1bml0ID0gKGV2ZW50ID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCWlmICh1bml0KSB7CisJCWxvd2VyID0gKGV2ZW50ID4+IFBNX0xPV0VSX1NIKSAmIFBNX0xPV0VSX01TSzsKKworCQkvKgorCQkgKiBCdXMgZXZlbnRzIG9uIGJ5dGVzIDAgYW5kIDIgY2FuIGJlIGNvdW50ZWQKKwkJICogb24gUE1DMS8yLzUvNjsgYnl0ZXMgMSBhbmQgMyBvbiBQTUMzLzQvNy84LgorCQkgKi8KKwkJaWYgKCFwbWMpCisJCQlncnAgPSBieXRlICYgMTsKKworCQlpZiAoIXA0X3VuaXRpbmZvW3VuaXRdLnVuaXQpCisJCQlyZXR1cm4gLTE7CisJCW1hc2sgIHw9IHA0X3VuaXRpbmZvW3VuaXRdLm1hc2s7CisJCXZhbHVlIHw9IHA0X3VuaXRpbmZvW3VuaXRdLnZhbHVlOworCQlzaCA9IHA0X3VuaXRpbmZvW3VuaXRdLmxvd2VyYml0OworCQlpZiAoc2ggPiAxKQorCQkJdmFsdWUgfD0gKHU2NClsb3dlciA8PCBzaDsKKwkJZWxzZSBpZiAobG93ZXIgIT0gc2gpCisJCQlyZXR1cm4gLTE7CisJCXVuaXQgPSBwNF91bml0aW5mb1t1bml0XS51bml0OworCisJCS8qIFNldCBieXRlIGxhbmUgc2VsZWN0IGZpZWxkICovCisJCW1hc2sgIHw9IDB4ZlVMTCA8PCAoMjggLSA0ICogYnl0ZSk7CisJCXZhbHVlIHw9ICh1NjQpdW5pdCA8PCAoMjggLSA0ICogYnl0ZSk7CisJfQorCWlmIChncnAgPT0gMCkgeworCQkvKiBpbmNyZW1lbnQgUE1DMS8yLzUvNiBmaWVsZCAqLworCQltYXNrICB8PSAweDgwMDAwMDAwMDB1bGw7CisJCXZhbHVlIHw9IDB4MTAwMDAwMDAwMHVsbDsKKwl9IGVsc2UgeworCQkvKiBpbmNyZW1lbnQgUE1DMy80LzcvOCBmaWVsZCAqLworCQltYXNrICB8PSAweDgwMDAwMDAwMHVsbDsKKwkJdmFsdWUgfD0gMHgxMDAwMDAwMDB1bGw7CisJfQorCisJLyogTWFya2VkIGluc3RydWN0aW9uIGV2ZW50cyBuZWVkIHNhbXBsZV9lbmFibGUgc2V0ICovCisJaWYgKHA0X21hcmtlZF9pbnN0cl9ldmVudChldmVudCkpIHsKKwkJbWFzayAgfD0gMXVsbCA8PCA1NjsKKwkJdmFsdWUgfD0gMXVsbCA8PCA1NjsKKwl9CisKKwkvKiBQTUNTRUw9NiBkZWNvZGUgZXZlbnRzIG9uIGJ5dGUgMiBuZWVkIHNhbXBsZV9lbmFibGUgY2xlYXIgKi8KKwlpZiAocG1jICYmIChldmVudCAmIFBNX1BNQ1NFTF9NU0spID09IDYgJiYgYnl0ZSA9PSAyKQorCQltYXNrICB8PSAxdWxsIDw8IDU2OworCisJKm1hc2twID0gbWFzazsKKwkqdmFscCA9IHZhbHVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IHBwY19pbnN0X2NtcGxbXSA9IHsKKwkweDEwMDEsIDB4NDAwMSwgMHg2MDAxLCAweDcwMDEsIDB4ODAwMQorfTsKKworc3RhdGljIGludCBwNF9nZXRfYWx0ZXJuYXRpdmVzKHU2NCBldmVudCwgdW5zaWduZWQgaW50IGZsYWdzLCB1NjQgYWx0W10pCit7CisJaW50IGksIGosIG5hOworCisJYWx0WzBdID0gZXZlbnQ7CisJbmEgPSAxOworCisJLyogMiBwb3NzaWJpbGl0aWVzIGZvciBQTV9HUlBfRElTUF9SRUpFQ1QgKi8KKwlpZiAoZXZlbnQgPT0gMHg4MDAzIHx8IGV2ZW50ID09IDB4MDIyNCkgeworCQlhbHRbMV0gPSBldmVudCBeICgweDgwMDMgXiAweDAyMjQpOworCQlyZXR1cm4gMjsKKwl9CisKKwkvKiAyIHBvc3NpYmlsaXRpZXMgZm9yIFBNX1NUX01JU1NfTDEgKi8KKwlpZiAoZXZlbnQgPT0gMHgwYzEzIHx8IGV2ZW50ID09IDB4MGMyMykgeworCQlhbHRbMV0gPSBldmVudCBeICgweDBjMTMgXiAweDBjMjMpOworCQlyZXR1cm4gMjsKKwl9CisKKwkvKiBzZXZlcmFsIHBvc3NpYmlsaXRpZXMgZm9yIFBNX0lOU1RfQ01QTCAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBwY19pbnN0X2NtcGwpOyArK2kpIHsKKwkJaWYgKGV2ZW50ID09IHBwY19pbnN0X2NtcGxbaV0pIHsKKwkJCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKHBwY19pbnN0X2NtcGwpOyArK2opCisJCQkJaWYgKGogIT0gaSkKKwkJCQkJYWx0W25hKytdID0gcHBjX2luc3RfY21wbFtqXTsKKwkJCWJyZWFrOworCQl9CisJfQorCisJcmV0dXJuIG5hOworfQorCitzdGF0aWMgaW50IHA0X2NvbXB1dGVfbW1jcih1NjQgZXZlbnRbXSwgaW50IG5fZXYsCisJCQkgICB1bnNpZ25lZCBpbnQgaHdjW10sIHU2NCBtbWNyW10pCit7CisJdTY0IG1tY3IwID0gMCwgbW1jcjEgPSAwLCBtbWNyYSA9IDA7CisJdW5zaWduZWQgaW50IHBtYywgdW5pdCwgYnl0ZSwgcHNlbCwgbG93ZXI7CisJdW5zaWduZWQgaW50IHR0bSwgZ3JwOworCXVuc2lnbmVkIGludCBwbWNfaW51c2UgPSAwOworCXVuc2lnbmVkIGludCBwbWNfZ3JwX3VzZVsyXTsKKwl1bnNpZ25lZCBjaGFyIGJ1c2J5dGVbNF07CisJdW5zaWduZWQgY2hhciB1bml0dXNlWzE2XTsKKwl1bnNpZ25lZCBpbnQgdW5pdGxvd2VyID0gMDsKKwlpbnQgaTsKKworCWlmIChuX2V2ID4gOCkKKwkJcmV0dXJuIC0xOworCisJLyogRmlyc3QgcGFzcyB0byBjb3VudCByZXNvdXJjZSB1c2UgKi8KKwlwbWNfZ3JwX3VzZVswXSA9IHBtY19ncnBfdXNlWzFdID0gMDsKKwltZW1zZXQoYnVzYnl0ZSwgMCwgc2l6ZW9mKGJ1c2J5dGUpKTsKKwltZW1zZXQodW5pdHVzZSwgMCwgc2l6ZW9mKHVuaXR1c2UpKTsKKwlmb3IgKGkgPSAwOyBpIDwgbl9ldjsgKytpKSB7CisJCXBtYyA9IChldmVudFtpXSA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwkJaWYgKHBtYykgeworCQkJaWYgKHBtY19pbnVzZSAmICgxIDw8IChwbWMgLSAxKSkpCisJCQkJcmV0dXJuIC0xOworCQkJcG1jX2ludXNlIHw9IDEgPDwgKHBtYyAtIDEpOworCQkJLyogY291bnQgMS8yLzUvNiB2cyAzLzQvNy84IHVzZSAqLworCQkJKytwbWNfZ3JwX3VzZVsoKHBtYyAtIDEpID4+IDEpICYgMV07CisJCX0KKwkJdW5pdCA9IChldmVudFtpXSA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCQlieXRlID0gKGV2ZW50W2ldID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJCWxvd2VyID0gKGV2ZW50W2ldID4+IFBNX0xPV0VSX1NIKSAmIFBNX0xPV0VSX01TSzsKKwkJaWYgKHVuaXQpIHsKKwkJCWlmICghcG1jKQorCQkJCSsrcG1jX2dycF91c2VbYnl0ZSAmIDFdOworCQkJaWYgKHVuaXQgPT0gNiB8fCB1bml0ID09IDgpCisJCQkJLyogbWFwIGFsdCBJU1UxL0lGVSBjb2RlczogNi0+MiwgOC0+MyAqLworCQkJCXVuaXQgPSAodW5pdCA+PiAxKSAtIDE7CisJCQlpZiAoYnVzYnl0ZVtieXRlXSAmJiBidXNieXRlW2J5dGVdICE9IHVuaXQpCisJCQkJcmV0dXJuIC0xOworCQkJYnVzYnl0ZVtieXRlXSA9IHVuaXQ7CisJCQlsb3dlciA8PD0gdW5pdDsKKwkJCWlmICh1bml0dXNlW3VuaXRdICYmIGxvd2VyICE9ICh1bml0bG93ZXIgJiBsb3dlcikpCisJCQkJcmV0dXJuIC0xOworCQkJdW5pdHVzZVt1bml0XSA9IDE7CisJCQl1bml0bG93ZXIgfD0gbG93ZXI7CisJCX0KKwl9CisJaWYgKHBtY19ncnBfdXNlWzBdID4gNCB8fCBwbWNfZ3JwX3VzZVsxXSA+IDQpCisJCXJldHVybiAtMTsKKworCS8qCisJICogQXNzaWduIHJlc291cmNlcyBhbmQgc2V0IG11bHRpcGxleGVyIHNlbGVjdHMuCisJICoKKwkgKiBVbml0cyAxLDIsMyBhcmUgb24gVFRNMCwgNCw2LDcgb24gVFRNMSwgOCwxMCBvbiBUVE0yLgorCSAqIEVhY2ggVFRNeCBjYW4gb25seSBzZWxlY3Qgb25lIHVuaXQsIGJ1dCBzaW5jZQorCSAqIHVuaXRzIDIgYW5kIDYgYXJlIGJvdGggSVNVMSwgYW5kIDMgYW5kIDggYXJlIGJvdGggSUZVLAorCSAqIHdlIGhhdmUgc29tZSBjaG9pY2VzLgorCSAqLworCWlmICh1bml0dXNlWzJdICYgKHVuaXR1c2VbMV0gfCAodW5pdHVzZVszXSAmIHVuaXR1c2VbOV0pKSkgeworCQl1bml0dXNlWzZdID0gMTsJCS8qIE1vdmUgMiB0byA2ICovCisJCXVuaXR1c2VbMl0gPSAwOworCX0KKwlpZiAodW5pdHVzZVszXSAmICh1bml0dXNlWzFdIHwgdW5pdHVzZVsyXSkpIHsKKwkJdW5pdHVzZVs4XSA9IDE7CQkvKiBNb3ZlIDMgdG8gOCAqLworCQl1bml0dXNlWzNdID0gMDsKKwkJdW5pdGxvd2VyID0gKHVuaXRsb3dlciAmIH44KSB8ICgodW5pdGxvd2VyICYgOCkgPDwgNSk7CisJfQorCS8qIENoZWNrIG9ubHkgb25lIHVuaXQgcGVyIFRUTXggKi8KKwlpZiAodW5pdHVzZVsxXSArIHVuaXR1c2VbMl0gKyB1bml0dXNlWzNdID4gMSB8fAorCSAgICB1bml0dXNlWzRdICsgdW5pdHVzZVs2XSArIHVuaXR1c2VbN10gPiAxIHx8CisJICAgIHVuaXR1c2VbOF0gKyB1bml0dXNlWzldID4gMSB8fAorCSAgICAodW5pdHVzZVs1XSB8IHVuaXR1c2VbMTBdIHwgdW5pdHVzZVsxMV0gfAorCSAgICAgdW5pdHVzZVsxM10gfCB1bml0dXNlWzE0XSkpCisJCXJldHVybiAtMTsKKworCS8qIFNldCBUVE14U0VMIGZpZWxkcy4gIE5vdGUsIHVuaXRzIDEtMyA9PiBUVE0wU0VMIGNvZGVzIDAtMiAqLworCW1tY3IxIHw9ICh1NjQpKHVuaXR1c2VbM10gKiAyICsgdW5pdHVzZVsyXSkgPDwgTU1DUjFfVFRNMFNFTF9TSDsKKwltbWNyMSB8PSAodTY0KSh1bml0dXNlWzddICogMyArIHVuaXR1c2VbNl0gKiAyKSA8PCBNTUNSMV9UVE0xU0VMX1NIOworCW1tY3IxIHw9ICh1NjQpdW5pdHVzZVs5XSA8PCBNTUNSMV9UVE0yU0VMX1NIOworCisJLyogU2V0IFRUQ3hTRUwgZmllbGRzLiAqLworCWlmICh1bml0bG93ZXIgJiAweGUpCisJCW1tY3IxIHw9IDF1bGwgPDwgTU1DUjFfVFRDMFNFTF9TSDsKKwlpZiAodW5pdGxvd2VyICYgMHhmMCkKKwkJbW1jcjEgfD0gMXVsbCA8PCBNTUNSMV9UVEMxU0VMX1NIOworCWlmICh1bml0bG93ZXIgJiAweGYwMCkKKwkJbW1jcjEgfD0gMXVsbCA8PCBNTUNSMV9UVEMyU0VMX1NIOworCWlmICh1bml0bG93ZXIgJiAweDcwMDApCisJCW1tY3IxIHw9IDF1bGwgPDwgTU1DUjFfVFRDM1NFTF9TSDsKKworCS8qIFNldCBieXRlIGxhbmUgc2VsZWN0IGZpZWxkcy4gKi8KKwlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgNDsgKytieXRlKSB7CisJCXVuaXQgPSBidXNieXRlW2J5dGVdOworCQlpZiAoIXVuaXQpCisJCQljb250aW51ZTsKKwkJaWYgKHVuaXQgPT0gMHhmKSB7CisJCQkvKiBzcGVjaWFsIGNhc2UgZm9yIEdQUyAqLworCQkJbW1jcjEgfD0gMXVsbCA8PCAoTU1DUjFfREVCVUcwU0VMX1NIIC0gYnl0ZSk7CisJCX0gZWxzZSB7CisJCQlpZiAoIXVuaXR1c2VbdW5pdF0pCisJCQkJdHRtID0gdW5pdCAtIDE7CQkvKiAyLT4xLCAzLT4yICovCisJCQllbHNlCisJCQkJdHRtID0gdW5pdCA+PiAyOworCQkJbW1jcjEgfD0gKHU2NCl0dG0gPDwgKE1NQ1IxX1REX0NQX0RCRzBTRUxfU0ggLSAyKmJ5dGUpOworCQl9CisJfQorCisJLyogU2Vjb25kIHBhc3M6IGFzc2lnbiBQTUNzLCBzZXQgUE1DeFNFTCBhbmQgUE1DeF9BRERFUl9TRUwgZmllbGRzICovCisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCXVuaXQgPSAoZXZlbnRbaV0gPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJYnl0ZSA9IChldmVudFtpXSA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQlwc2VsID0gZXZlbnRbaV0gJiBQTV9QTUNTRUxfTVNLOworCQlpZiAoIXBtYykgeworCQkJLyogQnVzIGV2ZW50IG9yIDAweHh4IGRpcmVjdCBldmVudCAob2ZmIG9yIGN5Y2xlcykgKi8KKwkJCWlmICh1bml0KQorCQkJCXBzZWwgfD0gMHgxMCB8ICgoYnl0ZSAmIDIpIDw8IDIpOworCQkJZm9yIChwbWMgPSAwOyBwbWMgPCA4OyArK3BtYykgeworCQkJCWlmIChwbWNfaW51c2UgJiAoMSA8PCBwbWMpKQorCQkJCQljb250aW51ZTsKKwkJCQlncnAgPSAocG1jID4+IDEpICYgMTsKKwkJCQlpZiAodW5pdCkgeworCQkJCQlpZiAoZ3JwID09IChieXRlICYgMSkpCisJCQkJCQlicmVhazsKKwkJCQl9IGVsc2UgaWYgKHBtY19ncnBfdXNlW2dycF0gPCA0KSB7CisJCQkJCSsrcG1jX2dycF91c2VbZ3JwXTsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJfQorCQkJcG1jX2ludXNlIHw9IDEgPDwgcG1jOworCQl9IGVsc2UgeworCQkJLyogRGlyZWN0IGV2ZW50ICovCisJCQktLXBtYzsKKwkJCWlmIChwc2VsID09IDAgJiYgKGJ5dGUgJiAyKSkKKwkJCQkvKiBhZGQgZXZlbnRzIG9uIGhpZ2hlci1udW1iZXJlZCBidXMgKi8KKwkJCQltbWNyMSB8PSAxdWxsIDw8IG1tY3IxX2FkZGVyX2JpdHNbcG1jXTsKKwkJCWVsc2UgaWYgKHBzZWwgPT0gNiAmJiBieXRlID09IDMpCisJCQkJLyogc2VlbSB0byBuZWVkIHRvIHNldCBzYW1wbGVfZW5hYmxlIGhlcmUgKi8KKwkJCQltbWNyYSB8PSBNTUNSQV9TQU1QTEVfRU5BQkxFOworCQkJcHNlbCB8PSA4OworCQl9CisJCWlmIChwbWMgPD0gMSkKKwkJCW1tY3IwIHw9IHBzZWwgPDwgKE1NQ1IwX1BNQzFTRUxfU0ggLSA3ICogcG1jKTsKKwkJZWxzZQorCQkJbW1jcjEgfD0gcHNlbCA8PCAoTU1DUjFfUE1DM1NFTF9TSCAtIDUgKiAocG1jIC0gMikpOworCQlpZiAocG1jID09IDcpCS8qIFBNQzggKi8KKwkJCW1tY3JhIHw9IChwc2VsICYgMSkgPDwgTU1DUkFfUE1DOFNFTDBfU0g7CisJCWh3Y1tpXSA9IHBtYzsKKwkJaWYgKHA0X21hcmtlZF9pbnN0cl9ldmVudChldmVudFtpXSkpCisJCQltbWNyYSB8PSBNTUNSQV9TQU1QTEVfRU5BQkxFOworCX0KKworCWlmIChwbWNfaW51c2UgJiAxKQorCQltbWNyMCB8PSBNTUNSMF9QTUMxQ0U7CisJaWYgKHBtY19pbnVzZSAmIDB4ZmUpCisJCW1tY3IwIHw9IE1NQ1IwX1BNQ2pDRTsKKworCW1tY3JhIHw9IDB4MjAwMDsJLyogbWFyayBvbmx5IG9uZSBJT1AgcGVyIFBQQyBpbnN0cnVjdGlvbiAqLworCisJLyogUmV0dXJuIE1NQ1J4IHZhbHVlcyAqLworCW1tY3JbMF0gPSBtbWNyMDsKKwltbWNyWzFdID0gbW1jcjE7CisJbW1jclsyXSA9IG1tY3JhOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwNF9kaXNhYmxlX3BtYyh1bnNpZ25lZCBpbnQgcG1jLCB1NjQgbW1jcltdKQoreworCS8qCisJICogU2V0dGluZyB0aGUgUE1DeFNFTCBmaWVsZCB0byAwIGRpc2FibGVzIFBNQyB4LgorCSAqIChOb3RlIHRoYXQgcG1jIGlzIDAtYmFzZWQgaGVyZSwgbm90IDEtYmFzZWQuKQorCSAqLworCWlmIChwbWMgPD0gMSkgeworCQltbWNyWzBdICY9IH4oMHgxZlVMIDw8IChNTUNSMF9QTUMxU0VMX1NIIC0gNyAqIHBtYykpOworCX0gZWxzZSB7CisJCW1tY3JbMV0gJj0gfigweDFmVUwgPDwgKE1NQ1IxX1BNQzNTRUxfU0ggLSA1ICogKHBtYyAtIDIpKSk7CisJCWlmIChwbWMgPT0gNykKKwkJCW1tY3JbMl0gJj0gfigxVUwgPDwgTU1DUkFfUE1DOFNFTDBfU0gpOworCX0KK30KKworc3RhdGljIGludCBwNF9nZW5lcmljX2V2ZW50c1tdID0geworCVtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCQk9IDcsCisJW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXQkJPSAweDEwMDEsCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JPSAweDhjMTAsIC8qIFBNX0xEX1JFRl9MMSAqLworCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01JU1NFU10JCT0gMHgzYzEwLCAvKiBQTV9MRF9NSVNTX0wxICovCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10JPSAweDMzMCwgIC8qIFBNX0JSX0lTU1VFRCAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCQk9IDB4MzMxLCAgLyogUE1fQlJfTVBSRURfQ1IgKi8KK307CisKKyNkZWZpbmUgQyh4KQlQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjeAorCisvKgorICogVGFibGUgb2YgZ2VuZXJhbGl6ZWQgY2FjaGUtcmVsYXRlZCBldmVudHMuCisgKiAwIG1lYW5zIG5vdCBzdXBwb3J0ZWQsIC0xIG1lYW5zIG5vbnNlbnNpY2FsLCBvdGhlciB2YWx1ZXMKKyAqIGFyZSBldmVudCBjb2Rlcy4KKyAqLworc3RhdGljIGludCBwb3dlcjRfY2FjaGVfZXZlbnRzW0MoTUFYKV1bQyhPUF9NQVgpXVtDKFJFU1VMVF9NQVgpXSA9IHsKKwlbQyhMMUQpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHg4YzEwLAkJMHgzYzEwCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTB4N2MxMCwJCTB4YzEzCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4YzM1LAkJMAl9LAorCX0sCisJW0MoTDFJKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTAsCQkwCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMCwJCTAJfSwKKwl9LAorCVtDKExMKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTAsCQkwCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTAsCQkwCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4YzM0LAkJMAl9LAorCX0sCisJW0MoRFRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHg5MDQJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCisJfSwKKwlbQyhJVExCKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTAsCQkweDkwMAl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKKwl9LAorCVtDKEJQVSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDMzMCwJCTB4MzMxCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAorCX0sCit9OworCitzdHJ1Y3QgcG93ZXJfcG11IHBvd2VyNF9wbXUgPSB7CisJLm5fY291bnRlciA9IDgsCisJLm1heF9hbHRlcm5hdGl2ZXMgPSA1LAorCS5hZGRfZmllbGRzID0gMHgwMDAwMDAxMTAwMDA1NTU1dWxsLAorCS50ZXN0X2FkZGVyID0gMHgwMDExMDgzMzAwMDAwMDAwdWxsLAorCS5jb21wdXRlX21tY3IgPSBwNF9jb21wdXRlX21tY3IsCisJLmdldF9jb25zdHJhaW50ID0gcDRfZ2V0X2NvbnN0cmFpbnQsCisJLmdldF9hbHRlcm5hdGl2ZXMgPSBwNF9nZXRfYWx0ZXJuYXRpdmVzLAorCS5kaXNhYmxlX3BtYyA9IHA0X2Rpc2FibGVfcG1jLAorCS5uX2dlbmVyaWMgPSBBUlJBWV9TSVpFKHA0X2dlbmVyaWNfZXZlbnRzKSwKKwkuZ2VuZXJpY19ldmVudHMgPSBwNF9nZW5lcmljX2V2ZW50cywKKwkuY2FjaGVfZXZlbnRzID0gJnBvd2VyNF9jYWNoZV9ldmVudHMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjUrLXBtdS5jIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjUrLXBtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZTVkMmQKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNSstcG11LmMKQEAgLTAsMCArMSw2NzEgQEAKKy8qCisgKiBQZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQgZm9yIFBPV0VSNSsvKysgKG5vdCBQT1dFUjUpIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IDIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorCisvKgorICogQml0cyBpbiBldmVudCBjb2RlIGZvciBQT1dFUjUrIChQT1dFUjUgR1MpIGFuZCBQT1dFUjUrKyAoUE9XRVI1IEdTIEREMykKKyAqLworI2RlZmluZSBQTV9QTUNfU0gJMjAJLyogUE1DIG51bWJlciAoMS1iYXNlZCkgZm9yIGRpcmVjdCBldmVudHMgKi8KKyNkZWZpbmUgUE1fUE1DX01TSwkweGYKKyNkZWZpbmUgUE1fUE1DX01TS1MJKFBNX1BNQ19NU0sgPDwgUE1fUE1DX1NIKQorI2RlZmluZSBQTV9VTklUX1NICTE2CS8qIFRUTU1VWCBudW1iZXIgYW5kIHNldHRpbmcgLSB1bml0IHNlbGVjdCAqLworI2RlZmluZSBQTV9VTklUX01TSwkweGYKKyNkZWZpbmUgUE1fQllURV9TSAkxMgkvKiBCeXRlIG51bWJlciBvZiBldmVudCBidXMgdG8gdXNlICovCisjZGVmaW5lIFBNX0JZVEVfTVNLCTcKKyNkZWZpbmUgUE1fR1JTX1NICTgJLyogU3RvcmFnZSBzdWJzeXN0ZW0gbXV4IHNlbGVjdCAqLworI2RlZmluZSBQTV9HUlNfTVNLCTcKKyNkZWZpbmUgUE1fQlVTRVZFTlRfTVNLCTB4ODAJLyogU2V0IGlmIGV2ZW50IHVzZXMgZXZlbnQgYnVzICovCisjZGVmaW5lIFBNX1BNQ1NFTF9NU0sJMHg3ZgorCisvKiBWYWx1ZXMgaW4gUE1fVU5JVCBmaWVsZCAqLworI2RlZmluZSBQTV9GUFUJCTAKKyNkZWZpbmUgUE1fSVNVMAkJMQorI2RlZmluZSBQTV9JRlUJCTIKKyNkZWZpbmUgUE1fSVNVMQkJMworI2RlZmluZSBQTV9JRFUJCTQKKyNkZWZpbmUgUE1fSVNVMF9BTFQJNgorI2RlZmluZSBQTV9HUlMJCTcKKyNkZWZpbmUgUE1fTFNVMAkJOAorI2RlZmluZSBQTV9MU1UxCQkweGMKKyNkZWZpbmUgUE1fTEFTVFVOSVQJMHhjCisKKy8qCisgKiBCaXRzIGluIE1NQ1IxIGZvciBQT1dFUjUrCisgKi8KKyNkZWZpbmUgTU1DUjFfVFRNMFNFTF9TSAk2MgorI2RlZmluZSBNTUNSMV9UVE0xU0VMX1NICTYwCisjZGVmaW5lIE1NQ1IxX1RUTTJTRUxfU0gJNTgKKyNkZWZpbmUgTU1DUjFfVFRNM1NFTF9TSAk1NgorI2RlZmluZSBNTUNSMV9UVE1TRUxfTVNLCTMKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHMFNFTF9TSAk1NAorI2RlZmluZSBNTUNSMV9URF9DUF9EQkcxU0VMX1NICTUyCisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzJTRUxfU0gJNTAKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHM1NFTF9TSAk0OAorI2RlZmluZSBNTUNSMV9HUlNfTDJTRUxfU0gJNDYKKyNkZWZpbmUgTU1DUjFfR1JTX0wyU0VMX01TSwkzCisjZGVmaW5lIE1NQ1IxX0dSU19MM1NFTF9TSAk0NAorI2RlZmluZSBNTUNSMV9HUlNfTDNTRUxfTVNLCTMKKyNkZWZpbmUgTU1DUjFfR1JTX01DU0VMX1NICTQxCisjZGVmaW5lIE1NQ1IxX0dSU19NQ1NFTF9NU0sJNworI2RlZmluZSBNTUNSMV9HUlNfRkFCU0VMX1NICTM5CisjZGVmaW5lIE1NQ1IxX0dSU19GQUJTRUxfTVNLCTMKKyNkZWZpbmUgTU1DUjFfUE1DMV9BRERFUl9TRUxfU0gJMzUKKyNkZWZpbmUgTU1DUjFfUE1DMl9BRERFUl9TRUxfU0gJMzQKKyNkZWZpbmUgTU1DUjFfUE1DM19BRERFUl9TRUxfU0gJMzMKKyNkZWZpbmUgTU1DUjFfUE1DNF9BRERFUl9TRUxfU0gJMzIKKyNkZWZpbmUgTU1DUjFfUE1DMVNFTF9TSAkyNQorI2RlZmluZSBNTUNSMV9QTUMyU0VMX1NICTE3CisjZGVmaW5lIE1NQ1IxX1BNQzNTRUxfU0gJOQorI2RlZmluZSBNTUNSMV9QTUM0U0VMX1NICTEKKyNkZWZpbmUgTU1DUjFfUE1DU0VMX1NIKG4pCShNTUNSMV9QTUMxU0VMX1NIIC0gKG4pICogOCkKKyNkZWZpbmUgTU1DUjFfUE1DU0VMX01TSwkweDdmCisKKy8qCisgKiBCaXRzIGluIE1NQ1JBCisgKi8KKworLyoKKyAqIExheW91dCBvZiBjb25zdHJhaW50IGJpdHM6CisgKiA2NjY2NTU1NTU1NTU1NTQ0NDQ0NDQ0NDQzMzMzMzMzMzMzMjIyMjIyMjIyMjExMTExMTExMTEwMDAwMDAwMDAwCisgKiAzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwCisgKiAgICAgICAgICAgICBbICA+PD48PjwgPjw+IDw+PD5bICA+ICA8ICA+PCAgPjwgID48ICA+PD48Pjw+PD48Pjw+CisgKiAgICAgICAgICAgICBOQyAgRzBHMUcyIEczIFQwVDEgVUMgICAgQjAgIEIxICBCMiAgQjMgUDZQNVA0UDNQMlAxCisgKgorICogTkMgLSBudW1iZXIgb2YgY291bnRlcnMKKyAqICAgICA1MTogTkMgZXJyb3IgMHgwMDA4XzAwMDBfMDAwMF8wMDAwCisgKiAgICAgNDgtNTA6IG51bWJlciBvZiBldmVudHMgbmVlZGluZyBQTUMxLTQgMHgwMDA3XzAwMDBfMDAwMF8wMDAwCisgKgorICogRzAuLkczIC0gR1JTIG11eCBjb25zdHJhaW50cworICogICAgIDQ2LTQ3OiBHUlNfTDJTRUwgdmFsdWUKKyAqICAgICA0NC00NTogR1JTX0wzU0VMIHZhbHVlCisgKiAgICAgNDEtNDQ6IEdSU19NQ1NFTCB2YWx1ZQorICogICAgIDM5LTQwOiBHUlNfRkFCU0VMIHZhbHVlCisgKglOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdXAgd2l0aCB0aGVpciBiaXQgcG9zaXRpb25zIGluIE1NQ1IxCisgKgorICogVDAgLSBUVE0wIGNvbnN0cmFpbnQKKyAqICAgICAzNi0zNzogVFRNMFNFTCB2YWx1ZSAoMD1GUFUsIDI9SUZVLCAzPUlTVTEpIDB4MzBfMDAwMF8wMDAwCisgKgorICogVDEgLSBUVE0xIGNvbnN0cmFpbnQKKyAqICAgICAzNC0zNTogVFRNMVNFTCB2YWx1ZSAoMD1JRFUsIDM9R1JTKSAweDBjXzAwMDBfMDAwMAorICoKKyAqIFVDIC0gdW5pdCBjb25zdHJhaW50OiBjYW4ndCBoYXZlIGFsbCB0aHJlZSBvZiBGUFV8SUZVfElTVTEsIElTVTAsIElEVXxHUlMKKyAqICAgICAzMzogVUMzIGVycm9yIDB4MDJfMDAwMF8wMDAwCisgKiAgICAgMzI6IEZQVXxJRlV8SVNVMSBldmVudHMgbmVlZGVkIDB4MDFfMDAwMF8wMDAwCisgKiAgICAgMzE6IElTVTAgZXZlbnRzIG5lZWRlZCAweDAxXzgwMDBfMDAwMAorICogICAgIDMwOiBJRFV8R1JTIGV2ZW50cyBuZWVkZWQgMHgwMF80MDAwXzAwMDAKKyAqCisgKiBCMAorICogICAgIDI0LTI3OiBCeXRlIDAgZXZlbnQgc291cmNlIDB4MGYwMF8wMDAwCisgKgkgICAgICBFbmNvZGluZyBhcyBmb3IgdGhlIGV2ZW50IGNvZGUKKyAqCisgKiBCMSwgQjIsIEIzCisgKiAgICAgMjAtMjMsIDE2LTE5LCAxMi0xNTogQnl0ZSAxLCAyLCAzIGV2ZW50IHNvdXJjZXMKKyAqCisgKiBQNgorICogICAgIDExOiBQNiBlcnJvciAweDgwMAorICogICAgIDEwLTExOiBDb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUM2CisgKgorICogUDEuLlA1CisgKiAgICAgMC05OiBDb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUMxLi5QTUM1CisgKi8KKworc3RhdGljIGNvbnN0IGludCBncnNlbF9zaGlmdFs4XSA9IHsKKwlNTUNSMV9HUlNfTDJTRUxfU0gsIE1NQ1IxX0dSU19MMlNFTF9TSCwgTU1DUjFfR1JTX0wyU0VMX1NILAorCU1NQ1IxX0dSU19MM1NFTF9TSCwgTU1DUjFfR1JTX0wzU0VMX1NILCBNTUNSMV9HUlNfTDNTRUxfU0gsCisJTU1DUjFfR1JTX01DU0VMX1NILCBNTUNSMV9HUlNfRkFCU0VMX1NICit9OworCisvKiBNYXNrcyBhbmQgdmFsdWVzIGZvciB1c2luZyBldmVudHMgZnJvbSB0aGUgdmFyaW91cyB1bml0cyAqLworc3RhdGljIHU2NCB1bml0X2NvbnNbUE1fTEFTVFVOSVQrMV1bMl0gPSB7CisJW1BNX0ZQVV0gPSAgIHsgMHgzMjAwMDAwMDAwdWxsLCAweDAxMDAwMDAwMDB1bGwgfSwKKwlbUE1fSVNVMF0gPSAgeyAweDAyMDAwMDAwMDB1bGwsIDB4MDA4MDAwMDAwMHVsbCB9LAorCVtQTV9JU1UxXSA9ICB7IDB4MzIwMDAwMDAwMHVsbCwgMHgzMTAwMDAwMDAwdWxsIH0sCisJW1BNX0lGVV0gPSAgIHsgMHgzMjAwMDAwMDAwdWxsLCAweDIxMDAwMDAwMDB1bGwgfSwKKwlbUE1fSURVXSA9ICAgeyAweDBlMDAwMDAwMDB1bGwsIDB4MDA0MDAwMDAwMHVsbCB9LAorCVtQTV9HUlNdID0gICB7IDB4MGUwMDAwMDAwMHVsbCwgMHgwYzQwMDAwMDAwdWxsIH0sCit9OworCitzdGF0aWMgaW50IHBvd2VyNXBfZ2V0X2NvbnN0cmFpbnQodTY0IGV2ZW50LCB1NjQgKm1hc2twLCB1NjQgKnZhbHApCit7CisJaW50IHBtYywgYnl0ZSwgdW5pdCwgc2g7CisJaW50IGJpdCwgZm1hc2s7CisJdTY0IG1hc2sgPSAwLCB2YWx1ZSA9IDA7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJaWYgKHBtYykgeworCQlpZiAocG1jID4gNikKKwkJCXJldHVybiAtMTsKKwkJc2ggPSAocG1jIC0gMSkgKiAyOworCQltYXNrIHw9IDIgPDwgc2g7CisJCXZhbHVlIHw9IDEgPDwgc2g7CisJCWlmIChwbWMgPj0gNSAmJiAhKGV2ZW50ID09IDB4NTAwMDA5IHx8IGV2ZW50ID09IDB4NjAwMDA1KSkKKwkJCXJldHVybiAtMTsKKwl9CisJaWYgKGV2ZW50ICYgUE1fQlVTRVZFTlRfTVNLKSB7CisJCXVuaXQgPSAoZXZlbnQgPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJaWYgKHVuaXQgPiBQTV9MQVNUVU5JVCkKKwkJCXJldHVybiAtMTsKKwkJaWYgKHVuaXQgPT0gUE1fSVNVMF9BTFQpCisJCQl1bml0ID0gUE1fSVNVMDsKKwkJbWFzayB8PSB1bml0X2NvbnNbdW5pdF1bMF07CisJCXZhbHVlIHw9IHVuaXRfY29uc1t1bml0XVsxXTsKKwkJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQlpZiAoYnl0ZSA+PSA0KSB7CisJCQlpZiAodW5pdCAhPSBQTV9MU1UxKQorCQkJCXJldHVybiAtMTsKKwkJCS8qIE1hcCBMU1UxIGxvdyB3b3JkIChieXRlcyA0LTcpIHRvIHVuaXQgTFNVMSsxICovCisJCQkrK3VuaXQ7CisJCQlieXRlICY9IDM7CisJCX0KKwkJaWYgKHVuaXQgPT0gUE1fR1JTKSB7CisJCQliaXQgPSBldmVudCAmIDc7CisJCQlmbWFzayA9IChiaXQgPT0gNik/IDc6IDM7CisJCQlzaCA9IGdyc2VsX3NoaWZ0W2JpdF07CisJCQltYXNrIHw9ICh1NjQpZm1hc2sgPDwgc2g7CisJCQl2YWx1ZSB8PSAodTY0KSgoZXZlbnQgPj4gUE1fR1JTX1NIKSAmIGZtYXNrKSA8PCBzaDsKKwkJfQorCQkvKiBTZXQgYnl0ZSBsYW5lIHNlbGVjdCBmaWVsZCAqLworCQltYXNrICB8PSAweGZVTEwgPDwgKDI0IC0gNCAqIGJ5dGUpOworCQl2YWx1ZSB8PSAodTY0KXVuaXQgPDwgKDI0IC0gNCAqIGJ5dGUpOworCX0KKwlpZiAocG1jIDwgNSkgeworCQkvKiBuZWVkIGEgY291bnRlciBmcm9tIFBNQzEtNCBzZXQgKi8KKwkJbWFzayAgfD0gMHg4MDAwMDAwMDAwMDAwdWxsOworCQl2YWx1ZSB8PSAweDEwMDAwMDAwMDAwMDB1bGw7CisJfQorCSptYXNrcCA9IG1hc2s7CisJKnZhbHAgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3dlcjVwX2xpbWl0ZWRfcG1jX2V2ZW50KHU2NCBldmVudCkKK3sKKwlpbnQgcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCisJcmV0dXJuIHBtYyA9PSA1IHx8IHBtYyA9PSA2OworfQorCisjZGVmaW5lIE1BWF9BTFQJMwkvKiBhdCBtb3N0IDMgYWx0ZXJuYXRpdmVzIGZvciBhbnkgZXZlbnQgKi8KKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBldmVudF9hbHRlcm5hdGl2ZXNbXVtNQVhfQUxUXSA9IHsKKwl7IDB4MTAwYzAsICAweDQwMDAxZiB9LAkJCS8qIFBNX0dDVF9GVUxMX0NZQyAqLworCXsgMHgxMjBlNCwgIDB4NDAwMDAyIH0sCQkJLyogUE1fR1JQX0RJU1BfUkVKRUNUICovCisJeyAweDIzMGUyLCAgMHgzMjMwODcgfSwJCQkvKiBQTV9CUl9QUkVEX0NSICovCisJeyAweDIzMGUzLCAgMHgyMjMwODcsIDB4MzIzMGEwIH0sCS8qIFBNX0JSX1BSRURfVEEgKi8KKwl7IDB4NDEwYzcsICAweDQ0MTA4NCB9LAkJCS8qIFBNX1RIUkRfTDJNSVNTX0JPVEhfQ1lDICovCisJeyAweDgwMGM0LCAgMHhjMjBlMCB9LAkJCS8qIFBNX0RUTEJfTUlTUyAqLworCXsgMHhjNTBjNiwgIDB4YzYwZTAgfSwJCQkvKiBQTV9NUktfRFRMQl9NSVNTICovCisJeyAweDEwMDAwNSwgMHg2MDAwMDUgfSwJCQkvKiBQTV9SVU5fQ1lDICovCisJeyAweDEwMDAwOSwgMHgyMDAwMDkgfSwJCQkvKiBQTV9JTlNUX0NNUEwgKi8KKwl7IDB4MjAwMDE1LCAweDMwMDAxNSB9LAkJCS8qIFBNX0xTVV9MTVFfU1JRX0VNUFRZX0NZQyAqLworCXsgMHgzMDAwMDksIDB4NDAwMDA5IH0sCQkJLyogUE1fSU5TVF9ESVNQICovCit9OworCisvKgorICogU2NhbiB0aGUgYWx0ZXJuYXRpdmVzIHRhYmxlIGZvciBhIG1hdGNoIGFuZCByZXR1cm4gdGhlCisgKiBpbmRleCBpbnRvIHRoZSBhbHRlcm5hdGl2ZXMgdGFibGUgaWYgZm91bmQsIGVsc2UgLTEuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9hbHRlcm5hdGl2ZSh1bnNpZ25lZCBpbnQgZXZlbnQpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldmVudF9hbHRlcm5hdGl2ZXMpOyArK2kpIHsKKwkJaWYgKGV2ZW50IDwgZXZlbnRfYWx0ZXJuYXRpdmVzW2ldWzBdKQorCQkJYnJlYWs7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxUICYmIGV2ZW50X2FsdGVybmF0aXZlc1tpXVtqXTsgKytqKQorCQkJaWYgKGV2ZW50ID09IGV2ZW50X2FsdGVybmF0aXZlc1tpXVtqXSkKKwkJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBieXRlZGVjb2RlX2FsdGVybmF0aXZlc1s0XVs0XSA9IHsKKwkvKiBQTUMgMSAqLwl7IDB4MjEsIDB4MjMsIDB4MjUsIDB4MjcgfSwKKwkvKiBQTUMgMiAqLwl7IDB4MDcsIDB4MTcsIDB4MGUsIDB4MWUgfSwKKwkvKiBQTUMgMyAqLwl7IDB4MjAsIDB4MjIsIDB4MjQsIDB4MjYgfSwKKwkvKiBQTUMgNCAqLwl7IDB4MDcsIDB4MTcsIDB4MGUsIDB4MWUgfQorfTsKKworLyoKKyAqIFNvbWUgZGlyZWN0IGV2ZW50cyBmb3IgZGVjb2RlcyBvZiBldmVudCBidXMgYnl0ZSAzIGhhdmUgYWx0ZXJuYXRpdmUKKyAqIFBNQ1NFTCB2YWx1ZXMgb24gb3RoZXIgY291bnRlcnMuICBUaGlzIHJldHVybnMgdGhlIGFsdGVybmF0aXZlCisgKiBldmVudCBjb2RlIGZvciB0aG9zZSB0aGF0IGRvLCBvciAtMSBvdGhlcndpc2UuICBUaGlzIGFsc28gaGFuZGxlcworICogYWx0ZXJuYXRpdmUgUENNU0VMIHZhbHVlcyBmb3IgYWRkIGV2ZW50cy4KKyAqLworc3RhdGljIHM2NCBmaW5kX2FsdGVybmF0aXZlX2JkZWNvZGUodTY0IGV2ZW50KQoreworCWludCBwbWMsIGFsdHBtYywgcHAsIGo7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJaWYgKHBtYyA9PSAwIHx8IHBtYyA+IDQpCisJCXJldHVybiAtMTsKKwlhbHRwbWMgPSA1IC0gcG1jOwkvKiAxIDwtPiA0LCAyIDwtPiAzICovCisJcHAgPSBldmVudCAmIFBNX1BNQ1NFTF9NU0s7CisJZm9yIChqID0gMDsgaiA8IDQ7ICsraikgeworCQlpZiAoYnl0ZWRlY29kZV9hbHRlcm5hdGl2ZXNbcG1jIC0gMV1bal0gPT0gcHApIHsKKwkJCXJldHVybiAoZXZlbnQgJiB+KFBNX1BNQ19NU0tTIHwgUE1fUE1DU0VMX01TSykpIHwKKwkJCQkoYWx0cG1jIDw8IFBNX1BNQ19TSCkgfAorCQkJCWJ5dGVkZWNvZGVfYWx0ZXJuYXRpdmVzW2FsdHBtYyAtIDFdW2pdOworCQl9CisJfQorCisJLyogbmV3IGRlY29kZSBhbHRlcm5hdGl2ZXMgZm9yIHBvd2VyNSsgKi8KKwlpZiAocG1jID09IDEgJiYgKHBwID09IDB4MGQgfHwgcHAgPT0gMHgwZSkpCisJCXJldHVybiBldmVudCArICgyIDw8IFBNX1BNQ19TSCkgKyAoMHgyZSAtIDB4MGQpOworCWlmIChwbWMgPT0gMyAmJiAocHAgPT0gMHgyZSB8fCBwcCA9PSAweDJmKSkKKwkJcmV0dXJuIGV2ZW50IC0gKDIgPDwgUE1fUE1DX1NIKSAtICgweDJlIC0gMHgwZCk7CisKKwkvKiBhbHRlcm5hdGl2ZSBhZGQgZXZlbnQgZW5jb2RpbmdzICovCisJaWYgKHBwID09IDB4MTAgfHwgcHAgPT0gMHgyOCkKKwkJcmV0dXJuICgoZXZlbnQgXiAoMHgxMCBeIDB4MjgpKSAmIH5QTV9QTUNfTVNLUykgfAorCQkJKGFsdHBtYyA8PCBQTV9QTUNfU0gpOworCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHBvd2VyNXBfZ2V0X2FsdGVybmF0aXZlcyh1NjQgZXZlbnQsIHVuc2lnbmVkIGludCBmbGFncywgdTY0IGFsdFtdKQoreworCWludCBpLCBqLCBuYWx0ID0gMTsKKwlpbnQgbmxpbTsKKwlzNjQgYWU7CisKKwlhbHRbMF0gPSBldmVudDsKKwluYWx0ID0gMTsKKwlubGltID0gcG93ZXI1cF9saW1pdGVkX3BtY19ldmVudChldmVudCk7CisJaSA9IGZpbmRfYWx0ZXJuYXRpdmUoZXZlbnQpOworCWlmIChpID49IDApIHsKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9BTFQ7ICsraikgeworCQkJYWUgPSBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal07CisJCQlpZiAoYWUgJiYgYWUgIT0gZXZlbnQpCisJCQkJYWx0W25hbHQrK10gPSBhZTsKKwkJCW5saW0gKz0gcG93ZXI1cF9saW1pdGVkX3BtY19ldmVudChhZSk7CisJCX0KKwl9IGVsc2UgeworCQlhZSA9IGZpbmRfYWx0ZXJuYXRpdmVfYmRlY29kZShldmVudCk7CisJCWlmIChhZSA+IDApCisJCQlhbHRbbmFsdCsrXSA9IGFlOworCX0KKworCWlmIChmbGFncyAmIFBQTVVfT05MWV9DT1VOVF9SVU4pIHsKKwkJLyoKKwkJICogV2UncmUgb25seSBjb3VudGluZyBpbiBSVU4gc3RhdGUsCisJCSAqIHNvIFBNX0NZQyBpcyBlcXVpdmFsZW50IHRvIFBNX1JVTl9DWUMKKwkJICogYW5kIFBNX0lOU1RfQ01QTCA9PT0gUE1fUlVOX0lOU1RfQ01QTC4KKwkJICogVGhpcyBkb2Vzbid0IGluY2x1ZGUgYWx0ZXJuYXRpdmVzIHRoYXQgZG9uJ3QgcHJvdmlkZQorCQkgKiBhbnkgZXh0cmEgZmxleGliaWxpdHkgaW4gYXNzaWduaW5nIFBNQ3MgKGUuZy4KKwkJICogMHgxMDAwMDUgZm9yIFBNX1JVTl9DWUMgdnMuIDB4ZiBmb3IgUE1fQ1lDKS4KKwkJICogTm90ZSB0aGF0IGV2ZW4gd2l0aCB0aGVzZSBhZGRpdGlvbmFsIGFsdGVybmF0aXZlcworCQkgKiB3ZSBuZXZlciBlbmQgdXAgd2l0aCBtb3JlIHRoYW4gMyBhbHRlcm5hdGl2ZXMgZm9yIGFueSBldmVudC4KKwkJICovCisJCWogPSBuYWx0OworCQlmb3IgKGkgPSAwOyBpIDwgbmFsdDsgKytpKSB7CisJCQlzd2l0Y2ggKGFsdFtpXSkgeworCQkJY2FzZSAweGY6CS8qIFBNX0NZQyAqLworCQkJCWFsdFtqKytdID0gMHg2MDAwMDU7CS8qIFBNX1JVTl9DWUMgKi8KKwkJCQkrK25saW07CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NjAwMDA1OgkvKiBQTV9SVU5fQ1lDICovCisJCQkJYWx0W2orK10gPSAweGY7CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTAwMDA5OgkvKiBQTV9JTlNUX0NNUEwgKi8KKwkJCQlhbHRbaisrXSA9IDB4NTAwMDA5OwkvKiBQTV9SVU5fSU5TVF9DTVBMICovCisJCQkJKytubGltOworCQkJCWJyZWFrOworCQkJY2FzZSAweDUwMDAwOToJLyogUE1fUlVOX0lOU1RfQ01QTCAqLworCQkJCWFsdFtqKytdID0gMHgxMDAwMDk7CS8qIFBNX0lOU1RfQ01QTCAqLworCQkJCWFsdFtqKytdID0gMHgyMDAwMDk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwkJbmFsdCA9IGo7CisJfQorCisJaWYgKCEoZmxhZ3MgJiBQUE1VX0xJTUlURURfUE1DX09LKSAmJiBubGltKSB7CisJCS8qIHJlbW92ZSB0aGUgbGltaXRlZCBQTUMgZXZlbnRzICovCisJCWogPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgbmFsdDsgKytpKSB7CisJCQlpZiAoIXBvd2VyNXBfbGltaXRlZF9wbWNfZXZlbnQoYWx0W2ldKSkgeworCQkJCWFsdFtqXSA9IGFsdFtpXTsKKwkJCQkrK2o7CisJCQl9CisJCX0KKwkJbmFsdCA9IGo7CisJfSBlbHNlIGlmICgoZmxhZ3MgJiBQUE1VX0xJTUlURURfUE1DX1JFUUQpICYmIG5saW0gPCBuYWx0KSB7CisJCS8qIHJlbW92ZSBhbGwgYnV0IHRoZSBsaW1pdGVkIFBNQyBldmVudHMgKi8KKwkJaiA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCBuYWx0OyArK2kpIHsKKwkJCWlmIChwb3dlcjVwX2xpbWl0ZWRfcG1jX2V2ZW50KGFsdFtpXSkpIHsKKwkJCQlhbHRbal0gPSBhbHRbaV07CisJCQkJKytqOworCQkJfQorCQl9CisJCW5hbHQgPSBqOworCX0KKworCXJldHVybiBuYWx0OworfQorCisvKgorICogTWFwIG9mIHdoaWNoIGRpcmVjdCBldmVudHMgb24gd2hpY2ggUE1DcyBhcmUgbWFya2VkIGluc3RydWN0aW9uIGV2ZW50cy4KKyAqIEluZGV4ZWQgYnkgUE1DU0VMIHZhbHVlLCBiaXQgaSAoTEUpIHNldCBpZiBQTUMgaSBpcyBhIG1hcmtlZCBldmVudC4KKyAqIEJpdCAwIGlzIHNldCBpZiBpdCBpcyBtYXJrZWQgZm9yIGFsbCBQTUNzLgorICogVGhlIDB4ODAgYml0IGluZGljYXRlcyBhIGJ5dGUgZGVjb2RlIFBNQ1NFTCB2YWx1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGlyZWN0X2V2ZW50X2lzX21hcmtlZFsweDI4XSA9IHsKKwkwLAkvKiAwMCAqLworCTB4MWYsCS8qIDAxIFBNX0lPUFNfQ01QTCAqLworCTB4MiwJLyogMDIgUE1fTVJLX0dSUF9ESVNQICovCisJMHhlLAkvKiAwMyBQTV9NUktfU1RfQ01QTCwgUE1fTVJLX1NUX0dQUywgUE1fTVJLX1NUX0NNUExfSU5UICovCisJMCwJLyogMDQgKi8KKwkweDFjLAkvKiAwNSBQTV9NUktfQlJVX0ZJTiwgUE1fTVJLX0lOU1RfRklOLCBQTV9NUktfQ1JVX0ZJTiAqLworCTB4ODAsCS8qIDA2ICovCisJMHg4MCwJLyogMDcgKi8KKwkwLCAwLCAwLC8qIDA4IC0gMGEgKi8KKwkweDE4LAkvKiAwYiBQTV9USFJFU0hfVElNRU8sIFBNX01SS19HUlBfVElNRU8gKi8KKwkwLAkvKiAwYyAqLworCTB4ODAsCS8qIDBkICovCisJMHg4MCwJLyogMGUgKi8KKwkwLAkvKiAwZiAqLworCTAsCS8qIDEwICovCisJMHgxNCwJLyogMTEgUE1fTVJLX0dSUF9CUl9SRURJUiwgUE1fTVJLX0dSUF9JQ19NSVNTICovCisJMCwJLyogMTIgKi8KKwkweDEwLAkvKiAxMyBQTV9NUktfR1JQX0NNUEwgKi8KKwkweDFmLAkvKiAxNCBQTV9HUlBfTVJLLCBQTV9NUktfe0ZYVSxGUFUsTFNVfV9GSU4gKi8KKwkweDIsCS8qIDE1IFBNX01SS19HUlBfSVNTVUVEICovCisJMHg4MCwJLyogMTYgKi8KKwkweDgwLAkvKiAxNyAqLworCTAsIDAsIDAsIDAsIDAsCisJMHg4MCwJLyogMWQgKi8KKwkweDgwLAkvKiAxZSAqLworCTAsCS8qIDFmICovCisJMHg4MCwJLyogMjAgKi8KKwkweDgwLAkvKiAyMSAqLworCTB4ODAsCS8qIDIyICovCisJMHg4MCwJLyogMjMgKi8KKwkweDgwLAkvKiAyNCAqLworCTB4ODAsCS8qIDI1ICovCisJMHg4MCwJLyogMjYgKi8KKwkweDgwLAkvKiAyNyAqLworfTsKKworLyoKKyAqIFJldHVybnMgMSBpZiBldmVudCBjb3VudHMgdGhpbmdzIHJlbGF0aW5nIHRvIG1hcmtlZCBpbnN0cnVjdGlvbnMKKyAqIGFuZCB0aHVzIG5lZWRzIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBzZXQsIG9yIDAgaWYgbm90LgorICovCitzdGF0aWMgaW50IHBvd2VyNXBfbWFya2VkX2luc3RyX2V2ZW50KHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBwc2VsOworCWludCBiaXQsIGJ5dGUsIHVuaXQ7CisJdTMyIG1hc2s7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJcHNlbCA9IGV2ZW50ICYgUE1fUE1DU0VMX01TSzsKKwlpZiAocG1jID49IDUpCisJCXJldHVybiAwOworCisJYml0ID0gLTE7CisJaWYgKHBzZWwgPCBzaXplb2YoZGlyZWN0X2V2ZW50X2lzX21hcmtlZCkpIHsKKwkJaWYgKGRpcmVjdF9ldmVudF9pc19tYXJrZWRbcHNlbF0gJiAoMSA8PCBwbWMpKQorCQkJcmV0dXJuIDE7CisJCWlmIChkaXJlY3RfZXZlbnRfaXNfbWFya2VkW3BzZWxdICYgMHg4MCkKKwkJCWJpdCA9IDQ7CisJCWVsc2UgaWYgKHBzZWwgPT0gMHgwOCkKKwkJCWJpdCA9IHBtYyAtIDE7CisJCWVsc2UgaWYgKHBzZWwgPT0gMHgxMCkKKwkJCWJpdCA9IDQgLSBwbWM7CisJCWVsc2UgaWYgKHBzZWwgPT0gMHgxYiAmJiAocG1jID09IDEgfHwgcG1jID09IDMpKQorCQkJYml0ID0gNDsKKwl9IGVsc2UgaWYgKChwc2VsICYgMHg0OCkgPT0gMHg0MCkgeworCQliaXQgPSBwc2VsICYgNzsKKwl9IGVsc2UgaWYgKHBzZWwgPT0gMHgyOCkgeworCQliaXQgPSBwbWMgLSAxOworCX0gZWxzZSBpZiAocG1jID09IDMgJiYgKHBzZWwgPT0gMHgyZSB8fCBwc2VsID09IDB4MmYpKSB7CisJCWJpdCA9IDQ7CisJfQorCisJaWYgKCEoZXZlbnQgJiBQTV9CVVNFVkVOVF9NU0spIHx8IGJpdCA9PSAtMSkKKwkJcmV0dXJuIDA7CisKKwlieXRlID0gKGV2ZW50ID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJdW5pdCA9IChldmVudCA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCWlmICh1bml0ID09IFBNX0xTVTApIHsKKwkJLyogYnl0ZSAxIGJpdHMgMC03LCBieXRlIDIgYml0cyAwLDItNCw2ICovCisJCW1hc2sgPSAweDVkZmYwMDsKKwl9IGVsc2UgaWYgKHVuaXQgPT0gUE1fTFNVMSAmJiBieXRlID49IDQpIHsKKwkJYnl0ZSAtPSA0OworCQkvKiBieXRlIDUgYml0cyA2LTcsIGJ5dGUgNiBiaXRzIDAsNCwgYnl0ZSA3IGJpdHMgMC00LDYgKi8KKwkJbWFzayA9IDB4NWYxMWMwMDA7CisJfSBlbHNlCisJCXJldHVybiAwOworCisJcmV0dXJuIChtYXNrID4+IChieXRlICogOCArIGJpdCkpICYgMTsKK30KKworc3RhdGljIGludCBwb3dlcjVwX2NvbXB1dGVfbW1jcih1NjQgZXZlbnRbXSwgaW50IG5fZXYsCisJCQkJdW5zaWduZWQgaW50IGh3Y1tdLCB1NjQgbW1jcltdKQoreworCXU2NCBtbWNyMSA9IDA7CisJdTY0IG1tY3JhID0gMDsKKwl1bnNpZ25lZCBpbnQgcG1jLCB1bml0LCBieXRlLCBwc2VsOworCXVuc2lnbmVkIGludCB0dG07CisJaW50IGksIGlzYnVzLCBiaXQsIGdyc2VsOworCXVuc2lnbmVkIGludCBwbWNfaW51c2UgPSAwOworCXVuc2lnbmVkIGNoYXIgYnVzYnl0ZVs0XTsKKwl1bnNpZ25lZCBjaGFyIHVuaXR1c2VbMTZdOworCWludCB0dG11c2U7CisKKwlpZiAobl9ldiA+IDYpCisJCXJldHVybiAtMTsKKworCS8qIEZpcnN0IHBhc3MgdG8gY291bnQgcmVzb3VyY2UgdXNlICovCisJbWVtc2V0KGJ1c2J5dGUsIDAsIHNpemVvZihidXNieXRlKSk7CisJbWVtc2V0KHVuaXR1c2UsIDAsIHNpemVvZih1bml0dXNlKSk7CisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCWlmIChwbWMpIHsKKwkJCWlmIChwbWMgPiA2KQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChwbWNfaW51c2UgJiAoMSA8PCAocG1jIC0gMSkpKQorCQkJCXJldHVybiAtMTsKKwkJCXBtY19pbnVzZSB8PSAxIDw8IChwbWMgLSAxKTsKKwkJfQorCQlpZiAoZXZlbnRbaV0gJiBQTV9CVVNFVkVOVF9NU0spIHsKKwkJCXVuaXQgPSAoZXZlbnRbaV0gPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJCWJ5dGUgPSAoZXZlbnRbaV0gPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJCWlmICh1bml0ID4gUE1fTEFTVFVOSVQpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKHVuaXQgPT0gUE1fSVNVMF9BTFQpCisJCQkJdW5pdCA9IFBNX0lTVTA7CisJCQlpZiAoYnl0ZSA+PSA0KSB7CisJCQkJaWYgKHVuaXQgIT0gUE1fTFNVMSkKKwkJCQkJcmV0dXJuIC0xOworCQkJCSsrdW5pdDsKKwkJCQlieXRlICY9IDM7CisJCQl9CisJCQlpZiAoYnVzYnl0ZVtieXRlXSAmJiBidXNieXRlW2J5dGVdICE9IHVuaXQpCisJCQkJcmV0dXJuIC0xOworCQkJYnVzYnl0ZVtieXRlXSA9IHVuaXQ7CisJCQl1bml0dXNlW3VuaXRdID0gMTsKKwkJfQorCX0KKworCS8qCisJICogQXNzaWduIHJlc291cmNlcyBhbmQgc2V0IG11bHRpcGxleGVyIHNlbGVjdHMuCisJICoKKwkgKiBQTV9JU1UwIGNhbiBnbyBlaXRoZXIgb24gVFRNMCBvciBUVE0xLCBidXQgdGhhdCdzIHRoZSBvbmx5CisJICogY2hvaWNlIHdlIGhhdmUgdG8gZGVhbCB3aXRoLgorCSAqLworCWlmICh1bml0dXNlW1BNX0lTVTBdICYKKwkgICAgKHVuaXR1c2VbUE1fRlBVXSB8IHVuaXR1c2VbUE1fSUZVXSB8IHVuaXR1c2VbUE1fSVNVMV0pKSB7CisJCXVuaXR1c2VbUE1fSVNVMF9BTFRdID0gMTsJLyogbW92ZSBJU1UgdG8gVFRNMSAqLworCQl1bml0dXNlW1BNX0lTVTBdID0gMDsKKwl9CisJLyogU2V0IFRUTVswMV1TRUwgZmllbGRzLiAqLworCXR0bXVzZSA9IDA7CisJZm9yIChpID0gUE1fRlBVOyBpIDw9IFBNX0lTVTE7ICsraSkgeworCQlpZiAoIXVuaXR1c2VbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKHR0bXVzZSsrKQorCQkJcmV0dXJuIC0xOworCQltbWNyMSB8PSAodTY0KWkgPDwgTU1DUjFfVFRNMFNFTF9TSDsKKwl9CisJdHRtdXNlID0gMDsKKwlmb3IgKDsgaSA8PSBQTV9HUlM7ICsraSkgeworCQlpZiAoIXVuaXR1c2VbaV0pCisJCQljb250aW51ZTsKKwkJaWYgKHR0bXVzZSsrKQorCQkJcmV0dXJuIC0xOworCQltbWNyMSB8PSAodTY0KShpICYgMykgPDwgTU1DUjFfVFRNMVNFTF9TSDsKKwl9CisJaWYgKHR0bXVzZSA+IDEpCisJCXJldHVybiAtMTsKKworCS8qIFNldCBieXRlIGxhbmUgc2VsZWN0IGZpZWxkcywgVFRNWzIzXVNFTCBhbmQgR1JTXypTRUwuICovCisJZm9yIChieXRlID0gMDsgYnl0ZSA8IDQ7ICsrYnl0ZSkgeworCQl1bml0ID0gYnVzYnl0ZVtieXRlXTsKKwkJaWYgKCF1bml0KQorCQkJY29udGludWU7CisJCWlmICh1bml0ID09IFBNX0lTVTAgJiYgdW5pdHVzZVtQTV9JU1UwX0FMVF0pIHsKKwkJCS8qIGdldCBJU1UwIHRocm91Z2ggVFRNMSByYXRoZXIgdGhhbiBUVE0wICovCisJCQl1bml0ID0gUE1fSVNVMF9BTFQ7CisJCX0gZWxzZSBpZiAodW5pdCA9PSBQTV9MU1UxICsgMSkgeworCQkJLyogc2VsZWN0IGxvd2VyIHdvcmQgb2YgTFNVMSBmb3IgdGhpcyBieXRlICovCisJCQltbWNyMSB8PSAxdWxsIDw8IChNTUNSMV9UVE0zU0VMX1NIICsgMyAtIGJ5dGUpOworCQl9CisJCXR0bSA9IHVuaXQgPj4gMjsKKwkJbW1jcjEgfD0gKHU2NCl0dG0gPDwgKE1NQ1IxX1REX0NQX0RCRzBTRUxfU0ggLSAyICogYnl0ZSk7CisJfQorCisJLyogU2Vjb25kIHBhc3M6IGFzc2lnbiBQTUNzLCBzZXQgUE1DeFNFTCBhbmQgUE1DeF9BRERFUl9TRUwgZmllbGRzICovCisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCXVuaXQgPSAoZXZlbnRbaV0gPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJYnl0ZSA9IChldmVudFtpXSA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQlwc2VsID0gZXZlbnRbaV0gJiBQTV9QTUNTRUxfTVNLOworCQlpc2J1cyA9IGV2ZW50W2ldICYgUE1fQlVTRVZFTlRfTVNLOworCQlpZiAoIXBtYykgeworCQkJLyogQnVzIGV2ZW50IG9yIGFueS1QTUMgZGlyZWN0IGV2ZW50ICovCisJCQlmb3IgKHBtYyA9IDA7IHBtYyA8IDQ7ICsrcG1jKSB7CisJCQkJaWYgKCEocG1jX2ludXNlICYgKDEgPDwgcG1jKSkpCisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKHBtYyA+PSA0KQorCQkJCXJldHVybiAtMTsKKwkJCXBtY19pbnVzZSB8PSAxIDw8IHBtYzsKKwkJfSBlbHNlIGlmIChwbWMgPD0gNCkgeworCQkJLyogRGlyZWN0IGV2ZW50ICovCisJCQktLXBtYzsKKwkJCWlmIChpc2J1cyAmJiAoYnl0ZSAmIDIpICYmCisJCQkgICAgKHBzZWwgPT0gOCB8fCBwc2VsID09IDB4MTAgfHwgcHNlbCA9PSAweDI4KSkKKwkJCQkvKiBhZGQgZXZlbnRzIG9uIGhpZ2hlci1udW1iZXJlZCBidXMgKi8KKwkJCQltbWNyMSB8PSAxdWxsIDw8IChNTUNSMV9QTUMxX0FEREVSX1NFTF9TSCAtIHBtYyk7CisJCX0gZWxzZSB7CisJCQkvKiBJbnN0cnVjdGlvbnMgb3IgcnVuIGN5Y2xlcyBvbiBQTUM1LzYgKi8KKwkJCS0tcG1jOworCQl9CisJCWlmIChpc2J1cyAmJiB1bml0ID09IFBNX0dSUykgeworCQkJYml0ID0gcHNlbCAmIDc7CisJCQlncnNlbCA9IChldmVudFtpXSA+PiBQTV9HUlNfU0gpICYgUE1fR1JTX01TSzsKKwkJCW1tY3IxIHw9ICh1NjQpZ3JzZWwgPDwgZ3JzZWxfc2hpZnRbYml0XTsKKwkJfQorCQlpZiAocG93ZXI1cF9tYXJrZWRfaW5zdHJfZXZlbnQoZXZlbnRbaV0pKQorCQkJbW1jcmEgfD0gTU1DUkFfU0FNUExFX0VOQUJMRTsKKwkJaWYgKChwc2VsICYgMHg1OCkgPT0gMHg0MCAmJiAoYnl0ZSAmIDEpICE9ICgocG1jID4+IDEpICYgMSkpCisJCQkvKiBzZWxlY3QgYWx0ZXJuYXRlIGJ5dGUgbGFuZSAqLworCQkJcHNlbCB8PSAweDEwOworCQlpZiAocG1jIDw9IDMpCisJCQltbWNyMSB8PSBwc2VsIDw8IE1NQ1IxX1BNQ1NFTF9TSChwbWMpOworCQlod2NbaV0gPSBwbWM7CisJfQorCisJLyogUmV0dXJuIE1NQ1J4IHZhbHVlcyAqLworCW1tY3JbMF0gPSAwOworCWlmIChwbWNfaW51c2UgJiAxKQorCQltbWNyWzBdID0gTU1DUjBfUE1DMUNFOworCWlmIChwbWNfaW51c2UgJiAweDNlKQorCQltbWNyWzBdIHw9IE1NQ1IwX1BNQ2pDRTsKKwltbWNyWzFdID0gbW1jcjE7CisJbW1jclsyXSA9IG1tY3JhOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwb3dlcjVwX2Rpc2FibGVfcG1jKHVuc2lnbmVkIGludCBwbWMsIHU2NCBtbWNyW10pCit7CisJaWYgKHBtYyA8PSAzKQorCQltbWNyWzFdICY9IH4oMHg3ZlVMIDw8IE1NQ1IxX1BNQ1NFTF9TSChwbWMpKTsKK30KKworc3RhdGljIGludCBwb3dlcjVwX2dlbmVyaWNfZXZlbnRzW10gPSB7CisJW1BFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFU10JCT0gMHhmLAorCVtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMHgxMDAwMDksCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVGRVJFTkNFU10JPSAweDFjMTBhOCwgLyogTERfUkVGX0wxICovCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSAweDNjMTA4OCwgLyogTERfTUlTU19MMSAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCT0gMHgyMzBlNCwgIC8qIEJSX0lTU1VFRCAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCQk9IDB4MjMwZTUsICAvKiBCUl9NUFJFRF9DUiAqLworfTsKKworI2RlZmluZSBDKHgpCVBFUkZfQ09VTlRfSFdfQ0FDSEVfIyN4CisKKy8qCisgKiBUYWJsZSBvZiBnZW5lcmFsaXplZCBjYWNoZS1yZWxhdGVkIGV2ZW50cy4KKyAqIDAgbWVhbnMgbm90IHN1cHBvcnRlZCwgLTEgbWVhbnMgbm9uc2Vuc2ljYWwsIG90aGVyIHZhbHVlcworICogYXJlIGV2ZW50IGNvZGVzLgorICovCitzdGF0aWMgaW50IHBvd2VyNXBfY2FjaGVfZXZlbnRzW0MoTUFYKV1bQyhPUF9NQVgpXVtDKFJFU1VMVF9NQVgpXSA9IHsKKwlbQyhMMUQpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHgxYzEwYTgsCTB4M2MxMDg4CX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTB4MmMxMGE4LAkweGMxMGMzCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweGM3MGU3LAktMQkJfSwKKwl9LAorCVtDKEwxSSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMAkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMCwJCTAJCX0sCisJfSwKKwlbQyhMTCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMAkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJMCwJCTAJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4YzUwYzMsCTAJCX0sCisJfSwKKwlbQyhEVExCKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4YzIwZTQsCTB4ODAwYzQJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJCX0sCisJfSwKKwlbQyhJVExCKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTAsCQkweDgwMGMwCQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCisJW0MoQlBVKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4MjMwZTQsCTB4MjMwZTUJCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJCX0sCisJfSwKK307CisKK3N0cnVjdCBwb3dlcl9wbXUgcG93ZXI1cF9wbXUgPSB7CisJLm5fY291bnRlciA9IDYsCisJLm1heF9hbHRlcm5hdGl2ZXMgPSBNQVhfQUxULAorCS5hZGRfZmllbGRzID0gMHg3MDAwMDAwMDAwMDU1dWxsLAorCS50ZXN0X2FkZGVyID0gMHgzMDAwMDQwMDAwMDAwdWxsLAorCS5jb21wdXRlX21tY3IgPSBwb3dlcjVwX2NvbXB1dGVfbW1jciwKKwkuZ2V0X2NvbnN0cmFpbnQgPSBwb3dlcjVwX2dldF9jb25zdHJhaW50LAorCS5nZXRfYWx0ZXJuYXRpdmVzID0gcG93ZXI1cF9nZXRfYWx0ZXJuYXRpdmVzLAorCS5kaXNhYmxlX3BtYyA9IHBvd2VyNXBfZGlzYWJsZV9wbWMsCisJLmxpbWl0ZWRfcG1jX2V2ZW50ID0gcG93ZXI1cF9saW1pdGVkX3BtY19ldmVudCwKKwkuZmxhZ3MgPSBQUE1VX0xJTUlURURfUE1DNV82LAorCS5uX2dlbmVyaWMgPSBBUlJBWV9TSVpFKHBvd2VyNXBfZ2VuZXJpY19ldmVudHMpLAorCS5nZW5lcmljX2V2ZW50cyA9IHBvd2VyNXBfZ2VuZXJpY19ldmVudHMsCisJLmNhY2hlX2V2ZW50cyA9ICZwb3dlcjVwX2NhY2hlX2V2ZW50cywKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNS1wbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI1LXBtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1NjAwYjYKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNS1wbXUuYwpAQCAtMCwwICsxLDYxMSBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgc3VwcG9ydCBmb3IgUE9XRVI1IChub3QgUE9XRVI1KyspIHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IDIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorCisvKgorICogQml0cyBpbiBldmVudCBjb2RlIGZvciBQT1dFUjUgKG5vdCBQT1dFUjUrKykKKyAqLworI2RlZmluZSBQTV9QTUNfU0gJMjAJLyogUE1DIG51bWJlciAoMS1iYXNlZCkgZm9yIGRpcmVjdCBldmVudHMgKi8KKyNkZWZpbmUgUE1fUE1DX01TSwkweGYKKyNkZWZpbmUgUE1fUE1DX01TS1MJKFBNX1BNQ19NU0sgPDwgUE1fUE1DX1NIKQorI2RlZmluZSBQTV9VTklUX1NICTE2CS8qIFRUTU1VWCBudW1iZXIgYW5kIHNldHRpbmcgLSB1bml0IHNlbGVjdCAqLworI2RlZmluZSBQTV9VTklUX01TSwkweGYKKyNkZWZpbmUgUE1fQllURV9TSAkxMgkvKiBCeXRlIG51bWJlciBvZiBldmVudCBidXMgdG8gdXNlICovCisjZGVmaW5lIFBNX0JZVEVfTVNLCTcKKyNkZWZpbmUgUE1fR1JTX1NICTgJLyogU3RvcmFnZSBzdWJzeXN0ZW0gbXV4IHNlbGVjdCAqLworI2RlZmluZSBQTV9HUlNfTVNLCTcKKyNkZWZpbmUgUE1fQlVTRVZFTlRfTVNLCTB4ODAJLyogU2V0IGlmIGV2ZW50IHVzZXMgZXZlbnQgYnVzICovCisjZGVmaW5lIFBNX1BNQ1NFTF9NU0sJMHg3ZgorCisvKiBWYWx1ZXMgaW4gUE1fVU5JVCBmaWVsZCAqLworI2RlZmluZSBQTV9GUFUJCTAKKyNkZWZpbmUgUE1fSVNVMAkJMQorI2RlZmluZSBQTV9JRlUJCTIKKyNkZWZpbmUgUE1fSVNVMQkJMworI2RlZmluZSBQTV9JRFUJCTQKKyNkZWZpbmUgUE1fSVNVMF9BTFQJNgorI2RlZmluZSBQTV9HUlMJCTcKKyNkZWZpbmUgUE1fTFNVMAkJOAorI2RlZmluZSBQTV9MU1UxCQkweGMKKyNkZWZpbmUgUE1fTEFTVFVOSVQJMHhjCisKKy8qCisgKiBCaXRzIGluIE1NQ1IxIGZvciBQT1dFUjUKKyAqLworI2RlZmluZSBNTUNSMV9UVE0wU0VMX1NICTYyCisjZGVmaW5lIE1NQ1IxX1RUTTFTRUxfU0gJNjAKKyNkZWZpbmUgTU1DUjFfVFRNMlNFTF9TSAk1OAorI2RlZmluZSBNTUNSMV9UVE0zU0VMX1NICTU2CisjZGVmaW5lIE1NQ1IxX1RUTVNFTF9NU0sJMworI2RlZmluZSBNTUNSMV9URF9DUF9EQkcwU0VMX1NICTU0CisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzFTRUxfU0gJNTIKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHMlNFTF9TSAk1MAorI2RlZmluZSBNTUNSMV9URF9DUF9EQkczU0VMX1NICTQ4CisjZGVmaW5lIE1NQ1IxX0dSU19MMlNFTF9TSAk0NgorI2RlZmluZSBNTUNSMV9HUlNfTDJTRUxfTVNLCTMKKyNkZWZpbmUgTU1DUjFfR1JTX0wzU0VMX1NICTQ0CisjZGVmaW5lIE1NQ1IxX0dSU19MM1NFTF9NU0sJMworI2RlZmluZSBNTUNSMV9HUlNfTUNTRUxfU0gJNDEKKyNkZWZpbmUgTU1DUjFfR1JTX01DU0VMX01TSwk3CisjZGVmaW5lIE1NQ1IxX0dSU19GQUJTRUxfU0gJMzkKKyNkZWZpbmUgTU1DUjFfR1JTX0ZBQlNFTF9NU0sJMworI2RlZmluZSBNTUNSMV9QTUMxX0FEREVSX1NFTF9TSAkzNQorI2RlZmluZSBNTUNSMV9QTUMyX0FEREVSX1NFTF9TSAkzNAorI2RlZmluZSBNTUNSMV9QTUMzX0FEREVSX1NFTF9TSAkzMworI2RlZmluZSBNTUNSMV9QTUM0X0FEREVSX1NFTF9TSAkzMgorI2RlZmluZSBNTUNSMV9QTUMxU0VMX1NICTI1CisjZGVmaW5lIE1NQ1IxX1BNQzJTRUxfU0gJMTcKKyNkZWZpbmUgTU1DUjFfUE1DM1NFTF9TSAk5CisjZGVmaW5lIE1NQ1IxX1BNQzRTRUxfU0gJMQorI2RlZmluZSBNTUNSMV9QTUNTRUxfU0gobikJKE1NQ1IxX1BNQzFTRUxfU0ggLSAobikgKiA4KQorI2RlZmluZSBNTUNSMV9QTUNTRUxfTVNLCTB4N2YKKworLyoKKyAqIEJpdHMgaW4gTU1DUkEKKyAqLworCisvKgorICogTGF5b3V0IG9mIGNvbnN0cmFpbnQgYml0czoKKyAqIDY2NjY1NTU1NTU1NTU1NDQ0NDQ0NDQ0NDMzMzMzMzMzMzMyMjIyMjIyMjIyMTExMTExMTExMTAwMDAwMDAwMDAKKyAqIDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTAKKyAqICAgICAgICAgPD48PlsgID48Pjw+PCA+PD4gWyAgPlsgPlsgPjwgID48ICA+PCAgPjwgID48Pjw+PD48Pjw+PD4KKyAqICAgICAgICAgVDBUMSBOQyBHMEcxRzIgRzMgIFVDIFBTMVBTMiBCMCAgQjEgIEIyICBCMyBQNlA1UDRQM1AyUDEKKyAqCisgKiBUMCAtIFRUTTAgY29uc3RyYWludAorICogICAgIDU0LTU1OiBUVE0wU0VMIHZhbHVlICgwPUZQVSwgMj1JRlUsIDM9SVNVMSkgMHhjMF8wMDAwXzAwMDBfMDAwMAorICoKKyAqIFQxIC0gVFRNMSBjb25zdHJhaW50CisgKiAgICAgNTItNTM6IFRUTTFTRUwgdmFsdWUgKDA9SURVLCAzPUdSUykgMHgzMF8wMDAwXzAwMDBfMDAwMAorICoKKyAqIE5DIC0gbnVtYmVyIG9mIGNvdW50ZXJzCisgKiAgICAgNTE6IE5DIGVycm9yIDB4MDAwOF8wMDAwXzAwMDBfMDAwMAorICogICAgIDQ4LTUwOiBudW1iZXIgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMS00IDB4MDAwN18wMDAwXzAwMDBfMDAwMAorICoKKyAqIEcwLi5HMyAtIEdSUyBtdXggY29uc3RyYWludHMKKyAqICAgICA0Ni00NzogR1JTX0wyU0VMIHZhbHVlCisgKiAgICAgNDQtNDU6IEdSU19MM1NFTCB2YWx1ZQorICogICAgIDQxLTQ0OiBHUlNfTUNTRUwgdmFsdWUKKyAqICAgICAzOS00MDogR1JTX0ZBQlNFTCB2YWx1ZQorICoJTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHVwIHdpdGggdGhlaXIgYml0IHBvc2l0aW9ucyBpbiBNTUNSMQorICoKKyAqIFVDIC0gdW5pdCBjb25zdHJhaW50OiBjYW4ndCBoYXZlIGFsbCB0aHJlZSBvZiBGUFV8SUZVfElTVTEsIElTVTAsIElEVXxHUlMKKyAqICAgICAzNzogVUMzIGVycm9yIDB4MjBfMDAwMF8wMDAwCisgKiAgICAgMzY6IEZQVXxJRlV8SVNVMSBldmVudHMgbmVlZGVkIDB4MTBfMDAwMF8wMDAwCisgKiAgICAgMzU6IElTVTAgZXZlbnRzIG5lZWRlZCAweDA4XzAwMDBfMDAwMAorICogICAgIDM0OiBJRFV8R1JTIGV2ZW50cyBuZWVkZWQgMHgwNF8wMDAwXzAwMDAKKyAqCisgKiBQUzEKKyAqICAgICAzMzogUFMxIGVycm9yIDB4Ml8wMDAwXzAwMDAKKyAqICAgICAzMS0zMjogY291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMS8yIDB4MV84MDAwXzAwMDAKKyAqCisgKiBQUzIKKyAqICAgICAzMDogUFMyIGVycm9yIDB4NDAwMF8wMDAwCisgKiAgICAgMjgtMjk6IGNvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzMvNCAweDMwMDBfMDAwMAorICoKKyAqIEIwCisgKiAgICAgMjQtMjc6IEJ5dGUgMCBldmVudCBzb3VyY2UgMHgwZjAwXzAwMDAKKyAqCSAgICAgIEVuY29kaW5nIGFzIGZvciB0aGUgZXZlbnQgY29kZQorICoKKyAqIEIxLCBCMiwgQjMKKyAqICAgICAyMC0yMywgMTYtMTksIDEyLTE1OiBCeXRlIDEsIDIsIDMgZXZlbnQgc291cmNlcworICoKKyAqIFAxLi5QNgorICogICAgIDAtMTE6IENvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzEuLlBNQzYKKyAqLworCitzdGF0aWMgY29uc3QgaW50IGdyc2VsX3NoaWZ0WzhdID0geworCU1NQ1IxX0dSU19MMlNFTF9TSCwgTU1DUjFfR1JTX0wyU0VMX1NILCBNTUNSMV9HUlNfTDJTRUxfU0gsCisJTU1DUjFfR1JTX0wzU0VMX1NILCBNTUNSMV9HUlNfTDNTRUxfU0gsIE1NQ1IxX0dSU19MM1NFTF9TSCwKKwlNTUNSMV9HUlNfTUNTRUxfU0gsIE1NQ1IxX0dSU19GQUJTRUxfU0gKK307CisKKy8qIE1hc2tzIGFuZCB2YWx1ZXMgZm9yIHVzaW5nIGV2ZW50cyBmcm9tIHRoZSB2YXJpb3VzIHVuaXRzICovCitzdGF0aWMgdTY0IHVuaXRfY29uc1tQTV9MQVNUVU5JVCsxXVsyXSA9IHsKKwlbUE1fRlBVXSA9ICAgeyAweGMwMDAyMDAwMDAwMDAwdWxsLCAweDAwMDAxMDAwMDAwMDAwdWxsIH0sCisJW1BNX0lTVTBdID0gIHsgMHgwMDAwMjAwMDAwMDAwMHVsbCwgMHgwMDAwMDgwMDAwMDAwMHVsbCB9LAorCVtQTV9JU1UxXSA9ICB7IDB4YzAwMDIwMDAwMDAwMDB1bGwsIDB4YzAwMDEwMDAwMDAwMDB1bGwgfSwKKwlbUE1fSUZVXSA9ICAgeyAweGMwMDAyMDAwMDAwMDAwdWxsLCAweDgwMDAxMDAwMDAwMDAwdWxsIH0sCisJW1BNX0lEVV0gPSAgIHsgMHgzMDAwMjAwMDAwMDAwMHVsbCwgMHgwMDAwMDQwMDAwMDAwMHVsbCB9LAorCVtQTV9HUlNdID0gICB7IDB4MzAwMDIwMDAwMDAwMDB1bGwsIDB4MzAwMDA0MDAwMDAwMDB1bGwgfSwKK307CisKK3N0YXRpYyBpbnQgcG93ZXI1X2dldF9jb25zdHJhaW50KHU2NCBldmVudCwgdTY0ICptYXNrcCwgdTY0ICp2YWxwKQoreworCWludCBwbWMsIGJ5dGUsIHVuaXQsIHNoOworCWludCBiaXQsIGZtYXNrOworCXU2NCBtYXNrID0gMCwgdmFsdWUgPSAwOworCWludCBncnAgPSAtMTsKKworCXBtYyA9IChldmVudCA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwlpZiAocG1jKSB7CisJCWlmIChwbWMgPiA2KQorCQkJcmV0dXJuIC0xOworCQlzaCA9IChwbWMgLSAxKSAqIDI7CisJCW1hc2sgfD0gMiA8PCBzaDsKKwkJdmFsdWUgfD0gMSA8PCBzaDsKKwkJaWYgKHBtYyA8PSA0KQorCQkJZ3JwID0gKHBtYyAtIDEpID4+IDE7CisJCWVsc2UgaWYgKGV2ZW50ICE9IDB4NTAwMDA5ICYmIGV2ZW50ICE9IDB4NjAwMDA1KQorCQkJcmV0dXJuIC0xOworCX0KKwlpZiAoZXZlbnQgJiBQTV9CVVNFVkVOVF9NU0spIHsKKwkJdW5pdCA9IChldmVudCA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCQlpZiAodW5pdCA+IFBNX0xBU1RVTklUKQorCQkJcmV0dXJuIC0xOworCQlpZiAodW5pdCA9PSBQTV9JU1UwX0FMVCkKKwkJCXVuaXQgPSBQTV9JU1UwOworCQltYXNrIHw9IHVuaXRfY29uc1t1bml0XVswXTsKKwkJdmFsdWUgfD0gdW5pdF9jb25zW3VuaXRdWzFdOworCQlieXRlID0gKGV2ZW50ID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJCWlmIChieXRlID49IDQpIHsKKwkJCWlmICh1bml0ICE9IFBNX0xTVTEpCisJCQkJcmV0dXJuIC0xOworCQkJLyogTWFwIExTVTEgbG93IHdvcmQgKGJ5dGVzIDQtNykgdG8gdW5pdCBMU1UxKzEgKi8KKwkJCSsrdW5pdDsKKwkJCWJ5dGUgJj0gMzsKKwkJfQorCQlpZiAodW5pdCA9PSBQTV9HUlMpIHsKKwkJCWJpdCA9IGV2ZW50ICYgNzsKKwkJCWZtYXNrID0gKGJpdCA9PSA2KT8gNzogMzsKKwkJCXNoID0gZ3JzZWxfc2hpZnRbYml0XTsKKwkJCW1hc2sgfD0gKHU2NClmbWFzayA8PCBzaDsKKwkJCXZhbHVlIHw9ICh1NjQpKChldmVudCA+PiBQTV9HUlNfU0gpICYgZm1hc2spIDw8IHNoOworCQl9CisJCS8qCisJCSAqIEJ1cyBldmVudHMgb24gYnl0ZXMgMCBhbmQgMiBjYW4gYmUgY291bnRlZAorCQkgKiBvbiBQTUMxLzI7IGJ5dGVzIDEgYW5kIDMgb24gUE1DMy80LgorCQkgKi8KKwkJaWYgKCFwbWMpCisJCQlncnAgPSBieXRlICYgMTsKKwkJLyogU2V0IGJ5dGUgbGFuZSBzZWxlY3QgZmllbGQgKi8KKwkJbWFzayAgfD0gMHhmVUxMIDw8ICgyNCAtIDQgKiBieXRlKTsKKwkJdmFsdWUgfD0gKHU2NCl1bml0IDw8ICgyNCAtIDQgKiBieXRlKTsKKwl9CisJaWYgKGdycCA9PSAwKSB7CisJCS8qIGluY3JlbWVudCBQTUMxLzIgZmllbGQgKi8KKwkJbWFzayAgfD0gMHgyMDAwMDAwMDB1bGw7CisJCXZhbHVlIHw9IDB4MDgwMDAwMDAwdWxsOworCX0gZWxzZSBpZiAoZ3JwID09IDEpIHsKKwkJLyogaW5jcmVtZW50IFBNQzMvNCBmaWVsZCAqLworCQltYXNrICB8PSAweDQwMDAwMDAwdWxsOworCQl2YWx1ZSB8PSAweDEwMDAwMDAwdWxsOworCX0KKwlpZiAocG1jIDwgNSkgeworCQkvKiBuZWVkIGEgY291bnRlciBmcm9tIFBNQzEtNCBzZXQgKi8KKwkJbWFzayAgfD0gMHg4MDAwMDAwMDAwMDAwdWxsOworCQl2YWx1ZSB8PSAweDEwMDAwMDAwMDAwMDB1bGw7CisJfQorCSptYXNrcCA9IG1hc2s7CisJKnZhbHAgPSB2YWx1ZTsKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBNQVhfQUxUCTMJLyogYXQgbW9zdCAzIGFsdGVybmF0aXZlcyBmb3IgYW55IGV2ZW50ICovCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgZXZlbnRfYWx0ZXJuYXRpdmVzW11bTUFYX0FMVF0gPSB7CisJeyAweDEyMGU0LCAgMHg0MDAwMDIgfSwJCQkvKiBQTV9HUlBfRElTUF9SRUpFQ1QgKi8KKwl7IDB4NDEwYzcsICAweDQ0MTA4NCB9LAkJCS8qIFBNX1RIUkRfTDJNSVNTX0JPVEhfQ1lDICovCisJeyAweDEwMDAwNSwgMHg2MDAwMDUgfSwJCQkvKiBQTV9SVU5fQ1lDICovCisJeyAweDEwMDAwOSwgMHgyMDAwMDksIDB4NTAwMDA5IH0sCS8qIFBNX0lOU1RfQ01QTCAqLworCXsgMHgzMDAwMDksIDB4NDAwMDA5IH0sCQkJLyogUE1fSU5TVF9ESVNQICovCit9OworCisvKgorICogU2NhbiB0aGUgYWx0ZXJuYXRpdmVzIHRhYmxlIGZvciBhIG1hdGNoIGFuZCByZXR1cm4gdGhlCisgKiBpbmRleCBpbnRvIHRoZSBhbHRlcm5hdGl2ZXMgdGFibGUgaWYgZm91bmQsIGVsc2UgLTEuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9hbHRlcm5hdGl2ZSh1NjQgZXZlbnQpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldmVudF9hbHRlcm5hdGl2ZXMpOyArK2kpIHsKKwkJaWYgKGV2ZW50IDwgZXZlbnRfYWx0ZXJuYXRpdmVzW2ldWzBdKQorCQkJYnJlYWs7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxUICYmIGV2ZW50X2FsdGVybmF0aXZlc1tpXVtqXTsgKytqKQorCQkJaWYgKGV2ZW50ID09IGV2ZW50X2FsdGVybmF0aXZlc1tpXVtqXSkKKwkJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBieXRlZGVjb2RlX2FsdGVybmF0aXZlc1s0XVs0XSA9IHsKKwkvKiBQTUMgMSAqLwl7IDB4MjEsIDB4MjMsIDB4MjUsIDB4MjcgfSwKKwkvKiBQTUMgMiAqLwl7IDB4MDcsIDB4MTcsIDB4MGUsIDB4MWUgfSwKKwkvKiBQTUMgMyAqLwl7IDB4MjAsIDB4MjIsIDB4MjQsIDB4MjYgfSwKKwkvKiBQTUMgNCAqLwl7IDB4MDcsIDB4MTcsIDB4MGUsIDB4MWUgfQorfTsKKworLyoKKyAqIFNvbWUgZGlyZWN0IGV2ZW50cyBmb3IgZGVjb2RlcyBvZiBldmVudCBidXMgYnl0ZSAzIGhhdmUgYWx0ZXJuYXRpdmUKKyAqIFBNQ1NFTCB2YWx1ZXMgb24gb3RoZXIgY291bnRlcnMuICBUaGlzIHJldHVybnMgdGhlIGFsdGVybmF0aXZlCisgKiBldmVudCBjb2RlIGZvciB0aG9zZSB0aGF0IGRvLCBvciAtMSBvdGhlcndpc2UuCisgKi8KK3N0YXRpYyBzNjQgZmluZF9hbHRlcm5hdGl2ZV9iZGVjb2RlKHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBhbHRwbWMsIHBwLCBqOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCWlmIChwbWMgPT0gMCB8fCBwbWMgPiA0KQorCQlyZXR1cm4gLTE7CisJYWx0cG1jID0gNSAtIHBtYzsJLyogMSA8LT4gNCwgMiA8LT4gMyAqLworCXBwID0gZXZlbnQgJiBQTV9QTUNTRUxfTVNLOworCWZvciAoaiA9IDA7IGogPCA0OyArK2opIHsKKwkJaWYgKGJ5dGVkZWNvZGVfYWx0ZXJuYXRpdmVzW3BtYyAtIDFdW2pdID09IHBwKSB7CisJCQlyZXR1cm4gKGV2ZW50ICYgfihQTV9QTUNfTVNLUyB8IFBNX1BNQ1NFTF9NU0spKSB8CisJCQkJKGFsdHBtYyA8PCBQTV9QTUNfU0gpIHwKKwkJCQlieXRlZGVjb2RlX2FsdGVybmF0aXZlc1thbHRwbWMgLSAxXVtqXTsKKwkJfQorCX0KKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI1X2dldF9hbHRlcm5hdGl2ZXModTY0IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHU2NCBhbHRbXSkKK3sKKwlpbnQgaSwgaiwgbmFsdCA9IDE7CisJczY0IGFlOworCisJYWx0WzBdID0gZXZlbnQ7CisJbmFsdCA9IDE7CisJaSA9IGZpbmRfYWx0ZXJuYXRpdmUoZXZlbnQpOworCWlmIChpID49IDApIHsKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9BTFQ7ICsraikgeworCQkJYWUgPSBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal07CisJCQlpZiAoYWUgJiYgYWUgIT0gZXZlbnQpCisJCQkJYWx0W25hbHQrK10gPSBhZTsKKwkJfQorCX0gZWxzZSB7CisJCWFlID0gZmluZF9hbHRlcm5hdGl2ZV9iZGVjb2RlKGV2ZW50KTsKKwkJaWYgKGFlID4gMCkKKwkJCWFsdFtuYWx0KytdID0gYWU7CisJfQorCXJldHVybiBuYWx0OworfQorCisvKgorICogTWFwIG9mIHdoaWNoIGRpcmVjdCBldmVudHMgb24gd2hpY2ggUE1DcyBhcmUgbWFya2VkIGluc3RydWN0aW9uIGV2ZW50cy4KKyAqIEluZGV4ZWQgYnkgUE1DU0VMIHZhbHVlLCBiaXQgaSAoTEUpIHNldCBpZiBQTUMgaSBpcyBhIG1hcmtlZCBldmVudC4KKyAqIEJpdCAwIGlzIHNldCBpZiBpdCBpcyBtYXJrZWQgZm9yIGFsbCBQTUNzLgorICogVGhlIDB4ODAgYml0IGluZGljYXRlcyBhIGJ5dGUgZGVjb2RlIFBNQ1NFTCB2YWx1ZS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGlyZWN0X2V2ZW50X2lzX21hcmtlZFsweDI4XSA9IHsKKwkwLAkvKiAwMCAqLworCTB4MWYsCS8qIDAxIFBNX0lPUFNfQ01QTCAqLworCTB4MiwJLyogMDIgUE1fTVJLX0dSUF9ESVNQICovCisJMHhlLAkvKiAwMyBQTV9NUktfU1RfQ01QTCwgUE1fTVJLX1NUX0dQUywgUE1fTVJLX1NUX0NNUExfSU5UICovCisJMCwJLyogMDQgKi8KKwkweDFjLAkvKiAwNSBQTV9NUktfQlJVX0ZJTiwgUE1fTVJLX0lOU1RfRklOLCBQTV9NUktfQ1JVX0ZJTiAqLworCTB4ODAsCS8qIDA2ICovCisJMHg4MCwJLyogMDcgKi8KKwkwLCAwLCAwLC8qIDA4IC0gMGEgKi8KKwkweDE4LAkvKiAwYiBQTV9USFJFU0hfVElNRU8sIFBNX01SS19HUlBfVElNRU8gKi8KKwkwLAkvKiAwYyAqLworCTB4ODAsCS8qIDBkICovCisJMHg4MCwJLyogMGUgKi8KKwkwLAkvKiAwZiAqLworCTAsCS8qIDEwICovCisJMHgxNCwJLyogMTEgUE1fTVJLX0dSUF9CUl9SRURJUiwgUE1fTVJLX0dSUF9JQ19NSVNTICovCisJMCwJLyogMTIgKi8KKwkweDEwLAkvKiAxMyBQTV9NUktfR1JQX0NNUEwgKi8KKwkweDFmLAkvKiAxNCBQTV9HUlBfTVJLLCBQTV9NUktfe0ZYVSxGUFUsTFNVfV9GSU4gKi8KKwkweDIsCS8qIDE1IFBNX01SS19HUlBfSVNTVUVEICovCisJMHg4MCwJLyogMTYgKi8KKwkweDgwLAkvKiAxNyAqLworCTAsIDAsIDAsIDAsIDAsCisJMHg4MCwJLyogMWQgKi8KKwkweDgwLAkvKiAxZSAqLworCTAsCS8qIDFmICovCisJMHg4MCwJLyogMjAgKi8KKwkweDgwLAkvKiAyMSAqLworCTB4ODAsCS8qIDIyICovCisJMHg4MCwJLyogMjMgKi8KKwkweDgwLAkvKiAyNCAqLworCTB4ODAsCS8qIDI1ICovCisJMHg4MCwJLyogMjYgKi8KKwkweDgwLAkvKiAyNyAqLworfTsKKworLyoKKyAqIFJldHVybnMgMSBpZiBldmVudCBjb3VudHMgdGhpbmdzIHJlbGF0aW5nIHRvIG1hcmtlZCBpbnN0cnVjdGlvbnMKKyAqIGFuZCB0aHVzIG5lZWRzIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBzZXQsIG9yIDAgaWYgbm90LgorICovCitzdGF0aWMgaW50IHBvd2VyNV9tYXJrZWRfaW5zdHJfZXZlbnQodTY0IGV2ZW50KQoreworCWludCBwbWMsIHBzZWw7CisJaW50IGJpdCwgYnl0ZSwgdW5pdDsKKwl1MzIgbWFzazsKKworCXBtYyA9IChldmVudCA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwlwc2VsID0gZXZlbnQgJiBQTV9QTUNTRUxfTVNLOworCWlmIChwbWMgPj0gNSkKKwkJcmV0dXJuIDA7CisKKwliaXQgPSAtMTsKKwlpZiAocHNlbCA8IHNpemVvZihkaXJlY3RfZXZlbnRfaXNfbWFya2VkKSkgeworCQlpZiAoZGlyZWN0X2V2ZW50X2lzX21hcmtlZFtwc2VsXSAmICgxIDw8IHBtYykpCisJCQlyZXR1cm4gMTsKKwkJaWYgKGRpcmVjdF9ldmVudF9pc19tYXJrZWRbcHNlbF0gJiAweDgwKQorCQkJYml0ID0gNDsKKwkJZWxzZSBpZiAocHNlbCA9PSAweDA4KQorCQkJYml0ID0gcG1jIC0gMTsKKwkJZWxzZSBpZiAocHNlbCA9PSAweDEwKQorCQkJYml0ID0gNCAtIHBtYzsKKwkJZWxzZSBpZiAocHNlbCA9PSAweDFiICYmIChwbWMgPT0gMSB8fCBwbWMgPT0gMykpCisJCQliaXQgPSA0OworCX0gZWxzZSBpZiAoKHBzZWwgJiAweDU4KSA9PSAweDQwKQorCQliaXQgPSBwc2VsICYgNzsKKworCWlmICghKGV2ZW50ICYgUE1fQlVTRVZFTlRfTVNLKSkKKwkJcmV0dXJuIDA7CisKKwlieXRlID0gKGV2ZW50ID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJdW5pdCA9IChldmVudCA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCWlmICh1bml0ID09IFBNX0xTVTApIHsKKwkJLyogYnl0ZSAxIGJpdHMgMC03LCBieXRlIDIgYml0cyAwLDItNCw2ICovCisJCW1hc2sgPSAweDVkZmYwMDsKKwl9IGVsc2UgaWYgKHVuaXQgPT0gUE1fTFNVMSAmJiBieXRlID49IDQpIHsKKwkJYnl0ZSAtPSA0OworCQkvKiBieXRlIDQgYml0cyAxLDMsNSw3LCBieXRlIDUgYml0cyA2LTcsIGJ5dGUgNyBiaXRzIDAtNCw2ICovCisJCW1hc2sgPSAweDVmMDBjMGFhOworCX0gZWxzZQorCQlyZXR1cm4gMDsKKworCXJldHVybiAobWFzayA+PiAoYnl0ZSAqIDggKyBiaXQpKSAmIDE7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI1X2NvbXB1dGVfbW1jcih1NjQgZXZlbnRbXSwgaW50IG5fZXYsCisJCQkgICAgICAgdW5zaWduZWQgaW50IGh3Y1tdLCB1NjQgbW1jcltdKQoreworCXU2NCBtbWNyMSA9IDA7CisJdTY0IG1tY3JhID0gMDsKKwl1bnNpZ25lZCBpbnQgcG1jLCB1bml0LCBieXRlLCBwc2VsOworCXVuc2lnbmVkIGludCB0dG0sIGdycDsKKwlpbnQgaSwgaXNidXMsIGJpdCwgZ3JzZWw7CisJdW5zaWduZWQgaW50IHBtY19pbnVzZSA9IDA7CisJdW5zaWduZWQgaW50IHBtY19ncnBfdXNlWzJdOworCXVuc2lnbmVkIGNoYXIgYnVzYnl0ZVs0XTsKKwl1bnNpZ25lZCBjaGFyIHVuaXR1c2VbMTZdOworCWludCB0dG11c2U7CisKKwlpZiAobl9ldiA+IDYpCisJCXJldHVybiAtMTsKKworCS8qIEZpcnN0IHBhc3MgdG8gY291bnQgcmVzb3VyY2UgdXNlICovCisJcG1jX2dycF91c2VbMF0gPSBwbWNfZ3JwX3VzZVsxXSA9IDA7CisJbWVtc2V0KGJ1c2J5dGUsIDAsIHNpemVvZihidXNieXRlKSk7CisJbWVtc2V0KHVuaXR1c2UsIDAsIHNpemVvZih1bml0dXNlKSk7CisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCWlmIChwbWMpIHsKKwkJCWlmIChwbWMgPiA2KQorCQkJCXJldHVybiAtMTsKKwkJCWlmIChwbWNfaW51c2UgJiAoMSA8PCAocG1jIC0gMSkpKQorCQkJCXJldHVybiAtMTsKKwkJCXBtY19pbnVzZSB8PSAxIDw8IChwbWMgLSAxKTsKKwkJCS8qIGNvdW50IDEvMiB2cyAzLzQgdXNlICovCisJCQlpZiAocG1jIDw9IDQpCisJCQkJKytwbWNfZ3JwX3VzZVsocG1jIC0gMSkgPj4gMV07CisJCX0KKwkJaWYgKGV2ZW50W2ldICYgUE1fQlVTRVZFTlRfTVNLKSB7CisJCQl1bml0ID0gKGV2ZW50W2ldID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJCQlieXRlID0gKGV2ZW50W2ldID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJCQlpZiAodW5pdCA+IFBNX0xBU1RVTklUKQorCQkJCXJldHVybiAtMTsKKwkJCWlmICh1bml0ID09IFBNX0lTVTBfQUxUKQorCQkJCXVuaXQgPSBQTV9JU1UwOworCQkJaWYgKGJ5dGUgPj0gNCkgeworCQkJCWlmICh1bml0ICE9IFBNX0xTVTEpCisJCQkJCXJldHVybiAtMTsKKwkJCQkrK3VuaXQ7CisJCQkJYnl0ZSAmPSAzOworCQkJfQorCQkJaWYgKCFwbWMpCisJCQkJKytwbWNfZ3JwX3VzZVtieXRlICYgMV07CisJCQlpZiAoYnVzYnl0ZVtieXRlXSAmJiBidXNieXRlW2J5dGVdICE9IHVuaXQpCisJCQkJcmV0dXJuIC0xOworCQkJYnVzYnl0ZVtieXRlXSA9IHVuaXQ7CisJCQl1bml0dXNlW3VuaXRdID0gMTsKKwkJfQorCX0KKwlpZiAocG1jX2dycF91c2VbMF0gPiAyIHx8IHBtY19ncnBfdXNlWzFdID4gMikKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBBc3NpZ24gcmVzb3VyY2VzIGFuZCBzZXQgbXVsdGlwbGV4ZXIgc2VsZWN0cy4KKwkgKgorCSAqIFBNX0lTVTAgY2FuIGdvIGVpdGhlciBvbiBUVE0wIG9yIFRUTTEsIGJ1dCB0aGF0J3MgdGhlIG9ubHkKKwkgKiBjaG9pY2Ugd2UgaGF2ZSB0byBkZWFsIHdpdGguCisJICovCisJaWYgKHVuaXR1c2VbUE1fSVNVMF0gJgorCSAgICAodW5pdHVzZVtQTV9GUFVdIHwgdW5pdHVzZVtQTV9JRlVdIHwgdW5pdHVzZVtQTV9JU1UxXSkpIHsKKwkJdW5pdHVzZVtQTV9JU1UwX0FMVF0gPSAxOwkvKiBtb3ZlIElTVSB0byBUVE0xICovCisJCXVuaXR1c2VbUE1fSVNVMF0gPSAwOworCX0KKwkvKiBTZXQgVFRNWzAxXVNFTCBmaWVsZHMuICovCisJdHRtdXNlID0gMDsKKwlmb3IgKGkgPSBQTV9GUFU7IGkgPD0gUE1fSVNVMTsgKytpKSB7CisJCWlmICghdW5pdHVzZVtpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAodHRtdXNlKyspCisJCQlyZXR1cm4gLTE7CisJCW1tY3IxIHw9ICh1NjQpaSA8PCBNTUNSMV9UVE0wU0VMX1NIOworCX0KKwl0dG11c2UgPSAwOworCWZvciAoOyBpIDw9IFBNX0dSUzsgKytpKSB7CisJCWlmICghdW5pdHVzZVtpXSkKKwkJCWNvbnRpbnVlOworCQlpZiAodHRtdXNlKyspCisJCQlyZXR1cm4gLTE7CisJCW1tY3IxIHw9ICh1NjQpKGkgJiAzKSA8PCBNTUNSMV9UVE0xU0VMX1NIOworCX0KKwlpZiAodHRtdXNlID4gMSkKKwkJcmV0dXJuIC0xOworCisJLyogU2V0IGJ5dGUgbGFuZSBzZWxlY3QgZmllbGRzLCBUVE1bMjNdU0VMIGFuZCBHUlNfKlNFTC4gKi8KKwlmb3IgKGJ5dGUgPSAwOyBieXRlIDwgNDsgKytieXRlKSB7CisJCXVuaXQgPSBidXNieXRlW2J5dGVdOworCQlpZiAoIXVuaXQpCisJCQljb250aW51ZTsKKwkJaWYgKHVuaXQgPT0gUE1fSVNVMCAmJiB1bml0dXNlW1BNX0lTVTBfQUxUXSkgeworCQkJLyogZ2V0IElTVTAgdGhyb3VnaCBUVE0xIHJhdGhlciB0aGFuIFRUTTAgKi8KKwkJCXVuaXQgPSBQTV9JU1UwX0FMVDsKKwkJfSBlbHNlIGlmICh1bml0ID09IFBNX0xTVTEgKyAxKSB7CisJCQkvKiBzZWxlY3QgbG93ZXIgd29yZCBvZiBMU1UxIGZvciB0aGlzIGJ5dGUgKi8KKwkJCW1tY3IxIHw9IDF1bGwgPDwgKE1NQ1IxX1RUTTNTRUxfU0ggKyAzIC0gYnl0ZSk7CisJCX0KKwkJdHRtID0gdW5pdCA+PiAyOworCQltbWNyMSB8PSAodTY0KXR0bSA8PCAoTU1DUjFfVERfQ1BfREJHMFNFTF9TSCAtIDIgKiBieXRlKTsKKwl9CisKKwkvKiBTZWNvbmQgcGFzczogYXNzaWduIFBNQ3MsIHNldCBQTUN4U0VMIGFuZCBQTUN4X0FEREVSX1NFTCBmaWVsZHMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgbl9ldjsgKytpKSB7CisJCXBtYyA9IChldmVudFtpXSA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwkJdW5pdCA9IChldmVudFtpXSA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCQlieXRlID0gKGV2ZW50W2ldID4+IFBNX0JZVEVfU0gpICYgUE1fQllURV9NU0s7CisJCXBzZWwgPSBldmVudFtpXSAmIFBNX1BNQ1NFTF9NU0s7CisJCWlzYnVzID0gZXZlbnRbaV0gJiBQTV9CVVNFVkVOVF9NU0s7CisJCWlmICghcG1jKSB7CisJCQkvKiBCdXMgZXZlbnQgb3IgYW55LVBNQyBkaXJlY3QgZXZlbnQgKi8KKwkJCWZvciAocG1jID0gMDsgcG1jIDwgNDsgKytwbWMpIHsKKwkJCQlpZiAocG1jX2ludXNlICYgKDEgPDwgcG1jKSkKKwkJCQkJY29udGludWU7CisJCQkJZ3JwID0gKHBtYyA+PiAxKSAmIDE7CisJCQkJaWYgKGlzYnVzKSB7CisJCQkJCWlmIChncnAgPT0gKGJ5dGUgJiAxKSkKKwkJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAocG1jX2dycF91c2VbZ3JwXSA8IDIpIHsKKwkJCQkJKytwbWNfZ3JwX3VzZVtncnBdOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlwbWNfaW51c2UgfD0gMSA8PCBwbWM7CisJCX0gZWxzZSBpZiAocG1jIDw9IDQpIHsKKwkJCS8qIERpcmVjdCBldmVudCAqLworCQkJLS1wbWM7CisJCQlpZiAoKHBzZWwgPT0gOCB8fCBwc2VsID09IDB4MTApICYmIGlzYnVzICYmIChieXRlICYgMikpCisJCQkJLyogYWRkIGV2ZW50cyBvbiBoaWdoZXItbnVtYmVyZWQgYnVzICovCisJCQkJbW1jcjEgfD0gMXVsbCA8PCAoTU1DUjFfUE1DMV9BRERFUl9TRUxfU0ggLSBwbWMpOworCQl9IGVsc2UgeworCQkJLyogSW5zdHJ1Y3Rpb25zIG9yIHJ1biBjeWNsZXMgb24gUE1DNS82ICovCisJCQktLXBtYzsKKwkJfQorCQlpZiAoaXNidXMgJiYgdW5pdCA9PSBQTV9HUlMpIHsKKwkJCWJpdCA9IHBzZWwgJiA3OworCQkJZ3JzZWwgPSAoZXZlbnRbaV0gPj4gUE1fR1JTX1NIKSAmIFBNX0dSU19NU0s7CisJCQltbWNyMSB8PSAodTY0KWdyc2VsIDw8IGdyc2VsX3NoaWZ0W2JpdF07CisJCX0KKwkJaWYgKHBvd2VyNV9tYXJrZWRfaW5zdHJfZXZlbnQoZXZlbnRbaV0pKQorCQkJbW1jcmEgfD0gTU1DUkFfU0FNUExFX0VOQUJMRTsKKwkJaWYgKHBtYyA8PSAzKQorCQkJbW1jcjEgfD0gcHNlbCA8PCBNTUNSMV9QTUNTRUxfU0gocG1jKTsKKwkJaHdjW2ldID0gcG1jOworCX0KKworCS8qIFJldHVybiBNTUNSeCB2YWx1ZXMgKi8KKwltbWNyWzBdID0gMDsKKwlpZiAocG1jX2ludXNlICYgMSkKKwkJbW1jclswXSA9IE1NQ1IwX1BNQzFDRTsKKwlpZiAocG1jX2ludXNlICYgMHgzZSkKKwkJbW1jclswXSB8PSBNTUNSMF9QTUNqQ0U7CisJbW1jclsxXSA9IG1tY3IxOworCW1tY3JbMl0gPSBtbWNyYTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcG93ZXI1X2Rpc2FibGVfcG1jKHVuc2lnbmVkIGludCBwbWMsIHU2NCBtbWNyW10pCit7CisJaWYgKHBtYyA8PSAzKQorCQltbWNyWzFdICY9IH4oMHg3ZlVMIDw8IE1NQ1IxX1BNQ1NFTF9TSChwbWMpKTsKK30KKworc3RhdGljIGludCBwb3dlcjVfZ2VuZXJpY19ldmVudHNbXSA9IHsKKwlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXQkJPSAweGYsCisJW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXQkJPSAweDEwMDAwOSwKKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXQk9IDB4NGMxMDkwLCAvKiBMRF9SRUZfTDEgKi8KKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQk9IDB4M2MxMDg4LCAvKiBMRF9NSVNTX0wxICovCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10JPSAweDIzMGU0LCAgLyogQlJfSVNTVUVEICovCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10JCT0gMHgyMzBlNSwgIC8qIEJSX01QUkVEX0NSICovCit9OworCisjZGVmaW5lIEMoeCkJUEVSRl9DT1VOVF9IV19DQUNIRV8jI3gKKworLyoKKyAqIFRhYmxlIG9mIGdlbmVyYWxpemVkIGNhY2hlLXJlbGF0ZWQgZXZlbnRzLgorICogMCBtZWFucyBub3Qgc3VwcG9ydGVkLCAtMSBtZWFucyBub25zZW5zaWNhbCwgb3RoZXIgdmFsdWVzCisgKiBhcmUgZXZlbnQgY29kZXMuCisgKi8KK3N0YXRpYyBpbnQgcG93ZXI1X2NhY2hlX2V2ZW50c1tDKE1BWCldW0MoT1BfTUFYKV1bQyhSRVNVTFRfTUFYKV0gPSB7CisJW0MoTDFEKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4NGMxMDkwLAkweDNjMTA4OAl9LAorCQlbQyhPUF9XUklURSldID0gewkweDNjMTA5MCwJMHhjMTBjMwkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMHhjNzBlNywJMAkJfSwKKwl9LAorCVtDKEwxSSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMAkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMCwJCTAJCX0sCisJfSwKKwlbQyhMTCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHgzYzMwOWIJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJMCwJCTAJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4YzUwYzMsCTAJCX0sCisJfSwKKwlbQyhEVExCKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4MmM0MDkwLAkweDgwMGM0CQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCisJW0MoSVRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHg4MDBjMAkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKKwl9LAorCVtDKEJQVSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDIzMGU0LAkweDIzMGU1CQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCit9OworCitzdHJ1Y3QgcG93ZXJfcG11IHBvd2VyNV9wbXUgPSB7CisJLm5fY291bnRlciA9IDYsCisJLm1heF9hbHRlcm5hdGl2ZXMgPSBNQVhfQUxULAorCS5hZGRfZmllbGRzID0gMHg3MDAwMDkwMDAwNTU1dWxsLAorCS50ZXN0X2FkZGVyID0gMHgzMDAwNDkwMDAwMDAwdWxsLAorCS5jb21wdXRlX21tY3IgPSBwb3dlcjVfY29tcHV0ZV9tbWNyLAorCS5nZXRfY29uc3RyYWludCA9IHBvd2VyNV9nZXRfY29uc3RyYWludCwKKwkuZ2V0X2FsdGVybmF0aXZlcyA9IHBvd2VyNV9nZXRfYWx0ZXJuYXRpdmVzLAorCS5kaXNhYmxlX3BtYyA9IHBvd2VyNV9kaXNhYmxlX3BtYywKKwkubl9nZW5lcmljID0gQVJSQVlfU0laRShwb3dlcjVfZ2VuZXJpY19ldmVudHMpLAorCS5nZW5lcmljX2V2ZW50cyA9IHBvd2VyNV9nZW5lcmljX2V2ZW50cywKKwkuY2FjaGVfZXZlbnRzID0gJnBvd2VyNV9jYWNoZV9ldmVudHMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNi1wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NmY3NGJlCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wb3dlcjYtcG11LmMKQEAgLTAsMCArMSw1MzIgQEAKKy8qCisgKiBQZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQgZm9yIFBPV0VSNiBwcm9jZXNzb3JzLgorICoKKyAqIENvcHlyaWdodCAyMDA4LTIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorCisvKgorICogQml0cyBpbiBldmVudCBjb2RlIGZvciBQT1dFUjYKKyAqLworI2RlZmluZSBQTV9QTUNfU0gJMjAJLyogUE1DIG51bWJlciAoMS1iYXNlZCkgZm9yIGRpcmVjdCBldmVudHMgKi8KKyNkZWZpbmUgUE1fUE1DX01TSwkweDcKKyNkZWZpbmUgUE1fUE1DX01TS1MJKFBNX1BNQ19NU0sgPDwgUE1fUE1DX1NIKQorI2RlZmluZSBQTV9VTklUX1NICTE2CS8qIFVuaXQgZXZlbnQgY29tZXMgKFRUTXhTRUwgZW5jb2RpbmcpICovCisjZGVmaW5lIFBNX1VOSVRfTVNLCTB4ZgorI2RlZmluZSBQTV9VTklUX01TS1MJKFBNX1VOSVRfTVNLIDw8IFBNX1VOSVRfU0gpCisjZGVmaW5lIFBNX0xMQVYJCTB4ODAwMAkvKiBMb2FkIGxvb2thaGVhZCBtYXRjaCB2YWx1ZSAqLworI2RlZmluZSBQTV9MTEEJCTB4NDAwMAkvKiBMb2FkIGxvb2thaGVhZCBtYXRjaCBlbmFibGUgKi8KKyNkZWZpbmUgUE1fQllURV9TSAkxMgkvKiBCeXRlIG9mIGV2ZW50IGJ1cyB0byB1c2UgKi8KKyNkZWZpbmUgUE1fQllURV9NU0sJMworI2RlZmluZSBQTV9TVUJVTklUX1NICTgJLyogU3VidW5pdCBldmVudCBjb21lcyBmcm9tIChORVNUX1NFTCBlbmMuKSAqLworI2RlZmluZSBQTV9TVUJVTklUX01TSwk3CisjZGVmaW5lIFBNX1NVQlVOSVRfTVNLUwkoUE1fU1VCVU5JVF9NU0sgPDwgUE1fU1VCVU5JVF9TSCkKKyNkZWZpbmUgUE1fUE1DU0VMX01TSwkweGZmCS8qIFBNQ3hTRUwgdmFsdWUgKi8KKyNkZWZpbmUgUE1fQlVTRVZFTlRfTVNLCTB4ZjM3MDAKKworLyoKKyAqIEJpdHMgaW4gTU1DUjEgZm9yIFBPV0VSNgorICovCisjZGVmaW5lIE1NQ1IxX1RUTTBTRUxfU0gJNjAKKyNkZWZpbmUgTU1DUjFfVFRNU0VMX1NIKG4pCShNTUNSMV9UVE0wU0VMX1NIIC0gKG4pICogNCkKKyNkZWZpbmUgTU1DUjFfVFRNU0VMX01TSwkweGYKKyNkZWZpbmUgTU1DUjFfVFRNU0VMKG0sIG4pCSgoKG0pID4+IE1NQ1IxX1RUTVNFTF9TSChuKSkgJiBNTUNSMV9UVE1TRUxfTVNLKQorI2RlZmluZSBNTUNSMV9ORVNUU0VMX1NICTQ1CisjZGVmaW5lIE1NQ1IxX05FU1RTRUxfTVNLCTB4NworI2RlZmluZSBNTUNSMV9ORVNUU0VMKG0pCSgoKG0pID4+IE1NQ1IxX05FU1RTRUxfU0gpICYgTU1DUjFfTkVTVFNFTF9NU0spCisjZGVmaW5lIE1NQ1IxX1BNQzFfTExBCQkoKHU2NCkxIDw8IDQ0KQorI2RlZmluZSBNTUNSMV9QTUMxX0xMQV9WQUxVRQkoKHU2NCkxIDw8IDM5KQorI2RlZmluZSBNTUNSMV9QTUMxX0FERFJfU0VMCSgodTY0KTEgPDwgMzUpCisjZGVmaW5lIE1NQ1IxX1BNQzFTRUxfU0gJMjQKKyNkZWZpbmUgTU1DUjFfUE1DU0VMX1NIKG4pCShNTUNSMV9QTUMxU0VMX1NIIC0gKG4pICogOCkKKyNkZWZpbmUgTU1DUjFfUE1DU0VMX01TSwkweGZmCisKKy8qCisgKiBNYXAgb2Ygd2hpY2ggZGlyZWN0IGV2ZW50cyBvbiB3aGljaCBQTUNzIGFyZSBtYXJrZWQgaW5zdHJ1Y3Rpb24gZXZlbnRzLgorICogSW5kZXhlZCBieSBQTUNTRUwgdmFsdWUgPj4gMS4KKyAqIEJvdHRvbSA0IGJpdHMgYXJlIGEgbWFwIG9mIHdoaWNoIFBNQ3MgYXJlIGludGVyZXN0aW5nLAorICogdG9wIDQgYml0cyBzYXkgd2hhdCBzb3J0IG9mIGV2ZW50OgorICogICAwID0gZGlyZWN0IG1hcmtlZCBldmVudCwKKyAqICAgMSA9IGJ5dGUgZGVjb2RlIGV2ZW50LAorICogICA0ID0gYWRkL2FuZCBldmVudCAoUE1DMSAtPiBiaXRzIDAgJiA0KSwKKyAqICAgNSA9IGFkZC9hbmQgZXZlbnQgKFBNQzEgLT4gYml0cyAxICYgNSksCisgKiAgIDYgPSBhZGQvYW5kIGV2ZW50IChQTUMxIC0+IGJpdHMgMiAmIDYpLAorICogICA3ID0gYWRkL2FuZCBldmVudCAoUE1DMSAtPiBiaXRzIDMgJiA3KS4KKyAqLworc3RhdGljIHVuc2lnbmVkIGNoYXIgZGlyZWN0X2V2ZW50X2lzX21hcmtlZFsweDYwID4+IDFdID0geworCTAsCS8qIDAwICovCisJMCwJLyogMDIgKi8KKwkwLAkvKiAwNCAqLworCTB4MDcsCS8qIDA2IFBNX01SS19TVF9DTVBMLCBQTV9NUktfU1RfR1BTLCBQTV9NUktfU1RfQ01QTF9JTlQgKi8KKwkweDA0LAkvKiAwOCBQTV9NUktfREZVX0ZJTiAqLworCTB4MDYsCS8qIDBhIFBNX01SS19JRlVfRklOLCBQTV9NUktfSU5TVF9GSU4gKi8KKwkwLAkvKiAwYyAqLworCTAsCS8qIDBlICovCisJMHgwMiwJLyogMTAgUE1fTVJLX0lOU1RfRElTUCAqLworCTB4MDgsCS8qIDEyIFBNX01SS19MU1VfREVSQVRfTUlTUyAqLworCTAsCS8qIDE0ICovCisJMCwJLyogMTYgKi8KKwkweDBjLAkvKiAxOCBQTV9USFJFU0hfVElNRU8sIFBNX01SS19JTlNUX0ZJTiAqLworCTB4MGYsCS8qIDFhIFBNX01SS19JTlNUX0RJU1AsIFBNX01SS197RlhVLEZQVSxMU1V9X0ZJTiAqLworCTB4MDEsCS8qIDFjIFBNX01SS19JTlNUX0lTU1VFRCAqLworCTAsCS8qIDFlICovCisJMCwJLyogMjAgKi8KKwkwLAkvKiAyMiAqLworCTAsCS8qIDI0ICovCisJMCwJLyogMjYgKi8KKwkweDE1LAkvKiAyOCBQTV9NUktfREFUQV9GUk9NX0wyTUlTUywgUE1fTVJLX0RBVEFfRlJPTV9MM01JU1MgKi8KKwkwLAkvKiAyYSAqLworCTAsCS8qIDJjICovCisJMCwJLyogMmUgKi8KKwkweDRmLAkvKiAzMCAqLworCTB4N2YsCS8qIDMyICovCisJMHg0ZiwJLyogMzQgKi8KKwkweDVmLAkvKiAzNiAqLworCTB4NmYsCS8qIDM4ICovCisJMHg0ZiwJLyogM2EgKi8KKwkwLAkvKiAzYyAqLworCTB4MDgsCS8qIDNlIFBNX01SS19JTlNUX1RJTUVPICovCisJMHgxZiwJLyogNDAgKi8KKwkweDFmLAkvKiA0MiAqLworCTB4MWYsCS8qIDQ0ICovCisJMHgxZiwJLyogNDYgKi8KKwkweDFmLAkvKiA0OCAqLworCTB4MWYsCS8qIDRhICovCisJMHgxZiwJLyogNGMgKi8KKwkweDFmLAkvKiA0ZSAqLworCTAsCS8qIDUwICovCisJMHgwNSwJLyogNTIgUE1fTVJLX0JSX1RBS0VOLCBQTV9NUktfQlJfTVBSRUQgKi8KKwkweDFjLAkvKiA1NCBQTV9NUktfUFRFR19GUk9NX0wzTUlTUywgUE1fTVJLX1BURUdfRlJPTV9MMk1JU1MgKi8KKwkweDAyLAkvKiA1NiBQTV9NUktfTERfTUlTU19MMSAqLworCTAsCS8qIDU4ICovCisJMCwJLyogNWEgKi8KKwkwLAkvKiA1YyAqLworCTAsCS8qIDVlICovCit9OworCisvKgorICogTWFza3Mgc2hvd2luZyBmb3IgZWFjaCB1bml0IHdoaWNoIGJpdHMgYXJlIG1hcmtlZCBldmVudHMuCisgKiBUaGVzZSBtYXNrcyBhcmUgaW4gTEUgb3JkZXIsIGkuZS4gMHgwMDAwMDAwMSBpcyBieXRlIDAsIGJpdCAwLgorICovCitzdGF0aWMgdTMyIG1hcmtlZF9idXNfZXZlbnRzWzE2XSA9IHsKKwkweDAxMDAwMDAwLAkvKiBkaXJlY3QgZXZlbnRzIHNldCAxOiBieXRlIDMgYml0IDAgKi8KKwkweDAwMDEwMDAwLAkvKiBkaXJlY3QgZXZlbnRzIHNldCAyOiBieXRlIDIgYml0IDAgKi8KKwkwLCAwLCAwLCAwLAkvKiBJRFUsIElGVSwgbmVzdDogbm90aGluZyAqLworCTB4MDAwMDAwODgsCS8qIFZNWCBzZXQgMTogYnl0ZSAwIGJpdHMgMywgNyAqLworCTB4MDAwMDAwYzAsCS8qIFZNWCBzZXQgMjogYnl0ZSAwIGJpdHMgNC03ICovCisJMHgwNDAxMDAwMCwJLyogTFNVIHNldCAxOiBieXRlIDIgYml0IDAsIGJ5dGUgMyBiaXQgMiAqLworCTB4ZmYwMTAwMDB1LAkvKiBMU1Ugc2V0IDI6IGJ5dGUgMiBiaXQgMCwgYWxsIG9mIGJ5dGUgMyAqLworCTAsCQkvKiBMU1Ugc2V0IDMgKi8KKwkweDAwMDAwMDEwLAkvKiBWTVggc2V0IDM6IGJ5dGUgMCBiaXQgNCAqLworCTAsCQkvKiBCRlAgc2V0IDEgKi8KKwkweDAwMDAwMDIyLAkvKiBCRlAgc2V0IDI6IGJ5dGUgMCBiaXRzIDEsIDUgKi8KKwkwLCAwCit9OworCQorLyoKKyAqIFJldHVybnMgMSBpZiBldmVudCBjb3VudHMgdGhpbmdzIHJlbGF0aW5nIHRvIG1hcmtlZCBpbnN0cnVjdGlvbnMKKyAqIGFuZCB0aHVzIG5lZWRzIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBzZXQsIG9yIDAgaWYgbm90LgorICovCitzdGF0aWMgaW50IHBvd2VyNl9tYXJrZWRfaW5zdHJfZXZlbnQodTY0IGV2ZW50KQoreworCWludCBwbWMsIHBzZWwsIHB0eXBlOworCWludCBiaXQsIGJ5dGUsIHVuaXQ7CisJdTMyIG1hc2s7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJcHNlbCA9IChldmVudCAmIFBNX1BNQ1NFTF9NU0spID4+IDE7CS8qIGRyb3AgZWRnZS9sZXZlbCBiaXQgKi8KKwlpZiAocG1jID49IDUpCisJCXJldHVybiAwOworCisJYml0ID0gLTE7CisJaWYgKHBzZWwgPCBzaXplb2YoZGlyZWN0X2V2ZW50X2lzX21hcmtlZCkpIHsKKwkJcHR5cGUgPSBkaXJlY3RfZXZlbnRfaXNfbWFya2VkW3BzZWxdOworCQlpZiAocG1jID09IDAgfHwgIShwdHlwZSAmICgxIDw8IChwbWMgLSAxKSkpKQorCQkJcmV0dXJuIDA7CisJCXB0eXBlID4+PSA0OworCQlpZiAocHR5cGUgPT0gMCkKKwkJCXJldHVybiAxOworCQlpZiAocHR5cGUgPT0gMSkKKwkJCWJpdCA9IDA7CisJCWVsc2UKKwkJCWJpdCA9IHB0eXBlIF4gKHBtYyAtIDEpOworCX0gZWxzZSBpZiAoKHBzZWwgJiAweDQ4KSA9PSAweDQwKQorCQliaXQgPSBwc2VsICYgNzsKKworCWlmICghKGV2ZW50ICYgUE1fQlVTRVZFTlRfTVNLKSB8fCBiaXQgPT0gLTEpCisJCXJldHVybiAwOworCisJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCXVuaXQgPSAoZXZlbnQgPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwltYXNrID0gbWFya2VkX2J1c19ldmVudHNbdW5pdF07CisJcmV0dXJuIChtYXNrID4+IChieXRlICogOCArIGJpdCkpICYgMTsKK30KKworLyoKKyAqIEFzc2lnbiBQTUMgbnVtYmVycyBhbmQgY29tcHV0ZSBNTUNSMSB2YWx1ZSBmb3IgYSBzZXQgb2YgZXZlbnRzCisgKi8KK3N0YXRpYyBpbnQgcDZfY29tcHV0ZV9tbWNyKHU2NCBldmVudFtdLCBpbnQgbl9ldiwKKwkJCSAgIHVuc2lnbmVkIGludCBod2NbXSwgdTY0IG1tY3JbXSkKK3sKKwl1NjQgbW1jcjEgPSAwOworCXU2NCBtbWNyYSA9IDA7CisJaW50IGk7CisJdW5zaWduZWQgaW50IHBtYywgZXYsIGIsIHUsIHMsIHBzZWw7CisJdW5zaWduZWQgaW50IHR0bXNldCA9IDA7CisJdW5zaWduZWQgaW50IHBtY19pbnVzZSA9IDA7CisKKwlpZiAobl9ldiA+IDYpCisJCXJldHVybiAtMTsKKwlmb3IgKGkgPSAwOyBpIDwgbl9ldjsgKytpKSB7CisJCXBtYyA9IChldmVudFtpXSA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwkJaWYgKHBtYykgeworCQkJaWYgKHBtY19pbnVzZSAmICgxIDw8IChwbWMgLSAxKSkpCisJCQkJcmV0dXJuIC0xOwkvKiBjb2xsaXNpb24hICovCisJCQlwbWNfaW51c2UgfD0gMSA8PCAocG1jIC0gMSk7CisJCX0KKwl9CisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlldiA9IGV2ZW50W2ldOworCQlwbWMgPSAoZXYgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCWlmIChwbWMpIHsKKwkJCS0tcG1jOworCQl9IGVsc2UgeworCQkJLyogY2FuIGdvIG9uIGFueSBQTUM7IGZpbmQgYSBmcmVlIG9uZSAqLworCQkJZm9yIChwbWMgPSAwOyBwbWMgPCA0OyArK3BtYykKKwkJCQlpZiAoIShwbWNfaW51c2UgJiAoMSA8PCBwbWMpKSkKKwkJCQkJYnJlYWs7CisJCQlpZiAocG1jID49IDQpCisJCQkJcmV0dXJuIC0xOworCQkJcG1jX2ludXNlIHw9IDEgPDwgcG1jOworCQl9CisJCWh3Y1tpXSA9IHBtYzsKKwkJcHNlbCA9IGV2ICYgUE1fUE1DU0VMX01TSzsKKwkJaWYgKGV2ICYgUE1fQlVTRVZFTlRfTVNLKSB7CisJCQkvKiB0aGlzIGV2ZW50IHVzZXMgdGhlIGV2ZW50IGJ1cyAqLworCQkJYiA9IChldiA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQkJdSA9IChldiA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCQkJLyogY2hlY2sgZm9yIGNvbmZsaWN0IG9uIHRoaXMgYnl0ZSBvZiBldmVudCBidXMgKi8KKwkJCWlmICgodHRtc2V0ICYgKDEgPDwgYikpICYmIE1NQ1IxX1RUTVNFTChtbWNyMSwgYikgIT0gdSkKKwkJCQlyZXR1cm4gLTE7CisJCQltbWNyMSB8PSAodTY0KXUgPDwgTU1DUjFfVFRNU0VMX1NIKGIpOworCQkJdHRtc2V0IHw9IDEgPDwgYjsKKwkJCWlmICh1ID09IDUpIHsKKwkJCQkvKiBOZXN0IGV2ZW50cyBoYXZlIGEgZnVydGhlciBtdXggKi8KKwkJCQlzID0gKGV2ID4+IFBNX1NVQlVOSVRfU0gpICYgUE1fU1VCVU5JVF9NU0s7CisJCQkJaWYgKCh0dG1zZXQgJiAweDEwKSAmJgorCQkJCSAgICBNTUNSMV9ORVNUU0VMKG1tY3IxKSAhPSBzKQorCQkJCQlyZXR1cm4gLTE7CisJCQkJdHRtc2V0IHw9IDB4MTA7CisJCQkJbW1jcjEgfD0gKHU2NClzIDw8IE1NQ1IxX05FU1RTRUxfU0g7CisJCQl9CisJCQlpZiAoMHgzMCA8PSBwc2VsICYmIHBzZWwgPD0gMHgzZCkgeworCQkJCS8qIHRoZXNlIG5lZWQgdGhlIFBNQ3hfQUREUl9TRUwgYml0cyAqLworCQkJCWlmIChiID49IDIpCisJCQkJCW1tY3IxIHw9IE1NQ1IxX1BNQzFfQUREUl9TRUwgPj4gcG1jOworCQkJfQorCQkJLyogYnVzIHNlbGVjdCB2YWx1ZXMgYXJlIGRpZmZlcmVudCBmb3IgUE1DMy80ICovCisJCQlpZiAocG1jID49IDIgJiYgKHBzZWwgJiAweDkwKSA9PSAweDgwKQorCQkJCXBzZWwgXj0gMHgyMDsKKwkJfQorCQlpZiAoZXYgJiBQTV9MTEEpIHsKKwkJCW1tY3IxIHw9IE1NQ1IxX1BNQzFfTExBID4+IHBtYzsKKwkJCWlmIChldiAmIFBNX0xMQVYpCisJCQkJbW1jcjEgfD0gTU1DUjFfUE1DMV9MTEFfVkFMVUUgPj4gcG1jOworCQl9CisJCWlmIChwb3dlcjZfbWFya2VkX2luc3RyX2V2ZW50KGV2ZW50W2ldKSkKKwkJCW1tY3JhIHw9IE1NQ1JBX1NBTVBMRV9FTkFCTEU7CisJCWlmIChwbWMgPCA0KQorCQkJbW1jcjEgfD0gKHU2NClwc2VsIDw8IE1NQ1IxX1BNQ1NFTF9TSChwbWMpOworCX0KKwltbWNyWzBdID0gMDsKKwlpZiAocG1jX2ludXNlICYgMSkKKwkJbW1jclswXSA9IE1NQ1IwX1BNQzFDRTsKKwlpZiAocG1jX2ludXNlICYgMHhlKQorCQltbWNyWzBdIHw9IE1NQ1IwX1BNQ2pDRTsKKwltbWNyWzFdID0gbW1jcjE7CisJbW1jclsyXSA9IG1tY3JhOworCXJldHVybiAwOworfQorCisvKgorICogTGF5b3V0IG9mIGNvbnN0cmFpbnQgYml0czoKKyAqCisgKgkwLTEJYWRkIGZpZWxkOiBudW1iZXIgb2YgdXNlcyBvZiBQTUMxIChtYXggMSkKKyAqCTItMywgNC01LCA2LTcsIDgtOSwgMTAtMTE6IGRpdHRvIGZvciBQTUMyLCAzLCA0LCA1LCA2CisgKgkxMi0xNQlhZGQgZmllbGQ6IG51bWJlciBvZiB1c2VzIG9mIFBNQzEtNCAobWF4IDQpCisgKgkxNi0xOQlzZWxlY3QgZmllbGQ6IHVuaXQgb24gYnl0ZSAwIG9mIGV2ZW50IGJ1cworICoJMjAtMjMsIDI0LTI3LCAyOC0zMSBkaXR0byBmb3IgYnl0ZXMgMSwgMiwgMworICoJMzItMzQJc2VsZWN0IGZpZWxkOiBuZXN0IChzdWJ1bml0KSBldmVudCBzZWxlY3RvcgorICovCitzdGF0aWMgaW50IHA2X2dldF9jb25zdHJhaW50KHU2NCBldmVudCwgdTY0ICptYXNrcCwgdTY0ICp2YWxwKQoreworCWludCBwbWMsIGJ5dGUsIHNoLCBzdWJ1bml0OworCXU2NCBtYXNrID0gMCwgdmFsdWUgPSAwOworCisJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCWlmIChwbWMpIHsKKwkJaWYgKHBtYyA+IDQgJiYgIShldmVudCA9PSAweDUwMDAwOSB8fCBldmVudCA9PSAweDYwMDAwNSkpCisJCQlyZXR1cm4gLTE7CisJCXNoID0gKHBtYyAtIDEpICogMjsKKwkJbWFzayB8PSAyIDw8IHNoOworCQl2YWx1ZSB8PSAxIDw8IHNoOworCX0KKwlpZiAoZXZlbnQgJiBQTV9CVVNFVkVOVF9NU0spIHsKKwkJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQlzaCA9IGJ5dGUgKiA0ICsgKDE2IC0gUE1fVU5JVF9TSCk7CisJCW1hc2sgfD0gUE1fVU5JVF9NU0tTIDw8IHNoOworCQl2YWx1ZSB8PSAodTY0KShldmVudCAmIFBNX1VOSVRfTVNLUykgPDwgc2g7CisJCWlmICgoZXZlbnQgJiBQTV9VTklUX01TS1MpID09ICg1IDw8IFBNX1VOSVRfU0gpKSB7CisJCQlzdWJ1bml0ID0gKGV2ZW50ID4+IFBNX1NVQlVOSVRfU0gpICYgUE1fU1VCVU5JVF9NU0s7CisJCQltYXNrICB8PSAodTY0KVBNX1NVQlVOSVRfTVNLIDw8IDMyOworCQkJdmFsdWUgfD0gKHU2NClzdWJ1bml0IDw8IDMyOworCQl9CisJfQorCWlmIChwbWMgPD0gNCkgeworCQltYXNrICB8PSAweDgwMDA7CS8qIGFkZCBmaWVsZCBmb3IgY291bnQgb2YgUE1DMS00IHVzZXMgKi8KKwkJdmFsdWUgfD0gMHgxMDAwOworCX0KKwkqbWFza3AgPSBtYXNrOworCSp2YWxwID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcDZfbGltaXRlZF9wbWNfZXZlbnQodTY0IGV2ZW50KQoreworCWludCBwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisKKwlyZXR1cm4gcG1jID09IDUgfHwgcG1jID09IDY7Cit9CisKKyNkZWZpbmUgTUFYX0FMVAk0CS8qIGF0IG1vc3QgNCBhbHRlcm5hdGl2ZXMgZm9yIGFueSBldmVudCAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV2ZW50X2FsdGVybmF0aXZlc1tdW01BWF9BTFRdID0geworCXsgMHgwMTMwZTgsIDB4MjAwMGY2LCAweDMwMDBmYyB9LAkvKiBQTV9QVEVHX1JFTE9BRF9WQUxJRCAqLworCXsgMHgwODAwODAsIDB4MTAwMDBkLCAweDMwMDAwYywgMHg0MDAwZjAgfSwgLyogUE1fTERfTUlTU19MMSAqLworCXsgMHgwODAwODgsIDB4MjAwMDU0LCAweDMwMDBmMCB9LAkvKiBQTV9TVF9NSVNTX0wxICovCisJeyAweDEwMDAwYSwgMHgyMDAwZjQsIDB4NjAwMDA1IH0sCS8qIFBNX1JVTl9DWUMgKi8KKwl7IDB4MTAwMDBiLCAweDIwMDBmNSB9LAkJCS8qIFBNX1JVTl9DT1VOVCAqLworCXsgMHgxMDAwMGUsIDB4NDAwMDEwIH0sCQkJLyogUE1fUFVSUiAqLworCXsgMHgxMDAwMTAsIDB4NDAwMGY4IH0sCQkJLyogUE1fRkxVU0ggKi8KKwl7IDB4MTAwMDFhLCAweDIwMDAxMCB9LAkJCS8qIFBNX01SS19JTlNUX0RJU1AgKi8KKwl7IDB4MTAwMDI2LCAweDMwMDBmOCB9LAkJCS8qIFBNX1RCX0JJVF9UUkFOUyAqLworCXsgMHgxMDAwNTQsIDB4MjAwMGYwIH0sCQkJLyogUE1fU1RfRklOICovCisJeyAweDEwMDA1NiwgMHgyMDAwZmMgfSwJCQkvKiBQTV9MMV9JQ0FDSEVfTUlTUyAqLworCXsgMHgxMDAwZjAsIDB4NDAwMDBhIH0sCQkJLyogUE1fSU5TVF9JTUNfTUFUQ0hfQ01QTCAqLworCXsgMHgxMDAwZjgsIDB4MjAwMDA4IH0sCQkJLyogUE1fR0NUX0VNUFRZX0NZQyAqLworCXsgMHgxMDAwZmMsIDB4NDAwMDA2IH0sCQkJLyogUE1fTFNVX0RFUkFUX01JU1NfQ1lDICovCisJeyAweDIwMDAwZSwgMHg0MDAwMDcgfSwJCQkvKiBQTV9MU1VfREVSQVRfTUlTUyAqLworCXsgMHgyMDAwMTIsIDB4MzAwMDEyIH0sCQkJLyogUE1fSU5TVF9ESVNQICovCisJeyAweDIwMDBmMiwgMHgzMDAwZjIgfSwJCQkvKiBQTV9JTlNUX0RJU1AgKi8KKwl7IDB4MjAwMGY4LCAweDMwMDAxMCB9LAkJCS8qIFBNX0VYVF9JTlQgKi8KKwl7IDB4MjAwMGZlLCAweDMwMDA1NiB9LAkJCS8qIFBNX0RBVEFfRlJPTV9MMk1JU1MgKi8KKwl7IDB4MmQwMDMwLCAweDMwMDAxYSB9LAkJCS8qIFBNX01SS19GUFVfRklOICovCisJeyAweDMwMDAwYSwgMHg0MDAwMTggfSwJCQkvKiBQTV9NUktfSU5TVF9GSU4gKi8KKwl7IDB4MzAwMGY2LCAweDQwMDAwZSB9LAkJCS8qIFBNX0wxX0RDQUNIRV9SRUxPQURfVkFMSUQgKi8KKwl7IDB4MzAwMGZlLCAweDQwMDA1NiB9LAkJCS8qIFBNX0RBVEFfRlJPTV9MM01JU1MgKi8KK307CisKKy8qCisgKiBUaGlzIGNvdWxkIGJlIG1hZGUgbW9yZSBlZmZpY2llbnQgd2l0aCBhIGJpbmFyeSBzZWFyY2ggb24KKyAqIGEgcHJlc29ydGVkIGxpc3QsIGlmIG5lY2Vzc2FyeQorICovCitzdGF0aWMgaW50IGZpbmRfYWx0ZXJuYXRpdmVzX2xpc3QodTY0IGV2ZW50KQoreworCWludCBpLCBqOworCXVuc2lnbmVkIGludCBhbHQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldmVudF9hbHRlcm5hdGl2ZXMpOyArK2kpIHsKKwkJaWYgKGV2ZW50IDwgZXZlbnRfYWx0ZXJuYXRpdmVzW2ldWzBdKQorCQkJcmV0dXJuIC0xOworCQlmb3IgKGogPSAwOyBqIDwgTUFYX0FMVDsgKytqKSB7CisJCQlhbHQgPSBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal07CisJCQlpZiAoIWFsdCB8fCBldmVudCA8IGFsdCkKKwkJCQlicmVhazsKKwkJCWlmIChldmVudCA9PSBhbHQpCisJCQkJcmV0dXJuIGk7CisJCX0KKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IHA2X2dldF9hbHRlcm5hdGl2ZXModTY0IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHU2NCBhbHRbXSkKK3sKKwlpbnQgaSwgaiwgbmxpbTsKKwl1bnNpZ25lZCBpbnQgcHNlbCwgcG1jOworCXVuc2lnbmVkIGludCBuYWx0ID0gMTsKKwl1NjQgYWV2ZW50OworCisJYWx0WzBdID0gZXZlbnQ7CisJbmxpbSA9IHA2X2xpbWl0ZWRfcG1jX2V2ZW50KGV2ZW50KTsKKworCS8qIGNoZWNrIHRoZSBhbHRlcm5hdGl2ZXMgdGFibGUgKi8KKwlpID0gZmluZF9hbHRlcm5hdGl2ZXNfbGlzdChldmVudCk7CisJaWYgKGkgPj0gMCkgeworCQkvKiBjb3B5IG91dCBhbHRlcm5hdGl2ZXMgZnJvbSBsaXN0ICovCisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxUOyArK2opIHsKKwkJCWFldmVudCA9IGV2ZW50X2FsdGVybmF0aXZlc1tpXVtqXTsKKwkJCWlmICghYWV2ZW50KQorCQkJCWJyZWFrOworCQkJaWYgKGFldmVudCAhPSBldmVudCkKKwkJCQlhbHRbbmFsdCsrXSA9IGFldmVudDsKKwkJCW5saW0gKz0gcDZfbGltaXRlZF9wbWNfZXZlbnQoYWV2ZW50KTsKKwkJfQorCisJfSBlbHNlIHsKKwkJLyogQ2hlY2sgZm9yIGFsdGVybmF0aXZlIHdheXMgb2YgY29tcHV0aW5nIHN1bSBldmVudHMgKi8KKwkJLyogUE1DU0VMIDB4MzIgY291bnRlciBOID09IFBNQ1NFTCAweDM0IGNvdW50ZXIgNS1OICovCisJCXBzZWwgPSBldmVudCAmIChQTV9QTUNTRUxfTVNLICYgfjEpOwkvKiBpZ25vcmUgZWRnZSBiaXQgKi8KKwkJcG1jID0gKGV2ZW50ID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQlpZiAocG1jICYmIChwc2VsID09IDB4MzIgfHwgcHNlbCA9PSAweDM0KSkKKwkJCWFsdFtuYWx0KytdID0gKChldmVudCBeIDB4NikgJiB+UE1fUE1DX01TS1MpIHwKKwkJCQkoKDUgLSBwbWMpIDw8IFBNX1BNQ19TSCk7CisKKwkJLyogUE1DU0VMIDB4MzggY291bnRlciBOID09IFBNQ1NFTCAweDNhIGNvdW50ZXIgTisvLTIgKi8KKwkJaWYgKHBtYyAmJiAocHNlbCA9PSAweDM4IHx8IHBzZWwgPT0gMHgzYSkpCisJCQlhbHRbbmFsdCsrXSA9ICgoZXZlbnQgXiAweDIpICYgflBNX1BNQ19NU0tTKSB8CisJCQkJKChwbWMgPiAyPyBwbWMgLSAyOiBwbWMgKyAyKSA8PCBQTV9QTUNfU0gpOworCX0KKworCWlmIChmbGFncyAmIFBQTVVfT05MWV9DT1VOVF9SVU4pIHsKKwkJLyoKKwkJICogV2UncmUgb25seSBjb3VudGluZyBpbiBSVU4gc3RhdGUsCisJCSAqIHNvIFBNX0NZQyBpcyBlcXVpdmFsZW50IHRvIFBNX1JVTl9DWUMsCisJCSAqIFBNX0lOU1RfQ01QTCA9PT0gUE1fUlVOX0lOU1RfQ01QTCwgUE1fUFVSUiA9PT0gUE1fUlVOX1BVUlIuCisJCSAqIFRoaXMgZG9lc24ndCBpbmNsdWRlIGFsdGVybmF0aXZlcyB0aGF0IGRvbid0IHByb3ZpZGUKKwkJICogYW55IGV4dHJhIGZsZXhpYmlsaXR5IGluIGFzc2lnbmluZyBQTUNzIChlLmcuCisJCSAqIDB4MTAwMDBhIGZvciBQTV9SVU5fQ1lDIHZzLiAweDFlIGZvciBQTV9DWUMpLgorCQkgKiBOb3RlIHRoYXQgZXZlbiB3aXRoIHRoZXNlIGFkZGl0aW9uYWwgYWx0ZXJuYXRpdmVzCisJCSAqIHdlIG5ldmVyIGVuZCB1cCB3aXRoIG1vcmUgdGhhbiA0IGFsdGVybmF0aXZlcyBmb3IgYW55IGV2ZW50LgorCQkgKi8KKwkJaiA9IG5hbHQ7CisJCWZvciAoaSA9IDA7IGkgPCBuYWx0OyArK2kpIHsKKwkJCXN3aXRjaCAoYWx0W2ldKSB7CisJCQljYXNlIDB4MWU6CS8qIFBNX0NZQyAqLworCQkJCWFsdFtqKytdID0gMHg2MDAwMDU7CS8qIFBNX1JVTl9DWUMgKi8KKwkJCQkrK25saW07CisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTAwMDBhOgkvKiBQTV9SVU5fQ1lDICovCisJCQkJYWx0W2orK10gPSAweDFlOwkvKiBQTV9DWUMgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMjoJCS8qIFBNX0lOU1RfQ01QTCAqLworCQkJCWFsdFtqKytdID0gMHg1MDAwMDk7CS8qIFBNX1JVTl9JTlNUX0NNUEwgKi8KKwkJCQkrK25saW07CisJCQkJYnJlYWs7CisJCQljYXNlIDB4NTAwMDA5OgkvKiBQTV9SVU5fSU5TVF9DTVBMICovCisJCQkJYWx0W2orK10gPSAyOwkJLyogUE1fSU5TVF9DTVBMICovCisJCQkJYnJlYWs7CisJCQljYXNlIDB4MTAwMDBlOgkvKiBQTV9QVVJSICovCisJCQkJYWx0W2orK10gPSAweDQwMDBmNDsJLyogUE1fUlVOX1BVUlIgKi8KKwkJCQlicmVhazsKKwkJCWNhc2UgMHg0MDAwZjQ6CS8qIFBNX1JVTl9QVVJSICovCisJCQkJYWx0W2orK10gPSAweDEwMDAwZTsJLyogUE1fUFVSUiAqLworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCW5hbHQgPSBqOworCX0KKworCWlmICghKGZsYWdzICYgUFBNVV9MSU1JVEVEX1BNQ19PSykgJiYgbmxpbSkgeworCQkvKiByZW1vdmUgdGhlIGxpbWl0ZWQgUE1DIGV2ZW50cyAqLworCQlqID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG5hbHQ7ICsraSkgeworCQkJaWYgKCFwNl9saW1pdGVkX3BtY19ldmVudChhbHRbaV0pKSB7CisJCQkJYWx0W2pdID0gYWx0W2ldOworCQkJCSsrajsKKwkJCX0KKwkJfQorCQluYWx0ID0gajsKKwl9IGVsc2UgaWYgKChmbGFncyAmIFBQTVVfTElNSVRFRF9QTUNfUkVRRCkgJiYgbmxpbSA8IG5hbHQpIHsKKwkJLyogcmVtb3ZlIGFsbCBidXQgdGhlIGxpbWl0ZWQgUE1DIGV2ZW50cyAqLworCQlqID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IG5hbHQ7ICsraSkgeworCQkJaWYgKHA2X2xpbWl0ZWRfcG1jX2V2ZW50KGFsdFtpXSkpIHsKKwkJCQlhbHRbal0gPSBhbHRbaV07CisJCQkJKytqOworCQkJfQorCQl9CisJCW5hbHQgPSBqOworCX0KKworCXJldHVybiBuYWx0OworfQorCitzdGF0aWMgdm9pZCBwNl9kaXNhYmxlX3BtYyh1bnNpZ25lZCBpbnQgcG1jLCB1NjQgbW1jcltdKQoreworCS8qIFNldCBQTUN4U0VMIHRvIDAgdG8gZGlzYWJsZSBQTUN4ICovCisJaWYgKHBtYyA8PSAzKQorCQltbWNyWzFdICY9IH4oMHhmZlVMIDw8IE1NQ1IxX1BNQ1NFTF9TSChwbWMpKTsKK30KKworc3RhdGljIGludCBwb3dlcjZfZ2VuZXJpY19ldmVudHNbXSA9IHsKKwlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXQkJPSAweDFlLAorCVtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMiwKKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXQk9IDB4MjgwMDMwLCAvKiBMRF9SRUZfTDEgKi8KKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQk9IDB4MzAwMDBjLCAvKiBMRF9NSVNTX0wxICovCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10JPSAweDQxMGEwLCAgLyogQlJfUFJFRCAqLworCVtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCQk9IDB4NDAwMDUyLCAvKiBCUl9NUFJFRCAqLworfTsKKworI2RlZmluZSBDKHgpCVBFUkZfQ09VTlRfSFdfQ0FDSEVfIyN4CisKKy8qCisgKiBUYWJsZSBvZiBnZW5lcmFsaXplZCBjYWNoZS1yZWxhdGVkIGV2ZW50cy4KKyAqIDAgbWVhbnMgbm90IHN1cHBvcnRlZCwgLTEgbWVhbnMgbm9uc2Vuc2ljYWwsIG90aGVyIHZhbHVlcworICogYXJlIGV2ZW50IGNvZGVzLgorICogVGhlICJEVExCIiBhbmQgIklUTEIiIGV2ZW50cyByZWxhdGUgdG8gdGhlIERFUkFUIGFuZCBJRVJBVC4KKyAqLworc3RhdGljIGludCBwb3dlcjZfY2FjaGVfZXZlbnRzW0MoTUFYKV1bQyhPUF9NQVgpXVtDKFJFU1VMVF9NQVgpXSA9IHsKKwlbQyhMMUQpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHg4MDA4MiwJMHg4MDA4MAkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJMHg4MDA4NiwJMHg4MDA4OAkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMHg4MTBhNCwJMAkJfSwKKwl9LAorCVtDKEwxSSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHgxMDAwNTYgCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4NDAwOGMsCTAJCX0sCisJfSwKKwlbQyhMTCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDE1MDczMCwJMHgyNTA1MzIJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJMHgyNTA0MzIsCTB4MTUwNDMyCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4ODEwYTYsCTAJCX0sCisJfSwKKwlbQyhEVExCKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTAsCQkweDIwMDAwZQl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCisJW0MoSVRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHg0MjBjZQkJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQkJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQkJfSwKKwl9LAorCVtDKEJQVSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkweDQzMGU2LAkweDQwMDA1Mgl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCQl9LAorCX0sCit9OworCitzdHJ1Y3QgcG93ZXJfcG11IHBvd2VyNl9wbXUgPSB7CisJLm5fY291bnRlciA9IDYsCisJLm1heF9hbHRlcm5hdGl2ZXMgPSBNQVhfQUxULAorCS5hZGRfZmllbGRzID0gMHgxNTU1LAorCS50ZXN0X2FkZGVyID0gMHgzMDAwLAorCS5jb21wdXRlX21tY3IgPSBwNl9jb21wdXRlX21tY3IsCisJLmdldF9jb25zdHJhaW50ID0gcDZfZ2V0X2NvbnN0cmFpbnQsCisJLmdldF9hbHRlcm5hdGl2ZXMgPSBwNl9nZXRfYWx0ZXJuYXRpdmVzLAorCS5kaXNhYmxlX3BtYyA9IHA2X2Rpc2FibGVfcG1jLAorCS5saW1pdGVkX3BtY19ldmVudCA9IHA2X2xpbWl0ZWRfcG1jX2V2ZW50LAorCS5mbGFncyA9IFBQTVVfTElNSVRFRF9QTUM1XzYgfCBQUE1VX0FMVF9TSVBSLAorCS5uX2dlbmVyaWMgPSBBUlJBWV9TSVpFKHBvd2VyNl9nZW5lcmljX2V2ZW50cyksCisJLmdlbmVyaWNfZXZlbnRzID0gcG93ZXI2X2dlbmVyaWNfZXZlbnRzLAorCS5jYWNoZV9ldmVudHMgPSAmcG93ZXI2X2NhY2hlX2V2ZW50cywKK307CmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNy1wbXUuYyBiL2FyY2gvcG93ZXJwYy9rZXJuZWwvcG93ZXI3LXBtdS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzZjdkMTIKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3Bvd2VycGMva2VybmVsL3Bvd2VyNy1wbXUuYwpAQCAtMCwwICsxLDM1NyBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgc3VwcG9ydCBmb3IgUE9XRVI3IHByb2Nlc3NvcnMuCisgKgorICogQ29weXJpZ2h0IDIwMDkgUGF1bCBNYWNrZXJyYXMsIElCTSBDb3Jwb3JhdGlvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uCisgKiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICovCisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CisjaW5jbHVkZSA8YXNtL3JlZy5oPgorCisvKgorICogQml0cyBpbiBldmVudCBjb2RlIGZvciBQT1dFUjcKKyAqLworI2RlZmluZSBQTV9QTUNfU0gJMTYJLyogUE1DIG51bWJlciAoMS1iYXNlZCkgZm9yIGRpcmVjdCBldmVudHMgKi8KKyNkZWZpbmUgUE1fUE1DX01TSwkweGYKKyNkZWZpbmUgUE1fUE1DX01TS1MJKFBNX1BNQ19NU0sgPDwgUE1fUE1DX1NIKQorI2RlZmluZSBQTV9VTklUX1NICTEyCS8qIFRUTU1VWCBudW1iZXIgYW5kIHNldHRpbmcgLSB1bml0IHNlbGVjdCAqLworI2RlZmluZSBQTV9VTklUX01TSwkweGYKKyNkZWZpbmUgUE1fQ09NQklORV9TSAkxMQkvKiBDb21iaW5lZCBldmVudCBiaXQgKi8KKyNkZWZpbmUgUE1fQ09NQklORV9NU0sJMQorI2RlZmluZSBQTV9DT01CSU5FX01TS1MJMHg4MDAKKyNkZWZpbmUgUE1fTDJTRUxfU0gJOAkvKiBMMiBldmVudCBzZWxlY3QgKi8KKyNkZWZpbmUgUE1fTDJTRUxfTVNLCTcKKyNkZWZpbmUgUE1fUE1DU0VMX01TSwkweGZmCisKKy8qCisgKiBCaXRzIGluIE1NQ1IxIGZvciBQT1dFUjcKKyAqLworI2RlZmluZSBNTUNSMV9UVE0wU0VMX1NICTYwCisjZGVmaW5lIE1NQ1IxX1RUTTFTRUxfU0gJNTYKKyNkZWZpbmUgTU1DUjFfVFRNMlNFTF9TSAk1MgorI2RlZmluZSBNTUNSMV9UVE0zU0VMX1NICTQ4CisjZGVmaW5lIE1NQ1IxX1RUTVNFTF9NU0sJMHhmCisjZGVmaW5lIE1NQ1IxX0wyU0VMX1NICQk0NQorI2RlZmluZSBNTUNSMV9MMlNFTF9NU0sJCTcKKyNkZWZpbmUgTU1DUjFfUE1DMV9DT01CSU5FX1NICTM1CisjZGVmaW5lIE1NQ1IxX1BNQzJfQ09NQklORV9TSAkzNAorI2RlZmluZSBNTUNSMV9QTUMzX0NPTUJJTkVfU0gJMzMKKyNkZWZpbmUgTU1DUjFfUE1DNF9DT01CSU5FX1NICTMyCisjZGVmaW5lIE1NQ1IxX1BNQzFTRUxfU0gJMjQKKyNkZWZpbmUgTU1DUjFfUE1DMlNFTF9TSAkxNgorI2RlZmluZSBNTUNSMV9QTUMzU0VMX1NICTgKKyNkZWZpbmUgTU1DUjFfUE1DNFNFTF9TSAkwCisjZGVmaW5lIE1NQ1IxX1BNQ1NFTF9TSChuKQkoTU1DUjFfUE1DMVNFTF9TSCAtIChuKSAqIDgpCisjZGVmaW5lIE1NQ1IxX1BNQ1NFTF9NU0sJMHhmZgorCisvKgorICogQml0cyBpbiBNTUNSQQorICovCisKKy8qCisgKiBMYXlvdXQgb2YgY29uc3RyYWludCBiaXRzOgorICogNjY2NjU1NTU1NTU1NTU0NDQ0NDQ0NDQ0MzMzMzMzMzMzMzIyMjIyMjIyMjIxMTExMTExMTExMDAwMDAwMDAwMAorICogMzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyAgPjw+PD48Pjw+PD48PgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5DIFA2UDVQNFAzUDJQMQorICoKKyAqIE5DIC0gbnVtYmVyIG9mIGNvdW50ZXJzCisgKiAgICAgMTU6IE5DIGVycm9yIDB4ODAwMAorICogICAgIDEyLTE0OiBudW1iZXIgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMS00IDB4NzAwMAorICoKKyAqIFA2CisgKiAgICAgMTE6IFA2IGVycm9yIDB4ODAwCisgKiAgICAgMTAtMTE6IENvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzYKKyAqCisgKiBQMS4uUDUKKyAqICAgICAwLTk6IENvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzEuLlBNQzUKKyAqLworCitzdGF0aWMgaW50IHBvd2VyN19nZXRfY29uc3RyYWludCh1NjQgZXZlbnQsIHU2NCAqbWFza3AsIHU2NCAqdmFscCkKK3sKKwlpbnQgcG1jLCBzaDsKKwl1NjQgbWFzayA9IDAsIHZhbHVlID0gMDsKKworCXBtYyA9IChldmVudCA+PiBQTV9QTUNfU0gpICYgUE1fUE1DX01TSzsKKwlpZiAocG1jKSB7CisJCWlmIChwbWMgPiA2KQorCQkJcmV0dXJuIC0xOworCQlzaCA9IChwbWMgLSAxKSAqIDI7CisJCW1hc2sgfD0gMiA8PCBzaDsKKwkJdmFsdWUgfD0gMSA8PCBzaDsKKwkJaWYgKHBtYyA+PSA1ICYmICEoZXZlbnQgPT0gMHg1MDBmYSB8fCBldmVudCA9PSAweDYwMGY0KSkKKwkJCXJldHVybiAtMTsKKwl9CisJaWYgKHBtYyA8IDUpIHsKKwkJLyogbmVlZCBhIGNvdW50ZXIgZnJvbSBQTUMxLTQgc2V0ICovCisJCW1hc2sgIHw9IDB4ODAwMDsKKwkJdmFsdWUgfD0gMHgxMDAwOworCX0KKwkqbWFza3AgPSBtYXNrOworCSp2YWxwID0gdmFsdWU7CisJcmV0dXJuIDA7Cit9CisKKyNkZWZpbmUgTUFYX0FMVAkyCS8qIGF0IG1vc3QgMiBhbHRlcm5hdGl2ZXMgZm9yIGFueSBldmVudCAqLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGV2ZW50X2FsdGVybmF0aXZlc1tdW01BWF9BTFRdID0geworCXsgMHgyMDBmMiwgMHgzMDBmMiB9LAkJLyogUE1fSU5TVF9ESVNQICovCisJeyAweDIwMGY0LCAweDYwMGY0IH0sCQkvKiBQTV9SVU5fQ1lDICovCisJeyAweDQwMGZhLCAweDUwMGZhIH0sCQkvKiBQTV9SVU5fSU5TVF9DTVBMICovCit9OworCisvKgorICogU2NhbiB0aGUgYWx0ZXJuYXRpdmVzIHRhYmxlIGZvciBhIG1hdGNoIGFuZCByZXR1cm4gdGhlCisgKiBpbmRleCBpbnRvIHRoZSBhbHRlcm5hdGl2ZXMgdGFibGUgaWYgZm91bmQsIGVsc2UgLTEuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9hbHRlcm5hdGl2ZSh1NjQgZXZlbnQpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldmVudF9hbHRlcm5hdGl2ZXMpOyArK2kpIHsKKwkJaWYgKGV2ZW50IDwgZXZlbnRfYWx0ZXJuYXRpdmVzW2ldWzBdKQorCQkJYnJlYWs7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxUICYmIGV2ZW50X2FsdGVybmF0aXZlc1tpXVtqXTsgKytqKQorCQkJaWYgKGV2ZW50ID09IGV2ZW50X2FsdGVybmF0aXZlc1tpXVtqXSkKKwkJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgczY0IGZpbmRfYWx0ZXJuYXRpdmVfZGVjb2RlKHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBwc2VsOworCisJLyogdGhpcyBvbmx5IGhhbmRsZXMgdGhlIDR4IGRlY29kZSBldmVudHMgKi8KKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJcHNlbCA9IGV2ZW50ICYgUE1fUE1DU0VMX01TSzsKKwlpZiAoKHBtYyA9PSAyIHx8IHBtYyA9PSA0KSAmJiAocHNlbCAmIH43KSA9PSAweDQwKQorCQlyZXR1cm4gZXZlbnQgLSAoMSA8PCBQTV9QTUNfU0gpICsgODsKKwlpZiAoKHBtYyA9PSAxIHx8IHBtYyA9PSAzKSAmJiAocHNlbCAmIH43KSA9PSAweDQ4KQorCQlyZXR1cm4gZXZlbnQgKyAoMSA8PCBQTV9QTUNfU0gpIC0gODsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcG93ZXI3X2dldF9hbHRlcm5hdGl2ZXModTY0IGV2ZW50LCB1bnNpZ25lZCBpbnQgZmxhZ3MsIHU2NCBhbHRbXSkKK3sKKwlpbnQgaSwgaiwgbmFsdCA9IDE7CisJczY0IGFlOworCisJYWx0WzBdID0gZXZlbnQ7CisJbmFsdCA9IDE7CisJaSA9IGZpbmRfYWx0ZXJuYXRpdmUoZXZlbnQpOworCWlmIChpID49IDApIHsKKwkJZm9yIChqID0gMDsgaiA8IE1BWF9BTFQ7ICsraikgeworCQkJYWUgPSBldmVudF9hbHRlcm5hdGl2ZXNbaV1bal07CisJCQlpZiAoYWUgJiYgYWUgIT0gZXZlbnQpCisJCQkJYWx0W25hbHQrK10gPSBhZTsKKwkJfQorCX0gZWxzZSB7CisJCWFlID0gZmluZF9hbHRlcm5hdGl2ZV9kZWNvZGUoZXZlbnQpOworCQlpZiAoYWUgPiAwKQorCQkJYWx0W25hbHQrK10gPSBhZTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBQUE1VX09OTFlfQ09VTlRfUlVOKSB7CisJCS8qCisJCSAqIFdlJ3JlIG9ubHkgY291bnRpbmcgaW4gUlVOIHN0YXRlLAorCQkgKiBzbyBQTV9DWUMgaXMgZXF1aXZhbGVudCB0byBQTV9SVU5fQ1lDCisJCSAqIGFuZCBQTV9JTlNUX0NNUEwgPT09IFBNX1JVTl9JTlNUX0NNUEwuCisJCSAqIFRoaXMgZG9lc24ndCBpbmNsdWRlIGFsdGVybmF0aXZlcyB0aGF0IGRvbid0IHByb3ZpZGUKKwkJICogYW55IGV4dHJhIGZsZXhpYmlsaXR5IGluIGFzc2lnbmluZyBQTUNzLgorCQkgKi8KKwkJaiA9IG5hbHQ7CisJCWZvciAoaSA9IDA7IGkgPCBuYWx0OyArK2kpIHsKKwkJCXN3aXRjaCAoYWx0W2ldKSB7CisJCQljYXNlIDB4MWU6CS8qIFBNX0NZQyAqLworCQkJCWFsdFtqKytdID0gMHg2MDBmNDsJLyogUE1fUlVOX0NZQyAqLworCQkJCWJyZWFrOworCQkJY2FzZSAweDYwMGY0OgkvKiBQTV9SVU5fQ1lDICovCisJCQkJYWx0W2orK10gPSAweDFlOworCQkJCWJyZWFrOworCQkJY2FzZSAweDI6CS8qIFBNX1BQQ19DTVBMICovCisJCQkJYWx0W2orK10gPSAweDUwMGZhOwkvKiBQTV9SVU5fSU5TVF9DTVBMICovCisJCQkJYnJlYWs7CisJCQljYXNlIDB4NTAwZmE6CS8qIFBNX1JVTl9JTlNUX0NNUEwgKi8KKwkJCQlhbHRbaisrXSA9IDB4MjsJLyogUE1fUFBDX0NNUEwgKi8KKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQluYWx0ID0gajsKKwl9CisKKwlyZXR1cm4gbmFsdDsKK30KKworLyoKKyAqIFJldHVybnMgMSBpZiBldmVudCBjb3VudHMgdGhpbmdzIHJlbGF0aW5nIHRvIG1hcmtlZCBpbnN0cnVjdGlvbnMKKyAqIGFuZCB0aHVzIG5lZWRzIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBzZXQsIG9yIDAgaWYgbm90LgorICovCitzdGF0aWMgaW50IHBvd2VyN19tYXJrZWRfaW5zdHJfZXZlbnQodTY0IGV2ZW50KQoreworCWludCBwbWMsIHBzZWw7CisJaW50IHVuaXQ7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJdW5pdCA9IChldmVudCA+PiBQTV9VTklUX1NIKSAmIFBNX1VOSVRfTVNLOworCXBzZWwgPSBldmVudCAmIFBNX1BNQ1NFTF9NU0sgJiB+MTsJLyogdHJpbSBvZmYgZWRnZS9sZXZlbCBiaXQgKi8KKwlpZiAocG1jID49IDUpCisJCXJldHVybiAwOworCisJc3dpdGNoIChwc2VsID4+IDQpIHsKKwljYXNlIDI6CisJCXJldHVybiBwbWMgPT0gMiB8fCBwbWMgPT0gNDsKKwljYXNlIDM6CisJCWlmIChwc2VsID09IDB4M2MpCisJCQlyZXR1cm4gcG1jID09IDE7CisJCWlmIChwc2VsID09IDB4M2UpCisJCQlyZXR1cm4gcG1jICE9IDI7CisJCXJldHVybiAxOworCWNhc2UgNDoKKwljYXNlIDU6CisJCXJldHVybiB1bml0ID09IDB4ZDsKKwljYXNlIDY6CisJCWlmIChwc2VsID09IDB4NjQpCisJCQlyZXR1cm4gcG1jID49IDM7CisJY2FzZSA4OgorCQlyZXR1cm4gdW5pdCA9PSAweGQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBvd2VyN19jb21wdXRlX21tY3IodTY0IGV2ZW50W10sIGludCBuX2V2LAorCQkJICAgICAgIHVuc2lnbmVkIGludCBod2NbXSwgdTY0IG1tY3JbXSkKK3sKKwl1NjQgbW1jcjEgPSAwOworCXU2NCBtbWNyYSA9IDA7CisJdW5zaWduZWQgaW50IHBtYywgdW5pdCwgY29tYmluZSwgbDJzZWwsIHBzZWw7CisJdW5zaWduZWQgaW50IHBtY19pbnVzZSA9IDA7CisJaW50IGk7CisKKwkvKiBGaXJzdCBwYXNzIHRvIGNvdW50IHJlc291cmNlIHVzZSAqLworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJcG1jID0gKGV2ZW50W2ldID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQlpZiAocG1jKSB7CisJCQlpZiAocG1jID4gNikKKwkJCQlyZXR1cm4gLTE7CisJCQlpZiAocG1jX2ludXNlICYgKDEgPDwgKHBtYyAtIDEpKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwbWNfaW51c2UgfD0gMSA8PCAocG1jIC0gMSk7CisJCX0KKwl9CisKKwkvKiBTZWNvbmQgcGFzczogYXNzaWduIFBNQ3MsIHNldCBhbGwgTU1DUjEgZmllbGRzICovCisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCXVuaXQgPSAoZXZlbnRbaV0gPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJY29tYmluZSA9IChldmVudFtpXSA+PiBQTV9DT01CSU5FX1NIKSAmIFBNX0NPTUJJTkVfTVNLOworCQlsMnNlbCA9IChldmVudFtpXSA+PiBQTV9MMlNFTF9TSCkgJiBQTV9MMlNFTF9NU0s7CisJCXBzZWwgPSBldmVudFtpXSAmIFBNX1BNQ1NFTF9NU0s7CisJCWlmICghcG1jKSB7CisJCQkvKiBCdXMgZXZlbnQgb3IgYW55LVBNQyBkaXJlY3QgZXZlbnQgKi8KKwkJCWZvciAocG1jID0gMDsgcG1jIDwgNDsgKytwbWMpIHsKKwkJCQlpZiAoIShwbWNfaW51c2UgJiAoMSA8PCBwbWMpKSkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlpZiAocG1jID49IDQpCisJCQkJcmV0dXJuIC0xOworCQkJcG1jX2ludXNlIHw9IDEgPDwgcG1jOworCQl9IGVsc2UgeworCQkJLyogRGlyZWN0IG9yIGRlY29kZWQgZXZlbnQgKi8KKwkJCS0tcG1jOworCQl9CisJCWlmIChwbWMgPD0gMykgeworCQkJbW1jcjEgfD0gKHU2NCkgdW5pdCA8PCAoTU1DUjFfVFRNMFNFTF9TSCAtIDQgKiBwbWMpOworCQkJbW1jcjEgfD0gKHU2NCkgY29tYmluZSA8PCAoTU1DUjFfUE1DMV9DT01CSU5FX1NIIC0gcG1jKTsKKwkJCW1tY3IxIHw9IHBzZWwgPDwgTU1DUjFfUE1DU0VMX1NIKHBtYyk7CisJCQlpZiAodW5pdCA9PSA2KQkvKiBMMiBldmVudHMgKi8KKwkJCQltbWNyMSB8PSAodTY0KSBsMnNlbCA8PCBNTUNSMV9MMlNFTF9TSDsKKwkJfQorCQlpZiAocG93ZXI3X21hcmtlZF9pbnN0cl9ldmVudChldmVudFtpXSkpCisJCQltbWNyYSB8PSBNTUNSQV9TQU1QTEVfRU5BQkxFOworCQlod2NbaV0gPSBwbWM7CisJfQorCisJLyogUmV0dXJuIE1NQ1J4IHZhbHVlcyAqLworCW1tY3JbMF0gPSAwOworCWlmIChwbWNfaW51c2UgJiAxKQorCQltbWNyWzBdID0gTU1DUjBfUE1DMUNFOworCWlmIChwbWNfaW51c2UgJiAweDNlKQorCQltbWNyWzBdIHw9IE1NQ1IwX1BNQ2pDRTsKKwltbWNyWzFdID0gbW1jcjE7CisJbW1jclsyXSA9IG1tY3JhOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwb3dlcjdfZGlzYWJsZV9wbWModW5zaWduZWQgaW50IHBtYywgdTY0IG1tY3JbXSkKK3sKKwlpZiAocG1jIDw9IDMpCisJCW1tY3JbMV0gJj0gfigweGZmVUxMIDw8IE1NQ1IxX1BNQ1NFTF9TSChwbWMpKTsKK30KKworc3RhdGljIGludCBwb3dlcjdfZ2VuZXJpY19ldmVudHNbXSA9IHsKKwlbUEVSRl9DT1VOVF9DUFVfQ1lDTEVTXSA9IDB4MWUsCisJW1BFUkZfQ09VTlRfSU5TVFJVQ1RJT05TXSA9IDIsCisJW1BFUkZfQ09VTlRfQ0FDSEVfUkVGRVJFTkNFU10gPSAweGM4ODAsCQkvKiBMRF9SRUZfTDFfTFNVICovCisJW1BFUkZfQ09VTlRfQ0FDSEVfTUlTU0VTXSA9IDB4NDAwZjAsCQkvKiBMRF9NSVNTX0wxICovCisJW1BFUkZfQ09VTlRfQlJBTkNIX0lOU1RSVUNUSU9OU10gPSAweDEwMDY4LAkvKiBCUlVfRklOICovCisJW1BFUkZfQ09VTlRfQlJBTkNIX01JU1NFU10gPSAweDQwMGY2LAkJLyogQlJfTVBSRUQgKi8KK307CisKKyNkZWZpbmUgQyh4KQlQRVJGX0NPVU5UX0hXX0NBQ0hFXyMjeAorCisvKgorICogVGFibGUgb2YgZ2VuZXJhbGl6ZWQgY2FjaGUtcmVsYXRlZCBldmVudHMuCisgKiAwIG1lYW5zIG5vdCBzdXBwb3J0ZWQsIC0xIG1lYW5zIG5vbnNlbnNpY2FsLCBvdGhlciB2YWx1ZXMKKyAqIGFyZSBldmVudCBjb2Rlcy4KKyAqLworc3RhdGljIGludCBwb3dlcjdfY2FjaGVfZXZlbnRzW0MoTUFYKV1bQyhPUF9NQVgpXVtDKFJFU1VMVF9NQVgpXSA9IHsKKwlbQyhMMUQpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHg0MDBmMCwJMHhjODgwCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CTAsCQkweDMwMGYwCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4ZDhiOCwJCTAJfSwKKwl9LAorCVtDKEwxSSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHgyMDBmYwl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTB4NDA4YSwJCTAJfSwKKwl9LAorCVtDKExMKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4NjA4MCwJCTB4NjA4NAl9LAorCQlbQyhPUF9XUklURSldID0gewkweDYwODIsCQkweDYwODYJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJMCwJCTAJfSwKKwl9LAorCVtDKERUTEIpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4MzAwZmMJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCisJfSwKKwlbQyhJVExCKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTAsCQkweDQwMGZjCX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAorCX0sCisJW0MoQlBVKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4MTAwNjgsCTB4NDAwZjYJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCisJfSwKK307CisKK3N0cnVjdCBwb3dlcl9wbXUgcG93ZXI3X3BtdSA9IHsKKwkubl9jb3VudGVyID0gNiwKKwkubWF4X2FsdGVybmF0aXZlcyA9IE1BWF9BTFQgKyAxLAorCS5hZGRfZmllbGRzID0gMHgxNTU1dWxsLAorCS50ZXN0X2FkZGVyID0gMHgzMDAwdWxsLAorCS5jb21wdXRlX21tY3IgPSBwb3dlcjdfY29tcHV0ZV9tbWNyLAorCS5nZXRfY29uc3RyYWludCA9IHBvd2VyN19nZXRfY29uc3RyYWludCwKKwkuZ2V0X2FsdGVybmF0aXZlcyA9IHBvd2VyN19nZXRfYWx0ZXJuYXRpdmVzLAorCS5kaXNhYmxlX3BtYyA9IHBvd2VyN19kaXNhYmxlX3BtYywKKwkubl9nZW5lcmljID0gQVJSQVlfU0laRShwb3dlcjdfZ2VuZXJpY19ldmVudHMpLAorCS5nZW5lcmljX2V2ZW50cyA9IHBvd2VyN19nZW5lcmljX2V2ZW50cywKKwkuY2FjaGVfZXZlbnRzID0gJnBvd2VyN19jYWNoZV9ldmVudHMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGM5NzAtcG11LmMgYi9hcmNoL3Bvd2VycGMva2VybmVsL3BwYzk3MC1wbXUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTBhMzU3Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC9wb3dlcnBjL2tlcm5lbC9wcGM5NzAtcG11LmMKQEAgLTAsMCArMSw0ODIgQEAKKy8qCisgKiBQZXJmb3JtYW5jZSBjb3VudGVyIHN1cHBvcnQgZm9yIFBQQzk3MC1mYW1pbHkgcHJvY2Vzc29ycy4KKyAqCisgKiBDb3B5cmlnaHQgMjAwOC0yMDA5IFBhdWwgTWFja2VycmFzLCBJQk0gQ29ycG9yYXRpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbgorICogMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqLworI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgorI2luY2x1ZGUgPGFzbS9yZWcuaD4KKworLyoKKyAqIEJpdHMgaW4gZXZlbnQgY29kZSBmb3IgUFBDOTcwCisgKi8KKyNkZWZpbmUgUE1fUE1DX1NICTEyCS8qIFBNQyBudW1iZXIgKDEtYmFzZWQpIGZvciBkaXJlY3QgZXZlbnRzICovCisjZGVmaW5lIFBNX1BNQ19NU0sJMHhmCisjZGVmaW5lIFBNX1VOSVRfU0gJOAkvKiBUVE1NVVggbnVtYmVyIGFuZCBzZXR0aW5nIC0gdW5pdCBzZWxlY3QgKi8KKyNkZWZpbmUgUE1fVU5JVF9NU0sJMHhmCisjZGVmaW5lIFBNX1NQQ1NFTF9TSAk2CisjZGVmaW5lIFBNX1NQQ1NFTF9NU0sJMworI2RlZmluZSBQTV9CWVRFX1NICTQJLyogQnl0ZSBudW1iZXIgb2YgZXZlbnQgYnVzIHRvIHVzZSAqLworI2RlZmluZSBQTV9CWVRFX01TSwkzCisjZGVmaW5lIFBNX1BNQ1NFTF9NU0sJMHhmCisKKy8qIFZhbHVlcyBpbiBQTV9VTklUIGZpZWxkICovCisjZGVmaW5lIFBNX05PTkUJCTAKKyNkZWZpbmUgUE1fRlBVCQkxCisjZGVmaW5lIFBNX1ZQVQkJMgorI2RlZmluZSBQTV9JU1UJCTMKKyNkZWZpbmUgUE1fSUZVCQk0CisjZGVmaW5lIFBNX0lEVQkJNQorI2RlZmluZSBQTV9TVFMJCTYKKyNkZWZpbmUgUE1fTFNVMAkJNworI2RlZmluZSBQTV9MU1UxVQk4CisjZGVmaW5lIFBNX0xTVTFMCTkKKyNkZWZpbmUgUE1fTEFTVFVOSVQJOQorCisvKgorICogQml0cyBpbiBNTUNSMCBmb3IgUFBDOTcwCisgKi8KKyNkZWZpbmUgTU1DUjBfUE1DMVNFTF9TSAk4CisjZGVmaW5lIE1NQ1IwX1BNQzJTRUxfU0gJMQorI2RlZmluZSBNTUNSX1BNQ1NFTF9NU0sJCTB4MWYKKworLyoKKyAqIEJpdHMgaW4gTU1DUjEgZm9yIFBQQzk3MAorICovCisjZGVmaW5lIE1NQ1IxX1RUTTBTRUxfU0gJNjIKKyNkZWZpbmUgTU1DUjFfVFRNMVNFTF9TSAk1OQorI2RlZmluZSBNTUNSMV9UVE0zU0VMX1NICTUzCisjZGVmaW5lIE1NQ1IxX1RUTVNFTF9NU0sJMworI2RlZmluZSBNTUNSMV9URF9DUF9EQkcwU0VMX1NICTUwCisjZGVmaW5lIE1NQ1IxX1REX0NQX0RCRzFTRUxfU0gJNDgKKyNkZWZpbmUgTU1DUjFfVERfQ1BfREJHMlNFTF9TSAk0NgorI2RlZmluZSBNTUNSMV9URF9DUF9EQkczU0VMX1NICTQ0CisjZGVmaW5lIE1NQ1IxX1BNQzFfQURERVJfU0VMX1NICTM5CisjZGVmaW5lIE1NQ1IxX1BNQzJfQURERVJfU0VMX1NICTM4CisjZGVmaW5lIE1NQ1IxX1BNQzZfQURERVJfU0VMX1NICTM3CisjZGVmaW5lIE1NQ1IxX1BNQzVfQURERVJfU0VMX1NICTM2CisjZGVmaW5lIE1NQ1IxX1BNQzhfQURERVJfU0VMX1NICTM1CisjZGVmaW5lIE1NQ1IxX1BNQzdfQURERVJfU0VMX1NICTM0CisjZGVmaW5lIE1NQ1IxX1BNQzNfQURERVJfU0VMX1NICTMzCisjZGVmaW5lIE1NQ1IxX1BNQzRfQURERVJfU0VMX1NICTMyCisjZGVmaW5lIE1NQ1IxX1BNQzNTRUxfU0gJMjcKKyNkZWZpbmUgTU1DUjFfUE1DNFNFTF9TSAkyMgorI2RlZmluZSBNTUNSMV9QTUM1U0VMX1NICTE3CisjZGVmaW5lIE1NQ1IxX1BNQzZTRUxfU0gJMTIKKyNkZWZpbmUgTU1DUjFfUE1DN1NFTF9TSAk3CisjZGVmaW5lIE1NQ1IxX1BNQzhTRUxfU0gJMgorCitzdGF0aWMgc2hvcnQgbW1jcjFfYWRkZXJfYml0c1s4XSA9IHsKKwlNTUNSMV9QTUMxX0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUMyX0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUMzX0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM0X0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM1X0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM2X0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM3X0FEREVSX1NFTF9TSCwKKwlNTUNSMV9QTUM4X0FEREVSX1NFTF9TSAorfTsKKworLyoKKyAqIEJpdHMgaW4gTU1DUkEKKyAqLworCisvKgorICogTGF5b3V0IG9mIGNvbnN0cmFpbnQgYml0czoKKyAqIDY2NjY1NTU1NTU1NTU1NDQ0NDQ0NDQ0NDMzMzMzMzMzMzMyMjIyMjIyMjIyMTExMTExMTExMTAwMDAwMDAwMDAKKyAqIDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTA5ODc2NTQzMjEwOTg3NjU0MzIxMDk4NzY1NDMyMTAKKyAqICAgICAgICAgICAgICAgPD48Pjw+WyAgPlsgID5bICA+PCAgPjwgID48ICA+PCAgPjw+PD48Pjw+PD48Pjw+PD4KKyAqICAgICAgICAgICAgICAgU1BUMFQxIFVDICBQUzEgUFMyIEIwICBCMSAgQjIgIEIzIFAxUDJQM1A0UDVQNlA3UDgKKyAqCisgKiBTUCAtIFNQQ1NFTCBjb25zdHJhaW50CisgKiAgICAgNDgtNDk6IFNQQ1NFTCB2YWx1ZSAweDNfMDAwMF8wMDAwXzAwMDAKKyAqCisgKiBUMCAtIFRUTTAgY29uc3RyYWludAorICogICAgIDQ2LTQ3OiBUVE0wU0VMIHZhbHVlICgwPUZQVSwgMj1JRlUsIDM9VlBVKSAweEMwMDBfMDAwMF8wMDAwCisgKgorICogVDEgLSBUVE0xIGNvbnN0cmFpbnQKKyAqICAgICA0NC00NTogVFRNMVNFTCB2YWx1ZSAoMD1JRFUsIDM9U1RTKSAweDMwMDBfMDAwMF8wMDAwCisgKgorICogVUMgLSB1bml0IGNvbnN0cmFpbnQ6IGNhbid0IGhhdmUgYWxsIHRocmVlIG9mIEZQVXxJRlV8VlBVLCBJU1UsIElEVXxTVFMKKyAqICAgICA0MzogVUMzIGVycm9yIDB4MDgwMF8wMDAwXzAwMDAKKyAqICAgICA0MjogRlBVfElGVXxWUFUgZXZlbnRzIG5lZWRlZCAweDA0MDBfMDAwMF8wMDAwCisgKiAgICAgNDE6IElTVSBldmVudHMgbmVlZGVkIDB4MDIwMF8wMDAwXzAwMDAKKyAqICAgICA0MDogSURVfFNUUyBldmVudHMgbmVlZGVkIDB4MDEwMF8wMDAwXzAwMDAKKyAqCisgKiBQUzEKKyAqICAgICAzOTogUFMxIGVycm9yIDB4MDA4MF8wMDAwXzAwMDAKKyAqICAgICAzNi0zODogY291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMS8yLzUvNiAweDAwNzBfMDAwMF8wMDAwCisgKgorICogUFMyCisgKiAgICAgMzU6IFBTMiBlcnJvciAweDAwMDhfMDAwMF8wMDAwCisgKiAgICAgMzItMzQ6IGNvdW50IG9mIGV2ZW50cyBuZWVkaW5nIFBNQzMvNC83LzggMHgwMDA3XzAwMDBfMDAwMAorICoKKyAqIEIwCisgKiAgICAgMjgtMzE6IEJ5dGUgMCBldmVudCBzb3VyY2UgMHhmMDAwXzAwMDAKKyAqCSAgICAgIEVuY29kaW5nIGFzIGZvciB0aGUgZXZlbnQgY29kZQorICoKKyAqIEIxLCBCMiwgQjMKKyAqICAgICAyNC0yNywgMjAtMjMsIDE2LTE5OiBCeXRlIDEsIDIsIDMgZXZlbnQgc291cmNlcworICoKKyAqIFAxCisgKiAgICAgMTU6IFAxIGVycm9yIDB4ODAwMAorICogICAgIDE0LTE1OiBDb3VudCBvZiBldmVudHMgbmVlZGluZyBQTUMxCisgKgorICogUDIuLlA4CisgKiAgICAgMC0xMzogQ291bnQgb2YgZXZlbnRzIG5lZWRpbmcgUE1DMi4uUE1DOAorICovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGRpcmVjdF9tYXJrZWRfZXZlbnRbOF0gPSB7CisJKDE8PDIpIHwgKDE8PDMpLAkvKiBQTUMxOiBQTV9NUktfR1JQX0RJU1AsIFBNX01SS19TVF9DTVBMICovCisJKDE8PDMpIHwgKDE8PDUpLAkvKiBQTUMyOiBQTV9USFJFU0hfVElNRU8sIFBNX01SS19CUlVfRklOICovCisJKDE8PDMpIHwgKDE8PDUpLAkvKiBQTUMzOiBQTV9NUktfU1RfQ01QTF9JTlQsIFBNX01SS19WTVhfRklOICovCisJKDE8PDQpIHwgKDE8PDUpLAkvKiBQTUM0OiBQTV9NUktfR1JQX0NNUEwsIFBNX01SS19DUlVfRklOICovCisJKDE8PDQpIHwgKDE8PDUpLAkvKiBQTUM1OiBQTV9HUlBfTVJLLCBQTV9NUktfR1JQX1RJTUVPICovCisJKDE8PDMpIHwgKDE8PDQpIHwgKDE8PDUpLAorCQkvKiBQTUM2OiBQTV9NUktfU1RfU1RTLCBQTV9NUktfRlhVX0ZJTiwgUE1fTVJLX0dSUF9JU1NVRUQgKi8KKwkoMTw8NCkgfCAoMTw8NSksCS8qIFBNQzc6IFBNX01SS19GUFVfRklOLCBQTV9NUktfSU5TVF9GSU4gKi8KKwkoMTw8NCkJCQkvKiBQTUM4OiBQTV9NUktfTFNVX0ZJTiAqLworfTsKKworLyoKKyAqIFJldHVybnMgMSBpZiBldmVudCBjb3VudHMgdGhpbmdzIHJlbGF0aW5nIHRvIG1hcmtlZCBpbnN0cnVjdGlvbnMKKyAqIGFuZCB0aHVzIG5lZWRzIHRoZSBNTUNSQV9TQU1QTEVfRU5BQkxFIGJpdCBzZXQsIG9yIDAgaWYgbm90LgorICovCitzdGF0aWMgaW50IHA5NzBfbWFya2VkX2luc3RyX2V2ZW50KHU2NCBldmVudCkKK3sKKwlpbnQgcG1jLCBwc2VsLCB1bml0LCBieXRlLCBiaXQ7CisJdW5zaWduZWQgaW50IG1hc2s7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJcHNlbCA9IGV2ZW50ICYgUE1fUE1DU0VMX01TSzsKKwlpZiAocG1jKSB7CisJCWlmIChkaXJlY3RfbWFya2VkX2V2ZW50W3BtYyAtIDFdICYgKDEgPDwgcHNlbCkpCisJCQlyZXR1cm4gMTsKKwkJaWYgKHBzZWwgPT0gMCkJCS8qIGFkZCBldmVudHMgKi8KKwkJCWJpdCA9IChwbWMgPD0gNCk/IHBtYyAtIDE6IDggLSBwbWM7CisJCWVsc2UgaWYgKHBzZWwgPT0gNyB8fCBwc2VsID09IDEzKQkvKiBkZWNvZGUgZXZlbnRzICovCisJCQliaXQgPSA0OworCQllbHNlCisJCQlyZXR1cm4gMDsKKwl9IGVsc2UKKwkJYml0ID0gcHNlbDsKKworCWJ5dGUgPSAoZXZlbnQgPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwl1bml0ID0gKGV2ZW50ID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJbWFzayA9IDA7CisJc3dpdGNoICh1bml0KSB7CisJY2FzZSBQTV9WUFU6CisJCW1hc2sgPSAweDRjOwkJLyogYnl0ZSAwIGJpdHMgMiwzLDYgKi8KKwljYXNlIFBNX0xTVTA6CisJCS8qIGJ5dGUgMiBiaXRzIDAsMiwzLDQsNjsgYWxsIG9mIGJ5dGUgMSAqLworCQltYXNrID0gMHgwODVkZmYwMDsKKwljYXNlIFBNX0xTVTFMOgorCQltYXNrID0gMHg1MCA8PCAyNDsJLyogYnl0ZSAzIGJpdHMgNCw2ICovCisJCWJyZWFrOworCX0KKwlyZXR1cm4gKG1hc2sgPj4gKGJ5dGUgKiA4ICsgYml0KSkgJiAxOworfQorCisvKiBNYXNrcyBhbmQgdmFsdWVzIGZvciB1c2luZyBldmVudHMgZnJvbSB0aGUgdmFyaW91cyB1bml0cyAqLworc3RhdGljIHU2NCB1bml0X2NvbnNbUE1fTEFTVFVOSVQrMV1bMl0gPSB7CisJW1BNX0ZQVV0gPSAgIHsgMHhjODAwMDAwMDAwMDB1bGwsIDB4MDQwMDAwMDAwMDAwdWxsIH0sCisJW1BNX1ZQVV0gPSAgIHsgMHhjODAwMDAwMDAwMDB1bGwsIDB4YzQwMDAwMDAwMDAwdWxsIH0sCisJW1BNX0lTVV0gPSAgIHsgMHgwODAwMDAwMDAwMDB1bGwsIDB4MDIwMDAwMDAwMDAwdWxsIH0sCisJW1BNX0lGVV0gPSAgIHsgMHhjODAwMDAwMDAwMDB1bGwsIDB4ODQwMDAwMDAwMDAwdWxsIH0sCisJW1BNX0lEVV0gPSAgIHsgMHgzODAwMDAwMDAwMDB1bGwsIDB4MDEwMDAwMDAwMDAwdWxsIH0sCisJW1BNX1NUU10gPSAgIHsgMHgzODAwMDAwMDAwMDB1bGwsIDB4MzEwMDAwMDAwMDAwdWxsIH0sCit9OworCitzdGF0aWMgaW50IHA5NzBfZ2V0X2NvbnN0cmFpbnQodTY0IGV2ZW50LCB1NjQgKm1hc2twLCB1NjQgKnZhbHApCit7CisJaW50IHBtYywgYnl0ZSwgdW5pdCwgc2gsIHNwY3NlbDsKKwl1NjQgbWFzayA9IDAsIHZhbHVlID0gMDsKKwlpbnQgZ3JwID0gLTE7CisKKwlwbWMgPSAoZXZlbnQgPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJaWYgKHBtYykgeworCQlpZiAocG1jID4gOCkKKwkJCXJldHVybiAtMTsKKwkJc2ggPSAocG1jIC0gMSkgKiAyOworCQltYXNrIHw9IDIgPDwgc2g7CisJCXZhbHVlIHw9IDEgPDwgc2g7CisJCWdycCA9ICgocG1jIC0gMSkgPj4gMSkgJiAxOworCX0KKwl1bml0ID0gKGV2ZW50ID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJaWYgKHVuaXQpIHsKKwkJaWYgKHVuaXQgPiBQTV9MQVNUVU5JVCkKKwkJCXJldHVybiAtMTsKKwkJbWFzayB8PSB1bml0X2NvbnNbdW5pdF1bMF07CisJCXZhbHVlIHw9IHVuaXRfY29uc1t1bml0XVsxXTsKKwkJYnl0ZSA9IChldmVudCA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQkvKgorCQkgKiBCdXMgZXZlbnRzIG9uIGJ5dGVzIDAgYW5kIDIgY2FuIGJlIGNvdW50ZWQKKwkJICogb24gUE1DMS8yLzUvNjsgYnl0ZXMgMSBhbmQgMyBvbiBQTUMzLzQvNy84LgorCQkgKi8KKwkJaWYgKCFwbWMpCisJCQlncnAgPSBieXRlICYgMTsKKwkJLyogU2V0IGJ5dGUgbGFuZSBzZWxlY3QgZmllbGQgKi8KKwkJbWFzayAgfD0gMHhmVUxMIDw8ICgyOCAtIDQgKiBieXRlKTsKKwkJdmFsdWUgfD0gKHU2NCl1bml0IDw8ICgyOCAtIDQgKiBieXRlKTsKKwl9CisJaWYgKGdycCA9PSAwKSB7CisJCS8qIGluY3JlbWVudCBQTUMxLzIvNS82IGZpZWxkICovCisJCW1hc2sgIHw9IDB4ODAwMDAwMDAwMHVsbDsKKwkJdmFsdWUgfD0gMHgxMDAwMDAwMDAwdWxsOworCX0gZWxzZSBpZiAoZ3JwID09IDEpIHsKKwkJLyogaW5jcmVtZW50IFBNQzMvNC83LzggZmllbGQgKi8KKwkJbWFzayAgfD0gMHg4MDAwMDAwMDB1bGw7CisJCXZhbHVlIHw9IDB4MTAwMDAwMDAwdWxsOworCX0KKwlzcGNzZWwgPSAoZXZlbnQgPj4gUE1fU1BDU0VMX1NIKSAmIFBNX1NQQ1NFTF9NU0s7CisJaWYgKHNwY3NlbCkgeworCQltYXNrICB8PSAzdWxsIDw8IDQ4OworCQl2YWx1ZSB8PSAodTY0KXNwY3NlbCA8PCA0ODsKKwl9CisJKm1hc2twID0gbWFzazsKKwkqdmFscCA9IHZhbHVlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHA5NzBfZ2V0X2FsdGVybmF0aXZlcyh1NjQgZXZlbnQsIHVuc2lnbmVkIGludCBmbGFncywgdTY0IGFsdFtdKQoreworCWFsdFswXSA9IGV2ZW50OworCisJLyogMiBhbHRlcm5hdGl2ZXMgZm9yIExTVSBlbXB0eSAqLworCWlmIChldmVudCA9PSAweDIwMDIgfHwgZXZlbnQgPT0gMHgzMDAyKSB7CisJCWFsdFsxXSA9IGV2ZW50IF4gMHgxMDAwOworCQlyZXR1cm4gMjsKKwl9CisJCQorCXJldHVybiAxOworfQorCitzdGF0aWMgaW50IHA5NzBfY29tcHV0ZV9tbWNyKHU2NCBldmVudFtdLCBpbnQgbl9ldiwKKwkJCSAgICAgdW5zaWduZWQgaW50IGh3Y1tdLCB1NjQgbW1jcltdKQoreworCXU2NCBtbWNyMCA9IDAsIG1tY3IxID0gMCwgbW1jcmEgPSAwOworCXVuc2lnbmVkIGludCBwbWMsIHVuaXQsIGJ5dGUsIHBzZWw7CisJdW5zaWduZWQgaW50IHR0bSwgZ3JwOworCXVuc2lnbmVkIGludCBwbWNfaW51c2UgPSAwOworCXVuc2lnbmVkIGludCBwbWNfZ3JwX3VzZVsyXTsKKwl1bnNpZ25lZCBjaGFyIGJ1c2J5dGVbNF07CisJdW5zaWduZWQgY2hhciB1bml0dXNlWzE2XTsKKwl1bnNpZ25lZCBjaGFyIHVuaXRtYXBbXSA9IHsgMCwgMDw8MywgMzw8MywgMTw8MywgMjw8MywgMHw0LCAzfDQgfTsKKwl1bnNpZ25lZCBjaGFyIHR0bXVzZVsyXTsKKwl1bnNpZ25lZCBjaGFyIHBtY3NlbFs4XTsKKwlpbnQgaTsKKwlpbnQgc3Bjc2VsOworCisJaWYgKG5fZXYgPiA4KQorCQlyZXR1cm4gLTE7CisKKwkvKiBGaXJzdCBwYXNzIHRvIGNvdW50IHJlc291cmNlIHVzZSAqLworCXBtY19ncnBfdXNlWzBdID0gcG1jX2dycF91c2VbMV0gPSAwOworCW1lbXNldChidXNieXRlLCAwLCBzaXplb2YoYnVzYnl0ZSkpOworCW1lbXNldCh1bml0dXNlLCAwLCBzaXplb2YodW5pdHVzZSkpOworCWZvciAoaSA9IDA7IGkgPCBuX2V2OyArK2kpIHsKKwkJcG1jID0gKGV2ZW50W2ldID4+IFBNX1BNQ19TSCkgJiBQTV9QTUNfTVNLOworCQlpZiAocG1jKSB7CisJCQlpZiAocG1jX2ludXNlICYgKDEgPDwgKHBtYyAtIDEpKSkKKwkJCQlyZXR1cm4gLTE7CisJCQlwbWNfaW51c2UgfD0gMSA8PCAocG1jIC0gMSk7CisJCQkvKiBjb3VudCAxLzIvNS82IHZzIDMvNC83LzggdXNlICovCisJCQkrK3BtY19ncnBfdXNlWygocG1jIC0gMSkgPj4gMSkgJiAxXTsKKwkJfQorCQl1bml0ID0gKGV2ZW50W2ldID4+IFBNX1VOSVRfU0gpICYgUE1fVU5JVF9NU0s7CisJCWJ5dGUgPSAoZXZlbnRbaV0gPj4gUE1fQllURV9TSCkgJiBQTV9CWVRFX01TSzsKKwkJaWYgKHVuaXQpIHsKKwkJCWlmICh1bml0ID4gUE1fTEFTVFVOSVQpCisJCQkJcmV0dXJuIC0xOworCQkJaWYgKCFwbWMpCisJCQkJKytwbWNfZ3JwX3VzZVtieXRlICYgMV07CisJCQlpZiAoYnVzYnl0ZVtieXRlXSAmJiBidXNieXRlW2J5dGVdICE9IHVuaXQpCisJCQkJcmV0dXJuIC0xOworCQkJYnVzYnl0ZVtieXRlXSA9IHVuaXQ7CisJCQl1bml0dXNlW3VuaXRdID0gMTsKKwkJfQorCX0KKwlpZiAocG1jX2dycF91c2VbMF0gPiA0IHx8IHBtY19ncnBfdXNlWzFdID4gNCkKKwkJcmV0dXJuIC0xOworCisJLyoKKwkgKiBBc3NpZ24gcmVzb3VyY2VzIGFuZCBzZXQgbXVsdGlwbGV4ZXIgc2VsZWN0cy4KKwkgKgorCSAqIFBNX0lTVSBjYW4gZ28gZWl0aGVyIG9uIFRUTTAgb3IgVFRNMSwgYnV0IHRoYXQncyB0aGUgb25seQorCSAqIGNob2ljZSB3ZSBoYXZlIHRvIGRlYWwgd2l0aC4KKwkgKi8KKwlpZiAodW5pdHVzZVtQTV9JU1VdICYKKwkgICAgKHVuaXR1c2VbUE1fRlBVXSB8IHVuaXR1c2VbUE1fSUZVXSB8IHVuaXR1c2VbUE1fVlBVXSkpCisJCXVuaXRtYXBbUE1fSVNVXSA9IDIgfCA0OwkvKiBtb3ZlIElTVSB0byBUVE0xICovCisJLyogU2V0IFRUTVswMV1TRUwgZmllbGRzLiAqLworCXR0bXVzZVswXSA9IHR0bXVzZVsxXSA9IDA7CisJZm9yIChpID0gUE1fRlBVOyBpIDw9IFBNX1NUUzsgKytpKSB7CisJCWlmICghdW5pdHVzZVtpXSkKKwkJCWNvbnRpbnVlOworCQl0dG0gPSB1bml0bWFwW2ldOworCQkrK3R0bXVzZVsodHRtID4+IDIpICYgMV07CisJCW1tY3IxIHw9ICh1NjQpKHR0bSAmIH40KSA8PCBNTUNSMV9UVE0xU0VMX1NIOworCX0KKwkvKiBDaGVjayBvbmx5IG9uZSB1bml0IHBlciBUVE14ICovCisJaWYgKHR0bXVzZVswXSA+IDEgfHwgdHRtdXNlWzFdID4gMSkKKwkJcmV0dXJuIC0xOworCisJLyogU2V0IGJ5dGUgbGFuZSBzZWxlY3QgZmllbGRzIGFuZCBUVE0zU0VMLiAqLworCWZvciAoYnl0ZSA9IDA7IGJ5dGUgPCA0OyArK2J5dGUpIHsKKwkJdW5pdCA9IGJ1c2J5dGVbYnl0ZV07CisJCWlmICghdW5pdCkKKwkJCWNvbnRpbnVlOworCQlpZiAodW5pdCA8PSBQTV9TVFMpCisJCQl0dG0gPSAodW5pdG1hcFt1bml0XSA+PiAyKSAmIDE7CisJCWVsc2UgaWYgKHVuaXQgPT0gUE1fTFNVMCkKKwkJCXR0bSA9IDI7CisJCWVsc2UgeworCQkJdHRtID0gMzsKKwkJCWlmICh1bml0ID09IFBNX0xTVTFMICYmIGJ5dGUgPj0gMikKKwkJCQltbWNyMSB8PSAxdWxsIDw8IChNTUNSMV9UVE0zU0VMX1NIICsgMyAtIGJ5dGUpOworCQl9CisJCW1tY3IxIHw9ICh1NjQpdHRtIDw8IChNTUNSMV9URF9DUF9EQkcwU0VMX1NIIC0gMiAqIGJ5dGUpOworCX0KKworCS8qIFNlY29uZCBwYXNzOiBhc3NpZ24gUE1Dcywgc2V0IFBNQ3hTRUwgYW5kIFBNQ3hfQURERVJfU0VMIGZpZWxkcyAqLworCW1lbXNldChwbWNzZWwsIDB4OCwgc2l6ZW9mKHBtY3NlbCkpOwkvKiA4IG1lYW5zIGRvbid0IGNvdW50ICovCisJZm9yIChpID0gMDsgaSA8IG5fZXY7ICsraSkgeworCQlwbWMgPSAoZXZlbnRbaV0gPj4gUE1fUE1DX1NIKSAmIFBNX1BNQ19NU0s7CisJCXVuaXQgPSAoZXZlbnRbaV0gPj4gUE1fVU5JVF9TSCkgJiBQTV9VTklUX01TSzsKKwkJYnl0ZSA9IChldmVudFtpXSA+PiBQTV9CWVRFX1NIKSAmIFBNX0JZVEVfTVNLOworCQlwc2VsID0gZXZlbnRbaV0gJiBQTV9QTUNTRUxfTVNLOworCQlpZiAoIXBtYykgeworCQkJLyogQnVzIGV2ZW50IG9yIGFueS1QTUMgZGlyZWN0IGV2ZW50ICovCisJCQlpZiAodW5pdCkKKwkJCQlwc2VsIHw9IDB4MTAgfCAoKGJ5dGUgJiAyKSA8PCAyKTsKKwkJCWVsc2UKKwkJCQlwc2VsIHw9IDg7CisJCQlmb3IgKHBtYyA9IDA7IHBtYyA8IDg7ICsrcG1jKSB7CisJCQkJaWYgKHBtY19pbnVzZSAmICgxIDw8IHBtYykpCisJCQkJCWNvbnRpbnVlOworCQkJCWdycCA9IChwbWMgPj4gMSkgJiAxOworCQkJCWlmICh1bml0KSB7CisJCQkJCWlmIChncnAgPT0gKGJ5dGUgJiAxKSkKKwkJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAocG1jX2dycF91c2VbZ3JwXSA8IDQpIHsKKwkJCQkJKytwbWNfZ3JwX3VzZVtncnBdOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCQlwbWNfaW51c2UgfD0gMSA8PCBwbWM7CisJCX0gZWxzZSB7CisJCQkvKiBEaXJlY3QgZXZlbnQgKi8KKwkJCS0tcG1jOworCQkJaWYgKHBzZWwgPT0gMCAmJiAoYnl0ZSAmIDIpKQorCQkJCS8qIGFkZCBldmVudHMgb24gaGlnaGVyLW51bWJlcmVkIGJ1cyAqLworCQkJCW1tY3IxIHw9IDF1bGwgPDwgbW1jcjFfYWRkZXJfYml0c1twbWNdOworCQl9CisJCXBtY3NlbFtwbWNdID0gcHNlbDsKKwkJaHdjW2ldID0gcG1jOworCQlzcGNzZWwgPSAoZXZlbnRbaV0gPj4gUE1fU1BDU0VMX1NIKSAmIFBNX1NQQ1NFTF9NU0s7CisJCW1tY3IxIHw9IHNwY3NlbDsKKwkJaWYgKHA5NzBfbWFya2VkX2luc3RyX2V2ZW50KGV2ZW50W2ldKSkKKwkJCW1tY3JhIHw9IE1NQ1JBX1NBTVBMRV9FTkFCTEU7CisJfQorCWZvciAocG1jID0gMDsgcG1jIDwgMjsgKytwbWMpCisJCW1tY3IwIHw9IHBtY3NlbFtwbWNdIDw8IChNTUNSMF9QTUMxU0VMX1NIIC0gNyAqIHBtYyk7CisJZm9yICg7IHBtYyA8IDg7ICsrcG1jKQorCQltbWNyMSB8PSAodTY0KXBtY3NlbFtwbWNdIDw8IChNTUNSMV9QTUMzU0VMX1NIIC0gNSAqIChwbWMgLSAyKSk7CisJaWYgKHBtY19pbnVzZSAmIDEpCisJCW1tY3IwIHw9IE1NQ1IwX1BNQzFDRTsKKwlpZiAocG1jX2ludXNlICYgMHhmZSkKKwkJbW1jcjAgfD0gTU1DUjBfUE1DakNFOworCisJbW1jcmEgfD0gMHgyMDAwOwkvKiBtYXJrIG9ubHkgb25lIElPUCBwZXIgUFBDIGluc3RydWN0aW9uICovCisKKwkvKiBSZXR1cm4gTU1DUnggdmFsdWVzICovCisJbW1jclswXSA9IG1tY3IwOworCW1tY3JbMV0gPSBtbWNyMTsKKwltbWNyWzJdID0gbW1jcmE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHA5NzBfZGlzYWJsZV9wbWModW5zaWduZWQgaW50IHBtYywgdTY0IG1tY3JbXSkKK3sKKwlpbnQgc2hpZnQsIGk7CisKKwlpZiAocG1jIDw9IDEpIHsKKwkJc2hpZnQgPSBNTUNSMF9QTUMxU0VMX1NIIC0gNyAqIHBtYzsKKwkJaSA9IDA7CisJfSBlbHNlIHsKKwkJc2hpZnQgPSBNTUNSMV9QTUMzU0VMX1NIIC0gNSAqIChwbWMgLSAyKTsKKwkJaSA9IDE7CisJfQorCS8qCisJICogU2V0dGluZyB0aGUgUE1DeFNFTCBmaWVsZCB0byAweDA4IGRpc2FibGVzIFBNQyB4LgorCSAqLworCW1tY3JbaV0gPSAobW1jcltpXSAmIH4oMHgxZlVMIDw8IHNoaWZ0KSkgfCAoMHgwOFVMIDw8IHNoaWZ0KTsKK30KKworc3RhdGljIGludCBwcGM5NzBfZ2VuZXJpY19ldmVudHNbXSA9IHsKKwlbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXQkJPSA3LAorCVtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMSwKKwlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXQk9IDB4ODgxMCwgLyogUE1fTERfUkVGX0wxICovCisJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSAweDM4MTAsIC8qIFBNX0xEX01JU1NfTDEgKi8KKwlbUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TXQk9IDB4NDMxLCAgLyogUE1fQlJfSVNTVUVEICovCisJW1BFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFU10gCQk9IDB4MzI3LCAgLyogUE1fR1JQX0JSX01QUkVEICovCit9OworCisjZGVmaW5lIEMoeCkJUEVSRl9DT1VOVF9IV19DQUNIRV8jI3gKKworLyoKKyAqIFRhYmxlIG9mIGdlbmVyYWxpemVkIGNhY2hlLXJlbGF0ZWQgZXZlbnRzLgorICogMCBtZWFucyBub3Qgc3VwcG9ydGVkLCAtMSBtZWFucyBub25zZW5zaWNhbCwgb3RoZXIgdmFsdWVzCisgKiBhcmUgZXZlbnQgY29kZXMuCisgKi8KK3N0YXRpYyBpbnQgcHBjOTcwX2NhY2hlX2V2ZW50c1tDKE1BWCldW0MoT1BfTUFYKV1bQyhSRVNVTFRfTUFYKV0gPSB7CisJW0MoTDFEKV0gPSB7CQkvKiAJUkVTVUxUX0FDQ0VTUwlSRVNVTFRfTUlTUyAqLworCQlbQyhPUF9SRUFEKV0gPSB7CTB4ODgxMCwJCTB4MzgxMAl9LAorCQlbQyhPUF9XUklURSldID0gewkweDc4MTAsCQkweDgxMwl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweDczMSwJCTAJfSwKKwl9LAorCVtDKEwxSSldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMAl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CTAsCQkwCX0sCisJfSwKKwlbQyhMTCldID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMAl9LAorCQlbQyhPUF9XUklURSldID0gewkwLAkJMAl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewkweDczMywJCTAJfSwKKwl9LAorCVtDKERUTEIpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMCwJCTB4NzA0CX0sCisJCVtDKE9QX1dSSVRFKV0gPSB7CS0xLAkJLTEJfSwKKwkJW0MoT1BfUFJFRkVUQ0gpXSA9IHsJLTEsCQktMQl9LAorCX0sCisJW0MoSVRMQildID0gewkJLyogCVJFU1VMVF9BQ0NFU1MJUkVTVUxUX01JU1MgKi8KKwkJW0MoT1BfUkVBRCldID0gewkwLAkJMHg3MDAJfSwKKwkJW0MoT1BfV1JJVEUpXSA9IHsJLTEsCQktMQl9LAorCQlbQyhPUF9QUkVGRVRDSCldID0gewktMSwJCS0xCX0sCisJfSwKKwlbQyhCUFUpXSA9IHsJCS8qIAlSRVNVTFRfQUNDRVNTCVJFU1VMVF9NSVNTICovCisJCVtDKE9QX1JFQUQpXSA9IHsJMHg0MzEsCQkweDMyNwl9LAorCQlbQyhPUF9XUklURSldID0gewktMSwJCS0xCX0sCisJCVtDKE9QX1BSRUZFVENIKV0gPSB7CS0xLAkJLTEJfSwKKwl9LAorfTsKKworc3RydWN0IHBvd2VyX3BtdSBwcGM5NzBfcG11ID0geworCS5uX2NvdW50ZXIgPSA4LAorCS5tYXhfYWx0ZXJuYXRpdmVzID0gMiwKKwkuYWRkX2ZpZWxkcyA9IDB4MDAxMTAwMDA1NTU1dWxsLAorCS50ZXN0X2FkZGVyID0gMHgwMTMzMDAwMDAwMDB1bGwsCisJLmNvbXB1dGVfbW1jciA9IHA5NzBfY29tcHV0ZV9tbWNyLAorCS5nZXRfY29uc3RyYWludCA9IHA5NzBfZ2V0X2NvbnN0cmFpbnQsCisJLmdldF9hbHRlcm5hdGl2ZXMgPSBwOTcwX2dldF9hbHRlcm5hdGl2ZXMsCisJLmRpc2FibGVfcG1jID0gcDk3MF9kaXNhYmxlX3BtYywKKwkubl9nZW5lcmljID0gQVJSQVlfU0laRShwcGM5NzBfZ2VuZXJpY19ldmVudHMpLAorCS5nZW5lcmljX2V2ZW50cyA9IHBwYzk3MF9nZW5lcmljX2V2ZW50cywKKwkuY2FjaGVfZXZlbnRzID0gJnBwYzk3MF9jYWNoZV9ldmVudHMsCit9OwpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL21tL2ZhdWx0LmMgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwppbmRleCA3Njk5Mzk0Li41YmVmZmM4IDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYworKysgYi9hcmNoL3Bvd2VycGMvbW0vZmF1bHQuYwpAQCAtMjksNiArMjksNyBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KICNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS9maXJtd2FyZS5oPgogI2luY2x1ZGUgPGFzbS9wYWdlLmg+CkBAIC0xNzAsNiArMTcxLDggQEAKIAkJZGllKCJXZWlyZCBwYWdlIGZhdWx0IiwgcmVncywgU0lHU0VHVik7CiAJfQogCisJcGVyZl9zd2NvdW50ZXJfZXZlbnQoUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUywgMSwgMCwgcmVncywgYWRkcmVzcyk7CisKIAkvKiBXaGVuIHJ1bm5pbmcgaW4gdGhlIGtlcm5lbCB3ZSBleHBlY3QgZmF1bHRzIHRvIG9jY3VyIG9ubHkgdG8KIAkgKiBhZGRyZXNzZXMgaW4gdXNlciBzcGFjZS4gIEFsbCBvdGhlciBmYXVsdHMgcmVwcmVzZW50IGVycm9ycyBpbiB0aGUKIAkgKiBrZXJuZWwgYW5kIHNob3VsZCBnZW5lcmF0ZSBhbiBPT1BTLiAgVW5mb3J0dW5hdGVseSwgaW4gdGhlIGNhc2Ugb2YgYW4KQEAgLTMwOSw2ICszMTIsOCBAQAogCX0KIAlpZiAocmV0ICYgVk1fRkFVTFRfTUFKT1IpIHsKIAkJY3VycmVudC0+bWFqX2ZsdCsrOworCQlwZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwgMCwKKwkJCQkgICAgIHJlZ3MsIGFkZHJlc3MpOwogI2lmZGVmIENPTkZJR19QUENfU01MUEFSCiAJCWlmIChmaXJtd2FyZV9oYXNfZmVhdHVyZShGV19GRUFUVVJFX0NNTykpIHsKIAkJCXByZWVtcHRfZGlzYWJsZSgpOwpAQCAtMzE2LDggKzMyMSwxMSBAQAogCQkJcHJlZW1wdF9lbmFibGUoKTsKIAkJfQogI2VuZGlmCi0JfSBlbHNlCisJfSBlbHNlIHsKIAkJY3VycmVudC0+bWluX2ZsdCsrOworCQlwZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTiwgMSwgMCwKKwkJCQkgICAgIHJlZ3MsIGFkZHJlc3MpOworCX0KIAl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwogCXJldHVybiAwOwogCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL0tjb25maWcuY3B1dHlwZSBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCmluZGV4IDlkYTc5NWUuLjczMmVlOTMgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCisrKyBiL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvS2NvbmZpZy5jcHV0eXBlCkBAIC0xLDYgKzEsNyBAQAogY29uZmlnIFBQQzY0CiAJYm9vbCAiNjQtYml0IGtlcm5lbCIKIAlkZWZhdWx0IG4KKwlzZWxlY3QgSEFWRV9QRVJGX0NPVU5URVJTCiAJaGVscAogCSAgVGhpcyBvcHRpb24gc2VsZWN0cyB3aGV0aGVyIGEgMzItYml0IG9yIGEgNjQtYml0IGtlcm5lbAogCSAgd2lsbCBiZSBidWlsdC4KZGlmZiAtLWdpdCBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMgYi9hcmNoL3Bvd2VycGMvcGxhdGZvcm1zL3BzZXJpZXMveGljcy5jCmluZGV4IDgwYjUxMzQuLmJlMzU4MWEgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9wbGF0Zm9ybXMvcHNlcmllcy94aWNzLmMKKysrIGIvYXJjaC9wb3dlcnBjL3BsYXRmb3Jtcy9wc2VyaWVzL3hpY3MuYwpAQCAtMzMzLDcgKzMzMyw3IEBACiAJbHBhcl94aXJyX2luZm9fc2V0KCgweGZmIDw8IDI0KSB8IGlycSk7CiB9CiAKLXN0YXRpYyB2b2lkIHhpY3Nfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqY3B1bWFzaykKK3N0YXRpYyBpbnQgeGljc19zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IHZpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKQogewogCXVuc2lnbmVkIGludCBpcnE7CiAJaW50IHN0YXR1czsKQEAgLTM0MiwxNCArMzQyLDE0IEBACiAKIAlpcnEgPSAodW5zaWduZWQgaW50KWlycV9tYXBbdmlycV0uaHdpcnE7CiAJaWYgKGlycSA9PSBYSUNTX0lQSSB8fCBpcnEgPT0gWElDU19JUlFfU1BVUklPVVMpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJc3RhdHVzID0gcnRhc19jYWxsKGlibV9nZXRfeGl2ZSwgMSwgMywgeGljc19zdGF0dXMsIGlycSk7CiAKIAlpZiAoc3RhdHVzKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiJXM6IGlibSxnZXQteGl2ZSBpcnE9JXUgcmV0dXJucyAlZFxuIiwKIAkJCV9fZnVuY19fLCBpcnEsIHN0YXR1cyk7Ci0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCX0KIAogCS8qCkBAIC0zNjMsNyArMzYzLDcgQEAKIAkJcHJpbnRrKEtFUk5fV0FSTklORwogCQkJIiVzOiBObyBvbmxpbmUgY3B1cyBpbiB0aGUgbWFzayAlcyBmb3IgaXJxICVkXG4iLAogCQkJX19mdW5jX18sIGNwdWxpc3QsIHZpcnEpOwotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAl9CiAKIAlzdGF0dXMgPSBydGFzX2NhbGwoaWJtX3NldF94aXZlLCAzLCAxLCBOVUxMLApAQCAtMzcyLDggKzM3MiwxMCBAQAogCWlmIChzdGF0dXMpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICIlczogaWJtLHNldC14aXZlIGlycT0ldSByZXR1cm5zICVkXG4iLAogCQkJX19mdW5jX18sIGlycSwgc3RhdHVzKTsKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgaXJxX2NoaXAgeGljc19waWNfZGlyZWN0ID0gewpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9tcGljLmMgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwppbmRleCAwZWZjMTJkLi4zNTJkOGMzIDEwMDY0NAotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYworKysgYi9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuYwpAQCAtODA3LDcgKzgwNyw3IEBACiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKLXZvaWQgbXBpY19zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2spCitpbnQgbXBpY19zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2spCiB7CiAJc3RydWN0IG1waWMgKm1waWMgPSBtcGljX2Zyb21faXJxKGlycSk7CiAJdW5zaWduZWQgaW50IHNyYyA9IG1waWNfaXJxX3RvX2h3KGlycSk7CkBAIC04MjQsNiArODI0LDggQEAKIAkJbXBpY19pcnFfd3JpdGUoc3JjLCBNUElDX0lORk8oSVJRX0RFU1RJTkFUSU9OKSwKIAkJCSAgICAgICBtcGljX3BoeXNtYXNrKGNwdXNfYWRkcih0bXApWzBdKSk7CiAJfQorCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyB1bnNpZ25lZCBpbnQgbXBpY190eXBlX3RvX3ZlY3ByaShzdHJ1Y3QgbXBpYyAqbXBpYywgdW5zaWduZWQgaW50IHR5cGUpCmRpZmYgLS1naXQgYS9hcmNoL3Bvd2VycGMvc3lzZGV2L21waWMuaCBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5oCmluZGV4IDNjZWYyYWYuLmVmZjQzM2MgMTAwNjQ0Ci0tLSBhL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5oCisrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvbXBpYy5oCkBAIC0zNiw2ICszNiw2IEBACiAKIGV4dGVybiBpbnQgbXBpY19zZXRfaXJxX3R5cGUodW5zaWduZWQgaW50IHZpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpOwogZXh0ZXJuIHZvaWQgbXBpY19zZXRfdmVjdG9yKHVuc2lnbmVkIGludCB2aXJxLCB1bnNpZ25lZCBpbnQgdmVjdG9yKTsKLWV4dGVybiB2b2lkIG1waWNfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpjcHVtYXNrKTsKK2V4dGVybiBpbnQgbXBpY19zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2spOwogCiAjZW5kaWYgLyogX1BPV0VSUENfU1lTREVWX01QSUNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb182NC5oIGIvYXJjaC9zcGFyYy9pbmNsdWRlL2FzbS90aHJlYWRfaW5mb182NC5oCmluZGV4IDYzOWFjODAuLjY1ODY1NzIgMTAwNjQ0Ci0tLSBhL2FyY2gvc3BhcmMvaW5jbHVkZS9hc20vdGhyZWFkX2luZm9fNjQuaAorKysgYi9hcmNoL3NwYXJjL2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvXzY0LmgKQEAgLTEwMiw4ICsxMDIsOCBAQAogI2RlZmluZSBUSV9LRVJOX0NOVEQxCTB4MDAwMDA0ODgKICNkZWZpbmUgVElfUENSCQkweDAwMDAwNDkwCiAjZGVmaW5lIFRJX1JFU1RBUlRfQkxPQ0sgMHgwMDAwMDQ5OAotI2RlZmluZSBUSV9LVU5BX1JFR1MJMHgwMDAwMDRjMAotI2RlZmluZSBUSV9LVU5BX0lOU04JMHgwMDAwMDRjOAorI2RlZmluZSBUSV9LVU5BX1JFR1MJMHgwMDAwMDRjOAorI2RlZmluZSBUSV9LVU5BX0lOU04JMHgwMDAwMDRkMAogI2RlZmluZSBUSV9GUFJFR1MJMHgwMDAwMDUwMAogCiAvKiBXZSBlbWJlZCB0aGlzIGluIHRoZSB1cHBlcm1vc3QgYnl0ZSBvZiB0aHJlYWRfaW5mby0+ZmxhZ3MgKi8KZGlmZiAtLWdpdCBhL2FyY2gvc3BhcmMva2VybmVsL2lycV82NC5jIGIvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMKaW5kZXggNWRlYWJlOS4uZTVlNzhmOSAxMDA2NDQKLS0tIGEvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMKKysrIGIvYXJjaC9zcGFyYy9rZXJuZWwvaXJxXzY0LmMKQEAgLTMxOCwxMCArMzE4LDEyIEBACiAJfQogfQogCi1zdGF0aWMgdm9pZCBzdW40dV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IHZpcnRfaXJxLAorc3RhdGljIGludCBzdW40dV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IHZpcnRfaXJxLAogCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXN1bjR1X2lycV9lbmFibGUodmlydF9pcnEpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIERvbid0IGRvIGFueXRoaW5nLiAgVGhlIGRlc2MtPnN0YXR1cyBjaGVjayBmb3IgSVJRX0RJU0FCTEVEIGluCkBAIC0zNzcsNyArMzc5LDcgQEAKIAkJICAgICAgIGlubywgZXJyKTsKIH0KIAotc3RhdGljIHZvaWQgc3VuNHZfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwKK3N0YXRpYyBpbnQgc3VuNHZfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwKIAkJCSAgICAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAl1bnNpZ25lZCBpbnQgaW5vID0gdmlydF9pcnFfdGFibGVbdmlydF9pcnFdLmRldl9pbm87CkBAIC0zODgsNiArMzkwLDggQEAKIAlpZiAoZXJyICE9IEhWX0VPSykKIAkJcHJpbnRrKEtFUk5fRVJSICJzdW40dl9pbnRyX3NldHRhcmdldCgleCwlbHUpOiAiCiAJCSAgICAgICAiZXJyKCVkKVxuIiwgaW5vLCBjcHVpZCwgZXJyKTsKKworCXJldHVybiAwOwogfQogCiBzdGF0aWMgdm9pZCBzdW40dl9pcnFfZGlzYWJsZSh1bnNpZ25lZCBpbnQgdmlydF9pcnEpCkBAIC00NDUsNyArNDQ5LDcgQEAKIAkJICAgICAgIGRldl9oYW5kbGUsIGRldl9pbm8sIGVycik7CiB9CiAKLXN0YXRpYyB2b2lkIHN1bjR2X3ZpcnRfc2V0X2FmZmluaXR5KHVuc2lnbmVkIGludCB2aXJ0X2lycSwKK3N0YXRpYyBpbnQgc3VuNHZfdmlydF9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IHZpcnRfaXJxLAogCQkJCSAgICBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAl1bnNpZ25lZCBsb25nIGNwdWlkLCBkZXZfaGFuZGxlLCBkZXZfaW5vOwpAQCAtNDYxLDYgKzQ2NSw4IEBACiAJCXByaW50ayhLRVJOX0VSUiAic3VuNHZfdmludHJfc2V0X3RhcmdldCglbHgsJWx4LCVsdSk6ICIKIAkJICAgICAgICJlcnIoJWQpXG4iLAogCQkgICAgICAgZGV2X2hhbmRsZSwgZGV2X2lubywgY3B1aWQsIGVycik7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc3VuNHZfdmlycV9kaXNhYmxlKHVuc2lnbmVkIGludCB2aXJ0X2lycSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L0tidWlsZCBiL2FyY2gveDg2L0tidWlsZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDhlYzM1Ci0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvS2J1aWxkCkBAIC0wLDAgKzEsMTYgQEAKKworb2JqLSQoQ09ORklHX0tWTSkgKz0ga3ZtLworCisjIFhlbiBwYXJhdmlydHVhbGl6YXRpb24gc3VwcG9ydAorb2JqLSQoQ09ORklHX1hFTikgKz0geGVuLworCisjIGxndWVzdCBwYXJhdmlydHVhbGl6YXRpb24gc3VwcG9ydAorb2JqLSQoQ09ORklHX0xHVUVTVF9HVUVTVCkgKz0gbGd1ZXN0LworCitvYmoteSArPSBrZXJuZWwvCitvYmoteSArPSBtbS8KKworb2JqLXkgKz0gY3J5cHRvLworb2JqLXkgKz0gdmRzby8KK29iai0kKENPTkZJR19JQTMyX0VNVUxBVElPTikgKz0gaWEzMi8KKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZyBiL2FyY2gveDg2L0tjb25maWcKaW5kZXggYTZlZmUwYS4uNjhmNTU3OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZworKysgYi9hcmNoL3g4Ni9LY29uZmlnCkBAIC00Nyw2ICs0NywxMSBAQAogCXNlbGVjdCBIQVZFX0tFUk5FTF9CWklQMgogCXNlbGVjdCBIQVZFX0tFUk5FTF9MWk1BCiAKK2NvbmZpZyBPVVRQVVRfRk9STUFUCisJc3RyaW5nCisJZGVmYXVsdCAiZWxmMzItaTM4NiIgaWYgWDg2XzMyCisJZGVmYXVsdCAiZWxmNjQteDg2LTY0IiBpZiBYODZfNjQKKwogY29uZmlnIEFSQ0hfREVGQ09ORklHCiAJc3RyaW5nCiAJZGVmYXVsdCAiYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZyIgaWYgWDg2XzMyCkBAIC0yNzQsMTUgKzI3OSw5IEBACiAKIAkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCiAKLWNvbmZpZyBOVU1BX01JR1JBVEVfSVJRX0RFU0MKLQlib29sICJNb3ZlIGlycSBkZXNjIHdoZW4gY2hhbmdpbmcgaXJxIHNtcF9hZmZpbml0eSIKK2NvbmZpZyBOVU1BX0lSUV9ERVNDCisJZGVmX2Jvb2wgeQogCWRlcGVuZHMgb24gU1BBUlNFX0lSUSAmJiBOVU1BCi0JZGVwZW5kcyBvbiBCUk9LRU4KLQlkZWZhdWx0IG4KLQktLS1oZWxwLS0tCi0JICBUaGlzIGVuYWJsZXMgbW92aW5nIGlycV9kZXNjIHRvIGNwdS9ub2RlIHRoYXQgaXJxIHdpbGwgdXNlIGhhbmRsZWQuCi0KLQkgIElmIHlvdSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaGVyZSwgc2F5IE4uCiAKIGNvbmZpZyBYODZfTVBQQVJTRQogCWJvb2wgIkVuYWJsZSBNUFMgdGFibGUiIGlmIEFDUEkKQEAgLTM1NSw3ICszNTQsNyBAQAogCWRlcGVuZHMgb24gWDg2XzY0CiAJZGVwZW5kcyBvbiBYODZfRVhURU5ERURfUExBVEZPUk0KIAlkZXBlbmRzIG9uIE5VTUEKLQlzZWxlY3QgWDg2X1gyQVBJQworCWRlcGVuZHMgb24gWDg2X1gyQVBJQwogCS0tLWhlbHAtLS0KIAkgIFRoaXMgb3B0aW9uIGlzIG5lZWRlZCBpbiBvcmRlciB0byBzdXBwb3J0IFNHSSBVbHRyYXZpb2xldCBzeXN0ZW1zLgogCSAgSWYgeW91IGRvbid0IGhhdmUgb25lIG9mIHRoZXNlLCB5b3Ugc2hvdWxkIHNheSBOIGhlcmUuCkBAIC03NDAsNiArNzM5LDcgQEAKIGNvbmZpZyBYODZfTE9DQUxfQVBJQwogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIFg4Nl82NCB8fCBTTVAgfHwgWDg2XzMyX05PTl9TVEFOREFSRCB8fCBYODZfVVBfQVBJQworCXNlbGVjdCBIQVZFX1BFUkZfQ09VTlRFUlMgaWYgKCFNMzg2ICYmICFNNDg2KQogCiBjb25maWcgWDg2X0lPX0FQSUMKIAlkZWZfYm9vbCB5CkBAIC0xNDY2LDkgKzE0NjYsNyBAQAogCiBjb25maWcgUEhZU0lDQUxfU1RBUlQKIAloZXggIlBoeXNpY2FsIGFkZHJlc3Mgd2hlcmUgdGhlIGtlcm5lbCBpcyBsb2FkZWQiIGlmIChFTUJFRERFRCB8fCBDUkFTSF9EVU1QKQotCWRlZmF1bHQgIjB4MTAwMDAwMCIgaWYgWDg2X05VTUFRCi0JZGVmYXVsdCAiMHgyMDAwMDAiIGlmIFg4Nl82NAotCWRlZmF1bHQgIjB4MTAwMDAwIgorCWRlZmF1bHQgIjB4MTAwMDAwMCIKIAktLS1oZWxwLS0tCiAJICBUaGlzIGdpdmVzIHRoZSBwaHlzaWNhbCBhZGRyZXNzIHdoZXJlIHRoZSBrZXJuZWwgaXMgbG9hZGVkLgogCkBAIC0xNDg3LDE1ICsxNDg1LDE1IEBACiAJICB0byBiZSBzcGVjaWZpY2FsbHkgY29tcGlsZWQgdG8gcnVuIGZyb20gYSBzcGVjaWZpYyBtZW1vcnkgYXJlYQogCSAgKG5vcm1hbGx5IGEgcmVzZXJ2ZWQgcmVnaW9uKSBhbmQgdGhpcyBvcHRpb24gY29tZXMgaGFuZHkuCiAKLQkgIFNvIGlmIHlvdSBhcmUgdXNpbmcgYnpJbWFnZSBmb3IgY2FwdHVyaW5nIHRoZSBjcmFzaCBkdW1wLCBsZWF2ZQotCSAgdGhlIHZhbHVlIGhlcmUgdW5jaGFuZ2VkIHRvIDB4MTAwMDAwIGFuZCBzZXQgQ09ORklHX1JFTE9DQVRBQkxFPXkuCi0JICBPdGhlcndpc2UgaWYgeW91IHBsYW4gdG8gdXNlIHZtbGludXggZm9yIGNhcHR1cmluZyB0aGUgY3Jhc2ggZHVtcAotCSAgY2hhbmdlIHRoaXMgdmFsdWUgdG8gc3RhcnQgb2YgdGhlIHJlc2VydmVkIHJlZ2lvbiAoVHlwaWNhbGx5IDE2TUIKLQkgIDB4MTAwMDAwMCkuIEluIG90aGVyIHdvcmRzLCBpdCBjYW4gYmUgc2V0IGJhc2VkIG9uIHRoZSAiWCIgdmFsdWUgYXMKLQkgIHNwZWNpZmllZCBpbiB0aGUgImNyYXNoa2VybmVsPVlNQFhNIiBjb21tYW5kIGxpbmUgYm9vdCBwYXJhbWV0ZXIKLQkgIHBhc3NlZCB0byB0aGUgcGFuaWMtZWQga2VybmVsLiBUeXBpY2FsbHkgdGhpcyBwYXJhbWV0ZXIgaXMgc2V0IGFzCi0JICBjcmFzaGtlcm5lbD02NE1AMTZNLiBQbGVhc2UgdGFrZSBhIGxvb2sgYXQKLQkgIERvY3VtZW50YXRpb24va2R1bXAva2R1bXAudHh0IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgY3Jhc2ggZHVtcHMuCisJICBTbyBpZiB5b3UgYXJlIHVzaW5nIGJ6SW1hZ2UgZm9yIGNhcHR1cmluZyB0aGUgY3Jhc2ggZHVtcCwKKwkgIGxlYXZlIHRoZSB2YWx1ZSBoZXJlIHVuY2hhbmdlZCB0byAweDEwMDAwMDAgYW5kIHNldAorCSAgQ09ORklHX1JFTE9DQVRBQkxFPXkuICBPdGhlcndpc2UgaWYgeW91IHBsYW4gdG8gdXNlIHZtbGludXgKKwkgIGZvciBjYXB0dXJpbmcgdGhlIGNyYXNoIGR1bXAgY2hhbmdlIHRoaXMgdmFsdWUgdG8gc3RhcnQgb2YKKwkgIHRoZSByZXNlcnZlZCByZWdpb24uICBJbiBvdGhlciB3b3JkcywgaXQgY2FuIGJlIHNldCBiYXNlZCBvbgorCSAgdGhlICJYIiB2YWx1ZSBhcyBzcGVjaWZpZWQgaW4gdGhlICJjcmFzaGtlcm5lbD1ZTUBYTSIKKwkgIGNvbW1hbmQgbGluZSBib290IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIHBhbmljLWVkCisJICBrZXJuZWwuIFBsZWFzZSB0YWtlIGEgbG9vayBhdCBEb2N1bWVudGF0aW9uL2tkdW1wL2tkdW1wLnR4dAorCSAgZm9yIG1vcmUgZGV0YWlscyBhYm91dCBjcmFzaCBkdW1wcy4KIAogCSAgVXNhZ2Ugb2YgYnpJbWFnZSBmb3IgY2FwdHVyaW5nIHRoZSBjcmFzaCBkdW1wIGlzIHJlY29tbWVuZGVkIGFzCiAJICBvbmUgZG9lcyBub3QgaGF2ZSB0byBidWlsZCB0d28ga2VybmVscy4gU2FtZSBrZXJuZWwgY2FuIGJlIHVzZWQKQEAgLTE1MDgsOCArMTUwNiw4IEBACiAJICBEb24ndCBjaGFuZ2UgdGhpcyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgogCiBjb25maWcgUkVMT0NBVEFCTEUKLQlib29sICJCdWlsZCBhIHJlbG9jYXRhYmxlIGtlcm5lbCAoRVhQRVJJTUVOVEFMKSIKLQlkZXBlbmRzIG9uIEVYUEVSSU1FTlRBTAorCWJvb2wgIkJ1aWxkIGEgcmVsb2NhdGFibGUga2VybmVsIgorCWRlZmF1bHQgeQogCS0tLWhlbHAtLS0KIAkgIFRoaXMgYnVpbGRzIGEga2VybmVsIGltYWdlIHRoYXQgcmV0YWlucyByZWxvY2F0aW9uIGluZm9ybWF0aW9uCiAJICBzbyBpdCBjYW4gYmUgbG9hZGVkIHNvbWVwbGFjZSBiZXNpZGVzIHRoZSBkZWZhdWx0IDFNQi4KQEAgLTE1MjQsMTIgKzE1MjIsMTYgQEAKIAkgIGl0IGhhcyBiZWVuIGxvYWRlZCBhdCBhbmQgdGhlIGNvbXBpbGUgdGltZSBwaHlzaWNhbCBhZGRyZXNzCiAJICAoQ09ORklHX1BIWVNJQ0FMX1NUQVJUKSBpcyBpZ25vcmVkLgogCisjIFJlbG9jYXRpb24gb24geDg2LTMyIG5lZWRzIHNvbWUgYWRkaXRpb25hbCBidWlsZCBzdXBwb3J0Citjb25maWcgWDg2X05FRURfUkVMT0NTCisJZGVmX2Jvb2wgeQorCWRlcGVuZHMgb24gWDg2XzMyICYmIFJFTE9DQVRBQkxFCisKIGNvbmZpZyBQSFlTSUNBTF9BTElHTgogCWhleAogCXByb21wdCAiQWxpZ25tZW50IHZhbHVlIHRvIHdoaWNoIGtlcm5lbCBzaG91bGQgYmUgYWxpZ25lZCIgaWYgWDg2XzMyCi0JZGVmYXVsdCAiMHgxMDAwMDAiIGlmIFg4Nl8zMgotCWRlZmF1bHQgIjB4MjAwMDAwIiBpZiBYODZfNjQKLQlyYW5nZSAweDIwMDAgMHg0MDAwMDAKKwlkZWZhdWx0ICIweDEwMDAwMDAiCisJcmFuZ2UgMHgyMDAwIDB4MTAwMDAwMAogCS0tLWhlbHAtLS0KIAkgIFRoaXMgdmFsdWUgcHV0cyB0aGUgYWxpZ25tZW50IHJlc3RyaWN0aW9ucyBvbiBwaHlzaWNhbCBhZGRyZXNzCiAJICB3aGVyZSBrZXJuZWwgaXMgbG9hZGVkIGFuZCBydW4gZnJvbS4gS2VybmVsIGlzIGNvbXBpbGVkIGZvciBhbgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZyBiL2FyY2gveDg2L0tjb25maWcuZGVidWcKaW5kZXggZDgzNTllNy4uZDEwNWYyOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvS2NvbmZpZy5kZWJ1ZworKysgYi9hcmNoL3g4Ni9LY29uZmlnLmRlYnVnCkBAIC0xNTksMTQgKzE1OSwzMCBAQAogCSAgb3B0aW9ucy4gU2VlIERvY3VtZW50YXRpb24veDg2XzY0L2Jvb3Qtb3B0aW9ucy50eHQgZm9yIG1vcmUKIAkgIGRldGFpbHMuCiAKK2NvbmZpZyBJT01NVV9TVFJFU1MKKwlib29sICJFbmFibGUgSU9NTVUgc3RyZXNzLXRlc3QgbW9kZSIKKwktLS1oZWxwLS0tCisJICBUaGlzIG9wdGlvbiBkaXNhYmxlcyB2YXJpb3VzIG9wdGltaXphdGlvbnMgaW4gSU9NTVUgcmVsYXRlZAorCSAgY29kZSB0byBkbyByZWFsIHN0cmVzcyB0ZXN0aW5nIG9mIHRoZSBJT01NVSBjb2RlLiBUaGlzIG9wdGlvbgorCSAgd2lsbCBjYXVzZSBhIHBlcmZvcm1hbmNlIGRyb3AgYW5kIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgZm9yCisJICB0ZXN0aW5nLgorCiBjb25maWcgSU9NTVVfTEVBSwogCWJvb2wgIklPTU1VIGxlYWsgdHJhY2luZyIKLQlkZXBlbmRzIG9uIERFQlVHX0tFUk5FTAotCWRlcGVuZHMgb24gSU9NTVVfREVCVUcKKwlkZXBlbmRzIG9uIElPTU1VX0RFQlVHICYmIERNQV9BUElfREVCVUcKIAktLS1oZWxwLS0tCiAJICBBZGQgYSBzaW1wbGUgbGVhayB0cmFjZXIgdG8gdGhlIElPTU1VIGNvZGUuIFRoaXMgaXMgdXNlZnVsIHdoZW4geW91CiAJICBhcmUgZGVidWdnaW5nIGEgYnVnZ3kgZGV2aWNlIGRyaXZlciB0aGF0IGxlYWtzIElPTU1VIG1hcHBpbmdzLgogCitjb25maWcgWDg2X0RTX1NFTEZURVNUCisgICAgYm9vbCAiRFMgc2VsZnRlc3QiCisgICAgZGVmYXVsdCB5CisgICAgZGVwZW5kcyBvbiBERUJVR19LRVJORUwKKyAgICBkZXBlbmRzIG9uIFg4Nl9EUworCS0tLWhlbHAtLS0KKwkgIFBlcmZvcm0gRGVidWcgU3RvcmUgc2VsZnRlc3RzIGF0IGJvb3QgdGltZS4KKwkgIElmIGluIGRvdWJ0LCBzYXkgIk4iLgorCiBjb25maWcgSEFWRV9NTUlPVFJBQ0VfU1VQUE9SVAogCWRlZl9ib29sIHkKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvTWFrZWZpbGUgYi9hcmNoL3g4Ni9NYWtlZmlsZQppbmRleCA4Yzg2YjcyLi5lZGJkMGNhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9NYWtlZmlsZQpAQCAtNyw4ICs3LDYgQEAKICAgICAgICAgS0JVSUxEX0RFRkNPTkZJRyA6PSAkKEFSQ0gpX2RlZmNvbmZpZwogZW5kaWYKIAotY29yZS0kKENPTkZJR19LVk0pICs9IGFyY2gveDg2L2t2bS8KLQogIyBCSVRTIGlzIHVzZWQgYXMgZXh0ZW5zaW9uIGZvciBmaWxlcyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIGEgMzIgYml0CiAjIGFuZCBhIDY0IGJpdCB2ZXJzaW9uIHRvIHNpbXBsaWZ5IHNoYXJlZCBNYWtlZmlsZXMuCiAjIGUuZy46IG9iai15ICs9IGZvb18kKEJJVFMpLm8KQEAgLTExOCwyMSArMTE2LDggQEAKIAogbGlicy15ICArPSBhcmNoL3g4Ni9saWIvCiAKLSMgU3ViIGFyY2hpdGVjdHVyZSBmaWxlcyB0aGF0IG5lZWRzIGxpbmtpbmcgZmlyc3QKLWNvcmUteSArPSAkKGZjb3JlLXkpCi0KLSMgWGVuIHBhcmF2aXJ0dWFsaXphdGlvbiBzdXBwb3J0Ci1jb3JlLSQoQ09ORklHX1hFTikgKz0gYXJjaC94ODYveGVuLwotCi0jIGxndWVzdCBwYXJhdmlydHVhbGl6YXRpb24gc3VwcG9ydAotY29yZS0kKENPTkZJR19MR1VFU1RfR1VFU1QpICs9IGFyY2gveDg2L2xndWVzdC8KLQotY29yZS15ICs9IGFyY2gveDg2L2tlcm5lbC8KLWNvcmUteSArPSBhcmNoL3g4Ni9tbS8KLQotY29yZS15ICs9IGFyY2gveDg2L2NyeXB0by8KLWNvcmUteSArPSBhcmNoL3g4Ni92ZHNvLwotY29yZS0kKENPTkZJR19JQTMyX0VNVUxBVElPTikgKz0gYXJjaC94ODYvaWEzMi8KKyMgU2VlIGFyY2gveDg2L0tidWlsZCBmb3IgY29udGVudCBvZiBjb3JlIHBhcnQgb2YgdGhlIGtlcm5lbAorY29yZS15ICs9IGFyY2gveDg2LwogCiAjIGRyaXZlcnMteSBhcmUgbGlua2VkIGFmdGVyIGNvcmUteQogZHJpdmVycy0kKENPTkZJR19NQVRIX0VNVUxBVElPTikgKz0gYXJjaC94ODYvbWF0aC1lbXUvCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290Ly5naXRpZ25vcmUgYi9hcmNoL3g4Ni9ib290Ly5naXRpZ25vcmUKaW5kZXggMTcyY2Y4YS4uODUxZmU5MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC8uZ2l0aWdub3JlCisrKyBiL2FyY2gveDg2L2Jvb3QvLmdpdGlnbm9yZQpAQCAtMyw2ICszLDggQEAKIGNwdXN0ci5oCiBta2NwdXN0cgogb2Zmc2V0cy5oCit2b2Zmc2V0LmgKK3pvZmZzZXQuaAogc2V0dXAKIHNldHVwLmJpbgogc2V0dXAuZWxmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L01ha2VmaWxlIGIvYXJjaC94ODYvYm9vdC9NYWtlZmlsZQppbmRleCA2NjMzYjZlLi44ZDE2YWRhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L01ha2VmaWxlCisrKyBiL2FyY2gveDg2L2Jvb3QvTWFrZWZpbGUKQEAgLTI2LDkgKzI2LDEwIEBACiB0YXJnZXRzCQkrPSBmZGltYWdlIGZkaW1hZ2UxNDQgZmRpbWFnZTI4OCBpbWFnZS5pc28gbXRvb2xzLmNvbmYKIHN1YmRpci0JCTo9IGNvbXByZXNzZWQKIAotc2V0dXAteQkJKz0gYTIwLm8gY21kbGluZS5vIGNvcHkubyBjcHUubyBjcHVjaGVjay5vIGVkZC5vCitzZXR1cC15CQkrPSBhMjAubyBiaW9zY2FsbC5vIGNtZGxpbmUubyBjb3B5Lm8gY3B1Lm8gY3B1Y2hlY2subyBlZGQubwogc2V0dXAteQkJKz0gaGVhZGVyLm8gbWFpbi5vIG1jYS5vIG1lbW9yeS5vIHBtLm8gcG1qdW1wLm8KLXNldHVwLXkJCSs9IHByaW50Zi5vIHN0cmluZy5vIHR0eS5vIHZpZGVvLm8gdmlkZW8tbW9kZS5vIHZlcnNpb24ubworc2V0dXAteQkJKz0gcHJpbnRmLm8gcmVncy5vIHN0cmluZy5vIHR0eS5vIHZpZGVvLm8gdmlkZW8tbW9kZS5vCitzZXR1cC15CQkrPSB2ZXJzaW9uLm8KIHNldHVwLSQoQ09ORklHX1g4Nl9BUE1fQk9PVCkgKz0gYXBtLm8KIAogIyBUaGUgbGluayBvcmRlciBvZiB0aGUgdmlkZW8tKi5vIG1vZHVsZXMgY2FuIG1hdHRlci4gIEluIHBhcnRpY3VsYXIsCkBAIC04NiwxOSArODcsMjcgQEAKIAogU0VUVVBfT0JKUyA9ICQoYWRkcHJlZml4ICQob2JqKS8sJChzZXR1cC15KSkKIAotc2VkLW9mZnNldHMgOj0gLWUgJ3MvXjAwKi8wLycgXAotICAgICAgICAtZSAncy9eXChbMC05YS1mQS1GXSpcKSAuIFwoaW5wdXRfZGF0YVx8aW5wdXRfZGF0YV9lbmRcKSQkL1wjZGVmaW5lIFwyIDB4XDEvcCcKK3NlZC12b2Zmc2V0IDo9IC1lICdzL15cKFswLTlhLWZBLUZdKlwpIC4gXChfdGV4dFx8X2VuZFwpJCQvXCNkZWZpbmUgVk9fXDIgMHhcMS9wJwogCi1xdWlldF9jbWRfb2Zmc2V0cyA9IE9GRlNFVFMgJEAKLSAgICAgIGNtZF9vZmZzZXRzID0gJChOTSkgJDwgfCBzZWQgLW4gJChzZWQtb2Zmc2V0cykgPiAkQAorcXVpZXRfY21kX3ZvZmZzZXQgPSBWT0ZGU0VUICRACisgICAgICBjbWRfdm9mZnNldCA9ICQoTk0pICQ8IHwgc2VkIC1uICQoc2VkLXZvZmZzZXQpID4gJEAKIAotJChvYmopL29mZnNldHMuaDogJChvYmopL2NvbXByZXNzZWQvdm1saW51eCBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLG9mZnNldHMpCit0YXJnZXRzICs9IHZvZmZzZXQuaAorJChvYmopL3ZvZmZzZXQuaDogdm1saW51eCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHZvZmZzZXQpCiAKLXRhcmdldHMgKz0gb2Zmc2V0cy5oCitzZWQtem9mZnNldCA6PSAtZSAncy9eXChbMC05YS1mQS1GXSpcKSAuIFwoc3RhcnR1cF8zMlx8aW5wdXRfZGF0YVx8X2VuZFx8el8uKlwpJCQvXCNkZWZpbmUgWk9fXDIgMHhcMS9wJworCitxdWlldF9jbWRfem9mZnNldCA9IFpPRkZTRVQgJEAKKyAgICAgIGNtZF96b2Zmc2V0ID0gJChOTSkgJDwgfCBzZWQgLW4gJChzZWQtem9mZnNldCkgPiAkQAorCit0YXJnZXRzICs9IHpvZmZzZXQuaAorJChvYmopL3pvZmZzZXQuaDogJChvYmopL2NvbXByZXNzZWQvdm1saW51eCBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLHpvZmZzZXQpCisKIAogQUZMQUdTX2hlYWRlci5vICs9IC1JJChvYmopCi0kKG9iaikvaGVhZGVyLm86ICQob2JqKS9vZmZzZXRzLmgKKyQob2JqKS9oZWFkZXIubzogJChvYmopL3ZvZmZzZXQuaCAkKG9iaikvem9mZnNldC5oCiAKIExERkxBR1Nfc2V0dXAuZWxmCTo9IC1UCiAkKG9iaikvc2V0dXAuZWxmOiAkKHNyYykvc2V0dXAubGQgJChTRVRVUF9PQkpTKSBGT1JDRQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9hMjAuYyBiL2FyY2gveDg2L2Jvb3QvYTIwLmMKaW5kZXggN2MxOWNlOC4uNjRhMzFhNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9hMjAuYworKysgYi9hcmNoL3g4Ni9ib290L2EyMC5jCkBAIC0yLDcgKzIsNyBAQAogICoKICAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKiAgIENvcHlyaWdodCAyMDA3LTIwMDggclBhdGgsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCi0gKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KICAqCiAgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgogICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KQEAgLTkwLDggKzkwLDExIEBACiAKIHN0YXRpYyB2b2lkIGVuYWJsZV9hMjBfYmlvcyh2b2lkKQogewotCWFzbSB2b2xhdGlsZSgicHVzaGZsOyBpbnQgJDB4MTU7IHBvcGZsIgotCQkgICAgIDogOiAiYSIgKCh1MTYpMHgyNDAxKSk7CisJc3RydWN0IGJpb3NyZWdzIGlyZWc7CisKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5heCA9IDB4MjQwMTsKKwlpbnRjYWxsKDB4MTUsICZpcmVnLCBOVUxMKTsKIH0KIAogc3RhdGljIHZvaWQgZW5hYmxlX2EyMF9rYmModm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvYXBtLmMgYi9hcmNoL3g4Ni9ib290L2FwbS5jCmluZGV4IDdhYTYwMzMuLmVlMjc0ODMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvYXBtLmMKKysrIGIvYXJjaC94ODYvYm9vdC9hcG0uYwpAQCAtMiw2ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgogICoKICAqICAgT3JpZ2luYWwgQVBNIEJJT1MgY2hlY2tpbmcgYnkgU3RlcGhlbiBSb3Rod2VsbCwgTWF5IDE5OTQKICAqICAgKHNmckBjYW5iLmF1dWcub3JnLmF1KQpAQCAtMTksNzUgKzIwLDU2IEBACiAKIGludCBxdWVyeV9hcG1fYmlvcyh2b2lkKQogewotCXUxNiBheCwgYngsIGN4LCBkeCwgZGk7Ci0JdTMyIGVieCwgZXNpOwotCXU4IGVycjsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAogCS8qIEFQTSBCSU9TIGluc3RhbGxhdGlvbiBjaGVjayAqLwotCWF4ID0gMHg1MzAwOwotCWJ4ID0gY3ggPSAwOwotCWFzbSB2b2xhdGlsZSgicHVzaGwgJSVlYnAgOyBpbnQgJDB4MTUgOyBwb3BsICUlZWJwIDsgc2V0YyAlMCIKLQkJICAgICA6ICI9ZCIgKGVyciksICIrYSIgKGF4KSwgIitiIiAoYngpLCAiK2MiIChjeCkKLQkJICAgICA6IDogImVzaSIsICJlZGkiKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5haCA9IDB4NTM7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOwogCi0JaWYgKGVycikKKwlpZiAob3JlZy5mbGFncyAmIFg4Nl9FRkxBR1NfQ0YpCiAJCXJldHVybiAtMTsJCS8qIE5vIEFQTSBCSU9TICovCiAKLQlpZiAoYnggIT0gMHg1MDRkKQkvKiAiUE0iIHNpZ25hdHVyZSAqLworCWlmIChvcmVnLmJ4ICE9IDB4NTA0ZCkJCS8qICJQTSIgc2lnbmF0dXJlICovCiAJCXJldHVybiAtMTsKIAotCWlmICghKGN4ICYgMHgwMikpCQkvKiAzMiBiaXRzIHN1cHBvcnRlZD8gKi8KKwlpZiAoIShvcmVnLmN4ICYgMHgwMikpCQkvKiAzMiBiaXRzIHN1cHBvcnRlZD8gKi8KIAkJcmV0dXJuIC0xOwogCiAJLyogRGlzY29ubmVjdCBmaXJzdCwganVzdCBpbiBjYXNlICovCi0JYXggPSAweDUzMDQ7Ci0JYnggPSAwOwotCWFzbSB2b2xhdGlsZSgicHVzaGwgJSVlYnAgOyBpbnQgJDB4MTUgOyBwb3BsICUlZWJwIgotCQkgICAgIDogIithIiAoYXgpLCAiK2IiIChieCkKLQkJICAgICA6IDogImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOwotCi0JLyogUGFyYW5vaWEgKi8KLQllYnggPSBlc2kgPSAwOwotCWN4ID0gZHggPSBkaSA9IDA7CisJaXJlZy5hbCA9IDB4MDQ7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgTlVMTCk7CiAKIAkvKiAzMi1iaXQgY29ubmVjdCAqLwotCWFzbSB2b2xhdGlsZSgicHVzaGwgJSVlYnAgOyBpbnQgJDB4MTUgOyBwb3BsICUlZWJwIDsgc2V0YyAlNiIKLQkJICAgICA6ICI9YSIgKGF4KSwgIitiIiAoZWJ4KSwgIitjIiAoY3gpLCAiK2QiIChkeCksCi0JCSAgICAgICAiK1MiIChlc2kpLCAiK0QiIChkaSksICI9bSIgKGVycikKLQkJICAgICA6ICJhIiAoMHg1MzAzKSk7CisJaXJlZy5hbCA9IDB4MDM7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOwogCi0JYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5jc2VnID0gYXg7Ci0JYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5vZmZzZXQgPSBlYng7Ci0JYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5jc2VnXzE2ID0gY3g7Ci0JYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5kc2VnID0gZHg7Ci0JYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5jc2VnX2xlbiA9ICh1MTYpZXNpOwotCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uY3NlZ18xNl9sZW4gPSBlc2kgPj4gMTY7Ci0JYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5kc2VnX2xlbiA9IGRpOworCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8uY3NlZyAgICAgICAgPSBvcmVnLmF4OworCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8ub2Zmc2V0ICAgICAgPSBvcmVnLmVieDsKKwlib290X3BhcmFtcy5hcG1fYmlvc19pbmZvLmNzZWdfMTYgICAgID0gb3JlZy5jeDsKKwlib290X3BhcmFtcy5hcG1fYmlvc19pbmZvLmRzZWcgICAgICAgID0gb3JlZy5keDsKKwlib290X3BhcmFtcy5hcG1fYmlvc19pbmZvLmNzZWdfbGVuICAgID0gb3JlZy5zaTsKKwlib290X3BhcmFtcy5hcG1fYmlvc19pbmZvLmNzZWdfMTZfbGVuID0gb3JlZy5oc2k7CisJYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5kc2VnX2xlbiAgICA9IG9yZWcuZGk7CiAKLQlpZiAoZXJyKQorCWlmIChvcmVnLmZsYWdzICYgWDg2X0VGTEFHU19DRikKIAkJcmV0dXJuIC0xOwogCiAJLyogUmVkbyB0aGUgaW5zdGFsbGF0aW9uIGNoZWNrIGFzIHRoZSAzMi1iaXQgY29ubmVjdDsKIAkgICBzb21lIEJJT1NlcyByZXR1cm4gZGlmZmVyZW50IGZsYWdzIHRoaXMgd2F5Li4uICovCiAKLQlheCA9IDB4NTMwMDsKLQlieCA9IGN4ID0gMDsKLQlhc20gdm9sYXRpbGUoInB1c2hsICUlZWJwIDsgaW50ICQweDE1IDsgcG9wbCAlJWVicCA7IHNldGMgJTAiCi0JCSAgICAgOiAiPWQiIChlcnIpLCAiK2EiIChheCksICIrYiIgKGJ4KSwgIitjIiAoY3gpCi0JCSAgICAgOiA6ICJlc2kiLCAiZWRpIik7CisJaXJlZy5hbCA9IDB4MDA7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOwogCi0JaWYgKGVyciB8fCBieCAhPSAweDUwNGQpIHsKKwlpZiAoKG9yZWcuZWZsYWdzICYgWDg2X0VGTEFHU19DRikgfHwgb3JlZy5ieCAhPSAweDUwNGQpIHsKIAkJLyogRmFpbHVyZSB3aXRoIDMyLWJpdCBjb25uZWN0LCB0cnkgdG8gZGlzY29uZWN0IGFuZCBpZ25vcmUgKi8KLQkJYXggPSAweDUzMDQ7Ci0JCWJ4ID0gMDsKLQkJYXNtIHZvbGF0aWxlKCJwdXNobCAlJWVicCA7IGludCAkMHgxNSA7IHBvcGwgJSVlYnAiCi0JCQkgICAgIDogIithIiAoYXgpLCAiK2IiIChieCkKLQkJCSAgICAgOiA6ICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwkJaXJlZy5hbCA9IDB4MDQ7CisJCWludGNhbGwoMHgxNSwgJmlyZWcsIE5VTEwpOwogCQlyZXR1cm4gLTE7CiAJfQogCi0JYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby52ZXJzaW9uID0gYXg7Ci0JYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5mbGFncyA9IGN4OworCWJvb3RfcGFyYW1zLmFwbV9iaW9zX2luZm8udmVyc2lvbiA9IG9yZWcuYXg7CisJYm9vdF9wYXJhbXMuYXBtX2Jpb3NfaW5mby5mbGFncyAgID0gb3JlZy5jeDsKIAlyZXR1cm4gMDsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9iaW9zY2FsbC5TIGIvYXJjaC94ODYvYm9vdC9iaW9zY2FsbC5TCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwNzc5MzcKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9ib290L2Jpb3NjYWxsLlMKQEAgLTAsMCArMSw4MiBAQAorLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KKyAqCisgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgorICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBvciAoYXQgeW91cgorICogICBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uOyBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogIkdsb3ZlIGJveCIgZm9yIEJJT1MgY2FsbHMuICBBdm9pZHMgdGhlIGNvbnN0YW50IHByb2JsZW1zIHdpdGggQklPU2VzCisgKiB0b3VjaGluZyByZWdpc3RlcnMgdGhleSBzaG91bGRuJ3QgYmUuCisgKi8KKworCS5jb2RlMTYKKwkudGV4dAorCS5nbG9ibAlpbnRjYWxsCisJLnR5cGUJaW50Y2FsbCwgQGZ1bmN0aW9uCitpbnRjYWxsOgorCS8qIFNlbGYtbW9kaWZ5IHRoZSBJTlQgaW5zdHJ1Y3Rpb24uICBVZ2x5LCBidXQgd29ya3MuICovCisJY21wYgklYWwsIDNmCisJamUJMWYKKwltb3ZiCSVhbCwgM2YKKwlqbXAJMWYJCS8qIFN5bmNocm9uaXplIHBpcGVsaW5lICovCisxOgorCS8qIFNhdmUgc3RhdGUgKi8KKwlwdXNoZmwKKwlwdXNodwklZnMKKwlwdXNodwklZ3MKKwlwdXNoYWwKKworCS8qIENvcHkgaW5wdXQgc3RhdGUgdG8gc3RhY2sgZnJhbWUgKi8KKwlzdWJ3CSQ0NCwgJXNwCisJbW92dwklZHgsICVzaQorCW1vdncJJXNwLCAlZGkKKwltb3Z3CSQxMSwgJWN4CisJcmVwOyBtb3ZzZAorCisJLyogUG9wIGZ1bGwgc3RhdGUgZnJvbSB0aGUgc3RhY2sgKi8KKwlwb3BhbAorCXBvcHcJJWdzCisJcG9wdwklZnMKKwlwb3B3CSVlcworCXBvcHcJJWRzCisJcG9wZmwKKworCS8qIEFjdHVhbCBJTlQgKi8KKwkuYnl0ZQkweGNkCQkvKiBJTlQgb3Bjb2RlICovCiszOgkuYnl0ZQkwCisKKwkvKiBQdXNoIGZ1bGwgc3RhdGUgdG8gdGhlIHN0YWNrICovCisJcHVzaGZsCisJcHVzaHcJJWRzCisJcHVzaHcJJWVzCisJcHVzaHcJJWZzCisJcHVzaHcJJWdzCisJcHVzaGFsCisKKwkvKiBSZS1lc3RhYmxpc2ggQyBlbnZpcm9ubWVudCBpbnZhcmlhbnRzICovCisJY2xkCisJbW92endsCSVzcCwgJWVzcAorCW1vdncJJWNzLCAlYXgKKwltb3Z3CSVheCwgJWRzCisJbW92dwklYXgsICVlcworCisJLyogQ29weSBvdXRwdXQgc3RhdGUgZnJvbSBzdGFjayBmcmFtZSAqLworCW1vdncJNjgoJWVzcCksICVkaQkvKiBPcmlnaW5hbCAlY3ggPT0gM3JkIGFyZ3VtZW50ICovCisJYW5kdwklZGksICVkaQorCWp6CTRmCisJbW92dwklc3AsICVzaQorCW1vdncJJDExLCAlY3gKKwlyZXA7IG1vdnNkCis0OglhZGR3CSQ0NCwgJXNwCisKKwkvKiBSZXN0b3JlIHN0YXRlIGFuZCByZXR1cm4gKi8KKwlwb3BhbAorCXBvcHcJJWdzCisJcG9wdwklZnMKKwlwb3BmbAorCXJldGwKKwkuc2l6ZQlpbnRjYWxsLCAuLWludGNhbGwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvYm9vdC5oIGIvYXJjaC94ODYvYm9vdC9ib290LmgKaW5kZXggN2IyNjkyZS4uOTgyMzlkMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9ib290LmgKKysrIGIvYXJjaC94ODYvYm9vdC9ib290LmgKQEAgLTIsNiArMiw3IEBACiAgKgogICogICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKICAqICAgQ29weXJpZ2h0IDIwMDcgclBhdGgsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KICAqCiAgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgogICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KQEAgLTI2LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlICJiaXRvcHMuaCIKICNpbmNsdWRlIDxhc20vY3B1ZmVhdHVyZS5oPgorI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3ItZmxhZ3MuaD4KIAogLyogVXNlZnVsIG1hY3JvcyAqLwogI2RlZmluZSBCVUlMRF9CVUdfT04oY29uZGl0aW9uKSAoKHZvaWQpc2l6ZW9mKGNoYXJbMSAtIDIqISEoY29uZGl0aW9uKV0pKQpAQCAtMjQxLDYgKzI0Myw0OSBAQAogLyogYXBtLmMgKi8KIGludCBxdWVyeV9hcG1fYmlvcyh2b2lkKTsKIAorLyogYmlvc2NhbGwuYyAqLworc3RydWN0IGJpb3NyZWdzIHsKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQl1MzIgZWRpOworCQkJdTMyIGVzaTsKKwkJCXUzMiBlYnA7CisJCQl1MzIgX2VzcDsKKwkJCXUzMiBlYng7CisJCQl1MzIgZWR4OworCQkJdTMyIGVjeDsKKwkJCXUzMiBlYXg7CisJCQl1MzIgX2ZzZ3M7CisJCQl1MzIgX2RzZXM7CisJCQl1MzIgZWZsYWdzOworCQl9OworCQlzdHJ1Y3QgeworCQkJdTE2IGRpLCBoZGk7CisJCQl1MTYgc2ksIGhzaTsKKwkJCXUxNiBicCwgaGJwOworCQkJdTE2IF9zcCwgX2hzcDsKKwkJCXUxNiBieCwgaGJ4OworCQkJdTE2IGR4LCBoZHg7CisJCQl1MTYgY3gsIGhjeDsKKwkJCXUxNiBheCwgaGF4OworCQkJdTE2IGdzLCBmczsKKwkJCXUxNiBlcywgZHM7CisJCQl1MTYgZmxhZ3MsIGhmbGFnczsKKwkJfTsKKwkJc3RydWN0IHsKKwkJCXU4IGRpbCwgZGloLCBlZGkyLCBlZGkzOworCQkJdTggc2lsLCBzaWgsIGVzaTIsIGVzaTM7CisJCQl1OCBicGwsIGJwaCwgZWJwMiwgZWJwMzsKKwkJCXU4IF9zcGwsIF9zcGgsIF9lc3AyLCBfZXNwMzsKKwkJCXU4IGJsLCBiaCwgZWJ4MiwgZWJ4MzsKKwkJCXU4IGRsLCBkaCwgZWR4MiwgZWR4MzsKKwkJCXU4IGNsLCBjaCwgZWN4MiwgZWN4MzsKKwkJCXU4IGFsLCBhaCwgZWF4MiwgZWF4MzsKKwkJfTsKKwl9OworfTsKK3ZvaWQgaW50Y2FsbCh1OCBpbnRfbm8sIGNvbnN0IHN0cnVjdCBiaW9zcmVncyAqaXJlZywgc3RydWN0IGJpb3NyZWdzICpvcmVnKTsKKwogLyogY21kbGluZS5jICovCiBpbnQgY21kbGluZV9maW5kX29wdGlvbihjb25zdCBjaGFyICpvcHRpb24sIGNoYXIgKmJ1ZmZlciwgaW50IGJ1ZnNpemUpOwogaW50IGNtZGxpbmVfZmluZF9vcHRpb25fYm9vbChjb25zdCBjaGFyICpvcHRpb24pOwpAQCAtMjc5LDYgKzMyNCw5IEBACiBpbnQgdnNwcmludGYoY2hhciAqYnVmLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyk7CiBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKIAorLyogcmVncy5jICovCit2b2lkIGluaXRyZWdzKHN0cnVjdCBiaW9zcmVncyAqcmVncyk7CisKIC8qIHN0cmluZy5jICovCiBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKnN0cjEsIGNvbnN0IGNoYXIgKnN0cjIpOwogc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqcywgc2l6ZV90IG1heGxlbik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvLmdpdGlnbm9yZSBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC8uZ2l0aWdub3JlCmluZGV4IDYzZWZmM2IuLjRhNDZmYWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC8uZ2l0aWdub3JlCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC8uZ2l0aWdub3JlCkBAIC0xLDMgKzEsNiBAQAogcmVsb2NzCiB2bWxpbnV4LmJpbi5hbGwKIHZtbGludXgucmVsb2NzCit2bWxpbnV4LmxkcworbWtwaWdneQorcGlnZ3kuUwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL01ha2VmaWxlCmluZGV4IDY1NTUxYzkuLjQ5YzhhNGMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9NYWtlZmlsZQorKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvTWFrZWZpbGUKQEAgLTE5LDcgKzE5LDkgQEAKIExERkxBR1MgOj0gLW0gZWxmXyQoVVRTX01BQ0hJTkUpCiBMREZMQUdTX3ZtbGludXggOj0gLVQKIAotJChvYmopL3ZtbGludXg6ICQoc3JjKS92bWxpbnV4XyQoQklUUykubGRzICQob2JqKS9oZWFkXyQoQklUUykubyAkKG9iaikvbWlzYy5vICQob2JqKS9waWdneS5vIEZPUkNFCitob3N0cHJvZ3MteQk6PSBta3BpZ2d5CisKKyQob2JqKS92bWxpbnV4OiAkKG9iaikvdm1saW51eC5sZHMgJChvYmopL2hlYWRfJChCSVRTKS5vICQob2JqKS9taXNjLm8gJChvYmopL3BpZ2d5Lm8gRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxsZCkKIAlAOgogCkBAIC0yOSw3ICszMSw3IEBACiAKIAogdGFyZ2V0cyArPSB2bWxpbnV4LmJpbi5hbGwgdm1saW51eC5yZWxvY3MgcmVsb2NzCi1ob3N0cHJvZ3MtJChDT05GSUdfWDg2XzMyKSArPSByZWxvY3MKK2hvc3Rwcm9ncy0kKENPTkZJR19YODZfTkVFRF9SRUxPQ1MpICs9IHJlbG9jcwogCiBxdWlldF9jbWRfcmVsb2NzID0gUkVMT0NTICAkQAogICAgICAgY21kX3JlbG9jcyA9ICQob2JqKS9yZWxvY3MgJDwgPiAkQDskKG9iaikvcmVsb2NzIC0tYWJzLXJlbG9jcyAkPApAQCAtMzcsNDYgKzM5LDIyIEBACiAJJChjYWxsIGlmX2NoYW5nZWQscmVsb2NzKQogCiB2bWxpbnV4LmJpbi5hbGwteSA6PSAkKG9iaikvdm1saW51eC5iaW4KLXZtbGludXguYmluLmFsbC0kKENPTkZJR19SRUxPQ0FUQUJMRSkgKz0gJChvYmopL3ZtbGludXgucmVsb2NzCi1xdWlldF9jbWRfcmVsb2NiaW4gPSBCVUlMRCAgICRACi0gICAgICBjbWRfcmVsb2NiaW4gPSBjYXQgJChmaWx0ZXItb3V0IEZPUkNFLCReKSA+ICRACi0kKG9iaikvdm1saW51eC5iaW4uYWxsOiAkKHZtbGludXguYmluLmFsbC15KSBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLHJlbG9jYmluKQordm1saW51eC5iaW4uYWxsLSQoQ09ORklHX1g4Nl9ORUVEX1JFTE9DUykgKz0gJChvYmopL3ZtbGludXgucmVsb2NzCiAKLWlmZXEgKCQoQ09ORklHX1g4Nl8zMikseSkKLQotaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCi0kKG9iaikvdm1saW51eC5iaW4uZ3o6ICQob2JqKS92bWxpbnV4LmJpbi5hbGwgRk9SQ0UKKyQob2JqKS92bWxpbnV4LmJpbi5nejogJCh2bWxpbnV4LmJpbi5hbGwteSkgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxnemlwKQotJChvYmopL3ZtbGludXguYmluLmJ6MjogJChvYmopL3ZtbGludXguYmluLmFsbCBGT1JDRQorJChvYmopL3ZtbGludXguYmluLmJ6MjogJCh2bWxpbnV4LmJpbi5hbGwteSkgRk9SQ0UKIAkkKGNhbGwgaWZfY2hhbmdlZCxiemlwMikKLSQob2JqKS92bWxpbnV4LmJpbi5sem1hOiAkKG9iaikvdm1saW51eC5iaW4uYWxsIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsbHptYSkKLWVsc2UKLSQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKLSQob2JqKS92bWxpbnV4LmJpbi5iejI6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGJ6aXAyKQotJChvYmopL3ZtbGludXguYmluLmx6bWE6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGx6bWEpCi1lbmRpZgotTERGTEFHU19waWdneS5vIDo9IC1yIC0tZm9ybWF0IGJpbmFyeSAtLW9mb3JtYXQgZWxmMzItaTM4NiAtVAotCi1lbHNlCi0KLSQob2JqKS92bWxpbnV4LmJpbi5nejogJChvYmopL3ZtbGludXguYmluIEZPUkNFCi0JJChjYWxsIGlmX2NoYW5nZWQsZ3ppcCkKLSQob2JqKS92bWxpbnV4LmJpbi5iejI6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQotCSQoY2FsbCBpZl9jaGFuZ2VkLGJ6aXAyKQotJChvYmopL3ZtbGludXguYmluLmx6bWE6ICQob2JqKS92bWxpbnV4LmJpbiBGT1JDRQorJChvYmopL3ZtbGludXguYmluLmx6bWE6ICQodm1saW51eC5iaW4uYWxsLXkpIEZPUkNFCiAJJChjYWxsIGlmX2NoYW5nZWQsbHptYSkKIAotTERGTEFHU19waWdneS5vIDo9IC1yIC0tZm9ybWF0IGJpbmFyeSAtLW9mb3JtYXQgZWxmNjQteDg2LTY0IC1UCi1lbmRpZgorc3VmZml4LSQoQ09ORklHX0tFUk5FTF9HWklQKQk6PSBnegorc3VmZml4LSQoQ09ORklHX0tFUk5FTF9CWklQMikJOj0gYnoyCitzdWZmaXgtJChDT05GSUdfS0VSTkVMX0xaTUEpCTo9IGx6bWEKIAotc3VmZml4XyQoQ09ORklHX0tFUk5FTF9HWklQKSAgPSBnegotc3VmZml4XyQoQ09ORklHX0tFUk5FTF9CWklQMikgPSBiejIKLXN1ZmZpeF8kKENPTkZJR19LRVJORUxfTFpNQSkgID0gbHptYQorcXVpZXRfY21kX21rcGlnZ3kgPSBNS1BJR0dZICRACisgICAgICBjbWRfbWtwaWdneSA9ICQob2JqKS9ta3BpZ2d5ICQ8ID4gJEAgfHwgKCBybSAtZiAkQCA7IGZhbHNlICkKIAotJChvYmopL3BpZ2d5Lm86ICQob2JqKS92bWxpbnV4LnNjciAkKG9iaikvdm1saW51eC5iaW4uJChzdWZmaXhfeSkgRk9SQ0UKLQkkKGNhbGwgaWZfY2hhbmdlZCxsZCkKK3RhcmdldHMgKz0gcGlnZ3kuUworJChvYmopL3BpZ2d5LlM6ICQob2JqKS92bWxpbnV4LmJpbi4kKHN1ZmZpeC15KSAkKG9iaikvbWtwaWdneSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLG1rcGlnZ3kpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfMzIuUwppbmRleCAzYThhODY2Li43NWU0ZjAwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF8zMi5TCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzMyLlMKQEAgLTEyLDE2ICsxMiwxNiBAQAogICogdGhlIHBhZ2UgZGlyZWN0b3J5LiBbQWNjb3JkaW5nIHRvIGNvbW1lbnRzIGV0YyBlbHNld2hlcmUgb24gYSBjb21wcmVzc2VkCiAgKiBrZXJuZWwgaXQgd2lsbCBlbmQgdXAgYXQgMHgxMDAwICsgMU1iIEkgaG9wZSBzbyBhcyBJIGFzc3VtZSB0aGlzLiAtIEFDXQogICoKLSAqIFBhZ2UgMCBpcyBkZWxpYmVyYXRlbHkga2VwdCBzYWZlLCBzaW5jZSBTeXN0ZW0gTWFuYWdlbWVudCBNb2RlIGNvZGUgaW4gCisgKiBQYWdlIDAgaXMgZGVsaWJlcmF0ZWx5IGtlcHQgc2FmZSwgc2luY2UgU3lzdGVtIE1hbmFnZW1lbnQgTW9kZSBjb2RlIGluCiAgKiBsYXB0b3BzIG1heSBuZWVkIHRvIGFjY2VzcyB0aGUgQklPUyBkYXRhIHN0b3JlZCB0aGVyZS4gIFRoaXMgaXMgYWxzbwotICogdXNlZnVsIGZvciBmdXR1cmUgZGV2aWNlIGRyaXZlcnMgdGhhdCBlaXRoZXIgYWNjZXNzIHRoZSBCSU9TIHZpYSBWTTg2IAorICogdXNlZnVsIGZvciBmdXR1cmUgZGV2aWNlIGRyaXZlcnMgdGhhdCBlaXRoZXIgYWNjZXNzIHRoZSBCSU9TIHZpYSBWTTg2CiAgKiBtb2RlLgogICovCiAKIC8qCiAgKiBIaWdoIGxvYWRlZCBzdHVmZiBieSBIYW5zIExlcm1lbiAmIFdlcm5lciBBbG1lc2JlcmdlciwgRmViLiAxOTk2CiAgKi8KLS50ZXh0CisJLnRleHQKIAogI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KICNpbmNsdWRlIDxhc20vc2VnbWVudC5oPgpAQCAtMjksMTYxICsyOSwxNTEgQEAKICNpbmNsdWRlIDxhc20vYm9vdC5oPgogI2luY2x1ZGUgPGFzbS9hc20tb2Zmc2V0cy5oPgogCi0uc2VjdGlvbiAiLnRleHQuaGVhZCIsImF4IixAcHJvZ2JpdHMKKwkuc2VjdGlvbiAiLnRleHQuaGVhZCIsImF4IixAcHJvZ2JpdHMKIEVOVFJZKHN0YXJ0dXBfMzIpCiAJY2xkCi0JLyogdGVzdCBLRUVQX1NFR01FTlRTIGZsYWcgdG8gc2VlIGlmIHRoZSBib290bG9hZGVyIGlzIGFza2luZwotCSAqIHVzIHRvIG5vdCByZWxvYWQgc2VnbWVudHMgKi8KLQl0ZXN0YiAkKDE8PDYpLCBCUF9sb2FkZmxhZ3MoJWVzaSkKLQlqbnogMWYKKwkvKgorCSAqIFRlc3QgS0VFUF9TRUdNRU5UUyBmbGFnIHRvIHNlZSBpZiB0aGUgYm9vdGxvYWRlciBpcyBhc2tpbmcKKwkgKiB1cyB0byBub3QgcmVsb2FkIHNlZ21lbnRzCisJICovCisJdGVzdGIJJCgxPDw2KSwgQlBfbG9hZGZsYWdzKCVlc2kpCisJam56CTFmCiAKIAljbGkKLQltb3ZsICQoX19CT09UX0RTKSwlZWF4Ci0JbW92bCAlZWF4LCVkcwotCW1vdmwgJWVheCwlZXMKLQltb3ZsICVlYXgsJWZzCi0JbW92bCAlZWF4LCVncwotCW1vdmwgJWVheCwlc3MKKwltb3ZsCSRfX0JPT1RfRFMsICVlYXgKKwltb3ZsCSVlYXgsICVkcworCW1vdmwJJWVheCwgJWVzCisJbW92bAklZWF4LCAlZnMKKwltb3ZsCSVlYXgsICVncworCW1vdmwJJWVheCwgJXNzCiAxOgogCi0vKiBDYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gd2hlcmUgd2Ugd2VyZSBjb21waWxlZCB0byBydW4KKy8qCisgKiBDYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gd2hlcmUgd2Ugd2VyZSBjb21waWxlZCB0byBydW4KICAqIGF0IGFuZCB3aGVyZSB3ZSB3ZXJlIGFjdHVhbGx5IGxvYWRlZCBhdC4gIFRoaXMgY2FuIG9ubHkgYmUgZG9uZQogICogd2l0aCBhIHNob3J0IGxvY2FsIGNhbGwgb24geDg2LiAgTm90aGluZyAgZWxzZSB3aWxsIHRlbGwgdXMgd2hhdAogICogYWRkcmVzcyB3ZSBhcmUgcnVubmluZyBhdC4gIFRoZSByZXNlcnZlZCBjaHVuayBvZiB0aGUgcmVhbC1tb2RlCiAgKiBkYXRhIGF0IDB4MWU0IChkZWZpbmVkIGFzIGEgc2NyYXRjaCBmaWVsZCkgYXJlIHVzZWQgYXMgdGhlIHN0YWNrCiAgKiBmb3IgdGhpcyBjYWxjdWxhdGlvbi4gT25seSA0IGJ5dGVzIGFyZSBuZWVkZWQuCiAgKi8KLQlsZWFsICgweDFlNCs0KSglZXNpKSwgJWVzcAotCWNhbGwgMWYKLTE6CXBvcGwgJWVicAotCXN1YmwgJDFiLCAlZWJwCisJbGVhbAkoQlBfc2NyYXRjaCs0KSglZXNpKSwgJWVzcAorCWNhbGwJMWYKKzE6CXBvcGwJJWVicAorCXN1YmwJJDFiLCAlZWJwCiAKLS8qICVlYnAgY29udGFpbnMgdGhlIGFkZHJlc3Mgd2UgYXJlIGxvYWRlZCBhdCBieSB0aGUgYm9vdCBsb2FkZXIgYW5kICVlYngKKy8qCisgKiAlZWJwIGNvbnRhaW5zIHRoZSBhZGRyZXNzIHdlIGFyZSBsb2FkZWQgYXQgYnkgdGhlIGJvb3QgbG9hZGVyIGFuZCAlZWJ4CiAgKiBjb250YWlucyB0aGUgYWRkcmVzcyB3aGVyZSB3ZSBzaG91bGQgbW92ZSB0aGUga2VybmVsIGltYWdlIHRlbXBvcmFyaWx5CiAgKiBmb3Igc2FmZSBpbi1wbGFjZSBkZWNvbXByZXNzaW9uLgogICovCiAKICNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKLQltb3ZsIAklZWJwLCAlZWJ4Ci0JYWRkbCAgICAkKENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpLCAlZWJ4Ci0JYW5kbCAgICAkKH4oQ09ORklHX1BIWVNJQ0FMX0FMSUdOIC0gMSkpLCAlZWJ4CisJbW92bAklZWJwLCAlZWJ4CisJbW92bAlCUF9rZXJuZWxfYWxpZ25tZW50KCVlc2kpLCAlZWF4CisJZGVjbAklZWF4CisJYWRkbCAgICAlZWF4LCAlZWJ4CisJbm90bAklZWF4CisJYW5kbCAgICAlZWF4LCAlZWJ4CiAjZWxzZQotCW1vdmwgJExPQURfUEhZU0lDQUxfQUREUiwgJWVieAorCW1vdmwJJExPQURfUEhZU0lDQUxfQUREUiwgJWVieAogI2VuZGlmCiAKLQkvKiBSZXBsYWNlIHRoZSBjb21wcmVzc2VkIGRhdGEgc2l6ZSB3aXRoIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSAqLwotCXN1YmwgaW5wdXRfbGVuKCVlYnApLCAlZWJ4Ci0JbW92bCBvdXRwdXRfbGVuKCVlYnApLCAlZWF4Ci0JYWRkbCAlZWF4LCAlZWJ4Ci0JLyogQWRkIDggYnl0ZXMgZm9yIGV2ZXJ5IDMySyBpbnB1dCBibG9jayAqLwotCXNocmwgJDEyLCAlZWF4Ci0JYWRkbCAlZWF4LCAlZWJ4Ci0JLyogQWRkIDMySyArIDE4IGJ5dGVzIG9mIGV4dHJhIHNsYWNrICovCi0JYWRkbCAkKDMyNzY4ICsgMTgpLCAlZWJ4Ci0JLyogQWxpZ24gb24gYSA0SyBib3VuZGFyeSAqLwotCWFkZGwgJDQwOTUsICVlYngKLQlhbmRsICR+NDA5NSwgJWVieAorCS8qIFRhcmdldCBhZGRyZXNzIHRvIHJlbG9jYXRlIHRvIGZvciBkZWNvbXByZXNzaW9uICovCisJYWRkbAkkel9leHRyYWN0X29mZnNldCwgJWVieAogCi0vKiBDb3B5IHRoZSBjb21wcmVzc2VkIGtlcm5lbCB0byB0aGUgZW5kIG9mIG91ciBidWZmZXIKKwkvKiBTZXQgdXAgdGhlIHN0YWNrICovCisJbGVhbAlib290X3N0YWNrX2VuZCglZWJ4KSwgJWVzcAorCisJLyogWmVybyBFRkxBR1MgKi8KKwlwdXNobAkkMAorCXBvcGZsCisKKy8qCisgKiBDb3B5IHRoZSBjb21wcmVzc2VkIGtlcm5lbCB0byB0aGUgZW5kIG9mIG91ciBidWZmZXIKICAqIHdoZXJlIGRlY29tcHJlc3Npb24gaW4gcGxhY2UgYmVjb21lcyBzYWZlLgogICovCi0JcHVzaGwgJWVzaQotCWxlYWwgX2VuZCglZWJwKSwgJWVzaQotCWxlYWwgX2VuZCglZWJ4KSwgJWVkaQotCW1vdmwgJChfZW5kIC0gc3RhcnR1cF8zMiksICVlY3gKKwlwdXNobAklZXNpCisJbGVhbAkoX2Jzcy00KSglZWJwKSwgJWVzaQorCWxlYWwJKF9ic3MtNCkoJWVieCksICVlZGkKKwltb3ZsCSQoX2JzcyAtIHN0YXJ0dXBfMzIpLCAlZWN4CisJc2hybAkkMiwgJWVjeAogCXN0ZAotCXJlcAotCW1vdnNiCisJcmVwCW1vdnNsCiAJY2xkCi0JcG9wbCAlZXNpCi0KLS8qIENvbXB1dGUgdGhlIGtlcm5lbCBzdGFydCBhZGRyZXNzLgotICovCi0jaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCi0JYWRkbCAgICAkKENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpLCAlZWJwCi0JYW5kbCAgICAkKH4oQ09ORklHX1BIWVNJQ0FMX0FMSUdOIC0gMSkpLCAlZWJwCi0jZWxzZQotCW1vdmwJJExPQURfUEhZU0lDQUxfQUREUiwgJWVicAotI2VuZGlmCisJcG9wbAklZXNpCiAKIC8qCiAgKiBKdW1wIHRvIHRoZSByZWxvY2F0ZWQgYWRkcmVzcy4KICAqLwotCWxlYWwgcmVsb2NhdGVkKCVlYngpLCAlZWF4Ci0Jam1wIColZWF4CisJbGVhbAlyZWxvY2F0ZWQoJWVieCksICVlYXgKKwlqbXAJKiVlYXgKIEVORFBST0Moc3RhcnR1cF8zMikKIAotLnNlY3Rpb24gIi50ZXh0IgorCS50ZXh0CiByZWxvY2F0ZWQ6CiAKIC8qCi0gKiBDbGVhciBCU1MKKyAqIENsZWFyIEJTUyAoc3RhY2sgaXMgY3VycmVudGx5IGVtcHR5KQogICovCi0JeG9ybCAlZWF4LCVlYXgKLQlsZWFsIF9lZGF0YSglZWJ4KSwlZWRpCi0JbGVhbCBfZW5kKCVlYngpLCAlZWN4Ci0Jc3VibCAlZWRpLCVlY3gKLQljbGQKLQlyZXAKLQlzdG9zYgotCi0vKgotICogU2V0dXAgdGhlIHN0YWNrIGZvciB0aGUgZGVjb21wcmVzc29yCi0gKi8KLQlsZWFsIGJvb3Rfc3RhY2tfZW5kKCVlYngpLCAlZXNwCisJeG9ybAklZWF4LCAlZWF4CisJbGVhbAlfYnNzKCVlYngpLCAlZWRpCisJbGVhbAlfZWJzcyglZWJ4KSwgJWVjeAorCXN1YmwJJWVkaSwgJWVjeAorCXNocmwJJDIsICVlY3gKKwlyZXAJc3Rvc2wKIAogLyoKICAqIERvIHRoZSBkZWNvbXByZXNzaW9uLCBhbmQganVtcCB0byB0aGUgbmV3IGtlcm5lbC4uCiAgKi8KLQltb3ZsIG91dHB1dF9sZW4oJWVieCksICVlYXgKLQlwdXNobCAlZWF4Ci0JCQkjIHB1c2ggYXJndW1lbnRzIGZvciBkZWNvbXByZXNzX2tlcm5lbDoKLQlwdXNobCAlZWJwCSMgb3V0cHV0IGFkZHJlc3MKLQltb3ZsIGlucHV0X2xlbiglZWJ4KSwgJWVheAotCXB1c2hsICVlYXgJIyBpbnB1dF9sZW4KLQlsZWFsIGlucHV0X2RhdGEoJWVieCksICVlYXgKLQlwdXNobCAlZWF4CSMgaW5wdXRfZGF0YQotCWxlYWwgYm9vdF9oZWFwKCVlYngpLCAlZWF4Ci0JcHVzaGwgJWVheAkjIGhlYXAgYXJlYQotCXB1c2hsICVlc2kJIyByZWFsIG1vZGUgcG9pbnRlcgotCWNhbGwgZGVjb21wcmVzc19rZXJuZWwKLQlhZGRsICQyMCwgJWVzcAotCXBvcGwgJWVjeAorCWxlYWwJel9leHRyYWN0X29mZnNldF9uZWdhdGl2ZSglZWJ4KSwgJWVicAorCQkJCS8qIHB1c2ggYXJndW1lbnRzIGZvciBkZWNvbXByZXNzX2tlcm5lbDogKi8KKwlwdXNobAklZWJwCQkvKiBvdXRwdXQgYWRkcmVzcyAqLworCXB1c2hsCSR6X2lucHV0X2xlbgkvKiBpbnB1dF9sZW4gKi8KKwlsZWFsCWlucHV0X2RhdGEoJWVieCksICVlYXgKKwlwdXNobAklZWF4CQkvKiBpbnB1dF9kYXRhICovCisJbGVhbAlib290X2hlYXAoJWVieCksICVlYXgKKwlwdXNobAklZWF4CQkvKiBoZWFwIGFyZWEgKi8KKwlwdXNobAklZXNpCQkvKiByZWFsIG1vZGUgcG9pbnRlciAqLworCWNhbGwJZGVjb21wcmVzc19rZXJuZWwKKwlhZGRsCSQyMCwgJWVzcAogCiAjaWYgQ09ORklHX1JFTE9DQVRBQkxFCi0vKiBGaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9ucy4KKy8qCisgKiBGaW5kIHRoZSBhZGRyZXNzIG9mIHRoZSByZWxvY2F0aW9ucy4KICAqLwotCW1vdmwgJWVicCwgJWVkaQotCWFkZGwgJWVjeCwgJWVkaQorCWxlYWwJel9vdXRwdXRfbGVuKCVlYnApLCAlZWRpCiAKLS8qIENhbGN1bGF0ZSB0aGUgZGVsdGEgYmV0d2VlbiB3aGVyZSB2bWxpbnV4IHdhcyBjb21waWxlZCB0byBydW4KKy8qCisgKiBDYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gd2hlcmUgdm1saW51eCB3YXMgY29tcGlsZWQgdG8gcnVuCiAgKiBhbmQgd2hlcmUgaXQgd2FzIGFjdHVhbGx5IGxvYWRlZC4KICAqLwotCW1vdmwgJWVicCwgJWVieAotCXN1YmwgJExPQURfUEhZU0lDQUxfQUREUiwgJWVieAotCWp6ICAgMmYJCS8qIE5vdGhpbmcgdG8gYmUgZG9uZSBpZiBsb2FkZWQgYXQgY29tcGlsZWQgYWRkci4gKi8KKwltb3ZsCSVlYnAsICVlYngKKwlzdWJsCSRMT0FEX1BIWVNJQ0FMX0FERFIsICVlYngKKwlqegkyZgkvKiBOb3RoaW5nIHRvIGJlIGRvbmUgaWYgbG9hZGVkIGF0IGNvbXBpbGVkIGFkZHIuICovCiAvKgogICogUHJvY2VzcyByZWxvY2F0aW9ucy4KICAqLwogCi0xOglzdWJsICQ0LCAlZWRpCi0JbW92bCAwKCVlZGkpLCAlZWN4Ci0JdGVzdGwgJWVjeCwgJWVjeAotCWp6IDJmCi0JYWRkbCAlZWJ4LCAtX19QQUdFX09GRlNFVCglZWJ4LCAlZWN4KQotCWptcCAxYgorMToJc3VibAkkNCwgJWVkaQorCW1vdmwJKCVlZGkpLCAlZWN4CisJdGVzdGwJJWVjeCwgJWVjeAorCWp6CTJmCisJYWRkbAklZWJ4LCAtX19QQUdFX09GRlNFVCglZWJ4LCAlZWN4KQorCWptcAkxYgogMjoKICNlbmRpZgogCiAvKgogICogSnVtcCB0byB0aGUgZGVjb21wcmVzc2VkIGtlcm5lbC4KICAqLwotCXhvcmwgJWVieCwlZWJ4Ci0Jam1wIColZWJwCisJeG9ybAklZWJ4LCAlZWJ4CisJam1wCSolZWJwCiAKLS5ic3MKLS8qIFN0YWNrIGFuZCBoZWFwIGZvciB1bmNvbXByZXNzaW9uICovCi0uYmFsaWduIDQKKy8qCisgKiBTdGFjayBhbmQgaGVhcCBmb3IgdW5jb21wcmVzc2lvbgorICovCisJLmJzcworCS5iYWxpZ24gNAogYm9vdF9oZWFwOgogCS5maWxsIEJPT1RfSEVBUF9TSVpFLCAxLCAwCiBib290X3N0YWNrOgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9oZWFkXzY0LlMKaW5kZXggZWQ0YTgyOS4uZjYyYzI4NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL2hlYWRfNjQuUworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvaGVhZF82NC5TCkBAIC0yMSw4ICsyMSw4IEBACiAvKgogICogSGlnaCBsb2FkZWQgc3R1ZmYgYnkgSGFucyBMZXJtZW4gJiBXZXJuZXIgQWxtZXNiZXJnZXIsIEZlYi4gMTk5NgogICovCi0uY29kZTMyCi0udGV4dAorCS5jb2RlMzIKKwkudGV4dAogCiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+CkBAIC0zMywxMiArMzMsMTQgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLWZsYWdzLmg+CiAjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CiAKLS5zZWN0aW9uICIudGV4dC5oZWFkIgorCS5zZWN0aW9uICIudGV4dC5oZWFkIgogCS5jb2RlMzIKIEVOVFJZKHN0YXJ0dXBfMzIpCiAJY2xkCi0JLyogdGVzdCBLRUVQX1NFR01FTlRTIGZsYWcgdG8gc2VlIGlmIHRoZSBib290bG9hZGVyIGlzIGFza2luZwotCSAqIHVzIHRvIG5vdCByZWxvYWQgc2VnbWVudHMgKi8KKwkvKgorCSAqIFRlc3QgS0VFUF9TRUdNRU5UUyBmbGFnIHRvIHNlZSBpZiB0aGUgYm9vdGxvYWRlciBpcyBhc2tpbmcKKwkgKiB1cyB0byBub3QgcmVsb2FkIHNlZ21lbnRzCisJICovCiAJdGVzdGIgJCgxPDw2KSwgQlBfbG9hZGZsYWdzKCVlc2kpCiAJam56IDFmCiAKQEAgLTQ5LDE0ICs1MSwxNSBAQAogCW1vdmwJJWVheCwgJXNzCiAxOgogCi0vKiBDYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gd2hlcmUgd2Ugd2VyZSBjb21waWxlZCB0byBydW4KKy8qCisgKiBDYWxjdWxhdGUgdGhlIGRlbHRhIGJldHdlZW4gd2hlcmUgd2Ugd2VyZSBjb21waWxlZCB0byBydW4KICAqIGF0IGFuZCB3aGVyZSB3ZSB3ZXJlIGFjdHVhbGx5IGxvYWRlZCBhdC4gIFRoaXMgY2FuIG9ubHkgYmUgZG9uZQogICogd2l0aCBhIHNob3J0IGxvY2FsIGNhbGwgb24geDg2LiAgTm90aGluZyAgZWxzZSB3aWxsIHRlbGwgdXMgd2hhdAogICogYWRkcmVzcyB3ZSBhcmUgcnVubmluZyBhdC4gIFRoZSByZXNlcnZlZCBjaHVuayBvZiB0aGUgcmVhbC1tb2RlCiAgKiBkYXRhIGF0IDB4MWU0IChkZWZpbmVkIGFzIGEgc2NyYXRjaCBmaWVsZCkgYXJlIHVzZWQgYXMgdGhlIHN0YWNrCiAgKiBmb3IgdGhpcyBjYWxjdWxhdGlvbi4gT25seSA0IGJ5dGVzIGFyZSBuZWVkZWQuCiAgKi8KLQlsZWFsCSgweDFlNCs0KSglZXNpKSwgJWVzcAorCWxlYWwJKEJQX3NjcmF0Y2grNCkoJWVzaSksICVlc3AKIAljYWxsCTFmCiAxOglwb3BsCSVlYnAKIAlzdWJsCSQxYiwgJWVicApAQCAtNzAsMzIgKzczLDI4IEBACiAJdGVzdGwJJWVheCwgJWVheAogCWpueglub19sb25nbW9kZQogCi0vKiBDb21wdXRlIHRoZSBkZWx0YSBiZXR3ZWVuIHdoZXJlIHdlIHdlcmUgY29tcGlsZWQgdG8gcnVuIGF0CisvKgorICogQ29tcHV0ZSB0aGUgZGVsdGEgYmV0d2VlbiB3aGVyZSB3ZSB3ZXJlIGNvbXBpbGVkIHRvIHJ1biBhdAogICogYW5kIHdoZXJlIHRoZSBjb2RlIHdpbGwgYWN0dWFsbHkgcnVuIGF0LgotICovCi0vKiAlZWJwIGNvbnRhaW5zIHRoZSBhZGRyZXNzIHdlIGFyZSBsb2FkZWQgYXQgYnkgdGhlIGJvb3QgbG9hZGVyIGFuZCAlZWJ4CisgKgorICogJWVicCBjb250YWlucyB0aGUgYWRkcmVzcyB3ZSBhcmUgbG9hZGVkIGF0IGJ5IHRoZSBib290IGxvYWRlciBhbmQgJWVieAogICogY29udGFpbnMgdGhlIGFkZHJlc3Mgd2hlcmUgd2Ugc2hvdWxkIG1vdmUgdGhlIGtlcm5lbCBpbWFnZSB0ZW1wb3JhcmlseQogICogZm9yIHNhZmUgaW4tcGxhY2UgZGVjb21wcmVzc2lvbi4KICAqLwogCiAjaWZkZWYgQ09ORklHX1JFTE9DQVRBQkxFCiAJbW92bAklZWJwLCAlZWJ4Ci0JYWRkbAkkKFBNRF9QQUdFX1NJWkUgLTEpLCAlZWJ4Ci0JYW5kbAkkUE1EX1BBR0VfTUFTSywgJWVieAorCW1vdmwJQlBfa2VybmVsX2FsaWdubWVudCglZXNpKSwgJWVheAorCWRlY2wJJWVheAorCWFkZGwJJWVheCwgJWVieAorCW5vdGwJJWVheAorCWFuZGwJJWVheCwgJWVieAogI2Vsc2UKLQltb3ZsCSRDT05GSUdfUEhZU0lDQUxfU1RBUlQsICVlYngKKwltb3ZsCSRMT0FEX1BIWVNJQ0FMX0FERFIsICVlYngKICNlbmRpZgogCi0JLyogUmVwbGFjZSB0aGUgY29tcHJlc3NlZCBkYXRhIHNpemUgd2l0aCB0aGUgdW5jb21wcmVzc2VkIHNpemUgKi8KLQlzdWJsCWlucHV0X2xlbiglZWJwKSwgJWVieAotCW1vdmwJb3V0cHV0X2xlbiglZWJwKSwgJWVheAotCWFkZGwJJWVheCwgJWVieAotCS8qIEFkZCA4IGJ5dGVzIGZvciBldmVyeSAzMksgaW5wdXQgYmxvY2sgKi8KLQlzaHJsCSQxMiwgJWVheAotCWFkZGwJJWVheCwgJWVieAotCS8qIEFkZCAzMksgKyAxOCBieXRlcyBvZiBleHRyYSBzbGFjayBhbmQgYWxpZ24gb24gYSA0SyBib3VuZGFyeSAqLwotCWFkZGwJJCgzMjc2OCArIDE4ICsgNDA5NSksICVlYngKLQlhbmRsCSR+NDA5NSwgJWVieAorCS8qIFRhcmdldCBhZGRyZXNzIHRvIHJlbG9jYXRlIHRvIGZvciBkZWNvbXByZXNzaW9uICovCisJYWRkbAkkel9leHRyYWN0X29mZnNldCwgJWVieAogCiAvKgogICogUHJlcGFyZSBmb3IgZW50ZXJpbmcgNjQgYml0IG1vZGUKQEAgLTExNCw3ICsxMTMsNyBAQAogIC8qCiAgICogQnVpbGQgZWFybHkgNEcgYm9vdCBwYWdldGFibGUKICAgKi8KLQkvKiBJbml0aWFsaXplIFBhZ2UgdGFibGVzIHRvIDAqLworCS8qIEluaXRpYWxpemUgUGFnZSB0YWJsZXMgdG8gMCAqLwogCWxlYWwJcGd0YWJsZSglZWJ4KSwgJWVkaQogCXhvcmwJJWVheCwgJWVheAogCW1vdmwJJCgoNDA5Nio2KS80KSwgJWVjeApAQCAtMTU1LDcgKzE1NCw4IEBACiAJYnRzbAkkX0VGRVJfTE1FLCAlZWF4CiAJd3Jtc3IKIAotCS8qIFNldHVwIGZvciB0aGUganVtcCB0byA2NGJpdCBtb2RlCisJLyoKKwkgKiBTZXR1cCBmb3IgdGhlIGp1bXAgdG8gNjRiaXQgbW9kZQogCSAqCiAJICogV2hlbiB0aGUganVtcCBpcyBwZXJmb3JtZW5kIHdlIHdpbGwgYmUgaW4gbG9uZyBtb2RlIGJ1dAogCSAqIGluIDMyYml0IGNvbXBhdGliaWxpdHkgbW9kZSB3aXRoIEVGRVIuTE1FID0gMSwgQ1MuTCA9IDAsIENTLkQgPSAxCkBAIC0xODQsNyArMTg0LDggQEAKIAogI2luY2x1ZGUgIi4uLy4uL2tlcm5lbC92ZXJpZnlfY3B1XzY0LlMiCiAKLQkvKiBCZSBjYXJlZnVsIGhlcmUgc3RhcnR1cF82NCBuZWVkcyB0byBiZSBhdCBhIHByZWRpY3RhYmxlCisJLyoKKwkgKiBCZSBjYXJlZnVsIGhlcmUgc3RhcnR1cF82NCBuZWVkcyB0byBiZSBhdCBhIHByZWRpY3RhYmxlCiAJICogYWRkcmVzcyBzbyBJIGNhbiBleHBvcnQgaXQgaW4gYW4gRUxGIGhlYWRlci4gIEJvb3Rsb2FkZXJzCiAJICogc2hvdWxkIGxvb2sgYXQgdGhlIEVMRiBoZWFkZXIgdG8gZmluZCB0aGlzIGFkZHJlc3MsIGFzCiAJICogaXQgbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlLgpAQCAtMTkyLDcgKzE5Myw4IEBACiAJLmNvZGU2NAogCS5vcmcgMHgyMDAKIEVOVFJZKHN0YXJ0dXBfNjQpCi0JLyogV2UgY29tZSBoZXJlIGVpdGhlciBmcm9tIHN0YXJ0dXBfMzIgb3IgZGlyZWN0bHkgZnJvbSBhCisJLyoKKwkgKiBXZSBjb21lIGhlcmUgZWl0aGVyIGZyb20gc3RhcnR1cF8zMiBvciBkaXJlY3RseSBmcm9tIGEKIAkgKiA2NGJpdCBib290bG9hZGVyLiAgSWYgd2UgY29tZSBoZXJlIGZyb20gYSBib290bG9hZGVyIHdlIGRlcGVuZCBvbgogCSAqIGFuIGlkZW50aXR5IG1hcHBlZCBwYWdlIHRhYmxlIGJlaW5nIHByb3ZpZWQgdGhhdCBtYXBzIG91cgogCSAqIGVudGlyZSB0ZXh0K2RhdGErYnNzIGFuZCBob3BlZnVsbHkgYWxsIG9mIG1lbW9yeS4KQEAgLTIwOSw1MCArMjExLDU0IEBACiAJbW92bCAgICAkMHgyMCwgJWVheAogCWx0cgklYXgKIAotCS8qIENvbXB1dGUgdGhlIGRlY29tcHJlc3NlZCBrZXJuZWwgc3RhcnQgYWRkcmVzcy4gIEl0IGlzIHdoZXJlCisJLyoKKwkgKiBDb21wdXRlIHRoZSBkZWNvbXByZXNzZWQga2VybmVsIHN0YXJ0IGFkZHJlc3MuICBJdCBpcyB3aGVyZQogCSAqIHdlIHdlcmUgbG9hZGVkIGF0IGFsaWduZWQgdG8gYSAyTSBib3VuZGFyeS4gJXJicCBjb250YWlucyB0aGUKIAkgKiBkZWNvbXByZXNzZWQga2VybmVsIHN0YXJ0IGFkZHJlc3MuCiAJICoKIAkgKiBJZiBpdCBpcyBhIHJlbG9jYXRhYmxlIGtlcm5lbCB0aGVuIGRlY29tcHJlc3MgYW5kIHJ1biB0aGUga2VybmVsCiAJICogZnJvbSBsb2FkIGFkZHJlc3MgYWxpZ25lZCB0byAyTUIgYWRkciwgb3RoZXJ3aXNlIGRlY29tcHJlc3MgYW5kCi0JICogcnVuIHRoZSBrZXJuZWwgZnJvbSBDT05GSUdfUEhZU0lDQUxfU1RBUlQKKwkgKiBydW4gdGhlIGtlcm5lbCBmcm9tIExPQURfUEhZU0lDQUxfQUREUgorCSAqCisJICogV2UgY2Fubm90IHJlbHkgb24gdGhlIGNhbGN1bGF0aW9uIGRvbmUgaW4gMzItYml0IG1vZGUsIHNpbmNlIHdlCisJICogbWF5IGhhdmUgYmVlbiBpbnZva2VkIHZpYSB0aGUgNjQtYml0IGVudHJ5IHBvaW50LgogCSAqLwogCiAJLyogU3RhcnQgd2l0aCB0aGUgZGVsdGEgdG8gd2hlcmUgdGhlIGtlcm5lbCB3aWxsIHJ1biBhdC4gKi8KICNpZmRlZiBDT05GSUdfUkVMT0NBVEFCTEUKIAlsZWFxCXN0YXJ0dXBfMzIoJXJpcCkgLyogLSAkc3RhcnR1cF8zMiAqLywgJXJicAotCWFkZHEJJChQTURfUEFHRV9TSVpFIC0gMSksICVyYnAKLQlhbmRxCSRQTURfUEFHRV9NQVNLLCAlcmJwCi0JbW92cQklcmJwLCAlcmJ4CisJbW92bAlCUF9rZXJuZWxfYWxpZ25tZW50KCVyc2kpLCAlZWF4CisJZGVjbAklZWF4CisJYWRkcQklcmF4LCAlcmJwCisJbm90cQklcmF4CisJYW5kcQklcmF4LCAlcmJwCiAjZWxzZQotCW1vdnEJJENPTkZJR19QSFlTSUNBTF9TVEFSVCwgJXJicAotCW1vdnEJJXJicCwgJXJieAorCW1vdnEJJExPQURfUEhZU0lDQUxfQUREUiwgJXJicAogI2VuZGlmCiAKLQkvKiBSZXBsYWNlIHRoZSBjb21wcmVzc2VkIGRhdGEgc2l6ZSB3aXRoIHRoZSB1bmNvbXByZXNzZWQgc2l6ZSAqLwotCW1vdmwJaW5wdXRfbGVuKCVyaXApLCAlZWF4Ci0Jc3VicQklcmF4LCAlcmJ4Ci0JbW92bAlvdXRwdXRfbGVuKCVyaXApLCAlZWF4Ci0JYWRkcQklcmF4LCAlcmJ4Ci0JLyogQWRkIDggYnl0ZXMgZm9yIGV2ZXJ5IDMySyBpbnB1dCBibG9jayAqLwotCXNocnEJJDEyLCAlcmF4Ci0JYWRkcQklcmF4LCAlcmJ4Ci0JLyogQWRkIDMySyArIDE4IGJ5dGVzIG9mIGV4dHJhIHNsYWNrIGFuZCBhbGlnbiBvbiBhIDRLIGJvdW5kYXJ5ICovCi0JYWRkcQkkKDMyNzY4ICsgMTggKyA0MDk1KSwgJXJieAotCWFuZHEJJH40MDk1LCAlcmJ4CisJLyogVGFyZ2V0IGFkZHJlc3MgdG8gcmVsb2NhdGUgdG8gZm9yIGRlY29tcHJlc3Npb24gKi8KKwlsZWFxCXpfZXh0cmFjdF9vZmZzZXQoJXJicCksICVyYngKIAotLyogQ29weSB0aGUgY29tcHJlc3NlZCBrZXJuZWwgdG8gdGhlIGVuZCBvZiBvdXIgYnVmZmVyCisJLyogU2V0IHVwIHRoZSBzdGFjayAqLworCWxlYXEJYm9vdF9zdGFja19lbmQoJXJieCksICVyc3AKKworCS8qIFplcm8gRUZMQUdTICovCisJcHVzaHEJJDAKKwlwb3BmcQorCisvKgorICogQ29weSB0aGUgY29tcHJlc3NlZCBrZXJuZWwgdG8gdGhlIGVuZCBvZiBvdXIgYnVmZmVyCiAgKiB3aGVyZSBkZWNvbXByZXNzaW9uIGluIHBsYWNlIGJlY29tZXMgc2FmZS4KICAqLwotCWxlYXEJX2VuZF9iZWZvcmVfcGd0KCVyaXApLCAlcjgKLQlsZWFxCV9lbmRfYmVmb3JlX3BndCglcmJ4KSwgJXI5Ci0JbW92cQkkX2VuZF9iZWZvcmVfcGd0IC8qIC0gJHN0YXJ0dXBfMzIgKi8sICVyY3gKLTE6CXN1YnEJJDgsICVyOAotCXN1YnEJJDgsICVyOQotCW1vdnEJMCglcjgpLCAlcmF4Ci0JbW92cQklcmF4LCAwKCVyOSkKLQlzdWJxCSQ4LCAlcmN4Ci0Jam56CTFiCisJcHVzaHEJJXJzaQorCWxlYXEJKF9ic3MtOCkoJXJpcCksICVyc2kKKwlsZWFxCShfYnNzLTgpKCVyYngpLCAlcmRpCisJbW92cQkkX2JzcyAvKiAtICRzdGFydHVwXzMyICovLCAlcmN4CisJc2hycQkkMywgJXJjeAorCXN0ZAorCXJlcAltb3ZzcQorCWNsZAorCXBvcHEJJXJzaQogCiAvKgogICogSnVtcCB0byB0aGUgcmVsb2NhdGVkIGFkZHJlc3MuCkBAIC0yNjAsMzcgKzI2NiwyOCBAQAogCWxlYXEJcmVsb2NhdGVkKCVyYngpLCAlcmF4CiAJam1wCSolcmF4CiAKLS5zZWN0aW9uICIudGV4dCIKKwkudGV4dAogcmVsb2NhdGVkOgogCiAvKgotICogQ2xlYXIgQlNTCisgKiBDbGVhciBCU1MgKHN0YWNrIGlzIGN1cnJlbnRseSBlbXB0eSkKICAqLwotCXhvcnEJJXJheCwgJXJheAotCWxlYXEgICAgX2VkYXRhKCVyYngpLCAlcmRpCi0JbGVhcSAgICBfZW5kX2JlZm9yZV9wZ3QoJXJieCksICVyY3gKKwl4b3JsCSVlYXgsICVlYXgKKwlsZWFxICAgIF9ic3MoJXJpcCksICVyZGkKKwlsZWFxICAgIF9lYnNzKCVyaXApLCAlcmN4CiAJc3VicQklcmRpLCAlcmN4Ci0JY2xkCi0JcmVwCi0Jc3Rvc2IKLQotCS8qIFNldHVwIHRoZSBzdGFjayAqLwotCWxlYXEJYm9vdF9zdGFja19lbmQoJXJpcCksICVyc3AKLQotCS8qIHplcm8gRUZMQUdTIGFmdGVyIHNldHRpbmcgcnNwICovCi0JcHVzaHEJJDAKLQlwb3BmcQorCXNocnEJJDMsICVyY3gKKwlyZXAJc3Rvc3EKIAogLyoKICAqIERvIHRoZSBkZWNvbXByZXNzaW9uLCBhbmQganVtcCB0byB0aGUgbmV3IGtlcm5lbC4uCiAgKi8KLQlwdXNocQklcnNpCQkJIyBTYXZlIHRoZSByZWFsIG1vZGUgYXJndW1lbnQKLQltb3ZxCSVyc2ksICVyZGkJCSMgcmVhbCBtb2RlIGFkZHJlc3MKLQlsZWFxCWJvb3RfaGVhcCglcmlwKSwgJXJzaQkjIG1hbGxvYyBhcmVhIGZvciB1bmNvbXByZXNzaW9uCi0JbGVhcQlpbnB1dF9kYXRhKCVyaXApLCAlcmR4ICAjIGlucHV0X2RhdGEKLQltb3ZsCWlucHV0X2xlbiglcmlwKSwgJWVheAotCW1vdnEJJXJheCwgJXJjeAkJIyBpbnB1dF9sZW4KLQltb3ZxCSVyYnAsICVyOAkJIyBvdXRwdXQKKwlwdXNocQklcnNpCQkJLyogU2F2ZSB0aGUgcmVhbCBtb2RlIGFyZ3VtZW50ICovCisJbW92cQklcnNpLCAlcmRpCQkvKiByZWFsIG1vZGUgYWRkcmVzcyAqLworCWxlYXEJYm9vdF9oZWFwKCVyaXApLCAlcnNpCS8qIG1hbGxvYyBhcmVhIGZvciB1bmNvbXByZXNzaW9uICovCisJbGVhcQlpbnB1dF9kYXRhKCVyaXApLCAlcmR4ICAvKiBpbnB1dF9kYXRhICovCisJbW92bAkkel9pbnB1dF9sZW4sICVlY3gJLyogaW5wdXRfbGVuICovCisJbW92cQklcmJwLCAlcjgJCS8qIG91dHB1dCB0YXJnZXQgYWRkcmVzcyAqLwogCWNhbGwJZGVjb21wcmVzc19rZXJuZWwKIAlwb3BxCSVyc2kKIApAQCAtMzExLDExICszMDgsMjEgQEAKIAkucXVhZCAgIDB4MDAwMDAwMDAwMDAwMDAwMAkvKiBUUyBjb250aW51ZWQgKi8KIGdkdF9lbmQ6CiAKLS5ic3MKLS8qIFN0YWNrIGFuZCBoZWFwIGZvciB1bmNvbXByZXNzaW9uICovCi0uYmFsaWduIDQKKy8qCisgKiBTdGFjayBhbmQgaGVhcCBmb3IgdW5jb21wcmVzc2lvbgorICovCisJLmJzcworCS5iYWxpZ24gNAogYm9vdF9oZWFwOgogCS5maWxsIEJPT1RfSEVBUF9TSVpFLCAxLCAwCiBib290X3N0YWNrOgogCS5maWxsIEJPT1RfU1RBQ0tfU0laRSwgMSwgMAogYm9vdF9zdGFja19lbmQ6CisKKy8qCisgKiBTcGFjZSBmb3IgcGFnZSB0YWJsZXMgKG5vdCBpbiAuYnNzIHNvIG5vdCB6ZXJvZWQpCisgKi8KKwkuc2VjdGlvbiAiLnBndGFibGUiLCJhIixAbm9iaXRzCisJLmJhbGlnbiA0MDk2CitwZ3RhYmxlOgorCS5maWxsIDYqNDA5NiwgMSwgMApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC9taXNjLmMKaW5kZXggZTQ1YmU3My4uODQyYjJhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21pc2MuYworKysgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWlzYy5jCkBAIC0zMjUsMjAgKzMyNSwxOCBAQAogCWZyZWVfbWVtX3B0ciAgICAgPSBoZWFwOwkvKiBIZWFwICovCiAJZnJlZV9tZW1fZW5kX3B0ciA9IGhlYXAgKyBCT09UX0hFQVBfU0laRTsKIAorCWlmICgodW5zaWduZWQgbG9uZylvdXRwdXQgJiAoTUlOX0tFUk5FTF9BTElHTiAtIDEpKQorCQllcnJvcigiRGVzdGluYXRpb24gYWRkcmVzcyBpbmFwcHJvcHJpYXRlbHkgYWxpZ25lZCIpOwogI2lmZGVmIENPTkZJR19YODZfNjQKLQlpZiAoKHVuc2lnbmVkIGxvbmcpb3V0cHV0ICYgKF9fS0VSTkVMX0FMSUdOIC0gMSkpCi0JCWVycm9yKCJEZXN0aW5hdGlvbiBhZGRyZXNzIG5vdCAyTSBhbGlnbmVkIik7Ci0JaWYgKCh1bnNpZ25lZCBsb25nKW91dHB1dCA+PSAweGZmZmZmZmZmZmZVTCkKKwlpZiAoaGVhcCA+IDB4M2ZmZmZmZmZmZmZmVUwpCiAJCWVycm9yKCJEZXN0aW5hdGlvbiBhZGRyZXNzIHRvbyBsYXJnZSIpOwogI2Vsc2UKLQlpZiAoKHUzMilvdXRwdXQgJiAoQ09ORklHX1BIWVNJQ0FMX0FMSUdOIC0gMSkpCi0JCWVycm9yKCJEZXN0aW5hdGlvbiBhZGRyZXNzIG5vdCBDT05GSUdfUEhZU0lDQUxfQUxJR04gYWxpZ25lZCIpOwogCWlmIChoZWFwID4gKCgtX19QQUdFX09GRlNFVC0oNTEyPDwyMCktMSkgJiAweDdmZmZmZmZmKSkKIAkJZXJyb3IoIkRlc3RpbmF0aW9uIGFkZHJlc3MgdG9vIGxhcmdlIik7Ci0jaWZuZGVmIENPTkZJR19SRUxPQ0FUQUJMRQotCWlmICgodTMyKW91dHB1dCAhPSBMT0FEX1BIWVNJQ0FMX0FERFIpCi0JCWVycm9yKCJXcm9uZyBkZXN0aW5hdGlvbiBhZGRyZXNzIik7CiAjZW5kaWYKKyNpZm5kZWYgQ09ORklHX1JFTE9DQVRBQkxFCisJaWYgKCh1bnNpZ25lZCBsb25nKW91dHB1dCAhPSBMT0FEX1BIWVNJQ0FMX0FERFIpCisJCWVycm9yKCJXcm9uZyBkZXN0aW5hdGlvbiBhZGRyZXNzIik7CiAjZW5kaWYKIAogCWlmICghcXVpZXQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvbWtwaWdneS5jIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21rcGlnZ3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2JkMzZjCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL21rcGlnZ3kuYwpAQCAtMCwwICsxLDk3IEBACisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24KKyAqICAyIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQQorICogIDAyMTEwLTEzMDEsIFVTQS4KKyAqCisgKiAgSC4gUGV0ZXIgQW52aW4gPGhwYUBsaW51eC5pbnRlbC5jb20+CisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIENvbXB1dGUgdGhlIGRlc2lyZWQgbG9hZCBvZmZzZXQgZnJvbSBhIGNvbXByZXNzZWQgcHJvZ3JhbTsgb3V0cHV0cworICogYSBzbWFsbCBhc3NlbWJseSB3cmFwcGVyIHdpdGggdGhlIGFwcHJvcHJpYXRlIHN5bWJvbHMgZGVmaW5lZC4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCitzdGF0aWMgdWludDMyX3QgZ2V0bGUzMihjb25zdCB2b2lkICpwKQoreworCWNvbnN0IHVpbnQ4X3QgKmNwID0gcDsKKworCXJldHVybiAodWludDMyX3QpY3BbMF0gKyAoKHVpbnQzMl90KWNwWzFdIDw8IDgpICsKKwkJKCh1aW50MzJfdCljcFsyXSA8PCAxNikgKyAoKHVpbnQzMl90KWNwWzNdIDw8IDI0KTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl1aW50MzJfdCBvbGVuOworCWxvbmcgaWxlbjsKKwl1bnNpZ25lZCBsb25nIG9mZnM7CisJRklMRSAqZjsKKworCWlmIChhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZGVyciwgIlVzYWdlOiAlcyBjb21wcmVzc2VkX2ZpbGVcbiIsIGFyZ3ZbMF0pOworCQlyZXR1cm4gMTsKKwl9CisKKwkvKiBHZXQgdGhlIGluZm9ybWF0aW9uIGZvciB0aGUgY29tcHJlc3NlZCBrZXJuZWwgaW1hZ2UgZmlyc3QgKi8KKworCWYgPSBmb3Blbihhcmd2WzFdLCAiciIpOworCWlmICghZikgeworCQlwZXJyb3IoYXJndlsxXSk7CisJCXJldHVybiAxOworCX0KKworCisJaWYgKGZzZWVrKGYsIC00TCwgU0VFS19FTkQpKSB7CisJCXBlcnJvcihhcmd2WzFdKTsKKwl9CisJZnJlYWQoJm9sZW4sIHNpemVvZiBvbGVuLCAxLCBmKTsKKwlpbGVuID0gZnRlbGwoZik7CisJb2xlbiA9IGdldGxlMzIoJm9sZW4pOworCWZjbG9zZShmKTsKKworCS8qCisJICogTm93IHdlIGhhdmUgdGhlIGlucHV0IChjb21wcmVzc2VkKSBhbmQgb3V0cHV0ICh1bmNvbXByZXNzZWQpCisJICogc2l6ZXMsIGNvbXB1dGUgdGhlIG5lY2Vzc2FyeSBkZWNvbXByZXNzaW9uIG9mZnNldC4uLgorCSAqLworCisJb2ZmcyA9IChvbGVuID4gaWxlbikgPyBvbGVuIC0gaWxlbiA6IDA7CisJb2ZmcyArPSBvbGVuID4+IDEyOwkvKiBBZGQgOCBieXRlcyBmb3IgZWFjaCAzMksgYmxvY2sgKi8KKwlvZmZzICs9IDMyKjEwMjQgKyAxODsJLyogQWRkIDMySyArIDE4IGJ5dGVzIHNsYWNrICovCisJb2ZmcyA9IChvZmZzKzQwOTUpICYgfjQwOTU7IC8qIFJvdW5kIHRvIGEgNEsgYm91bmRhcnkgKi8KKworCXByaW50ZigiLnNlY3Rpb24gXCIucm9kYXRhLmNvbXByZXNzZWRcIixcImFcIixAcHJvZ2JpdHNcbiIpOworCXByaW50ZigiLmdsb2JsIHpfaW5wdXRfbGVuXG4iKTsKKwlwcmludGYoInpfaW5wdXRfbGVuID0gJWx1XG4iLCBpbGVuKTsKKwlwcmludGYoIi5nbG9ibCB6X291dHB1dF9sZW5cbiIpOworCXByaW50Zigiel9vdXRwdXRfbGVuID0gJWx1XG4iLCAodW5zaWduZWQgbG9uZylvbGVuKTsKKwlwcmludGYoIi5nbG9ibCB6X2V4dHJhY3Rfb2Zmc2V0XG4iKTsKKwlwcmludGYoInpfZXh0cmFjdF9vZmZzZXQgPSAweCVseFxuIiwgb2Zmcyk7CisJLyogel9leHRyYWN0X29mZnNldF9uZWdhdGl2ZSBhbGxvd3Mgc2ltcGxpZmljYXRpb24gb2YgaGVhZF8zMi5TICovCisJcHJpbnRmKCIuZ2xvYmwgel9leHRyYWN0X29mZnNldF9uZWdhdGl2ZVxuIik7CisJcHJpbnRmKCJ6X2V4dHJhY3Rfb2Zmc2V0X25lZ2F0aXZlID0gLTB4JWx4XG4iLCBvZmZzKTsKKworCXByaW50ZigiLmdsb2JsIGlucHV0X2RhdGEsIGlucHV0X2RhdGFfZW5kXG4iKTsKKwlwcmludGYoImlucHV0X2RhdGE6XG4iKTsKKwlwcmludGYoIi5pbmNiaW4gXCIlc1wiXG4iLCBhcmd2WzFdKTsKKwlwcmludGYoImlucHV0X2RhdGFfZW5kOlxuIik7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5TIGIvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXgubGRzLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzNTNlMQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4Lmxkcy5TCkBAIC0wLDAgKzEsNjUgQEAKK09VVFBVVF9GT1JNQVQoQ09ORklHX09VVFBVVF9GT1JNQVQsIENPTkZJR19PVVRQVVRfRk9STUFULCBDT05GSUdfT1VUUFVUX0ZPUk1BVCkKKworI3VuZGVmIGkzODYKKworI2luY2x1ZGUgPGFzbS9wYWdlX3R5cGVzLmg+CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKHN0YXJ0dXBfNjQpCisjZWxzZQorT1VUUFVUX0FSQ0goaTM4NikKK0VOVFJZKHN0YXJ0dXBfMzIpCisjZW5kaWYKKworU0VDVElPTlMKK3sKKwkvKiBCZSBjYXJlZnVsIHBhcnRzIG9mIGhlYWRfNjQuUyBhc3N1bWUgc3RhcnR1cF8zMiBpcyBhdAorCSAqIGFkZHJlc3MgMC4KKwkgKi8KKwkuID0gMDsKKwkudGV4dC5oZWFkIDogeworCQlfaGVhZCA9IC4gOworCQkqKC50ZXh0LmhlYWQpCisJCV9laGVhZCA9IC4gOworCX0KKwkucm9kYXRhLmNvbXByZXNzZWQgOiB7CisJCSooLnJvZGF0YS5jb21wcmVzc2VkKQorCX0KKwkudGV4dCA6CXsKKwkJX3RleHQgPSAuOyAJLyogVGV4dCAqLworCQkqKC50ZXh0KQorCQkqKC50ZXh0LiopCisJCV9ldGV4dCA9IC4gOworCX0KKwkucm9kYXRhIDogeworCQlfcm9kYXRhID0gLiA7CisJCSooLnJvZGF0YSkJIC8qIHJlYWQtb25seSBkYXRhICovCisJCSooLnJvZGF0YS4qKQorCQlfZXJvZGF0YSA9IC4gOworCX0KKwkuZGF0YSA6CXsKKwkJX2RhdGEgPSAuIDsKKwkJKiguZGF0YSkKKwkJKiguZGF0YS4qKQorCQlfZWRhdGEgPSAuIDsKKwl9CisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworCS5ic3MgOiB7CisJCV9ic3MgPSAuIDsKKwkJKiguYnNzKQorCQkqKC5ic3MuKikKKwkJKihDT01NT04pCisJCS4gPSBBTElHTig4KTsJLyogRm9yIGNvbnZlbmllbmNlIGR1cmluZyB6ZXJvaW5nICovCisJCV9lYnNzID0gLjsKKwl9CisjaWZkZWYgQ09ORklHX1g4Nl82NAorICAgICAgIC4gPSBBTElHTihQQUdFX1NJWkUpOworICAgICAgIC5wZ3RhYmxlIDogeworCQlfcGd0YWJsZSA9IC4gOworCQkqKC5wZ3RhYmxlKQorCQlfZXBndGFibGUgPSAuIDsKKwl9CisjZW5kaWYKKwlfZW5kID0gLjsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LnNjciBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4LnNjcgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjAyMzgyYS4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eC5zY3IKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1TRUNUSU9OUwotewotICAucm9kYXRhLmNvbXByZXNzZWQgOiB7Ci0JaW5wdXRfbGVuID0gLjsKLQlMT05HKGlucHV0X2RhdGFfZW5kIC0gaW5wdXRfZGF0YSkgaW5wdXRfZGF0YSA9IC47Ci0JKiguZGF0YSkKLQlvdXRwdXRfbGVuID0gLiAtIDQ7Ci0JaW5wdXRfZGF0YV9lbmQgPSAuOwotCX0KLX0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4XzMyLmxkcyBiL2FyY2gveDg2L2Jvb3QvY29tcHJlc3NlZC92bWxpbnV4XzMyLmxkcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzYzQ4My4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eF8zMi5sZHMKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1PVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCi1PVVRQVVRfQVJDSChpMzg2KQotRU5UUlkoc3RhcnR1cF8zMikKLVNFQ1RJT05TCi17Ci0JLyogQmUgY2FyZWZ1bCBwYXJ0cyBvZiBoZWFkXzMyLlMgYXNzdW1lIHN0YXJ0dXBfMzIgaXMgYXQKLQkgKiBhZGRyZXNzIDAuCi0JICovCi0JLiA9IDA7Ci0JLnRleHQuaGVhZCA6IHsKLQkJX2hlYWQgPSAuIDsKLQkJKigudGV4dC5oZWFkKQotCQlfZWhlYWQgPSAuIDsKLQl9Ci0JLnJvZGF0YS5jb21wcmVzc2VkIDogewotCQkqKC5yb2RhdGEuY29tcHJlc3NlZCkKLQl9Ci0JLnRleHQgOgl7Ci0JCV90ZXh0ID0gLjsgCS8qIFRleHQgKi8KLQkJKigudGV4dCkKLQkJKigudGV4dC4qKQotCQlfZXRleHQgPSAuIDsKLQl9Ci0JLnJvZGF0YSA6IHsKLQkJX3JvZGF0YSA9IC4gOwotCQkqKC5yb2RhdGEpCSAvKiByZWFkLW9ubHkgZGF0YSAqLwotCQkqKC5yb2RhdGEuKikKLQkJX2Vyb2RhdGEgPSAuIDsKLQl9Ci0JLmRhdGEgOgl7Ci0JCV9kYXRhID0gLiA7Ci0JCSooLmRhdGEpCi0JCSooLmRhdGEuKikKLQkJX2VkYXRhID0gLiA7Ci0JfQotCS5ic3MgOiB7Ci0JCV9ic3MgPSAuIDsKLQkJKiguYnNzKQotCQkqKC5ic3MuKikKLQkJKihDT01NT04pCi0JCV9lbmQgPSAuIDsKLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eF82NC5sZHMgYi9hcmNoL3g4Ni9ib290L2NvbXByZXNzZWQvdm1saW51eF82NC5sZHMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZjFhYzguLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYvYm9vdC9jb21wcmVzc2VkL3ZtbGludXhfNjQubGRzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiKQotT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCi1FTlRSWShzdGFydHVwXzY0KQotU0VDVElPTlMKLXsKLQkvKiBCZSBjYXJlZnVsIHBhcnRzIG9mIGhlYWRfNjQuUyBhc3N1bWUgc3RhcnR1cF8zMiBpcyBhdAotCSAqIGFkZHJlc3MgMC4KLQkgKi8KLQkuID0gMDsKLQkudGV4dC5oZWFkIDogewotCQlfaGVhZCA9IC4gOwotCQkqKC50ZXh0LmhlYWQpCi0JCV9laGVhZCA9IC4gOwotCX0KLQkucm9kYXRhLmNvbXByZXNzZWQgOiB7Ci0JCSooLnJvZGF0YS5jb21wcmVzc2VkKQotCX0KLQkudGV4dCA6CXsKLQkJX3RleHQgPSAuOyAJLyogVGV4dCAqLwotCQkqKC50ZXh0KQotCQkqKC50ZXh0LiopCi0JCV9ldGV4dCA9IC4gOwotCX0KLQkucm9kYXRhIDogewotCQlfcm9kYXRhID0gLiA7Ci0JCSooLnJvZGF0YSkJIC8qIHJlYWQtb25seSBkYXRhICovCi0JCSooLnJvZGF0YS4qKQotCQlfZXJvZGF0YSA9IC4gOwotCX0KLQkuZGF0YSA6CXsKLQkJX2RhdGEgPSAuIDsKLQkJKiguZGF0YSkKLQkJKiguZGF0YS4qKQotCQlfZWRhdGEgPSAuIDsKLQl9Ci0JLmJzcyA6IHsKLQkJX2JzcyA9IC4gOwotCQkqKC5ic3MpCi0JCSooLmJzcy4qKQotCQkqKENPTU1PTikKLQkJLiA9IEFMSUdOKDgpOwotCQlfZW5kX2JlZm9yZV9wZ3QgPSAuIDsKLQkJLiA9IEFMSUdOKDQwOTYpOwotCQlwZ3RhYmxlID0gLiA7Ci0JCS4gPSAuICsgNDA5NiAqIDY7Ci0JCV9lYnNzID0gLjsKLQl9Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L2VkZC5jIGIvYXJjaC94ODYvYm9vdC9lZGQuYwppbmRleCAxYWFlOGYzLi5jNTAxYTViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L2VkZC5jCisrKyBiL2FyY2gveDg2L2Jvb3QvZWRkLmMKQEAgLTIsNiArMiw3IEBACiAgKgogICogICBDb3B5cmlnaHQgKEMpIDE5OTEsIDE5OTIgTGludXMgVG9ydmFsZHMKICAqICAgQ29weXJpZ2h0IDIwMDcgclBhdGgsIEluYy4gLSBBbGwgUmlnaHRzIFJlc2VydmVkCisgKiAgIENvcHlyaWdodCAyMDA5IEludGVsIENvcnBvcmF0aW9uOyBhdXRob3IgSC4gUGV0ZXIgQW52aW4KICAqCiAgKiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBpcyBtYWRlIGF2YWlsYWJsZSB1bmRlcgogICogICB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMi4KQEAgLTIyLDE3ICsyMywxNyBAQAogICovCiBzdGF0aWMgaW50IHJlYWRfbWJyKHU4IGRldm5vLCB2b2lkICpidWYpCiB7Ci0JdTE2IGF4LCBieCwgY3gsIGR4OworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCi0JYXggPSAweDAyMDE7CQkvKiBMZWdhY3kgUmVhZCwgb25lIHNlY3RvciAqLwotCWN4ID0gMHgwMDAxOwkJLyogU2VjdG9yIDAtMC0xICovCi0JZHggPSBkZXZubzsKLQlieCA9IChzaXplX3QpYnVmOwotCWFzbSB2b2xhdGlsZSgicHVzaGZsOyBzdGM7IGludCAkMHgxMzsgc2V0YyAlJWFsOyBwb3BmbCIKLQkJICAgICA6ICIrYSIgKGF4KSwgIitjIiAoY3gpLCAiK2QiIChkeCksICIrYiIgKGJ4KQotCQkgICAgIDogOiAiZXNpIiwgImVkaSIsICJtZW1vcnkiKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5heCA9IDB4MDIwMTsJCS8qIExlZ2FjeSBSZWFkLCBvbmUgc2VjdG9yICovCisJaXJlZy5jeCA9IDB4MDAwMTsJCS8qIFNlY3RvciAwLTAtMSAqLworCWlyZWcuZGwgPSBkZXZubzsKKwlpcmVnLmJ4ID0gKHNpemVfdClidWY7CiAKLQlyZXR1cm4gLSh1OClheDsJCS8qIDAgb3IgLTEgKi8KKwlpbnRjYWxsKDB4MTMsICZpcmVnLCAmb3JlZyk7CisKKwlyZXR1cm4gLShvcmVnLmVmbGFncyAmIFg4Nl9FRkxBR1NfQ0YpOyAvKiAwIG9yIC0xICovCiB9CiAKIHN0YXRpYyB1MzIgcmVhZF9tYnJfc2lnKHU4IGRldm5vLCBzdHJ1Y3QgZWRkX2luZm8gKmVpLCB1MzIgKm1icnNpZykKQEAgLTcyLDU2ICs3Myw0NiBAQAogCiBzdGF0aWMgaW50IGdldF9lZGRfaW5mbyh1OCBkZXZubywgc3RydWN0IGVkZF9pbmZvICplaSkKIHsKLQl1MTYgYXgsIGJ4LCBjeCwgZHgsIGRpOworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCiAJbWVtc2V0KGVpLCAwLCBzaXplb2YgKmVpKTsKIAogCS8qIENoZWNrIEV4dGVuc2lvbnMgUHJlc2VudCAqLwogCi0JYXggPSAweDQxMDA7Ci0JYnggPSBFRERNQUdJQzE7Ci0JZHggPSBkZXZubzsKLQlhc20oInB1c2hmbDsgc3RjOyBpbnQgJDB4MTM7IHNldGMgJSVhbDsgcG9wZmwiCi0JICAgIDogIithIiAoYXgpLCAiK2IiIChieCksICI9YyIgKGN4KSwgIitkIiAoZHgpCi0JICAgIDogOiAiZXNpIiwgImVkaSIpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmFoID0gMHg0MTsKKwlpcmVnLmJ4ID0gRURETUFHSUMxOworCWlyZWcuZGwgPSBkZXZubzsKKwlpbnRjYWxsKDB4MTMsICZpcmVnLCAmb3JlZyk7CiAKLQlpZiAoKHU4KWF4KQorCWlmIChvcmVnLmVmbGFncyAmIFg4Nl9FRkxBR1NfQ0YpCiAJCXJldHVybiAtMTsJLyogTm8gZXh0ZW5kZWQgaW5mb3JtYXRpb24gKi8KIAotCWlmIChieCAhPSBFRERNQUdJQzIpCisJaWYgKG9yZWcuYnggIT0gRURETUFHSUMyKQogCQlyZXR1cm4gLTE7CiAKIAllaS0+ZGV2aWNlICA9IGRldm5vOwotCWVpLT52ZXJzaW9uID0gYXggPj4gODsJLyogRUREIHZlcnNpb24gbnVtYmVyICovCi0JZWktPmludGVyZmFjZV9zdXBwb3J0ID0gY3g7IC8qIEVERCBmdW5jdGlvbmFsaXR5IHN1YnNldHMgKi8KKwllaS0+dmVyc2lvbiA9IG9yZWcuYWg7CQkgLyogRUREIHZlcnNpb24gbnVtYmVyICovCisJZWktPmludGVyZmFjZV9zdXBwb3J0ID0gb3JlZy5jeDsgLyogRUREIGZ1bmN0aW9uYWxpdHkgc3Vic2V0cyAqLwogCiAJLyogRXh0ZW5kZWQgR2V0IERldmljZSBQYXJhbWV0ZXJzICovCiAKIAllaS0+cGFyYW1zLmxlbmd0aCA9IHNpemVvZihlaS0+cGFyYW1zKTsKLQlheCA9IDB4NDgwMDsKLQlkeCA9IGRldm5vOwotCWFzbSgicHVzaGZsOyBpbnQgJDB4MTM7IHBvcGZsIgotCSAgICA6ICIrYSIgKGF4KSwgIitkIiAoZHgpLCAiPW0iIChlaS0+cGFyYW1zKQotCSAgICA6ICJTIiAoJmVpLT5wYXJhbXMpCi0JICAgIDogImVieCIsICJlY3giLCAiZWRpIik7CisJaXJlZy5haCA9IDB4NDg7CisJaXJlZy5zaSA9IChzaXplX3QpJmVpLT5wYXJhbXM7CisJaW50Y2FsbCgweDEzLCAmaXJlZywgJm9yZWcpOwogCiAJLyogR2V0IGxlZ2FjeSBDSFMgcGFyYW1ldGVycyAqLwogCiAJLyogUmFsZiBCcm93biByZWNvbW1lbmRzIHNldHRpbmcgRVM6REkgdG8gMDowICovCi0JYXggPSAweDA4MDA7Ci0JZHggPSBkZXZubzsKLQlkaSA9IDA7Ci0JYXNtKCJwdXNodyAlJWVzOyAiCi0JICAgICJtb3Z3ICUlZGksJSVlczsgIgotCSAgICAicHVzaGZsOyBzdGM7IGludCAkMHgxMzsgc2V0YyAlJWFsOyBwb3BmbDsgIgotCSAgICAicG9wdyAlJWVzIgotCSAgICA6ICIrYSIgKGF4KSwgIj1iIiAoYngpLCAiPWMiIChjeCksICIrZCIgKGR4KSwgIitEIiAoZGkpCi0JICAgIDogOiAiZXNpIik7CisJaXJlZy5haCA9IDB4MDg7CisJaXJlZy5lcyA9IDA7CisJaW50Y2FsbCgweDEzLCAmaXJlZywgJm9yZWcpOwogCi0JaWYgKCh1OClheCA9PSAwKSB7Ci0JCWVpLT5sZWdhY3lfbWF4X2N5bGluZGVyID0gKGN4ID4+IDgpICsgKChjeCAmIDB4YzApIDw8IDIpOwotCQllaS0+bGVnYWN5X21heF9oZWFkID0gZHggPj4gODsKLQkJZWktPmxlZ2FjeV9zZWN0b3JzX3Blcl90cmFjayA9IGN4ICYgMHgzZjsKKwlpZiAoIShvcmVnLmVmbGFncyAmIFg4Nl9FRkxBR1NfQ0YpKSB7CisJCWVpLT5sZWdhY3lfbWF4X2N5bGluZGVyID0gb3JlZy5jaCArICgob3JlZy5jbCAmIDB4YzApIDw8IDIpOworCQllaS0+bGVnYWN5X21heF9oZWFkID0gb3JlZy5kaDsKKwkJZWktPmxlZ2FjeV9zZWN0b3JzX3Blcl90cmFjayA9IG9yZWcuY2wgJiAweDNmOwogCX0KIAogCXJldHVybiAwOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9oZWFkZXIuUyBiL2FyY2gveDg2L2Jvb3QvaGVhZGVyLlMKaW5kZXggNWQ4NGQxYy4uYjMxY2M1NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9oZWFkZXIuUworKysgYi9hcmNoL3g4Ni9ib290L2hlYWRlci5TCkBAIC0yMiw3ICsyMiw4IEBACiAjaW5jbHVkZSA8YXNtL3BhZ2VfdHlwZXMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlICJib290LmgiCi0jaW5jbHVkZSAib2Zmc2V0cy5oIgorI2luY2x1ZGUgInZvZmZzZXQuaCIKKyNpbmNsdWRlICJ6b2Zmc2V0LmgiCiAKIEJPT1RTRUcJCT0gMHgwN0MwCQkvKiBvcmlnaW5hbCBhZGRyZXNzIG9mIGJvb3Qtc2VjdG9yICovCiBTWVNTRUcJCT0gMHgxMDAwCQkvKiBoaXN0b3JpY2FsIGxvYWQgYWRkcmVzcyA+PiA0ICovCkBAIC0xMTUsNyArMTE2LDcgQEAKIAkjIFBhcnQgMiBvZiB0aGUgaGVhZGVyLCBmcm9tIHRoZSBvbGQgc2V0dXAuUwogCiAJCS5hc2NpaQkiSGRyUyIJCSMgaGVhZGVyIHNpZ25hdHVyZQotCQkud29yZAkweDAyMDkJCSMgaGVhZGVyIHZlcnNpb24gbnVtYmVyICg+PSAweDAxMDUpCisJCS53b3JkCTB4MDIwYQkJIyBoZWFkZXIgdmVyc2lvbiBudW1iZXIgKD49IDB4MDEwNSkKIAkJCQkJIyBvciBlbHNlIG9sZCBsb2FkbGluLTEuNSB3aWxsIGZhaWwpCiAJCS5nbG9ibCByZWFsbW9kZV9zd3RjaAogcmVhbG1vZGVfc3d0Y2g6CS53b3JkCTAsIDAJCSMgZGVmYXVsdF9zd2l0Y2gsIFNFVFVQU0VHCkBAIC0xNjgsNyArMTY5LDExIEBACiAJCQkJCSMgZW5kIG9mIHNldHVwIGNvZGUgY2FuIGJlIHVzZWQgYnkgc2V0dXAKIAkJCQkJIyBmb3IgbG9jYWwgaGVhcCBwdXJwb3Nlcy4KIAotcGFkMToJCS53b3JkCTAKK2V4dF9sb2FkZXJfdmVyOgorCQkuYnl0ZQkwCQkjIEV4dGVuZGVkIGJvb3QgbG9hZGVyIHZlcnNpb24KK2V4dF9sb2FkZXJfdHlwZToKKwkJLmJ5dGUJMAkJIyBFeHRlbmRlZCBib290IGxvYWRlciB0eXBlCisKIGNtZF9saW5lX3B0cjoJLmxvbmcJMAkJIyAoSGVhZGVyIHZlcnNpb24gMHgwMjAyIG9yIGxhdGVyKQogCQkJCQkjIElmIG5vbnplcm8sIGEgMzItYml0IHBvaW50ZXIKIAkJCQkJIyB0byB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4KQEAgLTIwMCw3ICsyMDUsNyBAQAogI2Vsc2UKIHJlbG9jYXRhYmxlX2tlcm5lbDogICAgLmJ5dGUgMAogI2VuZGlmCi1wYWQyOgkJCS5ieXRlIDAKK21pbl9hbGlnbm1lbnQ6CQkuYnl0ZSBNSU5fS0VSTkVMX0FMSUdOX0xHMgkjIG1pbmltdW0gYWxpZ25tZW50CiBwYWQzOgkJCS53b3JkIDAKIAogY21kbGluZV9zaXplOiAgIC5sb25nICAgQ09NTUFORF9MSU5FX1NJWkUtMSAgICAgI2xlbmd0aCBvZiB0aGUgY29tbWFuZCBsaW5lLApAQCAtMjEyLDE2ICsyMTcsMjcgQEAKIAogaGFyZHdhcmVfc3ViYXJjaF9kYXRhOgkucXVhZCAwCiAKLXBheWxvYWRfb2Zmc2V0OgkJLmxvbmcgaW5wdXRfZGF0YQotcGF5bG9hZF9sZW5ndGg6CQkubG9uZyBpbnB1dF9kYXRhX2VuZC1pbnB1dF9kYXRhCitwYXlsb2FkX29mZnNldDoJCS5sb25nIFpPX2lucHV0X2RhdGEKK3BheWxvYWRfbGVuZ3RoOgkJLmxvbmcgWk9fel9pbnB1dF9sZW4KIAogc2V0dXBfZGF0YToJCS5xdWFkIDAJCQkjIDY0LWJpdCBwaHlzaWNhbCBwb2ludGVyIHRvCiAJCQkJCQkjIHNpbmdsZSBsaW5rZWQgbGlzdCBvZgogCQkJCQkJIyBzdHJ1Y3Qgc2V0dXBfZGF0YQogCitwcmVmX2FkZHJlc3M6CQkucXVhZCBMT0FEX1BIWVNJQ0FMX0FERFIJIyBwcmVmZXJyZWQgbG9hZCBhZGRyCisKKyNkZWZpbmUgWk9fSU5JVF9TSVpFCShaT19fZW5kIC0gWk9fc3RhcnR1cF8zMiArIFpPX3pfZXh0cmFjdF9vZmZzZXQpCisjZGVmaW5lIFZPX0lOSVRfU0laRQkoVk9fX2VuZCAtIFZPX190ZXh0KQorI2lmIFpPX0lOSVRfU0laRSA+IFZPX0lOSVRfU0laRQorI2RlZmluZSBJTklUX1NJWkUgWk9fSU5JVF9TSVpFCisjZWxzZQorI2RlZmluZSBJTklUX1NJWkUgVk9fSU5JVF9TSVpFCisjZW5kaWYKK2luaXRfc2l6ZToJCS5sb25nIElOSVRfU0laRQkJIyBrZXJuZWwgaW5pdGlhbGl6YXRpb24gc2l6ZQorCiAjIEVuZCBvZiBzZXR1cCBoZWFkZXIgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAotCS5zZWN0aW9uICIuaW5pdHRleHQiLCAiYXgiCisJLnNlY3Rpb24gIi5lbnRyeXRleHQiLCAiYXgiCiBzdGFydF9vZl9zZXR1cDoKICNpZmRlZiBTQUZFX1JFU0VUX0RJU0tfQ09OVFJPTExFUgogIyBSZXNldCB0aGUgZGlzayBjb250cm9sbGVyLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9tYWluLmMgYi9hcmNoL3g4Ni9ib290L21haW4uYwppbmRleCA1OGYwNDE1Li4xNDAxNzJiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L21haW4uYworKysgYi9hcmNoL3g4Ni9ib290L21haW4uYwpAQCAtMiw2ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgogICoKICAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCiAgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgpAQCAtNjEsMTEgKzYyLDEwIEBACiAgKi8KIHN0YXRpYyB2b2lkIGtleWJvYXJkX3NldF9yZXBlYXQodm9pZCkKIHsKLQl1MTYgYXggPSAweDAzMDU7Ci0JdTE2IGJ4ID0gMDsKLQlhc20gdm9sYXRpbGUoImludCAkMHgxNiIKLQkJICAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpCi0JCSAgICAgOiA6ICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZzsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5heCA9IDB4MDMwNTsKKwlpbnRjYWxsKDB4MTYsICZpcmVnLCBOVUxMKTsKIH0KIAogLyoKQEAgLTczLDE4ICs3MywyMiBAQAogICovCiBzdGF0aWMgdm9pZCBxdWVyeV9pc3Qodm9pZCkKIHsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKKwogCS8qIFNvbWUgb2xkZXIgQklPU2VzIGFwcGFyZW50bHkgY3Jhc2ggb24gdGhpcyBjYWxsLCBzbyBmaWx0ZXIKIAkgICBpdCBmcm9tIG1hY2hpbmVzIHRvbyBvbGQgdG8gaGF2ZSBTcGVlZFN0ZXAgYXQgYWxsLiAqLwogCWlmIChjcHUubGV2ZWwgPCA2KQogCQlyZXR1cm47CiAKLQlhc20oImludCAkMHgxNSIKLQkgICAgOiAiPWEiIChib290X3BhcmFtcy5pc3RfaW5mby5zaWduYXR1cmUpLAotCSAgICAgICI9YiIgKGJvb3RfcGFyYW1zLmlzdF9pbmZvLmNvbW1hbmQpLAotCSAgICAgICI9YyIgKGJvb3RfcGFyYW1zLmlzdF9pbmZvLmV2ZW50KSwKLQkgICAgICAiPWQiIChib290X3BhcmFtcy5pc3RfaW5mby5wZXJmX2xldmVsKQotCSAgICA6ICJhIiAoMHgwMDAwZTk4MCksCSAvKiBJU1QgU3VwcG9ydCAqLwotCSAgICAgICJkIiAoMHg0NzUzNDk0MykpOyAvKiBSZXF1ZXN0IHZhbHVlICovCisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggID0gMHhlOTgwOwkgLyogSVNUIFN1cHBvcnQgKi8KKwlpcmVnLmVkeCA9IDB4NDc1MzQ5NDM7CSAvKiBSZXF1ZXN0IHZhbHVlICovCisJaW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOworCisJYm9vdF9wYXJhbXMuaXN0X2luZm8uc2lnbmF0dXJlICA9IG9yZWcuZWF4OworCWJvb3RfcGFyYW1zLmlzdF9pbmZvLmNvbW1hbmQgICAgPSBvcmVnLmVieDsKKwlib290X3BhcmFtcy5pc3RfaW5mby5ldmVudCAgICAgID0gb3JlZy5lY3g7CisJYm9vdF9wYXJhbXMuaXN0X2luZm8ucGVyZl9sZXZlbCA9IG9yZWcuZWR4OwogfQogCiAvKgpAQCAtOTMsMTMgKzk3LDEyIEBACiBzdGF0aWMgdm9pZCBzZXRfYmlvc19tb2RlKHZvaWQpCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAotCXUzMiBlYXgsIGVieDsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZzsKIAotCWVheCA9IDB4ZWMwMDsKLQllYnggPSAyOwotCWFzbSB2b2xhdGlsZSgiaW50ICQweDE1IgotCQkgICAgIDogIithIiAoZWF4KSwgIitiIiAoZWJ4KQotCQkgICAgIDogOiAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweGVjMDA7CisJaXJlZy5ieCA9IDI7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgTlVMTCk7CiAjZW5kaWYKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9tY2EuYyBiL2FyY2gveDg2L2Jvb3QvbWNhLmMKaW5kZXggOTExZWFhZS4uYTk1YTUzMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC9tY2EuYworKysgYi9hcmNoL3g4Ni9ib290L21jYS5jCkBAIC0yLDYgKzIsNyBAQAogICoKICAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKiAgIENvcHlyaWdodCAyMDA3IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCiAgKgogICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKICAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCkBAIC0xNiwyNiArMTcsMjIgQEAKIAogaW50IHF1ZXJ5X21jYSh2b2lkKQogewotCXU4IGVycjsKLQl1MTYgZXMsIGJ4LCBsZW47CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CisJdTE2IGxlbjsKIAotCWFzbSgicHVzaHcgJSVlcyA7ICIKLQkgICAgImludCAkMHgxNSA7ICIKLQkgICAgInNldGMgJTAgOyAiCi0JICAgICJtb3Z3ICUlZXMsICUxIDsgIgotCSAgICAicG9wdyAlJWVzIgotCSAgICA6ICI9YWNkIiAoZXJyKSwgIj1hY2RTRCIgKGVzKSwgIj1iIiAoYngpCi0JICAgIDogImEiICgweGMwMDApKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5haCA9IDB4YzA7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOwogCi0JaWYgKGVycikKKwlpZiAob3JlZy5lZmxhZ3MgJiBYODZfRUZMQUdTX0NGKQogCQlyZXR1cm4gLTE7CS8qIE5vIE1DQSBwcmVzZW50ICovCiAKLQlzZXRfZnMoZXMpOwotCWxlbiA9IHJkZnMxNihieCk7CisJc2V0X2ZzKG9yZWcuZXMpOworCWxlbiA9IHJkZnMxNihvcmVnLmJ4KTsKIAogCWlmIChsZW4gPiBzaXplb2YoYm9vdF9wYXJhbXMuc3lzX2Rlc2NfdGFibGUpKQogCQlsZW4gPSBzaXplb2YoYm9vdF9wYXJhbXMuc3lzX2Rlc2NfdGFibGUpOwogCi0JY29weV9mcm9tX2ZzKCZib290X3BhcmFtcy5zeXNfZGVzY190YWJsZSwgYngsIGxlbik7CisJY29weV9mcm9tX2ZzKCZib290X3BhcmFtcy5zeXNfZGVzY190YWJsZSwgb3JlZy5ieCwgbGVuKTsKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvbWVtb3J5LmMgYi9hcmNoL3g4Ni9ib290L21lbW9yeS5jCmluZGV4IDc0YjNkMmIuLmNhZTNmZWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3QvbWVtb3J5LmMKKysrIGIvYXJjaC94ODYvYm9vdC9tZW1vcnkuYwpAQCAtMjAsMTIgKzIwLDE2IEBACiBzdGF0aWMgaW50IGRldGVjdF9tZW1vcnlfZTgyMCh2b2lkKQogewogCWludCBjb3VudCA9IDA7Ci0JdTMyIG5leHQgPSAwOwotCXUzMiBzaXplLCBpZCwgZWRpOwotCXU4IGVycjsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAlzdHJ1Y3QgZTgyMGVudHJ5ICpkZXNjID0gYm9vdF9wYXJhbXMuZTgyMF9tYXA7CiAJc3RhdGljIHN0cnVjdCBlODIwZW50cnkgYnVmOyAvKiBzdGF0aWMgc28gaXQgaXMgemVyb2VkICovCiAKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5heCAgPSAweGU4MjA7CisJaXJlZy5jeCAgPSBzaXplb2YgYnVmOworCWlyZWcuZWR4ID0gU01BUDsKKwlpcmVnLmRpICA9IChzaXplX3QpJmJ1ZjsKKwogCS8qCiAJICogTm90ZTogYXQgbGVhc3Qgb25lIEJJT1MgaXMga25vd24gd2hpY2ggYXNzdW1lcyB0aGF0IHRoZQogCSAqIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IG9uZSBlODIwIGNhbGwgaXMgdGhlIHNhbWUgb25lIGFzCkBAIC00MSwyMiArNDUsMTMgQEAKIAkgKi8KIAogCWRvIHsKLQkJc2l6ZSA9IHNpemVvZiBidWY7Ci0KLQkJLyogSW1wb3J0YW50OiAlZWR4IGFuZCAlZXNpIGFyZSBjbG9iYmVyZWQgYnkgc29tZSBCSU9TZXMsCi0JCSAgIHNvIHRoZXkgbXVzdCBiZSBlaXRoZXIgdXNlZCBmb3IgdGhlIGVycm9yIG91dHB1dAotCQkgICBvciBleHBsaWNpdGx5IG1hcmtlZCBjbG9iYmVyZWQuICBHaXZlbiB0aGF0LCBhc3N1bWUgdGhlcmUKLQkJICAgaXMgc29tZXRoaW5nIG91dCB0aGVyZSBjbG9iYmVyaW5nICVlYnAgYW5kICVlZGksIHRvby4gKi8KLQkJYXNtKCJwdXNobCAlJWVicDsgaW50ICQweDE1OyBwb3BsICUlZWJwOyBzZXRjICUwIgotCQkgICAgOiAiPWQiIChlcnIpLCAiK2IiIChuZXh0KSwgIj1hIiAoaWQpLCAiK2MiIChzaXplKSwKLQkJICAgICAgIj1EIiAoZWRpKSwgIittIiAoYnVmKQotCQkgICAgOiAiRCIgKCZidWYpLCAiZCIgKFNNQVApLCAiYSIgKDB4ZTgyMCkKLQkJICAgIDogImVzaSIpOworCQlpbnRjYWxsKDB4MTUsICZpcmVnLCAmb3JlZyk7CisJCWlyZWcuZWJ4ID0gb3JlZy5lYng7IC8qIGZvciBuZXh0IGl0ZXJhdGlvbi4uLiAqLwogCiAJCS8qIEJJT1NlcyB3aGljaCB0ZXJtaW5hdGUgdGhlIGNoYWluIHdpdGggQ0YgPSAxIGFzIG9wcG9zZWQKIAkJICAgdG8gJWVieCA9IDAgZG9uJ3QgYWx3YXlzIHJlcG9ydCB0aGUgU01BUCBzaWduYXR1cmUgb24KIAkJICAgdGhlIGZpbmFsLCBmYWlsaW5nLCBwcm9iZS4gKi8KLQkJaWYgKGVycikKKwkJaWYgKG9yZWcuZWZsYWdzICYgWDg2X0VGTEFHU19DRikKIAkJCWJyZWFrOwogCiAJCS8qIFNvbWUgQklPU2VzIHN0b3AgcmV0dXJuaW5nIFNNQVAgaW4gdGhlIG1pZGRsZSBvZgpAQCAtNjQsNjAgKzU5LDY0IEBACiAJCSAgIHNjcmV3ZWQgdXAgdGhlIG1hcCBhdCB0aGF0IHBvaW50LCB3ZSBtaWdodCBoYXZlIGEKIAkJICAgcGFydGlhbCBtYXAsIHRoZSBmdWxsIG1hcCwgb3IgY29tcGxldGUgZ2FyYmFnZSwgc28KIAkJICAganVzdCByZXR1cm4gZmFpbHVyZS4gKi8KLQkJaWYgKGlkICE9IFNNQVApIHsKKwkJaWYgKG9yZWcuZWF4ICE9IFNNQVApIHsKIAkJCWNvdW50ID0gMDsKIAkJCWJyZWFrOwogCQl9CiAKIAkJKmRlc2MrKyA9IGJ1ZjsKIAkJY291bnQrKzsKLQl9IHdoaWxlIChuZXh0ICYmIGNvdW50IDwgQVJSQVlfU0laRShib290X3BhcmFtcy5lODIwX21hcCkpOworCX0gd2hpbGUgKGlyZWcuZWJ4ICYmIGNvdW50IDwgQVJSQVlfU0laRShib290X3BhcmFtcy5lODIwX21hcCkpOwogCiAJcmV0dXJuIGJvb3RfcGFyYW1zLmU4MjBfZW50cmllcyA9IGNvdW50OwogfQogCiBzdGF0aWMgaW50IGRldGVjdF9tZW1vcnlfZTgwMSh2b2lkKQogewotCXUxNiBheCwgYngsIGN4LCBkeDsKLQl1OCBlcnI7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAKLQlieCA9IGN4ID0gZHggPSAwOwotCWF4ID0gMHhlODAxOwotCWFzbSgic3RjOyBpbnQgJDB4MTU7IHNldGMgJTAiCi0JICAgIDogIj1tIiAoZXJyKSwgIithIiAoYXgpLCAiK2IiIChieCksICIrYyIgKGN4KSwgIitkIiAoZHgpKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5heCA9IDB4ZTgwMTsKKwlpbnRjYWxsKDB4MTUsICZpcmVnLCAmb3JlZyk7CiAKLQlpZiAoZXJyKQorCWlmIChvcmVnLmVmbGFncyAmIFg4Nl9FRkxBR1NfQ0YpCiAJCXJldHVybiAtMTsKIAogCS8qIERvIHdlIHJlYWxseSBuZWVkIHRvIGRvIHRoaXM/ICovCi0JaWYgKGN4IHx8IGR4KSB7Ci0JCWF4ID0gY3g7Ci0JCWJ4ID0gZHg7CisJaWYgKG9yZWcuY3ggfHwgb3JlZy5keCkgeworCQlvcmVnLmF4ID0gb3JlZy5jeDsKKwkJb3JlZy5ieCA9IG9yZWcuZHg7CiAJfQogCi0JaWYgKGF4ID4gMTUqMTAyNCkKKwlpZiAob3JlZy5heCA+IDE1KjEwMjQpIHsKIAkJcmV0dXJuIC0xOwkvKiBCb2d1cyEgKi8KLQotCS8qIFRoaXMgaWdub3JlcyBtZW1vcnkgYWJvdmUgMTZNQiBpZiB3ZSBoYXZlIGEgbWVtb3J5IGhvbGUKLQkgICB0aGVyZS4gIElmIHNvbWVvbmUgYWN0dWFsbHkgZmluZHMgYSBtYWNoaW5lIHdpdGggYSBtZW1vcnkKLQkgICBob2xlIGF0IDE2TUIgYW5kIG5vIHN1cHBvcnQgZm9yIDBFODIwaCB0aGV5IHNob3VsZCBwcm9iYWJseQotCSAgIGdlbmVyYXRlIGEgZmFrZSBlODIwIG1hcC4gKi8KLQlib290X3BhcmFtcy5hbHRfbWVtX2sgPSAoYXggPT0gMTUqMTAyNCkgPyAoZHggPDwgNikrYXggOiBheDsKKwl9IGVsc2UgaWYgKG9yZWcuYXggPT0gMTUqMTAyNCkgeworCQlib290X3BhcmFtcy5hbHRfbWVtX2sgPSAob3JlZy5keCA8PCA2KSArIG9yZWcuYXg7CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVGhpcyBpZ25vcmVzIG1lbW9yeSBhYm92ZSAxNk1CIGlmIHdlIGhhdmUgYSBtZW1vcnkKKwkJICogaG9sZSB0aGVyZS4gIElmIHNvbWVvbmUgYWN0dWFsbHkgZmluZHMgYSBtYWNoaW5lCisJCSAqIHdpdGggYSBtZW1vcnkgaG9sZSBhdCAxNk1CIGFuZCBubyBzdXBwb3J0IGZvcgorCQkgKiAwRTgyMGggdGhleSBzaG91bGQgcHJvYmFibHkgZ2VuZXJhdGUgYSBmYWtlIGU4MjAKKwkJICogbWFwLgorCQkgKi8KKwkJYm9vdF9wYXJhbXMuYWx0X21lbV9rID0gb3JlZy5heDsKKwl9CiAKIAlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBkZXRlY3RfbWVtb3J5Xzg4KHZvaWQpCiB7Ci0JdTE2IGF4OwotCXU4IGVycjsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAotCWF4ID0gMHg4ODAwOwotCWFzbSgic3RjOyBpbnQgJDB4MTU7IHNldGMgJTAiIDogIj1iY2RtIiAoZXJyKSwgIithIiAoYXgpKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5haCA9IDB4ODg7CisJaW50Y2FsbCgweDE1LCAmaXJlZywgJm9yZWcpOwogCi0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8uZXh0X21lbV9rID0gYXg7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8uZXh0X21lbV9rID0gb3JlZy5heDsKIAotCXJldHVybiAtZXJyOworCXJldHVybiAtKG9yZWcuZWZsYWdzICYgWDg2X0VGTEFHU19DRik7IC8qIDAgb3IgLTEgKi8KIH0KIAogaW50IGRldGVjdF9tZW1vcnkodm9pZCkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvcmVncy5jIGIvYXJjaC94ODYvYm9vdC9yZWdzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4MDE5YgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2Jvb3QvcmVncy5jCkBAIC0wLDAgKzEsMjkgQEAKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCisgKgorICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKKyAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIgb3IgKGF0IHlvdXIKKyAqICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbjsgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIFNpbXBsZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGluaXRpYWxpemluZyBhIHJlZ2lzdGVyIHNldC4KKyAqCisgKiBOb3RlIHRoYXQgdGhpcyBzZXRzIEVGTEFHU19DRiBpbiB0aGUgaW5wdXQgcmVnaXN0ZXIgc2V0OyB0aGlzCisgKiBtYWtlcyBpdCBlYXNpZXIgdG8gY2F0Y2ggZnVuY3Rpb25zIHdoaWNoIGRvIG5vdGhpbmcgYnV0IGRvbid0CisgKiBleHBsaWNpdGx5IHNldCBDRi4KKyAqLworCisjaW5jbHVkZSAiYm9vdC5oIgorCit2b2lkIGluaXRyZWdzKHN0cnVjdCBiaW9zcmVncyAqcmVnKQoreworCW1lbXNldChyZWcsIDAsIHNpemVvZiAqcmVnKTsKKwlyZWctPmVmbGFncyB8PSBYODZfRUZMQUdTX0NGOworCXJlZy0+ZHMgPSBkcygpOworCXJlZy0+ZXMgPSBkcygpOworCXJlZy0+ZnMgPSBmcygpOworCXJlZy0+Z3MgPSBncygpOworfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC9zZXR1cC5sZCBiL2FyY2gveDg2L2Jvb3Qvc2V0dXAubGQKaW5kZXggYmI4ZGMyZC4uMGY2ZWM0NTUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2Jvb3Qvc2V0dXAubGQKKysrIGIvYXJjaC94ODYvYm9vdC9zZXR1cC5sZApAQCAtMTUsOCArMTUsMTEgQEAKIAogCS4gPSA0OTc7CiAJLmhlYWRlcgkJOiB7ICooLmhlYWRlcikgfQorCS5lbnRyeXRleHQJOiB7ICooLmVudHJ5dGV4dCkgfQogCS5pbml0dGV4dAk6IHsgKiguaW5pdHRleHQpIH0KIAkuaW5pdGRhdGEJOiB7ICooLmluaXRkYXRhKSB9CisJX19lbmRfaW5pdCA9IC47CisKIAkudGV4dAkJOiB7ICooLnRleHQpIH0KIAkudGV4dDMyCQk6IHsgKigudGV4dDMyKSB9CiAKQEAgLTUyLDQgKzU1LDcgQEAKIAogCS4gPSBBU1NFUlQoX2VuZCA8PSAweDgwMDAsICJTZXR1cCB0b28gYmlnISIpOwogCS4gPSBBU1NFUlQoaGRyID09IDB4MWYxLCAiVGhlIHNldHVwIGhlYWRlciBoYXMgdGhlIHdyb25nIG9mZnNldCEiKTsKKwkvKiBOZWNlc3NhcnkgZm9yIHRoZSB2ZXJ5LW9sZC1sb2FkZXIgY2hlY2sgdG8gd29yay4uLiAqLworCS4gPSBBU1NFUlQoX19lbmRfaW5pdCA8PSA1KjUxMiwgImluaXQgc2VjdGlvbnMgdG9vIGJpZyEiKTsKKwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC90dHkuYyBiL2FyY2gveDg2L2Jvb3QvdHR5LmMKaW5kZXggN2U4ZThiMi4uMDFlYzY5YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC90dHkuYworKysgYi9hcmNoL3g4Ni9ib290L3R0eS5jCkBAIC0yLDYgKzIsNyBAQAogICoKICAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKiAgIENvcHlyaWdodCAyMDA3IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCiAgKgogICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKICAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCkBAIC0yMiwyNCArMjMsMjMgQEAKIAogdm9pZCBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCIuaW5pdHRleHQiKSkpIHB1dGNoYXIoaW50IGNoKQogewotCXVuc2lnbmVkIGNoYXIgYyA9IGNoOworCXN0cnVjdCBiaW9zcmVncyBpcmVnOwogCi0JaWYgKGMgPT0gJ1xuJykKKwlpZiAoY2ggPT0gJ1xuJykKIAkJcHV0Y2hhcignXHInKTsJLyogXG4gLT4gXHJcbiAqLwogCi0JLyogaW50ICQweDEwIGlzIGtub3duIHRvIGhhdmUgYnVncyBpbnZvbHZpbmcgdG91Y2hpbmcgcmVnaXN0ZXJzCi0JICAgaXQgc2hvdWxkbid0LiAgQmUgZXh0cmEgY29uc2VydmF0aXZlLi4uICovCi0JYXNtIHZvbGF0aWxlKCJwdXNoYWw7IHB1c2h3ICUlZHM7IGludCAkMHgxMDsgcG9wdyAlJWRzOyBwb3BhbCIKLQkJICAgICA6IDogImIiICgweDAwMDcpLCAiYyIgKDB4MDAwMSksICJhIiAoMHgwZTAwfGNoKSk7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYnggPSAweDAwMDc7CisJaXJlZy5jeCA9IDB4MDAwMTsKKwlpcmVnLmFoID0gMHgwZTsKKwlpcmVnLmFsID0gY2g7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiB9CiAKIHZvaWQgX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiLmluaXR0ZXh0IikpKSBwdXRzKGNvbnN0IGNoYXIgKnN0cikKIHsKLQlpbnQgbiA9IDA7Ci0Jd2hpbGUgKCpzdHIpIHsKKwl3aGlsZSAoKnN0cikKIAkJcHV0Y2hhcigqc3RyKyspOwotCQluKys7Ci0JfQogfQogCiAvKgpAQCAtNDksMTQgKzQ5LDEzIEBACiAKIHN0YXRpYyB1OCBnZXR0aW1lKHZvaWQpCiB7Ci0JdTE2IGF4ID0gMHgwMjAwOwotCXUxNiBjeCwgZHg7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAKLQlhc20gdm9sYXRpbGUoImludCAkMHgxYSIKLQkJICAgICA6ICIrYSIgKGF4KSwgIj1jIiAoY3gpLCAiPWQiIChkeCkKLQkJICAgICA6IDogImVieCIsICJlc2kiLCAiZWRpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYWggPSAweDAyOworCWludGNhbGwoMHgxYSwgJmlyZWcsICZvcmVnKTsKIAotCXJldHVybiBkeCA+PiA4OworCXJldHVybiBvcmVnLmRoOwogfQogCiAvKgpAQCAtNjQsMTkgKzYzLDI0IEBACiAgKi8KIGludCBnZXRjaGFyKHZvaWQpCiB7Ci0JdTE2IGF4ID0gMDsKLQlhc20gdm9sYXRpbGUoImludCAkMHgxNiIgOiAiK2EiIChheCkpOworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCi0JcmV0dXJuIGF4ICYgMHhmZjsKKwlpbml0cmVncygmaXJlZyk7CisJLyogaXJlZy5haCA9IDB4MDA7ICovCisJaW50Y2FsbCgweDE2LCAmaXJlZywgJm9yZWcpOworCisJcmV0dXJuIG9yZWcuYWw7CiB9CiAKIHN0YXRpYyBpbnQga2JkX3BlbmRpbmcodm9pZCkKIHsKLQl1OCBwZW5kaW5nOwotCWFzbSB2b2xhdGlsZSgiaW50ICQweDE2OyBzZXRueiAlMCIKLQkJICAgICA6ICI9cW0iIChwZW5kaW5nKQotCQkgICAgIDogImEiICgweDAxMDApKTsKLQlyZXR1cm4gcGVuZGluZzsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKKworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmFoID0gMHgwMTsKKwlpbnRjYWxsKDB4MTYsICZpcmVnLCAmb3JlZyk7CisKKwlyZXR1cm4gIShvcmVnLmVmbGFncyAmIFg4Nl9FRkxBR1NfWkYpOwogfQogCiB2b2lkIGtiZF9mbHVzaCh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC92aWRlby1iaW9zLmMgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLWJpb3MuYwppbmRleCAzZmE5NzljLi5kNjYwYmU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3ZpZGVvLWJpb3MuYworKysgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLWJpb3MuYwpAQCAtMiw2ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgogICoKICAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCiAgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgpAQCAtMjksMjEgKzMwLDIxIEBACiAKIHN0YXRpYyBpbnQgc2V0X2Jpb3NfbW9kZSh1OCBtb2RlKQogewotCXUxNiBheDsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAl1OCBuZXdfbW9kZTsKIAotCWF4ID0gbW9kZTsJCS8qIEFIPTB4MDAgU2V0IFZpZGVvIE1vZGUgKi8KLQlhc20gdm9sYXRpbGUoSU5UMTAKLQkJICAgICA6ICIrYSIgKGF4KQotCQkgICAgIDogOiAiZWJ4IiwgImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmFsID0gbW9kZTsJCS8qIEFIPTB4MDAgU2V0IFZpZGVvIE1vZGUgKi8KKwlpbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKIAotCWF4ID0gMHgwZjAwOwkJLyogR2V0IEN1cnJlbnQgVmlkZW8gTW9kZSAqLwotCWFzbSB2b2xhdGlsZShJTlQxMAotCQkgICAgIDogIithIiAoYXgpCi0JCSAgICAgOiA6ICJlYngiLCAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7CisKKwlpcmVnLmFoID0gMHgwZjsJCS8qIEdldCBDdXJyZW50IFZpZGVvIE1vZGUgKi8KKwlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAKIAlkb19yZXN0b3JlID0gMTsJCS8qIEFzc3VtZSB2aWRlbyBjb250ZW50cyB3ZXJlIGxvc3QgKi8KLQluZXdfbW9kZSA9IGF4ICYgMHg3ZjsJLyogTm90IGFsbCBCSU9TZXMgYXJlIGNsZWFuIHdpdGggdGhlIHRvcCBiaXQgKi8KKworCS8qIE5vdCBhbGwgQklPU2VzIGFyZSBjbGVhbiB3aXRoIHRoZSB0b3AgYml0ICovCisJbmV3X21vZGUgPSBpcmVnLmFsICYgMHg3ZjsKIAogCWlmIChuZXdfbW9kZSA9PSBtb2RlKQogCQlyZXR1cm4gMDsJLyogTW9kZSBjaGFuZ2UgT0sgKi8KQEAgLTUzLDEwICs1NCw4IEBACiAJCS8qIE1vZGUgc2V0dGluZyBmYWlsZWQsIGJ1dCB3ZSBkaWRuJ3QgZW5kIHVwIHdoZXJlIHdlCiAJCSAgIHN0YXJ0ZWQuICBUaGF0J3MgYmFkLiAgVHJ5IHRvIHJldmVydCB0byB0aGUgb3JpZ2luYWwKIAkJICAgdmlkZW8gbW9kZS4gKi8KLQkJYXggPSBib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX21vZGU7Ci0JCWFzbSB2b2xhdGlsZShJTlQxMAotCQkJICAgICA6ICIrYSIgKGF4KQotCQkJICAgICA6IDogImVieCIsICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwkJaXJlZy5heCA9IGJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLm9yaWdfdmlkZW9fbW9kZTsKKwkJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiAJfQogI2VuZGlmCiAJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC92aWRlby12ZXNhLmMgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYwppbmRleCA0YTU4YzhjLi5jNzAwMTQ3IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYworKysgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLXZlc2EuYwpAQCAtMiw2ICsyLDcgQEAKICAqCiAgKiAgIENvcHlyaWdodCAoQykgMTk5MSwgMTk5MiBMaW51cyBUb3J2YWxkcwogICogICBDb3B5cmlnaHQgMjAwNyByUGF0aCwgSW5jLiAtIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqICAgQ29weXJpZ2h0IDIwMDkgSW50ZWwgQ29ycG9yYXRpb247IGF1dGhvciBILiBQZXRlciBBbnZpbgogICoKICAqICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCwgYW5kIGlzIG1hZGUgYXZhaWxhYmxlIHVuZGVyCiAgKiAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyLgpAQCAtMzEsNyArMzIsNyBAQAogc3RhdGljIGludCB2ZXNhX3Byb2JlKHZvaWQpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfVklERU9fVkVTQSkgfHwgZGVmaW5lZChDT05GSUdfRklSTVdBUkVfRURJRCkKLQl1MTYgYXgsIGN4LCBkaTsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAl1MTYgbW9kZTsKIAlhZGRyX3QgbW9kZV9wdHI7CiAJc3RydWN0IG1vZGVfaW5mbyAqbWk7CkBAIC0zOSwxMyArNDAsMTIgQEAKIAogCXZpZGVvX3Zlc2EubW9kZXMgPSBHRVRfSEVBUChzdHJ1Y3QgbW9kZV9pbmZvLCAwKTsKIAotCWF4ID0gMHg0ZjAwOwotCWRpID0gKHNpemVfdCkmdmdpbmZvOwotCWFzbShJTlQxMAotCSAgICA6ICIrYSIgKGF4KSwgIitEIiAoZGkpLCAiPW0iICh2Z2luZm8pCi0JICAgIDogOiAiZWJ4IiwgImVjeCIsICJlZHgiLCAiZXNpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweDRmMDA7CisJaXJlZy5kaSA9IChzaXplX3QpJnZnaW5mbzsKKwlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAKLQlpZiAoYXggIT0gMHgwMDRmIHx8CisJaWYgKGlyZWcuYXggIT0gMHgwMDRmIHx8CiAJICAgIHZnaW5mby5zaWduYXR1cmUgIT0gVkVTQV9NQUdJQyB8fAogCSAgICB2Z2luZm8udmVyc2lvbiA8IDB4MDEwMikKIAkJcmV0dXJuIDA7CS8qIE5vdCBwcmVzZW50ICovCkBAIC02NSwxNCArNjUsMTIgQEAKIAogCQltZW1zZXQoJnZtaW5mbywgMCwgc2l6ZW9mIHZtaW5mbyk7IC8qIEp1c3QgaW4gY2FzZS4uLiAqLwogCi0JCWF4ID0gMHg0ZjAxOwotCQljeCA9IG1vZGU7Ci0JCWRpID0gKHNpemVfdCkmdm1pbmZvOwotCQlhc20oSU5UMTAKLQkJICAgIDogIithIiAoYXgpLCAiK2MiIChjeCksICIrRCIgKGRpKSwgIj1tIiAodm1pbmZvKQotCQkgICAgOiA6ICJlYngiLCAiZWR4IiwgImVzaSIpOworCQlpcmVnLmF4ID0gMHg0ZjAxOworCQlpcmVnLmN4ID0gbW9kZTsKKwkJaXJlZy5kaSA9IChzaXplX3QpJnZtaW5mbzsKKwkJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCi0JCWlmIChheCAhPSAweDAwNGYpCisJCWlmIChpcmVnLmF4ICE9IDB4MDA0ZikKIAkJCWNvbnRpbnVlOwogCiAJCWlmICgodm1pbmZvLm1vZGVfYXR0ciAmIDB4MTUpID09IDB4MDUpIHsKQEAgLTExMSwyMCArMTA5LDE5IEBACiAKIHN0YXRpYyBpbnQgdmVzYV9zZXRfbW9kZShzdHJ1Y3QgbW9kZV9pbmZvICptb2RlKQogewotCXUxNiBheCwgYngsIGN4LCBkaTsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAlpbnQgaXNfZ3JhcGhpYzsKIAl1MTYgdmVzYV9tb2RlID0gbW9kZS0+bW9kZSAtIFZJREVPX0ZJUlNUX1ZFU0E7CiAKIAltZW1zZXQoJnZtaW5mbywgMCwgc2l6ZW9mIHZtaW5mbyk7IC8qIEp1c3QgaW4gY2FzZS4uLiAqLwogCi0JYXggPSAweDRmMDE7Ci0JY3ggPSB2ZXNhX21vZGU7Ci0JZGkgPSAoc2l6ZV90KSZ2bWluZm87Ci0JYXNtKElOVDEwCi0JICAgIDogIithIiAoYXgpLCAiK2MiIChjeCksICIrRCIgKGRpKSwgIj1tIiAodm1pbmZvKQotCSAgICA6IDogImVieCIsICJlZHgiLCAiZXNpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYXggPSAweDRmMDE7CisJaXJlZy5jeCA9IHZlc2FfbW9kZTsKKwlpcmVnLmRpID0gKHNpemVfdCkmdm1pbmZvOworCWludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKIAotCWlmIChheCAhPSAweDAwNGYpCisJaWYgKG9yZWcuYXggIT0gMHgwMDRmKQogCQlyZXR1cm4gLTE7CiAKIAlpZiAoKHZtaW5mby5tb2RlX2F0dHIgJiAweDE1KSA9PSAweDA1KSB7CkBAIC0xNDEsMTQgKzEzOCwxMiBAQAogCX0KIAogCi0JYXggPSAweDRmMDI7Ci0JYnggPSB2ZXNhX21vZGU7Ci0JZGkgPSAwOwotCWFzbSB2b2xhdGlsZShJTlQxMAotCQkgICAgIDogIithIiAoYXgpLCAiK2IiIChieCksICIrRCIgKGRpKQotCQkgICAgIDogOiAiZWN4IiwgImVkeCIsICJlc2kiKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5heCA9IDB4NGYwMjsKKwlpcmVnLmJ4ID0gdmVzYV9tb2RlOworCWludGNhbGwoMHgxMCwgJmlyZWcsICZvcmVnKTsKIAotCWlmIChheCAhPSAweDAwNGYpCisJaWYgKG9yZWcuYXggIT0gMHgwMDRmKQogCQlyZXR1cm4gLTE7CiAKIAlncmFwaGljX21vZGUgPSBpc19ncmFwaGljOwpAQCAtMTcxLDUwICsxNjYsNDUgQEAKIC8qIFN3aXRjaCBEQUMgdG8gOC1iaXQgbW9kZSAqLwogc3RhdGljIHZvaWQgdmVzYV9kYWNfc2V0XzhiaXRzKHZvaWQpCiB7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAJdTggZGFjX3NpemUgPSA2OwogCiAJLyogSWYgcG9zc2libGUsIHN3aXRjaCB0aGUgREFDIHRvIDgtYml0IG1vZGUgKi8KIAlpZiAodmdpbmZvLmNhcGFiaWxpdGllcyAmIDEpIHsKLQkJdTE2IGF4LCBieDsKLQotCQlheCA9IDB4NGYwODsKLQkJYnggPSAweDA4MDA7Ci0JCWFzbSB2b2xhdGlsZShJTlQxMAotCQkJICAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpCi0JCQkgICAgIDogOiAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7Ci0KLQkJaWYgKGF4ID09IDB4MDA0ZikKLQkJCWRhY19zaXplID0gYnggPj4gODsKKwkJaW5pdHJlZ3MoJmlyZWcpOworCQlpcmVnLmF4ID0gMHg0ZjA4OworCQlpcmVnLmJoID0gMHgwODsKKwkJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOworCQlpZiAob3JlZy5heCA9PSAweDAwNGYpCisJCQlkYWNfc2l6ZSA9IG9yZWcuYmg7CiAJfQogCiAJLyogU2V0IHRoZSBjb2xvciBzaXplcyB0byB0aGUgREFDIHNpemUsIGFuZCBvZmZzZXRzIHRvIDAgKi8KLQlib290X3BhcmFtcy5zY3JlZW5faW5mby5yZWRfc2l6ZSA9IGRhY19zaXplOworCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLnJlZF9zaXplICAgPSBkYWNfc2l6ZTsKIAlib290X3BhcmFtcy5zY3JlZW5faW5mby5ncmVlbl9zaXplID0gZGFjX3NpemU7Ci0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8uYmx1ZV9zaXplID0gZGFjX3NpemU7Ci0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ucnN2ZF9zaXplID0gZGFjX3NpemU7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8uYmx1ZV9zaXplICA9IGRhY19zaXplOworCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLnJzdmRfc2l6ZSAgPSBkYWNfc2l6ZTsKIAotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLnJlZF9wb3MgPSAwOwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLmdyZWVuX3BvcyA9IDA7Ci0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8uYmx1ZV9wb3MgPSAwOwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLnJzdmRfcG9zID0gMDsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5yZWRfcG9zICAgID0gMDsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5ncmVlbl9wb3MgID0gMDsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5ibHVlX3BvcyAgID0gMDsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5yc3ZkX3BvcyAgID0gMDsKIH0KIAogLyogU2F2ZSB0aGUgVkVTQSBwcm90ZWN0ZWQgbW9kZSBpbmZvICovCiBzdGF0aWMgdm9pZCB2ZXNhX3N0b3JlX3BtX2luZm8odm9pZCkKIHsKLQl1MTYgYXgsIGJ4LCBkaSwgZXM7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAKLQlheCA9IDB4NGYwYTsKLQlieCA9IGRpID0gMDsKLQlhc20oInB1c2h3ICUlZXM7ICJJTlQxMCI7IG1vdncgJSVlcywlMDsgcG9wdyAlJWVzIgotCSAgICA6ICI9ZCIgKGVzKSwgIithIiAoYXgpLCAiK2IiIChieCksICIrRCIgKGRpKQotCSAgICA6IDogImVjeCIsICJlc2kiKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5heCA9IDB4NGYwYTsKKwlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAKLQlpZiAoYXggIT0gMHgwMDRmKQorCWlmIChvcmVnLmF4ICE9IDB4MDA0ZikKIAkJcmV0dXJuOwogCi0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8udmVzYXBtX3NlZyA9IGVzOwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLnZlc2FwbV9vZmYgPSBkaTsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby52ZXNhcG1fc2VnID0gb3JlZy5lczsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby52ZXNhcG1fb2ZmID0gb3JlZy5kaTsKIH0KIAogLyoKQEAgLTI1Miw3ICsyNDIsNyBAQAogdm9pZCB2ZXNhX3N0b3JlX2VkaWQodm9pZCkKIHsKICNpZmRlZiBDT05GSUdfRklSTVdBUkVfRURJRAotCXUxNiBheCwgYngsIGN4LCBkeCwgZGk7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAKIAkvKiBBcHBhcmVudGx5IHVzZWQgYXMgYSBub25zZW5zZSB0b2tlbi4uLiAqLwogCW1lbXNldCgmYm9vdF9wYXJhbXMuZWRpZF9pbmZvLCAweDEzLCBzaXplb2YgYm9vdF9wYXJhbXMuZWRpZF9pbmZvKTsKQEAgLTI2MCwzMyArMjUwLDI2IEBACiAJaWYgKHZnaW5mby52ZXJzaW9uIDwgMHgwMjAwKQogCQlyZXR1cm47CQkvKiBFRElEIHJlcXVpcmVzIFZCRSAyLjArICovCiAKLQlheCA9IDB4NGYxNTsJCS8qIFZCRSBEREMgKi8KLQlieCA9IDB4MDAwMDsJCS8qIFJlcG9ydCBEREMgY2FwYWJpbGl0aWVzICovCi0JY3ggPSAwOwkJCS8qIENvbnRyb2xsZXIgMCAqLwotCWRpID0gMDsJCQkvKiBFUzpESSBtdXN0IGJlIDAgYnkgc3BlYyAqLworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmF4ID0gMHg0ZjE1OwkJLyogVkJFIEREQyAqLworCS8qIGlyZWcuYnggPSAweDAwMDA7ICovCQkvKiBSZXBvcnQgRERDIGNhcGFiaWxpdGllcyAqLworCS8qIGlyZWcuY3ggPSAwOwkqLwkJLyogQ29udHJvbGxlciAwICovCisJaXJlZy5lcyA9IDA7CQkJLyogRVM6REkgbXVzdCBiZSAwIGJ5IHNwZWMgKi8KKwlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAKLQkvKiBOb3RlOiBUaGUgVkJFIEREQyBzcGVjIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBtYWluIFZFU0Egc3BlYzsKLQkgICB3ZSBnZW51aW5lbHkgaGF2ZSB0byBhc3N1bWUgYWxsIHJlZ2lzdGVycyBhcmUgZGVzdHJveWVkIGhlcmUuICovCi0KLQlhc20oInB1c2h3ICUlZXM7IG1vdncgJTIsJSVlczsgIklOVDEwIjsgcG9wdyAlJWVzIgotCSAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpLCAiK2MiIChjeCksICIrRCIgKGRpKQotCSAgICA6IDogImVzaSIsICJlZHgiKTsKLQotCWlmIChheCAhPSAweDAwNGYpCisJaWYgKG9yZWcuYXggIT0gMHgwMDRmKQogCQlyZXR1cm47CQkvKiBObyBFRElEICovCiAKIAkvKiBCSCA9IHRpbWUgaW4gc2Vjb25kcyB0byB0cmFuc2ZlciBFREQgaW5mb3JtYXRpb24gKi8KIAkvKiBCTCA9IEREQyBsZXZlbCBzdXBwb3J0ZWQgKi8KIAotCWF4ID0gMHg0ZjE1OwkJLyogVkJFIEREQyAqLwotCWJ4ID0gMHgwMDAxOwkJLyogUmVhZCBFRElEICovCi0JY3ggPSAwOwkJCS8qIENvbnRyb2xsZXIgMCAqLwotCWR4ID0gMDsJCQkvKiBFRElEIGJsb2NrIG51bWJlciAqLwotCWRpID0oc2l6ZV90KSAmYm9vdF9wYXJhbXMuZWRpZF9pbmZvOyAvKiAoRVM6KVBvaW50ZXIgdG8gYmxvY2sgKi8KLQlhc20oSU5UMTAKLQkgICAgOiAiK2EiIChheCksICIrYiIgKGJ4KSwgIitkIiAoZHgpLCAiPW0iIChib290X3BhcmFtcy5lZGlkX2luZm8pLAotCSAgICAgICIrYyIgKGN4KSwgIitEIiAoZGkpCi0JICAgIDogOiAiZXNpIik7CisJaXJlZy5heCA9IDB4NGYxNTsJCS8qIFZCRSBEREMgKi8KKwlpcmVnLmJ4ID0gMHgwMDAxOwkJLyogUmVhZCBFRElEICovCisJLyogaXJlZy5jeCA9IDA7ICovCQkvKiBDb250cm9sbGVyIDAgKi8KKwkvKiBpcmVnLmR4ID0gMDsJKi8JCS8qIEVESUQgYmxvY2sgbnVtYmVyICovCisJaXJlZy5lcyA9IGRzKCk7CisJaXJlZy5kaSA9KHNpemVfdCkmYm9vdF9wYXJhbXMuZWRpZF9pbmZvOyAvKiAoRVM6KVBvaW50ZXIgdG8gYmxvY2sgKi8KKwlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAjZW5kaWYgLyogQ09ORklHX0ZJUk1XQVJFX0VESUQgKi8KIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvYm9vdC92aWRlby12Z2EuYyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8tdmdhLmMKaW5kZXggOWUwNTg3YS4uOGY4ZDgyNyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC92aWRlby12Z2EuYworKysgYi9hcmNoL3g4Ni9ib290L3ZpZGVvLXZnYS5jCkBAIC0yLDYgKzIsNyBAQAogICoKICAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKiAgIENvcHlyaWdodCAyMDA3IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCiAgKgogICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKICAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCkBAIC0zOSwzMCArNDAsMzAgQEAKIC8qIFNldCBiYXNpYyA4MHgyNSBtb2RlICovCiBzdGF0aWMgdTggdmdhX3NldF9iYXNpY19tb2RlKHZvaWQpCiB7CisJc3RydWN0IGJpb3NyZWdzIGlyZWcsIG9yZWc7CiAJdTE2IGF4OwogCXU4IHJvd3M7CiAJdTggbW9kZTsKIAorCWluaXRyZWdzKCZpcmVnKTsKKwogI2lmZGVmIENPTkZJR19WSURFT180MDBfSEFDSwogCWlmIChhZGFwdGVyID49IEFEQVBURVJfVkdBKSB7Ci0JCWFzbSB2b2xhdGlsZShJTlQxMAotCQkJICAgICA6IDogImEiICgweDEyMDIpLCAiYiIgKDB4MDAzMCkKLQkJCSAgICAgOiAiZWN4IiwgImVkeCIsICJlc2kiLCAiZWRpIik7CisJCWlyZWcuYXggPSAweDEyMDI7CisJCWlyZWcuYnggPSAweDAwMzA7CisJCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogCX0KICNlbmRpZgogCiAJYXggPSAweDBmMDA7Ci0JYXNtIHZvbGF0aWxlKElOVDEwCi0JCSAgICAgOiAiK2EiIChheCkKLQkJICAgICA6IDogImVieCIsICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKLQotCW1vZGUgPSAodTgpYXg7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOworCW1vZGUgPSBvcmVnLmFsOwogCiAJc2V0X2ZzKDApOwogCXJvd3MgPSByZGZzOCgweDQ4NCk7CS8qIHJvd3MgbWludXMgb25lICovCiAKICNpZm5kZWYgQ09ORklHX1ZJREVPXzQwMF9IQUNLCi0JaWYgKChheCA9PSAweDUwMDMgfHwgYXggPT0gMHg1MDA3KSAmJgorCWlmICgob3JlZy5heCA9PSAweDUwMDMgfHwgb3JlZy5heCA9PSAweDUwMDcpICYmCiAJICAgIChyb3dzID09IDAgfHwgcm93cyA9PSAyNCkpCiAJCXJldHVybiBtb2RlOwogI2VuZGlmCkBAIC03MSwxMCArNzIsOCBAQAogCQltb2RlID0gMzsKIAogCS8qIFNldCB0aGUgbW9kZSAqLwotCWF4ID0gbW9kZTsKLQlhc20gdm9sYXRpbGUoSU5UMTAKLQkJICAgICA6ICIrYSIgKGF4KQotCQkgICAgIDogOiAiZWJ4IiwgImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOworCWlyZWcuYXggPSBtb2RlOwkJLyogQUg9MDogc2V0IG1vZGUgKi8KKwlpbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKIAlkb19yZXN0b3JlID0gMTsKIAlyZXR1cm4gbW9kZTsKIH0KQEAgLTgyLDQzICs4MSw2OSBAQAogc3RhdGljIHZvaWQgdmdhX3NldF84Zm9udCh2b2lkKQogewogCS8qIFNldCA4eDggZm9udCAtIDgweDQzIG9uIEVHQSwgODB4NTAgb24gVkdBICovCisJc3RydWN0IGJpb3NyZWdzIGlyZWc7CisKKwlpbml0cmVncygmaXJlZyk7CiAKIAkvKiBTZXQgOHg4IGZvbnQgKi8KLQlhc20gdm9sYXRpbGUoSU5UMTAgOiA6ICJhIiAoMHgxMTEyKSwgImIiICgwKSk7CisJaXJlZy5heCA9IDB4MTExMjsKKwkvKiBpcmVnLmJsID0gMDsgKi8KKwlpbnRjYWxsKDB4MTAsICZpcmVnLCBOVUxMKTsKIAogCS8qIFVzZSBhbHRlcm5hdGUgcHJpbnQgc2NyZWVuICovCi0JYXNtIHZvbGF0aWxlKElOVDEwIDogOiAiYSIgKDB4MTIwMCksICJiIiAoMHgyMCkpOworCWlyZWcuYXggPSAweDEyMDA7CisJaXJlZy5ibCA9IDB4MjA7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiAKIAkvKiBUdXJuIG9mZiBjdXJzb3IgZW11bGF0aW9uICovCi0JYXNtIHZvbGF0aWxlKElOVDEwIDogOiAiYSIgKDB4MTIwMSksICJiIiAoMHgzNCkpOworCWlyZWcuYXggPSAweDEyMDE7CisJaXJlZy5ibCA9IDB4MzQ7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiAKIAkvKiBDdXJzb3IgaXMgc2NhbiBsaW5lcyA2LTcgKi8KLQlhc20gdm9sYXRpbGUoSU5UMTAgOiA6ICJhIiAoMHgwMTAwKSwgImMiICgweDA2MDcpKTsKKwlpcmVnLmF4ID0gMHgwMTAwOworCWlyZWcuY3ggPSAweDA2MDc7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZnYV9zZXRfMTRmb250KHZvaWQpCiB7CiAJLyogU2V0IDl4MTQgZm9udCAtIDgweDI4IG9uIFZHQSAqLworCXN0cnVjdCBiaW9zcmVncyBpcmVnOworCisJaW5pdHJlZ3MoJmlyZWcpOwogCiAJLyogU2V0IDl4MTQgZm9udCAqLwotCWFzbSB2b2xhdGlsZShJTlQxMCA6IDogImEiICgweDExMTEpLCAiYiIgKDApKTsKKwlpcmVnLmF4ID0gMHgxMTExOworCS8qIGlyZWcuYmwgPSAwOyAqLworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogCiAJLyogVHVybiBvZmYgY3Vyc29yIGVtdWxhdGlvbiAqLwotCWFzbSB2b2xhdGlsZShJTlQxMCA6IDogImEiICgweDEyMDEpLCAiYiIgKDB4MzQpKTsKKwlpcmVnLmF4ID0gMHgxMjAxOworCWlyZWcuYmwgPSAweDM0OworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogCiAJLyogQ3Vyc29yIGlzIHNjYW4gbGluZXMgMTEtMTIgKi8KLQlhc20gdm9sYXRpbGUoSU5UMTAgOiA6ICJhIiAoMHgwMTAwKSwgImMiICgweDBiMGMpKTsKKwlpcmVnLmF4ID0gMHgwMTAwOworCWlyZWcuY3ggPSAweDBiMGM7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIHZnYV9zZXRfODB4NDModm9pZCkKIHsKIAkvKiBTZXQgODB4NDMgbW9kZSBvbiBWR0EgKG5vdCBFR0EpICovCisJc3RydWN0IGJpb3NyZWdzIGlyZWc7CisKKwlpbml0cmVncygmaXJlZyk7CiAKIAkvKiBTZXQgMzUwIHNjYW5zICovCi0JYXNtIHZvbGF0aWxlKElOVDEwIDogOiAiYSIgKDB4MTIwMSksICJiIiAoMHgzMCkpOworCWlyZWcuYXggPSAweDEyMDE7CisJaXJlZy5ibCA9IDB4MzA7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiAKIAkvKiBSZXNldCB2aWRlbyBtb2RlICovCi0JYXNtIHZvbGF0aWxlKElOVDEwIDogOiAiYSIgKDB4MDAwMykpOworCWlyZWcuYXggPSAweDAwMDM7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgTlVMTCk7CiAKIAl2Z2Ffc2V0Xzhmb250KCk7CiB9CkBAIC0yMjUsOCArMjUwLDYgQEAKICAqLwogc3RhdGljIGludCB2Z2FfcHJvYmUodm9pZCkKIHsKLQl1MTYgZWdhX2J4OwotCiAJc3RhdGljIGNvbnN0IGNoYXIgKmNhcmRfbmFtZVtdID0gewogCQkiQ0dBL01EQS9IR0MiLCAiRUdBIiwgIlZHQSIKIAl9OwpAQCAtMjQwLDI2ICsyNjMsMjYgQEAKIAkJc2l6ZW9mKGVnYV9tb2Rlcykvc2l6ZW9mKHN0cnVjdCBtb2RlX2luZm8pLAogCQlzaXplb2YodmdhX21vZGVzKS9zaXplb2Yoc3RydWN0IG1vZGVfaW5mbyksCiAJfTsKLQl1OCB2Z2FfZmxhZzsKIAotCWFzbShJTlQxMAotCSAgICA6ICI9YiIgKGVnYV9ieCkKLQkgICAgOiAiYSIgKDB4MTIwMCksICJiIiAoMHgxMCkgLyogQ2hlY2sgRUdBL1ZHQSAqLwotCSAgICA6ICJlY3giLCAiZWR4IiwgImVzaSIsICJlZGkiKTsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKKworCWluaXRyZWdzKCZpcmVnKTsKKworCWlyZWcuYXggPSAweDEyMDA7CisJaXJlZy5ibCA9IDB4MTA7CQkvKiBDaGVjayBFR0EvVkdBICovCisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCiAjaWZuZGVmIF9XQUtFVVAKLQlib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX2VnYV9ieCA9IGVnYV9ieDsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX2VnYV9ieCA9IG9yZWcuYng7CiAjZW5kaWYKIAogCS8qIElmIHdlIGhhdmUgTURBL0NHQS9IR0MgdGhlbiBCTCB3aWxsIGJlIHVuY2hhbmdlZCBhdCAweDEwICovCi0JaWYgKCh1OCllZ2FfYnggIT0gMHgxMCkgeworCWlmIChvcmVnLmJsICE9IDB4MTApIHsKIAkJLyogRUdBL1ZHQSAqLwotCQlhc20oSU5UMTAKLQkJICAgIDogIj1hIiAodmdhX2ZsYWcpCi0JCSAgICA6ICJhIiAoMHgxYTAwKQotCQkgICAgOiAiZWJ4IiwgImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOworCQlpcmVnLmF4ID0gMHgxYTAwOworCQlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAKLQkJaWYgKHZnYV9mbGFnID09IDB4MWEpIHsKKwkJaWYgKG9yZWcuYWwgPT0gMHgxYSkgewogCQkJYWRhcHRlciA9IEFEQVBURVJfVkdBOwogI2lmbmRlZiBfV0FLRVVQCiAJCQlib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX2lzVkdBID0gMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2Jvb3QvdmlkZW8uYyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8uYwppbmRleCAzYmVmMmMxLi5iYWQ3MjhiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9ib290L3ZpZGVvLmMKKysrIGIvYXJjaC94ODYvYm9vdC92aWRlby5jCkBAIC0yLDYgKzIsNyBAQAogICoKICAqICAgQ29weXJpZ2h0IChDKSAxOTkxLCAxOTkyIExpbnVzIFRvcnZhbGRzCiAgKiAgIENvcHlyaWdodCAyMDA3IHJQYXRoLCBJbmMuIC0gQWxsIFJpZ2h0cyBSZXNlcnZlZAorICogICBDb3B5cmlnaHQgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbjsgYXV0aG9yIEguIFBldGVyIEFudmluCiAgKgogICogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXgga2VybmVsLCBhbmQgaXMgbWFkZSBhdmFpbGFibGUgdW5kZXIKICAqICAgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSB2ZXJzaW9uIDIuCkBAIC0xOCwzMyArMTksMjkgQEAKIAogc3RhdGljIHZvaWQgc3RvcmVfY3Vyc29yX3Bvc2l0aW9uKHZvaWQpCiB7Ci0JdTE2IGN1cnBvczsKLQl1MTYgYXgsIGJ4OworCXN0cnVjdCBiaW9zcmVncyBpcmVnLCBvcmVnOwogCi0JYXggPSAweDAzMDA7Ci0JYnggPSAwOwotCWFzbShJTlQxMAotCSAgICA6ICI9ZCIgKGN1cnBvcyksICIrYSIgKGF4KSwgIitiIiAoYngpCi0JICAgIDogOiAiZWN4IiwgImVzaSIsICJlZGkiKTsKKwlpbml0cmVncygmaXJlZyk7CisJaXJlZy5haCA9IDB4MDM7CisJaW50Y2FsbCgweDEwLCAmaXJlZywgJm9yZWcpOwogCi0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ194ID0gY3VycG9zOwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLm9yaWdfeSA9IGN1cnBvcyA+PiA4OworCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLm9yaWdfeCA9IG9yZWcuZGw7CisJYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ195ID0gb3JlZy5kaDsKIH0KIAogc3RhdGljIHZvaWQgc3RvcmVfdmlkZW9fbW9kZSh2b2lkKQogewotCXUxNiBheCwgcGFnZTsKKwlzdHJ1Y3QgYmlvc3JlZ3MgaXJlZywgb3JlZzsKIAogCS8qIE4uQi46IHRoZSBzYXZpbmcgb2YgdGhlIHZpZGVvIHBhZ2UgaGVyZSBpcyBhIGJpdCBzaWxseSwKIAkgICBzaW5jZSB3ZSBwcmV0dHkgbXVjaCBhc3N1bWUgcGFnZSAwIGV2ZXJ5d2hlcmUuICovCi0JYXggPSAweDBmMDA7Ci0JYXNtKElOVDEwCi0JICAgIDogIithIiAoYXgpLCAiPWIiIChwYWdlKQotCSAgICA6IDogImVjeCIsICJlZHgiLCAiZXNpIiwgImVkaSIpOworCWluaXRyZWdzKCZpcmVnKTsKKwlpcmVnLmFoID0gMHgwZjsKKwlpbnRjYWxsKDB4MTAsICZpcmVnLCAmb3JlZyk7CiAKIAkvKiBOb3QgYWxsIEJJT1NlcyBhcmUgY2xlYW4gd2l0aCByZXNwZWN0IHRvIHRoZSB0b3AgYml0ICovCi0JYm9vdF9wYXJhbXMuc2NyZWVuX2luZm8ub3JpZ192aWRlb19tb2RlID0gYXggJiAweDdmOwotCWJvb3RfcGFyYW1zLnNjcmVlbl9pbmZvLm9yaWdfdmlkZW9fcGFnZSA9IHBhZ2UgPj4gODsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX21vZGUgPSBvcmVnLmFsICYgMHg3ZjsKKwlib290X3BhcmFtcy5zY3JlZW5faW5mby5vcmlnX3ZpZGVvX3BhZ2UgPSBvcmVnLmJoOwogfQogCiAvKgpAQCAtMjU3LDcgKzI1NCw3IEBACiAJaW50IHk7CiAJYWRkcl90IGRzdCA9IDA7CiAJdTE2ICpzcmMgPSBzYXZlZC5kYXRhOwotCXUxNiBheCwgYngsIGR4OworCXN0cnVjdCBiaW9zcmVncyBpcmVnOwogCiAJaWYgKGdyYXBoaWNfbW9kZSkKIAkJcmV0dXJuOwkJLyogQ2FuJ3QgcmVzdG9yZSBvbnRvIGEgZ3JhcGhpYyBtb2RlICovCkBAIC0yOTYsMTIgKzI5MywxMSBAQAogCX0KIAogCS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCi0JYXggPSAweDAyMDA7CQkvKiBTZXQgY3Vyc29yIHBvc2l0aW9uICovCi0JYnggPSAwOwkJCS8qIFBhZ2UgbnVtYmVyICg8PCA4KSAqLwotCWR4ID0gKHNhdmVkLmN1cnkgPDwgOCkrc2F2ZWQuY3VyeDsKLQlhc20gdm9sYXRpbGUoSU5UMTAKLQkJICAgICA6ICIrYSIgKGF4KSwgIitiIiAoYngpLCAiK2QiIChkeCkKLQkJICAgICA6IDogImVjeCIsICJlc2kiLCAiZWRpIik7CisJaW5pdHJlZ3MoJmlyZWcpOworCWlyZWcuYWggPSAweDAyOwkJLyogU2V0IGN1cnNvciBwb3NpdGlvbiAqLworCWlyZWcuZGggPSBzYXZlZC5jdXJ5OworCWlyZWcuZGwgPSBzYXZlZC5jdXJ4OworCWludGNhbGwoMHgxMCwgJmlyZWcsIE5VTEwpOwogfQogI2Vsc2UKICNkZWZpbmUgc2F2ZV9zY3JlZW4oKQkJKCh2b2lkKTApCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9ib290L3ZpZGVvLmggYi9hcmNoL3g4Ni9ib290L3ZpZGVvLmgKaW5kZXggZWU2M2Y1ZC4uNWJiMTc0YSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvYm9vdC92aWRlby5oCisrKyBiL2FyY2gveDg2L2Jvb3QvdmlkZW8uaApAQCAtMTEyLDIwICsxMTIsNiBAQAogZXh0ZXJuIGludCBkb19yZXN0b3JlOwkJLyogUmVzdG9yZSBzY3JlZW4gY29udGVudHMgKi8KIGV4dGVybiBpbnQgZ3JhcGhpY19tb2RlOwkvKiBHcmFwaGljcyBtb2RlIHdpdGggbGluZWFyIGZyYW1lIGJ1ZmZlciAqLwogCi0vKgotICogaW50ICQweDEwIGlzIG5vdG9yaW91cyBmb3IgdG91Y2hpbmcgcmVnaXN0ZXJzIGl0IHNob3VsZG4ndC4KLSAqIGdjYyBkb2Vzbid0IGxpa2UgJWVicCBiZWluZyBjbG9iYmVyZWQsIHNvIGRlZmluZSBpdCBhcyBhIHB1c2gvcG9wCi0gKiBzZXF1ZW5jZSBoZXJlLgotICoKLSAqIEEgbnVtYmVyIG9mIHN5c3RlbXMsIGluY2x1ZGluZyB0aGUgb3JpZ2luYWwgUEMgY2FuIGNsb2JiZXIgJWJwIGluCi0gKiBjZXJ0YWluIGNpcmN1bXN0YW5jZXMsIGxpa2Ugd2hlbiBzY3JvbGxpbmcuICBUaGVyZSBleGlzdHMgYXQgbGVhc3QKLSAqIG9uZSBUcmlkZW50IHZpZGVvIGNhcmQgd2hpY2ggY291bGQgY2xvYmJlciBEUyB1bmRlciBhIHNldCBvZgotICogY2lyY3Vtc3RhbmNlcyB0aGF0IHdlIGFyZSB1bmxpa2VseSB0byBlbmNvdW50ZXIgKHNjcm9sbGluZyB3aGVuCi0gKiB1c2luZyBhbiBleHRlbmRlZCBncmFwaGljcyBtb2RlIG9mIG1vcmUgdGhhbiA4MDB4NjAwIHBpeGVscyksIGJ1dAotICogaXQncyBjaGVhcCBpbnN1cmFuY2UgdG8gZGVhbCB3aXRoIHRoYXQgaGVyZS4KLSAqLwotI2RlZmluZSBJTlQxMCAicHVzaGwgJSVlYnA7IHB1c2h3ICUlZHM7IGludCAkMHgxMDsgcG9wdyAlJWRzOyBwb3BsICUlZWJwIgotCiAvKiBBY2Nlc3NpbmcgVkdBIGluZGV4ZWQgcmVnaXN0ZXJzICovCiBzdGF0aWMgaW5saW5lIHU4IGluX2lkeCh1MTYgcG9ydCwgdTggaW5kZXgpCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnIGIvYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZwppbmRleCAyMzViODFkLi5lZGI5OTJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jb25maWdzL2kzODZfZGVmY29uZmlnCisrKyBiL2FyY2gveDg2L2NvbmZpZ3MvaTM4Nl9kZWZjb25maWcKQEAgLTEsMTIgKzEsMTMgQEAKICMKICMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFrZSBjb25maWc6IGRvbid0IGVkaXQKLSMgTGludXgga2VybmVsIHZlcnNpb246IDIuNi4yOS1yYzQKLSMgVHVlIEZlYiAyNCAxNTo1MDo1OCAyMDA5CisjIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMzAtcmMyCisjIE1vbiBNYXkgMTEgMTY6MjE6NTUgMjAwOQogIwogIyBDT05GSUdfNjRCSVQgaXMgbm90IHNldAogQ09ORklHX1g4Nl8zMj15CiAjIENPTkZJR19YODZfNjQgaXMgbm90IHNldAogQ09ORklHX1g4Nj15CitDT05GSUdfT1VUUFVUX0ZPUk1BVD0iZWxmMzItaTM4NiIKIENPTkZJR19BUkNIX0RFRkNPTkZJRz0iYXJjaC94ODYvY29uZmlncy9pMzg2X2RlZmNvbmZpZyIKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQpAQCAtMzMsNiArMzQsNyBAQAogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CiBDT05GSUdfQVJDSF9IQVNfQ0FDSEVfTElORV9TSVpFPXkKIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQT15CitDT05GSUdfSEFWRV9EWU5BTUlDX1BFUl9DUFVfQVJFQT15CiAjIENPTkZJR19IQVZFX0NQVU1BU0tfT0ZfQ1BVX01BUCBpcyBub3Qgc2V0CiBDT05GSUdfQVJDSF9ISUJFUk5BVElPTl9QT1NTSUJMRT15CiBDT05GSUdfQVJDSF9TVVNQRU5EX1BPU1NJQkxFPXkKQEAgLTQwLDE1ICs0MiwxNiBAQAogQ09ORklHX0FSQ0hfUE9QVUxBVEVTX05PREVfTUFQPXkKICMgQ09ORklHX0FVRElUX0FSQ0ggaXMgbm90IHNldAogQ09ORklHX0FSQ0hfU1VQUE9SVFNfT1BUSU1JWkVEX0lOTElOSU5HPXkKK0NPTkZJR19BUkNIX1NVUFBPUlRTX0RFQlVHX1BBR0VBTExPQz15CiBDT05GSUdfR0VORVJJQ19IQVJESVJRUz15CitDT05GSUdfR0VORVJJQ19IQVJESVJRU19OT19fRE9fSVJRPXkKIENPTkZJR19HRU5FUklDX0lSUV9QUk9CRT15CiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUT15Ci1DT05GSUdfWDg2X1NNUD15CiBDT05GSUdfVVNFX0dFTkVSSUNfU01QX0hFTFBFUlM9eQogQ09ORklHX1g4Nl8zMl9TTVA9eQogQ09ORklHX1g4Nl9IVD15Ci1DT05GSUdfWDg2X0JJT1NfUkVCT09UPXkKIENPTkZJR19YODZfVFJBTVBPTElORT15CitDT05GSUdfWDg2XzMyX0xBWllfR1M9eQogQ09ORklHX0tUSU1FX1NDQUxBUj15CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgogCkBAIC02MCwxMCArNjMsMTcgQEAKIENPTkZJR19JTklUX0VOVl9BUkdfTElNSVQ9MzIKIENPTkZJR19MT0NBTFZFUlNJT049IiIKICMgQ09ORklHX0xPQ0FMVkVSU0lPTl9BVVRPIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX0tFUk5FTF9HWklQPXkKK0NPTkZJR19IQVZFX0tFUk5FTF9CWklQMj15CitDT05GSUdfSEFWRV9LRVJORUxfTFpNQT15CitDT05GSUdfS0VSTkVMX0daSVA9eQorIyBDT05GSUdfS0VSTkVMX0JaSVAyIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tFUk5FTF9MWk1BIGlzIG5vdCBzZXQKIENPTkZJR19TV0FQPXkKIENPTkZJR19TWVNWSVBDPXkKIENPTkZJR19TWVNWSVBDX1NZU0NUTD15CiBDT05GSUdfUE9TSVhfTVFVRVVFPXkKK0NPTkZJR19QT1NJWF9NUVVFVUVfU1lTQ1RMPXkKIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUPXkKICMgQ09ORklHX0JTRF9QUk9DRVNTX0FDQ1RfVjMgaXMgbm90IHNldAogQ09ORklHX1RBU0tTVEFUUz15CkBAIC0xMTMsMjMgKzEyMywyNiBAQAogQ09ORklHX05FVF9OUz15CiBDT05GSUdfQkxLX0RFVl9JTklUUkQ9eQogQ09ORklHX0lOSVRSQU1GU19TT1VSQ0U9IiIKK0NPTkZJR19SRF9HWklQPXkKK0NPTkZJR19SRF9CWklQMj15CitDT05GSUdfUkRfTFpNQT15CiBDT05GSUdfQ0NfT1BUSU1JWkVfRk9SX1NJWkU9eQogQ09ORklHX1NZU0NUTD15CitDT05GSUdfQU5PTl9JTk9ERVM9eQogIyBDT05GSUdfRU1CRURERUQgaXMgbm90IHNldAogQ09ORklHX1VJRDE2PXkKIENPTkZJR19TWVNDVExfU1lTQ0FMTD15CiBDT05GSUdfS0FMTFNZTVM9eQogQ09ORklHX0tBTExTWU1TX0FMTD15CiBDT05GSUdfS0FMTFNZTVNfRVhUUkFfUEFTUz15CisjIENPTkZJR19TVFJJUF9BU01fU1lNUyBpcyBub3Qgc2V0CiBDT05GSUdfSE9UUExVRz15CiBDT05GSUdfUFJJTlRLPXkKIENPTkZJR19CVUc9eQogQ09ORklHX0VMRl9DT1JFPXkKIENPTkZJR19QQ1NQS1JfUExBVEZPUk09eQotIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiBDT05GSUdfQkFTRV9GVUxMPXkKIENPTkZJR19GVVRFWD15Ci1DT05GSUdfQU5PTl9JTk9ERVM9eQogQ09ORklHX0VQT0xMPXkKIENPTkZJR19TSUdOQUxGRD15CiBDT05GSUdfVElNRVJGRD15CkBAIC0xMzksNiArMTUyLDcgQEAKIENPTkZJR19WTV9FVkVOVF9DT1VOVEVSUz15CiBDT05GSUdfUENJX1FVSVJLUz15CiBDT05GSUdfU0xVQl9ERUJVRz15CisjIENPTkZJR19DT01QQVRfQlJLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NMQUIgaXMgbm90IHNldAogQ09ORklHX1NMVUI9eQogIyBDT05GSUdfU0xPQiBpcyBub3Qgc2V0CkBAIC0xNTQsNiArMTY4LDggQEAKIENPTkZJR19IQVZFX0tQUk9CRVM9eQogQ09ORklHX0hBVkVfS1JFVFBST0JFUz15CiBDT05GSUdfSEFWRV9BUkNIX1RSQUNFSE9PSz15CitDT05GSUdfSEFWRV9ETUFfQVBJX0RFQlVHPXkKKyMgQ09ORklHX1NMT1dfV09SSyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVD15CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTY3LDcgKzE4Myw2IEBACiBDT05GSUdfU1RPUF9NQUNISU5FPXkKIENPTkZJR19CTE9DSz15CiAjIENPTkZJR19MQkQgaXMgbm90IHNldAotQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQogQ09ORklHX0JMS19ERVZfQlNHPXkKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIApAQCAtMTk0LDEyICsyMDksMTIgQEAKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKIENPTkZJR19TTVA9eQogQ09ORklHX1NQQVJTRV9JUlE9eQotQ09ORklHX1g4Nl9GSU5EX1NNUF9DT05GSUc9eQogQ09ORklHX1g4Nl9NUFBBUlNFPXkKKyMgQ09ORklHX1g4Nl9CSUdTTVAgaXMgbm90IHNldAorQ09ORklHX1g4Nl9FWFRFTkRFRF9QTEFURk9STT15CiAjIENPTkZJR19YODZfRUxBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YODZfR0VORVJJQ0FSQ0ggaXMgbm90IHNldAotIyBDT05GSUdfWDg2X1ZTTVAgaXMgbm90IHNldAogIyBDT05GSUdfWDg2X1JEQzMyMVggaXMgbm90IHNldAorIyBDT05GSUdfWDg2XzMyX05PTl9TVEFOREFSRCBpcyBub3Qgc2V0CiBDT05GSUdfU0NIRURfT01JVF9GUkFNRV9QT0lOVEVSPXkKICMgQ09ORklHX1BBUkFWSVJUX0dVRVNUIGlzIG5vdCBzZXQKICMgQ09ORklHX01FTVRFU1QgaXMgbm90IHNldApAQCAtMjMwLDggKzI0NSwxMCBAQAogIyBDT05GSUdfR0VORVJJQ19DUFUgaXMgbm90IHNldAogQ09ORklHX1g4Nl9HRU5FUklDPXkKIENPTkZJR19YODZfQ1BVPXkKK0NPTkZJR19YODZfTDFfQ0FDSEVfQllURVM9NjQKK0NPTkZJR19YODZfSU5URVJOT0RFX0NBQ0hFX0JZVEVTPTY0CiBDT05GSUdfWDg2X0NNUFhDSEc9eQotQ09ORklHX1g4Nl9MMV9DQUNIRV9TSElGVD03CitDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTUKIENPTkZJR19YODZfWEFERD15CiAjIENPTkZJR19YODZfUFBST19GRU5DRSBpcyBub3Qgc2V0CiBDT05GSUdfWDg2X1dQX1dPUktTX09LPXkKQEAgLTI0Nyw3ICsyNjQsNyBAQAogQ09ORklHX0NQVV9TVVBfSU5URUw9eQogQ09ORklHX0NQVV9TVVBfQ1lSSVhfMzI9eQogQ09ORklHX0NQVV9TVVBfQU1EPXkKLUNPTkZJR19DUFVfU1VQX0NFTlRBVVJfMzI9eQorQ09ORklHX0NQVV9TVVBfQ0VOVEFVUj15CiBDT05GSUdfQ1BVX1NVUF9UUkFOU01FVEFfMzI9eQogQ09ORklHX0NQVV9TVVBfVU1DXzMyPXkKIENPTkZJR19YODZfRFM9eQpAQCAtMjc5LDYgKzI5Niw3IEBACiBDT05GSUdfTUlDUk9DT0RFX09MRF9JTlRFUkZBQ0U9eQogQ09ORklHX1g4Nl9NU1I9eQogQ09ORklHX1g4Nl9DUFVJRD15CisjIENPTkZJR19YODZfQ1BVX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX05PSElHSE1FTSBpcyBub3Qgc2V0CiBDT05GSUdfSElHSE1FTTRHPXkKICMgQ09ORklHX0hJR0hNRU02NEcgaXMgbm90IHNldApAQCAtMzAyLDYgKzMyMCw4IEBACiBDT05GSUdfQk9VTkNFPXkKIENPTkZJR19WSVJUX1RPX0JVUz15CiBDT05GSUdfVU5FVklDVEFCTEVfTFJVPXkKK0NPTkZJR19IQVZFX01MT0NLPXkKK0NPTkZJR19IQVZFX01MT0NLRURfUEFHRV9CSVQ9eQogQ09ORklHX0hJR0hQVEU9eQogQ09ORklHX1g4Nl9DSEVDS19CSU9TX0NPUlJVUFRJT049eQogQ09ORklHX1g4Nl9CT09UUEFSQU1fTUVNT1JZX0NPUlJVUFRJT05fQ0hFQ0s9eQpAQCAtMzEyLDYgKzMzMiw3IEBACiBDT05GSUdfWDg2X1BBVD15CiBDT05GSUdfRUZJPXkKIENPTkZJR19TRUNDT01QPXkKKyMgQ09ORklHX0NDX1NUQUNLUFJPVEVDVE9SIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8yNTAgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMzAwIGlzIG5vdCBzZXQKQEAgLTMyMiw4ICszNDMsOSBAQAogQ09ORklHX0NSQVNIX0RVTVA9eQogIyBDT05GSUdfS0VYRUNfSlVNUCBpcyBub3Qgc2V0CiBDT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgxMDAwMDAwCi0jIENPTkZJR19SRUxPQ0FUQUJMRSBpcyBub3Qgc2V0Ci1DT05GSUdfUEhZU0lDQUxfQUxJR049MHgyMDAwMDAKK0NPTkZJR19SRUxPQ0FUQUJMRT15CitDT05GSUdfWDg2X05FRURfUkVMT0NTPXkKK0NPTkZJR19QSFlTSUNBTF9BTElHTj0weDEwMDAwMDAKIENPTkZJR19IT1RQTFVHX0NQVT15CiAjIENPTkZJR19DT01QQVRfVkRTTyBpcyBub3Qgc2V0CiAjIENPTkZJR19DTURMSU5FX0JPT0wgaXMgbm90IHNldApAQCAtMzYzLDcgKzM4NSw2IEBACiBDT05GSUdfQUNQSV9CTEFDS0xJU1RfWUVBUj0wCiAjIENPTkZJR19BQ1BJX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0FDUElfUENJX1NMT1QgaXMgbm90IHNldAotQ09ORklHX0FDUElfU1lTVEVNPXkKIENPTkZJR19YODZfUE1fVElNRVI9eQogQ09ORklHX0FDUElfQ09OVEFJTkVSPXkKICMgQ09ORklHX0FDUElfU0JTIGlzIG5vdCBzZXQKQEAgLTQyNSw2ICs0NDYsNyBAQAogQ09ORklHX1BDSV9ESVJFQ1Q9eQogQ09ORklHX1BDSV9NTUNPTkZJRz15CiBDT05GSUdfUENJX0RPTUFJTlM9eQorIyBDT05GSUdfRE1BUiBpcyBub3Qgc2V0CiBDT05GSUdfUENJRVBPUlRCVVM9eQogIyBDT05GSUdfSE9UUExVR19QQ0lfUENJRSBpcyBub3Qgc2V0CiBDT05GSUdfUENJRUFFUj15CkBAIC00MzUsNiArNDU3LDcgQEAKICMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0lfU1RVQiBpcyBub3Qgc2V0CiBDT05GSUdfSFRfSVJRPXkKKyMgQ09ORklHX1BDSV9JT1YgaXMgbm90IHNldAogQ09ORklHX0lTQV9ETUFfQVBJPXkKICMgQ09ORklHX0lTQSBpcyBub3Qgc2V0CiAjIENPTkZJR19NQ0EgaXMgbm90IHNldApAQCAtNDgxLDcgKzUwNCw2IEBACiAjCiAjIE5ldHdvcmtpbmcgb3B0aW9ucwogIwotQ09ORklHX0NPTVBBVF9ORVRfREVWX09QUz15CiBDT05GSUdfUEFDS0VUPXkKIENPTkZJR19QQUNLRVRfTU1BUD15CiBDT05GSUdfVU5JWD15CkBAIC02MzksNiArNjYxLDcgQEAKICMgQ09ORklHX0xBUEIgaXMgbm90IHNldAogIyBDT05GSUdfRUNPTkVUIGlzIG5vdCBzZXQKICMgQ09ORklHX1dBTl9ST1VURVIgaXMgbm90IHNldAorIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfU0NIRUQ9eQogCiAjCkBAIC02OTYsNiArNzE5LDcgQEAKICMKICMgQ09ORklHX05FVF9QS1RHRU4gaXMgbm90IHNldAogIyBDT05GSUdfTkVUX1RDUFBST0JFIGlzIG5vdCBzZXQKKyMgQ09ORklHX05FVF9EUk9QX01PTklUT1IgaXMgbm90IHNldAogQ09ORklHX0hBTVJBRElPPXkKIAogIwpAQCAtNzA2LDEyICs3MzAsMTAgQEAKICMgQ09ORklHX0lSREEgaXMgbm90IHNldAogIyBDT05GSUdfQlQgaXMgbm90IHNldAogIyBDT05GSUdfQUZfUlhSUEMgaXMgbm90IHNldAotIyBDT05GSUdfUEhPTkVUIGlzIG5vdCBzZXQKIENPTkZJR19GSUJfUlVMRVM9eQogQ09ORklHX1dJUkVMRVNTPXkKIENPTkZJR19DRkc4MDIxMT15CiAjIENPTkZJR19DRkc4MDIxMV9SRUdfREVCVUcgaXMgbm90IHNldAotQ09ORklHX05MODAyMTE9eQogQ09ORklHX1dJUkVMRVNTX09MRF9SRUdVTEFUT1JZPXkKIENPTkZJR19XSVJFTEVTU19FWFQ9eQogQ09ORklHX1dJUkVMRVNTX0VYVF9TWVNGUz15CkBAIC03ODksNiArODExLDcgQEAKICMgQ09ORklHX0lDUzkzMlM0MDEgaXMgbm90IHNldAogIyBDT05GSUdfRU5DTE9TVVJFX1NFUlZJQ0VTIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQX0lMTyBpcyBub3Qgc2V0CisjIENPTkZJR19JU0wyOTAwMyBpcyBub3Qgc2V0CiAjIENPTkZJR19DMlBPUlQgaXMgbm90IHNldAogCiAjCkBAIC04NDIsNiArODY1LDcgQEAKICMgQ09ORklHX1NDU0lfTE9XTEVWRUwgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9MT1dMRVZFTF9QQ01DSUEgaXMgbm90IHNldAogIyBDT05GSUdfU0NTSV9ESCBpcyBub3Qgc2V0CisjIENPTkZJR19TQ1NJX09TRF9JTklUSUFUT1IgaXMgbm90IHNldAogQ09ORklHX0FUQT15CiAjIENPTkZJR19BVEFfTk9OU1RBTkRBUkQgaXMgbm90IHNldAogQ09ORklHX0FUQV9BQ1BJPXkKQEAgLTk0MCw2ICs5NjQsNyBAQAogQ09ORklHX01BQ0lOVE9TSF9EUklWRVJTPXkKIENPTkZJR19NQUNfRU1VTU9VU0VCVE49eQogQ09ORklHX05FVERFVklDRVM9eQorQ09ORklHX0NPTVBBVF9ORVRfREVWX09QUz15CiAjIENPTkZJR19JRkIgaXMgbm90IHNldAogIyBDT05GSUdfRFVNTVkgaXMgbm90IHNldAogIyBDT05GSUdfQk9ORElORyBpcyBub3Qgc2V0CkBAIC05NzcsNiArMTAwMiw4IEBACiBDT05GSUdfTkVUX1ZFTkRPUl8zQ09NPXkKICMgQ09ORklHX1ZPUlRFWCBpcyBub3Qgc2V0CiAjIENPTkZJR19UWVBIT09OIGlzIG5vdCBzZXQKKyMgQ09ORklHX0VUSE9DIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RORVQgaXMgbm90IHNldAogQ09ORklHX05FVF9UVUxJUD15CiAjIENPTkZJR19ERTIxMDRYIGlzIG5vdCBzZXQKICMgQ09ORklHX1RVTElQIGlzIG5vdCBzZXQKQEAgLTEwMjYsNiArMTA1Myw3IEBACiBDT05GSUdfRTEwMDBFPXkKICMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JR0IgaXMgbm90IHNldAorIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CkBAIC0xMDQwLDYgKzEwNjgsNyBAQAogIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0pNRSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKICMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldApAQCAtMTA0OSw2ICsxMDc4LDcgQEAKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKQEAgLTEwNTgsNiArMTA4OCw3IEBACiAjIENPTkZJR19CTlgyWCBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NGQyBpcyBub3Qgc2V0CisjIENPTkZJR19CRTJORVQgaXMgbm90IHNldAogQ09ORklHX1RSPXkKICMgQ09ORklHX0lCTU9MIGlzIG5vdCBzZXQKICMgQ09ORklHX0lCTUxTIGlzIG5vdCBzZXQKQEAgLTEwNzMsOCArMTEwNCw4IEBACiAjIENPTkZJR19MSUJFUlRBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJFUlRBU19USElORklSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19BSVJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFUk1FUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE1FTCBpcyBub3Qgc2V0CisjIENPTkZJR19BVDc2QzUwWF9VU0IgaXMgbm90IHNldAogIyBDT05GSUdfQUlST19DUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ01DSUFfV0wzNTAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSSVNNNTQgaXMgbm90IHNldApAQCAtMTA4NCwyMSArMTExNSwyMSBAQAogIyBDT05GSUdfUlRMODE4NyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRE04MjExIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExX0hXU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01XTDhLIGlzIG5vdCBzZXQKICMgQ09ORklHX1A1NF9DT01NT04gaXMgbm90IHNldAogQ09ORklHX0FUSDVLPXkKICMgQ09ORklHX0FUSDVLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUSDlLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSOTE3MF9VU0IgaXMgbm90IHNldAogIyBDT05GSUdfSVBXMjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFcyMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lXTENPUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lXTEFHTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0wzOTQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRkkgaXMgbm90IHNldAogIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19CNDNMRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWkQxMjExUlcgaXMgbm90IHNldAogIyBDT05GSUdfUlQyWDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFUk1FUyBpcyBub3Qgc2V0CiAKICMKICMgRW5hYmxlIFdpTUFYIChOZXR3b3JraW5nIG9wdGlvbnMpIHRvIHNlZSB0aGUgV2lNQVggZHJpdmVycwpAQCAtMTIwOSw2ICsxMjQwLDggQEAKICMgQ09ORklHX1RBQkxFVF9VU0JfS0JUQUIgaXMgbm90IHNldAogIyBDT05GSUdfVEFCTEVUX1VTQl9XQUNPTSBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldApAQCAtMTMwMyw2ICsxMzM2LDcgQEAKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXX1JBTkRPTV9USU1FUklPTUVNIGlzIG5vdCBzZXQKIENPTkZJR19IV19SQU5ET01fSU5URUw9eQogQ09ORklHX0hXX1JBTkRPTV9BTUQ9eQogQ09ORklHX0hXX1JBTkRPTV9HRU9ERT15CkBAIC0xMzkwLDcgKzE0MjQsNiBAQAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKQEAgLTE0MjQsNiArMTQ1Nyw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19LOFRFTVAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVEswMTEwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JNUtfQU1CIGlzIG5vdCBzZXQKQEAgLTE0MzMsNiArMTQ2Nyw3IEBACiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hNRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0c3NjBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19DT1JFVEVNUCBpcyBub3Qgc2V0CkBAIC0xNDQ4LDExICsxNDgzLDE0IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xUQzQyMTUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MVEM0MjQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05NTI0MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CkBAIC0xNjQzLDcgKzE2ODEsNiBAQAogIyBDT05GSUdfRkJfM0RGWCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9WT09ET08xIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX1ZUODYyMyBpcyBub3Qgc2V0Ci0jIENPTkZJR19GQl9DWUJMQSBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9UUklERU5UIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX0FSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9QTTMgaXMgbm90IHNldApAQCAtMTY1Miw2ICsxNjg5LDcgQEAKICMgQ09ORklHX0ZCX1ZJUlRVQUwgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUVUUk9OT01FIGlzIG5vdCBzZXQKICMgQ09ORklHX0ZCX01CODYyWFggaXMgbm90IHNldAorIyBDT05GSUdfRkJfQlJPQURTSEVFVCBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0xDRF9TVVBQT1JUPXkKICMgQ09ORklHX0xDRF9DTEFTU19ERVZJQ0UgaXMgbm90IHNldAogQ09ORklHX0JBQ0tMSUdIVF9DTEFTU19ERVZJQ0U9eQpAQCAtMTczOCw2ICsxNzc2LDggQEAKICMgQ09ORklHX1NORF9JTkRJR08gaXMgbm90IHNldAogIyBDT05GSUdfU05EX0lORElHT0lPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9JTkRJR09ESiBpcyBub3Qgc2V0CisjIENPTkZJR19TTkRfSU5ESUdPSU9YIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09ESlggaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzEgaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VNVTEwSzFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NORF9FTlMxMzcwIGlzIG5vdCBzZXQKQEAgLTE4MTEsMTUgKzE4NTEsMTcgQEAKICMKICMgU3BlY2lhbCBISUQgZHJpdmVycwogIwotQ09ORklHX0hJRF9DT01QQVQ9eQogQ09ORklHX0hJRF9BNFRFQ0g9eQogQ09ORklHX0hJRF9BUFBMRT15CiBDT05GSUdfSElEX0JFTEtJTj15CiBDT05GSUdfSElEX0NIRVJSWT15CiBDT05GSUdfSElEX0NISUNPTlk9eQogQ09ORklHX0hJRF9DWVBSRVNTPXkKKyMgQ09ORklHX0RSQUdPTlJJU0VfRkYgaXMgbm90IHNldAogQ09ORklHX0hJRF9FWktFWT15CitDT05GSUdfSElEX0tZRT15CiBDT05GSUdfSElEX0dZUkFUSU9OPXkKK0NPTkZJR19ISURfS0VOU0lOR1RPTj15CiBDT05GSUdfSElEX0xPR0lURUNIPXkKIENPTkZJR19MT0dJVEVDSF9GRj15CiAjIENPTkZJR19MT0dJUlVNQkxFUEFEMl9GRiBpcyBub3Qgc2V0CkBAIC0xODg1LDExICsxOTI3LDExIEBACiAjIENPTkZJR19VU0JfVE1DIGlzIG5vdCBzZXQKIAogIwotIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5IGFsc28gYmUgbmVlZGVkOworIyBOT1RFOiBVU0JfU1RPUkFHRSBkZXBlbmRzIG9uIFNDU0kgYnV0IEJMS19ERVZfU0QgbWF5CiAjCiAKICMKLSMgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb24KKyMgYWxzbyBiZSBuZWVkZWQ7IHNlZSBVU0JfU1RPUkFHRSBIZWxwIGZvciBtb3JlIGluZm8KICMKIENPTkZJR19VU0JfU1RPUkFHRT15CiAjIENPTkZJR19VU0JfU1RPUkFHRV9ERUJVRyBpcyBub3Qgc2V0CkBAIC0xOTMxLDcgKzE5NzMsNiBAQAogIyBDT05GSUdfVVNCX0xFRCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQ1lQUkVTU19DWTdDNjMgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0NZVEhFUk0gaXMgbm90IHNldAotIyBDT05GSUdfVVNCX1BISURHRVQgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0lETU9VU0UgaXMgbm90IHNldAogIyBDT05GSUdfVVNCX0ZURElfRUxBTiBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQVBQTEVESVNQTEFZIGlzIG5vdCBzZXQKQEAgLTE5NDcsNiArMTk4OCw3IEBACiAjCiAjIE9URyBhbmQgcmVsYXRlZCBpbmZyYXN0cnVjdHVyZQogIworIyBDT05GSUdfTk9QX1VTQl9YQ0VJViBpcyBub3Qgc2V0CiAjIENPTkZJR19VV0IgaXMgbm90IHNldAogIyBDT05GSUdfTU1DIGlzIG5vdCBzZXQKICMgQ09ORklHX01FTVNUSUNLIGlzIG5vdCBzZXQKQEAgLTE5NTgsOCArMjAwMCwxMCBAQAogIwogIyBDT05GSUdfTEVEU19BTElYMiBpcyBub3Qgc2V0CiAjIENPTkZJR19MRURTX1BDQTk1MzIgaXMgbm90IHNldAorIyBDT05GSUdfTEVEU19MUDU1MjEgaXMgbm90IHNldAogIyBDT05GSUdfTEVEU19DTEVWT19NQUlMIGlzIG5vdCBzZXQKICMgQ09ORklHX0xFRFNfUENBOTU1WCBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX0JEMjgwMiBpcyBub3Qgc2V0CiAKICMKICMgTEVEIFRyaWdnZXJzCkBAIC0xOTY5LDYgKzIwMTMsMTAgQEAKICMgQ09ORklHX0xFRFNfVFJJR0dFUl9IRUFSVEJFQVQgaXMgbm90IHNldAogIyBDT05GSUdfTEVEU19UUklHR0VSX0JBQ0tMSUdIVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MRURTX1RSSUdHRVJfREVGQVVMVF9PTiBpcyBub3Qgc2V0CisKKyMKKyMgaXB0YWJsZXMgdHJpZ2dlciBpcyB1bmRlciBOZXRmaWx0ZXIgY29uZmlnIChMRUQgdGFyZ2V0KQorIwogIyBDT05GSUdfQUNDRVNTSUJJTElUWSBpcyBub3Qgc2V0CiAjIENPTkZJR19JTkZJTklCQU5EIGlzIG5vdCBzZXQKIENPTkZJR19FREFDPXkKQEAgLTIwMzcsNiArMjA4NSw3IEBACiAjIERNQSBEZXZpY2VzCiAjCiAjIENPTkZJR19JTlRFTF9JT0FURE1BIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FVWERJU1BMQVkgaXMgbm90IHNldAogIyBDT05GSUdfVUlPIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUdJTkcgaXMgbm90IHNldAogQ09ORklHX1g4Nl9QTEFURk9STV9ERVZJQ0VTPXkKQEAgLTIwNzEsNiArMjEyMCw3IEBACiAjCiAjIENPTkZJR19FWFQyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTPXkKKyMgQ09ORklHX0VYVDNfREVGQVVMVFNfVE9fT1JERVJFRCBpcyBub3Qgc2V0CiBDT05GSUdfRVhUM19GU19YQVRUUj15CiBDT05GSUdfRVhUM19GU19QT1NJWF9BQ0w9eQogQ09ORklHX0VYVDNfRlNfU0VDVVJJVFk9eQpAQCAtMjEwMSw2ICsyMTUxLDExIEBACiBDT05GSUdfR0VORVJJQ19BQ0w9eQogCiAjCisjIENhY2hlcworIworIyBDT05GSUdfRlNDQUNIRSBpcyBub3Qgc2V0CisKKyMKICMgQ0QtUk9NL0RWRCBGaWxlc3lzdGVtcwogIwogQ09ORklHX0lTTzk2NjBfRlM9eQpAQCAtMjE1MSw2ICsyMjA2LDcgQEAKICMgQ09ORklHX1JPTUZTX0ZTIGlzIG5vdCBzZXQKICMgQ09ORklHX1NZU1ZfRlMgaXMgbm90IHNldAogIyBDT05GSUdfVUZTX0ZTIGlzIG5vdCBzZXQKKyMgQ09ORklHX05JTEZTMl9GUyBpcyBub3Qgc2V0CiBDT05GSUdfTkVUV09SS19GSUxFU1lTVEVNUz15CiBDT05GSUdfTkZTX0ZTPXkKIENPTkZJR19ORlNfVjM9eQpAQCAtMjE2NCw3ICsyMjIwLDYgQEAKIENPTkZJR19ORlNfQ09NTU9OPXkKIENPTkZJR19TVU5SUEM9eQogQ09ORklHX1NVTlJQQ19HU1M9eQotIyBDT05GSUdfU1VOUlBDX1JFR0lTVEVSX1Y0IGlzIG5vdCBzZXQKIENPTkZJR19SUENTRUNfR1NTX0tSQjU9eQogIyBDT05GSUdfUlBDU0VDX0dTU19TUEtNMyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTUJfRlMgaXMgbm90IHNldApAQCAtMjI1MSw2ICsyMzA2LDcgQEAKIENPTkZJR19ERUJVR19LRVJORUw9eQogIyBDT05GSUdfREVCVUdfU0hJUlEgaXMgbm90IHNldAogIyBDT05GSUdfREVURUNUX1NPRlRMT0NLVVAgaXMgbm90IHNldAorIyBDT05GSUdfREVURUNUX0hVTkdfVEFTSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ0hFRF9ERUJVRyBpcyBub3Qgc2V0CiBDT05GSUdfU0NIRURTVEFUUz15CiBDT05GSUdfVElNRVJfU1RBVFM9eQpAQCAtMjI2Niw2ICsyMzIyLDcgQEAKICMgQ09ORklHX0xPQ0tfU1RBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19TUElOTE9DS19TTEVFUCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19MT0NLSU5HX0FQSV9TRUxGVEVTVFMgaXMgbm90IHNldAorQ09ORklHX1NUQUNLVFJBQ0U9eQogIyBDT05GSUdfREVCVUdfS09CSkVDVCBpcyBub3Qgc2V0CiAjIENPTkZJR19ERUJVR19ISUdITUVNIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKQEAgLTIyODksMTMgKzIzNDYsMTkgQEAKICMgQ09ORklHX0ZBVUxUX0lOSkVDVElPTiBpcyBub3Qgc2V0CiAjIENPTkZJR19MQVRFTkNZVE9QIGlzIG5vdCBzZXQKIENPTkZJR19TWVNDVExfU1lTQ0FMTF9DSEVDSz15CisjIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAogQ09ORklHX1VTRVJfU1RBQ0tUUkFDRV9TVVBQT1JUPXkKK0NPTkZJR19OT1BfVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9HUkFQSF9UUkFDRVI9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VfTUNPVU5UX1RFU1Q9eQogQ09ORklHX0hBVkVfRFlOQU1JQ19GVFJBQ0U9eQogQ09ORklHX0hBVkVfRlRSQUNFX01DT1VOVF9SRUNPUkQ9eQogQ09ORklHX0hBVkVfSFdfQlJBTkNIX1RSQUNFUj15CitDT05GSUdfSEFWRV9GVFJBQ0VfU1lTQ0FMTFM9eQorQ09ORklHX1JJTkdfQlVGRkVSPXkKK0NPTkZJR19UUkFDSU5HPXkKK0NPTkZJR19UUkFDSU5HX1NVUFBPUlQ9eQogCiAjCiAjIFRyYWNlcnMKQEAgLTIzMDUsMTMgKzIzNjgsMjEgQEAKICMgQ09ORklHX1NZU1BST0ZfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19DT05URVhUX1NXSVRDSF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRVZFTlRfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0ZUUkFDRV9TWVNDQUxMUyBpcyBub3Qgc2V0CiAjIENPTkZJR19CT09UX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19UUkFDRV9CUkFOQ0hfUFJPRklMSU5HIGlzIG5vdCBzZXQKICMgQ09ORklHX1BPV0VSX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TVEFDS19UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfSFdfQlJBTkNIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19LTUVNVFJBQ0UgaXMgbm90IHNldAorIyBDT05GSUdfV09SS1FVRVVFX1RSQUNFUiBpcyBub3Qgc2V0CitDT05GSUdfQkxLX0RFVl9JT19UUkFDRT15CisjIENPTkZJR19GVFJBQ0VfU1RBUlRVUF9URVNUIGlzIG5vdCBzZXQKKyMgQ09ORklHX01NSU9UUkFDRSBpcyBub3Qgc2V0CiBDT05GSUdfUFJPVklERV9PSENJMTM5NF9ETUFfSU5JVD15Ci0jIENPTkZJR19EWU5BTUlDX1BSSU5US19ERUJVRyBpcyBub3Qgc2V0CisjIENPTkZJR19EWU5BTUlDX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RNQV9BUElfREVCVUcgaXMgbm90IHNldAogIyBDT05GSUdfU0FNUExFUyBpcyBub3Qgc2V0CiBDT05GSUdfSEFWRV9BUkNIX0tHREI9eQogIyBDT05GSUdfS0dEQiBpcyBub3Qgc2V0CkBAIC0yMzIxLDcgKzIzOTIsNiBAQAogQ09ORklHX0VBUkxZX1BSSU5US19EQkdQPXkKIENPTkZJR19ERUJVR19TVEFDS09WRVJGTE9XPXkKIENPTkZJR19ERUJVR19TVEFDS19VU0FHRT15Ci0jIENPTkZJR19ERUJVR19QQUdFQUxMT0MgaXMgbm90IHNldAogIyBDT05GSUdfREVCVUdfUEVSX0NQVV9NQVBTIGlzIG5vdCBzZXQKICMgQ09ORklHX1g4Nl9QVERVTVAgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX1JPREFUQT15CkBAIC0yMzI5LDcgKzIzOTksNyBAQAogQ09ORklHX0RFQlVHX05YX1RFU1Q9bQogIyBDT05GSUdfNEtTVEFDS1MgaXMgbm90IHNldAogQ09ORklHX0RPVUJMRUZBVUxUPXkKLSMgQ09ORklHX01NSU9UUkFDRSBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9NTUlPVFJBQ0VfU1VQUE9SVD15CiBDT05GSUdfSU9fREVMQVlfVFlQRV8wWDgwPTAKIENPTkZJR19JT19ERUxBWV9UWVBFXzBYRUQ9MQogQ09ORklHX0lPX0RFTEFZX1RZUEVfVURFTEFZPTIKQEAgLTIzNjUsNiArMjQzNSw4IEBACiBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9DSEVDS1JFUVBST1RfVkFMVUU9MQogIyBDT05GSUdfU0VDVVJJVFlfU0VMSU5VWF9QT0xJQ1lEQl9WRVJTSU9OX01BWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRUNVUklUWV9TTUFDSyBpcyBub3Qgc2V0CisjIENPTkZJR19TRUNVUklUWV9UT01PWU8gaXMgbm90IHNldAorIyBDT05GSUdfSU1BIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE89eQogCiAjCkBAIC0yMzgwLDEwICsyNDUyLDEyIEBACiBDT05GSUdfQ1JZUFRPX0hBU0g9eQogQ09ORklHX0NSWVBUT19IQVNIMj15CiBDT05GSUdfQ1JZUFRPX1JORzI9eQorQ09ORklHX0NSWVBUT19QQ09NUD15CiBDT05GSUdfQ1JZUFRPX01BTkFHRVI9eQogQ09ORklHX0NSWVBUT19NQU5BR0VSMj15CiAjIENPTkZJR19DUllQVE9fR0YxMjhNVUwgaXMgbm90IHNldAogIyBDT05GSUdfQ1JZUFRPX05VTEwgaXMgbm90IHNldAorQ09ORklHX0NSWVBUT19XT1JLUVVFVUU9eQogIyBDT05GSUdfQ1JZUFRPX0NSWVBURCBpcyBub3Qgc2V0CiBDT05GSUdfQ1JZUFRPX0FVVEhFTkM9eQogIyBDT05GSUdfQ1JZUFRPX1RFU1QgaXMgbm90IHNldApAQCAtMjQ1Niw2ICsyNTMwLDcgQEAKICMgQ29tcHJlc3Npb24KICMKICMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19aTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAogCiAjCkBAIC0yNDY3LDExICsyNTQyLDEzIEBACiAjIENPTkZJR19DUllQVE9fREVWX0dFT0RFIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0tWTT15CitDT05GSUdfSEFWRV9LVk1fSVJRQ0hJUD15CiBDT05GSUdfVklSVFVBTElaQVRJT049eQogIyBDT05GSUdfS1ZNIGlzIG5vdCBzZXQKICMgQ09ORklHX0xHVUVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19WSVJUSU9fUENJIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJUlRJT19CQUxMT09OIGlzIG5vdCBzZXQKK0NPTkZJR19CSU5BUllfUFJJTlRGPXkKIAogIwogIyBMaWJyYXJ5IHJvdXRpbmVzCkBAIC0yNDg5LDcgKzI1NjYsMTAgQEAKICMgQ09ORklHX0xJQkNSQzMyQyBpcyBub3Qgc2V0CiBDT05GSUdfQVVESVRfR0VORVJJQz15CiBDT05GSUdfWkxJQl9JTkZMQVRFPXkKLUNPTkZJR19QTElTVD15CitDT05GSUdfREVDT01QUkVTU19HWklQPXkKK0NPTkZJR19ERUNPTVBSRVNTX0JaSVAyPXkKK0NPTkZJR19ERUNPTVBSRVNTX0xaTUE9eQogQ09ORklHX0hBU19JT01FTT15CiBDT05GSUdfSEFTX0lPUE9SVD15CiBDT05GSUdfSEFTX0RNQT15CitDT05GSUdfTkxBVFRSPXkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZyBiL2FyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZwppbmRleCA5ZmU1ZDIxLi5jZWUxZGQyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9jb25maWdzL3g4Nl82NF9kZWZjb25maWcKKysrIGIvYXJjaC94ODYvY29uZmlncy94ODZfNjRfZGVmY29uZmlnCkBAIC0xLDEyICsxLDEzIEBACiAjCiAjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0Ci0jIExpbnV4IGtlcm5lbCB2ZXJzaW9uOiAyLjYuMjktcmM0Ci0jIFR1ZSBGZWIgMjQgMTU6NDQ6MTYgMjAwOQorIyBMaW51eCBrZXJuZWwgdmVyc2lvbjogMi42LjMwLXJjMgorIyBNb24gTWF5IDExIDE2OjIyOjAwIDIwMDkKICMKIENPTkZJR182NEJJVD15CiAjIENPTkZJR19YODZfMzIgaXMgbm90IHNldAogQ09ORklHX1g4Nl82ND15CiBDT05GSUdfWDg2PXkKK0NPTkZJR19PVVRQVVRfRk9STUFUPSJlbGY2NC14ODYtNjQiCiBDT05GSUdfQVJDSF9ERUZDT05GSUc9ImFyY2gveDg2L2NvbmZpZ3MveDg2XzY0X2RlZmNvbmZpZyIKIENPTkZJR19HRU5FUklDX1RJTUU9eQogQ09ORklHX0dFTkVSSUNfQ01PU19VUERBVEU9eQpAQCAtMzQsNiArMzUsNyBAQAogQ09ORklHX0FSQ0hfSEFTX0RFRkFVTFRfSURMRT15CiBDT05GSUdfQVJDSF9IQVNfQ0FDSEVfTElORV9TSVpFPXkKIENPTkZJR19IQVZFX1NFVFVQX1BFUl9DUFVfQVJFQT15CitDT05GSUdfSEFWRV9EWU5BTUlDX1BFUl9DUFVfQVJFQT15CiBDT05GSUdfSEFWRV9DUFVNQVNLX09GX0NQVV9NQVA9eQogQ09ORklHX0FSQ0hfSElCRVJOQVRJT05fUE9TU0lCTEU9eQogQ09ORklHX0FSQ0hfU1VTUEVORF9QT1NTSUJMRT15CkBAIC00MSwxNCArNDMsMTQgQEAKIENPTkZJR19BUkNIX1BPUFVMQVRFU19OT0RFX01BUD15CiBDT05GSUdfQVVESVRfQVJDSD15CiBDT05GSUdfQVJDSF9TVVBQT1JUU19PUFRJTUlaRURfSU5MSU5JTkc9eQorQ09ORklHX0FSQ0hfU1VQUE9SVFNfREVCVUdfUEFHRUFMTE9DPXkKIENPTkZJR19HRU5FUklDX0hBUkRJUlFTPXkKK0NPTkZJR19HRU5FUklDX0hBUkRJUlFTX05PX19ET19JUlE9eQogQ09ORklHX0dFTkVSSUNfSVJRX1BST0JFPXkKIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRPXkKLUNPTkZJR19YODZfU01QPXkKIENPTkZJR19VU0VfR0VORVJJQ19TTVBfSEVMUEVSUz15CiBDT05GSUdfWDg2XzY0X1NNUD15CiBDT05GSUdfWDg2X0hUPXkKLUNPTkZJR19YODZfQklPU19SRUJPT1Q9eQogQ09ORklHX1g4Nl9UUkFNUE9MSU5FPXkKICMgQ09ORklHX0tUSU1FX1NDQUxBUiBpcyBub3Qgc2V0CiBDT05GSUdfREVGQ09ORklHX0xJU1Q9Ii9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIgpAQCAtNjEsMTAgKzYzLDE3IEBACiBDT05GSUdfSU5JVF9FTlZfQVJHX0xJTUlUPTMyCiBDT05GSUdfTE9DQUxWRVJTSU9OPSIiCiAjIENPTkZJR19MT0NBTFZFUlNJT05fQVVUTyBpcyBub3Qgc2V0CitDT05GSUdfSEFWRV9LRVJORUxfR1pJUD15CitDT05GSUdfSEFWRV9LRVJORUxfQlpJUDI9eQorQ09ORklHX0hBVkVfS0VSTkVMX0xaTUE9eQorQ09ORklHX0tFUk5FTF9HWklQPXkKKyMgQ09ORklHX0tFUk5FTF9CWklQMiBpcyBub3Qgc2V0CisjIENPTkZJR19LRVJORUxfTFpNQSBpcyBub3Qgc2V0CiBDT05GSUdfU1dBUD15CiBDT05GSUdfU1lTVklQQz15CiBDT05GSUdfU1lTVklQQ19TWVNDVEw9eQogQ09ORklHX1BPU0lYX01RVUVVRT15CitDT05GSUdfUE9TSVhfTVFVRVVFX1NZU0NUTD15CiBDT05GSUdfQlNEX1BST0NFU1NfQUNDVD15CiAjIENPTkZJR19CU0RfUFJPQ0VTU19BQ0NUX1YzIGlzIG5vdCBzZXQKIENPTkZJR19UQVNLU1RBVFM9eQpAQCAtMTE0LDIzICsxMjMsMjYgQEAKIENPTkZJR19ORVRfTlM9eQogQ09ORklHX0JMS19ERVZfSU5JVFJEPXkKIENPTkZJR19JTklUUkFNRlNfU09VUkNFPSIiCitDT05GSUdfUkRfR1pJUD15CitDT05GSUdfUkRfQlpJUDI9eQorQ09ORklHX1JEX0xaTUE9eQogQ09ORklHX0NDX09QVElNSVpFX0ZPUl9TSVpFPXkKIENPTkZJR19TWVNDVEw9eQorQ09ORklHX0FOT05fSU5PREVTPXkKICMgQ09ORklHX0VNQkVEREVEIGlzIG5vdCBzZXQKIENPTkZJR19VSUQxNj15CiBDT05GSUdfU1lTQ1RMX1NZU0NBTEw9eQogQ09ORklHX0tBTExTWU1TPXkKIENPTkZJR19LQUxMU1lNU19BTEw9eQogQ09ORklHX0tBTExTWU1TX0VYVFJBX1BBU1M9eQorIyBDT05GSUdfU1RSSVBfQVNNX1NZTVMgaXMgbm90IHNldAogQ09ORklHX0hPVFBMVUc9eQogQ09ORklHX1BSSU5USz15CiBDT05GSUdfQlVHPXkKIENPTkZJR19FTEZfQ09SRT15CiBDT05GSUdfUENTUEtSX1BMQVRGT1JNPXkKLSMgQ09ORklHX0NPTVBBVF9CUksgaXMgbm90IHNldAogQ09ORklHX0JBU0VfRlVMTD15CiBDT05GSUdfRlVURVg9eQotQ09ORklHX0FOT05fSU5PREVTPXkKIENPTkZJR19FUE9MTD15CiBDT05GSUdfU0lHTkFMRkQ9eQogQ09ORklHX1RJTUVSRkQ9eQpAQCAtMTQwLDYgKzE1Miw3IEBACiBDT05GSUdfVk1fRVZFTlRfQ09VTlRFUlM9eQogQ09ORklHX1BDSV9RVUlSS1M9eQogQ09ORklHX1NMVUJfREVCVUc9eQorIyBDT05GSUdfQ09NUEFUX0JSSyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTEFCIGlzIG5vdCBzZXQKIENPTkZJR19TTFVCPXkKICMgQ09ORklHX1NMT0IgaXMgbm90IHNldApAQCAtMTU1LDYgKzE2OCw4IEBACiBDT05GSUdfSEFWRV9LUFJPQkVTPXkKIENPTkZJR19IQVZFX0tSRVRQUk9CRVM9eQogQ09ORklHX0hBVkVfQVJDSF9UUkFDRUhPT0s9eQorQ09ORklHX0hBVkVfRE1BX0FQSV9ERUJVRz15CisjIENPTkZJR19TTE9XX1dPUksgaXMgbm90IHNldAogIyBDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCBpcyBub3Qgc2V0CiBDT05GSUdfU0xBQklORk89eQogQ09ORklHX1JUX01VVEVYRVM9eQpAQCAtMTY3LDcgKzE4Miw2IEBACiAjIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgaXMgbm90IHNldAogQ09ORklHX1NUT1BfTUFDSElORT15CiBDT05GSUdfQkxPQ0s9eQotQ09ORklHX0JMS19ERVZfSU9fVFJBQ0U9eQogQ09ORklHX0JMS19ERVZfQlNHPXkKICMgQ09ORklHX0JMS19ERVZfSU5URUdSSVRZIGlzIG5vdCBzZXQKIENPTkZJR19CTE9DS19DT01QQVQ9eQpAQCAtMTk1LDEyICsyMDksMTAgQEAKIENPTkZJR19HRU5FUklDX0NMT0NLRVZFTlRTX0JVSUxEPXkKIENPTkZJR19TTVA9eQogQ09ORklHX1NQQVJTRV9JUlE9eQotIyBDT05GSUdfTlVNQV9NSUdSQVRFX0lSUV9ERVNDIGlzIG5vdCBzZXQKLUNPTkZJR19YODZfRklORF9TTVBfQ09ORklHPXkKIENPTkZJR19YODZfTVBQQVJTRT15Ci0jIENPTkZJR19YODZfRUxBTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19YODZfR0VORVJJQ0FSQ0ggaXMgbm90IHNldAorQ09ORklHX1g4Nl9FWFRFTkRFRF9QTEFURk9STT15CiAjIENPTkZJR19YODZfVlNNUCBpcyBub3Qgc2V0CisjIENPTkZJR19YODZfVVYgaXMgbm90IHNldAogQ09ORklHX1NDSEVEX09NSVRfRlJBTUVfUE9JTlRFUj15CiAjIENPTkZJR19QQVJBVklSVF9HVUVTVCBpcyBub3Qgc2V0CiAjIENPTkZJR19NRU1URVNUIGlzIG5vdCBzZXQKQEAgLTIzMCwxMCArMjQyLDEwIEBACiAjIENPTkZJR19NQ09SRTIgaXMgbm90IHNldAogQ09ORklHX0dFTkVSSUNfQ1BVPXkKIENPTkZJR19YODZfQ1BVPXkKLUNPTkZJR19YODZfTDFfQ0FDSEVfQllURVM9MTI4Ci1DT05GSUdfWDg2X0lOVEVSTk9ERV9DQUNIRV9CWVRFUz0xMjgKK0NPTkZJR19YODZfTDFfQ0FDSEVfQllURVM9NjQKK0NPTkZJR19YODZfSU5URVJOT0RFX0NBQ0hFX0JZVEVTPTY0CiBDT05GSUdfWDg2X0NNUFhDSEc9eQotQ09ORklHX1g4Nl9MMV9DQUNIRV9TSElGVD03CitDT05GSUdfWDg2X0wxX0NBQ0hFX1NISUZUPTYKIENPTkZJR19YODZfV1BfV09SS1NfT0s9eQogQ09ORklHX1g4Nl9UU0M9eQogQ09ORklHX1g4Nl9DTVBYQ0hHNjQ9eQpAQCAtMjQyLDcgKzI1NCw3IEBACiBDT05GSUdfWDg2X0RFQlVHQ1RMTVNSPXkKIENPTkZJR19DUFVfU1VQX0lOVEVMPXkKIENPTkZJR19DUFVfU1VQX0FNRD15Ci1DT05GSUdfQ1BVX1NVUF9DRU5UQVVSXzY0PXkKK0NPTkZJR19DUFVfU1VQX0NFTlRBVVI9eQogQ09ORklHX1g4Nl9EUz15CiBDT05GSUdfWDg2X1BUUkFDRV9CVFM9eQogQ09ORklHX0hQRVRfVElNRVI9eQpAQCAtMjY5LDYgKzI4MSw3IEBACiBDT05GSUdfWDg2X01DRT15CiBDT05GSUdfWDg2X01DRV9JTlRFTD15CiBDT05GSUdfWDg2X01DRV9BTUQ9eQorQ09ORklHX1g4Nl9NQ0VfVEhSRVNIT0xEPXkKICMgQ09ORklHX0k4SyBpcyBub3Qgc2V0CiBDT05GSUdfTUlDUk9DT0RFPXkKIENPTkZJR19NSUNST0NPREVfSU5URUw9eQpAQCAtMjc2LDYgKzI4OSw3IEBACiBDT05GSUdfTUlDUk9DT0RFX09MRF9JTlRFUkZBQ0U9eQogQ09ORklHX1g4Nl9NU1I9eQogQ09ORklHX1g4Nl9DUFVJRD15CisjIENPTkZJR19YODZfQ1BVX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19BUkNIX1BIWVNfQUREUl9UXzY0QklUPXkKIENPTkZJR19ESVJFQ1RfR0JQQUdFUz15CiBDT05GSUdfTlVNQT15CkBAIC0zMDksNiArMzIzLDggQEAKIENPTkZJR19CT1VOQ0U9eQogQ09ORklHX1ZJUlRfVE9fQlVTPXkKIENPTkZJR19VTkVWSUNUQUJMRV9MUlU9eQorQ09ORklHX0hBVkVfTUxPQ0s9eQorQ09ORklHX0hBVkVfTUxPQ0tFRF9QQUdFX0JJVD15CiBDT05GSUdfWDg2X0NIRUNLX0JJT1NfQ09SUlVQVElPTj15CiBDT05GSUdfWDg2X0JPT1RQQVJBTV9NRU1PUllfQ09SUlVQVElPTl9DSEVDSz15CiBDT05GSUdfWDg2X1JFU0VSVkVfTE9XXzY0Sz15CkBAIC0zMTcsNiArMzMzLDcgQEAKIENPTkZJR19YODZfUEFUPXkKIENPTkZJR19FRkk9eQogQ09ORklHX1NFQ0NPTVA9eQorIyBDT05GSUdfQ0NfU1RBQ0tQUk9URUNUT1IgaXMgbm90IHNldAogIyBDT05GSUdfSFpfMTAwIGlzIG5vdCBzZXQKICMgQ09ORklHX0haXzI1MCBpcyBub3Qgc2V0CiAjIENPTkZJR19IWl8zMDAgaXMgbm90IHNldApAQCAtMzI1LDkgKzM0MiwxMCBAQAogQ09ORklHX1NDSEVEX0hSVElDSz15CiBDT05GSUdfS0VYRUM9eQogQ09ORklHX0NSQVNIX0RVTVA9eQorIyBDT05GSUdfS0VYRUNfSlVNUCBpcyBub3Qgc2V0CiBDT05GSUdfUEhZU0lDQUxfU1RBUlQ9MHgxMDAwMDAwCi0jIENPTkZJR19SRUxPQ0FUQUJMRSBpcyBub3Qgc2V0Ci1DT05GSUdfUEhZU0lDQUxfQUxJR049MHgyMDAwMDAKK0NPTkZJR19SRUxPQ0FUQUJMRT15CitDT05GSUdfUEhZU0lDQUxfQUxJR049MHgxMDAwMDAwCiBDT05GSUdfSE9UUExVR19DUFU9eQogIyBDT05GSUdfQ09NUEFUX1ZEU08gaXMgbm90IHNldAogIyBDT05GSUdfQ01ETElORV9CT09MIGlzIG5vdCBzZXQKQEAgLTM3MCw3ICszODgsNiBAQAogQ09ORklHX0FDUElfQkxBQ0tMSVNUX1lFQVI9MAogIyBDT05GSUdfQUNQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19BQ1BJX1BDSV9TTE9UIGlzIG5vdCBzZXQKLUNPTkZJR19BQ1BJX1NZU1RFTT15CiBDT05GSUdfWDg2X1BNX1RJTUVSPXkKIENPTkZJR19BQ1BJX0NPTlRBSU5FUj15CiAjIENPTkZJR19BQ1BJX1NCUyBpcyBub3Qgc2V0CkBAIC00MzYsNiArNDUzLDcgQEAKICMgQ09ORklHX1BDSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ0lfU1RVQiBpcyBub3Qgc2V0CiBDT05GSUdfSFRfSVJRPXkKKyMgQ09ORklHX1BDSV9JT1YgaXMgbm90IHNldAogQ09ORklHX0lTQV9ETUFfQVBJPXkKIENPTkZJR19LOF9OQj15CiBDT05GSUdfUENDQVJEPXkKQEAgLTQ4MSw3ICs0OTksNiBAQAogIwogIyBOZXR3b3JraW5nIG9wdGlvbnMKICMKLUNPTkZJR19DT01QQVRfTkVUX0RFVl9PUFM9eQogQ09ORklHX1BBQ0tFVD15CiBDT05GSUdfUEFDS0VUX01NQVA9eQogQ09ORklHX1VOSVg9eQpAQCAtNjM5LDYgKzY1Niw3IEBACiAjIENPTkZJR19MQVBCIGlzIG5vdCBzZXQKICMgQ09ORklHX0VDT05FVCBpcyBub3Qgc2V0CiAjIENPTkZJR19XQU5fUk9VVEVSIGlzIG5vdCBzZXQKKyMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CiBDT05GSUdfTkVUX1NDSEVEPXkKIAogIwpAQCAtNjk2LDYgKzcxNCw3IEBACiAjCiAjIENPTkZJR19ORVRfUEtUR0VOIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVF9UQ1BQUk9CRSBpcyBub3Qgc2V0CisjIENPTkZJR19ORVRfRFJPUF9NT05JVE9SIGlzIG5vdCBzZXQKIENPTkZJR19IQU1SQURJTz15CiAKICMKQEAgLTcwNiwxMiArNzI1LDEwIEBACiAjIENPTkZJR19JUkRBIGlzIG5vdCBzZXQKICMgQ09ORklHX0JUIGlzIG5vdCBzZXQKICMgQ09ORklHX0FGX1JYUlBDIGlzIG5vdCBzZXQKLSMgQ09ORklHX1BIT05FVCBpcyBub3Qgc2V0CiBDT05GSUdfRklCX1JVTEVTPXkKIENPTkZJR19XSVJFTEVTUz15CiBDT05GSUdfQ0ZHODAyMTE9eQogIyBDT05GSUdfQ0ZHODAyMTFfUkVHX0RFQlVHIGlzIG5vdCBzZXQKLUNPTkZJR19OTDgwMjExPXkKIENPTkZJR19XSVJFTEVTU19PTERfUkVHVUxBVE9SWT15CiBDT05GSUdfV0lSRUxFU1NfRVhUPXkKIENPTkZJR19XSVJFTEVTU19FWFRfU1lTRlM9eQpAQCAtNzg4LDkgKzgwNSw4IEBACiAjIENPTkZJR19USUZNX0NPUkUgaXMgbm90IHNldAogIyBDT05GSUdfSUNTOTMyUzQwMSBpcyBub3Qgc2V0CiAjIENPTkZJR19FTkNMT1NVUkVfU0VSVklDRVMgaXMgbm90IHNldAotIyBDT05GSUdfU0dJX1hQIGlzIG5vdCBzZXQKICMgQ09ORklHX0hQX0lMTyBpcyBub3Qgc2V0Ci0jIENPTkZJR19TR0lfR1JVIGlzIG5vdCBzZXQKKyMgQ09ORklHX0lTTDI5MDAzIGlzIG5vdCBzZXQKICMgQ09ORklHX0MyUE9SVCBpcyBub3Qgc2V0CiAKICMKQEAgLTg0NCw2ICs4NjAsNyBAQAogIyBDT05GSUdfU0NTSV9MT1dMRVZFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0xPV0xFVkVMX1BDTUNJQSBpcyBub3Qgc2V0CiAjIENPTkZJR19TQ1NJX0RIIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NDU0lfT1NEX0lOSVRJQVRPUiBpcyBub3Qgc2V0CiBDT05GSUdfQVRBPXkKICMgQ09ORklHX0FUQV9OT05TVEFOREFSRCBpcyBub3Qgc2V0CiBDT05GSUdfQVRBX0FDUEk9eQpAQCAtOTQwLDYgKzk1Nyw3IEBACiBDT05GSUdfTUFDSU5UT1NIX0RSSVZFUlM9eQogQ09ORklHX01BQ19FTVVNT1VTRUJUTj15CiBDT05GSUdfTkVUREVWSUNFUz15CitDT05GSUdfQ09NUEFUX05FVF9ERVZfT1BTPXkKICMgQ09ORklHX0lGQiBpcyBub3Qgc2V0CiAjIENPTkZJR19EVU1NWSBpcyBub3Qgc2V0CiAjIENPTkZJR19CT05ESU5HIGlzIG5vdCBzZXQKQEAgLTk3Nyw2ICs5OTUsOCBAQAogQ09ORklHX05FVF9WRU5ET1JfM0NPTT15CiAjIENPTkZJR19WT1JURVggaXMgbm90IHNldAogIyBDT05GSUdfVFlQSE9PTiBpcyBub3Qgc2V0CisjIENPTkZJR19FVEhPQyBpcyBub3Qgc2V0CisjIENPTkZJR19ETkVUIGlzIG5vdCBzZXQKIENPTkZJR19ORVRfVFVMSVA9eQogIyBDT05GSUdfREUyMTA0WCBpcyBub3Qgc2V0CiAjIENPTkZJR19UVUxJUCBpcyBub3Qgc2V0CkBAIC0xMDI2LDYgKzEwNDYsNyBAQAogIyBDT05GSUdfRTEwMDBFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQMTAwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JR0IgaXMgbm90IHNldAorIyBDT05GSUdfSUdCVkYgaXMgbm90IHNldAogIyBDT05GSUdfTlM4MzgyMCBpcyBub3Qgc2V0CiAjIENPTkZJR19IQU1BQ0hJIGlzIG5vdCBzZXQKICMgQ09ORklHX1lFTExPV0ZJTiBpcyBub3Qgc2V0CkBAIC0xMDQwLDYgKzEwNjEsNyBAQAogIyBDT05GSUdfUUxBM1hYWCBpcyBub3Qgc2V0CiAjIENPTkZJR19BVEwxIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUTDFFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FUTDFDIGlzIG5vdCBzZXQKICMgQ09ORklHX0pNRSBpcyBub3Qgc2V0CiBDT05GSUdfTkVUREVWXzEwMDAwPXkKICMgQ09ORklHX0NIRUxTSU9fVDEgaXMgbm90IHNldApAQCAtMTA0OSw2ICsxMDcxLDcgQEAKICMgQ09ORklHX0lYR0JFIGlzIG5vdCBzZXQKICMgQ09ORklHX0lYR0IgaXMgbm90IHNldAogIyBDT05GSUdfUzJJTyBpcyBub3Qgc2V0CisjIENPTkZJR19WWEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX01ZUkkxMEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX05FVFhFTl9OSUMgaXMgbm90IHNldAogIyBDT05GSUdfTklVIGlzIG5vdCBzZXQKQEAgLTEwNTgsNiArMTA4MSw3IEBACiAjIENPTkZJR19CTlgyWCBpcyBub3Qgc2V0CiAjIENPTkZJR19RTEdFIGlzIG5vdCBzZXQKICMgQ09ORklHX1NGQyBpcyBub3Qgc2V0CisjIENPTkZJR19CRTJORVQgaXMgbm90IHNldAogQ09ORklHX1RSPXkKICMgQ09ORklHX0lCTU9MIGlzIG5vdCBzZXQKICMgQ09ORklHXzNDMzU5IGlzIG5vdCBzZXQKQEAgLTEwNzIsOCArMTA5Niw4IEBACiAjIENPTkZJR19MSUJFUlRBUyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJFUlRBU19USElORklSTSBpcyBub3Qgc2V0CiAjIENPTkZJR19BSVJPIGlzIG5vdCBzZXQKLSMgQ09ORklHX0hFUk1FUyBpcyBub3Qgc2V0CiAjIENPTkZJR19BVE1FTCBpcyBub3Qgc2V0CisjIENPTkZJR19BVDc2QzUwWF9VU0IgaXMgbm90IHNldAogIyBDT05GSUdfQUlST19DUyBpcyBub3Qgc2V0CiAjIENPTkZJR19QQ01DSUFfV0wzNTAxIGlzIG5vdCBzZXQKICMgQ09ORklHX1BSSVNNNTQgaXMgbm90IHNldApAQCAtMTA4MywyMSArMTEwNywyMSBAQAogIyBDT05GSUdfUlRMODE4NyBpcyBub3Qgc2V0CiAjIENPTkZJR19BRE04MjExIGlzIG5vdCBzZXQKICMgQ09ORklHX01BQzgwMjExX0hXU0lNIGlzIG5vdCBzZXQKKyMgQ09ORklHX01XTDhLIGlzIG5vdCBzZXQKICMgQ09ORklHX1A1NF9DT01NT04gaXMgbm90IHNldAogQ09ORklHX0FUSDVLPXkKICMgQ09ORklHX0FUSDVLX0RFQlVHIGlzIG5vdCBzZXQKICMgQ09ORklHX0FUSDlLIGlzIG5vdCBzZXQKKyMgQ09ORklHX0FSOTE3MF9VU0IgaXMgbm90IHNldAogIyBDT05GSUdfSVBXMjEwMCBpcyBub3Qgc2V0CiAjIENPTkZJR19JUFcyMjAwIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lXTENPUkUgaXMgbm90IHNldAotIyBDT05GSUdfSVdMV0lGSV9MRURTIGlzIG5vdCBzZXQKLSMgQ09ORklHX0lXTEFHTiBpcyBub3Qgc2V0Ci0jIENPTkZJR19JV0wzOTQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX0lXTFdJRkkgaXMgbm90IHNldAogIyBDT05GSUdfSE9TVEFQIGlzIG5vdCBzZXQKICMgQ09ORklHX0I0MyBpcyBub3Qgc2V0CiAjIENPTkZJR19CNDNMRUdBQ1kgaXMgbm90IHNldAogIyBDT05GSUdfWkQxMjExUlcgaXMgbm90IHNldAogIyBDT05GSUdfUlQyWDAwIGlzIG5vdCBzZXQKKyMgQ09ORklHX0hFUk1FUyBpcyBub3Qgc2V0CiAKICMKICMgRW5hYmxlIFdpTUFYIChOZXR3b3JraW5nIG9wdGlvbnMpIHRvIHNlZSB0aGUgV2lNQVggZHJpdmVycwpAQCAtMTIwOCw2ICsxMjMyLDggQEAKICMgQ09ORklHX1RBQkxFVF9VU0JfS0JUQUIgaXMgbm90IHNldAogIyBDT05GSUdfVEFCTEVUX1VTQl9XQUNPTSBpcyBub3Qgc2V0CiBDT05GSUdfSU5QVVRfVE9VQ0hTQ1JFRU49eQorIyBDT05GSUdfVE9VQ0hTQ1JFRU5fQUQ3ODc5X0kyQyBpcyBub3Qgc2V0CisjIENPTkZJR19UT1VDSFNDUkVFTl9BRDc4NzkgaXMgbm90IHNldAogIyBDT05GSUdfVE9VQ0hTQ1JFRU5fRlVKSVRTVSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9HVU5aRSBpcyBub3Qgc2V0CiAjIENPTkZJR19UT1VDSFNDUkVFTl9FTE8gaXMgbm90IHNldApAQCAtMTMwMSw2ICsxMzI3LDcgQEAKICMgQ09ORklHX0xFR0FDWV9QVFlTIGlzIG5vdCBzZXQKICMgQ09ORklHX0lQTUlfSEFORExFUiBpcyBub3Qgc2V0CiBDT05GSUdfSFdfUkFORE9NPXkKKyMgQ09ORklHX0hXX1JBTkRPTV9USU1FUklPTUVNIGlzIG5vdCBzZXQKICMgQ09ORklHX0hXX1JBTkRPTV9JTlRFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19SQU5ET01fQU1EIGlzIG5vdCBzZXQKIENPTkZJR19OVlJBTT15CkBAIC0xMzgyLDcgKzE0MDksNiBAQAogIyBDT05GSUdfU0VOU09SU19QQ0Y4NTc0IGlzIG5vdCBzZXQKICMgQ09ORklHX1BDRjg1NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19QQ0E5NTM5IGlzIG5vdCBzZXQKLSMgQ09ORklHX1NFTlNPUlNfUENGODU5MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDY4NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19UU0wyNTUwIGlzIG5vdCBzZXQKICMgQ09ORklHX0kyQ19ERUJVR19DT1JFIGlzIG5vdCBzZXQKQEAgLTE0MTYsNiArMTQ0Miw3IEBACiAjIENPTkZJR19TRU5TT1JTX0FEVDc0NzUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19LOFRFTVAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19BU0IxMDAgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19BVEswMTEwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfQVRYUDEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19EUzE2MjEgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19JNUtfQU1CIGlzIG5vdCBzZXQKQEAgLTE0MjUsNiArMTQ1Miw3IEBACiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ1BPUyBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0ZTQ0hNRCBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0c3NjBBIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfR0w1MThTTSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0dMNTIwU00gaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19DT1JFVEVNUCBpcyBub3Qgc2V0CkBAIC0xNDQwLDExICsxNDY4LDE0IEBACiAjIENPTkZJR19TRU5TT1JTX0xNOTAgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MTTkyIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfTE05MyBpcyBub3Qgc2V0CisjIENPTkZJR19TRU5TT1JTX0xUQzQyMTUgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19MVEM0MjQ1IGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFTlNPUlNfTE05NTI0MSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX01BWDE2MTkgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19NQVg2NjUwIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfUEM4NzM2MCBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX1BDODc0MjcgaXMgbm90IHNldAorIyBDT05GSUdfU0VOU09SU19QQ0Y4NTkxIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFTlNPUlNfU0lTNTU5NSBpcyBub3Qgc2V0CiAjIENPTkZJR19TRU5TT1JTX0RNRTE3MzcgaXMgbm90IHNldAogIyBDT05GSUdfU0VOU09SU19TTVNDNDdNMSBpcyBub3Qgc2V0CkBAIC0xNjM1LDYgKzE2NjYsNyBAQAogIyBDT05GSUdfRkJfVklSVFVBTCBpcyBub3Qgc2V0CiAjIENPTkZJR19GQl9NRVRST05PTUUgaXMgbm90IHNldAogIyBDT05GSUdfRkJfTUI4NjJYWCBpcyBub3Qgc2V0CisjIENPTkZJR19GQl9CUk9BRFNIRUVUIGlzIG5vdCBzZXQKIENPTkZJR19CQUNLTElHSFRfTENEX1NVUFBPUlQ9eQogIyBDT05GSUdfTENEX0NMQVNTX0RFVklDRSBpcyBub3Qgc2V0CiBDT05GSUdfQkFDS0xJR0hUX0NMQVNTX0RFVklDRT15CkBAIC0xNzIwLDYgKzE3NTIsOCBAQAogIyBDT05GSUdfU05EX0lORElHTyBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfSU5ESUdPSU8gaXMgbm90IHNldAogIyBDT05GSUdfU05EX0lORElHT0RKIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NORF9JTkRJR09JT1ggaXMgbm90IHNldAorIyBDT05GSUdfU05EX0lORElHT0RKWCBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfRU1VMTBLMSBpcyBub3Qgc2V0CiAjIENPTkZJR19TTkRfRU1VMTBLMVggaXMgbm90IHNldAogIyBDT05GSUdfU05EX0VOUzEzNzAgaXMgbm90IHNldApAQCAtMTc5MiwxNSArMTgyNiwxNyBAQAogIwogIyBTcGVjaWFsIEhJRCBkcml2ZXJzCiAjCi1DT05GSUdfSElEX0NPTVBBVD15CiBDT05GSUdfSElEX0E0VEVDSD15CiBDT05GSUdfSElEX0FQUExFPXkKIENPTkZJR19ISURfQkVMS0lOPXkKIENPTkZJR19ISURfQ0hFUlJZPXkKIENPTkZJR19ISURfQ0hJQ09OWT15CiBDT05GSUdfSElEX0NZUFJFU1M9eQorIyBDT05GSUdfRFJBR09OUklTRV9GRiBpcyBub3Qgc2V0CiBDT05GSUdfSElEX0VaS0VZPXkKK0NPTkZJR19ISURfS1lFPXkKIENPTkZJR19ISURfR1lSQVRJT049eQorQ09ORklHX0hJRF9LRU5TSU5HVE9OPXkKIENPTkZJR19ISURfTE9HSVRFQ0g9eQogQ09ORklHX0xPR0lURUNIX0ZGPXkKICMgQ09ORklHX0xPR0lSVU1CTEVQQUQyX0ZGIGlzIG5vdCBzZXQKQEAgLTE4NjYsMTEgKzE5MDIsMTEgQEAKICMgQ09ORklHX1VTQl9UTUMgaXMgbm90IHNldAogCiAjCi0jIE5PVEU6IFVTQl9TVE9SQUdFIGRlcGVuZHMgb24gU0NTSSBidXQgQkxLX0RFVl9TRCBtYXkgYWxzbyBiZSBuZWVkZWQ7CisjIE5PVEU6IFVTQl9TVE9SQUdFIGRlcGVuZHMgb24gU0NTSSBidXQgQkxLX0RFVl9TRCBtYXkKICMKIAogIwotIyBzZWUgVVNCX1NUT1JBR0UgSGVscCBmb3IgbW9yZSBpbmZvcm1hdGlvbgorIyBhbHNvIGJlIG5lZWRlZDsgc2VlIFVTQl9TVE9SQUdFIEhlbHAgZm9yIG1vcmUgaW5mbwogIwogQ09ORklHX1VTQl9TVE9SQUdFPXkKICMgQ09ORklHX1VTQl9TVE9SQUdFX0RFQlVHIGlzIG5vdCBzZXQKQEAgLTE5MTIsNyArMTk0OCw2IEBACiAjIENPTkZJR19VU0JfTEVEIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9DWVBSRVNTX0NZN0M2MyBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfQ1lUSEVSTSBpcyBub3Qgc2V0Ci0jIENPTkZJR19VU0JfUEhJREdFVCBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfSURNT1VTRSBpcyBub3Qgc2V0CiAjIENPTkZJR19VU0JfRlRESV9FTEFOIGlzIG5vdCBzZXQKICMgQ09ORklHX1VTQl9BUFBMRURJU1BMQVkgaXMgbm90IHNldApAQCAtMTkyOCw2ICsxOTYzLDcgQEAKICMKICMgT1RHIGFuZCByZWxhdGVkIGluZnJhc3RydWN0dXJlCiAjCisjIENPTkZJR19OT1BfVVNCX1hDRUlWIGlzIG5vdCBzZXQKICMgQ09ORklHX1VXQiBpcyBub3Qgc2V0CiAjIENPTkZJR19NTUMgaXMgbm90IHNldAogIyBDT05GSUdfTUVNU1RJQ0sgaXMgbm90IHNldApAQCAtMTkzOSw4ICsxOTc1LDEwIEBACiAjCiAjIENPTkZJR19MRURTX0FMSVgyIGlzIG5vdCBzZXQKICMgQ09ORklHX0xFRFNfUENBOTUzMiBpcyBub3Qgc2V0CisjIENPTkZJR19MRURTX0xQNTUyMSBpcyBub3Qgc2V0CiAjIENPTkZJR19MRURTX0NMRVZPX01BSUwgaXMgbm90IHNldAogIyBDT05GSUdfTEVEU19QQ0E5NTVYIGlzIG5vdCBzZXQKKyMgQ09ORklHX0xFRFNfQkQyODAyIGlzIG5vdCBzZXQKIAogIwogIyBMRUQgVHJpZ2dlcnMKQEAgLTE5NTAsNiArMTk4OCwxMCBAQAogIyBDT05GSUdfTEVEU19UUklHR0VSX0hFQVJUQkVBVCBpcyBub3Qgc2V0CiAjIENPTkZJR19MRURTX1RSSUdHRVJfQkFDS0xJR0hUIGlzIG5vdCBzZXQKICMgQ09ORklHX0xFRFNfVFJJR0dFUl9ERUZBVUxUX09OIGlzIG5vdCBzZXQKKworIworIyBpcHRhYmxlcyB0cmlnZ2VyIGlzIHVuZGVyIE5ldGZpbHRlciBjb25maWcgKExFRCB0YXJnZXQpCisjCiAjIENPTkZJR19BQ0NFU1NJQklMSVRZIGlzIG5vdCBzZXQKICMgQ09ORklHX0lORklOSUJBTkQgaXMgbm90IHNldAogQ09ORklHX0VEQUM9eQpAQCAtMjAxOCw2ICsyMDYwLDcgQEAKICMgRE1BIERldmljZXMKICMKICMgQ09ORklHX0lOVEVMX0lPQVRETUEgaXMgbm90IHNldAorIyBDT05GSUdfQVVYRElTUExBWSBpcyBub3Qgc2V0CiAjIENPTkZJR19VSU8gaXMgbm90IHNldAogIyBDT05GSUdfU1RBR0lORyBpcyBub3Qgc2V0CiBDT05GSUdfWDg2X1BMQVRGT1JNX0RFVklDRVM9eQpAQCAtMjA1MSw2ICsyMDk0LDcgQEAKICMKICMgQ09ORklHX0VYVDJfRlMgaXMgbm90IHNldAogQ09ORklHX0VYVDNfRlM9eQorIyBDT05GSUdfRVhUM19ERUZBVUxUU19UT19PUkRFUkVEIGlzIG5vdCBzZXQKIENPTkZJR19FWFQzX0ZTX1hBVFRSPXkKIENPTkZJR19FWFQzX0ZTX1BPU0lYX0FDTD15CiBDT05GSUdfRVhUM19GU19TRUNVUklUWT15CkBAIC0yMDgyLDYgKzIxMjYsMTEgQEAKIENPTkZJR19HRU5FUklDX0FDTD15CiAKICMKKyMgQ2FjaGVzCisjCisjIENPTkZJR19GU0NBQ0hFIGlzIG5vdCBzZXQKKworIwogIyBDRC1ST00vRFZEIEZpbGVzeXN0ZW1zCiAjCiBDT05GSUdfSVNPOTY2MF9GUz15CkBAIC0yMTMyLDYgKzIxODEsNyBAQAogIyBDT05GSUdfUk9NRlNfRlMgaXMgbm90IHNldAogIyBDT05GSUdfU1lTVl9GUyBpcyBub3Qgc2V0CiAjIENPTkZJR19VRlNfRlMgaXMgbm90IHNldAorIyBDT05GSUdfTklMRlMyX0ZTIGlzIG5vdCBzZXQKIENPTkZJR19ORVRXT1JLX0ZJTEVTWVNURU1TPXkKIENPTkZJR19ORlNfRlM9eQogQ09ORklHX05GU19WMz15CkBAIC0yMTQ1LDcgKzIxOTUsNiBAQAogQ09ORklHX05GU19DT01NT049eQogQ09ORklHX1NVTlJQQz15CiBDT05GSUdfU1VOUlBDX0dTUz15Ci0jIENPTkZJR19TVU5SUENfUkVHSVNURVJfVjQgaXMgbm90IHNldAogQ09ORklHX1JQQ1NFQ19HU1NfS1JCNT15CiAjIENPTkZJR19SUENTRUNfR1NTX1NQS00zIGlzIG5vdCBzZXQKICMgQ09ORklHX1NNQl9GUyBpcyBub3Qgc2V0CkBAIC0yMjMyLDYgKzIyODEsNyBAQAogQ09ORklHX0RFQlVHX0tFUk5FTD15CiAjIENPTkZJR19ERUJVR19TSElSUSBpcyBub3Qgc2V0CiAjIENPTkZJR19ERVRFQ1RfU09GVExPQ0tVUCBpcyBub3Qgc2V0CisjIENPTkZJR19ERVRFQ1RfSFVOR19UQVNLIGlzIG5vdCBzZXQKICMgQ09ORklHX1NDSEVEX0RFQlVHIGlzIG5vdCBzZXQKIENPTkZJR19TQ0hFRFNUQVRTPXkKIENPTkZJR19USU1FUl9TVEFUUz15CkBAIC0yMjQ3LDYgKzIyOTcsNyBAQAogIyBDT05GSUdfTE9DS19TVEFUIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1NQSU5MT0NLX1NMRUVQIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX0xPQ0tJTkdfQVBJX1NFTEZURVNUUyBpcyBub3Qgc2V0CitDT05GSUdfU1RBQ0tUUkFDRT15CiAjIENPTkZJR19ERUJVR19LT0JKRUNUIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19CVUdWRVJCT1NFPXkKICMgQ09ORklHX0RFQlVHX0lORk8gaXMgbm90IHNldApAQCAtMjI2OSwxMyArMjMyMCwxOSBAQAogIyBDT05GSUdfRkFVTFRfSU5KRUNUSU9OIGlzIG5vdCBzZXQKICMgQ09ORklHX0xBVEVOQ1lUT1AgaXMgbm90IHNldAogQ09ORklHX1NZU0NUTF9TWVNDQUxMX0NIRUNLPXkKKyMgQ09ORklHX0RFQlVHX1BBR0VBTExPQyBpcyBub3Qgc2V0CiBDT05GSUdfVVNFUl9TVEFDS1RSQUNFX1NVUFBPUlQ9eQorQ09ORklHX05PUF9UUkFDRVI9eQogQ09ORklHX0hBVkVfRlVOQ1RJT05fVFJBQ0VSPXkKIENPTkZJR19IQVZFX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUj15CiBDT05GSUdfSEFWRV9GVU5DVElPTl9UUkFDRV9NQ09VTlRfVEVTVD15CiBDT05GSUdfSEFWRV9EWU5BTUlDX0ZUUkFDRT15CiBDT05GSUdfSEFWRV9GVFJBQ0VfTUNPVU5UX1JFQ09SRD15CiBDT05GSUdfSEFWRV9IV19CUkFOQ0hfVFJBQ0VSPXkKK0NPTkZJR19IQVZFX0ZUUkFDRV9TWVNDQUxMUz15CitDT05GSUdfUklOR19CVUZGRVI9eQorQ09ORklHX1RSQUNJTkc9eQorQ09ORklHX1RSQUNJTkdfU1VQUE9SVD15CiAKICMKICMgVHJhY2VycwpAQCAtMjI4NSwxMyArMjM0MiwyMSBAQAogIyBDT05GSUdfU1lTUFJPRl9UUkFDRVIgaXMgbm90IHNldAogIyBDT05GSUdfU0NIRURfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX0NPTlRFWFRfU1dJVENIX1RSQUNFUiBpcyBub3Qgc2V0CisjIENPTkZJR19FVkVOVF9UUkFDRVIgaXMgbm90IHNldAorIyBDT05GSUdfRlRSQUNFX1NZU0NBTExTIGlzIG5vdCBzZXQKICMgQ09ORklHX0JPT1RfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1RSQUNFX0JSQU5DSF9QUk9GSUxJTkcgaXMgbm90IHNldAogIyBDT05GSUdfUE9XRVJfVFJBQ0VSIGlzIG5vdCBzZXQKICMgQ09ORklHX1NUQUNLX1RSQUNFUiBpcyBub3Qgc2V0CiAjIENPTkZJR19IV19CUkFOQ0hfVFJBQ0VSIGlzIG5vdCBzZXQKKyMgQ09ORklHX0tNRU1UUkFDRSBpcyBub3Qgc2V0CisjIENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSIGlzIG5vdCBzZXQKK0NPTkZJR19CTEtfREVWX0lPX1RSQUNFPXkKKyMgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QgaXMgbm90IHNldAorIyBDT05GSUdfTU1JT1RSQUNFIGlzIG5vdCBzZXQKIENPTkZJR19QUk9WSURFX09IQ0kxMzk0X0RNQV9JTklUPXkKLSMgQ09ORklHX0RZTkFNSUNfUFJJTlRLX0RFQlVHIGlzIG5vdCBzZXQKKyMgQ09ORklHX0RZTkFNSUNfREVCVUcgaXMgbm90IHNldAorIyBDT05GSUdfRE1BX0FQSV9ERUJVRyBpcyBub3Qgc2V0CiAjIENPTkZJR19TQU1QTEVTIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0FSQ0hfS0dEQj15CiAjIENPTkZJR19LR0RCIGlzIG5vdCBzZXQKQEAgLTIzMDEsMTQgKzIzNjYsMTMgQEAKIENPTkZJR19FQVJMWV9QUklOVEtfREJHUD15CiBDT05GSUdfREVCVUdfU1RBQ0tPVkVSRkxPVz15CiBDT05GSUdfREVCVUdfU1RBQ0tfVVNBR0U9eQotIyBDT05GSUdfREVCVUdfUEFHRUFMTE9DIGlzIG5vdCBzZXQKICMgQ09ORklHX0RFQlVHX1BFUl9DUFVfTUFQUyBpcyBub3Qgc2V0CiAjIENPTkZJR19YODZfUFREVU1QIGlzIG5vdCBzZXQKIENPTkZJR19ERUJVR19ST0RBVEE9eQogIyBDT05GSUdfREVCVUdfUk9EQVRBX1RFU1QgaXMgbm90IHNldAogQ09ORklHX0RFQlVHX05YX1RFU1Q9bQogIyBDT05GSUdfSU9NTVVfREVCVUcgaXMgbm90IHNldAotIyBDT05GSUdfTU1JT1RSQUNFIGlzIG5vdCBzZXQKK0NPTkZJR19IQVZFX01NSU9UUkFDRV9TVVBQT1JUPXkKIENPTkZJR19JT19ERUxBWV9UWVBFXzBYODA9MAogQ09ORklHX0lPX0RFTEFZX1RZUEVfMFhFRD0xCiBDT05GSUdfSU9fREVMQVlfVFlQRV9VREVMQVk9MgpAQCAtMjM0NCw2ICsyNDA4LDggQEAKIENPTkZJR19TRUNVUklUWV9TRUxJTlVYX0NIRUNLUkVRUFJPVF9WQUxVRT0xCiAjIENPTkZJR19TRUNVUklUWV9TRUxJTlVYX1BPTElDWURCX1ZFUlNJT05fTUFYIGlzIG5vdCBzZXQKICMgQ09ORklHX1NFQ1VSSVRZX1NNQUNLIGlzIG5vdCBzZXQKKyMgQ09ORklHX1NFQ1VSSVRZX1RPTU9ZTyBpcyBub3Qgc2V0CisjIENPTkZJR19JTUEgaXMgbm90IHNldAogQ09ORklHX0NSWVBUTz15CiAKICMKQEAgLTIzNTksMTAgKzI0MjUsMTIgQEAKIENPTkZJR19DUllQVE9fSEFTSD15CiBDT05GSUdfQ1JZUFRPX0hBU0gyPXkKIENPTkZJR19DUllQVE9fUk5HMj15CitDT05GSUdfQ1JZUFRPX1BDT01QPXkKIENPTkZJR19DUllQVE9fTUFOQUdFUj15CiBDT05GSUdfQ1JZUFRPX01BTkFHRVIyPXkKICMgQ09ORklHX0NSWVBUT19HRjEyOE1VTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fTlVMTCBpcyBub3Qgc2V0CitDT05GSUdfQ1JZUFRPX1dPUktRVUVVRT15CiAjIENPTkZJR19DUllQVE9fQ1JZUFREIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQVVUSEVOQz15CiAjIENPTkZJR19DUllQVE9fVEVTVCBpcyBub3Qgc2V0CkBAIC0yNDE0LDYgKzI0ODIsNyBAQAogIwogQ09ORklHX0NSWVBUT19BRVM9eQogIyBDT05GSUdfQ1JZUFRPX0FFU19YODZfNjQgaXMgbm90IHNldAorIyBDT05GSUdfQ1JZUFRPX0FFU19OSV9JTlRFTCBpcyBub3Qgc2V0CiAjIENPTkZJR19DUllQVE9fQU5VQklTIGlzIG5vdCBzZXQKIENPTkZJR19DUllQVE9fQVJDND15CiAjIENPTkZJR19DUllQVE9fQkxPV0ZJU0ggaXMgbm90IHNldApAQCAtMjQzNSw2ICsyNTA0LDcgQEAKICMgQ29tcHJlc3Npb24KICMKICMgQ09ORklHX0NSWVBUT19ERUZMQVRFIGlzIG5vdCBzZXQKKyMgQ09ORklHX0NSWVBUT19aTElCIGlzIG5vdCBzZXQKICMgQ09ORklHX0NSWVBUT19MWk8gaXMgbm90IHNldAogCiAjCkBAIC0yNDQ0LDEwICsyNTE0LDEyIEBACiBDT05GSUdfQ1JZUFRPX0hXPXkKICMgQ09ORklHX0NSWVBUT19ERVZfSElGTl83OTVYIGlzIG5vdCBzZXQKIENPTkZJR19IQVZFX0tWTT15CitDT05GSUdfSEFWRV9LVk1fSVJRQ0hJUD15CiBDT05GSUdfVklSVFVBTElaQVRJT049eQogIyBDT05GSUdfS1ZNIGlzIG5vdCBzZXQKICMgQ09ORklHX1ZJUlRJT19QQ0kgaXMgbm90IHNldAogIyBDT05GSUdfVklSVElPX0JBTExPT04gaXMgbm90IHNldAorQ09ORklHX0JJTkFSWV9QUklOVEY9eQogCiAjCiAjIExpYnJhcnkgcm91dGluZXMKQEAgLTI0NjQsNyArMjUzNiwxMCBAQAogIyBDT05GSUdfQ1JDNyBpcyBub3Qgc2V0CiAjIENPTkZJR19MSUJDUkMzMkMgaXMgbm90IHNldAogQ09ORklHX1pMSUJfSU5GTEFURT15Ci1DT05GSUdfUExJU1Q9eQorQ09ORklHX0RFQ09NUFJFU1NfR1pJUD15CitDT05GSUdfREVDT01QUkVTU19CWklQMj15CitDT05GSUdfREVDT01QUkVTU19MWk1BPXkKIENPTkZJR19IQVNfSU9NRU09eQogQ09ORklHX0hBU19JT1BPUlQ9eQogQ09ORklHX0hBU19ETUE9eQorQ09ORklHX05MQVRUUj15CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TIGIvYXJjaC94ODYvaWEzMi9pYTMyZW50cnkuUwppbmRleCBhNTA1MjAyLi5lNTkwMjYxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pYTMyL2lhMzJlbnRyeS5TCisrKyBiL2FyY2gveDg2L2lhMzIvaWEzMmVudHJ5LlMKQEAgLTgyNSw5ICs4MjUsMTEgQEAKIAkucXVhZCBjb21wYXRfc3lzX3NpZ25hbGZkNAogCS5xdWFkIHN5c19ldmVudGZkMgogCS5xdWFkIHN5c19lcG9sbF9jcmVhdGUxCi0JLnF1YWQgc3lzX2R1cDMJCQkvKiAzMzAgKi8KKwkucXVhZCBzeXNfZHVwMwkJCQkvKiAzMzAgKi8KIAkucXVhZCBzeXNfcGlwZTIKIAkucXVhZCBzeXNfaW5vdGlmeV9pbml0MQogCS5xdWFkIGNvbXBhdF9zeXNfcHJlYWR2CiAJLnF1YWQgY29tcGF0X3N5c19wd3JpdGV2CisJLnF1YWQgY29tcGF0X3N5c19ydF90Z3NpZ3F1ZXVlaW5mbwkvKiAzMzUgKi8KKwkucXVhZCBzeXNfcGVyZl9jb3VudGVyX29wZW4KIGlhMzJfc3lzY2FsbF9lbmQ6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYWx0ZXJuYXRpdmUuaAppbmRleCBmNmFhMThlLi4xYTM3YmNkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbHRlcm5hdGl2ZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FsdGVybmF0aXZlLmgKQEAgLTMsNiArMyw3IEBACiAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgogI2luY2x1ZGUgPGFzbS9hc20uaD4KIAogLyoKQEAgLTc0LDYgKzc1LDIyIEBACiAKIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0ICpmaW5kX25vcF90YWJsZSh2b2lkKTsKIAorLyogYWx0ZXJuYXRpdmUgYXNzZW1ibHkgcHJpbWl0aXZlOiAqLworI2RlZmluZSBBTFRFUk5BVElWRShvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUpCQkJXAorCQkJCQkJCQkJXAorICAgICAgIjY2MTpcblx0IiBvbGRpbnN0ciAiXG42NjI6XG4iCQkJCQlcCisgICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIgkJCQlcCisgICAgICBfQVNNX0FMSUdOICJcbiIJCQkJCQkJXAorICAgICAgX0FTTV9QVFIgIjY2MWJcbiIJCQkJLyogbGFiZWwgICAgICAgICAgICovCVwKKyAgICAgIF9BU01fUFRSICI2NjNmXG4iCQkJCS8qIG5ldyBpbnN0cnVjdGlvbiAqLwlcCisgICAgICAiCSAuYnl0ZSAiIF9fc3RyaW5naWZ5KGZlYXR1cmUpICJcbiIJLyogZmVhdHVyZSBiaXQgICAgICovCVwKKyAgICAgICIJIC5ieXRlIDY2MmItNjYxYlxuIgkJCS8qIHNvdXJjZWxlbiAgICAgICAqLwlcCisgICAgICAiCSAuYnl0ZSA2NjRmLTY2M2ZcbiIJCQkvKiByZXBsYWNlbWVudGxlbiAgKi8JXAorICAgICAgIi5wcmV2aW91c1xuIgkJCQkJCQlcCisgICAgICAiLnNlY3Rpb24gLmFsdGluc3RyX3JlcGxhY2VtZW50LCBcImF4XCJcbiIJCQlcCisgICAgICAiNjYzOlxuXHQiIG5ld2luc3RyICJcbjY2NDpcbiIJCS8qIHJlcGxhY2VtZW50ICAgICAqLwlcCisgICAgICAiLnByZXZpb3VzIgorCiAvKgogICogQWx0ZXJuYXRpdmUgaW5zdHJ1Y3Rpb25zIGZvciBkaWZmZXJlbnQgQ1BVIHR5cGVzIG9yIGNhcGFiaWxpdGllcy4KICAqCkBAIC04NywxOCArMTA0LDcgQEAKICAqIHdpdGhvdXQgdm9sYXRpbGUgYW5kIG1lbW9yeSBjbG9iYmVyLgogICovCiAjZGVmaW5lIGFsdGVybmF0aXZlKG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZSkJCQlcCi0JYXNtIHZvbGF0aWxlICgiNjYxOlxuXHQiIG9sZGluc3RyICJcbjY2MjpcbiIJCQlcCi0JCSAgICAgICIuc2VjdGlvbiAuYWx0aW5zdHJ1Y3Rpb25zLFwiYVwiXG4iCQlcCi0JCSAgICAgIF9BU01fQUxJR04gIlxuIgkJCQkJXAotCQkgICAgICBfQVNNX1BUUiAiNjYxYlxuIgkJLyogbGFiZWwgKi8JCVwKLQkJICAgICAgX0FTTV9QVFIgIjY2M2ZcbiIJCS8qIG5ldyBpbnN0cnVjdGlvbiAqLwlcCi0JCSAgICAgICIJIC5ieXRlICVjMFxuIgkJLyogZmVhdHVyZSBiaXQgKi8JXAotCQkgICAgICAiCSAuYnl0ZSA2NjJiLTY2MWJcbiIJLyogc291cmNlbGVuICovCQlcCi0JCSAgICAgICIJIC5ieXRlIDY2NGYtNjYzZlxuIgkvKiByZXBsYWNlbWVudGxlbiAqLwlcCi0JCSAgICAgICIucHJldmlvdXNcbiIJCQkJCVwKLQkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCxcImF4XCJcbiIJCVwKLQkJICAgICAgIjY2Mzpcblx0IiBuZXdpbnN0ciAiXG42NjQ6XG4iICAvKiByZXBsYWNlbWVudCAqLwlcCi0JCSAgICAgICIucHJldmlvdXMiIDo6ICJpIiAoZmVhdHVyZSkgOiAibWVtb3J5IikKKwlhc20gdm9sYXRpbGUgKEFMVEVSTkFUSVZFKG9sZGluc3RyLCBuZXdpbnN0ciwgZmVhdHVyZSkgOiA6IDogIm1lbW9yeSIpCiAKIC8qCiAgKiBBbHRlcm5hdGl2ZSBpbmxpbmUgYXNzZW1ibHkgd2l0aCBpbnB1dC4KQEAgLTEwOSwzNSArMTE1LDE2IEBACiAgKiBCZXN0IGlzIHRvIHVzZSBjb25zdHJhaW50cyB0aGF0IGFyZSBmaXhlZCBzaXplIChsaWtlICglMSkgLi4uICJyIikKICAqIElmIHlvdSB1c2UgdmFyaWFibGUgc2l6ZWQgY29uc3RyYWludHMgbGlrZSAibSIgb3IgImciIGluIHRoZQogICogcmVwbGFjZW1lbnQgbWFrZSBzdXJlIHRvIHBhZCB0byB0aGUgd29yc3QgY2FzZSBsZW5ndGguCisgKiBMZWF2aW5nIGFuIHVudXNlZCBhcmd1bWVudCAwIHRvIGtlZXAgQVBJIGNvbXBhdGliaWxpdHkuCiAgKi8KICNkZWZpbmUgYWx0ZXJuYXRpdmVfaW5wdXQob2xkaW5zdHIsIG5ld2luc3RyLCBmZWF0dXJlLCBpbnB1dC4uLikJXAotCWFzbSB2b2xhdGlsZSAoIjY2MTpcblx0IiBvbGRpbnN0ciAiXG42NjI6XG4iCQkJXAotCQkgICAgICAiLnNlY3Rpb24gLmFsdGluc3RydWN0aW9ucyxcImFcIlxuIgkJXAotCQkgICAgICBfQVNNX0FMSUdOICJcbiIJCQkJCVwKLQkJICAgICAgX0FTTV9QVFIgIjY2MWJcbiIJCS8qIGxhYmVsICovCQlcCi0JCSAgICAgIF9BU01fUFRSICI2NjNmXG4iCQkvKiBuZXcgaW5zdHJ1Y3Rpb24gKi8JXAotCQkgICAgICAiCSAuYnl0ZSAlYzBcbiIJCS8qIGZlYXR1cmUgYml0ICovCVwKLQkJICAgICAgIgkgLmJ5dGUgNjYyYi02NjFiXG4iCS8qIHNvdXJjZWxlbiAqLwkJXAotCQkgICAgICAiCSAuYnl0ZSA2NjRmLTY2M2ZcbiIJLyogcmVwbGFjZW1lbnRsZW4gKi8JXAotCQkgICAgICAiLnByZXZpb3VzXG4iCQkJCQlcCi0JCSAgICAgICIuc2VjdGlvbiAuYWx0aW5zdHJfcmVwbGFjZW1lbnQsXCJheFwiXG4iCQlcCi0JCSAgICAgICI2NjM6XG5cdCIgbmV3aW5zdHIgIlxuNjY0OlxuIiAgLyogcmVwbGFjZW1lbnQgKi8JXAotCQkgICAgICAiLnByZXZpb3VzIiA6OiAiaSIgKGZlYXR1cmUpLCAjI2lucHV0KQorCWFzbSB2b2xhdGlsZSAoQUxURVJOQVRJVkUob2xkaW5zdHIsIG5ld2luc3RyLCBmZWF0dXJlKQkJXAorCQk6IDogImkiICgwKSwgIyMgaW5wdXQpCiAKIC8qIExpa2UgYWx0ZXJuYXRpdmVfaW5wdXQsIGJ1dCB3aXRoIGEgc2luZ2xlIG91dHB1dCBhcmd1bWVudCAqLwogI2RlZmluZSBhbHRlcm5hdGl2ZV9pbyhvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUsIG91dHB1dCwgaW5wdXQuLi4pCVwKLQlhc20gdm9sYXRpbGUgKCI2NjE6XG5cdCIgb2xkaW5zdHIgIlxuNjYyOlxuIgkJCVwKLQkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cnVjdGlvbnMsXCJhXCJcbiIJCVwKLQkJICAgICAgX0FTTV9BTElHTiAiXG4iCQkJCQlcCi0JCSAgICAgIF9BU01fUFRSICI2NjFiXG4iCQkvKiBsYWJlbCAqLwkJXAotCQkgICAgICBfQVNNX1BUUiAiNjYzZlxuIgkJLyogbmV3IGluc3RydWN0aW9uICovCVwKLQkJICAgICAgIgkgLmJ5dGUgJWNbZmVhdF1cbiIJLyogZmVhdHVyZSBiaXQgKi8JXAotCQkgICAgICAiCSAuYnl0ZSA2NjJiLTY2MWJcbiIJLyogc291cmNlbGVuICovCQlcCi0JCSAgICAgICIJIC5ieXRlIDY2NGYtNjYzZlxuIgkvKiByZXBsYWNlbWVudGxlbiAqLwlcCi0JCSAgICAgICIucHJldmlvdXNcbiIJCQkJCVwKLQkJICAgICAgIi5zZWN0aW9uIC5hbHRpbnN0cl9yZXBsYWNlbWVudCxcImF4XCJcbiIJCVwKLQkJICAgICAgIjY2Mzpcblx0IiBuZXdpbnN0ciAiXG42NjQ6XG4iICAvKiByZXBsYWNlbWVudCAqLyBcCi0JCSAgICAgICIucHJldmlvdXMiIDogb3V0cHV0IDogW2ZlYXRdICJpIiAoZmVhdHVyZSksICMjaW5wdXQpCisJYXNtIHZvbGF0aWxlIChBTFRFUk5BVElWRShvbGRpbnN0ciwgbmV3aW5zdHIsIGZlYXR1cmUpCQlcCisJCTogb3V0cHV0IDogImkiICgwKSwgIyMgaW5wdXQpCiAKIC8qCiAgKiB1c2UgdGhpcyBtYWNybyhzKSBpZiB5b3UgbmVlZCBtb3JlIHRoYW4gb25lIG91dHB1dCBwYXJhbWV0ZXIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FtZF9pb21tdS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11LmgKaW5kZXggZjcxMjM0NC4uMjYyZTAyOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11LmgKQEAgLTI3LDYgKzI3LDggQEAKIGV4dGVybiBpbnQgYW1kX2lvbW11X2luaXRfZG1hX29wcyh2b2lkKTsKIGV4dGVybiB2b2lkIGFtZF9pb21tdV9kZXRlY3Qodm9pZCk7CiBleHRlcm4gaXJxcmV0dXJuX3QgYW1kX2lvbW11X2ludF9oYW5kbGVyKGludCBpcnEsIHZvaWQgKmRhdGEpOworZXh0ZXJuIHZvaWQgYW1kX2lvbW11X2ZsdXNoX2FsbF9kb21haW5zKHZvaWQpOworZXh0ZXJuIHZvaWQgYW1kX2lvbW11X2ZsdXNoX2FsbF9kZXZpY2VzKHZvaWQpOwogI2Vsc2UKIHN0YXRpYyBpbmxpbmUgaW50IGFtZF9pb21tdV9pbml0KHZvaWQpIHsgcmV0dXJuIC1FTk9ERVY7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhbWRfaW9tbXVfZGV0ZWN0KHZvaWQpIHsgfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYW1kX2lvbW11X3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfdHlwZXMuaAppbmRleCA5NWM4Y2Q5Li4wYzg3OGNhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hbWRfaW9tbXVfdHlwZXMuaApAQCAtMTk0LDYgKzE5NCwyNyBAQAogI2RlZmluZSBQRF9ETUFfT1BTX01BU0sJCSgxVUwgPDwgMCkgLyogZG9tYWluIHVzZWQgZm9yIGRtYV9vcHMgKi8KICNkZWZpbmUgUERfREVGQVVMVF9NQVNLCQkoMVVMIDw8IDEpIC8qIGRvbWFpbiBpcyBhIGRlZmF1bHQgZG1hX29wcwogCQkJCQkgICAgICBkb21haW4gZm9yIGFuIElPTU1VICovCitleHRlcm4gYm9vbCBhbWRfaW9tbXVfZHVtcDsKKyNkZWZpbmUgRFVNUF9wcmludGsoZm9ybWF0LCBhcmcuLi4pCQkJCQlcCisJZG8gewkJCQkJCQkJXAorCQlpZiAoYW1kX2lvbW11X2R1bXApCQkJCQkJXAorCQkJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIElPTU1VOiAiIGZvcm1hdCwgIyMgYXJnKTsJXAorCX0gd2hpbGUoMCk7CisKKy8qCisgKiBNYWtlIGl0ZXJhdGluZyBvdmVyIGFsbCBJT01NVXMgZWFzaWVyCisgKi8KKyNkZWZpbmUgZm9yX2VhY2hfaW9tbXUoaW9tbXUpIFwKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KChpb21tdSksICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkKKyNkZWZpbmUgZm9yX2VhY2hfaW9tbXVfc2FmZShpb21tdSwgbmV4dCkgXAorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSgoaW9tbXUpLCAobmV4dCksICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkKKworI2RlZmluZSBBUEVSVFVSRV9SQU5HRV9TSElGVAkyNwkvKiAxMjggTUIgKi8KKyNkZWZpbmUgQVBFUlRVUkVfUkFOR0VfU0laRQkoMVVMTCA8PCBBUEVSVFVSRV9SQU5HRV9TSElGVCkKKyNkZWZpbmUgQVBFUlRVUkVfUkFOR0VfUEFHRVMJKEFQRVJUVVJFX1JBTkdFX1NJWkUgPj4gUEFHRV9TSElGVCkKKyNkZWZpbmUgQVBFUlRVUkVfTUFYX1JBTkdFUwkzMgkvKiBhbGxvd3MgNEdCIG9mIERNQSBhZGRyZXNzIHNwYWNlICovCisjZGVmaW5lIEFQRVJUVVJFX1JBTkdFX0lOREVYKGEpCSgoYSkgPj4gQVBFUlRVUkVfUkFOR0VfU0hJRlQpCisjZGVmaW5lIEFQRVJUVVJFX1BBR0VfSU5ERVgoYSkJKCgoYSkgPj4gMjEpICYgMHgzZlVMTCkKIAogLyoKICAqIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGdlbmVyaWMgZGF0YSBmb3IgIElPTU1VIHByb3RlY3Rpb24gZG9tYWlucwpAQCAtMjEwLDYgKzIzMSwyNiBAQAogfTsKIAogLyoKKyAqIEZvciBkeW5hbWljIGdyb3d0aCB0aGUgYXBlcnR1cmUgc2l6ZSBpcyBzcGxpdCBpbnRvIHJhbmdlcyBvZiAxMjhNQiBvZgorICogRE1BIGFkZHJlc3Mgc3BhY2UgZWFjaC4gVGhpcyBzdHJ1Y3QgcmVwcmVzZW50cyBvbmUgc3VjaCByYW5nZS4KKyAqLworc3RydWN0IGFwZXJ0dXJlX3JhbmdlIHsKKworCS8qIGFkZHJlc3MgYWxsb2NhdGlvbiBiaXRtYXAgKi8KKwl1bnNpZ25lZCBsb25nICpiaXRtYXA7CisKKwkvKgorCSAqIEFycmF5IG9mIFBURSBwYWdlcyBmb3IgdGhlIGFwZXJ0dXJlLiBJbiB0aGlzIGFycmF5IHdlIHNhdmUgYWxsIHRoZQorCSAqIGxlYWYgcGFnZXMgb2YgdGhlIGRvbWFpbiBwYWdlIHRhYmxlIHVzZWQgZm9yIHRoZSBhcGVydHVyZS4gVGhpcyB3YXkKKwkgKiB3ZSBkb24ndCBuZWVkIHRvIHdhbGsgdGhlIHBhZ2UgdGFibGUgdG8gZmluZCBhIHNwZWNpZmljIFBURS4gV2UgY2FuCisJICoganVzdCBjYWxjdWxhdGUgaXRzIGFkZHJlc3MgaW4gY29uc3RhbnQgdGltZS4KKwkgKi8KKwl1NjQgKnB0ZV9wYWdlc1s2NF07CisKKwl1bnNpZ25lZCBsb25nIG9mZnNldDsKK307CisKKy8qCiAgKiBEYXRhIGNvbnRhaW5lciBmb3IgYSBkbWFfb3BzIHNwZWNpZmljIHByb3RlY3Rpb24gZG9tYWluCiAgKi8KIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiB7CkBAIC0yMjIsMTggKzI2MywxMCBAQAogCXVuc2lnbmVkIGxvbmcgYXBlcnR1cmVfc2l6ZTsKIAogCS8qIGFkZHJlc3Mgd2Ugc3RhcnQgdG8gc2VhcmNoIGZvciBmcmVlIGFkZHJlc3NlcyAqLwotCXVuc2lnbmVkIGxvbmcgbmV4dF9iaXQ7CisJdW5zaWduZWQgbG9uZyBuZXh0X2FkZHJlc3M7CiAKLQkvKiBhZGRyZXNzIGFsbG9jYXRpb24gYml0bWFwICovCi0JdW5zaWduZWQgbG9uZyAqYml0bWFwOwotCi0JLyoKLQkgKiBBcnJheSBvZiBQVEUgcGFnZXMgZm9yIHRoZSBhcGVydHVyZS4gSW4gdGhpcyBhcnJheSB3ZSBzYXZlIGFsbCB0aGUKLQkgKiBsZWFmIHBhZ2VzIG9mIHRoZSBkb21haW4gcGFnZSB0YWJsZSB1c2VkIGZvciB0aGUgYXBlcnR1cmUuIFRoaXMgd2F5Ci0JICogd2UgZG9uJ3QgbmVlZCB0byB3YWxrIHRoZSBwYWdlIHRhYmxlIHRvIGZpbmQgYSBzcGVjaWZpYyBQVEUuIFdlIGNhbgotCSAqIGp1c3QgY2FsY3VsYXRlIGl0cyBhZGRyZXNzIGluIGNvbnN0YW50IHRpbWUuCi0JICovCi0JdTY0ICoqcHRlX3BhZ2VzOworCS8qIGFkZHJlc3Mgc3BhY2UgcmVsZXZhbnQgZGF0YSAqLworCXN0cnVjdCBhcGVydHVyZV9yYW5nZSAqYXBlcnR1cmVbQVBFUlRVUkVfTUFYX1JBTkdFU107CiAKIAkvKiBUaGlzIHdpbGwgYmUgc2V0IHRvIHRydWUgd2hlbiBUTEIgbmVlZHMgdG8gYmUgZmx1c2hlZCAqLwogCWJvb2wgbmVlZF9mbHVzaDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWMuaAppbmRleCA0MmYyZjgzLi5iYjdkNDc5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpYy5oCkBAIC0xMDcsOCArMTA3LDcgQEAKIGV4dGVybiB2b2lkIG5hdGl2ZV9hcGljX2ljcl93cml0ZSh1MzIgbG93LCB1MzIgaWQpOwogZXh0ZXJuIHU2NCBuYXRpdmVfYXBpY19pY3JfcmVhZCh2b2lkKTsKIAotI2RlZmluZSBFSU1fOEJJVF9BUElDX0lECTAKLSNkZWZpbmUgRUlNXzMyQklUX0FQSUNfSUQJMQorZXh0ZXJuIGludCB4MmFwaWNfbW9kZTsKIAogI2lmZGVmIENPTkZJR19YODZfWDJBUElDCiAvKgpAQCAtMTY2LDEwICsxNjUsOSBAQAogCXJldHVybiB2YWw7CiB9CiAKLWV4dGVybiBpbnQgeDJhcGljLCB4MmFwaWNfcGh5czsKK2V4dGVybiBpbnQgeDJhcGljX3BoeXM7CiBleHRlcm4gdm9pZCBjaGVja194MmFwaWModm9pZCk7CiBleHRlcm4gdm9pZCBlbmFibGVfeDJhcGljKHZvaWQpOwotZXh0ZXJuIHZvaWQgZW5hYmxlX0lSX3gyYXBpYyh2b2lkKTsKIGV4dGVybiB2b2lkIHgyYXBpY19pY3Jfd3JpdGUodTMyIGxvdywgdTMyIGlkKTsKIHN0YXRpYyBpbmxpbmUgaW50IHgyYXBpY19lbmFibGVkKHZvaWQpCiB7CkBAIC0xODMsNiArMTgxLDggQEAKIAkJcmV0dXJuIDE7CiAJcmV0dXJuIDA7CiB9CisKKyNkZWZpbmUgeDJhcGljX3N1cHBvcnRlZCgpCShjcHVfaGFzX3gyYXBpYykKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgY2hlY2tfeDJhcGljKHZvaWQpCiB7CkBAIC0xOTAsMjggKzE5MCwyMCBAQAogc3RhdGljIGlubGluZSB2b2lkIGVuYWJsZV94MmFwaWModm9pZCkKIHsKIH0KLXN0YXRpYyBpbmxpbmUgdm9pZCBlbmFibGVfSVJfeDJhcGljKHZvaWQpCi17Ci19CiBzdGF0aWMgaW5saW5lIGludCB4MmFwaWNfZW5hYmxlZCh2b2lkKQogewogCXJldHVybiAwOwogfQogCi0jZGVmaW5lCXgyYXBpYwkwCi0KKyNkZWZpbmUJeDJhcGljX3ByZWVuYWJsZWQgMAorI2RlZmluZQl4MmFwaWNfc3VwcG9ydGVkKCkJMAogI2VuZGlmCiAKK2V4dGVybiB2b2lkIGVuYWJsZV9JUl94MmFwaWModm9pZCk7CisKIGV4dGVybiBpbnQgZ2V0X3BoeXNpY2FsX2Jyb2FkY2FzdCh2b2lkKTsKIAotI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi1zdGF0aWMgaW5saW5lIHZvaWQgYWNrX3gyQVBJQ19pcnEodm9pZCkKLXsKLQkvKiBEb2NzIHNheSB1c2UgMCBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHkgKi8KLQluYXRpdmVfYXBpY19tc3Jfd3JpdGUoQVBJQ19FT0ksIDApOwotfQotI2VuZGlmCi0KK2V4dGVybiB2b2lkIGFwaWNfZGlzYWJsZSh2b2lkKTsKIGV4dGVybiBpbnQgbGFwaWNfZ2V0X21heGx2dCh2b2lkKTsKIGV4dGVybiB2b2lkIGNsZWFyX2xvY2FsX0FQSUModm9pZCk7CiBleHRlcm4gdm9pZCBjb25uZWN0X2JzcF9BUElDKHZvaWQpOwpAQCAtMjUyLDcgKzI0NCw3IEBACiAjZGVmaW5lIGxvY2FsX2FwaWNfdGltZXJfYzJfb2sJCTEKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2FwaWNfbWFwcGluZ3Modm9pZCkgeyB9CiBzdGF0aWMgaW5saW5lIHZvaWQgZGlzYWJsZV9sb2NhbF9BUElDKHZvaWQpIHsgfQotCitzdGF0aWMgaW5saW5lIHZvaWQgYXBpY19kaXNhYmxlKHZvaWQpIHsgfQogI2VuZGlmIC8qICFDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KIAogI2lmZGVmIENPTkZJR19YODZfNjQKQEAgLTQxMCw3ICs0MDIsNyBAQAogewogCXVuc2lnbmVkIGludCB2ZXIgPSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOwogCi0JaWYgKEFQSUNfWEFQSUModmVyKSkKKwlpZiAoQVBJQ19YQVBJQyh2ZXIpIHx8IGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9FWFREX0FQSUNJRCkpCiAJCXJldHVybiAoeCA+PiAyNCkgJiAweEZGOwogCWVsc2UKIAkJcmV0dXJuICh4ID4+IDI0KSAmIDB4MEY7CkBAIC00NzgsNiArNDcwLDkgQEAKIGV4dGVybiB2b2lkIGRlZmF1bHRfc2V0dXBfYXBpY19yb3V0aW5nKHZvaWQpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgorCitleHRlcm4gc3RydWN0IGFwaWMgYXBpY19kZWZhdWx0OworCiAvKgogICogU2V0IHVwIHRoZSBsb2dpY2FsIGRlc3RpbmF0aW9uIElELgogICoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWNkZWYuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2FwaWNkZWYuaAppbmRleCBiYzk1MTRmLi43ZGRiMzZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9hcGljZGVmLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXBpY2RlZi5oCkBAIC0yMiw2ICsyMiw3IEBACiAjICBkZWZpbmUJQVBJQ19JTlRFR1JBVEVEKHgpCSgxKQogI2VuZGlmCiAjZGVmaW5lCQlBUElDX1hBUElDKHgpCQkoKHgpID49IDB4MTQpCisjZGVmaW5lCQlBUElDX0VYVF9TUEFDRSh4KQkoKHgpICYgMHg4MDAwMDAwMCkKICNkZWZpbmUJQVBJQ19UQVNLUFJJCTB4ODAKICNkZWZpbmUJCUFQSUNfVFBSSV9NQVNLCQkweEZGdQogI2RlZmluZQlBUElDX0FSQlBSSQkweDkwCkBAIC0xMTYsNyArMTE3LDkgQEAKICNkZWZpbmUJCUFQSUNfVERSX0RJVl8zMgkJMHg4CiAjZGVmaW5lCQlBUElDX1REUl9ESVZfNjQJCTB4OQogI2RlZmluZQkJQVBJQ19URFJfRElWXzEyOAkweEEKLSNkZWZpbmUJQVBJQ19FSUxWVDAgICAgIDB4NTAwCisjZGVmaW5lCUFQSUNfRUZFQVQJMHg0MDAKKyNkZWZpbmUJQVBJQ19FQ1RSTAkweDQxMAorI2RlZmluZSBBUElDX0VJTFZUbihuKQkoMHg1MDAgKyAweDEwICogbikKICNkZWZpbmUJCUFQSUNfRUlMVlRfTlJfQU1EX0s4CTEJLyogIyBvZiBleHRlbmRlZCBpbnRlcnJ1cHRzICovCiAjZGVmaW5lCQlBUElDX0VJTFZUX05SX0FNRF8xMEgJNAogI2RlZmluZQkJQVBJQ19FSUxWVF9MVlRPRkYoeCkJKCgoeCkgPj4gNCkgJiAweEYpCkBAIC0xMjUsOSArMTI4LDYgQEAKICNkZWZpbmUJCUFQSUNfRUlMVlRfTVNHX05NSQkweDQKICNkZWZpbmUJCUFQSUNfRUlMVlRfTVNHX0VYVAkweDcKICNkZWZpbmUJCUFQSUNfRUlMVlRfTUFTS0VECSgxIDw8IDE2KQotI2RlZmluZQlBUElDX0VJTFZUMSAgICAgMHg1MTAKLSNkZWZpbmUJQVBJQ19FSUxWVDIgICAgIDB4NTIwCi0jZGVmaW5lCUFQSUNfRUlMVlQzICAgICAweDUzMAogCiAjZGVmaW5lIEFQSUNfQkFTRSAoZml4X3RvX3ZpcnQoRklYX0FQSUNfQkFTRSkpCiAjZGVmaW5lIEFQSUNfQkFTRV9NU1IJMHg4MDAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2F0b21pY18zMi5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKaW5kZXggODViNDZmYi4uYWZmOWYxZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYXRvbWljXzMyLmgKQEAgLTI0Nyw1ICsyNDcsMjQxIEBACiAjZGVmaW5lIHNtcF9tYl9fYmVmb3JlX2F0b21pY19pbmMoKQliYXJyaWVyKCkKICNkZWZpbmUgc21wX21iX19hZnRlcl9hdG9taWNfaW5jKCkJYmFycmllcigpCiAKKy8qIEFuIDY0Yml0IGF0b21pYyB0eXBlICovCisKK3R5cGVkZWYgc3RydWN0IHsKKwl1bnNpZ25lZCBsb25nIGxvbmcgY291bnRlcjsKK30gYXRvbWljNjRfdDsKKworI2RlZmluZSBBVE9NSUM2NF9JTklUKHZhbCkJeyAodmFsKSB9CisKKy8qKgorICogYXRvbWljNjRfcmVhZCAtIHJlYWQgYXRvbWljNjQgdmFyaWFibGUKKyAqIEB2OiBwb2ludGVyIG9mIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIEF0b21pY2FsbHkgcmVhZHMgdGhlIHZhbHVlIG9mIEB2LgorICogRG9lc24ndCBpbXBseSBhIHJlYWQgbWVtb3J5IGJhcnJpZXIuCisgKi8KKyNkZWZpbmUgX19hdG9taWM2NF9yZWFkKHB0cikJCSgocHRyKS0+Y291bnRlcikKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK2NtcHhjaGc4Yih1bnNpZ25lZCBsb25nIGxvbmcgKnB0ciwgdW5zaWduZWQgbG9uZyBsb25nIG9sZCwgdW5zaWduZWQgbG9uZyBsb25nIG5ldykKK3sKKwlhc20gdm9sYXRpbGUoCisKKwkJTE9DS19QUkVGSVggImNtcHhjaGc4YiAoJVtwdHJdKVxuIgorCisJCSAgICAgOgkJIj1BIiAob2xkKQorCisJCSAgICAgOiBbcHRyXQkiRCIgKHB0ciksCisJCQkJIkEiIChvbGQpLAorCQkJCSJiIiAobGxfbG93KG5ldykpLAorCQkJCSJjIiAobGxfaGlnaChuZXcpKQorCisJCSAgICAgOiAibWVtb3J5Iik7CisKKwlyZXR1cm4gb2xkOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworYXRvbWljNjRfY21weGNoZyhhdG9taWM2NF90ICpwdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBvbGRfdmFsLAorCQkgdW5zaWduZWQgbG9uZyBsb25nIG5ld192YWwpCit7CisJcmV0dXJuIGNtcHhjaGc4YigmcHRyLT5jb3VudGVyLCBvbGRfdmFsLCBuZXdfdmFsKTsKK30KKworLyoqCisgKiBhdG9taWM2NF94Y2hnIC0geGNoZyBhdG9taWM2NCB2YXJpYWJsZQorICogQHB0cjogICAgICBwb2ludGVyIHRvIHR5cGUgYXRvbWljNjRfdAorICogQG5ld192YWw6ICB2YWx1ZSB0byBhc3NpZ24KKyAqIEBvbGRfdmFsOiAgb2xkIHZhbHVlIHRoYXQgd2FzIHRoZXJlCisgKgorICogQXRvbWljYWxseSB4Y2hncyB0aGUgdmFsdWUgb2YgQHB0ciB0byBAbmV3X3ZhbCBhbmQgcmV0dXJucworICogdGhlIG9sZCB2YWx1ZS4KKyAqLworCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZworYXRvbWljNjRfeGNoZyhhdG9taWM2NF90ICpwdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyBuZXdfdmFsKQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyBvbGRfdmFsOworCisJZG8geworCQlvbGRfdmFsID0gYXRvbWljX3JlYWQocHRyKTsKKwl9IHdoaWxlIChhdG9taWM2NF9jbXB4Y2hnKHB0ciwgb2xkX3ZhbCwgbmV3X3ZhbCkgIT0gb2xkX3ZhbCk7CisKKwlyZXR1cm4gb2xkX3ZhbDsKK30KKworLyoqCisgKiBhdG9taWM2NF9zZXQgLSBzZXQgYXRvbWljNjQgdmFyaWFibGUKKyAqIEBwdHI6ICAgICAgcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqIEBuZXdfdmFsOiAgdmFsdWUgdG8gYXNzaWduCisgKgorICogQXRvbWljYWxseSBzZXRzIHRoZSB2YWx1ZSBvZiBAcHRyIHRvIEBuZXdfdmFsLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfc2V0KGF0b21pYzY0X3QgKnB0ciwgdW5zaWduZWQgbG9uZyBsb25nIG5ld192YWwpCit7CisJYXRvbWljNjRfeGNoZyhwdHIsIG5ld192YWwpOworfQorCisvKioKKyAqIGF0b21pYzY0X3JlYWQgLSByZWFkIGF0b21pYzY0IHZhcmlhYmxlCisgKiBAcHRyOiAgICAgIHBvaW50ZXIgdG8gdHlwZSBhdG9taWM2NF90CisgKgorICogQXRvbWljYWxseSByZWFkcyB0aGUgdmFsdWUgb2YgQHB0ciBhbmQgcmV0dXJucyBpdC4KKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgYXRvbWljNjRfcmVhZChhdG9taWM2NF90ICpwdHIpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIGN1cnJfdmFsOworCisJZG8geworCQljdXJyX3ZhbCA9IF9fYXRvbWljNjRfcmVhZChwdHIpOworCX0gd2hpbGUgKGF0b21pYzY0X2NtcHhjaGcocHRyLCBjdXJyX3ZhbCwgY3Vycl92YWwpICE9IGN1cnJfdmFsKTsKKworCXJldHVybiBjdXJyX3ZhbDsKK30KKworLyoqCisgKiBhdG9taWM2NF9hZGRfcmV0dXJuIC0gYWRkIGFuZCByZXR1cm4KKyAqIEBkZWx0YTogaW50ZWdlciB2YWx1ZSB0byBhZGQKKyAqIEBwdHI6ICAgcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqCisgKiBBdG9taWNhbGx5IGFkZHMgQGRlbHRhIHRvIEBwdHIgYW5kIHJldHVybnMgQGRlbHRhICsgKkBwdHIKKyAqLworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcKK2F0b21pYzY0X2FkZF9yZXR1cm4odW5zaWduZWQgbG9uZyBsb25nIGRlbHRhLCBhdG9taWM2NF90ICpwdHIpCit7CisJdW5zaWduZWQgbG9uZyBsb25nIG9sZF92YWwsIG5ld192YWw7CisKKwlkbyB7CisJCW9sZF92YWwgPSBhdG9taWNfcmVhZChwdHIpOworCQluZXdfdmFsID0gb2xkX3ZhbCArIGRlbHRhOworCisJfSB3aGlsZSAoYXRvbWljNjRfY21weGNoZyhwdHIsIG9sZF92YWwsIG5ld192YWwpICE9IG9sZF92YWwpOworCisJcmV0dXJuIG5ld192YWw7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBhdG9taWM2NF9zdWJfcmV0dXJuKHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSwgYXRvbWljNjRfdCAqcHRyKQoreworCXJldHVybiBhdG9taWM2NF9hZGRfcmV0dXJuKC1kZWx0YSwgcHRyKTsKK30KKworc3RhdGljIGlubGluZSBsb25nIGF0b21pYzY0X2luY19yZXR1cm4oYXRvbWljNjRfdCAqcHRyKQoreworCXJldHVybiBhdG9taWM2NF9hZGRfcmV0dXJuKDEsIHB0cik7Cit9CisKK3N0YXRpYyBpbmxpbmUgbG9uZyBhdG9taWM2NF9kZWNfcmV0dXJuKGF0b21pYzY0X3QgKnB0cikKK3sKKwlyZXR1cm4gYXRvbWljNjRfc3ViX3JldHVybigxLCBwdHIpOworfQorCisvKioKKyAqIGF0b21pYzY0X2FkZCAtIGFkZCBpbnRlZ2VyIHRvIGF0b21pYzY0IHZhcmlhYmxlCisgKiBAZGVsdGE6IGludGVnZXIgdmFsdWUgdG8gYWRkCisgKiBAcHRyOiAgIHBvaW50ZXIgdG8gdHlwZSBhdG9taWM2NF90CisgKgorICogQXRvbWljYWxseSBhZGRzIEBkZWx0YSB0byBAcHRyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfYWRkKHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSwgYXRvbWljNjRfdCAqcHRyKQoreworCWF0b21pYzY0X2FkZF9yZXR1cm4oZGVsdGEsIHB0cik7Cit9CisKKy8qKgorICogYXRvbWljNjRfc3ViIC0gc3VidHJhY3QgdGhlIGF0b21pYzY0IHZhcmlhYmxlCisgKiBAZGVsdGE6IGludGVnZXIgdmFsdWUgdG8gc3VidHJhY3QKKyAqIEBwdHI6ICAgcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqCisgKiBBdG9taWNhbGx5IHN1YnRyYWN0cyBAZGVsdGEgZnJvbSBAcHRyLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfc3ViKHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSwgYXRvbWljNjRfdCAqcHRyKQoreworCWF0b21pYzY0X2FkZCgtZGVsdGEsIHB0cik7Cit9CisKKy8qKgorICogYXRvbWljNjRfc3ViX2FuZF90ZXN0IC0gc3VidHJhY3QgdmFsdWUgZnJvbSB2YXJpYWJsZSBhbmQgdGVzdCByZXN1bHQKKyAqIEBkZWx0YTogaW50ZWdlciB2YWx1ZSB0byBzdWJ0cmFjdAorICogQHB0cjogICBwb2ludGVyIHRvIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIEF0b21pY2FsbHkgc3VidHJhY3RzIEBkZWx0YSBmcm9tIEBwdHIgYW5kIHJldHVybnMKKyAqIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCisgKiBvdGhlciBjYXNlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2F0b21pYzY0X3N1Yl9hbmRfdGVzdCh1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEsIGF0b21pYzY0X3QgKnB0cikKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgb2xkX3ZhbCA9IGF0b21pYzY0X3N1Yl9yZXR1cm4oZGVsdGEsIHB0cik7CisKKwlyZXR1cm4gb2xkX3ZhbCA9PSAwOworfQorCisvKioKKyAqIGF0b21pYzY0X2luYyAtIGluY3JlbWVudCBhdG9taWM2NCB2YXJpYWJsZQorICogQHB0cjogcG9pbnRlciB0byB0eXBlIGF0b21pYzY0X3QKKyAqCisgKiBBdG9taWNhbGx5IGluY3JlbWVudHMgQHB0ciBieSAxLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgYXRvbWljNjRfaW5jKGF0b21pYzY0X3QgKnB0cikKK3sKKwlhdG9taWM2NF9hZGQoMSwgcHRyKTsKK30KKworLyoqCisgKiBhdG9taWM2NF9kZWMgLSBkZWNyZW1lbnQgYXRvbWljNjQgdmFyaWFibGUKKyAqIEBwdHI6IHBvaW50ZXIgdG8gdHlwZSBhdG9taWM2NF90CisgKgorICogQXRvbWljYWxseSBkZWNyZW1lbnRzIEBwdHIgYnkgMS4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGF0b21pYzY0X2RlYyhhdG9taWM2NF90ICpwdHIpCit7CisJYXRvbWljNjRfc3ViKDEsIHB0cik7Cit9CisKKy8qKgorICogYXRvbWljNjRfZGVjX2FuZF90ZXN0IC0gZGVjcmVtZW50IGFuZCB0ZXN0CisgKiBAcHRyOiBwb2ludGVyIHRvIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIEF0b21pY2FsbHkgZGVjcmVtZW50cyBAcHRyIGJ5IDEgYW5kCisgKiByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyAwLCBvciBmYWxzZSBmb3IgYWxsIG90aGVyCisgKiBjYXNlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXRvbWljNjRfZGVjX2FuZF90ZXN0KGF0b21pYzY0X3QgKnB0cikKK3sKKwlyZXR1cm4gYXRvbWljNjRfc3ViX2FuZF90ZXN0KDEsIHB0cik7Cit9CisKKy8qKgorICogYXRvbWljNjRfaW5jX2FuZF90ZXN0IC0gaW5jcmVtZW50IGFuZCB0ZXN0CisgKiBAcHRyOiBwb2ludGVyIHRvIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIEF0b21pY2FsbHkgaW5jcmVtZW50cyBAcHRyIGJ5IDEKKyAqIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyB6ZXJvLCBvciBmYWxzZSBmb3IgYWxsCisgKiBvdGhlciBjYXNlcy4KKyAqLworc3RhdGljIGlubGluZSBpbnQgYXRvbWljNjRfaW5jX2FuZF90ZXN0KGF0b21pYzY0X3QgKnB0cikKK3sKKwlyZXR1cm4gYXRvbWljNjRfc3ViX2FuZF90ZXN0KC0xLCBwdHIpOworfQorCisvKioKKyAqIGF0b21pYzY0X2FkZF9uZWdhdGl2ZSAtIGFkZCBhbmQgdGVzdCBpZiBuZWdhdGl2ZQorICogQGRlbHRhOiBpbnRlZ2VyIHZhbHVlIHRvIGFkZAorICogQHB0cjogICBwb2ludGVyIHRvIHR5cGUgYXRvbWljNjRfdAorICoKKyAqIEF0b21pY2FsbHkgYWRkcyBAZGVsdGEgdG8gQHB0ciBhbmQgcmV0dXJucyB0cnVlCisgKiBpZiB0aGUgcmVzdWx0IGlzIG5lZ2F0aXZlLCBvciBmYWxzZSB3aGVuCisgKiByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHplcm8uCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50CithdG9taWM2NF9hZGRfbmVnYXRpdmUodW5zaWduZWQgbG9uZyBsb25nIGRlbHRhLCBhdG9taWM2NF90ICpwdHIpCit7CisJbG9uZyBsb25nIG9sZF92YWwgPSBhdG9taWM2NF9hZGRfcmV0dXJuKGRlbHRhLCBwdHIpOworCisJcmV0dXJuIG9sZF92YWwgPCAwOworfQorCiAjaW5jbHVkZSA8YXNtLWdlbmVyaWMvYXRvbWljLmg+CiAjZW5kaWYgLyogX0FTTV9YODZfQVRPTUlDXzMyX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Jvb3QuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2Jvb3QuaAppbmRleCA2YmEyM2RkLi40MThlNjMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdC5oCkBAIC04LDExICs4LDI2IEBACiAKICNpZmRlZiBfX0tFUk5FTF9fCiAKKyNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgorCiAvKiBQaHlzaWNhbCBhZGRyZXNzIHdoZXJlIGtlcm5lbCBzaG91bGQgYmUgbG9hZGVkLiAqLwogI2RlZmluZSBMT0FEX1BIWVNJQ0FMX0FERFIgKChDT05GSUdfUEhZU0lDQUxfU1RBUlQgXAogCQkJCSsgKENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKSBcCiAJCQkJJiB+KENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKQogCisvKiBNaW5pbXVtIGtlcm5lbCBhbGlnbm1lbnQsIGFzIGEgcG93ZXIgb2YgdHdvICovCisjaWZkZWYgQ09ORklHX3g4Nl82NAorI2RlZmluZSBNSU5fS0VSTkVMX0FMSUdOX0xHMglQTURfU0hJRlQKKyNlbHNlCisjZGVmaW5lIE1JTl9LRVJORUxfQUxJR05fTEcyCShQQUdFX1NISUZUKzEpCisjZW5kaWYKKyNkZWZpbmUgTUlOX0tFUk5FTF9BTElHTgkoX0FDKDEsIFVMKSA8PCBNSU5fS0VSTkVMX0FMSUdOX0xHMikKKworI2lmIChDT05GSUdfUEhZU0lDQUxfQUxJR04gJiAoQ09ORklHX1BIWVNJQ0FMX0FMSUdOLTEpKSB8fCBcCisJKENPTkZJR19QSFlTSUNBTF9BTElHTiA8IChfQUMoMSwgVUwpIDw8IE1JTl9LRVJORUxfQUxJR05fTEcyKSkKKyNlcnJvciAiSW52YWxpZCB2YWx1ZSBmb3IgQ09ORklHX1BIWVNJQ0FMX0FMSUdOIgorI2VuZGlmCisKICNpZmRlZiBDT05GSUdfS0VSTkVMX0JaSVAyCiAjZGVmaW5lIEJPT1RfSEVBUF9TSVpFICAgICAgICAgICAgIDB4NDAwMDAwCiAjZWxzZSAvKiAhQ09ORklHX0tFUk5FTF9CWklQMiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vYm9vdHBhcmFtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290cGFyYW0uaAppbmRleCA0MzNhZGFlLi4xNzI0ZThkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290cGFyYW0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9ib290cGFyYW0uaApAQCAtNTAsNyArNTAsOCBAQAogCV9fdTMyCXJhbWRpc2tfc2l6ZTsKIAlfX3UzMglib290c2VjdF9rbHVkZ2U7CiAJX191MTYJaGVhcF9lbmRfcHRyOwotCV9fdTE2CV9wYWQxOworCV9fdTgJZXh0X2xvYWRlcl92ZXI7CisJX191OAlleHRfbG9hZGVyX3R5cGU7CiAJX191MzIJY21kX2xpbmVfcHRyOwogCV9fdTMyCWluaXRyZF9hZGRyX21heDsKIAlfX3UzMglrZXJuZWxfYWxpZ25tZW50OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1X2RlYnVnLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVfZGVidWcuaAppbmRleCAyMjI4MDIwLi5kOTZjMWVlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVfZGVidWcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVfZGVidWcuaApAQCAtODYsMTA1ICs4Niw3IEBACiAJQ1BVX1ZBTFVFX0JJVCwJCQkJLyogdmFsdWUJCSovCiB9OwogCi0jZGVmaW5lCUNQVV9GSUxFX1ZBTFVFCQkJKDEgPDwgQ1BVX1ZBTFVFX0JJVCkKLQotLyoKLSAqIERpc3BsYXlGYW1pbHlfRGlzcGxheU1vZGVsCVByb2Nlc3NvciBGYW1pbGllcy9Qcm9jZXNzb3IgTnVtYmVyIFNlcmllcwotICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0JLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKiAwNV8wMSwgMDVfMDIsIDA1XzA0CQlQZW50aXVtLCBQZW50aXVtIHdpdGggTU1YCi0gKgotICogMDZfMDEJCQlQZW50aXVtIFBybwotICogMDZfMDMsIDA2XzA1CQkJUGVudGl1bSBJSSBYZW9uLCBQZW50aXVtIElJCi0gKiAwNl8wNywgMDZfMDgsIDA2XzBBLCAwNl8wQglQZW50aXVtIElJSSBYZW9uLCBQZW50dW0gSUlJCi0gKgotICogMDZfMDksIDA2MEQJCQlQZW50aXVtIE0KLSAqCi0gKiAwNl8wRQkJCUNvcmUgRHVvLCBDb3JlIFNvbG8KLSAqCi0gKiAwNl8wRgkJCVhlb24gMzAwMCwgMzIwMCwgNTEwMCwgNTMwMCwgNzMwMCBzZXJpZXMsCi0gKgkJCQlDb3JlIDIgUXVhZCwgQ29yZSAyIEV4dHJlbWUsIENvcmUgMiBEdW8sCi0gKgkJCQlQZW50aXVtIGR1YWwtY29yZQotICogMDZfMTcJCQlYZW9uIDUyMDAsIDU0MDAgc2VyaWVzLCBDb3JlIDIgUXVhZCBROTY1MAotICoKLSAqIDA2XzFDCQkJQXRvbQotICoKLSAqIDBGXzAwLCAwRl8wMSwgMEZfMDIJCVhlb24sIFhlb24gTVAsIFBlbnRpdW0gNAotICogMEZfMDMsIDBGXzA0CQkJWGVvbiwgWGVvbiBNUCwgUGVudGl1bSA0LCBQZW50aXVtIEQKLSAqCi0gKiAwRl8wNgkJCVhlb24gNzEwMCwgNTAwMCBTZXJpZXMsIFhlb24gTVAsCi0gKgkJCQlQZW50aXVtIDQsIFBlbnRpdW0gRAotICovCi0KLS8qIFJlZ2lzdGVyIHByb2Nlc3NvcnMgYml0cyAqLwotZW51bSBjcHVfcHJvY2Vzc29yX2JpdCB7Ci0JQ1BVX05PTkUsCi0vKiBJbnRlbCAqLwotCUNQVV9JTlRFTF9QRU5USVVNX0JJVCwKLQlDUFVfSU5URUxfUDZfQklULAotCUNQVV9JTlRFTF9QRU5USVVNX01fQklULAotCUNQVV9JTlRFTF9DT1JFX0JJVCwKLQlDUFVfSU5URUxfQ09SRTJfQklULAotCUNQVV9JTlRFTF9BVE9NX0JJVCwKLQlDUFVfSU5URUxfWEVPTl9QNF9CSVQsCi0JQ1BVX0lOVEVMX1hFT05fTVBfQklULAotLyogQU1EICovCi0JQ1BVX0FNRF9LNl9CSVQsCi0JQ1BVX0FNRF9LN19CSVQsCi0JQ1BVX0FNRF9LOF9CSVQsCi0JQ1BVX0FNRF8wRl9CSVQsCi0JQ1BVX0FNRF8xMF9CSVQsCi0JQ1BVX0FNRF8xMV9CSVQsCi19OwotCi0jZGVmaW5lCUNQVV9JTlRFTF9QRU5USVVNCSgxIDw8IENQVV9JTlRFTF9QRU5USVVNX0JJVCkKLSNkZWZpbmUJQ1BVX0lOVEVMX1A2CQkoMSA8PCBDUFVfSU5URUxfUDZfQklUKQotI2RlZmluZQlDUFVfSU5URUxfUEVOVElVTV9NCSgxIDw8IENQVV9JTlRFTF9QRU5USVVNX01fQklUKQotI2RlZmluZQlDUFVfSU5URUxfQ09SRQkJKDEgPDwgQ1BVX0lOVEVMX0NPUkVfQklUKQotI2RlZmluZQlDUFVfSU5URUxfQ09SRTIJCSgxIDw8IENQVV9JTlRFTF9DT1JFMl9CSVQpCi0jZGVmaW5lCUNQVV9JTlRFTF9BVE9NCQkoMSA8PCBDUFVfSU5URUxfQVRPTV9CSVQpCi0jZGVmaW5lCUNQVV9JTlRFTF9YRU9OX1A0CSgxIDw8IENQVV9JTlRFTF9YRU9OX1A0X0JJVCkKLSNkZWZpbmUJQ1BVX0lOVEVMX1hFT05fTVAJKDEgPDwgQ1BVX0lOVEVMX1hFT05fTVBfQklUKQotCi0jZGVmaW5lCUNQVV9JTlRFTF9QWAkJKENQVV9JTlRFTF9QNiB8IENQVV9JTlRFTF9QRU5USVVNX00pCi0jZGVmaW5lCUNQVV9JTlRFTF9DT1JFWAkJKENQVV9JTlRFTF9DT1JFIHwgQ1BVX0lOVEVMX0NPUkUyKQotI2RlZmluZQlDUFVfSU5URUxfWEVPTgkJKENQVV9JTlRFTF9YRU9OX1A0IHwgQ1BVX0lOVEVMX1hFT05fTVApCi0jZGVmaW5lCUNQVV9DT19BVAkJKENQVV9JTlRFTF9DT1JFIHwgQ1BVX0lOVEVMX0FUT00pCi0jZGVmaW5lCUNQVV9DMl9BVAkJKENQVV9JTlRFTF9DT1JFMiB8IENQVV9JTlRFTF9BVE9NKQotI2RlZmluZQlDUFVfQ1hfQVQJCShDUFVfSU5URUxfQ09SRVggfCBDUFVfSU5URUxfQVRPTSkKLSNkZWZpbmUJQ1BVX0NYX1hFCQkoQ1BVX0lOVEVMX0NPUkVYIHwgQ1BVX0lOVEVMX1hFT04pCi0jZGVmaW5lCUNQVV9QNl9YRQkJKENQVV9JTlRFTF9QNiB8IENQVV9JTlRFTF9YRU9OKQotI2RlZmluZQlDUFVfUE1fQ09fQVQJCShDUFVfSU5URUxfUEVOVElVTV9NIHwgQ1BVX0NPX0FUKQotI2RlZmluZQlDUFVfQzJfQVRfWEUJCShDUFVfQzJfQVQgfCBDUFVfSU5URUxfWEVPTikKLSNkZWZpbmUJQ1BVX0NYX0FUX1hFCQkoQ1BVX0NYX0FUIHwgQ1BVX0lOVEVMX1hFT04pCi0jZGVmaW5lCUNQVV9QNl9DWF9BVAkJKENQVV9JTlRFTF9QNiB8IENQVV9DWF9BVCkKLSNkZWZpbmUJQ1BVX1A2X0NYX1hFCQkoQ1BVX1A2X1hFIHwgQ1BVX0lOVEVMX0NPUkVYKQotI2RlZmluZQlDUFVfUDZfQ1hfQVRfWEUJCShDUFVfSU5URUxfUDYgfCBDUFVfQ1hfQVRfWEUpCi0jZGVmaW5lCUNQVV9QTV9DWF9BVF9YRQkJKENQVV9JTlRFTF9QRU5USVVNX00gfCBDUFVfQ1hfQVRfWEUpCi0jZGVmaW5lCUNQVV9QTV9DWF9BVAkJKENQVV9JTlRFTF9QRU5USVVNX00gfCBDUFVfQ1hfQVQpCi0jZGVmaW5lCUNQVV9QTV9DWF9YRQkJKENQVV9JTlRFTF9QRU5USVVNX00gfCBDUFVfQ1hfWEUpCi0jZGVmaW5lCUNQVV9QWF9DWF9BVAkJKENQVV9JTlRFTF9QWCB8IENQVV9DWF9BVCkKLSNkZWZpbmUJQ1BVX1BYX0NYX0FUX1hFCQkoQ1BVX0lOVEVMX1BYIHwgQ1BVX0NYX0FUX1hFKQotCi0vKiBTZWxlY3QgYWxsIHN1cHBvcnRlZCBJbnRlbCBDUFVzICovCi0jZGVmaW5lCUNQVV9JTlRFTF9BTEwJCShDUFVfSU5URUxfUEVOVElVTSB8IENQVV9QWF9DWF9BVF9YRSkKLQotI2RlZmluZQlDUFVfQU1EX0s2CQkoMSA8PCBDUFVfQU1EX0s2X0JJVCkKLSNkZWZpbmUJQ1BVX0FNRF9LNwkJKDEgPDwgQ1BVX0FNRF9LN19CSVQpCi0jZGVmaW5lCUNQVV9BTURfSzgJCSgxIDw8IENQVV9BTURfSzhfQklUKQotI2RlZmluZQlDUFVfQU1EXzBGCQkoMSA8PCBDUFVfQU1EXzBGX0JJVCkKLSNkZWZpbmUJQ1BVX0FNRF8xMAkJKDEgPDwgQ1BVX0FNRF8xMF9CSVQpCi0jZGVmaW5lCUNQVV9BTURfMTEJCSgxIDw8IENQVV9BTURfMTFfQklUKQotCi0jZGVmaW5lCUNQVV9LMTBfUExVUwkJKENQVV9BTURfMTAgfCBDUFVfQU1EXzExKQotI2RlZmluZQlDUFVfSzBGX1BMVVMJCShDUFVfQU1EXzBGIHwgQ1BVX0sxMF9QTFVTKQotI2RlZmluZQlDUFVfSzhfUExVUwkJKENQVV9BTURfSzggfCBDUFVfSzBGX1BMVVMpCi0jZGVmaW5lCUNQVV9LN19QTFVTCQkoQ1BVX0FNRF9LNyB8IENQVV9LOF9QTFVTKQotCi0vKiBTZWxlY3QgYWxsIHN1cHBvcnRlZCBBTUQgQ1BVcyAqLwotI2RlZmluZQlDUFVfQU1EX0FMTAkJKENQVV9BTURfSzYgfCBDUFVfSzdfUExVUykKLQotLyogU2VsZWN0IGFsbCBzdXBwb3J0ZWQgQ1BVcyAqLwotI2RlZmluZQlDUFVfQUxMCQkJKENQVV9JTlRFTF9BTEwgfCBDUFVfQU1EX0FMTCkKKyNkZWZpbmUJQ1BVX0ZJTEVfVkFMVUUJCSgxIDw8IENQVV9WQUxVRV9CSVQpCiAKICNkZWZpbmUgTUFYX0NQVV9GSUxFUwkJNTEyCiAKQEAgLTIyMCw3ICsxMjIsNiBAQAogCXVuc2lnbmVkCQltaW47CQkvKiBSZWdpc3RlciByYW5nZSBtaW4JKi8KIAl1bnNpZ25lZAkJbWF4OwkJLyogUmVnaXN0ZXIgcmFuZ2UgbWF4CSovCiAJdW5zaWduZWQJCWZsYWc7CQkvKiBTdXBwb3J0ZWQgZmxhZ3MJKi8KLQl1bnNpZ25lZAkJbW9kZWw7CQkvKiBTdXBwb3J0ZWQgbW9kZWxzCSovCiB9OwogCiAjZW5kaWYgLyogX0FTTV9YODZfQ1BVX0RFQlVHX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2NwdWZlYXR1cmUuaAppbmRleCBiYjgzYjFjLi4xOWFmNDIxIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9jcHVmZWF0dXJlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vY3B1ZmVhdHVyZS5oCkBAIC0yMiw3ICsyMiw3IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1RTQwkJKDAqMzIrIDQpIC8qIFRpbWUgU3RhbXAgQ291bnRlciAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9NU1IJCSgwKjMyKyA1KSAvKiBNb2RlbC1TcGVjaWZpYyBSZWdpc3RlcnMgKi8KICNkZWZpbmUgWDg2X0ZFQVRVUkVfUEFFCQkoMCozMisgNikgLyogUGh5c2ljYWwgQWRkcmVzcyBFeHRlbnNpb25zICovCi0jZGVmaW5lIFg4Nl9GRUFUVVJFX01DRQkJKDAqMzIrIDcpIC8qIE1hY2hpbmUgQ2hlY2sgQXJjaGl0ZWN0dXJlICovCisjZGVmaW5lIFg4Nl9GRUFUVVJFX01DRQkJKDAqMzIrIDcpIC8qIE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0NYOAkJKDAqMzIrIDgpIC8qIENNUFhDSEc4IGluc3RydWN0aW9uICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX0FQSUMJKDAqMzIrIDkpIC8qIE9uYm9hcmQgQVBJQyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9TRVAJCSgwKjMyKzExKSAvKiBTWVNFTlRFUi9TWVNFWElUICovCkBAIC05NCw2ICs5NCw3IEBACiAjZGVmaW5lIFg4Nl9GRUFUVVJFX1RTQ19SRUxJQUJMRSAoMyozMisyMykgLyogVFNDIGlzIGtub3duIHRvIGJlIHJlbGlhYmxlICovCiAjZGVmaW5lIFg4Nl9GRUFUVVJFX05PTlNUT1BfVFNDCSgzKjMyKzI0KSAvKiBUU0MgZG9lcyBub3Qgc3RvcCBpbiBDIHN0YXRlcyAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9DTEZMVVNIX01PTklUT1IgKDMqMzIrMjUpIC8qICIiIGNsZmx1c2ggcmVxZCB3aXRoIG1vbml0b3IgKi8KKyNkZWZpbmUgWDg2X0ZFQVRVUkVfRVhURF9BUElDSUQJKDMqMzIrMjYpIC8qIGhhcyBleHRlbmRlZCBBUElDSUQgKDggYml0cykgKi8KIAogLyogSW50ZWwtZGVmaW5lZCBDUFUgZmVhdHVyZXMsIENQVUlEIGxldmVsIDB4MDAwMDAwMDEgKGVjeCksIHdvcmQgNCAqLwogI2RlZmluZSBYODZfRkVBVFVSRV9YTU0zCSg0KjMyKyAwKSAvKiAicG5pIiBTU0UtMyAqLwpAQCAtMTkyLDExICsxOTMsMTEgQEAKICNkZWZpbmUgY2xlYXJfY3B1X2NhcChjLCBiaXQpCWNsZWFyX2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopKChjKS0+eDg2X2NhcGFiaWxpdHkpKQogI2RlZmluZSBzZXR1cF9jbGVhcl9jcHVfY2FwKGJpdCkgZG8geyBcCiAJY2xlYXJfY3B1X2NhcCgmYm9vdF9jcHVfZGF0YSwgYml0KTsJXAotCXNldF9iaXQoYml0LCAodW5zaWduZWQgbG9uZyAqKWNsZWFyZWRfY3B1X2NhcHMpOyBcCisJc2V0X2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopY3B1X2NhcHNfY2xlYXJlZCk7IFwKIH0gd2hpbGUgKDApCiAjZGVmaW5lIHNldHVwX2ZvcmNlX2NwdV9jYXAoYml0KSBkbyB7IFwKIAlzZXRfY3B1X2NhcCgmYm9vdF9jcHVfZGF0YSwgYml0KTsJXAotCWNsZWFyX2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopY2xlYXJlZF9jcHVfY2Fwcyk7CVwKKwlzZXRfYml0KGJpdCwgKHVuc2lnbmVkIGxvbmcgKiljcHVfY2Fwc19zZXQpOwlcCiB9IHdoaWxlICgwKQogCiAjZGVmaW5lIGNwdV9oYXNfZnB1CQlib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfRlBVKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZHMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2RzLmgKaW5kZXggYThmNjcyYi4uNzBkYWMxOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZHMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9kcy5oCkBAIC0xNSw4ICsxNSw4IEBACiAgKiAtIGJ1ZmZlciBhbGxvY2F0aW9uIChtZW1vcnkgYWNjb3VudGluZykKICAqCiAgKgotICogQ29weXJpZ2h0IChDKSAyMDA3LTIwMDggSW50ZWwgQ29ycG9yYXRpb24uCi0gKiBNYXJrdXMgTWV0emdlciA8bWFya3VzLnQubWV0emdlckBpbnRlbC5jb20+LCAyMDA3LTIwMDgKKyAqIENvcHlyaWdodCAoQykgMjAwNy0yMDA5IEludGVsIENvcnBvcmF0aW9uLgorICogTWFya3VzIE1ldHpnZXIgPG1hcmt1cy50Lm1ldHpnZXJAaW50ZWwuY29tPiwgMjAwNy0yMDA5CiAgKi8KIAogI2lmbmRlZiBfQVNNX1g4Nl9EU19ICkBAIC04Myw4ICs4MywxMCBAQAogICogVGhlIGludGVycnVwdCB0aHJlc2hvbGQgaXMgaW5kZXBlbmRlbnQgZnJvbSB0aGUgb3ZlcmZsb3cgY2FsbGJhY2sKICAqIHRvIGFsbG93IHVzZXJzIHRvIHVzZSB0aGVpciBvd24gb3ZlcmZsb3cgaW50ZXJydXB0IGhhbmRsaW5nIG1lY2hhbmlzbS4KICAqCi0gKiB0YXNrOiB0aGUgdGFzayB0byByZXF1ZXN0IHJlY29yZGluZyBmb3I7Ci0gKiAgICAgICBOVUxMIGZvciBwZXItY3B1IHJlY29yZGluZyBvbiB0aGUgY3VycmVudCBjcHUKKyAqIFRoZSBmdW5jdGlvbiBtaWdodCBzbGVlcC4KKyAqCisgKiB0YXNrOiB0aGUgdGFzayB0byByZXF1ZXN0IHJlY29yZGluZyBmb3IKKyAqIGNwdTogIHRoZSBjcHUgdG8gcmVxdWVzdCByZWNvcmRpbmcgZm9yCiAgKiBiYXNlOiB0aGUgYmFzZSBwb2ludGVyIGZvciB0aGUgKG5vbi1wYWdlYWJsZSkgYnVmZmVyOwogICogc2l6ZTogdGhlIHNpemUgb2YgdGhlIHByb3ZpZGVkIGJ1ZmZlciBpbiBieXRlcwogICogb3ZmbDogcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBvbiBidWZmZXIgb3ZlcmZsb3c7CkBAIC05MywxOSArOTUsMjggQEAKICAqICAgICAtMSBpZiBubyBpbnRlcnJ1cHQgdGhyZXNob2xkIGlzIHJlcXVlc3RlZC4KICAqIGZsYWdzOiBhIGJpdC1tYXNrIG9mIHRoZSBhYm92ZSBmbGFncwogICovCi1leHRlcm4gc3RydWN0IGJ0c190cmFjZXIgKmRzX3JlcXVlc3RfYnRzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQkJIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAotCQkJCQkgYnRzX292ZmxfY2FsbGJhY2tfdCBvdmZsLAotCQkJCQkgc2l6ZV90IHRoLCB1bnNpZ25lZCBpbnQgZmxhZ3MpOwotZXh0ZXJuIHN0cnVjdCBwZWJzX3RyYWNlciAqZHNfcmVxdWVzdF9wZWJzKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJCQkJICAgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCi0JCQkJCSAgIHBlYnNfb3ZmbF9jYWxsYmFja190IG92ZmwsCi0JCQkJCSAgIHNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBzdHJ1Y3QgYnRzX3RyYWNlciAqZHNfcmVxdWVzdF9idHNfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSAgICAgIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAorCQkJCQkgICAgICBidHNfb3ZmbF9jYWxsYmFja190IG92ZmwsCisJCQkJCSAgICAgIHNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKTsKK2V4dGVybiBzdHJ1Y3QgYnRzX3RyYWNlciAqZHNfcmVxdWVzdF9idHNfY3B1KGludCBjcHUsIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAorCQkJCQkgICAgIGJ0c19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwKKwkJCQkJICAgICBzaXplX3QgdGgsIHVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gc3RydWN0IHBlYnNfdHJhY2VyICpkc19yZXF1ZXN0X3BlYnNfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCQl2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJCQkJCXBlYnNfb3ZmbF9jYWxsYmFja190IG92ZmwsCisJCQkJCQlzaXplX3QgdGgsIHVuc2lnbmVkIGludCBmbGFncyk7CitleHRlcm4gc3RydWN0IHBlYnNfdHJhY2VyICpkc19yZXF1ZXN0X3BlYnNfY3B1KGludCBjcHUsCisJCQkJCSAgICAgICB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJCQkJICAgICAgIHBlYnNfb3ZmbF9jYWxsYmFja190IG92ZmwsCisJCQkJCSAgICAgICBzaXplX3QgdGgsIHVuc2lnbmVkIGludCBmbGFncyk7CiAKIC8qCiAgKiBSZWxlYXNlIEJUUyBvciBQRUJTIHJlc291cmNlcwogICogU3VzcGVuZCBhbmQgcmVzdW1lIEJUUyBvciBQRUJTIHRyYWNpbmcKICAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGlycSdzIGVuYWJsZWQuCisgKgogICogdHJhY2VyOiB0aGUgdHJhY2VyIGhhbmRsZSByZXR1cm5lZCBmcm9tIGRzX3JlcXVlc3RffigpCiAgKi8KIGV4dGVybiB2b2lkIGRzX3JlbGVhc2VfYnRzKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpOwpAQCAtMTE1LDYgKzEyNiwyOCBAQAogZXh0ZXJuIHZvaWQgZHNfc3VzcGVuZF9wZWJzKHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyKTsKIGV4dGVybiB2b2lkIGRzX3Jlc3VtZV9wZWJzKHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyKTsKIAorLyoKKyAqIFJlbGVhc2UgQlRTIG9yIFBFQlMgcmVzb3VyY2VzCisgKiBTdXNwZW5kIGFuZCByZXN1bWUgQlRTIG9yIFBFQlMgdHJhY2luZworICoKKyAqIENwdSB0cmFjZXJzIG11c3QgY2FsbCB0aGlzIG9uIHRoZSB0cmFjZWQgY3B1LgorICogVGFzayB0cmFjZXJzIG11c3QgY2FsbCBkc19yZWxlYXNlX35fbm9pcnEoKSBmb3IgdGhlbXNlbHZlcy4KKyAqCisgKiBNYXkgYmUgY2FsbGVkIHdpdGggaXJxJ3MgZGlzYWJsZWQuCisgKgorICogUmV0dXJucyAwIGlmIHN1Y2Nlc3NmdWw7CisgKiAtRVBFUk0gaWYgdGhlIGNwdSB0cmFjZXIgZG9lcyBub3QgdHJhY2UgdGhlIGN1cnJlbnQgY3B1LgorICogLUVQRVJNIGlmIHRoZSB0YXNrIHRyYWNlciBkb2VzIG5vdCB0cmFjZSBpdHNlbGYuCisgKgorICogdHJhY2VyOiB0aGUgdHJhY2VyIGhhbmRsZSByZXR1cm5lZCBmcm9tIGRzX3JlcXVlc3RffigpCisgKi8KK2V4dGVybiBpbnQgZHNfcmVsZWFzZV9idHNfbm9pcnEoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcik7CitleHRlcm4gaW50IGRzX3N1c3BlbmRfYnRzX25vaXJxKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpOworZXh0ZXJuIGludCBkc19yZXN1bWVfYnRzX25vaXJxKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpOworZXh0ZXJuIGludCBkc19yZWxlYXNlX3BlYnNfbm9pcnEoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIpOworZXh0ZXJuIGludCBkc19zdXNwZW5kX3BlYnNfbm9pcnEoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIpOworZXh0ZXJuIGludCBkc19yZXN1bWVfcGVic19ub2lycShzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcik7CisKIAogLyoKICAqIFRoZSByYXcgRFMgYnVmZmVyIHN0YXRlIGFzIGl0IGlzIHVzZWQgZm9yIEJUUyBhbmQgUEVCUyByZWNvcmRpbmcuCkBAIC0xNzAsOSArMjAzLDkgQEAKIAkJfSBsYnI7CiAJCS8qIEJUU19UQVNLX0FSUklWRVMgb3IgQlRTX1RBU0tfREVQQVJUUyAqLwogCQlzdHJ1Y3QgewotCQkJX191NjQgamlmZmllczsKKwkJCV9fdTY0IGNsb2NrOwogCQkJcGlkX3QgcGlkOwotCQl9IHRpbWVzdGFtcDsKKwkJfSBldmVudDsKIAl9IHZhcmlhbnQ7CiB9OwogCkBAIC0yMDEsOCArMjM0LDEyIEBACiBzdHJ1Y3QgcGVic190cmFjZSB7CiAJc3RydWN0IGRzX3RyYWNlIGRzOwogCi0JLyogdGhlIFBFQlMgcmVzZXQgdmFsdWUgKi8KLQl1bnNpZ25lZCBsb25nIGxvbmcgcmVzZXRfdmFsdWU7CisJLyogdGhlIG51bWJlciBvZiB2YWxpZCBjb3VudGVycyBpbiB0aGUgYmVsb3cgYXJyYXkgKi8KKwl1bnNpZ25lZCBpbnQgY291bnRlcnM7CisKKyNkZWZpbmUgTUFYX1BFQlNfQ09VTlRFUlMgNAorCS8qIHRoZSBjb3VudGVyIHJlc2V0IHZhbHVlICovCisJdW5zaWduZWQgbG9uZyBsb25nIGNvdW50ZXJfcmVzZXRbTUFYX1BFQlNfQ09VTlRFUlNdOwogfTsKIAogCkBAIC0yMzcsOSArMjc0LDExIEBACiAgKiBSZXR1cm5zIDAgb24gc3VjY2VzczsgLUVlcnJubyBvbiBlcnJvcgogICoKICAqIHRyYWNlcjogdGhlIHRyYWNlciBoYW5kbGUgcmV0dXJuZWQgZnJvbSBkc19yZXF1ZXN0X3BlYnMoKQorICogY291bnRlcjogdGhlIGluZGV4IG9mIHRoZSBjb3VudGVyCiAgKiB2YWx1ZTogdGhlIG5ldyBjb3VudGVyIHJlc2V0IHZhbHVlCiAgKi8KLWV4dGVybiBpbnQgZHNfc2V0X3BlYnNfcmVzZXQoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIsIHU2NCB2YWx1ZSk7CitleHRlcm4gaW50IGRzX3NldF9wZWJzX3Jlc2V0KHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyLAorCQkJICAgICB1bnNpZ25lZCBpbnQgY291bnRlciwgdTY0IHZhbHVlKTsKIAogLyoKICAqIEluaXRpYWxpemF0aW9uCkBAIC0yNTIsMjEgKzI5MSwxMiBAQAogICovCiBleHRlcm4gdm9pZCBkc19zd2l0Y2hfdG8oc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpOwogCi0vKgotICogVGFzayBjbG9uZS9pbml0IGFuZCBjbGVhbnVwIHdvcmsKLSAqLwotZXh0ZXJuIHZvaWQgZHNfY29weV90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2ssIHN0cnVjdCB0YXNrX3N0cnVjdCAqZmF0aGVyKTsKLWV4dGVybiB2b2lkIGRzX2V4aXRfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKLQogI2Vsc2UgLyogQ09ORklHX1g4Nl9EUyAqLwogCiBzdHJ1Y3QgY3B1aW5mb194ODY7CiBzdGF0aWMgaW5saW5lIHZvaWQgX19jcHVpbml0IGRzX2luaXRfaW50ZWwoc3RydWN0IGNwdWluZm9feDg2ICppZ25vcmVkKSB7fQogc3RhdGljIGlubGluZSB2b2lkIGRzX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsCiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KSB7fQotc3RhdGljIGlubGluZSB2b2lkIGRzX2NvcHlfdGhyZWFkKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrLAotCQkJCSAgc3RydWN0IHRhc2tfc3RydWN0ICpmYXRoZXIpIHt9Ci1zdGF0aWMgaW5saW5lIHZvaWQgZHNfZXhpdF90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spIHt9CiAKICNlbmRpZiAvKiBDT05GSUdfWDg2X0RTICovCiAjZW5kaWYgLyogX0FTTV9YODZfRFNfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vZW50cnlfYXJjaC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vZW50cnlfYXJjaC5oCmluZGV4IGMyZTZiZWQuLmQ3NTBhMTAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2VudHJ5X2FyY2guaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9lbnRyeV9hcmNoLmgKQEAgLTQ5LDcgKzQ5LDcgQEAKIEJVSUxEX0lOVEVSUlVQVChzcHVyaW91c19pbnRlcnJ1cHQsU1BVUklPVVNfQVBJQ19WRUNUT1IpCiAKICNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUwotQlVJTERfSU5URVJSVVBUKHBlcmZfY291bnRlcl9pbnRlcnJ1cHQsIExPQ0FMX1BFUkZfVkVDVE9SKQorQlVJTERfSU5URVJSVVBUKHBlcmZfcGVuZGluZ19pbnRlcnJ1cHQsIExPQ0FMX1BFTkRJTkdfVkVDVE9SKQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2X01DRV9QNFRIRVJNQUwKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2hhcmRpcnEuaAppbmRleCAzNzU1NWU1Li45ZWJjNWMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9oYXJkaXJxLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaGFyZGlycS5oCkBAIC0xMyw2ICsxMyw4IEBACiAJdW5zaWduZWQgaW50IGlycV9zcHVyaW91c19jb3VudDsKICNlbmRpZgogCXVuc2lnbmVkIGludCBnZW5lcmljX2lycXM7CS8qIGFyY2ggZGVwZW5kZW50ICovCisJdW5zaWduZWQgaW50IGFwaWNfcGVyZl9pcnFzOworCXVuc2lnbmVkIGludCBhcGljX3BlbmRpbmdfaXJxczsKICNpZmRlZiBDT05GSUdfU01QCiAJdW5zaWduZWQgaW50IGlycV9yZXNjaGVkX2NvdW50OwogCXVuc2lnbmVkIGludCBpcnFfY2FsbF9jb3VudDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2h3X2lycS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmgKaW5kZXggYjc2MmVhNC4uNmRmNDVmNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaHdfaXJxLmgKQEAgLTI5LDYgKzI5LDggQEAKIGV4dGVybiB2b2lkIGFwaWNfdGltZXJfaW50ZXJydXB0KHZvaWQpOwogZXh0ZXJuIHZvaWQgZ2VuZXJpY19pbnRlcnJ1cHQodm9pZCk7CiBleHRlcm4gdm9pZCBlcnJvcl9pbnRlcnJ1cHQodm9pZCk7CitleHRlcm4gdm9pZCBwZXJmX3BlbmRpbmdfaW50ZXJydXB0KHZvaWQpOworCiBleHRlcm4gdm9pZCBzcHVyaW91c19pbnRlcnJ1cHQodm9pZCk7CiBleHRlcm4gdm9pZCB0aGVybWFsX2ludGVycnVwdCh2b2lkKTsKIGV4dGVybiB2b2lkIHJlc2NoZWR1bGVfaW50ZXJydXB0KHZvaWQpOwpAQCAtNjMsNyArNjUsMjYgQEAKIGV4dGVybiB2b2lkIGluaXRfVklTV1NfQVBJQ19pcnFzKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2V0dXBfSU9fQVBJQyh2b2lkKTsKIGV4dGVybiB2b2lkIGRpc2FibGVfSU9fQVBJQyh2b2lkKTsKLWV4dGVybiBpbnQgSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoaW50IGJ1cywgaW50IHNsb3QsIGludCBmbik7CisKK3N0cnVjdCBpb19hcGljX2lycV9hdHRyIHsKKwlpbnQgaW9hcGljOworCWludCBpb2FwaWNfcGluOworCWludCB0cmlnZ2VyOworCWludCBwb2xhcml0eTsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaW9fYXBpY19pcnFfYXR0cihzdHJ1Y3QgaW9fYXBpY19pcnFfYXR0ciAqaXJxX2F0dHIsCisJCQkJCWludCBpb2FwaWMsIGludCBpb2FwaWNfcGluLAorCQkJCQlpbnQgdHJpZ2dlciwgaW50IHBvbGFyaXR5KQoreworCWlycV9hdHRyLT5pb2FwaWMgICAgID0gaW9hcGljOworCWlycV9hdHRyLT5pb2FwaWNfcGluID0gaW9hcGljX3BpbjsKKwlpcnFfYXR0ci0+dHJpZ2dlciAgICA9IHRyaWdnZXI7CisJaXJxX2F0dHItPnBvbGFyaXR5ICAgPSBwb2xhcml0eTsKK30KKworZXh0ZXJuIGludCBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihpbnQgYnVzLCBpbnQgZGV2Zm4sIGludCBwaW4sCisJCQkJCXN0cnVjdCBpb19hcGljX2lycV9hdHRyICppcnFfYXR0cik7CiBleHRlcm4gdm9pZCBzZXR1cF9pb2FwaWNfZGVzdCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgZW5hYmxlX0lPX0FQSUModm9pZCk7CkBAIC03OCw3ICs5OSwxMSBAQAogLyogU01QICovCiBleHRlcm4gdm9pZCBzbXBfYXBpY190aW1lcl9pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKik7CiBleHRlcm4gdm9pZCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICopOworZXh0ZXJuIHZvaWQgc21wX2dlbmVyaWNfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgc21wX2Vycm9yX2ludGVycnVwdChzdHJ1Y3QgcHRfcmVncyAqKTsKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKK2V4dGVybiBhc21saW5rYWdlIHZvaWQgc21wX2lycV9tb3ZlX2NsZWFudXBfaW50ZXJydXB0KHZvaWQpOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX1NNUAogZXh0ZXJuIHZvaWQgc21wX3Jlc2NoZWR1bGVfaW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICopOwogZXh0ZXJuIHZvaWQgc21wX2NhbGxfZnVuY3Rpb25faW50ZXJydXB0KHN0cnVjdCBwdF9yZWdzICopOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaTM4Ny5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaTM4Ny5oCmluZGV4IDcxYzllNTEuLjE3NWFkZjUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2kzODcuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pMzg3LmgKQEAgLTY3LDcgKzY3LDcgQEAKIAkJICAgICAiLnByZXZpb3VzXG4iCiAJCSAgICAgX0FTTV9FWFRBQkxFKDFiLCAzYikKIAkJICAgICA6IFtlcnJdICI9ciIgKGVycikKLSNpZiAwIC8qIFNlZSBjb21tZW50IGluIF9fc2F2ZV9pbml0X2ZwdSgpIGJlbG93LiAqLworI2lmIDAgLyogU2VlIGNvbW1lbnQgaW4gZnhzYXZlKCkgYmVsb3cuICovCiAJCSAgICAgOiBbZnhdICJyIiAoZngpLCAibSIgKCpmeCksICIwIiAoMCkpOwogI2Vsc2UKIAkJICAgICA6IFtmeF0gImNkYVNEYiIgKGZ4KSwgIm0iICgqZngpLCAiMCIgKDApKTsKQEAgLTc1LDE0ICs3NSw2IEBACiAJcmV0dXJuIGVycjsKIH0KIAotc3RhdGljIGlubGluZSBpbnQgcmVzdG9yZV9mcHVfY2hlY2tpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17Ci0JaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfWFNBVkUpCi0JCXJldHVybiB4cnN0b3JfY2hlY2tpbmcoJnRzay0+dGhyZWFkLnhzdGF0ZS0+eHNhdmUpOwotCWVsc2UKLQkJcmV0dXJuIGZ4cnN0b3JfY2hlY2tpbmcoJnRzay0+dGhyZWFkLnhzdGF0ZS0+ZnhzYXZlKTsKLX0KLQogLyogQU1EIENQVXMgZG9uJ3Qgc2F2ZS9yZXN0b3JlIEZEUC9GSVAvRk9QIHVubGVzcyBhbiBleGNlcHRpb24KICAgIGlzIHBlbmRpbmcuIENsZWFyIHRoZSB4ODcgc3RhdGUgaGVyZSBieSBzZXR0aW5nIGl0IHRvIGZpeGVkCiAgICB2YWx1ZXMuIFRoZSBrZXJuZWwgZGF0YSBzZWdtZW50IGNhbiBiZSBzb21ldGltZXMgMCBhbmQgc29tZXRpbWVzCkBAIC0xMjAsNyArMTEyLDcgQEAKIAkJICAgICAiLnByZXZpb3VzXG4iCiAJCSAgICAgX0FTTV9FWFRBQkxFKDFiLCAzYikKIAkJICAgICA6IFtlcnJdICI9ciIgKGVyciksICI9bSIgKCpmeCkKLSNpZiAwIC8qIFNlZSBjb21tZW50IGluIF9fZnhzYXZlX2NsZWFyKCkgYmVsb3cuICovCisjaWYgMCAvKiBTZWUgY29tbWVudCBpbiBmeHNhdmUoKSBiZWxvdy4gKi8KIAkJICAgICA6IFtmeF0gInIiIChmeCksICIwIiAoMCkpOwogI2Vsc2UKIAkJICAgICA6IFtmeF0gImNkYVNEYiIgKGZ4KSwgIjAiICgwKSk7CkBAIC0xODUsMTIgKzE3Nyw5IEBACiAJYXNtIHZvbGF0aWxlKCJmbmNsZXggOyBmd2FpdCIpOwogfQogCi1zdGF0aWMgaW5saW5lIHZvaWQgcmVzdG9yZV9mcHUoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCisvKiBwZXJmb3JtIGZ4cnN0b3IgaWZmIHRoZSBwcm9jZXNzb3IgaGFzIGV4dGVuZGVkIHN0YXRlcywgb3RoZXJ3aXNlIGZyc3RvciAqLworc3RhdGljIGlubGluZSBpbnQgZnhyc3Rvcl9jaGVja2luZyhzdHJ1Y3QgaTM4N19meHNhdmVfc3RydWN0ICpmeCkKIHsKLQlpZiAodGFza190aHJlYWRfaW5mbyh0c2spLT5zdGF0dXMgJiBUU19YU0FWRSkgewotCQl4cnN0b3JfY2hlY2tpbmcoJnRzay0+dGhyZWFkLnhzdGF0ZS0+eHNhdmUpOwotCQlyZXR1cm47Ci0JfQogCS8qCiAJICogVGhlICJub3AiIGlzIG5lZWRlZCB0byBtYWtlIHRoZSBpbnN0cnVjdGlvbnMgdGhlIHNhbWUKIAkgKiBsZW5ndGguCkBAIC0xOTksNyArMTg4LDkgQEAKIAkJIm5vcCA7IGZyc3RvciAlMSIsCiAJCSJmeHJzdG9yICUxIiwKIAkJWDg2X0ZFQVRVUkVfRlhTUiwKLQkJIm0iICh0c2stPnRocmVhZC54c3RhdGUtPmZ4c2F2ZSkpOworCQkibSIgKCpmeCkpOworCisJcmV0dXJuIDA7CiB9CiAKIC8qIFdlIG5lZWQgYSBzYWZlIGFkZHJlc3MgdGhhdCBpcyBjaGVhcCB0byBmaW5kIGFuZCB0aGF0IGlzIGFscmVhZHkKQEAgLTI2Miw2ICsyNTMsMTQgQEAKIAogI2VuZGlmCS8qIENPTkZJR19YODZfNjQgKi8KIAorc3RhdGljIGlubGluZSBpbnQgcmVzdG9yZV9mcHVfY2hlY2tpbmcoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCit7CisJaWYgKHRhc2tfdGhyZWFkX2luZm8odHNrKS0+c3RhdHVzICYgVFNfWFNBVkUpCisJCXJldHVybiB4cnN0b3JfY2hlY2tpbmcoJnRzay0+dGhyZWFkLnhzdGF0ZS0+eHNhdmUpOworCWVsc2UKKwkJcmV0dXJuIGZ4cnN0b3JfY2hlY2tpbmcoJnRzay0+dGhyZWFkLnhzdGF0ZS0+ZnhzYXZlKTsKK30KKwogLyoKICAqIFNpZ25hbCBmcmFtZSBoYW5kbGVycy4uLgogICovCkBAIC0zMDUsMTggKzMwNCwxOCBAQAogLyoKICAqIFNvbWUgaW5zdHJ1Y3Rpb25zIGxpa2UgVklBJ3MgcGFkbG9jayBpbnN0cnVjdGlvbnMgZ2VuZXJhdGUgYSBzcHVyaW91cwogICogRE5BIGZhdWx0IGJ1dCBkb24ndCBtb2RpZnkgU1NFIHJlZ2lzdGVycy4gQW5kIHRoZXNlIGluc3RydWN0aW9ucwotICogZ2V0IHVzZWQgZnJvbSBpbnRlcnJ1cHQgY29udGV4dCBhc3dlbGwuIFRvIHByZXZlbnQgdGhlc2Uga2VybmVsIGluc3RydWN0aW9ucwotICogaW4gaW50ZXJydXB0IGNvbnRleHQgaW50ZXJhY3Qgd3JvbmdseSB3aXRoIG90aGVyIHVzZXIva2VybmVsIGZwdSB1c2FnZSwgd2UKKyAqIGdldCB1c2VkIGZyb20gaW50ZXJydXB0IGNvbnRleHQgYXMgd2VsbC4gVG8gcHJldmVudCB0aGVzZSBrZXJuZWwgaW5zdHJ1Y3Rpb25zCisgKiBpbiBpbnRlcnJ1cHQgY29udGV4dCBpbnRlcmFjdGluZyB3cm9uZ2x5IHdpdGggb3RoZXIgdXNlci9rZXJuZWwgZnB1IHVzYWdlLCB3ZQogICogc2hvdWxkIHVzZSB0aGVtIG9ubHkgaW4gdGhlIGNvbnRleHQgb2YgaXJxX3RzX3NhdmUvcmVzdG9yZSgpCiAgKi8KIHN0YXRpYyBpbmxpbmUgaW50IGlycV90c19zYXZlKHZvaWQpCiB7CiAJLyoKLQkgKiBJZiB3ZSBhcmUgaW4gcHJvY2VzcyBjb250ZXh0LCB3ZSBhcmUgb2sgdG8gdGFrZSBhIHNwdXJpb3VzIEROQSBmYXVsdC4KLQkgKiBPdGhlcndpc2UsIGRvaW5nIGNsdHMoKSBpbiBwcm9jZXNzIGNvbnRleHQgcmVxdWlyZSBwcmUtZW1wdGlvbiB0bwotCSAqIGJlIGRpc2FibGVkIG9yIHNvbWUgaGVhdnkgbGlmdGluZyBsaWtlIGtlcm5lbF9mcHVfYmVnaW4oKQorCSAqIElmIGluIHByb2Nlc3MgY29udGV4dCBhbmQgbm90IGF0b21pYywgd2UgY2FuIHRha2UgYSBzcHVyaW91cyBETkEgZmF1bHQuCisJICogT3RoZXJ3aXNlLCBkb2luZyBjbHRzKCkgaW4gcHJvY2VzcyBjb250ZXh0IHJlcXVpcmVzIGRpc2FibGluZyBwcmVlbXB0aW9uCisJICogb3Igc29tZSBoZWF2eSBsaWZ0aW5nIGxpa2Uga2VybmVsX2ZwdV9iZWdpbigpCiAJICovCi0JaWYgKCFpbl9pbnRlcnJ1cHQoKSkKKwlpZiAoIWluX2F0b21pYygpKQogCQlyZXR1cm4gMDsKIAogCWlmIChyZWFkX2NyMCgpICYgWDg2X0NSMF9UUykgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaTgyNTkuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2k4MjU5LmgKaW5kZXggMWE5OWU2Yy4uNThkNzA5MSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaTgyNTkuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pODI1OS5oCkBAIC02MCw4ICs2MCw0IEBACiBleHRlcm4gdm9pZCBtYXNrXzgyNTlBKHZvaWQpOwogZXh0ZXJuIHZvaWQgdW5tYXNrXzgyNTlBKHZvaWQpOwogCi0jaWZkZWYgQ09ORklHX1g4Nl8zMgotZXh0ZXJuIHZvaWQgaW5pdF9JU0FfaXJxcyh2b2lkKTsKLSNlbmRpZgotCiAjZW5kaWYgLyogX0FTTV9YODZfSTgyNTlfSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW50ZWxfYXJjaF9wZXJmbW9uLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9hcmNoX3BlcmZtb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEwZmQwNi4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pbnRlbF9hcmNoX3BlcmZtb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLSNpZm5kZWYgX0FTTV9YODZfSU5URUxfQVJDSF9QRVJGTU9OX0gKLSNkZWZpbmUgX0FTTV9YODZfSU5URUxfQVJDSF9QRVJGTU9OX0gKLQotI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX1BFUkZDVFIwCQkweGMxCi0jZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjEJCTB4YzIKLQotI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMAkJMHgxODYKLSNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDEJCTB4MTg3Ci0KLSNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEUJKDEgPDwgMjIpCi0jZGVmaW5lIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9JTlQJKDEgPDwgMjApCi0jZGVmaW5lIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9PUwkoMSA8PCAxNykKLSNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX1VTUgkoMSA8PCAxNikKLQotI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfU0VMCSgweDNjKQotI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfVU1BU0sJKDB4MDAgPDwgOCkKLSNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX0lOREVYICgwKQotI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfUFJFU0VOVCBcCi0JKDEgPDwgKEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19JTkRFWCkpCi0KLXVuaW9uIGNwdWlkMTBfZWF4IHsKLQlzdHJ1Y3QgewotCQl1bnNpZ25lZCBpbnQgdmVyc2lvbl9pZDo4OwotCQl1bnNpZ25lZCBpbnQgbnVtX2NvdW50ZXJzOjg7Ci0JCXVuc2lnbmVkIGludCBiaXRfd2lkdGg6ODsKLQkJdW5zaWduZWQgaW50IG1hc2tfbGVuZ3RoOjg7Ci0JfSBzcGxpdDsKLQl1bnNpZ25lZCBpbnQgZnVsbDsKLX07Ci0KLSNlbmRpZiAvKiBfQVNNX1g4Nl9JTlRFTF9BUkNIX1BFUkZNT05fSCAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9fYXBpYy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9fYXBpYy5oCmluZGV4IDlkODI2ZTQuLmRhZjg2NmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvX2FwaWMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pb19hcGljLmgKQEAgLTE1NCwyMiArMTU0LDE5IEBACiBleHRlcm4gaW50IGlvX2FwaWNfZ2V0X3VuaXF1ZV9pZChpbnQgaW9hcGljLCBpbnQgYXBpY19pZCk7CiBleHRlcm4gaW50IGlvX2FwaWNfZ2V0X3ZlcnNpb24oaW50IGlvYXBpYyk7CiBleHRlcm4gaW50IGlvX2FwaWNfZ2V0X3JlZGlyX2VudHJpZXMoaW50IGlvYXBpYyk7Ci1leHRlcm4gaW50IGlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nKGludCBpb2FwaWMsIGludCBwaW4sIGludCBpcnEsCi0JCQkJICAgaW50IGVkZ2VfbGV2ZWwsIGludCBhY3RpdmVfaGlnaF9sb3cpOwogI2VuZGlmIC8qIENPTkZJR19BQ1BJICovCiAKK3N0cnVjdCBpb19hcGljX2lycV9hdHRyOworZXh0ZXJuIGludCBpb19hcGljX3NldF9wY2lfcm91dGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpcnEsCisJCSBzdHJ1Y3QgaW9fYXBpY19pcnFfYXR0ciAqaXJxX2F0dHIpOwogZXh0ZXJuIGludCAoKmlvYXBpY19yZW51bWJlcl9pcnEpKGludCBpb2FwaWMsIGludCBpcnEpOwogZXh0ZXJuIHZvaWQgaW9hcGljX2luaXRfbWFwcGluZ3Modm9pZCk7CiAKLSNpZmRlZiBDT05GSUdfWDg2XzY0CiBleHRlcm4gc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgKiphbGxvY19pb2FwaWNfZW50cmllcyh2b2lkKTsKIGV4dGVybiB2b2lkIGZyZWVfaW9hcGljX2VudHJpZXMoc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgKippb2FwaWNfZW50cmllcyk7CiBleHRlcm4gaW50IHNhdmVfSU9fQVBJQ19zZXR1cChzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzKTsKIGV4dGVybiB2b2lkIG1hc2tfSU9fQVBJQ19zZXR1cChzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzKTsKIGV4dGVybiBpbnQgcmVzdG9yZV9JT19BUElDX3NldHVwKHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICoqaW9hcGljX2VudHJpZXMpOwotZXh0ZXJuIHZvaWQgcmVpbml0X2ludHJfcmVtYXBwZWRfSU9fQVBJQyhpbnQgaW50cl9yZW1hcHBpbmcsCi0Jc3RydWN0IElPX0FQSUNfcm91dGVfZW50cnkgKippb2FwaWNfZW50cmllcyk7Ci0jZW5kaWYKIAogZXh0ZXJuIHZvaWQgcHJvYmVfbnJfaXJxc19nc2kodm9pZCk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvbWFwLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pb21hcC5oCmluZGV4IDg2YWYyNjAuLjBlOWZlMWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lvbWFwLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaW9tYXAuaApAQCAtMSwzICsxLDYgQEAKKyNpZm5kZWYgX0FTTV9YODZfSU9NQVBfSAorI2RlZmluZSBfQVNNX1g4Nl9JT01BUF9ICisKIC8qCiAgKiBDb3B5cmlnaHQgwqkgMjAwOCBJbmdvIE1vbG5hcgogICoKQEAgLTMxLDMgKzM0LDUgQEAKIAogdm9pZAogaW91bm1hcF9hdG9taWModm9pZCAqa3ZhZGRyLCBlbnVtIGttX3R5cGUgdHlwZSk7CisKKyNlbmRpZiAvKiBfQVNNX1g4Nl9JT01BUF9IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfcmVtYXBwaW5nLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfcmVtYXBwaW5nLmgKaW5kZXggMDM5Njc2MC4uZjI3NWUyMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxX3JlbWFwcGluZy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2lycV9yZW1hcHBpbmcuaApAQCAtMSw2ICsxLDYgQEAKICNpZm5kZWYgX0FTTV9YODZfSVJRX1JFTUFQUElOR19ICiAjZGVmaW5lIF9BU01fWDg2X0lSUV9SRU1BUFBJTkdfSAogCi0jZGVmaW5lIElSVEVfREVTVChkZXN0KSAoKHgyYXBpYykgPyBkZXN0IDogZGVzdCA8PCA4KQorI2RlZmluZSBJUlRFX0RFU1QoZGVzdCkgKCh4MmFwaWNfbW9kZSkgPyBkZXN0IDogZGVzdCA8PCA4KQogCiAjZW5kaWYJLyogX0FTTV9YODZfSVJRX1JFTUFQUElOR19IICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxX3ZlY3RvcnMuaAppbmRleCAzY2JkNzliLi5lOTk3YmU5OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vaXJxX3ZlY3RvcnMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9pcnFfdmVjdG9ycy5oCkBAIC0zNCw2ICszNCw3IEBACiAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAjIGRlZmluZSBTWVNDQUxMX1ZFQ1RPUgkJCTB4ODAKKyMgZGVmaW5lIElBMzJfU1lTQ0FMTF9WRUNUT1IJCTB4ODAKICNlbHNlCiAjIGRlZmluZSBJQTMyX1NZU0NBTExfVkVDVE9SCQkweDgwCiAjZW5kaWYKQEAgLTEwNywxNiArMTA4LDE2IEBACiAjZGVmaW5lIExPQ0FMX1RJTUVSX1ZFQ1RPUgkJMHhlZgogCiAvKgotICogUGVyZm9ybWFuY2UgbW9uaXRvcmluZyBpbnRlcnJ1cHQgdmVjdG9yOgotICovCi0jZGVmaW5lIExPQ0FMX1BFUkZfVkVDVE9SCQkweGVlCi0KLS8qCiAgKiBHZW5lcmljIHN5c3RlbSB2ZWN0b3IgZm9yIHBsYXRmb3JtIHNwZWNpZmljIHVzZQogICovCiAjZGVmaW5lIEdFTkVSSUNfSU5URVJSVVBUX1ZFQ1RPUgkweGVkCiAKIC8qCisgKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIHBlbmRpbmcgd29yayB2ZWN0b3I6CisgKi8KKyNkZWZpbmUgTE9DQUxfUEVORElOR19WRUNUT1IJCTB4ZWMKKworLyoKICAqIEZpcnN0IEFQSUMgdmVjdG9yIGF2YWlsYWJsZSB0byBkcml2ZXJzOiAodmVjdG9ycyAweDMwLTB4ZWUpIHdlCiAgKiBzdGFydCBhdCAweDMxKDB4NDEpIHRvIHNwcmVhZCBvdXQgdmVjdG9ycyBldmVubHkgYmV0d2VlbiBwcmlvcml0eQogICogbGV2ZWxzLiAoMHg4MCBpcyB0aGUgc3lzY2FsbCB2ZWN0b3IpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rOC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vazguaAppbmRleCA1NGM4Y2M1Li5jMmQxZjNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9rOC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL2s4LmgKQEAgLTEyLDQgKzEyLDE3IEBACiBleHRlcm4gdm9pZCBrOF9mbHVzaF9nYXJ0cyh2b2lkKTsKIGV4dGVybiBpbnQgazhfc2Nhbl9ub2Rlcyh1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCk7CiAKKyNpZmRlZiBDT05GSUdfSzhfTkIKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBjaV9kZXYgKm5vZGVfdG9fazhfbmJfbWlzYyhpbnQgbm9kZSkKK3sKKwlyZXR1cm4gKG5vZGUgPCBudW1fazhfbm9ydGhicmlkZ2VzKSA/IGs4X25vcnRoYnJpZGdlc1tub2RlXSA6IE5VTEw7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGNpX2RldiAqbm9kZV90b19rOF9uYl9taXNjKGludCBub2RlKQoreworCXJldHVybiBOVUxMOworfQorI2VuZGlmCisKKwogI2VuZGlmIC8qIF9BU01fWDg2X0s4X0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21pY3JvY29kZS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlLmgKaW5kZXggYzg4MjY2NC4uZWY1MWI1MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbWljcm9jb2RlLmgKQEAgLTksMjAgKzksMzEgQEAKIAogc3RydWN0IGRldmljZTsKIAorZW51bSB1Y29kZV9zdGF0ZSB7IFVDT0RFX0VSUk9SLCBVQ09ERV9PSywgVUNPREVfTkZPVU5EIH07CisKIHN0cnVjdCBtaWNyb2NvZGVfb3BzIHsKLQlpbnQgICgqcmVxdWVzdF9taWNyb2NvZGVfdXNlcikgKGludCBjcHUsIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBzaXplKTsKLQlpbnQgICgqcmVxdWVzdF9taWNyb2NvZGVfZncpIChpbnQgY3B1LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOworCWVudW0gdWNvZGVfc3RhdGUgKCpyZXF1ZXN0X21pY3JvY29kZV91c2VyKSAoaW50IGNwdSwKKwkJCQljb25zdCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSk7CiAKLQl2b2lkICgqYXBwbHlfbWljcm9jb2RlKSAoaW50IGNwdSk7CisJZW51bSB1Y29kZV9zdGF0ZSAoKnJlcXVlc3RfbWljcm9jb2RlX2Z3KSAoaW50IGNwdSwKKwkJCQlzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpOwogCi0JaW50ICAoKmNvbGxlY3RfY3B1X2luZm8pIChpbnQgY3B1LCBzdHJ1Y3QgY3B1X3NpZ25hdHVyZSAqY3NpZyk7CiAJdm9pZCAoKm1pY3JvY29kZV9maW5pX2NwdSkgKGludCBjcHUpOworCisJLyoKKwkgKiBUaGUgZ2VuZXJpYyAnbWljcm9jb2RlX2NvcmUnIHBhcnQgZ3VhcmFudGVlcyB0aGF0CisJICogdGhlIGNhbGxiYWNrcyBiZWxvdyBydW4gb24gYSB0YXJnZXQgY3B1IHdoZW4gdGhleQorCSAqIGFyZSBiZWluZyBjYWxsZWQuCisJICogU2VlIGFsc28gdGhlICJTeW5jaHJvbml6YXRpb24iIHNlY3Rpb24gaW4gbWljcm9jb2RlX2NvcmUuYy4KKwkgKi8KKwlpbnQgKCphcHBseV9taWNyb2NvZGUpIChpbnQgY3B1KTsKKwlpbnQgKCpjb2xsZWN0X2NwdV9pbmZvKSAoaW50IGNwdSwgc3RydWN0IGNwdV9zaWduYXR1cmUgKmNzaWcpOwogfTsKIAogc3RydWN0IHVjb2RlX2NwdV9pbmZvIHsKLQlzdHJ1Y3QgY3B1X3NpZ25hdHVyZSBjcHVfc2lnOwotCWludCB2YWxpZDsKLQl2b2lkICptYzsKKwlzdHJ1Y3QgY3B1X3NpZ25hdHVyZQljcHVfc2lnOworCWludAkJCXZhbGlkOworCXZvaWQJCQkqbWM7CiB9OwogZXh0ZXJuIHN0cnVjdCB1Y29kZV9jcHVfaW5mbyB1Y29kZV9jcHVfaW5mb1tdOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tcHNwZWMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCmluZGV4IDY0MmZjN2YuLmUyYTFiYjYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL21wc3BlYy5oCkBAIC02MSw5ICs2MSwxMSBAQAogI2lmZGVmIENPTkZJR19YODZfTVBQQVJTRQogZXh0ZXJuIHZvaWQgZmluZF9zbXBfY29uZmlnKHZvaWQpOwogZXh0ZXJuIHZvaWQgZWFybHlfcmVzZXJ2ZV9lODIwX21wY19uZXcodm9pZCk7CitleHRlcm4gaW50IGVuYWJsZV91cGRhdGVfbXB0YWJsZTsKICNlbHNlCiBzdGF0aWMgaW5saW5lIHZvaWQgZmluZF9zbXBfY29uZmlnKHZvaWQpIHsgfQogc3RhdGljIGlubGluZSB2b2lkIGVhcmx5X3Jlc2VydmVfZTgyMF9tcGNfbmV3KHZvaWQpIHsgfQorI2RlZmluZSBlbmFibGVfdXBkYXRlX21wdGFibGUgMAogI2VuZGlmCiAKIHZvaWQgX19jcHVpbml0IGdlbmVyaWNfcHJvY2Vzc29yX2luZm8oaW50IGFwaWNpZCwgaW50IHZlcnNpb24pOwpAQCAtNzIsMjAgKzc0LDEzIEBACiBleHRlcm4gdm9pZCBtcF9vdmVycmlkZV9sZWdhY3lfaXJxKHU4IGJ1c19pcnEsIHU4IHBvbGFyaXR5LCB1OCB0cmlnZ2VyLAogCQkJCSAgIHUzMiBnc2kpOwogZXh0ZXJuIHZvaWQgbXBfY29uZmlnX2FjcGlfbGVnYWN5X2lycXModm9pZCk7Ci1leHRlcm4gaW50IG1wX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwgaW50IGFjdGl2ZV9oaWdoX2xvdyk7CitzdHJ1Y3QgZGV2aWNlOworZXh0ZXJuIGludCBtcF9yZWdpc3Rlcl9nc2koc3RydWN0IGRldmljZSAqZGV2LCB1MzIgZ3NpLCBpbnQgZWRnZV9sZXZlbCwKKwkJCQkgaW50IGFjdGl2ZV9oaWdoX2xvdyk7CiBleHRlcm4gaW50IGFjcGlfcHJvYmVfZ3NpKHZvaWQpOwogI2lmZGVmIENPTkZJR19YODZfSU9fQVBJQwotZXh0ZXJuIGludCBtcF9jb25maWdfYWNwaV9nc2kodW5zaWduZWQgY2hhciBudW1iZXIsIHVuc2lnbmVkIGludCBkZXZmbiwgdTggcGluLAotCQkJCXUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpOwogZXh0ZXJuIGludCBtcF9maW5kX2lvYXBpYyhpbnQgZ3NpKTsKIGV4dGVybiBpbnQgbXBfZmluZF9pb2FwaWNfcGluKGludCBpb2FwaWMsIGludCBnc2kpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgaW50Ci1tcF9jb25maWdfYWNwaV9nc2kodW5zaWduZWQgY2hhciBudW1iZXIsIHVuc2lnbmVkIGludCBkZXZmbiwgdTggcGluLAotCQkgICB1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQotewotCXJldHVybiAwOwotfQogI2VuZGlmCiAjZWxzZSAvKiAhQ09ORklHX0FDUEk6ICovCiBzdGF0aWMgaW5saW5lIGludCBhY3BpX3Byb2JlX2dzaSh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbXNyLWluZGV4LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaAppbmRleCBlYzQxZmMxLi40ZDU4ZDA0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9tc3ItaW5kZXguaApAQCAtMTIxLDcgKzEyMSw2IEBACiAjZGVmaW5lIE1TUl9LOF9UT1BfTUVNMQkJCTB4YzAwMTAwMWEKICNkZWZpbmUgTVNSX0s4X1RPUF9NRU0yCQkJMHhjMDAxMDAxZAogI2RlZmluZSBNU1JfSzhfU1lTQ0ZHCQkJMHhjMDAxMDAxMAotI2RlZmluZSBNU1JfSzhfSFdDUgkJCTB4YzAwMTAwMTUKICNkZWZpbmUgTVNSX0s4X0lOVF9QRU5ESU5HX01TRwkJMHhjMDAxMDA1NQogLyogQzFFIGFjdGl2ZSBiaXRzIGluIGludCBwZW5kaW5nIG1lc3NhZ2UgKi8KICNkZWZpbmUgSzhfSU5UUF9DMUVfQUNUSVZFX01BU0sJCTB4MTgwMDAwMDAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL25taS5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbm1pLmgKaW5kZXggYzQ1YTBhNS4uYzk3MjY0NCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbm1pLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbm1pLmgKQEAgLTY0LDcgKzY0LDcgQEAKIAkgKiBidXQgc2luY2UgdGhleSBhcmUgcG93ZXIgb2YgdHdvIHdlIGNvdWxkIHVzZSBhCiAJICogY2hlYXBlciB3YXkgLS1jdmcKIAkgKi8KLQlyZXR1cm4gbm1pX3dhdGNoZG9nICYgMHgzOworCXJldHVybiBubWlfd2F0Y2hkb2cgJiAoTk1JX0xPQ0FMX0FQSUMgfCBOTUlfSU9fQVBJQyk7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYV82NC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vbnVtYV82NC5oCmluZGV4IDA2NGVkNmQuLmM0YWU4MjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL251bWFfNjQuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9udW1hXzY0LmgKQEAgLTE3LDkgKzE3LDYgQEAKIGV4dGVybiB2b2lkIG51bWFfaW5pdF9hcnJheSh2b2lkKTsKIGV4dGVybiBpbnQgbnVtYV9vZmY7CiAKLWV4dGVybiB2b2lkIHNyYXRfcmVzZXJ2ZV9hZGRfYXJlYShpbnQgbm9kZWlkKTsKLWV4dGVybiBpbnQgaG90YWRkX3BlcmNlbnQ7Ci0KIGV4dGVybiBzMTYgYXBpY2lkX3RvX25vZGVbTUFYX0xPQ0FMX0FQSUNdOwogCiBleHRlcm4gdW5zaWduZWQgbG9uZyBudW1hX2ZyZWVfYWxsX2Jvb3RtZW0odm9pZCk7CkBAIC0yNyw2ICsyNCwxMyBAQAogCQkJICAgICAgIHVuc2lnbmVkIGxvbmcgZW5kKTsKIAogI2lmZGVmIENPTkZJR19OVU1BCisvKgorICogVG9vIHNtYWxsIG5vZGUgc2l6ZXMgbWF5IGNvbmZ1c2UgdGhlIFZNIGJhZGx5LiBVc3VhbGx5IHRoZXkKKyAqIHJlc3VsdCBmcm9tIEJJT1MgYnVncy4gU28gZG9udCByZWNvZ25pemUgbm9kZXMgYXMgc3RhbmRhbG9uZQorICogTlVNQSBlbnRpdGllcyB0aGF0IGhhdmUgbGVzcyB0aGFuIHRoaXMgYW1vdW50IG9mIFJBTSBsaXN0ZWQ6CisgKi8KKyNkZWZpbmUgTk9ERV9NSU5fU0laRSAoNCoxMDI0KjEwMjQpCisKIGV4dGVybiB2b2lkIF9faW5pdCBpbml0X2NwdV90b19ub2RlKHZvaWQpOwogZXh0ZXJuIHZvaWQgX19jcHVpbml0IG51bWFfc2V0X25vZGUoaW50IGNwdSwgaW50IG5vZGUpOwogZXh0ZXJuIHZvaWQgX19jcHVpbml0IG51bWFfY2xlYXJfbm9kZShpbnQgY3B1KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfMzJfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfMzJfdHlwZXMuaAppbmRleCAwZjkxNWFlLi42ZjFiNzMzIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYWdlXzMyX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV8zMl90eXBlcy5oCkBAIC01NCwxMCArNTQsNiBAQAogZXh0ZXJuIGludCBzeXNjdGxfbGVnYWN5X3ZhX2xheW91dDsKIAogZXh0ZXJuIHZvaWQgZmluZF9sb3dfcGZuX3JhbmdlKHZvaWQpOwotZXh0ZXJuIHVuc2lnbmVkIGxvbmcgaW5pdF9tZW1vcnlfbWFwcGluZyh1bnNpZ25lZCBsb25nIHN0YXJ0LAotCQkJCQkgdW5zaWduZWQgbG9uZyBlbmQpOwotZXh0ZXJuIHZvaWQgaW5pdG1lbV9pbml0KHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcpOwotZXh0ZXJuIHZvaWQgZnJlZV9pbml0bWVtKHZvaWQpOwogZXh0ZXJuIHZvaWQgc2V0dXBfYm9vdG1lbV9hbGxvY2F0b3Iodm9pZCk7CiAKICNlbmRpZgkvKiAhX19BU1NFTUJMWV9fICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYWdlXzY0X3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYWdlXzY0X3R5cGVzLmgKaW5kZXggZDM4YzkxYi4uOGQzODJkMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV82NF90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfNjRfdHlwZXMuaApAQCAtMzIsMjIgKzMyLDE0IEBACiAgKi8KICNkZWZpbmUgX19QQUdFX09GRlNFVCAgICAgICAgICAgX0FDKDB4ZmZmZjg4MDAwMDAwMDAwMCwgVUwpCiAKLSNkZWZpbmUgX19QSFlTSUNBTF9TVEFSVAlDT05GSUdfUEhZU0lDQUxfU1RBUlQKLSNkZWZpbmUgX19LRVJORUxfQUxJR04JCTB4MjAwMDAwCi0KLS8qCi0gKiBNYWtlIHN1cmUga2VybmVsIGlzIGFsaWduZWQgdG8gMk1CIGFkZHJlc3MuIENhdGNoaW5nIGl0IGF0IGNvbXBpbGUKLSAqIHRpbWUgaXMgYmV0dGVyLiBDaGFuZ2UgeW91ciBjb25maWcgZmlsZSBhbmQgY29tcGlsZSB0aGUga2VybmVsCi0gKiBmb3IgYSAyTUIgYWxpZ25lZCBhZGRyZXNzIChDT05GSUdfUEhZU0lDQUxfU1RBUlQpCi0gKi8KLSNpZiAoQ09ORklHX1BIWVNJQ0FMX1NUQVJUICUgX19LRVJORUxfQUxJR04pICE9IDAKLSNlcnJvciAiQ09ORklHX1BIWVNJQ0FMX1NUQVJUIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAyTUIiCi0jZW5kaWYKKyNkZWZpbmUgX19QSFlTSUNBTF9TVEFSVAkoKENPTkZJR19QSFlTSUNBTF9TVEFSVCArCSAJXAorCQkJCSAgKENPTkZJR19QSFlTSUNBTF9BTElHTiAtIDEpKSAmCVwKKwkJCQkgfihDT05GSUdfUEhZU0lDQUxfQUxJR04gLSAxKSkKIAogI2RlZmluZSBfX1NUQVJUX0tFUk5FTAkJKF9fU1RBUlRfS0VSTkVMX21hcCArIF9fUEhZU0lDQUxfU1RBUlQpCiAjZGVmaW5lIF9fU1RBUlRfS0VSTkVMX21hcAlfQUMoMHhmZmZmZmZmZjgwMDAwMDAwLCBVTCkKIAotLyogU2VlIERvY3VtZW50YXRpb24veDg2XzY0L21tLnR4dCBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgbWVtb3J5IG1hcC4gKi8KKy8qIFNlZSBEb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtZW1vcnkgbWFwLiAqLwogI2RlZmluZSBfX1BIWVNJQ0FMX01BU0tfU0hJRlQJNDYKICNkZWZpbmUgX19WSVJUVUFMX01BU0tfU0hJRlQJNDgKIApAQCAtNzEsMTIgKzYzLDYgQEAKIAogI2RlZmluZSB2bWVtbWFwICgoc3RydWN0IHBhZ2UgKilWTUVNTUFQX1NUQVJUKQogCi1leHRlcm4gdW5zaWduZWQgbG9uZyBpbml0X21lbW9yeV9tYXBwaW5nKHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCQkJCSB1bnNpZ25lZCBsb25nIGVuZCk7Ci0KLWV4dGVybiB2b2lkIGluaXRtZW1faW5pdCh1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKTsKLWV4dGVybiB2b2lkIGZyZWVfaW5pdG1lbSh2b2lkKTsKLQogZXh0ZXJuIHZvaWQgaW5pdF9leHRyYV9tYXBwaW5nX3VjKHVuc2lnbmVkIGxvbmcgcGh5cywgdW5zaWduZWQgbG9uZyBzaXplKTsKIGV4dGVybiB2b2lkIGluaXRfZXh0cmFfbWFwcGluZ193Yih1bnNpZ25lZCBsb25nIHBoeXMsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfdHlwZXMuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhZ2VfdHlwZXMuaAppbmRleCA4MjZhZDM3Li42NDczZjVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYWdlX3R5cGVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFnZV90eXBlcy5oCkBAIC00Niw2ICs0NiwxMiBAQAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm5fbWFwcGVkOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbWF4X3Bmbl9tYXBwZWQ7CiAKK2V4dGVybiB1bnNpZ25lZCBsb25nIGluaXRfbWVtb3J5X21hcHBpbmcodW5zaWduZWQgbG9uZyBzdGFydCwKKwkJCQkJIHVuc2lnbmVkIGxvbmcgZW5kKTsKKworZXh0ZXJuIHZvaWQgaW5pdG1lbV9pbml0KHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pOworZXh0ZXJuIHZvaWQgZnJlZV9pbml0bWVtKHZvaWQpOworCiAjZW5kaWYJLyogIV9fQVNTRU1CTFlfXyAqLwogCiAjZW5kaWYJLyogX0FTTV9YODZfUEFHRV9ERUZTX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wYXJhdmlydC5oCmluZGV4IGE1M2RhMDAuLjRmYjM3YzggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BhcmF2aXJ0LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGFyYXZpcnQuaApAQCAtNTYsNiArNTYsNyBAQAogc3RydWN0IHRzc19zdHJ1Y3Q7CiBzdHJ1Y3QgbW1fc3RydWN0Owogc3RydWN0IGRlc2Nfc3RydWN0Oworc3RydWN0IHRhc2tfc3RydWN0OwogCiAvKgogICogV3JhcHBlciB0eXBlIGZvciBwb2ludGVycyB0byBjb2RlIHdoaWNoIHVzZXMgdGhlIG5vbi1zdGFuZGFyZApAQCAtMjAzLDcgKzIwNCw4IEBACiAKIAl2b2lkICgqc3dhcGdzKSh2b2lkKTsKIAotCXN0cnVjdCBwdl9sYXp5X29wcyBsYXp5X21vZGU7CisJdm9pZCAoKnN0YXJ0X2NvbnRleHRfc3dpdGNoKShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYpOworCXZvaWQgKCplbmRfY29udGV4dF9zd2l0Y2gpKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCk7CiB9OwogCiBzdHJ1Y3QgcHZfaXJxX29wcyB7CkBAIC0xMzk5LDI1ICsxNDAxLDIzIEBACiB9OwogCiBlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSBwYXJhdmlydF9nZXRfbGF6eV9tb2RlKHZvaWQpOwotdm9pZCBwYXJhdmlydF9lbnRlcl9sYXp5X2NwdSh2b2lkKTsKLXZvaWQgcGFyYXZpcnRfbGVhdmVfbGF6eV9jcHUodm9pZCk7Cit2b2lkIHBhcmF2aXJ0X3N0YXJ0X2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldik7Cit2b2lkIHBhcmF2aXJ0X2VuZF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpOworCiB2b2lkIHBhcmF2aXJ0X2VudGVyX2xhenlfbW11KHZvaWQpOwogdm9pZCBwYXJhdmlydF9sZWF2ZV9sYXp5X21tdSh2b2lkKTsKLXZvaWQgcGFyYXZpcnRfbGVhdmVfbGF6eShlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSBtb2RlKTsKIAotI2RlZmluZSAgX19IQVZFX0FSQ0hfRU5URVJfTEFaWV9DUFVfTU9ERQotc3RhdGljIGlubGluZSB2b2lkIGFyY2hfZW50ZXJfbGF6eV9jcHVfbW9kZSh2b2lkKQorI2RlZmluZSAgX19IQVZFX0FSQ0hfU1RBUlRfQ09OVEVYVF9TV0lUQ0gKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX3N0YXJ0X2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKLQlQVk9QX1ZDQUxMMChwdl9jcHVfb3BzLmxhenlfbW9kZS5lbnRlcik7CisJUFZPUF9WQ0FMTDEocHZfY3B1X29wcy5zdGFydF9jb250ZXh0X3N3aXRjaCwgcHJldik7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2xlYXZlX2xhenlfY3B1X21vZGUodm9pZCkKK3N0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2VuZF9jb250ZXh0X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQpCiB7Ci0JUFZPUF9WQ0FMTDAocHZfY3B1X29wcy5sYXp5X21vZGUubGVhdmUpOworCVBWT1BfVkNBTEwxKHB2X2NwdV9vcHMuZW5kX2NvbnRleHRfc3dpdGNoLCBuZXh0KTsKIH0KIAotdm9pZCBhcmNoX2ZsdXNoX2xhenlfY3B1X21vZGUodm9pZCk7Ci0KICNkZWZpbmUgIF9fSEFWRV9BUkNIX0VOVEVSX0xBWllfTU1VX01PREUKIHN0YXRpYyBpbmxpbmUgdm9pZCBhcmNoX2VudGVyX2xhenlfbW11X21vZGUodm9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfY291bnRlci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGVyZl9jb3VudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2ZWQ5NwotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BlcmZfY291bnRlci5oCkBAIC0wLDAgKzEsMTAwIEBACisjaWZuZGVmIF9BU01fWDg2X1BFUkZfQ09VTlRFUl9ICisjZGVmaW5lIF9BU01fWDg2X1BFUkZfQ09VTlRFUl9ICisKKy8qCisgKiBQZXJmb3JtYW5jZSBjb3VudGVyIGh3IGRldGFpbHM6CisgKi8KKworI2RlZmluZSBYODZfUE1DX01BWF9HRU5FUklDCQkJCQk4CisjZGVmaW5lIFg4Nl9QTUNfTUFYX0ZJWEVECQkJCQkzCisKKyNkZWZpbmUgWDg2X1BNQ19JRFhfR0VORVJJQwkJCQkgICAgICAgIDAKKyNkZWZpbmUgWDg2X1BNQ19JRFhfRklYRUQJCQkJICAgICAgIDMyCisjZGVmaW5lIFg4Nl9QTUNfSURYX01BWAkJCQkJICAgICAgIDY0CisKKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMAkJCSAgICAgIDB4YzEKKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9QRVJGQ1RSMQkJCSAgICAgIDB4YzIKKworI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0VWRU5UU0VMMAkJCSAgICAgMHgxODYKKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9FVkVOVFNFTDEJCQkgICAgIDB4MTg3CisKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEUJCQkgICgxIDw8IDIyKQorI2RlZmluZSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfSU5UCQkJICAoMSA8PCAyMCkKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX09TCQkJICAoMSA8PCAxNykKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UU0VMX1VTUgkJCSAgKDEgPDwgMTYpCisKKy8qCisgKiBJbmNsdWRlcyBldmVudHNlbCBhbmQgdW5pdCBtYXNrIGFzIHdlbGw6CisgKi8KKyNkZWZpbmUgQVJDSF9QRVJGTU9OX0VWRU5UX01BU0sJCQkJICAgIDB4ZmZmZgorCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9VTkhBTFRFRF9DT1JFX0NZQ0xFU19TRUwJCSAgICAgIDB4M2MKKyNkZWZpbmUgQVJDSF9QRVJGTU9OX1VOSEFMVEVEX0NPUkVfQ1lDTEVTX1VNQVNLCQkoMHgwMCA8PCA4KQorI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfSU5ERVggCQkgMAorI2RlZmluZSBBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfUFJFU0VOVCBcCisJCSgxIDw8IChBUkNIX1BFUkZNT05fVU5IQUxURURfQ09SRV9DWUNMRVNfSU5ERVgpKQorCisjZGVmaW5lIEFSQ0hfUEVSRk1PTl9CUkFOQ0hfTUlTU0VTX1JFVElSRUQJCQkgNgorCisvKgorICogSW50ZWwgIkFyY2hpdGVjdHVyYWwgUGVyZm9ybWFuY2UgTW9uaXRvcmluZyIgQ1BVSUQKKyAqIGRldGVjdGlvbi9lbnVtZXJhdGlvbiBkZXRhaWxzOgorICovCit1bmlvbiBjcHVpZDEwX2VheCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IHZlcnNpb25faWQ6ODsKKwkJdW5zaWduZWQgaW50IG51bV9jb3VudGVyczo4OworCQl1bnNpZ25lZCBpbnQgYml0X3dpZHRoOjg7CisJCXVuc2lnbmVkIGludCBtYXNrX2xlbmd0aDo4OworCX0gc3BsaXQ7CisJdW5zaWduZWQgaW50IGZ1bGw7Cit9OworCit1bmlvbiBjcHVpZDEwX2VkeCB7CisJc3RydWN0IHsKKwkJdW5zaWduZWQgaW50IG51bV9jb3VudGVyc19maXhlZDo0OworCQl1bnNpZ25lZCBpbnQgcmVzZXJ2ZWQ6Mjg7CisJfSBzcGxpdDsKKwl1bnNpZ25lZCBpbnQgZnVsbDsKK307CisKKworLyoKKyAqIEZpeGVkLXB1cnBvc2UgcGVyZm9ybWFuY2UgY291bnRlcnM6CisgKi8KKworLyoKKyAqIEFsbCAzIGZpeGVkLW1vZGUgUE1DcyBhcmUgY29uZmlndXJlZCB2aWEgdGhpcyBzaW5nbGUgTVNSOgorICovCisjZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSX0NUUkwJCQkweDM4ZAorCisvKgorICogVGhlIGNvdW50cyBhcmUgYXZhaWxhYmxlIGluIHRocmVlIHNlcGFyYXRlIE1TUnM6CisgKi8KKworLyogSW5zdHJfUmV0aXJlZC5Bbnk6ICovCisjZGVmaW5lIE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSMAkJCTB4MzA5CisjZGVmaW5lIFg4Nl9QTUNfSURYX0ZJWEVEX0lOU1RSVUNUSU9OUwkJCShYODZfUE1DX0lEWF9GSVhFRCArIDApCisKKy8qIENQVV9DTEtfVW5oYWx0ZWQuQ29yZTogKi8KKyNkZWZpbmUgTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFIxCQkJMHgzMGEKKyNkZWZpbmUgWDg2X1BNQ19JRFhfRklYRURfQ1BVX0NZQ0xFUwkJCShYODZfUE1DX0lEWF9GSVhFRCArIDEpCisKKy8qIENQVV9DTEtfVW5oYWx0ZWQuUmVmOiAqLworI2RlZmluZSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUjIJCQkweDMwYgorI2RlZmluZSBYODZfUE1DX0lEWF9GSVhFRF9CVVNfQ1lDTEVTCQkJKFg4Nl9QTUNfSURYX0ZJWEVEICsgMikKKworZXh0ZXJuIHZvaWQgc2V0X3BlcmZfY291bnRlcl9wZW5kaW5nKHZvaWQpOworCisjZGVmaW5lIGNsZWFyX3BlcmZfY291bnRlcl9wZW5kaW5nKCkJZG8geyB9IHdoaWxlICgwKQorI2RlZmluZSB0ZXN0X3BlcmZfY291bnRlcl9wZW5kaW5nKCkJKDApCisKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworZXh0ZXJuIHZvaWQgaW5pdF9od19wZXJmX2NvdW50ZXJzKHZvaWQpOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyc19sYXBpY19pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2h3X3BlcmZfY291bnRlcnModm9pZCkJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcnNfbGFwaWNfaW5pdCh2b2lkKQl7IH0KKyNlbmRpZgorCisjZW5kaWYgLyogX0FTTV9YODZfUEVSRl9DT1VOVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGUuaAppbmRleCAyOWQ5NmQxLi4xOGVmN2ViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZS5oCkBAIC04MSw2ICs4MSw4IEBACiAjZGVmaW5lIHB0ZV92YWwoeCkJbmF0aXZlX3B0ZV92YWwoeCkKICNkZWZpbmUgX19wdGUoeCkJbmF0aXZlX21ha2VfcHRlKHgpCiAKKyNkZWZpbmUgYXJjaF9lbmRfY29udGV4dF9zd2l0Y2gocHJldikJZG8ge30gd2hpbGUoMCkKKwogI2VuZGlmCS8qIENPTkZJR19QQVJBVklSVCAqLwogCiAvKgpAQCAtNTAzLDYgKzUwNSw4IEBACiAKICNpZm5kZWYgX19BU1NFTUJMWV9fCiAKK2V4dGVybiBpbnQgZGlyZWN0X2dicGFnZXM7CisKIC8qIGxvY2FsIHB0ZSB1cGRhdGVzIG5lZWQgbm90IHVzZSB4Y2hnIGZvciBsb2NraW5nICovCiBzdGF0aWMgaW5saW5lIHB0ZV90IG5hdGl2ZV9sb2NhbF9wdGVwX2dldF9hbmRfY2xlYXIocHRlX3QgKnB0ZXApCiB7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0LmgKaW5kZXggNmI4N2JjNi4uYWJkZTMwOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjQuaApAQCAtMjUsMTAgKzI1LDYgQEAKIAogZXh0ZXJuIHZvaWQgcGFnaW5nX2luaXQodm9pZCk7CiAKLSNlbmRpZiAvKiAhX19BU1NFTUJMWV9fICovCi0KLSNpZm5kZWYgX19BU1NFTUJMWV9fCi0KICNkZWZpbmUgcHRlX0VSUk9SKGUpCQkJCQlcCiAJcHJpbnRrKCIlczolZDogYmFkIHB0ZSAlcCglMDE2bHgpLlxuIiwJCVwKIAkgICAgICAgX19GSUxFX18sIF9fTElORV9fLCAmKGUpLCBwdGVfdmFsKGUpKQpAQCAtMTM1LDggKzEzMSw2IEBACiAKICNkZWZpbmUgdXBkYXRlX21tdV9jYWNoZSh2bWEsIGFkZHJlc3MsIHB0ZSkgZG8geyB9IHdoaWxlICgwKQogCi1leHRlcm4gaW50IGRpcmVjdF9nYnBhZ2VzOwotCiAvKiBFbmNvZGUgYW5kIGRlLWNvZGUgYSBzd2FwIGVudHJ5ICovCiAjaWYgX1BBR0VfQklUX0ZJTEUgPCBfUEFHRV9CSVRfUFJPVE5PTkUKICNkZWZpbmUgU1dQX1RZUEVfQklUUyAoX1BBR0VfQklUX0ZJTEUgLSBfUEFHRV9CSVRfUFJFU0VOVCAtIDEpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0X3R5cGVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlXzY0X3R5cGVzLmgKaW5kZXggZmJmNDJiOC4uNzY2ZWExNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV82NF90eXBlcy5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfNjRfdHlwZXMuaApAQCAtNTEsMTEgKzUxLDExIEBACiAjZGVmaW5lIFBHRElSX1NJWkUJKF9BQygxLCBVTCkgPDwgUEdESVJfU0hJRlQpCiAjZGVmaW5lIFBHRElSX01BU0sJKH4oUEdESVJfU0laRSAtIDEpKQogCi0KKy8qIFNlZSBEb2N1bWVudGF0aW9uL3g4Ni94ODZfNjQvbW0udHh0IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBtZW1vcnkgbWFwLiAqLwogI2RlZmluZSBNQVhNRU0JCSBfQUMoX19BQygxLCBVTCkgPDwgTUFYX1BIWVNNRU1fQklUUywgVUwpCi0jZGVmaW5lIFZNQUxMT0NfU1RBUlQgICAgX0FDKDB4ZmZmZmMyMDAwMDAwMDAwMCwgVUwpCi0jZGVmaW5lIFZNQUxMT0NfRU5EICAgICAgX0FDKDB4ZmZmZmUxZmZmZmZmZmZmZiwgVUwpCi0jZGVmaW5lIFZNRU1NQVBfU1RBUlQJIF9BQygweGZmZmZlMjAwMDAwMDAwMDAsIFVMKQorI2RlZmluZSBWTUFMTE9DX1NUQVJUICAgIF9BQygweGZmZmZjOTAwMDAwMDAwMDAsIFVMKQorI2RlZmluZSBWTUFMTE9DX0VORCAgICAgIF9BQygweGZmZmZlOGZmZmZmZmZmZmYsIFVMKQorI2RlZmluZSBWTUVNTUFQX1NUQVJUCSBfQUMoMHhmZmZmZWEwMDAwMDAwMDAwLCBVTCkKICNkZWZpbmUgTU9EVUxFU19WQUREUiAgICBfQUMoMHhmZmZmZmZmZmEwMDAwMDAwLCBVTCkKICNkZWZpbmUgTU9EVUxFU19FTkQgICAgICBfQUMoMHhmZmZmZmZmZmZmMDAwMDAwLCBVTCkKICNkZWZpbmUgTU9EVUxFU19MRU4gICAoTU9EVUxFU19FTkQgLSBNT0RVTEVTX1ZBRERSKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcGd0YWJsZV90eXBlcy5oCmluZGV4IGI4MjM4ZGMuLjRkMjU4YWQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3BndGFibGVfdHlwZXMuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wZ3RhYmxlX3R5cGVzLmgKQEAgLTI3Myw3ICsyNzMsNiBAQAogCiBleHRlcm4gcHRldmFsX3QgX19zdXBwb3J0ZWRfcHRlX21hc2s7CiBleHRlcm4gaW50IG54X2VuYWJsZWQ7Ci1leHRlcm4gdm9pZCBzZXRfbngodm9pZCk7CiAKICNkZWZpbmUgcGdwcm90X3dyaXRlY29tYmluZQlwZ3Byb3Rfd3JpdGVjb21iaW5lCiBleHRlcm4gcGdwcm90X3QgcGdwcm90X3dyaXRlY29tYmluZShwZ3Byb3RfdCBwcm90KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3Byb2Nlc3Nvci5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKaW5kZXggYzJjY2VhZS4uYzc3NjgyNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcHJvY2Vzc29yLmgKQEAgLTEzNSw3ICsxMzUsOCBAQAogZXh0ZXJuIHN0cnVjdCBjcHVpbmZvX3g4NgluZXdfY3B1X2RhdGE7CiAKIGV4dGVybiBzdHJ1Y3QgdHNzX3N0cnVjdAlkb3VibGVmYXVsdF90c3M7Ci1leHRlcm4gX191MzIJCQljbGVhcmVkX2NwdV9jYXBzW05DQVBJTlRTXTsKK2V4dGVybiBfX3UzMgkJCWNwdV9jYXBzX2NsZWFyZWRbTkNBUElOVFNdOworZXh0ZXJuIF9fdTMyCQkJY3B1X2NhcHNfc2V0W05DQVBJTlRTXTsKIAogI2lmZGVmIENPTkZJR19TTVAKIERFQ0xBUkVfUEVSX0NQVV9TSEFSRURfQUxJR05FRChzdHJ1Y3QgY3B1aW5mb194ODYsIGNwdV9pbmZvKTsKQEAgLTQwOSw5ICs0MTAsNiBAQAogZXh0ZXJuIHVuc2lnbmVkIGludCB4c3RhdGVfc2l6ZTsKIGV4dGVybiB2b2lkIGZyZWVfdGhyZWFkX3hzdGF0ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CiBleHRlcm4gc3RydWN0IGttZW1fY2FjaGUgKnRhc2tfeHN0YXRlX2NhY2hlcDsKLWV4dGVybiB2b2lkIGluaXRfc2NhdHRlcmVkX2NwdWlkX2ZlYXR1cmVzKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7Ci1leHRlcm4gdW5zaWduZWQgaW50IGluaXRfaW50ZWxfY2FjaGVpbmZvKHN0cnVjdCBjcHVpbmZvX3g4NiAqYyk7Ci1leHRlcm4gdW5zaWduZWQgc2hvcnQgbnVtX2NhY2hlX2xlYXZlczsKIAogc3RydWN0IHRocmVhZF9zdHJ1Y3QgewogCS8qIENhY2hlZCBUTFMgZGVzY3JpcHRvcnM6ICovCkBAIC00MjcsOCArNDI1LDEyIEBACiAJdW5zaWduZWQgc2hvcnQJCWZzaW5kZXg7CiAJdW5zaWduZWQgc2hvcnQJCWdzaW5kZXg7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2XzMyCiAJdW5zaWduZWQgbG9uZwkJaXA7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2XzY0CiAJdW5zaWduZWQgbG9uZwkJZnM7CisjZW5kaWYKIAl1bnNpZ25lZCBsb25nCQlnczsKIAkvKiBIYXJkd2FyZSBkZWJ1Z2dpbmcgcmVnaXN0ZXJzOiAqLwogCXVuc2lnbmVkIGxvbmcJCWRlYnVncmVnMDsKQEAgLTQ2MCwxNCArNDYyLDggQEAKIAl1bnNpZ25lZAkJaW9fYml0bWFwX21heDsKIC8qIE1TUl9JQTMyX0RFQlVHQ1RMTVNSIHZhbHVlIHRvIHN3aXRjaCBpbiBpZiBUSUZfREVCVUdDVExNU1IgaXMgc2V0LiAgKi8KIAl1bnNpZ25lZCBsb25nCWRlYnVnY3RsbXNyOwotI2lmZGVmIENPTkZJR19YODZfRFMKLS8qIERlYnVnIFN0b3JlIGNvbnRleHQ7IHNlZSBpbmNsdWRlL2FzbS14ODYvZHMuaDsgZ29lcyBpbnRvIE1TUl9JQTMyX0RTX0FSRUEgKi8KKwkvKiBEZWJ1ZyBTdG9yZSBjb250ZXh0OyBzZWUgYXNtL2RzLmggKi8KIAlzdHJ1Y3QgZHNfY29udGV4dAkqZHNfY3R4OwotI2VuZGlmIC8qIENPTkZJR19YODZfRFMgKi8KLSNpZmRlZiBDT05GSUdfWDg2X1BUUkFDRV9CVFMKLS8qIHRoZSBzaWduYWwgdG8gc2VuZCBvbiBhIGJ0cyBidWZmZXIgb3ZlcmZsb3cgKi8KLQl1bnNpZ25lZCBpbnQJYnRzX292Zmxfc2lnbmFsOwotI2VuZGlmIC8qIENPTkZJR19YODZfUFRSQUNFX0JUUyAqLwogfTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIG5hdGl2ZV9nZXRfZGVidWdyZWcoaW50IHJlZ25vKQpAQCAtNzk1LDYgKzc5MSwyMSBAQAogICAgIHJldHVybiBkZWJ1Z2N0bG1zcjsKIH0KIAorc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldF9kZWJ1Z2N0bG1zcl9vbl9jcHUoaW50IGNwdSkKK3sKKwl1NjQgZGVidWdjdGxtc3IgPSAwOworCXUzMiB2YWwxLCB2YWwyOworCisjaWZuZGVmIENPTkZJR19YODZfREVCVUdDVExNU1IKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPCA2KQorCQlyZXR1cm4gMDsKKyNlbmRpZgorCXJkbXNyX29uX2NwdShjcHUsIE1TUl9JQTMyX0RFQlVHQ1RMTVNSLCAmdmFsMSwgJnZhbDIpOworCWRlYnVnY3RsbXNyID0gdmFsMSB8ICgodTY0KXZhbDIgPDwgMzIpOworCisJcmV0dXJuIGRlYnVnY3RsbXNyOworfQorCiBzdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX2RlYnVnY3RsbXNyKHVuc2lnbmVkIGxvbmcgZGVidWdjdGxtc3IpCiB7CiAjaWZuZGVmIENPTkZJR19YODZfREVCVUdDVExNU1IKQEAgLTgwNCw2ICs4MTUsMTggQEAKIAl3cm1zcmwoTVNSX0lBMzJfREVCVUdDVExNU1IsIGRlYnVnY3RsbXNyKTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV9kZWJ1Z2N0bG1zcl9vbl9jcHUoaW50IGNwdSwKKwkJCQkJICAgICB1bnNpZ25lZCBsb25nIGRlYnVnY3RsbXNyKQoreworI2lmbmRlZiBDT05GSUdfWDg2X0RFQlVHQ1RMTVNSCisJaWYgKGJvb3RfY3B1X2RhdGEueDg2IDwgNikKKwkJcmV0dXJuOworI2VuZGlmCisJd3Jtc3Jfb25fY3B1KGNwdSwgTVNSX0lBMzJfREVCVUdDVExNU1IsCisJCSAgICAgKHUzMikoKHU2NClkZWJ1Z2N0bG1zciksCisJCSAgICAgKHUzMikoKHU2NClkZWJ1Z2N0bG1zciA+PiAzMikpOworfQorCiAvKgogICogZnJvbSBzeXN0ZW0gZGVzY3JpcHRpb24gdGFibGUgaW4gQklPUy4gTW9zdGx5IGZvciBNQ0EgdXNlLCBidXQKICAqIG90aGVycyBtYXkgZmluZCBpdCB1c2VmdWw6CkBAIC04MTQsNiArODM3LDcgQEAKIAogLyogQm9vdCBsb2FkZXIgdHlwZSBmcm9tIHRoZSBzZXR1cCBoZWFkZXI6ICovCiBleHRlcm4gaW50CQkJYm9vdGxvYWRlcl90eXBlOworZXh0ZXJuIGludAkJCWJvb3Rsb2FkZXJfdmVyc2lvbjsKIAogZXh0ZXJuIGNoYXIJCQlpZ25vcmVfZnB1X2lycTsKIApAQCAtODc0LDcgKzg5OCw2IEBACiAJLnZtODZfaW5mbwkJPSBOVUxMLAkJCQkJICBcCiAJLnN5c2VudGVyX2NzCQk9IF9fS0VSTkVMX0NTLAkJCQkgIFwKIAkuaW9fYml0bWFwX3B0cgkJPSBOVUxMLAkJCQkJICBcCi0JLmZzCQkJPSBfX0tFUk5FTF9QRVJDUFUsCQkJICBcCiB9CiAKIC8qCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9wdHJhY2UuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B0cmFjZS5oCmluZGV4IDYyNGYxMzMuLjBmMGQ5MDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B0cmFjZS5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3B0cmFjZS5oCkBAIC0yMzYsMTIgKzIzNiwxMSBAQAogZXh0ZXJuIGludCBkb19zZXRfdGhyZWFkX2FyZWEoc3RydWN0IHRhc2tfc3RydWN0ICpwLCBpbnQgaWR4LAogCQkJICAgICAgc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKmluZm8sIGludCBjYW5fYWxsb2NhdGUpOwogCi1leHRlcm4gdm9pZCB4ODZfcHRyYWNlX3VudHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICopOwotZXh0ZXJuIHZvaWQgeDg2X3B0cmFjZV9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCi0JCQkgICAgdW5zaWduZWQgbG9uZyBjbG9uZV9mbGFncyk7CisjaWZkZWYgQ09ORklHX1g4Nl9QVFJBQ0VfQlRTCitleHRlcm4gdm9pZCBwdHJhY2VfYnRzX3VudHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOwogCi0jZGVmaW5lIGFyY2hfcHRyYWNlX3VudHJhY2UodHNrKSB4ODZfcHRyYWNlX3VudHJhY2UodHNrKQotI2RlZmluZSBhcmNoX3B0cmFjZV9mb3JrKGNoaWxkLCBmbGFncykgeDg2X3B0cmFjZV9mb3JrKGNoaWxkLCBmbGFncykKKyNkZWZpbmUgYXJjaF9wdHJhY2VfdW50cmFjZSh0c2spCXB0cmFjZV9idHNfdW50cmFjZSh0c2spCisjZW5kaWYgLyogQ09ORklHX1g4Nl9QVFJBQ0VfQlRTICovCiAKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3JlcXVpcmVkLWZlYXR1cmVzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9yZXF1aXJlZC1mZWF0dXJlcy5oCmluZGV4IGE0NzM3ZGQuLjY0Y2YyZDIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3JlcXVpcmVkLWZlYXR1cmVzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vcmVxdWlyZWQtZmVhdHVyZXMuaApAQCAtNDgsOSArNDgsMTUgQEAKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAorI2lmZGVmIENPTkZJR19QQVJBVklSVAorLyogUGFyYXZpcnR1YWxpemVkIHN5c3RlbXMgbWF5IG5vdCBoYXZlIFBTRSBvciBQR0UgYXZhaWxhYmxlICovCiAjZGVmaW5lIE5FRURfUFNFCTAKLSNkZWZpbmUgTkVFRF9NU1IJKDE8PChYODZfRkVBVFVSRV9NU1IgJiAzMSkpCiAjZGVmaW5lIE5FRURfUEdFCTAKKyNlbHNlCisjZGVmaW5lIE5FRURfUFNFCSgxPDwoWDg2X0ZFQVRVUkVfUFNFKSAmIDMxKQorI2RlZmluZSBORUVEX1BHRQkoMTw8KFg4Nl9GRUFUVVJFX1BHRSkgJiAzMSkKKyNlbmRpZgorI2RlZmluZSBORUVEX01TUgkoMTw8KFg4Nl9GRUFUVVJFX01TUiAmIDMxKSkKICNkZWZpbmUgTkVFRF9GWFNSCSgxPDwoWDg2X0ZFQVRVUkVfRlhTUiAmIDMxKSkKICNkZWZpbmUgTkVFRF9YTU0JKDE8PChYODZfRkVBVFVSRV9YTU0gJiAzMSkpCiAjZGVmaW5lIE5FRURfWE1NMgkoMTw8KFg4Nl9GRUFUVVJFX1hNTTIgJiAzMSkpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc2V0dXAuaAppbmRleCBiZGMyYWRhLi40MDkzZDFlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zZXR1cC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NldHVwLmgKQEAgLTMzLDcgKzMzLDYgQEAKIAlpbnQgKCpzZXR1cF9pb2FwaWNfaWRzKSh2b2lkKTsKIH07CiAKLWV4dGVybiB2b2lkIHg4Nl9xdWlya19wcmVfaW50cl9pbml0KHZvaWQpOwogZXh0ZXJuIHZvaWQgeDg2X3F1aXJrX2ludHJfaW5pdCh2b2lkKTsKIAogZXh0ZXJuIHZvaWQgeDg2X3F1aXJrX3RyYXBfaW5pdCh2b2lkKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3NtcC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKaW5kZXggMTllMGQ4OC4uNmE4NGVkMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc21wLmgKQEAgLTE4MCw3ICsxODAsNyBAQAogc3RhdGljIGlubGluZSBpbnQgbG9naWNhbF9zbXBfcHJvY2Vzc29yX2lkKHZvaWQpCiB7CiAJLyogd2UgZG9uJ3Qgd2FudCB0byBtYXJrIHRoaXMgYWNjZXNzIHZvbGF0aWxlIC0gYmFkIGNvZGUgZ2VuZXJhdGlvbiAqLwotCXJldHVybiBHRVRfQVBJQ19MT0dJQ0FMX0lEKCoodTMyICopKEFQSUNfQkFTRSArIEFQSUNfTERSKSk7CisJcmV0dXJuIEdFVF9BUElDX0xPR0lDQUxfSUQoYXBpY19yZWFkKEFQSUNfTERSKSk7CiB9CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vc3BhcnNlbWVtLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaAppbmRleCBlM2NjM2MwLi40NTE3ZDZiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zcGFyc2VtZW0uaApAQCAtMjcsNyArMjcsNyBAQAogI2Vsc2UgLyogQ09ORklHX1g4Nl8zMiAqLwogIyBkZWZpbmUgU0VDVElPTl9TSVpFX0JJVFMJMjcgLyogbWF0dCAtIDEyOCBpcyBjb252ZW5pZW50IHJpZ2h0IG5vdyAqLwogIyBkZWZpbmUgTUFYX1BIWVNBRERSX0JJVFMJNDQKLSMgZGVmaW5lIE1BWF9QSFlTTUVNX0JJVFMJNDQgLyogQ2FuIGJlIG1heCA0NSBiaXRzICovCisjIGRlZmluZSBNQVhfUEhZU01FTV9CSVRTCTQ2CiAjZW5kaWYKIAogI2VuZGlmIC8qIENPTkZJR19TUEFSU0VNRU0gKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGxzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS9zeXNjYWxscy5oCmluZGV4IDcwNDM0MDguLjM3MmI3NmUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3N5c2NhbGxzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vc3lzY2FsbHMuaApAQCAtMSw3ICsxLDcgQEAKIC8qCiAgKiBzeXNjYWxscy5oIC0gTGludXggc3lzY2FsbCBpbnRlcmZhY2VzIChhcmNoLXNwZWNpZmljKQogICoKLSAqIENvcHlyaWdodCAoYykgMjAwOCBKYXN3aW5kZXIgU2luZ2gKKyAqIENvcHlyaWdodCAoYykgMjAwOCBKYXN3aW5kZXIgU2luZ2ggUmFqcHV0CiAgKgogICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSBHUEx2Mi4KICAqIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGZvciBtb3JlIGRldGFpbHMuCkBAIC0xMiw1MCArMTIsNTUgQEAKIAogI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+CiAjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgotI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KIAogLyogQ29tbW9uIGluIFg4Nl8zMiBhbmQgWDg2XzY0ICovCiAvKiBrZXJuZWwvaW9wb3J0LmMgKi8KIGFzbWxpbmthZ2UgbG9uZyBzeXNfaW9wZXJtKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIGludCk7CiAKKy8qIGtlcm5lbC9wcm9jZXNzLmMgKi8KK2ludCBzeXNfZm9yayhzdHJ1Y3QgcHRfcmVncyAqKTsKK2ludCBzeXNfdmZvcmsoc3RydWN0IHB0X3JlZ3MgKik7CisKIC8qIGtlcm5lbC9sZHQuYyAqLwogYXNtbGlua2FnZSBpbnQgc3lzX21vZGlmeV9sZHQoaW50LCB2b2lkIF9fdXNlciAqLCB1bnNpZ25lZCBsb25nKTsKIAorLyoga2VybmVsL3NpZ25hbC5jICovCitsb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKik7CisKIC8qIGtlcm5lbC90bHMuYyAqLwogYXNtbGlua2FnZSBpbnQgc3lzX3NldF90aHJlYWRfYXJlYShzdHJ1Y3QgdXNlcl9kZXNjIF9fdXNlciAqKTsKIGFzbWxpbmthZ2UgaW50IHN5c19nZXRfdGhyZWFkX2FyZWEoc3RydWN0IHVzZXJfZGVzYyBfX3VzZXIgKik7CiAKIC8qIFg4Nl8zMiBvbmx5ICovCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgorLyoga2VybmVsL2lvcG9ydC5jICovCitsb25nIHN5c19pb3BsKHN0cnVjdCBwdF9yZWdzICopOworCiAvKiBrZXJuZWwvcHJvY2Vzc18zMi5jICovCi1pbnQgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MgKik7CiBpbnQgc3lzX2Nsb25lKHN0cnVjdCBwdF9yZWdzICopOwotaW50IHN5c192Zm9yayhzdHJ1Y3QgcHRfcmVncyAqKTsKIGludCBzeXNfZXhlY3ZlKHN0cnVjdCBwdF9yZWdzICopOwogCi0vKiBrZXJuZWwvc2lnbmFsXzMyLmMgKi8KKy8qIGtlcm5lbC9zaWduYWwuYyAqLwogYXNtbGlua2FnZSBpbnQgc3lzX3NpZ3N1c3BlbmQoaW50LCBpbnQsIG9sZF9zaWdzZXRfdCk7CiBhc21saW5rYWdlIGludCBzeXNfc2lnYWN0aW9uKGludCwgY29uc3Qgc3RydWN0IG9sZF9zaWdhY3Rpb24gX191c2VyICosCiAJCQkgICAgIHN0cnVjdCBvbGRfc2lnYWN0aW9uIF9fdXNlciAqKTsKIGludCBzeXNfc2lnYWx0c3RhY2soc3RydWN0IHB0X3JlZ3MgKik7CiB1bnNpZ25lZCBsb25nIHN5c19zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKik7Ci1sb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKik7Ci0KLS8qIGtlcm5lbC9pb3BvcnQuYyAqLwotbG9uZyBzeXNfaW9wbChzdHJ1Y3QgcHRfcmVncyAqKTsKIAogLyoga2VybmVsL3N5c19pMzg2XzMyLmMgKi8KK3N0cnVjdCBtbWFwX2FyZ19zdHJ1Y3Q7CitzdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3Q7CitzdHJ1Y3Qgb2xkb2xkX3V0c25hbWU7CitzdHJ1Y3Qgb2xkX3V0c25hbWU7CisKIGFzbWxpbmthZ2UgbG9uZyBzeXNfbW1hcDIodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywKIAkJCSAgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci1zdHJ1Y3QgbW1hcF9hcmdfc3RydWN0OwogYXNtbGlua2FnZSBpbnQgb2xkX21tYXAoc3RydWN0IG1tYXBfYXJnX3N0cnVjdCBfX3VzZXIgKik7Ci1zdHJ1Y3Qgc2VsX2FyZ19zdHJ1Y3Q7CiBhc21saW5rYWdlIGludCBvbGRfc2VsZWN0KHN0cnVjdCBzZWxfYXJnX3N0cnVjdCBfX3VzZXIgKik7CiBhc21saW5rYWdlIGludCBzeXNfaXBjKHVpbnQsIGludCwgaW50LCBpbnQsIHZvaWQgX191c2VyICosIGxvbmcpOwotc3RydWN0IG9sZF91dHNuYW1lOwogYXNtbGlua2FnZSBpbnQgc3lzX3VuYW1lKHN0cnVjdCBvbGRfdXRzbmFtZSBfX3VzZXIgKik7Ci1zdHJ1Y3Qgb2xkb2xkX3V0c25hbWU7CiBhc21saW5rYWdlIGludCBzeXNfb2xkdW5hbWUoc3RydWN0IG9sZG9sZF91dHNuYW1lIF9fdXNlciAqKTsKIAogLyoga2VybmVsL3ZtODZfMzIuYyAqLwpAQCAtNjUsMjkgKzcwLDI3IEBACiAjZWxzZSAvKiBDT05GSUdfWDg2XzMyICovCiAKIC8qIFg4Nl82NCBvbmx5ICovCisvKiBrZXJuZWwvaW9wb3J0LmMgKi8KK2FzbWxpbmthZ2UgbG9uZyBzeXNfaW9wbCh1bnNpZ25lZCBpbnQsIHN0cnVjdCBwdF9yZWdzICopOworCiAvKiBrZXJuZWwvcHJvY2Vzc182NC5jICovCi1hc21saW5rYWdlIGxvbmcgc3lzX2Zvcmsoc3RydWN0IHB0X3JlZ3MgKik7CiBhc21saW5rYWdlIGxvbmcgc3lzX2Nsb25lKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCiAJCQkgIHZvaWQgX191c2VyICosIHZvaWQgX191c2VyICosCiAJCQkgIHN0cnVjdCBwdF9yZWdzICopOwotYXNtbGlua2FnZSBsb25nIHN5c192Zm9yayhzdHJ1Y3QgcHRfcmVncyAqKTsKIGFzbWxpbmthZ2UgbG9uZyBzeXNfZXhlY3ZlKGNoYXIgX191c2VyICosIGNoYXIgX191c2VyICogX191c2VyICosCiAJCQkgICBjaGFyIF9fdXNlciAqIF9fdXNlciAqLAogCQkJICAgc3RydWN0IHB0X3JlZ3MgKik7CiBsb25nIHN5c19hcmNoX3ByY3RsKGludCwgdW5zaWduZWQgbG9uZyk7CiAKLS8qIGtlcm5lbC9pb3BvcnQuYyAqLwotYXNtbGlua2FnZSBsb25nIHN5c19pb3BsKHVuc2lnbmVkIGludCwgc3RydWN0IHB0X3JlZ3MgKik7Ci0KLS8qIGtlcm5lbC9zaWduYWxfNjQuYyAqLworLyoga2VybmVsL3NpZ25hbC5jICovCiBhc21saW5rYWdlIGxvbmcgc3lzX3NpZ2FsdHN0YWNrKGNvbnN0IHN0YWNrX3QgX191c2VyICosIHN0YWNrX3QgX191c2VyICosCiAJCQkJc3RydWN0IHB0X3JlZ3MgKik7Ci1sb25nIHN5c19ydF9zaWdyZXR1cm4oc3RydWN0IHB0X3JlZ3MgKik7CiAKIC8qIGtlcm5lbC9zeXNfeDg2XzY0LmMgKi8KK3N0cnVjdCBuZXdfdXRzbmFtZTsKKwogYXNtbGlua2FnZSBsb25nIHN5c19tbWFwKHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsIHVuc2lnbmVkIGxvbmcsCiAJCQkgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZyk7Ci1zdHJ1Y3QgbmV3X3V0c25hbWU7CiBhc21saW5rYWdlIGxvbmcgc3lzX3VuYW1lKHN0cnVjdCBuZXdfdXRzbmFtZSBfX3VzZXIgKik7CiAKICNlbmRpZiAvKiBDT05GSUdfWDg2XzMyICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGhyZWFkX2luZm8uaAppbmRleCA4ODIwYTczLi42MDJjNzY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90aHJlYWRfaW5mby5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RocmVhZF9pbmZvLmgKQEAgLTk0LDcgKzk0LDggQEAKICNkZWZpbmUgVElGX0ZPUkNFRF9URgkJMjQJLyogdHJ1ZSBpZiBURiBpbiBlZmxhZ3MgYXJ0aWZpY2lhbGx5ICovCiAjZGVmaW5lIFRJRl9ERUJVR0NUTE1TUgkJMjUJLyogdXNlcyB0aHJlYWRfc3RydWN0LmRlYnVnY3RsbXNyICovCiAjZGVmaW5lIFRJRl9EU19BUkVBX01TUgkJMjYgICAgICAvKiB1c2VzIHRocmVhZF9zdHJ1Y3QuZHNfYXJlYV9tc3IgKi8KLSNkZWZpbmUgVElGX1NZU0NBTExfRlRSQUNFCTI3CS8qIGZvciBmdHJhY2Ugc3lzY2FsbCBpbnN0cnVtZW50YXRpb24gKi8KKyNkZWZpbmUgVElGX0xBWllfTU1VX1VQREFURVMJMjcJLyogdGFzayBpcyB1cGRhdGluZyB0aGUgbW11IGxhemlseSAqLworI2RlZmluZSBUSUZfU1lTQ0FMTF9GVFJBQ0UJMjgJLyogZm9yIGZ0cmFjZSBzeXNjYWxsIGluc3RydW1lbnRhdGlvbiAqLwogCiAjZGVmaW5lIF9USUZfU1lTQ0FMTF9UUkFDRQkoMSA8PCBUSUZfU1lTQ0FMTF9UUkFDRSkKICNkZWZpbmUgX1RJRl9OT1RJRllfUkVTVU1FCSgxIDw8IFRJRl9OT1RJRllfUkVTVU1FKQpAQCAtMTE2LDYgKzExNyw3IEBACiAjZGVmaW5lIF9USUZfRk9SQ0VEX1RGCQkoMSA8PCBUSUZfRk9SQ0VEX1RGKQogI2RlZmluZSBfVElGX0RFQlVHQ1RMTVNSCSgxIDw8IFRJRl9ERUJVR0NUTE1TUikKICNkZWZpbmUgX1RJRl9EU19BUkVBX01TUgkoMSA8PCBUSUZfRFNfQVJFQV9NU1IpCisjZGVmaW5lIF9USUZfTEFaWV9NTVVfVVBEQVRFUwkoMSA8PCBUSUZfTEFaWV9NTVVfVVBEQVRFUykKICNkZWZpbmUgX1RJRl9TWVNDQUxMX0ZUUkFDRQkoMSA8PCBUSUZfU1lTQ0FMTF9GVFJBQ0UpCiAKIC8qIHdvcmsgdG8gZG8gaW4gc3lzY2FsbF90cmFjZV9lbnRlcigpICovCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90bGJmbHVzaC5oIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdGxiZmx1c2guaAppbmRleCAxNmE1Yzg0Li5hNWVjYzljIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90bGJmbHVzaC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RsYmZsdXNoLmgKQEAgLTE3LDcgKzE3LDcgQEAKIAogc3RhdGljIGlubGluZSB2b2lkIF9fbmF0aXZlX2ZsdXNoX3RsYih2b2lkKQogewotCXdyaXRlX2NyMyhyZWFkX2NyMygpKTsKKwluYXRpdmVfd3JpdGVfY3IzKG5hdGl2ZV9yZWFkX2NyMygpKTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIF9fbmF0aXZlX2ZsdXNoX3RsYl9nbG9iYWwodm9pZCkKQEAgLTMyLDExICszMiwxMSBAQAogCSAqLwogCXJhd19sb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAKLQljcjQgPSByZWFkX2NyNCgpOworCWNyNCA9IG5hdGl2ZV9yZWFkX2NyNCgpOwogCS8qIGNsZWFyIFBHRSAqLwotCXdyaXRlX2NyNChjcjQgJiB+WDg2X0NSNF9QR0UpOworCW5hdGl2ZV93cml0ZV9jcjQoY3I0ICYgflg4Nl9DUjRfUEdFKTsKIAkvKiB3cml0ZSBvbGQgUEdFIGFnYWluIGFuZCBmbHVzaCBUTEJzICovCi0Jd3JpdGVfY3I0KGNyNCk7CisJbmF0aXZlX3dyaXRlX2NyNChjcjQpOwogCiAJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90b3BvbG9neS5oCmluZGV4IGY0NGI0OWEuLjA2NmVmNTkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RvcG9sb2d5LmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdG9wb2xvZ3kuaApAQCAtMjAzLDcgKzIwMyw4IEBACiB2b2lkIHg4Nl9wY2lfcm9vdF9idXNfcmVzX3F1aXJrcyhzdHJ1Y3QgcGNpX2J1cyAqYik7CiAKICNpZmRlZiBDT05GSUdfU01QCi0jZGVmaW5lIG1jX2NhcGFibGUoKQkoY3B1bWFza193ZWlnaHQoY3B1X2NvcmVfbWFzaygwKSkgIT0gbnJfY3B1X2lkcykKKyNkZWZpbmUgbWNfY2FwYWJsZSgpCSgoYm9vdF9jcHVfZGF0YS54ODZfbWF4X2NvcmVzID4gMSkgJiYgXAorCQkJKGNwdW1hc2tfd2VpZ2h0KGNwdV9jb3JlX21hc2soMCkpICE9IG5yX2NwdV9pZHMpKQogI2RlZmluZSBzbXRfY2FwYWJsZSgpCQkJKHNtcF9udW1fc2libGluZ3MgPiAxKQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS90cmFwcy5oCmluZGV4IDBkNTM0MjUuLmJmZDc0YzAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3RyYXBzLmgKKysrIGIvYXJjaC94ODYvaW5jbHVkZS9hc20vdHJhcHMuaApAQCAtMiw2ICsyLDcgQEAKICNkZWZpbmUgX0FTTV9YODZfVFJBUFNfSAogCiAjaW5jbHVkZSA8YXNtL2RlYnVncmVnLmg+CisjaW5jbHVkZSA8YXNtL3NpZ2luZm8uaD4JCQkvKiBUUkFQX1RSQUNFLCAuLi4gKi8KIAogI2lmZGVmIENPTkZJR19YODZfMzIKICNkZWZpbmUgZG90cmFwbGlua2FnZQpAQCAtMTMsNiArMTQsOSBAQAogYXNtbGlua2FnZSB2b2lkIGRlYnVnKHZvaWQpOwogYXNtbGlua2FnZSB2b2lkIG5taSh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBpbnQzKHZvaWQpOworYXNtbGlua2FnZSB2b2lkIHhlbl9kZWJ1Zyh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCB4ZW5faW50Myh2b2lkKTsKK2FzbWxpbmthZ2Ugdm9pZCB4ZW5fc3RhY2tfc2VnbWVudCh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBvdmVyZmxvdyh2b2lkKTsKIGFzbWxpbmthZ2Ugdm9pZCBib3VuZHModm9pZCk7CiBhc21saW5rYWdlIHZvaWQgaW52YWxpZF9vcCh2b2lkKTsKQEAgLTc0LDcgKzc4LDYgQEAKIH0KIAogZXh0ZXJuIGludCBwYW5pY19vbl91bnJlY292ZXJlZF9ubWk7Ci1leHRlcm4gaW50IGtzdGFja19kZXB0aF90b19wcmludDsKIAogdm9pZCBtYXRoX2Vycm9yKHZvaWQgX191c2VyICopOwogdm9pZCBtYXRoX2VtdWxhdGUoc3RydWN0IG1hdGhfZW11X2luZm8gKik7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZF8zMi5oCmluZGV4IDZlNzJkNzQuLjczMmEzMDcwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfMzIuaApAQCAtMzQwLDYgKzM0MCw4IEBACiAjZGVmaW5lIF9fTlJfaW5vdGlmeV9pbml0MQkzMzIKICNkZWZpbmUgX19OUl9wcmVhZHYJCTMzMwogI2RlZmluZSBfX05SX3B3cml0ZXYJCTMzNAorI2RlZmluZSBfX05SX3J0X3Rnc2lncXVldWVpbmZvCTMzNQorI2RlZmluZSBfX05SX3BlcmZfY291bnRlcl9vcGVuCTMzNgogCiAjaWZkZWYgX19LRVJORUxfXwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGRfNjQuaCBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oCmluZGV4IGY4MTgyOTQuLjkwMGUxNjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oCisrKyBiL2FyY2gveDg2L2luY2x1ZGUvYXNtL3VuaXN0ZF82NC5oCkBAIC02NTcsNyArNjU3LDEwIEBACiBfX1NZU0NBTEwoX19OUl9wcmVhZHYsIHN5c19wcmVhZHYpCiAjZGVmaW5lIF9fTlJfcHdyaXRldgkJCQkyOTYKIF9fU1lTQ0FMTChfX05SX3B3cml0ZXYsIHN5c19wd3JpdGV2KQotCisjZGVmaW5lIF9fTlJfcnRfdGdzaWdxdWV1ZWluZm8JCQkyOTcKK19fU1lTQ0FMTChfX05SX3J0X3Rnc2lncXVldWVpbmZvLCBzeXNfcnRfdGdzaWdxdWV1ZWluZm8pCisjZGVmaW5lIF9fTlJfcGVyZl9jb3VudGVyX29wZW4JCQkyOTgKK19fU1lTQ0FMTChfX05SX3BlcmZfY291bnRlcl9vcGVuLCBzeXNfcGVyZl9jb3VudGVyX29wZW4pCiAKICNpZm5kZWYgX19OT19TVFVCUwogI2RlZmluZSBfX0FSQ0hfV0FOVF9PTERfUkVBRERJUgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfYmF1LmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaAppbmRleCA5YjBlNjFiLi5iZGRkNDRmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9iYXUuaApAQCAtMzcsNyArMzcsNyBAQAogI2RlZmluZSBVVl9DUFVTX1BFUl9BQ1RfU1RBVFVTCQkzMgogI2RlZmluZSBVVl9BQ1RfU1RBVFVTX01BU0sJCTB4MwogI2RlZmluZSBVVl9BQ1RfU1RBVFVTX1NJWkUJCTIKLSNkZWZpbmUgVVZfQUNUSVZBVElPTl9ERVNDUklQVE9SX1NJWkUJMzIKKyNkZWZpbmUgVVZfQURQX1NJWkUJCQkzMgogI2RlZmluZSBVVl9ESVNUUklCVVRJT05fU0laRQkJMjU2CiAjZGVmaW5lIFVWX1NXX0FDS19OUEVORElORwkJOAogI2RlZmluZSBVVl9ORVRfRU5EUE9JTlRfSU5URAkJMHgzOApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvaW5jbHVkZS9hc20vdXYvdXZfaHViLmggYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9odWIuaAppbmRleCBkM2E5OGVhLi4zNDEwNzBmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9odWIuaAorKysgYi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91di91dl9odWIuaApAQCAtMTMzLDYgKzEzMyw3IEBACiBzdHJ1Y3QgdXZfaHViX2luZm9fcyB7CiAJdW5zaWduZWQgbG9uZwkJZ2xvYmFsX21tcl9iYXNlOwogCXVuc2lnbmVkIGxvbmcJCWdwYV9tYXNrOworCXVuc2lnbmVkIGludAkJZ25vZGVfZXh0cmE7CiAJdW5zaWduZWQgbG9uZwkJZ25vZGVfdXBwZXI7CiAJdW5zaWduZWQgbG9uZwkJbG93bWVtX3JlbWFwX3RvcDsKIAl1bnNpZ25lZCBsb25nCQlsb3dtZW1fcmVtYXBfYmFzZTsKQEAgLTE1OSw3ICsxNjAsOCBAQAogICogCQlwIC0gIFBOT0RFIChsb2NhbCBwYXJ0IG9mIG5zaWRzLCByaWdodCBzaGlmdGVkIDEpCiAgKi8KICNkZWZpbmUgVVZfTkFTSURfVE9fUE5PREUobikJCSgoKG4pID4+IDEpICYgdXZfaHViX2luZm8tPnBub2RlX21hc2spCi0jZGVmaW5lIFVWX1BOT0RFX1RPX05BU0lEKHApCQkoKChwKSA8PCAxKSB8IHV2X2h1Yl9pbmZvLT5nbm9kZV91cHBlcikKKyNkZWZpbmUgVVZfUE5PREVfVE9fR05PREUocCkJCSgocCkgfHV2X2h1Yl9pbmZvLT5nbm9kZV9leHRyYSkKKyNkZWZpbmUgVVZfUE5PREVfVE9fTkFTSUQocCkJCShVVl9QTk9ERV9UT19HTk9ERShwKSA8PCAxKQogCiAjZGVmaW5lIFVWX0xPQ0FMX01NUl9CQVNFCQkweGY0MDAwMDAwVUwKICNkZWZpbmUgVVZfR0xPQkFMX01NUjMyX0JBU0UJCTB4ZjgwMDAwMDBVTApAQCAtMTczLDcgKzE3NSw3IEBACiAjZGVmaW5lIFVWX0dMT0JBTF9NTVIzMl9QTk9ERV9CSVRTKHApCSgocCkgPDwgKFVWX0dMT0JBTF9NTVIzMl9QTk9ERV9TSElGVCkpCiAKICNkZWZpbmUgVVZfR0xPQkFMX01NUjY0X1BOT0RFX0JJVFMocCkJCQkJCVwKLQkoKHVuc2lnbmVkIGxvbmcpKHApIDw8IFVWX0dMT0JBTF9NTVI2NF9QTk9ERV9TSElGVCkKKwkoKHVuc2lnbmVkIGxvbmcpKFVWX1BOT0RFX1RPX0dOT0RFKHApKSA8PCBVVl9HTE9CQUxfTU1SNjRfUE5PREVfU0hJRlQpCiAKICNkZWZpbmUgVVZfQVBJQ19QTk9ERV9TSElGVAk2CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZSBiL2FyY2gveDg2L2tlcm5lbC9NYWtlZmlsZQppbmRleCA4OGQxYmZjLi40Zjc4YmQ2IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL01ha2VmaWxlCkBAIC0yOCw3ICsyOCw3IEBACiBvYmoteQkJCTo9IHByb2Nlc3NfJChCSVRTKS5vIHNpZ25hbC5vIGVudHJ5XyQoQklUUykubwogb2JqLXkJCQkrPSB0cmFwcy5vIGlycS5vIGlycV8kKEJJVFMpLm8gZHVtcHN0YWNrXyQoQklUUykubwogb2JqLXkJCQkrPSB0aW1lXyQoQklUUykubyBpb3BvcnQubyBsZHQubyBkdW1wc3RhY2subwotb2JqLXkJCQkrPSBzZXR1cC5vIGk4MjU5Lm8gaXJxaW5pdF8kKEJJVFMpLm8KK29iai15CQkJKz0gc2V0dXAubyBpODI1OS5vIGlycWluaXQubwogb2JqLSQoQ09ORklHX1g4Nl9WSVNXUykJKz0gdmlzd3NfcXVpcmtzLm8KIG9iai0kKENPTkZJR19YODZfMzIpCSs9IHByb2JlX3JvbXNfMzIubwogb2JqLSQoQ09ORklHX1g4Nl8zMikJKz0gc3lzX2kzODZfMzIubyBpMzg2X2tzeW1zXzMyLm8KQEAgLTQ0LDYgKzQ0LDcgQEAKIG9iai15CQkJCSs9IGkzODcubyB4c2F2ZS5vCiBvYmoteQkJCQkrPSBwdHJhY2Uubwogb2JqLSQoQ09ORklHX1g4Nl9EUykJCSs9IGRzLm8KK29iai0kKENPTkZJR19YODZfRFNfU0VMRlRFU1QpCQkrPSBkc19zZWxmdGVzdC5vCiBvYmotJChDT05GSUdfWDg2XzMyKQkJKz0gdGxzLm8KIG9iai0kKENPTkZJR19JQTMyX0VNVUxBVElPTikJKz0gdGxzLm8KIG9iai15CQkJCSs9IHN0ZXAubwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jIGIvYXJjaC94ODYva2VybmVsL2FjcGkvYm9vdC5jCmluZGV4IDcyMzk4OWQuLjYzMTA4NjEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL2Jvb3QuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYWNwaS9ib290LmMKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vcGd0YWJsZS5oPgogI2luY2x1ZGUgPGFzbS9pb19hcGljLmg+CkBAIC01MjIsNyArNTIzLDcgQEAKICAqIHN1Y2Nlc3M6IHJldHVybiBJUlEgbnVtYmVyICg+PTApCiAgKiBmYWlsdXJlOiByZXR1cm4gPCAwCiAgKi8KLWludCBhY3BpX3JlZ2lzdGVyX2dzaSh1MzIgZ3NpLCBpbnQgdHJpZ2dlcmluZywgaW50IHBvbGFyaXR5KQoraW50IGFjcGlfcmVnaXN0ZXJfZ3NpKHN0cnVjdCBkZXZpY2UgKmRldiwgdTMyIGdzaSwgaW50IHRyaWdnZXIsIGludCBwb2xhcml0eSkKIHsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXVuc2lnbmVkIGludCBwbGF0X2dzaSA9IGdzaTsKQEAgLTUzMiwxNCArNTMzLDE0IEBACiAJICogTWFrZSBzdXJlIGFsbCAobGVnYWN5KSBQQ0kgSVJRcyBhcmUgc2V0IGFzIGxldmVsLXRyaWdnZXJlZC4KIAkgKi8KIAlpZiAoYWNwaV9pcnFfbW9kZWwgPT0gQUNQSV9JUlFfTU9ERUxfUElDKSB7Ci0JCWlmICh0cmlnZ2VyaW5nID09IEFDUElfTEVWRUxfU0VOU0lUSVZFKQorCQlpZiAodHJpZ2dlciA9PSBBQ1BJX0xFVkVMX1NFTlNJVElWRSkKIAkJCWVpc2Ffc2V0X2xldmVsX2lycShnc2kpOwogCX0KICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCiAJaWYgKGFjcGlfaXJxX21vZGVsID09IEFDUElfSVJRX01PREVMX0lPQVBJQykgewotCQlwbGF0X2dzaSA9IG1wX3JlZ2lzdGVyX2dzaShnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKKwkJcGxhdF9nc2kgPSBtcF9yZWdpc3Rlcl9nc2koZGV2LCBnc2ksIHRyaWdnZXIsIHBvbGFyaXR5KTsKIAl9CiAjZW5kaWYKIAlhY3BpX2dzaV90b19pcnEocGxhdF9nc2ksICZpcnEpOwpAQCAtOTAzLDEwICs5MDQsOCBAQAogI2VuZGlmCiAKIHN0YXRpYyBzdHJ1Y3QgewotCWludCBhcGljX2lkOwogCWludCBnc2lfYmFzZTsKIAlpbnQgZ3NpX2VuZDsKLQlERUNMQVJFX0JJVE1BUChwaW5fcHJvZ3JhbW1lZCwgTVBfTUFYX0lPQVBJQ19QSU4gKyAxKTsKIH0gbXBfaW9hcGljX3JvdXRpbmdbTUFYX0lPX0FQSUNTXTsKIAogaW50IG1wX2ZpbmRfaW9hcGljKGludCBnc2kpCkBAIC05ODYsMTYgKzk4NSwxMiBAQAogCiAJc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9JT19BUElDX0JBU0VfMCArIGlkeCwgYWRkcmVzcyk7CiAJbXBfaW9hcGljc1tpZHhdLmFwaWNpZCA9IHVuaXFfaW9hcGljX2lkKGlkKTsKLSNpZmRlZiBDT05GSUdfWDg2XzMyCiAJbXBfaW9hcGljc1tpZHhdLmFwaWN2ZXIgPSBpb19hcGljX2dldF92ZXJzaW9uKGlkeCk7Ci0jZWxzZQotCW1wX2lvYXBpY3NbaWR4XS5hcGljdmVyID0gMDsKLSNlbmRpZgorCiAJLyoKIAkgKiBCdWlsZCBiYXNpYyBHU0kgbG9va3VwIHRhYmxlIHRvIGZhY2lsaXRhdGUgZ3NpLT5pb19hcGljIGxvb2t1cHMKIAkgKiBhbmQgdG8gcHJldmVudCByZXByb2dyYW1taW5nIG9mIElPQVBJQyBwaW5zIChQQ0kgR1NJcykuCiAJICovCi0JbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5hcGljX2lkID0gbXBfaW9hcGljc1tpZHhdLmFwaWNpZDsKIAltcF9pb2FwaWNfcm91dGluZ1tpZHhdLmdzaV9iYXNlID0gZ3NpX2Jhc2U7CiAJbXBfaW9hcGljX3JvdXRpbmdbaWR4XS5nc2lfZW5kID0gZ3NpX2Jhc2UgKwogCSAgICBpb19hcGljX2dldF9yZWRpcl9lbnRyaWVzKGlkeCk7CkBAIC0xMTU4LDI2ICsxMTUzLDUyIEBACiAJfQogfQogCi1pbnQgbXBfcmVnaXN0ZXJfZ3NpKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCitzdGF0aWMgaW50IG1wX2NvbmZpZ19hY3BpX2dzaShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBnc2ksIGludCB0cmlnZ2VyLAorCQkJaW50IHBvbGFyaXR5KQoreworI2lmZGVmIENPTkZJR19YODZfTVBQQVJTRQorCXN0cnVjdCBtcGNfaW50c3JjIG1wX2lycTsKKwlzdHJ1Y3QgcGNpX2RldiAqcGRldjsKKwl1bnNpZ25lZCBjaGFyIG51bWJlcjsKKwl1bnNpZ25lZCBpbnQgZGV2Zm47CisJaW50IGlvYXBpYzsKKwl1OCBwaW47CisKKwlpZiAoIWFjcGlfaW9hcGljKQorCQlyZXR1cm4gMDsKKwlpZiAoIWRldikKKwkJcmV0dXJuIDA7CisJaWYgKGRldi0+YnVzICE9ICZwY2lfYnVzX3R5cGUpCisJCXJldHVybiAwOworCisJcGRldiA9IHRvX3BjaV9kZXYoZGV2KTsKKwludW1iZXIgPSBwZGV2LT5idXMtPm51bWJlcjsKKwlkZXZmbiA9IHBkZXYtPmRldmZuOworCXBpbiA9IHBkZXYtPnBpbjsKKwkvKiBwcmludCB0aGUgZW50cnkgc2hvdWxkIGhhcHBlbiBvbiBtcHRhYmxlIGlkZW50aWNhbGx5ICovCisJbXBfaXJxLnR5cGUgPSBNUF9JTlRTUkM7CisJbXBfaXJxLmlycXR5cGUgPSBtcF9JTlQ7CisJbXBfaXJxLmlycWZsYWcgPSAodHJpZ2dlciA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFID8gNCA6IDB4MGMpIHwKKwkJCQkocG9sYXJpdHkgPT0gQUNQSV9BQ1RJVkVfSElHSCA/IDEgOiAzKTsKKwltcF9pcnEuc3JjYnVzID0gbnVtYmVyOworCW1wX2lycS5zcmNidXNpcnEgPSAoKChkZXZmbiA+PiAzKSAmIDB4MWYpIDw8IDIpIHwgKChwaW4gLSAxKSAmIDMpOworCWlvYXBpYyA9IG1wX2ZpbmRfaW9hcGljKGdzaSk7CisJbXBfaXJxLmRzdGFwaWMgPSBtcF9pb2FwaWNzW2lvYXBpY10uYXBpY2lkOworCW1wX2lycS5kc3RpcnEgPSBtcF9maW5kX2lvYXBpY19waW4oaW9hcGljLCBnc2kpOworCisJc2F2ZV9tcF9pcnEoJm1wX2lycSk7CisjZW5kaWYKKwlyZXR1cm4gMDsKK30KKworaW50IG1wX3JlZ2lzdGVyX2dzaShzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBnc2ksIGludCB0cmlnZ2VyLCBpbnQgcG9sYXJpdHkpCiB7CiAJaW50IGlvYXBpYzsKIAlpbnQgaW9hcGljX3BpbjsKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0jZGVmaW5lIE1BWF9HU0lfTlVNCTQwOTYKLSNkZWZpbmUgSVJRX0NPTVBSRVNTSU9OX1NUQVJUCTY0Ci0KLQlzdGF0aWMgaW50IHBjaV9pcnEgPSBJUlFfQ09NUFJFU1NJT05fU1RBUlQ7Ci0JLyoKLQkgKiBNYXBwaW5nIGJldHdlZW4gR2xvYmFsIFN5c3RlbSBJbnRlcnJ1cHRzLCB3aGljaAotCSAqIHJlcHJlc2VudCBhbGwgcG9zc2libGUgaW50ZXJydXB0cywgYW5kIElSUXMKLQkgKiBhc3NpZ25lZCB0byBhY3R1YWwgZGV2aWNlcy4KLQkgKi8KLQlzdGF0aWMgaW50IGdzaV90b19pcnFbTUFYX0dTSV9OVU1dOwotI2Vsc2UKKwlzdHJ1Y3QgaW9fYXBpY19pcnFfYXR0ciBpcnFfYXR0cjsKIAogCWlmIChhY3BpX2lycV9tb2RlbCAhPSBBQ1BJX0lSUV9NT0RFTF9JT0FQSUMpCiAJCXJldHVybiBnc2k7Ci0jZW5kaWYKIAogCS8qIERvbid0IHNldCB1cCB0aGUgQUNQSSBTQ0kgYmVjYXVzZSBpdCdzIGFscmVhZHkgc2V0IHVwICovCiAJaWYgKGFjcGlfZ2JsX0ZBRFQuc2NpX2ludGVycnVwdCA9PSBnc2kpCkBAIC0xMTk2LDk1ICsxMjE3LDI0IEBACiAJCWdzaSA9IGlvYXBpY19yZW51bWJlcl9pcnEoaW9hcGljLCBnc2kpOwogI2VuZGlmCiAKLQkvKgotCSAqIEF2b2lkIHBpbiByZXByb2dyYW1taW5nLiAgUFJUcyB0eXBpY2FsbHkgaW5jbHVkZSBlbnRyaWVzCi0JICogd2l0aCByZWR1bmRhbnQgcGluLT5nc2kgbWFwcGluZ3MgKGJ1dCB1bmlxdWUgUENJIGRldmljZXMpOwotCSAqIHdlIG9ubHkgcHJvZ3JhbSB0aGUgSU9BUElDIG9uIHRoZSBmaXJzdC4KLQkgKi8KIAlpZiAoaW9hcGljX3BpbiA+IE1QX01BWF9JT0FQSUNfUElOKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiSW52YWxpZCByZWZlcmVuY2UgdG8gSU9BUElDIHBpbiAiCi0JCSAgICAgICAiJWQtJWRcbiIsIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10uYXBpY19pZCwKKwkJICAgICAgICIlZC0lZFxuIiwgbXBfaW9hcGljc1tpb2FwaWNdLmFwaWNpZCwKIAkJICAgICAgIGlvYXBpY19waW4pOwogCQlyZXR1cm4gZ3NpOwogCX0KLQlpZiAodGVzdF9iaXQoaW9hcGljX3BpbiwgbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5waW5fcHJvZ3JhbW1lZCkpIHsKLQkJcHJfZGVidWcoIlBpbiAlZC0lZCBhbHJlYWR5IHByb2dyYW1tZWRcbiIsCi0JCQkgbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5hcGljX2lkLCBpb2FwaWNfcGluKTsKLSNpZmRlZiBDT05GSUdfWDg2XzMyCi0JCXJldHVybiAoZ3NpIDwgSVJRX0NPTVBSRVNTSU9OX1NUQVJUID8gZ3NpIDogZ3NpX3RvX2lycVtnc2ldKTsKLSNlbHNlCi0JCXJldHVybiBnc2k7Ci0jZW5kaWYKLQl9CiAKLQlzZXRfYml0KGlvYXBpY19waW4sIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10ucGluX3Byb2dyYW1tZWQpOwotI2lmZGVmIENPTkZJR19YODZfMzIKLQkvKgotCSAqIEZvciBHU0kgPj0gNjQsIHVzZSBJUlEgY29tcHJlc3Npb24KLQkgKi8KLQlpZiAoKGdzaSA+PSBJUlFfQ09NUFJFU1NJT05fU1RBUlQpCi0JICAgICYmICh0cmlnZ2VyaW5nID09IEFDUElfTEVWRUxfU0VOU0lUSVZFKSkgewotCQkvKgotCQkgKiBGb3IgUENJIGRldmljZXMgYXNzaWduIElSUXMgaW4gb3JkZXIsIGF2b2lkaW5nIGdhcHMKLQkJICogZHVlIHRvIHVudXNlZCBJL08gQVBJQyBwaW5zLgotCQkgKi8KLQkJaW50IGlycSA9IGdzaTsKLQkJaWYgKGdzaSA8IE1BWF9HU0lfTlVNKSB7Ci0JCQkvKgotCQkJICogUmV0YWluIHRoZSBWSUEgY2hpcHNldCB3b3JrLWFyb3VuZCAoZ3NpID4gMTUpLCBidXQKLQkJCSAqIGF2b2lkIGEgcHJvYmxlbSB3aGVyZSB0aGUgODI1NCB0aW1lciAoSVJRMCkgaXMgc2V0dXAKLQkJCSAqIHZpYSBhbiBvdmVycmlkZSAoc28gaXQncyBub3Qgb24gcGluIDAgb2YgdGhlIGlvYXBpYyksCi0JCQkgKiBhbmQgYXQgdGhlIHNhbWUgdGltZSwgdGhlIHBpbiAwIGludGVycnVwdCBpcyBhIFBDSQotCQkJICogdHlwZS4gIFRoZSBnc2kgPiAxNSB0ZXN0IGNvdWxkIGNhdXNlIHRoZXNlIHR3byBwaW5zCi0JCQkgKiB0byBiZSBzaGFyZWQgYXMgSVJRMCwgYW5kIHRoZXkgYXJlIG5vdCBzaGFyZWFibGUuCi0JCQkgKiBTbyB0ZXN0IGZvciB0aGlzIGNvbmRpdGlvbiwgYW5kIGlmIG5lY2Vzc2FyeSwgYXZvaWQKLQkJCSAqIHRoZSBwaW4gY29sbGlzaW9uLgotCQkJICovCi0JCQlnc2kgPSBwY2lfaXJxKys7Ci0JCQkvKgotCQkJICogRG9uJ3QgYXNzaWduIElSUSB1c2VkIGJ5IEFDUEkgU0NJCi0JCQkgKi8KLQkJCWlmIChnc2kgPT0gYWNwaV9nYmxfRkFEVC5zY2lfaW50ZXJydXB0KQotCQkJCWdzaSA9IHBjaV9pcnErKzsKLQkJCWdzaV90b19pcnFbaXJxXSA9IGdzaTsKLQkJfSBlbHNlIHsKLQkJCXByaW50ayhLRVJOX0VSUiAiR1NJICV1IGlzIHRvbyBoaWdoXG4iLCBnc2kpOwotCQkJcmV0dXJuIGdzaTsKLQkJfQotCX0KLSNlbmRpZgotCWlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nKGlvYXBpYywgaW9hcGljX3BpbiwgZ3NpLAotCQkJCXRyaWdnZXJpbmcgPT0gQUNQSV9FREdFX1NFTlNJVElWRSA/IDAgOiAxLAotCQkJCXBvbGFyaXR5ID09IEFDUElfQUNUSVZFX0hJR0ggPyAwIDogMSk7CisJaWYgKGVuYWJsZV91cGRhdGVfbXB0YWJsZSkKKwkJbXBfY29uZmlnX2FjcGlfZ3NpKGRldiwgZ3NpLCB0cmlnZ2VyLCBwb2xhcml0eSk7CisKKwlzZXRfaW9fYXBpY19pcnFfYXR0cigmaXJxX2F0dHIsIGlvYXBpYywgaW9hcGljX3BpbiwKKwkJCSAgICAgdHJpZ2dlciA9PSBBQ1BJX0VER0VfU0VOU0lUSVZFID8gMCA6IDEsCisJCQkgICAgIHBvbGFyaXR5ID09IEFDUElfQUNUSVZFX0hJR0ggPyAwIDogMSk7CisJaW9fYXBpY19zZXRfcGNpX3JvdXRpbmcoZGV2LCBnc2ksICZpcnFfYXR0cik7CisKIAlyZXR1cm4gZ3NpOwogfQogCi1pbnQgbXBfY29uZmlnX2FjcGlfZ3NpKHVuc2lnbmVkIGNoYXIgbnVtYmVyLCB1bnNpZ25lZCBpbnQgZGV2Zm4sIHU4IHBpbiwKLQkJCXUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCi17Ci0jaWZkZWYgQ09ORklHX1g4Nl9NUFBBUlNFCi0Jc3RydWN0IG1wY19pbnRzcmMgbXBfaXJxOwotCWludCBpb2FwaWM7Ci0KLQlpZiAoIWFjcGlfaW9hcGljKQotCQlyZXR1cm4gMDsKLQotCS8qIHByaW50IHRoZSBlbnRyeSBzaG91bGQgaGFwcGVuIG9uIG1wdGFibGUgaWRlbnRpY2FsbHkgKi8KLQltcF9pcnEudHlwZSA9IE1QX0lOVFNSQzsKLQltcF9pcnEuaXJxdHlwZSA9IG1wX0lOVDsKLQltcF9pcnEuaXJxZmxhZyA9ICh0cmlnZ2VyaW5nID09IEFDUElfRURHRV9TRU5TSVRJVkUgPyA0IDogMHgwYykgfAotCQkJCShwb2xhcml0eSA9PSBBQ1BJX0FDVElWRV9ISUdIID8gMSA6IDMpOwotCW1wX2lycS5zcmNidXMgPSBudW1iZXI7Ci0JbXBfaXJxLnNyY2J1c2lycSA9ICgoKGRldmZuID4+IDMpICYgMHgxZikgPDwgMikgfCAoKHBpbiAtIDEpICYgMyk7Ci0JaW9hcGljID0gbXBfZmluZF9pb2FwaWMoZ3NpKTsKLQltcF9pcnEuZHN0YXBpYyA9IG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10uYXBpY19pZDsKLQltcF9pcnEuZHN0aXJxID0gbXBfZmluZF9pb2FwaWNfcGluKGlvYXBpYywgZ3NpKTsKLQotCXNhdmVfbXBfaXJxKCZtcF9pcnEpOwotI2VuZGlmCi0JcmV0dXJuIDA7Ci19Ci0KIC8qCiAgKiBQYXJzZSBJT0FQSUMgcmVsYXRlZCBlbnRyaWVzIGluIE1BRFQKICAqIHJldHVybnMgMCBvbiBzdWNjZXNzLCA8IDAgb24gZXJyb3IKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL01ha2VmaWxlIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvTWFrZWZpbGUKaW5kZXggMWMzMWNjMC4uMTY3YmMxNiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvTWFrZWZpbGUKQEAgLTksNyArOSw3IEBACiBhbHdheXMJCTo9IHdha2V1cC5iaW4KIHRhcmdldHMJCTo9IHdha2V1cC5lbGYgd2FrZXVwLmxkcwogCi13YWtldXAteQkrPSB3YWtldXAubyB3YWtlbWFpbi5vIHZpZGVvLW1vZGUubyBjb3B5Lm8KK3dha2V1cC15CSs9IHdha2V1cC5vIHdha2VtYWluLm8gdmlkZW8tbW9kZS5vIGNvcHkubyBiaW9zY2FsbC5vIHJlZ3MubwogCiAjIFRoZSBsaW5rIG9yZGVyIG9mIHRoZSB2aWRlby0qLm8gbW9kdWxlcyBjYW4gbWF0dGVyLiAgSW4gcGFydGljdWxhciwKICMgdmlkZW8tdmdhLm8gKm11c3QqIGJlIGxpc3RlZCBmaXJzdCwgZm9sbG93ZWQgYnkgdmlkZW8tdmVzYS5vLgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvYmlvc2NhbGwuUyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL2Jpb3NjYWxsLlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUxZWIwYgotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL2Jpb3NjYWxsLlMKQEAgLTAsMCArMSBAQAorI2luY2x1ZGUgIi4uLy4uLy4uL2Jvb3QvYmlvc2NhbGwuUyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3JlZ3MuYyBiL2FyY2gveDg2L2tlcm5lbC9hY3BpL3JlYWxtb2RlL3JlZ3MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MjA2MDMzCi0tLSAvZGV2L251bGwKKysrIGIvYXJjaC94ODYva2VybmVsL2FjcGkvcmVhbG1vZGUvcmVncy5jCkBAIC0wLDAgKzEgQEAKKyNpbmNsdWRlICIuLi8uLi8uLi9ib290L3JlZ3MuYyIKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXUuYwppbmRleCBhOTdkYjk5Li4xYzYwNTU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FtZF9pb21tdS5jCkBAIC01NSw3ICs1NSwxNiBAQAogc3RhdGljIGludCBkbWFfb3BzX3VuaXR5X21hcChzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9kb20sCiAJCQkgICAgIHN0cnVjdCB1bml0eV9tYXBfZW50cnkgKmUpOwogc3RhdGljIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZmluZF9wcm90ZWN0aW9uX2RvbWFpbih1MTYgZGV2aWQpOworc3RhdGljIHU2NCogYWxsb2NfcHRlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MsIHU2NAorCQkgICAgICAqKnB0ZV9wYWdlLCBnZnBfdCBnZnApOworc3RhdGljIHZvaWQgZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRvbSwKKwkJCQkgICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0X3BhZ2UsCisJCQkJICAgICAgdW5zaWduZWQgaW50IHBhZ2VzKTsKIAorI2lmbmRlZiBCVVNfTk9USUZZX1VOQk9VTkRfRFJJVkVSCisjZGVmaW5lIEJVU19OT1RJRllfVU5CT1VORF9EUklWRVIgMHgwMDA1CisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19BTURfSU9NTVVfU1RBVFMKIApAQCAtMjEzLDcgKzIyMiw3IEBACiB7CiAJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvbW11LCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpCisJZm9yX2VhY2hfaW9tbXUoaW9tbXUpCiAJCWlvbW11X3BvbGxfZXZlbnRzKGlvbW11KTsKIAogCXJldHVybiBJUlFfSEFORExFRDsKQEAgLTQ0MCw3ICs0NDksNyBAQAogCV9faW9tbXVfYnVpbGRfaW52X2lvbW11X3BhZ2VzKCZjbWQsIENNRF9JTlZfSU9NTVVfQUxMX1BBR0VTX0FERFJFU1MsCiAJCQkJICAgICAgZG9taWQsIDEsIDEpOwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpb21tdSwgJmFtZF9pb21tdV9saXN0LCBsaXN0KSB7CisJZm9yX2VhY2hfaW9tbXUoaW9tbXUpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJmlvbW11LT5sb2NrLCBmbGFncyk7CiAJCV9faW9tbXVfcXVldWVfY29tbWFuZChpb21tdSwgJmNtZCk7CiAJCV9faW9tbXVfY29tcGxldGlvbl93YWl0KGlvbW11KTsKQEAgLTQ0OSw2ICs0NTgsMzUgQEAKIAl9CiB9CiAKK3ZvaWQgYW1kX2lvbW11X2ZsdXNoX2FsbF9kb21haW5zKHZvaWQpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAxOyBpIDwgTUFYX0RPTUFJTl9JRDsgKytpKSB7CisJCWlmICghdGVzdF9iaXQoaSwgYW1kX2lvbW11X3BkX2FsbG9jX2JpdG1hcCkpCisJCQljb250aW51ZTsKKwkJaW9tbXVfZmx1c2hfZG9tYWluKGkpOworCX0KK30KKwordm9pZCBhbWRfaW9tbXVfZmx1c2hfYWxsX2RldmljZXModm9pZCkKK3sKKwlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPD0gYW1kX2lvbW11X2xhc3RfYmRmOyArK2kpIHsKKwkJaWYgKGFtZF9pb21tdV9wZF90YWJsZVtpXSA9PSBOVUxMKQorCQkJY29udGludWU7CisKKwkJaW9tbXUgPSBhbWRfaW9tbXVfcmxvb2t1cF90YWJsZVtpXTsKKwkJaWYgKCFpb21tdSkKKwkJCWNvbnRpbnVlOworCisJCWlvbW11X3F1ZXVlX2ludl9kZXZfZW50cnkoaW9tbXUsIGkpOworCQlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOworCX0KK30KKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqCiAgKiBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSB1c2VkIHRoZSBjcmVhdGUgdGhlIHBhZ2UgdGFibGUgbWFwcGluZ3MgZm9yCkBAIC00NjgsNyArNTA2LDcgQEAKIAkJCSAgdW5zaWduZWQgbG9uZyBwaHlzX2FkZHIsCiAJCQkgIGludCBwcm90KQogewotCXU2NCBfX3B0ZSwgKnB0ZSwgKnBhZ2U7CisJdTY0IF9fcHRlLCAqcHRlOwogCiAJYnVzX2FkZHIgID0gUEFHRV9BTElHTihidXNfYWRkcik7CiAJcGh5c19hZGRyID0gUEFHRV9BTElHTihwaHlzX2FkZHIpOwpAQCAtNDc3LDI3ICs1MTUsNyBAQAogCWlmIChidXNfYWRkciA+IElPTU1VX01BUF9TSVpFX0wzIHx8ICEocHJvdCAmIElPTU1VX1BST1RfTUFTSykpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JcHRlID0gJmRvbS0+cHRfcm9vdFtJT01NVV9QVEVfTDJfSU5ERVgoYnVzX2FkZHIpXTsKLQotCWlmICghSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpIHsKLQkJcGFnZSA9ICh1NjQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFnZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQkqcHRlID0gSU9NTVVfTDJfUERFKHZpcnRfdG9fcGh5cyhwYWdlKSk7Ci0JfQotCi0JcHRlID0gSU9NTVVfUFRFX1BBR0UoKnB0ZSk7Ci0JcHRlID0gJnB0ZVtJT01NVV9QVEVfTDFfSU5ERVgoYnVzX2FkZHIpXTsKLQotCWlmICghSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpIHsKLQkJcGFnZSA9ICh1NjQgKilnZXRfemVyb2VkX3BhZ2UoR0ZQX0tFUk5FTCk7Ci0JCWlmICghcGFnZSkKLQkJCXJldHVybiAtRU5PTUVNOwotCQkqcHRlID0gSU9NTVVfTDFfUERFKHZpcnRfdG9fcGh5cyhwYWdlKSk7Ci0JfQotCi0JcHRlID0gSU9NTVVfUFRFX1BBR0UoKnB0ZSk7Ci0JcHRlID0gJnB0ZVtJT01NVV9QVEVfTDBfSU5ERVgoYnVzX2FkZHIpXTsKKwlwdGUgPSBhbGxvY19wdGUoZG9tLCBidXNfYWRkciwgTlVMTCwgR0ZQX0tFUk5FTCk7CiAKIAlpZiAoSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpCiAJCXJldHVybiAtRUJVU1k7CkBAIC01OTUsNyArNjEzLDggQEAKIAkJICogYXMgYWxsb2NhdGVkIGluIHRoZSBhcGVydHVyZQogCQkgKi8KIAkJaWYgKGFkZHIgPCBkbWFfZG9tLT5hcGVydHVyZV9zaXplKQotCQkJX19zZXRfYml0KGFkZHIgPj4gUEFHRV9TSElGVCwgZG1hX2RvbS0+Yml0bWFwKTsKKwkJCV9fc2V0X2JpdChhZGRyID4+IFBBR0VfU0hJRlQsCisJCQkJICBkbWFfZG9tLT5hcGVydHVyZVswXS0+Yml0bWFwKTsKIAl9CiAKIAlyZXR1cm4gMDsKQEAgLTYzMiw0MiArNjUxLDE5MSBAQAogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qCi0gKiBUaGUgYWRkcmVzcyBhbGxvY2F0b3IgY29yZSBmdW5jdGlvbi4KKyAqIFRoZSBhZGRyZXNzIGFsbG9jYXRvciBjb3JlIGZ1bmN0aW9ucy4KICAqCiAgKiBjYWxsZWQgd2l0aCBkb21haW4tPmxvY2sgaGVsZAogICovCisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGVyZSBpcyBhIFBURSBmb3IgYSBnaXZlbiBkbWEgYWRkcmVzcy4gSWYKKyAqIHRoZXJlIGlzIG9uZSwgaXQgcmV0dXJucyB0aGUgcG9pbnRlciB0byBpdC4KKyAqLworc3RhdGljIHU2NCogZmV0Y2hfcHRlKHN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluLAorCQkgICAgICB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCit7CisJdTY0ICpwdGU7CisKKwlwdGUgPSAmZG9tYWluLT5wdF9yb290W0lPTU1VX1BURV9MMl9JTkRFWChhZGRyZXNzKV07CisKKwlpZiAoIUlPTU1VX1BURV9QUkVTRU5UKCpwdGUpKQorCQlyZXR1cm4gTlVMTDsKKworCXB0ZSA9IElPTU1VX1BURV9QQUdFKCpwdGUpOworCXB0ZSA9ICZwdGVbSU9NTVVfUFRFX0wxX0lOREVYKGFkZHJlc3MpXTsKKworCWlmICghSU9NTVVfUFRFX1BSRVNFTlQoKnB0ZSkpCisJCXJldHVybiBOVUxMOworCisJcHRlID0gSU9NTVVfUFRFX1BBR0UoKnB0ZSk7CisJcHRlID0gJnB0ZVtJT01NVV9QVEVfTDBfSU5ERVgoYWRkcmVzcyldOworCisJcmV0dXJuIHB0ZTsKK30KKworLyoKKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBhZGQgYSBuZXcgYXBlcnR1cmUgcmFuZ2UgdG8gYW4gZXhpc3RpbmcKKyAqIGFwZXJ0dXJlIGluIGNhc2Ugb2YgZG1hX29wcyBkb21haW4gYWxsb2NhdGlvbiBvciBhZGRyZXNzIGFsbG9jYXRpb24KKyAqIGZhaWx1cmUuCisgKi8KK3N0YXRpYyBpbnQgYWxsb2NfbmV3X3JhbmdlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LAorCQkJICAgc3RydWN0IGRtYV9vcHNfZG9tYWluICpkbWFfZG9tLAorCQkJICAgYm9vbCBwb3B1bGF0ZSwgZ2ZwX3QgZ2ZwKQoreworCWludCBpbmRleCA9IGRtYV9kb20tPmFwZXJ0dXJlX3NpemUgPj4gQVBFUlRVUkVfUkFOR0VfU0hJRlQ7CisJaW50IGk7CisKKyNpZmRlZiBDT05GSUdfSU9NTVVfU1RSRVNTCisJcG9wdWxhdGUgPSBmYWxzZTsKKyNlbmRpZgorCisJaWYgKGluZGV4ID49IEFQRVJUVVJFX01BWF9SQU5HRVMpCisJCXJldHVybiAtRU5PTUVNOworCisJZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGFwZXJ0dXJlX3JhbmdlKSwgZ2ZwKTsKKwlpZiAoIWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPmJpdG1hcCA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKGdmcCk7CisJaWYgKCFkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPmJpdG1hcCkKKwkJZ290byBvdXRfZnJlZTsKKworCWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+b2Zmc2V0ID0gZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZTsKKworCWlmIChwb3B1bGF0ZSkgeworCQl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSBkbWFfZG9tLT5hcGVydHVyZV9zaXplOworCQlpbnQgaSwgbnVtX3B0ZXMgPSBBUEVSVFVSRV9SQU5HRV9QQUdFUyAvIDUxMjsKKwkJdTY0ICpwdGUsICpwdGVfcGFnZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnVtX3B0ZXM7ICsraSkgeworCQkJcHRlID0gYWxsb2NfcHRlKCZkbWFfZG9tLT5kb21haW4sIGFkZHJlc3MsCisJCQkJCSZwdGVfcGFnZSwgZ2ZwKTsKKwkJCWlmICghcHRlKQorCQkJCWdvdG8gb3V0X2ZyZWU7CisKKwkJCWRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+cHRlX3BhZ2VzW2ldID0gcHRlX3BhZ2U7CisKKwkJCWFkZHJlc3MgKz0gQVBFUlRVUkVfUkFOR0VfU0laRSAvIDY0OworCQl9CisJfQorCisJZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSArPSBBUEVSVFVSRV9SQU5HRV9TSVpFOworCisJLyogSW50aWFsaXplIHRoZSBleGNsdXNpb24gcmFuZ2UgaWYgbmVjZXNzYXJ5ICovCisJaWYgKGlvbW11LT5leGNsdXNpb25fc3RhcnQgJiYKKwkgICAgaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCA+PSBkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0tPm9mZnNldCAmJgorCSAgICBpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0IDwgZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSkgeworCQl1bnNpZ25lZCBsb25nIHN0YXJ0cGFnZSA9IGlvbW11LT5leGNsdXNpb25fc3RhcnQgPj4gUEFHRV9TSElGVDsKKwkJaW50IHBhZ2VzID0gaW9tbXVfbnVtX3BhZ2VzKGlvbW11LT5leGNsdXNpb25fc3RhcnQsCisJCQkJCSAgICBpb21tdS0+ZXhjbHVzaW9uX2xlbmd0aCwKKwkJCQkJICAgIFBBR0VfU0laRSk7CisJCWRtYV9vcHNfcmVzZXJ2ZV9hZGRyZXNzZXMoZG1hX2RvbSwgc3RhcnRwYWdlLCBwYWdlcyk7CisJfQorCisJLyoKKwkgKiBDaGVjayBmb3IgYXJlYXMgYWxyZWFkeSBtYXBwZWQgYXMgcHJlc2VudCBpbiB0aGUgbmV3IGFwZXJ0dXJlCisJICogcmFuZ2UgYW5kIG1hcmsgdGhvc2UgcGFnZXMgYXMgcmVzZXJ2ZWQgaW4gdGhlIGFsbG9jYXRvci4gU3VjaAorCSAqIG1hcHBpbmdzIG1heSBhbHJlYWR5IGV4aXN0IGFzIGEgcmVzdWx0IG9mIHJlcXVlc3RlZCB1bml0eQorCSAqIG1hcHBpbmdzIGZvciBkZXZpY2VzLgorCSAqLworCWZvciAoaSA9IGRtYV9kb20tPmFwZXJ0dXJlW2luZGV4XS0+b2Zmc2V0OworCSAgICAgaSA8IGRtYV9kb20tPmFwZXJ0dXJlX3NpemU7CisJICAgICBpICs9IFBBR0VfU0laRSkgeworCQl1NjQgKnB0ZSA9IGZldGNoX3B0ZSgmZG1hX2RvbS0+ZG9tYWluLCBpKTsKKwkJaWYgKCFwdGUgfHwgIUlPTU1VX1BURV9QUkVTRU5UKCpwdGUpKQorCQkJY29udGludWU7CisKKwkJZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhkbWFfZG9tLCBpIDw8IFBBR0VfU0hJRlQsIDEpOworCX0KKworCXJldHVybiAwOworCitvdXRfZnJlZToKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdLT5iaXRtYXApOworCisJa2ZyZWUoZG1hX2RvbS0+YXBlcnR1cmVbaW5kZXhdKTsKKwlkbWFfZG9tLT5hcGVydHVyZVtpbmRleF0gPSBOVUxMOworCisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9vcHNfYXJlYV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpkZXYsCisJCQkJCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAorCQkJCQl1bnNpZ25lZCBpbnQgcGFnZXMsCisJCQkJCXVuc2lnbmVkIGxvbmcgYWxpZ25fbWFzaywKKwkJCQkJdTY0IGRtYV9tYXNrLAorCQkJCQl1bnNpZ25lZCBsb25nIHN0YXJ0KQoreworCXVuc2lnbmVkIGxvbmcgbmV4dF9iaXQgPSBkb20tPm5leHRfYWRkcmVzcyAlIEFQRVJUVVJFX1JBTkdFX1NJWkU7CisJaW50IG1heF9pbmRleCA9IGRvbS0+YXBlcnR1cmVfc2l6ZSA+PiBBUEVSVFVSRV9SQU5HRV9TSElGVDsKKwlpbnQgaSA9IHN0YXJ0ID4+IEFQRVJUVVJFX1JBTkdFX1NISUZUOworCXVuc2lnbmVkIGxvbmcgYm91bmRhcnlfc2l6ZTsKKwl1bnNpZ25lZCBsb25nIGFkZHJlc3MgPSAtMTsKKwl1bnNpZ25lZCBsb25nIGxpbWl0OworCisJbmV4dF9iaXQgPj49IFBBR0VfU0hJRlQ7CisKKwlib3VuZGFyeV9zaXplID0gQUxJR04oZG1hX2dldF9zZWdfYm91bmRhcnkoZGV2KSArIDEsCisJCQlQQUdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7CisKKwlmb3IgKDtpIDwgbWF4X2luZGV4OyArK2kpIHsKKwkJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSBkb20tPmFwZXJ0dXJlW2ldLT5vZmZzZXQgPj4gUEFHRV9TSElGVDsKKworCQlpZiAoZG9tLT5hcGVydHVyZVtpXS0+b2Zmc2V0ID49IGRtYV9tYXNrKQorCQkJYnJlYWs7CisKKwkJbGltaXQgPSBpb21tdV9kZXZpY2VfbWF4X2luZGV4KEFQRVJUVVJFX1JBTkdFX1BBR0VTLCBvZmZzZXQsCisJCQkJCSAgICAgICBkbWFfbWFzayA+PiBQQUdFX1NISUZUKTsKKworCQlhZGRyZXNzID0gaW9tbXVfYXJlYV9hbGxvYyhkb20tPmFwZXJ0dXJlW2ldLT5iaXRtYXAsCisJCQkJCSAgIGxpbWl0LCBuZXh0X2JpdCwgcGFnZXMsIDAsCisJCQkJCSAgICBib3VuZGFyeV9zaXplLCBhbGlnbl9tYXNrKTsKKwkJaWYgKGFkZHJlc3MgIT0gLTEpIHsKKwkJCWFkZHJlc3MgPSBkb20tPmFwZXJ0dXJlW2ldLT5vZmZzZXQgKworCQkJCSAgKGFkZHJlc3MgPDwgUEFHRV9TSElGVCk7CisJCQlkb20tPm5leHRfYWRkcmVzcyA9IGFkZHJlc3MgKyAocGFnZXMgPDwgUEFHRV9TSElGVCk7CisJCQlicmVhazsKKwkJfQorCisJCW5leHRfYml0ID0gMDsKKwl9CisKKwlyZXR1cm4gYWRkcmVzczsKK30KKwogc3RhdGljIHVuc2lnbmVkIGxvbmcgZG1hX29wc19hbGxvY19hZGRyZXNzZXMoc3RydWN0IGRldmljZSAqZGV2LAogCQkJCQkgICAgIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAogCQkJCQkgICAgIHVuc2lnbmVkIGludCBwYWdlcywKIAkJCQkJICAgICB1bnNpZ25lZCBsb25nIGFsaWduX21hc2ssCiAJCQkJCSAgICAgdTY0IGRtYV9tYXNrKQogewotCXVuc2lnbmVkIGxvbmcgbGltaXQ7CiAJdW5zaWduZWQgbG9uZyBhZGRyZXNzOwotCXVuc2lnbmVkIGxvbmcgYm91bmRhcnlfc2l6ZTsKIAotCWJvdW5kYXJ5X3NpemUgPSBBTElHTihkbWFfZ2V0X3NlZ19ib3VuZGFyeShkZXYpICsgMSwKLQkJCVBBR0VfU0laRSkgPj4gUEFHRV9TSElGVDsKLQlsaW1pdCA9IGlvbW11X2RldmljZV9tYXhfaW5kZXgoZG9tLT5hcGVydHVyZV9zaXplID4+IFBBR0VfU0hJRlQsIDAsCi0JCQkJICAgICAgIGRtYV9tYXNrID4+IFBBR0VfU0hJRlQpOworI2lmZGVmIENPTkZJR19JT01NVV9TVFJFU1MKKwlkb20tPm5leHRfYWRkcmVzcyA9IDA7CisJZG9tLT5uZWVkX2ZsdXNoID0gdHJ1ZTsKKyNlbmRpZgogCi0JaWYgKGRvbS0+bmV4dF9iaXQgPj0gbGltaXQpIHsKLQkJZG9tLT5uZXh0X2JpdCA9IDA7Ci0JCWRvbS0+bmVlZF9mbHVzaCA9IHRydWU7Ci0JfQorCWFkZHJlc3MgPSBkbWFfb3BzX2FyZWFfYWxsb2MoZGV2LCBkb20sIHBhZ2VzLCBhbGlnbl9tYXNrLAorCQkJCSAgICAgZG1hX21hc2ssIGRvbS0+bmV4dF9hZGRyZXNzKTsKIAotCWFkZHJlc3MgPSBpb21tdV9hcmVhX2FsbG9jKGRvbS0+Yml0bWFwLCBsaW1pdCwgZG9tLT5uZXh0X2JpdCwgcGFnZXMsCi0JCQkJICAgMCAsIGJvdW5kYXJ5X3NpemUsIGFsaWduX21hc2spOwogCWlmIChhZGRyZXNzID09IC0xKSB7Ci0JCWFkZHJlc3MgPSBpb21tdV9hcmVhX2FsbG9jKGRvbS0+Yml0bWFwLCBsaW1pdCwgMCwgcGFnZXMsCi0JCQkJMCwgYm91bmRhcnlfc2l6ZSwgYWxpZ25fbWFzayk7CisJCWRvbS0+bmV4dF9hZGRyZXNzID0gMDsKKwkJYWRkcmVzcyA9IGRtYV9vcHNfYXJlYV9hbGxvYyhkZXYsIGRvbSwgcGFnZXMsIGFsaWduX21hc2ssCisJCQkJCSAgICAgZG1hX21hc2ssIDApOwogCQlkb20tPm5lZWRfZmx1c2ggPSB0cnVlOwogCX0KIAotCWlmIChsaWtlbHkoYWRkcmVzcyAhPSAtMSkpIHsKLQkJZG9tLT5uZXh0X2JpdCA9IGFkZHJlc3MgKyBwYWdlczsKLQkJYWRkcmVzcyA8PD0gUEFHRV9TSElGVDsKLQl9IGVsc2UKKwlpZiAodW5saWtlbHkoYWRkcmVzcyA9PSAtMSkpCiAJCWFkZHJlc3MgPSBiYWRfZG1hX2FkZHJlc3M7CiAKIAlXQVJOX09OKChhZGRyZXNzICsgKFBBR0VfU0laRSpwYWdlcykpID4gZG9tLT5hcGVydHVyZV9zaXplKTsKQEAgLTY4NCwxMSArODUyLDIzIEBACiAJCQkJICAgdW5zaWduZWQgbG9uZyBhZGRyZXNzLAogCQkJCSAgIHVuc2lnbmVkIGludCBwYWdlcykKIHsKLQlhZGRyZXNzID4+PSBQQUdFX1NISUZUOwotCWlvbW11X2FyZWFfZnJlZShkb20tPmJpdG1hcCwgYWRkcmVzcywgcGFnZXMpOworCXVuc2lnbmVkIGkgPSBhZGRyZXNzID4+IEFQRVJUVVJFX1JBTkdFX1NISUZUOworCXN0cnVjdCBhcGVydHVyZV9yYW5nZSAqcmFuZ2UgPSBkb20tPmFwZXJ0dXJlW2ldOwogCi0JaWYgKGFkZHJlc3MgPj0gZG9tLT5uZXh0X2JpdCkKKwlCVUdfT04oaSA+PSBBUEVSVFVSRV9NQVhfUkFOR0VTIHx8IHJhbmdlID09IE5VTEwpOworCisjaWZkZWYgQ09ORklHX0lPTU1VX1NUUkVTUworCWlmIChpIDwgNCkKKwkJcmV0dXJuOworI2VuZGlmCisKKwlpZiAoYWRkcmVzcyA+PSBkb20tPm5leHRfYWRkcmVzcykKIAkJZG9tLT5uZWVkX2ZsdXNoID0gdHJ1ZTsKKworCWFkZHJlc3MgPSAoYWRkcmVzcyAlIEFQRVJUVVJFX1JBTkdFX1NJWkUpID4+IFBBR0VfU0hJRlQ7CisKKwlpb21tdV9hcmVhX2ZyZWUocmFuZ2UtPmJpdG1hcCwgYWRkcmVzcywgcGFnZXMpOworCiB9CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBAIC03MzYsMTIgKzkxNiwxNiBAQAogCQkJCSAgICAgIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGFnZSwKIAkJCQkgICAgICB1bnNpZ25lZCBpbnQgcGFnZXMpCiB7Ci0JdW5zaWduZWQgaW50IGxhc3RfcGFnZSA9IGRvbS0+YXBlcnR1cmVfc2l6ZSA+PiBQQUdFX1NISUZUOworCXVuc2lnbmVkIGludCBpLCBsYXN0X3BhZ2UgPSBkb20tPmFwZXJ0dXJlX3NpemUgPj4gUEFHRV9TSElGVDsKIAogCWlmIChzdGFydF9wYWdlICsgcGFnZXMgPiBsYXN0X3BhZ2UpCiAJCXBhZ2VzID0gbGFzdF9wYWdlIC0gc3RhcnRfcGFnZTsKIAotCWlvbW11X2FyZWFfcmVzZXJ2ZShkb20tPmJpdG1hcCwgc3RhcnRfcGFnZSwgcGFnZXMpOworCWZvciAoaSA9IHN0YXJ0X3BhZ2U7IGkgPCBzdGFydF9wYWdlICsgcGFnZXM7ICsraSkgeworCQlpbnQgaW5kZXggPSBpIC8gQVBFUlRVUkVfUkFOR0VfUEFHRVM7CisJCWludCBwYWdlICA9IGkgJSBBUEVSVFVSRV9SQU5HRV9QQUdFUzsKKwkJX19zZXRfYml0KHBhZ2UsIGRvbS0+YXBlcnR1cmVbaW5kZXhdLT5iaXRtYXApOworCX0KIH0KIAogc3RhdGljIHZvaWQgZnJlZV9wYWdldGFibGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb21haW4pCkBAIC03ODAsMTQgKzk2NCwxOSBAQAogICovCiBzdGF0aWMgdm9pZCBkbWFfb3BzX2RvbWFpbl9mcmVlKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tKQogeworCWludCBpOworCiAJaWYgKCFkb20pCiAJCXJldHVybjsKIAogCWZyZWVfcGFnZXRhYmxlKCZkb20tPmRvbWFpbik7CiAKLQlrZnJlZShkb20tPnB0ZV9wYWdlcyk7Ci0KLQlrZnJlZShkb20tPmJpdG1hcCk7CisJZm9yIChpID0gMDsgaSA8IEFQRVJUVVJFX01BWF9SQU5HRVM7ICsraSkgeworCQlpZiAoIWRvbS0+YXBlcnR1cmVbaV0pCisJCQljb250aW51ZTsKKwkJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWRvbS0+YXBlcnR1cmVbaV0tPmJpdG1hcCk7CisJCWtmcmVlKGRvbS0+YXBlcnR1cmVbaV0pOworCX0KIAogCWtmcmVlKGRvbSk7CiB9CkBAIC03OTcsMTkgKzk4Niw5IEBACiAgKiBJdCBhbHNvIGludGlhbGl6ZXMgdGhlIHBhZ2UgdGFibGUgYW5kIHRoZSBhZGRyZXNzIGFsbG9jYXRvciBkYXRhCiAgKiBzdHJ1Y3R1cmVzIHJlcXVpcmVkIGZvciB0aGUgZG1hX29wcyBpbnRlcmZhY2UKICAqLwotc3RhdGljIHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX29wc19kb21haW5fYWxsb2Moc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsCi0JCQkJCQkgICB1bnNpZ25lZCBvcmRlcikKK3N0YXRpYyBzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRtYV9vcHNfZG9tYWluX2FsbG9jKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewogCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbTsKLQl1bnNpZ25lZCBpLCBudW1fcHRlX3BhZ2VzOwotCXU2NCAqbDJfcGRlOwotCXU2NCBhZGRyZXNzOwotCi0JLyoKLQkgKiBDdXJyZW50bHkgdGhlIERNQSBhcGVydHVyZSBtdXN0IGJlIGJldHdlZW4gMzIgTUIgYW5kIDFHQiBpbiBzaXplCi0JICovCi0JaWYgKChvcmRlciA8IDI1KSB8fCAob3JkZXIgPiAzMCkpCi0JCXJldHVybiBOVUxMOwogCiAJZG1hX2RvbSA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiksIEdGUF9LRVJORUwpOwogCWlmICghZG1hX2RvbSkKQEAgLTgyNiw1NSArMTAwNSwyMCBAQAogCWRtYV9kb20tPmRvbWFpbi5wcml2ID0gZG1hX2RvbTsKIAlpZiAoIWRtYV9kb20tPmRvbWFpbi5wdF9yb290KQogCQlnb3RvIGZyZWVfZG1hX2RvbTsKLQlkbWFfZG9tLT5hcGVydHVyZV9zaXplID0gKDFVTEwgPDwgb3JkZXIpOwotCWRtYV9kb20tPmJpdG1hcCA9IGt6YWxsb2MoZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZSAvIChQQUdFX1NJWkUgKiA4KSwKLQkJCQkgIEdGUF9LRVJORUwpOwotCWlmICghZG1hX2RvbS0+Yml0bWFwKQotCQlnb3RvIGZyZWVfZG1hX2RvbTsKLQkvKgotCSAqIG1hcmsgdGhlIGZpcnN0IHBhZ2UgYXMgYWxsb2NhdGVkIHNvIHdlIG5ldmVyIHJldHVybiAwIGFzCi0JICogYSB2YWxpZCBkbWEtYWRkcmVzcy4gU28gd2UgY2FuIHVzZSAwIGFzIGVycm9yIHZhbHVlCi0JICovCi0JZG1hX2RvbS0+Yml0bWFwWzBdID0gMTsKLQlkbWFfZG9tLT5uZXh0X2JpdCA9IDA7CiAKIAlkbWFfZG9tLT5uZWVkX2ZsdXNoID0gZmFsc2U7CiAJZG1hX2RvbS0+dGFyZ2V0X2RldiA9IDB4ZmZmZjsKIAotCS8qIEludGlhbGl6ZSB0aGUgZXhjbHVzaW9uIHJhbmdlIGlmIG5lY2Vzc2FyeSAqLwotCWlmIChpb21tdS0+ZXhjbHVzaW9uX3N0YXJ0ICYmCi0JICAgIGlvbW11LT5leGNsdXNpb25fc3RhcnQgPCBkbWFfZG9tLT5hcGVydHVyZV9zaXplKSB7Ci0JCXVuc2lnbmVkIGxvbmcgc3RhcnRwYWdlID0gaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCA+PiBQQUdFX1NISUZUOwotCQlpbnQgcGFnZXMgPSBpb21tdV9udW1fcGFnZXMoaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCwKLQkJCQkJICAgIGlvbW11LT5leGNsdXNpb25fbGVuZ3RoLAotCQkJCQkgICAgUEFHRV9TSVpFKTsKLQkJZG1hX29wc19yZXNlcnZlX2FkZHJlc3NlcyhkbWFfZG9tLCBzdGFydHBhZ2UsIHBhZ2VzKTsKLQl9CisJaWYgKGFsbG9jX25ld19yYW5nZShpb21tdSwgZG1hX2RvbSwgdHJ1ZSwgR0ZQX0tFUk5FTCkpCisJCWdvdG8gZnJlZV9kbWFfZG9tOwogCiAJLyoKLQkgKiBBdCB0aGUgbGFzdCBzdGVwLCBidWlsZCB0aGUgcGFnZSB0YWJsZXMgc28gd2UgZG9uJ3QgbmVlZCB0bwotCSAqIGFsbG9jYXRlIHBhZ2UgdGFibGUgcGFnZXMgaW4gdGhlIGRtYV9vcHMgbWFwcGluZy91bm1hcHBpbmcKLQkgKiBwYXRoLgorCSAqIG1hcmsgdGhlIGZpcnN0IHBhZ2UgYXMgYWxsb2NhdGVkIHNvIHdlIG5ldmVyIHJldHVybiAwIGFzCisJICogYSB2YWxpZCBkbWEtYWRkcmVzcy4gU28gd2UgY2FuIHVzZSAwIGFzIGVycm9yIHZhbHVlCiAJICovCi0JbnVtX3B0ZV9wYWdlcyA9IGRtYV9kb20tPmFwZXJ0dXJlX3NpemUgLyAoUEFHRV9TSVpFICogNTEyKTsKLQlkbWFfZG9tLT5wdGVfcGFnZXMgPSBremFsbG9jKG51bV9wdGVfcGFnZXMgKiBzaXplb2Yodm9pZCAqKSwKLQkJCUdGUF9LRVJORUwpOwotCWlmICghZG1hX2RvbS0+cHRlX3BhZ2VzKQotCQlnb3RvIGZyZWVfZG1hX2RvbTsKKwlkbWFfZG9tLT5hcGVydHVyZVswXS0+Yml0bWFwWzBdID0gMTsKKwlkbWFfZG9tLT5uZXh0X2FkZHJlc3MgPSAwOwogCi0JbDJfcGRlID0gKHU2NCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKLQlpZiAobDJfcGRlID09IE5VTEwpCi0JCWdvdG8gZnJlZV9kbWFfZG9tOwotCi0JZG1hX2RvbS0+ZG9tYWluLnB0X3Jvb3RbMF0gPSBJT01NVV9MMl9QREUodmlydF90b19waHlzKGwyX3BkZSkpOwotCi0JZm9yIChpID0gMDsgaSA8IG51bV9wdGVfcGFnZXM7ICsraSkgewotCQlkbWFfZG9tLT5wdGVfcGFnZXNbaV0gPSAodTY0ICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOwotCQlpZiAoIWRtYV9kb20tPnB0ZV9wYWdlc1tpXSkKLQkJCWdvdG8gZnJlZV9kbWFfZG9tOwotCQlhZGRyZXNzID0gdmlydF90b19waHlzKGRtYV9kb20tPnB0ZV9wYWdlc1tpXSk7Ci0JCWwyX3BkZVtpXSA9IElPTU1VX0wxX1BERShhZGRyZXNzKTsKLQl9CiAKIAlyZXR1cm4gZG1hX2RvbTsKIApAQCAtOTgzLDcgKzExMjcsNiBAQAogCXN0cnVjdCBwcm90ZWN0aW9uX2RvbWFpbiAqZG9tYWluOwogCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbWFpbjsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQlpbnQgb3JkZXIgPSBhbWRfaW9tbXVfYXBlcnR1cmVfb3JkZXI7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAogCWlmIChkZXZpZCA+IGFtZF9pb21tdV9sYXN0X2JkZikKQEAgLTEwMDIsMTcgKzExNDUsNyBAQAogCQkJICAidG8gYSBub24tZG1hLW9wcyBkb21haW5cbiIsIGRldl9uYW1lKGRldikpOwogCiAJc3dpdGNoIChhY3Rpb24pIHsKLQljYXNlIEJVU19OT1RJRllfQk9VTkRfRFJJVkVSOgotCQlpZiAoZG9tYWluKQotCQkJZ290byBvdXQ7Ci0JCWRtYV9kb21haW4gPSBmaW5kX3Byb3RlY3Rpb25fZG9tYWluKGRldmlkKTsKLQkJaWYgKCFkbWFfZG9tYWluKQotCQkJZG1hX2RvbWFpbiA9IGlvbW11LT5kZWZhdWx0X2RvbTsKLQkJYXR0YWNoX2RldmljZShpb21tdSwgJmRtYV9kb21haW4tPmRvbWFpbiwgZGV2aWQpOwotCQlwcmludGsoS0VSTl9JTkZPICJBTUQgSU9NTVU6IFVzaW5nIHByb3RlY3Rpb24gZG9tYWluICVkIGZvciAiCi0JCSAgICAgICAiZGV2aWNlICVzXG4iLCBkbWFfZG9tYWluLT5kb21haW4uaWQsIGRldl9uYW1lKGRldikpOwotCQlicmVhazsKLQljYXNlIEJVU19OT1RJRllfVU5CSU5EX0RSSVZFUjoKKwljYXNlIEJVU19OT1RJRllfVU5CT1VORF9EUklWRVI6CiAJCWlmICghZG9tYWluKQogCQkJZ290byBvdXQ7CiAJCWRldGFjaF9kZXZpY2UoZG9tYWluLCBkZXZpZCk7CkBAIC0xMDIyLDcgKzExNTUsNyBAQAogCQlkbWFfZG9tYWluID0gZmluZF9wcm90ZWN0aW9uX2RvbWFpbihkZXZpZCk7CiAJCWlmIChkbWFfZG9tYWluKQogCQkJZ290byBvdXQ7Ci0JCWRtYV9kb21haW4gPSBkbWFfb3BzX2RvbWFpbl9hbGxvYyhpb21tdSwgb3JkZXIpOworCQlkbWFfZG9tYWluID0gZG1hX29wc19kb21haW5fYWxsb2MoaW9tbXUpOwogCQlpZiAoIWRtYV9kb21haW4pCiAJCQlnb3RvIG91dDsKIAkJZG1hX2RvbWFpbi0+dGFyZ2V0X2RldiA9IGRldmlkOwpAQCAtMTEzMyw4ICsxMjY2LDggQEAKIAkJCWRtYV9kb20gPSAoKmlvbW11KS0+ZGVmYXVsdF9kb207CiAJCSpkb21haW4gPSAmZG1hX2RvbS0+ZG9tYWluOwogCQlhdHRhY2hfZGV2aWNlKCppb21tdSwgKmRvbWFpbiwgKmJkZik7Ci0JCXByaW50ayhLRVJOX0lORk8gIkFNRCBJT01NVTogVXNpbmcgcHJvdGVjdGlvbiBkb21haW4gJWQgZm9yICIKLQkJCQkiZGV2aWNlICVzXG4iLCAoKmRvbWFpbiktPmlkLCBkZXZfbmFtZShkZXYpKTsKKwkJRFVNUF9wcmludGsoIlVzaW5nIHByb3RlY3Rpb24gZG9tYWluICVkIGZvciBkZXZpY2UgJXNcbiIsCisJCQkgICAgKCpkb21haW4pLT5pZCwgZGV2X25hbWUoZGV2KSk7CiAJfQogCiAJaWYgKGRvbWFpbl9mb3JfZGV2aWNlKF9iZGYpID09IE5VTEwpCkBAIC0xMTQ0LDYgKzEyNzcsNjYgQEAKIH0KIAogLyoKKyAqIElmIHRoZSBwdGVfcGFnZSBpcyBub3QgeWV0IGFsbG9jYXRlZCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAorICovCitzdGF0aWMgdTY0KiBhbGxvY19wdGUoc3RydWN0IHByb3RlY3Rpb25fZG9tYWluICpkb20sCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcywgdTY0ICoqcHRlX3BhZ2UsIGdmcF90IGdmcCkKK3sKKwl1NjQgKnB0ZSwgKnBhZ2U7CisKKwlwdGUgPSAmZG9tLT5wdF9yb290W0lPTU1VX1BURV9MMl9JTkRFWChhZGRyZXNzKV07CisKKwlpZiAoIUlPTU1VX1BURV9QUkVTRU5UKCpwdGUpKSB7CisJCXBhZ2UgPSAodTY0ICopZ2V0X3plcm9lZF9wYWdlKGdmcCk7CisJCWlmICghcGFnZSkKKwkJCXJldHVybiBOVUxMOworCQkqcHRlID0gSU9NTVVfTDJfUERFKHZpcnRfdG9fcGh5cyhwYWdlKSk7CisJfQorCisJcHRlID0gSU9NTVVfUFRFX1BBR0UoKnB0ZSk7CisJcHRlID0gJnB0ZVtJT01NVV9QVEVfTDFfSU5ERVgoYWRkcmVzcyldOworCisJaWYgKCFJT01NVV9QVEVfUFJFU0VOVCgqcHRlKSkgeworCQlwYWdlID0gKHU2NCAqKWdldF96ZXJvZWRfcGFnZShnZnApOworCQlpZiAoIXBhZ2UpCisJCQlyZXR1cm4gTlVMTDsKKwkJKnB0ZSA9IElPTU1VX0wxX1BERSh2aXJ0X3RvX3BoeXMocGFnZSkpOworCX0KKworCXB0ZSA9IElPTU1VX1BURV9QQUdFKCpwdGUpOworCisJaWYgKHB0ZV9wYWdlKQorCQkqcHRlX3BhZ2UgPSBwdGU7CisKKwlwdGUgPSAmcHRlW0lPTU1VX1BURV9MMF9JTkRFWChhZGRyZXNzKV07CisKKwlyZXR1cm4gcHRlOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBmZXRjaGVzIHRoZSBQVEUgZm9yIGEgZ2l2ZW4gYWRkcmVzcyBpbiB0aGUgYXBlcnR1cmUKKyAqLworc3RhdGljIHU2NCogZG1hX29wc19nZXRfcHRlKHN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG9tLAorCQkJICAgIHVuc2lnbmVkIGxvbmcgYWRkcmVzcykKK3sKKwlzdHJ1Y3QgYXBlcnR1cmVfcmFuZ2UgKmFwZXJ0dXJlOworCXU2NCAqcHRlLCAqcHRlX3BhZ2U7CisKKwlhcGVydHVyZSA9IGRvbS0+YXBlcnR1cmVbQVBFUlRVUkVfUkFOR0VfSU5ERVgoYWRkcmVzcyldOworCWlmICghYXBlcnR1cmUpCisJCXJldHVybiBOVUxMOworCisJcHRlID0gYXBlcnR1cmUtPnB0ZV9wYWdlc1tBUEVSVFVSRV9QQUdFX0lOREVYKGFkZHJlc3MpXTsKKwlpZiAoIXB0ZSkgeworCQlwdGUgPSBhbGxvY19wdGUoJmRvbS0+ZG9tYWluLCBhZGRyZXNzLCAmcHRlX3BhZ2UsIEdGUF9BVE9NSUMpOworCQlhcGVydHVyZS0+cHRlX3BhZ2VzW0FQRVJUVVJFX1BBR0VfSU5ERVgoYWRkcmVzcyldID0gcHRlX3BhZ2U7CisJfSBlbHNlCisJCXB0ZSArPSBJT01NVV9QVEVfTDBfSU5ERVgoYWRkcmVzcyk7CisKKwlyZXR1cm4gcHRlOworfQorCisvKgogICogVGhpcyBpcyB0aGUgZ2VuZXJpYyBtYXAgZnVuY3Rpb24uIEl0IG1hcHMgb25lIDRrYiBwYWdlIGF0IHBhZGRyIHRvCiAgKiB0aGUgZ2l2ZW4gYWRkcmVzcyBpbiB0aGUgRE1BIGFkZHJlc3Mgc3BhY2UgZm9yIHRoZSBkb21haW4uCiAgKi8KQEAgLTExNTksOCArMTM1Miw5IEBACiAKIAlwYWRkciAmPSBQQUdFX01BU0s7CiAKLQlwdGUgID0gZG9tLT5wdGVfcGFnZXNbSU9NTVVfUFRFX0wxX0lOREVYKGFkZHJlc3MpXTsKLQlwdGUgKz0gSU9NTVVfUFRFX0wwX0lOREVYKGFkZHJlc3MpOworCXB0ZSAgPSBkbWFfb3BzX2dldF9wdGUoZG9tLCBhZGRyZXNzKTsKKwlpZiAoIXB0ZSkKKwkJcmV0dXJuIGJhZF9kbWFfYWRkcmVzczsKIAogCV9fcHRlID0gcGFkZHIgfCBJT01NVV9QVEVfUCB8IElPTU1VX1BURV9GQzsKIApAQCAtMTE4NSwxNCArMTM3OSwyMCBAQAogCQkJCSBzdHJ1Y3QgZG1hX29wc19kb21haW4gKmRvbSwKIAkJCQkgdW5zaWduZWQgbG9uZyBhZGRyZXNzKQogeworCXN0cnVjdCBhcGVydHVyZV9yYW5nZSAqYXBlcnR1cmU7CiAJdTY0ICpwdGU7CiAKIAlpZiAoYWRkcmVzcyA+PSBkb20tPmFwZXJ0dXJlX3NpemUpCiAJCXJldHVybjsKIAotCVdBUk5fT04oYWRkcmVzcyAmIH5QQUdFX01BU0sgfHwgYWRkcmVzcyA+PSBkb20tPmFwZXJ0dXJlX3NpemUpOworCWFwZXJ0dXJlID0gZG9tLT5hcGVydHVyZVtBUEVSVFVSRV9SQU5HRV9JTkRFWChhZGRyZXNzKV07CisJaWYgKCFhcGVydHVyZSkKKwkJcmV0dXJuOwogCi0JcHRlICA9IGRvbS0+cHRlX3BhZ2VzW0lPTU1VX1BURV9MMV9JTkRFWChhZGRyZXNzKV07CisJcHRlICA9IGFwZXJ0dXJlLT5wdGVfcGFnZXNbQVBFUlRVUkVfUEFHRV9JTkRFWChhZGRyZXNzKV07CisJaWYgKCFwdGUpCisJCXJldHVybjsKKwogCXB0ZSArPSBJT01NVV9QVEVfTDBfSU5ERVgoYWRkcmVzcyk7CiAKIAlXQVJOX09OKCEqcHRlKTsKQEAgLTEyMTYsNyArMTQxNiw3IEBACiAJCQkgICAgICAgdTY0IGRtYV9tYXNrKQogewogCWRtYV9hZGRyX3Qgb2Zmc2V0ID0gcGFkZHIgJiB+UEFHRV9NQVNLOwotCWRtYV9hZGRyX3QgYWRkcmVzcywgc3RhcnQ7CisJZG1hX2FkZHJfdCBhZGRyZXNzLCBzdGFydCwgcmV0OwogCXVuc2lnbmVkIGludCBwYWdlczsKIAl1bnNpZ25lZCBsb25nIGFsaWduX21hc2sgPSAwOwogCWludCBpOwpAQCAtMTIzMiwxNCArMTQzMiwzMyBAQAogCWlmIChhbGlnbikKIAkJYWxpZ25fbWFzayA9ICgxVUwgPDwgZ2V0X29yZGVyKHNpemUpKSAtIDE7CiAKK3JldHJ5OgogCWFkZHJlc3MgPSBkbWFfb3BzX2FsbG9jX2FkZHJlc3NlcyhkZXYsIGRtYV9kb20sIHBhZ2VzLCBhbGlnbl9tYXNrLAogCQkJCQkgIGRtYV9tYXNrKTsKLQlpZiAodW5saWtlbHkoYWRkcmVzcyA9PSBiYWRfZG1hX2FkZHJlc3MpKQotCQlnb3RvIG91dDsKKwlpZiAodW5saWtlbHkoYWRkcmVzcyA9PSBiYWRfZG1hX2FkZHJlc3MpKSB7CisJCS8qCisJCSAqIHNldHRpbmcgbmV4dF9hZGRyZXNzIGhlcmUgd2lsbCBsZXQgdGhlIGFkZHJlc3MKKwkJICogYWxsb2NhdG9yIG9ubHkgc2NhbiB0aGUgbmV3IGFsbG9jYXRlZCByYW5nZSBpbiB0aGUKKwkJICogZmlyc3QgcnVuLiBUaGlzIGlzIGEgc21hbGwgb3B0aW1pemF0aW9uLgorCQkgKi8KKwkJZG1hX2RvbS0+bmV4dF9hZGRyZXNzID0gZG1hX2RvbS0+YXBlcnR1cmVfc2l6ZTsKKworCQlpZiAoYWxsb2NfbmV3X3JhbmdlKGlvbW11LCBkbWFfZG9tLCBmYWxzZSwgR0ZQX0FUT01JQykpCisJCQlnb3RvIG91dDsKKworCQkvKgorCQkgKiBhcGVydHVyZSB3YXMgc3VjZXNzZnVsbHkgZW5sYXJnZWQgYnkgMTI4IE1CLCB0cnkKKwkJICogYWxsb2NhdGlvbiBhZ2FpbgorCQkgKi8KKwkJZ290byByZXRyeTsKKwl9CiAKIAlzdGFydCA9IGFkZHJlc3M7CiAJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyArK2kpIHsKLQkJZG1hX29wc19kb21haW5fbWFwKGlvbW11LCBkbWFfZG9tLCBzdGFydCwgcGFkZHIsIGRpcik7CisJCXJldCA9IGRtYV9vcHNfZG9tYWluX21hcChpb21tdSwgZG1hX2RvbSwgc3RhcnQsIHBhZGRyLCBkaXIpOworCQlpZiAocmV0ID09IGJhZF9kbWFfYWRkcmVzcykKKwkJCWdvdG8gb3V0X3VubWFwOworCiAJCXBhZGRyICs9IFBBR0VfU0laRTsKIAkJc3RhcnQgKz0gUEFHRV9TSVpFOwogCX0KQEAgLTEyNTUsNiArMTQ3NCwxNyBAQAogCiBvdXQ6CiAJcmV0dXJuIGFkZHJlc3M7CisKK291dF91bm1hcDoKKworCWZvciAoLS1pOyBpID49IDA7IC0taSkgeworCQlzdGFydCAtPSBQQUdFX1NJWkU7CisJCWRtYV9vcHNfZG9tYWluX3VubWFwKGlvbW11LCBkbWFfZG9tLCBzdGFydCk7CisJfQorCisJZG1hX29wc19mcmVlX2FkZHJlc3NlcyhkbWFfZG9tLCBhZGRyZXNzLCBwYWdlcyk7CisKKwlyZXR1cm4gYmFkX2RtYV9hZGRyZXNzOwogfQogCiAvKgpAQCAtMTUzNyw4ICsxNzY3LDEwIEBACiAJKmRtYV9hZGRyID0gX19tYXBfc2luZ2xlKGRldiwgaW9tbXUsIGRvbWFpbi0+cHJpdiwgcGFkZHIsCiAJCQkJIHNpemUsIERNQV9CSURJUkVDVElPTkFMLCB0cnVlLCBkbWFfbWFzayk7CiAKLQlpZiAoKmRtYV9hZGRyID09IGJhZF9kbWFfYWRkcmVzcykKKwlpZiAoKmRtYV9hZGRyID09IGJhZF9kbWFfYWRkcmVzcykgeworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkb21haW4tPmxvY2ssIGZsYWdzKTsKIAkJZ290byBvdXRfZnJlZTsKKwl9CiAKIAlpb21tdV9jb21wbGV0aW9uX3dhaXQoaW9tbXUpOwogCkBAIC0xNjI1LDcgKzE4NTcsNiBAQAogCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBOVUxMOwogCXN0cnVjdCBkbWFfb3BzX2RvbWFpbiAqZG1hX2RvbTsKIAlzdHJ1Y3QgYW1kX2lvbW11ICppb21tdTsKLQlpbnQgb3JkZXIgPSBhbWRfaW9tbXVfYXBlcnR1cmVfb3JkZXI7CiAJdTE2IGRldmlkOwogCiAJd2hpbGUgKChkZXYgPSBwY2lfZ2V0X2RldmljZShQQ0lfQU5ZX0lELCBQQ0lfQU5ZX0lELCBkZXYpKSAhPSBOVUxMKSB7CkBAIC0xNjM4LDcgKzE4NjksNyBAQAogCQlpb21tdSA9IGFtZF9pb21tdV9ybG9va3VwX3RhYmxlW2RldmlkXTsKIAkJaWYgKCFpb21tdSkKIAkJCWNvbnRpbnVlOwotCQlkbWFfZG9tID0gZG1hX29wc19kb21haW5fYWxsb2MoaW9tbXUsIG9yZGVyKTsKKwkJZG1hX2RvbSA9IGRtYV9vcHNfZG9tYWluX2FsbG9jKGlvbW11KTsKIAkJaWYgKCFkbWFfZG9tKQogCQkJY29udGludWU7CiAJCWluaXRfdW5pdHlfbWFwcGluZ3NfZm9yX2RldmljZShkbWFfZG9tLCBkZXZpZCk7CkBAIC0xNjY0LDcgKzE4OTUsNiBAQAogaW50IF9faW5pdCBhbWRfaW9tbXVfaW5pdF9kbWFfb3BzKHZvaWQpCiB7CiAJc3RydWN0IGFtZF9pb21tdSAqaW9tbXU7Ci0JaW50IG9yZGVyID0gYW1kX2lvbW11X2FwZXJ0dXJlX29yZGVyOwogCWludCByZXQ7CiAKIAkvKgpAQCAtMTY3Miw4ICsxOTAyLDggQEAKIAkgKiBmb3VuZCBpbiB0aGUgc3lzdGVtLiBEZXZpY2VzIG5vdCBhc3NpZ25lZCB0byBhbnkgb3RoZXIKIAkgKiBwcm90ZWN0aW9uIGRvbWFpbiB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBkZWZhdWx0IG9uZS4KIAkgKi8KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvbW11LCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpIHsKLQkJaW9tbXUtPmRlZmF1bHRfZG9tID0gZG1hX29wc19kb21haW5fYWxsb2MoaW9tbXUsIG9yZGVyKTsKKwlmb3JfZWFjaF9pb21tdShpb21tdSkgeworCQlpb21tdS0+ZGVmYXVsdF9kb20gPSBkbWFfb3BzX2RvbWFpbl9hbGxvYyhpb21tdSk7CiAJCWlmIChpb21tdS0+ZGVmYXVsdF9kb20gPT0gTlVMTCkKIAkJCXJldHVybiAtRU5PTUVNOwogCQlpb21tdS0+ZGVmYXVsdF9kb20tPmRvbWFpbi5mbGFncyB8PSBQRF9ERUZBVUxUX01BU0s7CkBAIC0xNzEwLDcgKzE5NDAsNyBAQAogCiBmcmVlX2RvbWFpbnM6CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGlvbW11LCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpIHsKKwlmb3JfZWFjaF9pb21tdShpb21tdSkgewogCQlpZiAoaW9tbXUtPmRlZmF1bHRfZG9tKQogCQkJZG1hX29wc19kb21haW5fZnJlZShpb21tdS0+ZGVmYXVsdF9kb20pOwogCX0KQEAgLTE4NDIsNyArMjA3Miw3IEBACiAKIAlvbGRfZG9tYWluID0gZG9tYWluX2Zvcl9kZXZpY2UoZGV2aWQpOwogCWlmIChvbGRfZG9tYWluKQotCQlyZXR1cm4gLUVCVVNZOworCQlkZXRhY2hfZGV2aWNlKG9sZF9kb21haW4sIGRldmlkKTsKIAogCWF0dGFjaF9kZXZpY2UoaW9tbXUsIGRvbWFpbiwgZGV2aWQpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYW1kX2lvbW11X2luaXQuYyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCmluZGV4IDhjMGJlMDkuLjIzODk4OWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hbWRfaW9tbXVfaW5pdC5jCkBAIC0xMTUsMTUgKzExNSwyMSBAQAogCXU2NCByYW5nZV9sZW5ndGg7CiB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwogCitib29sIGFtZF9pb21tdV9kdW1wOworCiBzdGF0aWMgaW50IF9faW5pdGRhdGEgYW1kX2lvbW11X2RldGVjdGVkOwogCiB1MTYgYW1kX2lvbW11X2xhc3RfYmRmOwkJCS8qIGxhcmdlc3QgUENJIGRldmljZSBpZCB3ZSBoYXZlCiAJCQkJCSAgIHRvIGhhbmRsZSAqLwogTElTVF9IRUFEKGFtZF9pb21tdV91bml0eV9tYXApOwkJLyogYSBsaXN0IG9mIHJlcXVpcmVkIHVuaXR5IG1hcHBpbmdzCiAJCQkJCSAgIHdlIGZpbmQgaW4gQUNQSSAqLwotdW5zaWduZWQgYW1kX2lvbW11X2FwZXJ0dXJlX29yZGVyID0gMjY7IC8qIHNpemUgb2YgYXBlcnR1cmUgaW4gcG93ZXIgb2YgMiAqLworI2lmZGVmIENPTkZJR19JT01NVV9TVFJFU1MKK2Jvb2wgYW1kX2lvbW11X2lzb2xhdGUgPSBmYWxzZTsKKyNlbHNlCiBib29sIGFtZF9pb21tdV9pc29sYXRlID0gdHJ1ZTsJCS8qIGlmIHRydWUsIGRldmljZSBpc29sYXRpb24gaXMKIAkJCQkJICAgZW5hYmxlZCAqLworI2VuZGlmCisKIGJvb2wgYW1kX2lvbW11X3VubWFwX2ZsdXNoOwkJLyogaWYgdHJ1ZSwgZmx1c2ggb24gZXZlcnkgdW5tYXAgKi8KIAogTElTVF9IRUFEKGFtZF9pb21tdV9saXN0KTsJCS8qIGxpc3Qgb2YgYWxsIEFNRCBJT01NVXMgaW4gdGhlCkBAIC0xNzUsNyArMTgxLDcgQEAKIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB0Ymxfc2l6ZShpbnQgZW50cnlfc2l6ZSkKIHsKIAl1bnNpZ25lZCBzaGlmdCA9IFBBR0VfU0hJRlQgKwotCQkJIGdldF9vcmRlcihhbWRfaW9tbXVfbGFzdF9iZGYgKiBlbnRyeV9zaXplKTsKKwkJCSBnZXRfb3JkZXIoKChpbnQpYW1kX2lvbW11X2xhc3RfYmRmICsgMSkgKiBlbnRyeV9zaXplKTsKIAogCXJldHVybiAxVUwgPDwgc2hpZnQ7CiB9CkBAIC0xOTMsNyArMTk5LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gc2V0IHRoZSBleGNsdXNpb24gcmFuZ2UgaW4gdGhlIElPTU1VLiBETUEgYWNjZXNzZXMgdG8gdGhlCiAgKiBleGNsdXNpb24gcmFuZ2UgYXJlIHBhc3NlZCB0aHJvdWdoIHVudHJhbnNsYXRlZAogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW9tbXVfc2V0X2V4Y2x1c2lvbl9yYW5nZShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3N0YXRpYyB2b2lkIGlvbW11X3NldF9leGNsdXNpb25fcmFuZ2Uoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7CiAJdTY0IHN0YXJ0ID0gaW9tbXUtPmV4Y2x1c2lvbl9zdGFydCAmIFBBR0VfTUFTSzsKIAl1NjQgbGltaXQgPSAoc3RhcnQgKyBpb21tdS0+ZXhjbHVzaW9uX2xlbmd0aCkgJiBQQUdFX01BU0s7CkBAIC0yMjUsNyArMjMxLDcgQEAKIH0KIAogLyogR2VuZXJpYyBmdW5jdGlvbnMgdG8gZW5hYmxlL2Rpc2FibGUgY2VydGFpbiBmZWF0dXJlcyBvZiB0aGUgSU9NTVUuICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW9tbXVfZmVhdHVyZV9lbmFibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsIHU4IGJpdCkKK3N0YXRpYyB2b2lkIGlvbW11X2ZlYXR1cmVfZW5hYmxlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11LCB1OCBiaXQpCiB7CiAJdTMyIGN0cmw7CiAKQEAgLTI0NCw3ICsyNTAsNyBAQAogfQogCiAvKiBGdW5jdGlvbiB0byBlbmFibGUgdGhlIGhhcmR3YXJlICovCi1zdGF0aWMgdm9pZCBfX2luaXQgaW9tbXVfZW5hYmxlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQorc3RhdGljIHZvaWQgaW9tbXVfZW5hYmxlKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewogCXByaW50ayhLRVJOX0lORk8gIkFNRCBJT01NVTogRW5hYmxpbmcgSU9NTVUgYXQgJXMgY2FwIDB4JWh4XG4iLAogCSAgICAgICBkZXZfbmFtZSgmaW9tbXUtPmRldi0+ZGV2KSwgaW9tbXUtPmNhcF9wdHIpOwpAQCAtMjUyLDExICsyNTgsOSBAQAogCWlvbW11X2ZlYXR1cmVfZW5hYmxlKGlvbW11LCBDT05UUk9MX0lPTU1VX0VOKTsKIH0KIAotLyogRnVuY3Rpb24gdG8gZW5hYmxlIElPTU1VIGV2ZW50IGxvZ2dpbmcgYW5kIGV2ZW50IGludGVycnVwdHMgKi8KLXN0YXRpYyB2b2lkIF9faW5pdCBpb21tdV9lbmFibGVfZXZlbnRfbG9nZ2luZyhzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKK3N0YXRpYyB2b2lkIGlvbW11X2Rpc2FibGUoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCiB7Ci0JaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfRVZUX0xPR19FTik7Ci0JaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfRVZUX0lOVF9FTik7CisJaW9tbXVfZmVhdHVyZV9kaXNhYmxlKGlvbW11LCBDT05UUk9MX0lPTU1VX0VOKTsKIH0KIAogLyoKQEAgLTQxMywyNSArNDE3LDM2IEBACiB7CiAJdTggKmNtZF9idWYgPSAodTggKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAogCQkJZ2V0X29yZGVyKENNRF9CVUZGRVJfU0laRSkpOwotCXU2NCBlbnRyeTsKIAogCWlmIChjbWRfYnVmID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCiAJaW9tbXUtPmNtZF9idWZfc2l6ZSA9IENNRF9CVUZGRVJfU0laRTsKIAotCWVudHJ5ID0gKHU2NCl2aXJ0X3RvX3BoeXMoY21kX2J1Zik7CisJcmV0dXJuIGNtZF9idWY7Cit9CisKKy8qCisgKiBUaGlzIGZ1bmN0aW9uIHdyaXRlcyB0aGUgY29tbWFuZCBidWZmZXIgYWRkcmVzcyB0byB0aGUgaGFyZHdhcmUgYW5kCisgKiBlbmFibGVzIGl0LgorICovCitzdGF0aWMgdm9pZCBpb21tdV9lbmFibGVfY29tbWFuZF9idWZmZXIoc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCit7CisJdTY0IGVudHJ5OworCisJQlVHX09OKGlvbW11LT5jbWRfYnVmID09IE5VTEwpOworCisJZW50cnkgPSAodTY0KXZpcnRfdG9fcGh5cyhpb21tdS0+Y21kX2J1Zik7CiAJZW50cnkgfD0gTU1JT19DTURfU0laRV81MTI7CisKIAltZW1jcHlfdG9pbyhpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfQlVGX09GRlNFVCwKLQkJCSZlbnRyeSwgc2l6ZW9mKGVudHJ5KSk7CisJCSAgICAmZW50cnksIHNpemVvZihlbnRyeSkpOwogCiAJLyogc2V0IGhlYWQgYW5kIHRhaWwgdG8gemVybyBtYW51YWxseSAqLwogCXdyaXRlbCgweDAwLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfSEVBRF9PRkZTRVQpOwogCXdyaXRlbCgweDAwLCBpb21tdS0+bW1pb19iYXNlICsgTU1JT19DTURfVEFJTF9PRkZTRVQpOwogCiAJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfQ01EQlVGX0VOKTsKLQotCXJldHVybiBjbWRfYnVmOwogfQogCiBzdGF0aWMgdm9pZCBfX2luaXQgZnJlZV9jb21tYW5kX2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKQEAgLTQ0MywyMCArNDU4LDI3IEBACiAvKiBhbGxvY2F0ZXMgdGhlIG1lbW9yeSB3aGVyZSB0aGUgSU9NTVUgd2lsbCBsb2cgaXRzIGV2ZW50cyB0byAqLwogc3RhdGljIHU4ICogX19pbml0IGFsbG9jX2V2ZW50X2J1ZmZlcihzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKIHsKLQl1NjQgZW50cnk7CiAJaW9tbXUtPmV2dF9idWYgPSAodTggKilfX2dldF9mcmVlX3BhZ2VzKEdGUF9LRVJORUwgfCBfX0dGUF9aRVJPLAogCQkJCQkJZ2V0X29yZGVyKEVWVF9CVUZGRVJfU0laRSkpOwogCiAJaWYgKGlvbW11LT5ldnRfYnVmID09IE5VTEwpCiAJCXJldHVybiBOVUxMOwogCisJcmV0dXJuIGlvbW11LT5ldnRfYnVmOworfQorCitzdGF0aWMgdm9pZCBpb21tdV9lbmFibGVfZXZlbnRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQoreworCXU2NCBlbnRyeTsKKworCUJVR19PTihpb21tdS0+ZXZ0X2J1ZiA9PSBOVUxMKTsKKwogCWVudHJ5ID0gKHU2NCl2aXJ0X3RvX3BoeXMoaW9tbXUtPmV2dF9idWYpIHwgRVZUX0xFTl9NQVNLOworCiAJbWVtY3B5X3RvaW8oaW9tbXUtPm1taW9fYmFzZSArIE1NSU9fRVZUX0JVRl9PRkZTRVQsCiAJCSAgICAmZW50cnksIHNpemVvZihlbnRyeSkpOwogCi0JaW9tbXUtPmV2dF9idWZfc2l6ZSA9IEVWVF9CVUZGRVJfU0laRTsKLQotCXJldHVybiBpb21tdS0+ZXZ0X2J1ZjsKKwlpb21tdV9mZWF0dXJlX2VuYWJsZShpb21tdSwgQ09OVFJPTF9FVlRfTE9HX0VOKTsKIH0KIAogc3RhdGljIHZvaWQgX19pbml0IGZyZWVfZXZlbnRfYnVmZmVyKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQpAQCAtNTk2LDMyICs2MTgsODMgQEAKIAlwICs9IHNpemVvZihzdHJ1Y3QgaXZoZF9oZWFkZXIpOwogCWVuZCArPSBoLT5sZW5ndGg7CiAKKwogCXdoaWxlIChwIDwgZW5kKSB7CiAJCWUgPSAoc3RydWN0IGl2aGRfZW50cnkgKilwOwogCQlzd2l0Y2ggKGUtPnR5cGUpIHsKIAkJY2FzZSBJVkhEX0RFVl9BTEw6CisKKwkJCURVTVBfcHJpbnRrKCIgIERFVl9BTExcdFx0XHQgZmlyc3QgZGV2aWQ6ICUwMng6JTAyeC4leCIKKwkJCQkgICAgIiBsYXN0IGRldmljZSAlMDJ4OiUwMnguJXggZmxhZ3M6ICUwMnhcbiIsCisJCQkJICAgIFBDSV9CVVMoaW9tbXUtPmZpcnN0X2RldmljZSksCisJCQkJICAgIFBDSV9TTE9UKGlvbW11LT5maXJzdF9kZXZpY2UpLAorCQkJCSAgICBQQ0lfRlVOQyhpb21tdS0+Zmlyc3RfZGV2aWNlKSwKKwkJCQkgICAgUENJX0JVUyhpb21tdS0+bGFzdF9kZXZpY2UpLAorCQkJCSAgICBQQ0lfU0xPVChpb21tdS0+bGFzdF9kZXZpY2UpLAorCQkJCSAgICBQQ0lfRlVOQyhpb21tdS0+bGFzdF9kZXZpY2UpLAorCQkJCSAgICBlLT5mbGFncyk7CisKIAkJCWZvciAoZGV2X2kgPSBpb21tdS0+Zmlyc3RfZGV2aWNlOwogCQkJCQlkZXZfaSA8PSBpb21tdS0+bGFzdF9kZXZpY2U7ICsrZGV2X2kpCiAJCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldl9pLAogCQkJCQkJCWUtPmZsYWdzLCAwKTsKIAkJCWJyZWFrOwogCQljYXNlIElWSERfREVWX1NFTEVDVDoKKworCQkJRFVNUF9wcmludGsoIiAgREVWX1NFTEVDVFx0XHRcdCBkZXZpZDogJTAyeDolMDJ4LiV4ICIKKwkJCQkgICAgImZsYWdzOiAlMDJ4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCisJCQkJICAgIGUtPmZsYWdzKTsKKwogCQkJZGV2aWQgPSBlLT5kZXZpZDsKIAkJCXNldF9kZXZfZW50cnlfZnJvbV9hY3BpKGlvbW11LCBkZXZpZCwgZS0+ZmxhZ3MsIDApOwogCQkJYnJlYWs7CiAJCWNhc2UgSVZIRF9ERVZfU0VMRUNUX1JBTkdFX1NUQVJUOgorCisJCQlEVU1QX3ByaW50aygiICBERVZfU0VMRUNUX1JBTkdFX1NUQVJUXHQgIgorCQkJCSAgICAiZGV2aWQ6ICUwMng6JTAyeC4leCBmbGFnczogJTAyeFxuIiwKKwkJCQkgICAgUENJX0JVUyhlLT5kZXZpZCksCisJCQkJICAgIFBDSV9TTE9UKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX0ZVTkMoZS0+ZGV2aWQpLAorCQkJCSAgICBlLT5mbGFncyk7CisKIAkJCWRldmlkX3N0YXJ0ID0gZS0+ZGV2aWQ7CiAJCQlmbGFncyA9IGUtPmZsYWdzOwogCQkJZXh0X2ZsYWdzID0gMDsKIAkJCWFsaWFzID0gZmFsc2U7CiAJCQlicmVhazsKIAkJY2FzZSBJVkhEX0RFVl9BTElBUzoKKworCQkJRFVNUF9wcmludGsoIiAgREVWX0FMSUFTXHRcdFx0IGRldmlkOiAlMDJ4OiUwMnguJXggIgorCQkJCSAgICAiZmxhZ3M6ICUwMnggZGV2aWRfdG86ICUwMng6JTAyeC4leFxuIiwKKwkJCQkgICAgUENJX0JVUyhlLT5kZXZpZCksCisJCQkJICAgIFBDSV9TTE9UKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX0ZVTkMoZS0+ZGV2aWQpLAorCQkJCSAgICBlLT5mbGFncywKKwkJCQkgICAgUENJX0JVUyhlLT5leHQgPj4gOCksCisJCQkJICAgIFBDSV9TTE9UKGUtPmV4dCA+PiA4KSwKKwkJCQkgICAgUENJX0ZVTkMoZS0+ZXh0ID4+IDgpKTsKKwogCQkJZGV2aWQgPSBlLT5kZXZpZDsKIAkJCWRldmlkX3RvID0gZS0+ZXh0ID4+IDg7Ci0JCQlzZXRfZGV2X2VudHJ5X2Zyb21fYWNwaShpb21tdSwgZGV2aWQsIGUtPmZsYWdzLCAwKTsKKwkJCXNldF9kZXZfZW50cnlfZnJvbV9hY3BpKGlvbW11LCBkZXZpZF90bywgZS0+ZmxhZ3MsIDApOwogCQkJYW1kX2lvbW11X2FsaWFzX3RhYmxlW2RldmlkXSA9IGRldmlkX3RvOwogCQkJYnJlYWs7CiAJCWNhc2UgSVZIRF9ERVZfQUxJQVNfUkFOR0U6CisKKwkJCURVTVBfcHJpbnRrKCIgIERFVl9BTElBU19SQU5HRVx0XHQgIgorCQkJCSAgICAiZGV2aWQ6ICUwMng6JTAyeC4leCBmbGFnczogJTAyeCAiCisJCQkJICAgICJkZXZpZF90bzogJTAyeDolMDJ4LiV4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCisJCQkJICAgIGUtPmZsYWdzLAorCQkJCSAgICBQQ0lfQlVTKGUtPmV4dCA+PiA4KSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZXh0ID4+IDgpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5leHQgPj4gOCkpOworCiAJCQlkZXZpZF9zdGFydCA9IGUtPmRldmlkOwogCQkJZmxhZ3MgPSBlLT5mbGFnczsKIAkJCWRldmlkX3RvID0gZS0+ZXh0ID4+IDg7CkBAIC02MjksMTcgKzcwMiwzOSBAQAogCQkJYWxpYXMgPSB0cnVlOwogCQkJYnJlYWs7CiAJCWNhc2UgSVZIRF9ERVZfRVhUX1NFTEVDVDoKKworCQkJRFVNUF9wcmludGsoIiAgREVWX0VYVF9TRUxFQ1RcdFx0IGRldmlkOiAlMDJ4OiUwMnguJXggIgorCQkJCSAgICAiZmxhZ3M6ICUwMnggZXh0OiAlMDh4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCisJCQkJICAgIGUtPmZsYWdzLCBlLT5leHQpOworCiAJCQlkZXZpZCA9IGUtPmRldmlkOwogCQkJc2V0X2Rldl9lbnRyeV9mcm9tX2FjcGkoaW9tbXUsIGRldmlkLCBlLT5mbGFncywKIAkJCQkJCWUtPmV4dCk7CiAJCQlicmVhazsKIAkJY2FzZSBJVkhEX0RFVl9FWFRfU0VMRUNUX1JBTkdFOgorCisJCQlEVU1QX3ByaW50aygiICBERVZfRVhUX1NFTEVDVF9SQU5HRVx0IGRldmlkOiAiCisJCQkJICAgICIlMDJ4OiUwMnguJXggZmxhZ3M6ICUwMnggZXh0OiAlMDh4XG4iLAorCQkJCSAgICBQQ0lfQlVTKGUtPmRldmlkKSwKKwkJCQkgICAgUENJX1NMT1QoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfRlVOQyhlLT5kZXZpZCksCisJCQkJICAgIGUtPmZsYWdzLCBlLT5leHQpOworCiAJCQlkZXZpZF9zdGFydCA9IGUtPmRldmlkOwogCQkJZmxhZ3MgPSBlLT5mbGFnczsKIAkJCWV4dF9mbGFncyA9IGUtPmV4dDsKIAkJCWFsaWFzID0gZmFsc2U7CiAJCQlicmVhazsKIAkJY2FzZSBJVkhEX0RFVl9SQU5HRV9FTkQ6CisKKwkJCURVTVBfcHJpbnRrKCIgIERFVl9SQU5HRV9FTkRcdFx0IGRldmlkOiAlMDJ4OiUwMnguJXhcbiIsCisJCQkJICAgIFBDSV9CVVMoZS0+ZGV2aWQpLAorCQkJCSAgICBQQ0lfU0xPVChlLT5kZXZpZCksCisJCQkJICAgIFBDSV9GVU5DKGUtPmRldmlkKSk7CisKIAkJCWRldmlkID0gZS0+ZGV2aWQ7CiAJCQlmb3IgKGRldl9pID0gZGV2aWRfc3RhcnQ7IGRldl9pIDw9IGRldmlkOyArK2Rldl9pKSB7CiAJCQkJaWYgKGFsaWFzKQpAQCAtNjc5LDcgKzc3NCw3IEBACiB7CiAJc3RydWN0IGFtZF9pb21tdSAqaW9tbXUsICpuZXh0OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGlvbW11LCBuZXh0LCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpIHsKKwlmb3JfZWFjaF9pb21tdV9zYWZlKGlvbW11LCBuZXh0KSB7CiAJCWxpc3RfZGVsKCZpb21tdS0+bGlzdCk7CiAJCWZyZWVfaW9tbXVfb25lKGlvbW11KTsKIAkJa2ZyZWUoaW9tbXUpOwpAQCAtNzEwLDcgKzgwNSw2IEBACiAJaWYgKCFpb21tdS0+bW1pb19iYXNlKQogCQlyZXR1cm4gLUVOT01FTTsKIAotCWlvbW11X3NldF9kZXZpY2VfdGFibGUoaW9tbXUpOwogCWlvbW11LT5jbWRfYnVmID0gYWxsb2NfY29tbWFuZF9idWZmZXIoaW9tbXUpOwogCWlmICghaW9tbXUtPmNtZF9idWYpCiAJCXJldHVybiAtRU5PTUVNOwpAQCAtNzQ2LDYgKzg0MCwxNSBAQAogCQloID0gKHN0cnVjdCBpdmhkX2hlYWRlciAqKXA7CiAJCXN3aXRjaCAoKnApIHsKIAkJY2FzZSBBQ1BJX0lWSERfVFlQRToKKworCQkJRFVNUF9wcmludGsoIklPTU1VOiBkZXZpY2U6ICUwMng6JTAyeC4lMDF4IGNhcDogJTA0eCAiCisJCQkJICAgICJzZWc6ICVkIGZsYWdzOiAlMDF4IGluZm8gJTA0eFxuIiwKKwkJCQkgICAgUENJX0JVUyhoLT5kZXZpZCksIFBDSV9TTE9UKGgtPmRldmlkKSwKKwkJCQkgICAgUENJX0ZVTkMoaC0+ZGV2aWQpLCBoLT5jYXBfcHRyLAorCQkJCSAgICBoLT5wY2lfc2VnLCBoLT5mbGFncywgaC0+aW5mbyk7CisJCQlEVU1QX3ByaW50aygiICAgICAgIG1taW8tYWRkcjogJTAxNmxseFxuIiwKKwkJCQkgICAgaC0+bW1pb19waHlzKTsKKwogCQkJaW9tbXUgPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgYW1kX2lvbW11KSwgR0ZQX0tFUk5FTCk7CiAJCQlpZiAoaW9tbXUgPT0gTlVMTCkKIAkJCQlyZXR1cm4gLUVOT01FTTsKQEAgLTc3Myw1NiArODc2LDkgQEAKICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotc3RhdGljIGludCBfX2luaXQgaW9tbXVfc2V0dXBfbXNpeChzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKLXsKLQlzdHJ1Y3QgYW1kX2lvbW11ICpjdXJyOwotCXN0cnVjdCBtc2l4X2VudHJ5IGVudHJpZXNbMzJdOyAvKiBvbmx5IDMyIHN1cHBvcnRlZCBieSBBTUQgSU9NTVUgKi8KLQlpbnQgbnZlYyA9IDAsIGk7Ci0KLQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cnIsICZhbWRfaW9tbXVfbGlzdCwgbGlzdCkgewotCQlpZiAoY3Vyci0+ZGV2ID09IGlvbW11LT5kZXYpIHsKLQkJCWVudHJpZXNbbnZlY10uZW50cnkgPSBjdXJyLT5ldnRfbXNpX251bTsKLQkJCWVudHJpZXNbbnZlY10udmVjdG9yID0gMDsKLQkJCWN1cnItPmludF9lbmFibGVkID0gdHJ1ZTsKLQkJCW52ZWMrKzsKLQkJfQotCX0KLQotCWlmIChwY2lfZW5hYmxlX21zaXgoaW9tbXUtPmRldiwgZW50cmllcywgbnZlYykpIHsKLQkJcGNpX2Rpc2FibGVfbXNpeChpb21tdS0+ZGV2KTsKLQkJcmV0dXJuIDE7Ci0JfQotCi0JZm9yIChpID0gMDsgaSA8IG52ZWM7ICsraSkgewotCQlpbnQgciA9IHJlcXVlc3RfaXJxKGVudHJpZXMtPnZlY3RvciwgYW1kX2lvbW11X2ludF9oYW5kbGVyLAotCQkJCSAgICBJUlFGX1NBTVBMRV9SQU5ET00sCi0JCQkJICAgICJBTUQgSU9NTVUiLAotCQkJCSAgICBOVUxMKTsKLQkJaWYgKHIpCi0JCQlnb3RvIG91dF9mcmVlOwotCX0KLQotCXJldHVybiAwOwotCi1vdXRfZnJlZToKLQlmb3IgKGkgLT0gMTsgaSA+PSAwOyAtLWkpCi0JCWZyZWVfaXJxKGVudHJpZXMtPnZlY3RvciwgTlVMTCk7Ci0KLQlwY2lfZGlzYWJsZV9tc2l4KGlvbW11LT5kZXYpOwotCi0JcmV0dXJuIDE7Ci19Ci0KIHN0YXRpYyBpbnQgX19pbml0IGlvbW11X3NldHVwX21zaShzdHJ1Y3QgYW1kX2lvbW11ICppb21tdSkKIHsKIAlpbnQgcjsKLQlzdHJ1Y3QgYW1kX2lvbW11ICpjdXJyOwotCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShjdXJyLCAmYW1kX2lvbW11X2xpc3QsIGxpc3QpIHsKLQkJaWYgKGN1cnItPmRldiA9PSBpb21tdS0+ZGV2KQotCQkJY3Vyci0+aW50X2VuYWJsZWQgPSB0cnVlOwotCX0KLQogCiAJaWYgKHBjaV9lbmFibGVfbXNpKGlvbW11LT5kZXYpKQogCQlyZXR1cm4gMTsKQEAgLTgzNywxNyArODkzLDE4IEBACiAJCXJldHVybiAxOwogCX0KIAorCWlvbW11LT5pbnRfZW5hYmxlZCA9IHRydWU7CisJaW9tbXVfZmVhdHVyZV9lbmFibGUoaW9tbXUsIENPTlRST0xfRVZUX0lOVF9FTik7CisKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBfX2luaXQgaW9tbXVfaW5pdF9tc2koc3RydWN0IGFtZF9pb21tdSAqaW9tbXUpCitzdGF0aWMgaW50IGlvbW11X2luaXRfbXNpKHN0cnVjdCBhbWRfaW9tbXUgKmlvbW11KQogewogCWlmIChpb21tdS0+aW50X2VuYWJsZWQpCiAJCXJldHVybiAwOwogCi0JaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaW9tbXUtPmRldiwgUENJX0NBUF9JRF9NU0lYKSkKLQkJcmV0dXJuIGlvbW11X3NldHVwX21zaXgoaW9tbXUpOwotCWVsc2UgaWYgKHBjaV9maW5kX2NhcGFiaWxpdHkoaW9tbXUtPmRldiwgUENJX0NBUF9JRF9NU0kpKQorCWlmIChwY2lfZmluZF9jYXBhYmlsaXR5KGlvbW11LT5kZXYsIFBDSV9DQVBfSURfTVNJKSkKIAkJcmV0dXJuIGlvbW11X3NldHVwX21zaShpb21tdSk7CiAKIAlyZXR1cm4gMTsKQEAgLTg5OSw2ICs5NTYsNyBAQAogc3RhdGljIGludCBfX2luaXQgaW5pdF91bml0eV9tYXBfcmFuZ2Uoc3RydWN0IGl2bWRfaGVhZGVyICptKQogewogCXN0cnVjdCB1bml0eV9tYXBfZW50cnkgKmUgPSAwOworCWNoYXIgKnM7CiAKIAllID0ga3phbGxvYyhzaXplb2YoKmUpLCBHRlBfS0VSTkVMKTsKIAlpZiAoZSA9PSBOVUxMKQpAQCAtOTA2LDE0ICs5NjQsMTkgQEAKIAogCXN3aXRjaCAobS0+dHlwZSkgewogCWRlZmF1bHQ6CisJCWtmcmVlKGUpOworCQlyZXR1cm4gMDsKIAljYXNlIEFDUElfSVZNRF9UWVBFOgorCQlzID0gIklWTURfVFlQRWlcdFx0XHQiOwogCQllLT5kZXZpZF9zdGFydCA9IGUtPmRldmlkX2VuZCA9IG0tPmRldmlkOwogCQlicmVhazsKIAljYXNlIEFDUElfSVZNRF9UWVBFX0FMTDoKKwkJcyA9ICJJVk1EX1RZUEVfQUxMXHRcdCI7CiAJCWUtPmRldmlkX3N0YXJ0ID0gMDsKIAkJZS0+ZGV2aWRfZW5kID0gYW1kX2lvbW11X2xhc3RfYmRmOwogCQlicmVhazsKIAljYXNlIEFDUElfSVZNRF9UWVBFX1JBTkdFOgorCQlzID0gIklWTURfVFlQRV9SQU5HRVx0XHQiOwogCQllLT5kZXZpZF9zdGFydCA9IG0tPmRldmlkOwogCQllLT5kZXZpZF9lbmQgPSBtLT5hdXg7CiAJCWJyZWFrOwpAQCAtOTIyLDYgKzk4NSwxMyBAQAogCWUtPmFkZHJlc3NfZW5kID0gZS0+YWRkcmVzc19zdGFydCArIFBBR0VfQUxJR04obS0+cmFuZ2VfbGVuZ3RoKTsKIAllLT5wcm90ID0gbS0+ZmxhZ3MgPj4gMTsKIAorCURVTVBfcHJpbnRrKCIlcyBkZXZpZF9zdGFydDogJTAyeDolMDJ4LiV4IGRldmlkX2VuZDogJTAyeDolMDJ4LiV4IgorCQkgICAgIiByYW5nZV9zdGFydDogJTAxNmxseCByYW5nZV9lbmQ6ICUwMTZsbHggZmxhZ3M6ICV4XG4iLCBzLAorCQkgICAgUENJX0JVUyhlLT5kZXZpZF9zdGFydCksIFBDSV9TTE9UKGUtPmRldmlkX3N0YXJ0KSwKKwkJICAgIFBDSV9GVU5DKGUtPmRldmlkX3N0YXJ0KSwgUENJX0JVUyhlLT5kZXZpZF9lbmQpLAorCQkgICAgUENJX1NMT1QoZS0+ZGV2aWRfZW5kKSwgUENJX0ZVTkMoZS0+ZGV2aWRfZW5kKSwKKwkJICAgIGUtPmFkZHJlc3Nfc3RhcnQsIGUtPmFkZHJlc3NfZW5kLCBtLT5mbGFncyk7CisKIAlsaXN0X2FkZF90YWlsKCZlLT5saXN0LCAmYW1kX2lvbW11X3VuaXR5X21hcCk7CiAKIAlyZXR1cm4gMDsKQEAgLTk2NywxOCArMTAzNywyOCBAQAogICogVGhpcyBmdW5jdGlvbiBmaW5hbGx5IGVuYWJsZXMgYWxsIElPTU1VcyBmb3VuZCBpbiB0aGUgc3lzdGVtIGFmdGVyCiAgKiB0aGV5IGhhdmUgYmVlbiBpbml0aWFsaXplZAogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgZW5hYmxlX2lvbW11cyh2b2lkKQorc3RhdGljIHZvaWQgZW5hYmxlX2lvbW11cyh2b2lkKQogewogCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OwogCi0JbGlzdF9mb3JfZWFjaF9lbnRyeShpb21tdSwgJmFtZF9pb21tdV9saXN0LCBsaXN0KSB7CisJZm9yX2VhY2hfaW9tbXUoaW9tbXUpIHsKKwkJaW9tbXVfc2V0X2RldmljZV90YWJsZShpb21tdSk7CisJCWlvbW11X2VuYWJsZV9jb21tYW5kX2J1ZmZlcihpb21tdSk7CisJCWlvbW11X2VuYWJsZV9ldmVudF9idWZmZXIoaW9tbXUpOwogCQlpb21tdV9zZXRfZXhjbHVzaW9uX3JhbmdlKGlvbW11KTsKIAkJaW9tbXVfaW5pdF9tc2koaW9tbXUpOwotCQlpb21tdV9lbmFibGVfZXZlbnRfbG9nZ2luZyhpb21tdSk7CiAJCWlvbW11X2VuYWJsZShpb21tdSk7CiAJfQogfQogCitzdGF0aWMgdm9pZCBkaXNhYmxlX2lvbW11cyh2b2lkKQoreworCXN0cnVjdCBhbWRfaW9tbXUgKmlvbW11OworCisJZm9yX2VhY2hfaW9tbXUoaW9tbXUpCisJCWlvbW11X2Rpc2FibGUoaW9tbXUpOworfQorCiAvKgogICogU3VzcGVuZC9SZXN1bWUgc3VwcG9ydAogICogZGlzYWJsZSBzdXNwZW5kIHVudGlsIHJlYWwgcmVzdW1lIGltcGxlbWVudGVkCkBAIC05ODYsMTIgKzEwNjYsMzEgQEAKIAogc3RhdGljIGludCBhbWRfaW9tbXVfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCiB7CisJLyoKKwkgKiBEaXNhYmxlIElPTU1VcyBiZWZvcmUgcmVwcm9ncmFtbWluZyB0aGUgaGFyZHdhcmUgcmVnaXN0ZXJzLgorCSAqIElPTU1VIGlzIHN0aWxsIGVuYWJsZWQgZnJvbSB0aGUgcmVzdW1lIGtlcm5lbC4KKwkgKi8KKwlkaXNhYmxlX2lvbW11cygpOworCisJLyogcmUtbG9hZCB0aGUgaGFyZHdhcmUgKi8KKwllbmFibGVfaW9tbXVzKCk7CisKKwkvKgorCSAqIHdlIGhhdmUgdG8gZmx1c2ggYWZ0ZXIgdGhlIElPTU1VcyBhcmUgZW5hYmxlZCBiZWNhdXNlIGEKKwkgKiBkaXNhYmxlZCBJT01NVSB3aWxsIG5ldmVyIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIHdlIHNlbmQKKwkgKi8KKwlhbWRfaW9tbXVfZmx1c2hfYWxsX2RvbWFpbnMoKTsKKwlhbWRfaW9tbXVfZmx1c2hfYWxsX2RldmljZXMoKTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgaW50IGFtZF9pb21tdV9zdXNwZW5kKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKLQlyZXR1cm4gLUVJTlZBTDsKKwkvKiBkaXNhYmxlIElPTU1VcyB0byBnbyBvdXQgb2YgdGhlIHdheSBmb3IgQklPUyAqLworCWRpc2FibGVfaW9tbXVzKCk7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHN0cnVjdCBzeXNkZXZfY2xhc3MgYW1kX2lvbW11X3N5c2Rldl9jbGFzcyA9IHsKQEAgLTExMzcsOSArMTIzNiw2IEBACiAKIAllbmFibGVfaW9tbXVzKCk7CiAKLQlwcmludGsoS0VSTl9JTkZPICJBTUQgSU9NTVU6IGFwZXJ0dXJlIHNpemUgaXMgJWQgTUJcbiIsCi0JCQkoMSA8PCAoYW1kX2lvbW11X2FwZXJ0dXJlX29yZGVyLTIwKSkpOwotCiAJcHJpbnRrKEtFUk5fSU5GTyAiQU1EIElPTU1VOiBkZXZpY2UgaXNvbGF0aW9uICIpOwogCWlmIChhbWRfaW9tbXVfaXNvbGF0ZSkKIAkJcHJpbnRrKCJlbmFibGVkXG4iKTsKQEAgLTEyMTEsNiArMTMwNywxMyBAQAogICoKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCitzdGF0aWMgaW50IF9faW5pdCBwYXJzZV9hbWRfaW9tbXVfZHVtcChjaGFyICpzdHIpCit7CisJYW1kX2lvbW11X2R1bXAgPSB0cnVlOworCisJcmV0dXJuIDE7Cit9CisKIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2FtZF9pb21tdV9vcHRpb25zKGNoYXIgKnN0cikKIHsKIAlmb3IgKDsgKnN0cjsgKytzdHIpIHsKQEAgLTEyMjUsMTUgKzEzMjgsNSBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgaW50IF9faW5pdCBwYXJzZV9hbWRfaW9tbXVfc2l6ZV9vcHRpb25zKGNoYXIgKnN0cikKLXsKLQl1bnNpZ25lZCBvcmRlciA9IFBBR0VfU0hJRlQgKyBnZXRfb3JkZXIobWVtcGFyc2Uoc3RyLCAmc3RyKSk7Ci0KLQlpZiAoKG9yZGVyID4gMjQpICYmIChvcmRlciA8IDMxKSkKLQkJYW1kX2lvbW11X2FwZXJ0dXJlX29yZGVyID0gb3JkZXI7Ci0KLQlyZXR1cm4gMTsKLX0KLQorX19zZXR1cCgiYW1kX2lvbW11X2R1bXAiLCBwYXJzZV9hbWRfaW9tbXVfZHVtcCk7CiBfX3NldHVwKCJhbWRfaW9tbXU9IiwgcGFyc2VfYW1kX2lvbW11X29wdGlvbnMpOwotX19zZXR1cCgiYW1kX2lvbW11X3NpemU9IiwgcGFyc2VfYW1kX2lvbW11X3NpemVfb3B0aW9ucyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljLmMKaW5kZXggZjI4NzA5Mi4uMDc2ZDM4OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvYXBpYy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWMuYwpAQCAtMTQsNiArMTQsNyBAQAogICoJTWlrYWVsIFBldHRlcnNzb24JOglQTSBjb252ZXJ0ZWQgdG8gZHJpdmVyIG1vZGVsLgogICovCiAKKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L21jMTQ2ODE4cnRjLmg+CiAjaW5jbHVkZSA8bGludXgvYWNwaV9wbXRtci5oPgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAKKyNpbmNsdWRlIDxhc20vcGVyZl9jb3VudGVyLmg+CiAjaW5jbHVkZSA8YXNtL3BnYWxsb2MuaD4KICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAjaW5jbHVkZSA8YXNtL21wc3BlYy5oPgpAQCAtOTgsNiArMTAwLDI5IEBACiAvKiBMb2NhbCBBUElDIHdhcyBkaXNhYmxlZCBieSB0aGUgQklPUyBhbmQgZW5hYmxlZCBieSB0aGUga2VybmVsICovCiBzdGF0aWMgaW50IGVuYWJsZWRfdmlhX2FwaWNiYXNlOwogCisvKgorICogSGFuZGxlIGludGVycnVwdCBtb2RlIGNvbmZpZ3VyYXRpb24gcmVnaXN0ZXIgKElNQ1IpLgorICogVGhpcyByZWdpc3RlciBjb250cm9scyB3aGV0aGVyIHRoZSBpbnRlcnJ1cHQgc2lnbmFscworICogdGhhdCByZWFjaCB0aGUgQlNQIGNvbWUgZnJvbSB0aGUgbWFzdGVyIFBJQyBvciBmcm9tIHRoZQorICogbG9jYWwgQVBJQy4gQmVmb3JlIGVudGVyaW5nIFN5bW1ldHJpYyBJL08gTW9kZSwgZWl0aGVyCisgKiB0aGUgQklPUyBvciB0aGUgb3BlcmF0aW5nIHN5c3RlbSBtdXN0IHN3aXRjaCBvdXQgb2YKKyAqIFBJQyBNb2RlIGJ5IGNoYW5naW5nIHRoZSBJTUNSLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgaW1jcl9waWNfdG9fYXBpYyh2b2lkKQoreworCS8qIHNlbGVjdCBJTUNSIHJlZ2lzdGVyICovCisJb3V0YigweDcwLCAweDIyKTsKKwkvKiBOTUkgYW5kIDgyNTkgSU5UUiBnbyB0aHJvdWdoIEFQSUMgKi8KKwlvdXRiKDB4MDEsIDB4MjMpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW1jcl9hcGljX3RvX3BpYyh2b2lkKQoreworCS8qIHNlbGVjdCBJTUNSIHJlZ2lzdGVyICovCisJb3V0YigweDcwLCAweDIyKTsKKwkvKiBOTUkgYW5kIDgyNTkgSU5UUiBnbyBkaXJlY3RseSB0byBCU1AgKi8KKwlvdXRiKDB4MDAsIDB4MjMpOworfQogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2XzY0CkBAIC0xMTEsMTMgKzEzNiwxOSBAQAogX19zZXR1cCgiYXBpY3BtdGltZXIiLCBzZXR1cF9hcGljcG10aW1lcik7CiAjZW5kaWYKIAoraW50IHgyYXBpY19tb2RlOwogI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi1pbnQgeDJhcGljOwogLyogeDJhcGljIGVuYWJsZWQgYmVmb3JlIE9TIGhhbmRvdmVyICovCiBzdGF0aWMgaW50IHgyYXBpY19wcmVlbmFibGVkOwogc3RhdGljIGludCBkaXNhYmxlX3gyYXBpYzsKIHN0YXRpYyBfX2luaXQgaW50IHNldHVwX25veDJhcGljKGNoYXIgKnN0cikKIHsKKwlpZiAoeDJhcGljX2VuYWJsZWQoKSkgeworCQlwcl93YXJuaW5nKCJCaW9zIGFscmVhZHkgZW5hYmxlZCB4MmFwaWMsICIKKwkJCSAgICJjYW4ndCBlbmZvcmNlIG5veDJhcGljIik7CisJCXJldHVybiAwOworCX0KKwogCWRpc2FibGVfeDJhcGljID0gMTsKIAlzZXR1cF9jbGVhcl9jcHVfY2FwKFg4Nl9GRUFUVVJFX1gyQVBJQyk7CiAJcmV0dXJuIDA7CkBAIC0yMDksNiArMjQwLDMxIEBACiAJcmV0dXJuIGxhcGljX2dldF92ZXJzaW9uKCkgPj0gMHgxNDsKIH0KIAorLyoKKyAqIGJhcmUgZnVuY3Rpb24gdG8gc3Vic3RpdHV0ZSB3cml0ZSBvcGVyYXRpb24KKyAqIGFuZCBpdCdzIF90aGF0XyBmYXN0IDopCisgKi8KK3N0YXRpYyB2b2lkIG5hdGl2ZV9hcGljX3dyaXRlX2R1bW15KHUzMiByZWcsIHUzMiB2KQoreworCVdBUk5fT05fT05DRSgoY3B1X2hhc19hcGljIHx8ICFkaXNhYmxlX2FwaWMpKTsKK30KKworc3RhdGljIHUzMiBuYXRpdmVfYXBpY19yZWFkX2R1bW15KHUzMiByZWcpCit7CisJV0FSTl9PTl9PTkNFKChjcHVfaGFzX2FwaWMgJiYgIWRpc2FibGVfYXBpYykpOworCXJldHVybiAwOworfQorCisvKgorICogcmlnaHQgYWZ0ZXIgdGhpcyBjYWxsIGFwaWMtPndyaXRlL3JlYWQgZG9lc24ndCBkbyBhbnl0aGluZworICogbm90ZSB0aGF0IHRoZXJlIGlzIG5vIHJlc3RvcmUgb3BlcmF0aW9uIGl0IHdvcmtzIG9uZSB3YXkKKyAqLwordm9pZCBhcGljX2Rpc2FibGUodm9pZCkKK3sKKwlhcGljLT5yZWFkID0gbmF0aXZlX2FwaWNfcmVhZF9kdW1teTsKKwlhcGljLT53cml0ZSA9IG5hdGl2ZV9hcGljX3dyaXRlX2R1bW15OworfQorCiB2b2lkIG5hdGl2ZV9hcGljX3dhaXRfaWNyX2lkbGUodm9pZCkKIHsKIAl3aGlsZSAoYXBpY19yZWFkKEFQSUNfSUNSKSAmIEFQSUNfSUNSX0JVU1kpCkBAIC0zNDgsNyArNDA0LDcgQEAKIAogc3RhdGljIHZvaWQgc2V0dXBfQVBJQ19laWx2dCh1OCBsdnRfb2ZmLCB1OCB2ZWN0b3IsIHU4IG1zZ190eXBlLCB1OCBtYXNrKQogewotCXVuc2lnbmVkIGxvbmcgcmVnID0gKGx2dF9vZmYgPDwgNCkgKyBBUElDX0VJTFZUMDsKKwl1bnNpZ25lZCBsb25nIHJlZyA9IChsdnRfb2ZmIDw8IDQpICsgQVBJQ19FSUxWVG4oMCk7CiAJdW5zaWduZWQgaW50ICB2ICAgPSAobWFzayA8PCAxNikgfCAobXNnX3R5cGUgPDwgOCkgfCB2ZWN0b3I7CiAKIAlhcGljX3dyaXRlKHJlZywgdik7CkBAIC04MTUsNyArODcxLDcgQEAKIAl1MzIgdjsKIAogCS8qIEFQSUMgaGFzbid0IGJlZW4gbWFwcGVkIHlldCAqLwotCWlmICgheDJhcGljICYmICFhcGljX3BoeXMpCisJaWYgKCF4MmFwaWNfbW9kZSAmJiAhYXBpY19waHlzKQogCQlyZXR1cm47CiAKIAltYXhsdnQgPSBsYXBpY19nZXRfbWF4bHZ0KCk7CkBAIC0xMTMzLDYgKzExODksNyBAQAogCQlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAl9CiAjZW5kaWYKKwlwZXJmX2NvdW50ZXJzX2xhcGljX2luaXQoKTsKIAogCXByZWVtcHRfZGlzYWJsZSgpOwogCkBAIC0xMjg3LDcgKzEzNDQsNyBAQAogewogCWlmICh4MmFwaWNfZW5hYmxlZCgpKSB7CiAJCXByX2luZm8oIngyYXBpYyBlbmFibGVkIGJ5IEJJT1MsIHN3aXRjaGluZyB0byB4MmFwaWMgb3BzXG4iKTsKLQkJeDJhcGljX3ByZWVuYWJsZWQgPSB4MmFwaWMgPSAxOworCQl4MmFwaWNfcHJlZW5hYmxlZCA9IHgyYXBpY19tb2RlID0gMTsKIAl9CiB9CiAKQEAgLTEyOTUsNyArMTM1Miw3IEBACiB7CiAJaW50IG1zciwgbXNyMjsKIAotCWlmICgheDJhcGljKQorCWlmICgheDJhcGljX21vZGUpCiAJCXJldHVybjsKIAogCXJkbXNyKE1TUl9JQTMyX0FQSUNCQVNFLCBtc3IsIG1zcjIpOwpAQCAtMTMwNCw2ICsxMzYxLDcgQEAKIAkJd3Jtc3IoTVNSX0lBMzJfQVBJQ0JBU0UsIG1zciB8IFgyQVBJQ19FTkFCTEUsIDApOwogCX0KIH0KKyNlbmRpZiAvKiBDT05GSUdfWDg2X1gyQVBJQyAqLwogCiB2b2lkIF9faW5pdCBlbmFibGVfSVJfeDJhcGljKHZvaWQpCiB7CkBAIC0xMzEyLDMyICsxMzcwLDIxIEBACiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIAlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzID0gTlVMTDsKIAotCWlmICghY3B1X2hhc194MmFwaWMpCi0JCXJldHVybjsKLQotCWlmICgheDJhcGljX3ByZWVuYWJsZWQgJiYgZGlzYWJsZV94MmFwaWMpIHsKLQkJcHJfaW5mbygiU2tpcHBlZCBlbmFibGluZyB4MmFwaWMgYW5kIEludGVycnVwdC1yZW1hcHBpbmcgIgotCQkJImJlY2F1c2Ugb2Ygbm94MmFwaWNcbiIpOwotCQlyZXR1cm47Ci0JfQotCi0JaWYgKHgyYXBpY19wcmVlbmFibGVkICYmIGRpc2FibGVfeDJhcGljKQotCQlwYW5pYygiQmlvcyBhbHJlYWR5IGVuYWJsZWQgeDJhcGljLCBjYW4ndCBlbmZvcmNlIG5veDJhcGljIik7Ci0KLQlpZiAoIXgyYXBpY19wcmVlbmFibGVkICYmIHNraXBfaW9hcGljX3NldHVwKSB7Ci0JCXByX2luZm8oIlNraXBwZWQgZW5hYmxpbmcgeDJhcGljIGFuZCBJbnRlcnJ1cHQtcmVtYXBwaW5nICIKLQkJCSJiZWNhdXNlIG9mIHNraXBwaW5nIGlvLWFwaWMgc2V0dXBcbiIpOwotCQlyZXR1cm47Ci0JfQotCiAJcmV0ID0gZG1hcl90YWJsZV9pbml0KCk7CiAJaWYgKHJldCkgewotCQlwcl9pbmZvKCJkbWFyX3RhYmxlX2luaXQoKSBmYWlsZWQgd2l0aCAlZDpcbiIsIHJldCk7CisJCXByX2RlYnVnKCJkbWFyX3RhYmxlX2luaXQoKSBmYWlsZWQgd2l0aCAlZDpcbiIsIHJldCk7CisJCWdvdG8gaXJfZmFpbGVkOworCX0KIAotCQlpZiAoeDJhcGljX3ByZWVuYWJsZWQpCi0JCQlwYW5pYygieDJhcGljIGVuYWJsZWQgYnkgYmlvcy4gQnV0IElSIGVuYWJsaW5nIGZhaWxlZCIpOwotCQllbHNlCi0JCQlwcl9pbmZvKCJOb3QgZW5hYmxpbmcgeDJhcGljLEludHItcmVtYXBwaW5nXG4iKTsKKwlpZiAoIWludHJfcmVtYXBwaW5nX3N1cHBvcnRlZCgpKSB7CisJCXByX2RlYnVnKCJpbnRyLXJlbWFwcGluZyBub3Qgc3VwcG9ydGVkXG4iKTsKKwkJZ290byBpcl9mYWlsZWQ7CisJfQorCisKKwlpZiAoIXgyYXBpY19wcmVlbmFibGVkICYmIHNraXBfaW9hcGljX3NldHVwKSB7CisJCXByX2luZm8oIlNraXBwZWQgZW5hYmxpbmcgaW50ci1yZW1hcCBiZWNhdXNlIG9mIHNraXBwaW5nICIKKwkJCSJpby1hcGljIHNldHVwXG4iKTsKIAkJcmV0dXJuOwogCX0KIApAQCAtMTM1NywxOSArMTQwNCwxNiBAQAogCW1hc2tfSU9fQVBJQ19zZXR1cChpb2FwaWNfZW50cmllcyk7CiAJbWFza184MjU5QSgpOwogCi0JcmV0ID0gZW5hYmxlX2ludHJfcmVtYXBwaW5nKEVJTV8zMkJJVF9BUElDX0lEKTsKLQotCWlmIChyZXQgJiYgeDJhcGljX3ByZWVuYWJsZWQpIHsKLQkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwotCQlwYW5pYygieDJhcGljIGVuYWJsZWQgYnkgYmlvcy4gQnV0IElSIGVuYWJsaW5nIGZhaWxlZCIpOwotCX0KLQorCXJldCA9IGVuYWJsZV9pbnRyX3JlbWFwcGluZyh4MmFwaWNfc3VwcG9ydGVkKCkpOwogCWlmIChyZXQpCiAJCWdvdG8gZW5kX3Jlc3RvcmU7CiAKLQlpZiAoIXgyYXBpYykgewotCQl4MmFwaWMgPSAxOworCXByX2luZm8oIkVuYWJsZWQgSW50ZXJydXB0LXJlbWFwcGluZ1xuIik7CisKKwlpZiAoeDJhcGljX3N1cHBvcnRlZCgpICYmICF4MmFwaWNfbW9kZSkgeworCQl4MmFwaWNfbW9kZSA9IDE7CiAJCWVuYWJsZV94MmFwaWMoKTsKKwkJcHJfaW5mbygiRW5hYmxlZCB4MmFwaWNcbiIpOwogCX0KIAogZW5kX3Jlc3RvcmU6CkBAIC0xMzc4LDM3ICsxNDIyLDM0IEBACiAJCSAqIElSIGVuYWJsaW5nIGZhaWxlZAogCQkgKi8KIAkJcmVzdG9yZV9JT19BUElDX3NldHVwKGlvYXBpY19lbnRyaWVzKTsKLQllbHNlCi0JCXJlaW5pdF9pbnRyX3JlbWFwcGVkX0lPX0FQSUMoeDJhcGljX3ByZWVuYWJsZWQsIGlvYXBpY19lbnRyaWVzKTsKIAogCXVubWFza184MjU5QSgpOwogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAogZW5kOgotCWlmICghcmV0KSB7Ci0JCWlmICgheDJhcGljX3ByZWVuYWJsZWQpCi0JCQlwcl9pbmZvKCJFbmFibGVkIHgyYXBpYyBhbmQgaW50ZXJydXB0LXJlbWFwcGluZ1xuIik7Ci0JCWVsc2UKLQkJCXByX2luZm8oIkVuYWJsZWQgSW50ZXJydXB0LXJlbWFwcGluZ1xuIik7Ci0JfSBlbHNlCi0JCXByX2VycigiRmFpbGVkIHRvIGVuYWJsZSBJbnRlcnJ1cHQtcmVtYXBwaW5nIGFuZCB4MmFwaWNcbiIpOwogCWlmIChpb2FwaWNfZW50cmllcykKIAkJZnJlZV9pb2FwaWNfZW50cmllcyhpb2FwaWNfZW50cmllcyk7CisKKwlpZiAoIXJldCkKKwkJcmV0dXJuOworCitpcl9mYWlsZWQ6CisJaWYgKHgyYXBpY19wcmVlbmFibGVkKQorCQlwYW5pYygieDJhcGljIGVuYWJsZWQgYnkgYmlvcy4gQnV0IElSIGVuYWJsaW5nIGZhaWxlZCIpOworCWVsc2UgaWYgKGNwdV9oYXNfeDJhcGljKQorCQlwcl9pbmZvKCJOb3QgZW5hYmxpbmcgeDJhcGljLEludHItcmVtYXBwaW5nXG4iKTsKICNlbHNlCiAJaWYgKCFjcHVfaGFzX3gyYXBpYykKIAkJcmV0dXJuOwogCiAJaWYgKHgyYXBpY19wcmVlbmFibGVkKQogCQlwYW5pYygieDJhcGljIGVuYWJsZWQgcHJpb3IgT1MgaGFuZG92ZXIsIgotCQkgICAgICAiIGVuYWJsZSBDT05GSUdfSU5UUl9SRU1BUCIpOwotCi0JcHJfaW5mbygiRW5hYmxlIENPTkZJR19JTlRSX1JFTUFQIGZvciBlbmFibGluZyBpbnRyLXJlbWFwcGluZyAiCi0JCSIgYW5kIHgyYXBpY1xuIik7CisJCSAgICAgICIgZW5hYmxlIENPTkZJR19YODZfWDJBUElDLCBDT05GSUdfSU5UUl9SRU1BUCIpOwogI2VuZGlmCiAKIAlyZXR1cm47CiB9Ci0jZW5kaWYgLyogQ09ORklHX1g4Nl9YMkFQSUMgKi8KKwogCiAjaWZkZWYgQ09ORklHX1g4Nl82NAogLyoKQEAgLTE0MjUsNyArMTQ2Niw2IEBACiAJfQogCiAJbXBfbGFwaWNfYWRkciA9IEFQSUNfREVGQVVMVF9QSFlTX0JBU0U7Ci0JYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gMDsKIAlyZXR1cm4gMDsKIH0KICNlbHNlCkBAIC0xNTM5LDMyICsxNTc5LDQ5IEBACiAgKi8KIHZvaWQgX19pbml0IGluaXRfYXBpY19tYXBwaW5ncyh2b2lkKQogewotCWlmICh4MmFwaWMpIHsKKwl1bnNpZ25lZCBpbnQgbmV3X2FwaWNpZDsKKworCWlmICh4MmFwaWNfbW9kZSkgewogCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSByZWFkX2FwaWNfaWQoKTsKIAkJcmV0dXJuOwogCX0KIAotCS8qCi0JICogSWYgbm8gbG9jYWwgQVBJQyBjYW4gYmUgZm91bmQgdGhlbiBzZXQgdXAgYSBmYWtlIGFsbAotCSAqIHplcm9lcyBwYWdlIHRvIHNpbXVsYXRlIHRoZSBsb2NhbCBBUElDIGFuZCBhbm90aGVyCi0JICogb25lIGZvciB0aGUgSU8tQVBJQy4KLQkgKi8KKwkvKiBJZiBubyBsb2NhbCBBUElDIGNhbiBiZSBmb3VuZCByZXR1cm4gZWFybHkgKi8KIAlpZiAoIXNtcF9mb3VuZF9jb25maWcgJiYgZGV0ZWN0X2luaXRfQVBJQygpKSB7Ci0JCWFwaWNfcGh5cyA9ICh1bnNpZ25lZCBsb25nKSBhbGxvY19ib290bWVtX3BhZ2VzKFBBR0VfU0laRSk7Ci0JCWFwaWNfcGh5cyA9IF9fcGEoYXBpY19waHlzKTsKLQl9IGVsc2UKKwkJLyogbGV0cyBOT1AnaWZ5IGFwaWMgb3BlcmF0aW9ucyAqLworCQlwcl9pbmZvKCJBUElDOiBkaXNhYmxlIGFwaWMgZmFjaWxpdHlcbiIpOworCQlhcGljX2Rpc2FibGUoKTsKKwl9IGVsc2UgewogCQlhcGljX3BoeXMgPSBtcF9sYXBpY19hZGRyOwogCi0Jc2V0X2ZpeG1hcF9ub2NhY2hlKEZJWF9BUElDX0JBU0UsIGFwaWNfcGh5cyk7Ci0JYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAibWFwcGVkIEFQSUMgdG8gJTA4bHggKCUwOGx4KVxuIiwKLQkJCQlBUElDX0JBU0UsIGFwaWNfcGh5cyk7CisJCS8qCisJCSAqIGFjcGkgbGFwaWMgcGF0aCBhbHJlYWR5IG1hcHMgdGhhdCBhZGRyZXNzIGluCisJCSAqIGFjcGlfcmVnaXN0ZXJfbGFwaWNfYWRkcmVzcygpCisJCSAqLworCQlpZiAoIWFjcGlfbGFwaWMpCisJCQlzZXRfZml4bWFwX25vY2FjaGUoRklYX0FQSUNfQkFTRSwgYXBpY19waHlzKTsKKworCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJtYXBwZWQgQVBJQyB0byAlMDhseCAoJTA4bHgpXG4iLAorCQkJCQlBUElDX0JBU0UsIGFwaWNfcGh5cyk7CisJfQogCiAJLyoKIAkgKiBGZXRjaCB0aGUgQVBJQyBJRCBvZiB0aGUgQlNQIGluIGNhc2Ugd2UgaGF2ZSBhCiAJICogZGVmYXVsdCBjb25maWd1cmF0aW9uIChvciB0aGUgTVAgdGFibGUgaXMgYnJva2VuKS4KIAkgKi8KLQlpZiAoYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID09IC0xVSkKLQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkID0gcmVhZF9hcGljX2lkKCk7CisJbmV3X2FwaWNpZCA9IHJlYWRfYXBpY19pZCgpOworCWlmIChib290X2NwdV9waHlzaWNhbF9hcGljaWQgIT0gbmV3X2FwaWNpZCkgeworCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQgPSBuZXdfYXBpY2lkOworCQkvKgorCQkgKiB5ZWFoIC0tIHdlIGxpZSBhYm91dCBhcGljX3ZlcnNpb24KKwkJICogaW4gY2FzZSBpZiBhcGljIHdhcyBkaXNhYmxlZCB2aWEgYm9vdCBvcHRpb24KKwkJICogYnV0IGl0J3Mgbm90IGEgcHJvYmxlbSBmb3IgU01QIGNvbXBpbGVkIGtlcm5lbAorCQkgKiBzaW5jZSBzbXBfc2FuaXR5X2NoZWNrIGlzIHByZXBhcmVkIGZvciBzdWNoIGEgY2FzZQorCQkgKiBhbmQgZGlzYWJsZSBzbXAgbW9kZQorCQkgKi8KKwkJYXBpY192ZXJzaW9uW25ld19hcGljaWRdID0KKwkJCSBHRVRfQVBJQ19WRVJTSU9OKGFwaWNfcmVhZChBUElDX0xWUikpOworCX0KIH0KIAogLyoKQEAgLTE3MzMsOCArMTc5MCw3IEBACiAJCSAqLwogCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICJsZWF2aW5nIFBJQyBtb2RlLCAiCiAJCQkJImVuYWJsaW5nIEFQSUMgbW9kZS5cbiIpOwotCQlvdXRiKDB4NzAsIDB4MjIpOwotCQlvdXRiKDB4MDEsIDB4MjMpOworCQlpbWNyX3BpY190b19hcGljKCk7CiAJfQogI2VuZGlmCiAJaWYgKGFwaWMtPmVuYWJsZV9hcGljX21vZGUpCkBAIC0xNzYyLDggKzE4MTgsNyBAQAogCQkgKi8KIAkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiZGlzYWJsaW5nIEFQSUMgbW9kZSwgIgogCQkJCSJlbnRlcmluZyBQSUMgbW9kZS5cbiIpOwotCQlvdXRiKDB4NzAsIDB4MjIpOwotCQlvdXRiKDB4MDAsIDB4MjMpOworCQlpbWNyX2FwaWNfdG9fcGljKCk7CiAJCXJldHVybjsKIAl9CiAjZW5kaWYKQEAgLTE5NjksMTAgKzIwMjQsMTAgQEAKIAogCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKIAlkaXNhYmxlX2xvY2FsX0FQSUMoKTsKLSNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAorCiAJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpCiAJCWRpc2FibGVfaW50cl9yZW1hcHBpbmcoKTsKLSNlbmRpZgorCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOwogCXJldHVybiAwOwogfQpAQCAtMTk4Miw0MiArMjAzNywzNCBAQAogCXVuc2lnbmVkIGludCBsLCBoOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IG1heGx2dDsKLQotI2lmZGVmIENPTkZJR19JTlRSX1JFTUFQCi0JaW50IHJldDsKKwlpbnQgcmV0ID0gMDsKIAlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzID0gTlVMTDsKIAogCWlmICghYXBpY19wbV9zdGF0ZS5hY3RpdmUpCiAJCXJldHVybiAwOwogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwotCWlmICh4MmFwaWMpIHsKKwlpZiAoaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkgewogCQlpb2FwaWNfZW50cmllcyA9IGFsbG9jX2lvYXBpY19lbnRyaWVzKCk7CiAJCWlmICghaW9hcGljX2VudHJpZXMpIHsKIAkJCVdBUk4oMSwgIkFsbG9jIGlvYXBpY19lbnRyaWVzIGluIGxhcGljIHJlc3VtZSBmYWlsZWQuIik7Ci0JCQlyZXR1cm4gLUVOT01FTTsKKwkJCXJldCA9IC1FTk9NRU07CisJCQlnb3RvIHJlc3RvcmU7CiAJCX0KIAogCQlyZXQgPSBzYXZlX0lPX0FQSUNfc2V0dXAoaW9hcGljX2VudHJpZXMpOwogCQlpZiAocmV0KSB7CiAJCQlXQVJOKDEsICJTYXZpbmcgSU8tQVBJQyBzdGF0ZSBmYWlsZWQ6ICVkXG4iLCByZXQpOwogCQkJZnJlZV9pb2FwaWNfZW50cmllcyhpb2FwaWNfZW50cmllcyk7Ci0JCQlyZXR1cm4gcmV0OworCQkJZ290byByZXN0b3JlOwogCQl9CiAKIAkJbWFza19JT19BUElDX3NldHVwKGlvYXBpY19lbnRyaWVzKTsKIAkJbWFza184MjU5QSgpOwotCQllbmFibGVfeDJhcGljKCk7CiAJfQotI2Vsc2UKLQlpZiAoIWFwaWNfcG1fc3RhdGUuYWN0aXZlKQotCQlyZXR1cm4gMDsKIAotCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKLQlpZiAoeDJhcGljKQorCWlmICh4MmFwaWNfbW9kZSkKIAkJZW5hYmxlX3gyYXBpYygpOwotI2VuZGlmCi0KIAllbHNlIHsKIAkJLyoKIAkJICogTWFrZSBzdXJlIHRoZSBBUElDQkFTRSBwb2ludHMgdG8gdGhlIHJpZ2h0IGFkZHJlc3MKQEAgLTIwNTUsMjEgKzIxMDIsMTYgQEAKIAlhcGljX3dyaXRlKEFQSUNfRVNSLCAwKTsKIAlhcGljX3JlYWQoQVBJQ19FU1IpOwogCi0jaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKLQlpZiAoaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkKLQkJcmVlbmFibGVfaW50cl9yZW1hcHBpbmcoRUlNXzMyQklUX0FQSUNfSUQpOwotCi0JaWYgKHgyYXBpYykgeworCWlmIChpbnRyX3JlbWFwcGluZ19lbmFibGVkKSB7CisJCXJlZW5hYmxlX2ludHJfcmVtYXBwaW5nKHgyYXBpY19tb2RlKTsKIAkJdW5tYXNrXzgyNTlBKCk7CiAJCXJlc3RvcmVfSU9fQVBJQ19zZXR1cChpb2FwaWNfZW50cmllcyk7CiAJCWZyZWVfaW9hcGljX2VudHJpZXMoaW9hcGljX2VudHJpZXMpOwogCX0KLSNlbmRpZgotCityZXN0b3JlOgogCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKIAotCi0JcmV0dXJuIDA7CisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTIxMTcsMzEgKzIxNTksMTQgQEAKICNlbmRpZgkvKiBDT05GSUdfUE0gKi8KIAogI2lmZGVmIENPTkZJR19YODZfNjQKLS8qCi0gKiBhcGljX2lzX2NsdXN0ZXJlZF9ib3goKSAtLSBDaGVjayBpZiB3ZSBjYW4gZXhwZWN0IGdvb2QgVFNDCi0gKgotICogVGh1cyBmYXIsIHRoZSBtYWpvciB1c2VyIG9mIHRoaXMgaXMgSUJNJ3MgU3VtbWl0MiBzZXJpZXM6Ci0gKgotICogQ2x1c3RlcmVkIGJveGVzIG1heSBoYXZlIHVuc3luY2VkIFRTQyBwcm9ibGVtcyBpZiB0aGV5IGFyZQotICogbXVsdGktY2hhc3Npcy4gVXNlIGF2YWlsYWJsZSBkYXRhIHRvIHRha2UgYSBnb29kIGd1ZXNzLgotICogSWYgaW4gZG91YnQsIGdvIEhQRVQuCi0gKi8KLV9fY3B1aW5pdCBpbnQgYXBpY19pc19jbHVzdGVyZWRfYm94KHZvaWQpCisKK3N0YXRpYyBpbnQgX19jcHVpbml0IGFwaWNfY2x1c3Rlcl9udW0odm9pZCkKIHsKIAlpbnQgaSwgY2x1c3RlcnMsIHplcm9zOwogCXVuc2lnbmVkIGlkOwogCXUxNiAqYmlvc19jcHVfYXBpY2lkOwogCURFQ0xBUkVfQklUTUFQKGNsdXN0ZXJtYXAsIE5VTV9BUElDX0NMVVNURVJTKTsKIAotCS8qCi0JICogdGhlcmUgaXMgbm90IHRoaXMga2luZCBvZiBib3ggd2l0aCBBTUQgQ1BVIHlldC4KLQkgKiBTb21lIEFNRCBib3ggd2l0aCBxdWFkY29yZSBjcHUgYW5kIDggc29ja2V0cyBhcGljaWQKLQkgKiB3aWxsIGJlIFs0LCAweDIzXSBvciBbOCwgMHgyN10gY291bGQgYmUgdGhvdWdodCB0bwotCSAqIHZzbXAgYm94IHN0aWxsIG5lZWQgY2hlY2tpbmcuLi4KLQkgKi8KLQlpZiAoKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvciA9PSBYODZfVkVORE9SX0FNRCkgJiYgIWlzX3ZzbXBfYm94KCkpCi0JCXJldHVybiAwOwotCiAJYmlvc19jcHVfYXBpY2lkID0gZWFybHlfcGVyX2NwdV9wdHIoeDg2X2Jpb3NfY3B1X2FwaWNpZCk7CiAJYml0bWFwX3plcm8oY2x1c3Rlcm1hcCwgTlVNX0FQSUNfQ0xVU1RFUlMpOwogCkBAIC0yMTc3LDE4ICsyMjAyLDY3IEBACiAJCQkrK3plcm9zOwogCX0KIAotCS8qIFNjYWxlTVAgdlNNUG93ZXJlZCBib3hlcyBoYXZlIG9uZSBjbHVzdGVyIHBlciBib2FyZCBhbmQgVFNDcyBhcmUKLQkgKiBub3QgZ3VhcmFudGVlZCB0byBiZSBzeW5jZWQgYmV0d2VlbiBib2FyZHMKLQkgKi8KLQlpZiAoaXNfdnNtcF9ib3goKSAmJiBjbHVzdGVycyA+IDEpCisJcmV0dXJuIGNsdXN0ZXJzOworfQorCitzdGF0aWMgaW50IF9fY3B1aW5pdGRhdGEgbXVsdGlfY2hlY2tlZDsKK3N0YXRpYyBpbnQgX19jcHVpbml0ZGF0YSBtdWx0aTsKKworc3RhdGljIGludCBfX2NwdWluaXQgc2V0X211bHRpKGNvbnN0IHN0cnVjdCBkbWlfc3lzdGVtX2lkICpkKQoreworCWlmIChtdWx0aSkKKwkJcmV0dXJuIDA7CisJcHJfaW5mbygiQVBJQzogJXMgZGV0ZWN0ZWQsIE11bHRpIENoYXNzaXNcbiIsIGQtPmlkZW50KTsKKwltdWx0aSA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBfX2NwdWluaXRjb25zdCBzdHJ1Y3QgZG1pX3N5c3RlbV9pZCBtdWx0aV9kbWlfdGFibGVbXSA9IHsKKwl7CisJCS5jYWxsYmFjayA9IHNldF9tdWx0aSwKKwkJLmlkZW50ID0gIklCTSBTeXN0ZW0gU3VtbWl0MiIsCisJCS5tYXRjaGVzID0geworCQkJRE1JX01BVENIKERNSV9TWVNfVkVORE9SLCAiSUJNIiksCisJCQlETUlfTUFUQ0goRE1JX1BST0RVQ1RfTkFNRSwgIlN1bW1pdDIiKSwKKwkJfSwKKwl9LAorCXt9Cit9OworCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgZG1pX2NoZWNrX211bHRpKHZvaWQpCit7CisJaWYgKG11bHRpX2NoZWNrZWQpCisJCXJldHVybjsKKworCWRtaV9jaGVja19zeXN0ZW0obXVsdGlfZG1pX3RhYmxlKTsKKwltdWx0aV9jaGVja2VkID0gMTsKK30KKworLyoKKyAqIGFwaWNfaXNfY2x1c3RlcmVkX2JveCgpIC0tIENoZWNrIGlmIHdlIGNhbiBleHBlY3QgZ29vZCBUU0MKKyAqCisgKiBUaHVzIGZhciwgdGhlIG1ham9yIHVzZXIgb2YgdGhpcyBpcyBJQk0ncyBTdW1taXQyIHNlcmllczoKKyAqIENsdXN0ZXJlZCBib3hlcyBtYXkgaGF2ZSB1bnN5bmNlZCBUU0MgcHJvYmxlbXMgaWYgdGhleSBhcmUKKyAqIG11bHRpLWNoYXNzaXMuCisgKiBVc2UgRE1JIHRvIGNoZWNrIHRoZW0KKyAqLworX19jcHVpbml0IGludCBhcGljX2lzX2NsdXN0ZXJlZF9ib3godm9pZCkKK3sKKwlkbWlfY2hlY2tfbXVsdGkoKTsKKwlpZiAobXVsdGkpCiAJCXJldHVybiAxOwogCisJaWYgKCFpc192c21wX2JveCgpKQorCQlyZXR1cm4gMDsKKwogCS8qCi0JICogSWYgY2x1c3RlcnMgPiAyLCB0aGVuIHNob3VsZCBiZSBtdWx0aS1jaGFzc2lzLgotCSAqIE1heSBoYXZlIHRvIHJldmlzaXQgdGhpcyB3aGVuIG11bHRpLWNvcmUgKyBoeXBlcnRocmVhZGVkIENQVXMgY29tZQotCSAqIG91dCwgYnV0IEFGQUlLIHRoaXMgd2lsbCB3b3JrIGV2ZW4gZm9yIHRoZW0uCisJICogU2NhbGVNUCB2U01Qb3dlcmVkIGJveGVzIGhhdmUgb25lIGNsdXN0ZXIgcGVyIGJvYXJkIGFuZCBUU0NzIGFyZQorCSAqIG5vdCBndWFyYW50ZWVkIHRvIGJlIHN5bmNlZCBiZXR3ZWVuIGJvYXJkcwogCSAqLwotCXJldHVybiAoY2x1c3RlcnMgPiAyKTsKKwlpZiAoYXBpY19jbHVzdGVyX251bSgpID4gMSkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKIH0KICNlbmRpZgogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9hcGljX2ZsYXRfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCmluZGV4IDMwNmU1ZTguLmQwYzk5YWIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2FwaWNfZmxhdF82NC5jCkBAIC0xNjEsNyArMTYxLDcgQEAKIAogc3RhdGljIGludCBmbGF0X3BoeXNfcGtnX2lkKGludCBpbml0aWFsX2FwaWNfaWQsIGludCBpbmRleF9tc2IpCiB7Ci0JcmV0dXJuIGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpID4+IGluZGV4X21zYjsKKwlyZXR1cm4gaW5pdGlhbF9hcGljX2lkID4+IGluZGV4X21zYjsKIH0KIAogc3RydWN0IGFwaWMgYXBpY19mbGF0ID0gIHsKQEAgLTIzNSw3ICsyMzUsNyBAQAogCSAqIHJlZ2FyZGxlc3Mgb2YgaG93IG1hbnkgcHJvY2Vzc29ycyBhcmUgcHJlc2VudCAoeDg2XzY0IEVTNzAwMAogCSAqIGlzIGFuIGV4YW1wbGUpLgogCSAqLwotCWlmIChhY3BpX2dibF9GQURULmhlYWRlci5yZXZpc2lvbiA+IEZBRFQyX1JFVklTSU9OX0lEICYmCisJaWYgKGFjcGlfZ2JsX0ZBRFQuaGVhZGVyLnJldmlzaW9uID49IEZBRFQyX1JFVklTSU9OX0lEICYmCiAJCShhY3BpX2dibF9GQURULmZsYWdzICYgQUNQSV9GQURUX0FQSUNfUEhZU0lDQUwpKSB7CiAJCXByaW50ayhLRVJOX0RFQlVHICJzeXN0ZW0gQVBJQyBvbmx5IGNhbiB1c2UgcGh5c2ljYWwgZmxhdCIpOwogCQlyZXR1cm4gMTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2VzNzAwMF8zMi5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKaW5kZXggMzAyOTQ3Ny4uNjkzMjhhYyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvZXM3MDAwXzMyLmMKQEAgLTE0NSw3ICsxNDUsNyBAQAogCXJldHVybiBnc2k7CiB9CiAKLXN0YXRpYyBpbnQgd2FrZXVwX3NlY29uZGFyeV9jcHVfdmlhX21pcChpbnQgY3B1LCB1bnNpZ25lZCBsb25nIGVpcCkKK3N0YXRpYyBpbnQgX19jcHVpbml0IHdha2V1cF9zZWNvbmRhcnlfY3B1X3ZpYV9taXAoaW50IGNwdSwgdW5zaWduZWQgbG9uZyBlaXApCiB7CiAJdW5zaWduZWQgbG9uZyB2ZWN0ID0gMCwgcHNhaXZhbCA9IDA7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL2lvX2FwaWMuYwppbmRleCAzMGRhNjE3Li4xOTQ2ZmFjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9pb19hcGljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvaW9fYXBpYy5jCkBAIC01OSw2ICs1OSw3IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZW1hcHBpbmcuaD4KICNpbmNsdWRlIDxhc20vaHBldC5oPgorI2luY2x1ZGUgPGFzbS9od19pcnEuaD4KICNpbmNsdWRlIDxhc20vdXYvdXZfaHViLmg+CiAjaW5jbHVkZSA8YXNtL3V2L3V2X2lycS5oPgogCkBAIC0xMjksMTIgKzEzMCw5IEBACiAJc3RydWN0IGlycV9waW5fbGlzdCAqbmV4dDsKIH07CiAKLXN0YXRpYyBzdHJ1Y3QgaXJxX3Bpbl9saXN0ICpnZXRfb25lX2ZyZWVfaXJxXzJfcGluKGludCBjcHUpCitzdGF0aWMgc3RydWN0IGlycV9waW5fbGlzdCAqZ2V0X29uZV9mcmVlX2lycV8yX3BpbihpbnQgbm9kZSkKIHsKIAlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICpwaW47Ci0JaW50IG5vZGU7Ci0KLQlub2RlID0gY3B1X3RvX25vZGUoY3B1KTsKIAogCXBpbiA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKnBpbiksIEdGUF9BVE9NSUMsIG5vZGUpOwogCkBAIC0xNDgsOSArMTQ2LDYgQEAKIAl1bnNpZ25lZCBtb3ZlX2NsZWFudXBfY291bnQ7CiAJdTggdmVjdG9yOwogCXU4IG1vdmVfaW5fcHJvZ3Jlc3MgOiAxOwotI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MKLQl1OCBtb3ZlX2Rlc2NfcGVuZGluZyA6IDE7Ci0jZW5kaWYKIH07CiAKIC8qIGlycV9jZmcgaXMgaW5kZXhlZCBieSB0aGUgc3VtIG9mIGFsbCBSVEVzIGluIGFsbCBJL08gQVBJQ3MuICovCkBAIC0yMTIsMTIgKzIwNyw5IEBACiAJcmV0dXJuIGNmZzsKIH0KIAotc3RhdGljIHN0cnVjdCBpcnFfY2ZnICpnZXRfb25lX2ZyZWVfaXJxX2NmZyhpbnQgY3B1KQorc3RhdGljIHN0cnVjdCBpcnFfY2ZnICpnZXRfb25lX2ZyZWVfaXJxX2NmZyhpbnQgbm9kZSkKIHsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwotCWludCBub2RlOwotCi0Jbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CiAKIAljZmcgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpjZmcpLCBHRlBfQVRPTUlDLCBub2RlKTsKIAlpZiAoY2ZnKSB7CkBAIC0yMzgsMTMgKzIzMCwxMyBAQAogCXJldHVybiBjZmc7CiB9CiAKLWludCBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSkKK2ludCBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9jZmcgKmNmZzsKIAogCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKIAlpZiAoIWNmZykgewotCQlkZXNjLT5jaGlwX2RhdGEgPSBnZXRfb25lX2ZyZWVfaXJxX2NmZyhjcHUpOworCQlkZXNjLT5jaGlwX2RhdGEgPSBnZXRfb25lX2ZyZWVfaXJxX2NmZyhub2RlKTsKIAkJaWYgKCFkZXNjLT5jaGlwX2RhdGEpIHsKIAkJCXByaW50ayhLRVJOX0VSUiAiY2FuIG5vdCBhbGxvYyBpcnFfY2ZnXG4iKTsKIAkJCUJVR19PTigxKTsKQEAgLTI1NCwxMCArMjQ2LDkgQEAKIAlyZXR1cm4gMDsKIH0KIAotI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MKLQorLyogZm9yIG1vdmVfaXJxX2Rlc2MgKi8KIHN0YXRpYyB2b2lkCi1pbml0X2NvcHlfaXJxXzJfcGluKHN0cnVjdCBpcnFfY2ZnICpvbGRfY2ZnLCBzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBpbnQgY3B1KQoraW5pdF9jb3B5X2lycV8yX3BpbihzdHJ1Y3QgaXJxX2NmZyAqb2xkX2NmZywgc3RydWN0IGlycV9jZmcgKmNmZywgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9waW5fbGlzdCAqb2xkX2VudHJ5LCAqaGVhZCwgKnRhaWwsICplbnRyeTsKIApAQCAtMjY2LDcgKzI1Nyw3IEBACiAJaWYgKCFvbGRfZW50cnkpCiAJCXJldHVybjsKIAotCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3BpbihjcHUpOworCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3Bpbihub2RlKTsKIAlpZiAoIWVudHJ5KQogCQlyZXR1cm47CiAKQEAgLTI3Niw3ICsyNjcsNyBAQAogCXRhaWwJCT0gZW50cnk7CiAJb2xkX2VudHJ5CT0gb2xkX2VudHJ5LT5uZXh0OwogCXdoaWxlIChvbGRfZW50cnkpIHsKLQkJZW50cnkgPSBnZXRfb25lX2ZyZWVfaXJxXzJfcGluKGNwdSk7CisJCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3Bpbihub2RlKTsKIAkJaWYgKCFlbnRyeSkgewogCQkJZW50cnkgPSBoZWFkOwogCQkJd2hpbGUgKGVudHJ5KSB7CkBAIC0zMTYsMTIgKzMwNywxMiBAQAogfQogCiB2b2lkIGFyY2hfaW5pdF9jb3B5X2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAotCQkJCSBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUpCisJCQkJIHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9jZmcgKmNmZzsKIAlzdHJ1Y3QgaXJxX2NmZyAqb2xkX2NmZzsKIAotCWNmZyA9IGdldF9vbmVfZnJlZV9pcnFfY2ZnKGNwdSk7CisJY2ZnID0gZ2V0X29uZV9mcmVlX2lycV9jZmcobm9kZSk7CiAKIAlpZiAoIWNmZykKIAkJcmV0dXJuOwpAQCAtMzMyLDcgKzMyMyw3IEBACiAKIAltZW1jcHkoY2ZnLCBvbGRfY2ZnLCBzaXplb2Yoc3RydWN0IGlycV9jZmcpKTsKIAotCWluaXRfY29weV9pcnFfMl9waW4ob2xkX2NmZywgY2ZnLCBjcHUpOworCWluaXRfY29weV9pcnFfMl9waW4ob2xkX2NmZywgY2ZnLCBub2RlKTsKIH0KIAogc3RhdGljIHZvaWQgZnJlZV9pcnFfY2ZnKHN0cnVjdCBpcnFfY2ZnICpvbGRfY2ZnKQpAQCAtMzU2LDE5ICszNDcsNyBAQAogCQlvbGRfZGVzYy0+Y2hpcF9kYXRhID0gTlVMTDsKIAl9CiB9Ci0KLXN0YXRpYyB2b2lkCi1zZXRfZXh0cmFfbW92ZV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCi17Ci0Jc3RydWN0IGlycV9jZmcgKmNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQotCWlmICghY2ZnLT5tb3ZlX2luX3Byb2dyZXNzKSB7Ci0JCS8qIGl0IG1lYW5zIHRoYXQgZG9tYWluIGlzIG5vdCBjaGFuZ2VkICovCi0JCWlmICghY3B1bWFza19pbnRlcnNlY3RzKGRlc2MtPmFmZmluaXR5LCBtYXNrKSkKLQkJCWNmZy0+bW92ZV9kZXNjX3BlbmRpbmcgPSAxOwotCX0KLX0KLSNlbmRpZgorLyogZW5kIGZvciBtb3ZlX2lycV9kZXNjICovCiAKICNlbHNlCiBzdGF0aWMgc3RydWN0IGlycV9jZmcgKmlycV9jZmcodW5zaWduZWQgaW50IGlycSkKQEAgLTM3OCwxMyArMzU3LDYgQEAKIAogI2VuZGlmCiAKLSNpZm5kZWYgQ09ORklHX05VTUFfTUlHUkFURV9JUlFfREVTQwotc3RhdGljIGlubGluZSB2b2lkCi1zZXRfZXh0cmFfbW92ZV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCi17Ci19Ci0jZW5kaWYKLQogc3RydWN0IGlvX2FwaWMgewogCXVuc2lnbmVkIGludCBpbmRleDsKIAl1bnNpZ25lZCBpbnQgdW51c2VkWzNdOwpAQCAtNTE4LDEzMiArNDkwLDE4IEBACiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKIH0KIAotI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIHNlbmRfY2xlYW51cF92ZWN0b3Ioc3RydWN0IGlycV9jZmcgKmNmZykKLXsKLQljcHVtYXNrX3Zhcl90IGNsZWFudXBfbWFzazsKLQotCWlmICh1bmxpa2VseSghYWxsb2NfY3B1bWFza192YXIoJmNsZWFudXBfbWFzaywgR0ZQX0FUT01JQykpKSB7Ci0JCXVuc2lnbmVkIGludCBpOwotCQljZmctPm1vdmVfY2xlYW51cF9jb3VudCA9IDA7Ci0JCWZvcl9lYWNoX2NwdV9hbmQoaSwgY2ZnLT5vbGRfZG9tYWluLCBjcHVfb25saW5lX21hc2spCi0JCQljZmctPm1vdmVfY2xlYW51cF9jb3VudCsrOwotCQlmb3JfZWFjaF9jcHVfYW5kKGksIGNmZy0+b2xkX2RvbWFpbiwgY3B1X29ubGluZV9tYXNrKQotCQkJYXBpYy0+c2VuZF9JUElfbWFzayhjcHVtYXNrX29mKGkpLCBJUlFfTU9WRV9DTEVBTlVQX1ZFQ1RPUik7Ci0JfSBlbHNlIHsKLQkJY3B1bWFza19hbmQoY2xlYW51cF9tYXNrLCBjZmctPm9sZF9kb21haW4sIGNwdV9vbmxpbmVfbWFzayk7Ci0JCWNmZy0+bW92ZV9jbGVhbnVwX2NvdW50ID0gY3B1bWFza193ZWlnaHQoY2xlYW51cF9tYXNrKTsKLQkJYXBpYy0+c2VuZF9JUElfbWFzayhjbGVhbnVwX21hc2ssIElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SKTsKLQkJZnJlZV9jcHVtYXNrX3ZhcihjbGVhbnVwX21hc2spOwotCX0KLQljZmctPm1vdmVfaW5fcHJvZ3Jlc3MgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBfX3RhcmdldF9JT19BUElDX2lycSh1bnNpZ25lZCBpbnQgaXJxLCB1bnNpZ25lZCBpbnQgZGVzdCwgc3RydWN0IGlycV9jZmcgKmNmZykKLXsKLQlpbnQgYXBpYywgcGluOwotCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5OwotCXU4IHZlY3RvciA9IGNmZy0+dmVjdG9yOwotCi0JZW50cnkgPSBjZmctPmlycV8yX3BpbjsKLQlmb3IgKDs7KSB7Ci0JCXVuc2lnbmVkIGludCByZWc7Ci0KLQkJaWYgKCFlbnRyeSkKLQkJCWJyZWFrOwotCi0JCWFwaWMgPSBlbnRyeS0+YXBpYzsKLQkJcGluID0gZW50cnktPnBpbjsKLQkJLyoKLQkJICogV2l0aCBpbnRlcnJ1cHQtcmVtYXBwaW5nLCBkZXN0aW5hdGlvbiBpbmZvcm1hdGlvbiBjb21lcwotCQkgKiBmcm9tIGludGVycnVwdC1yZW1hcHBpbmcgdGFibGUgZW50cnkuCi0JCSAqLwotCQlpZiAoIWlycV9yZW1hcHBlZChpcnEpKQotCQkJaW9fYXBpY193cml0ZShhcGljLCAweDExICsgcGluKjIsIGRlc3QpOwotCQlyZWcgPSBpb19hcGljX3JlYWQoYXBpYywgMHgxMCArIHBpbioyKTsKLQkJcmVnICY9IH5JT19BUElDX1JFRElSX1ZFQ1RPUl9NQVNLOwotCQlyZWcgfD0gdmVjdG9yOwotCQlpb19hcGljX21vZGlmeShhcGljLCAweDEwICsgcGluKjIsIHJlZyk7Ci0JCWlmICghZW50cnktPm5leHQpCi0JCQlicmVhazsKLQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKLQl9Ci19Ci0KLXN0YXRpYyBpbnQKLWFzc2lnbl9pcnFfdmVjdG9yKGludCBpcnEsIHN0cnVjdCBpcnFfY2ZnICpjZmcsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKTsKLQotLyoKLSAqIEVpdGhlciBzZXRzIGRlc2MtPmFmZmluaXR5IHRvIGEgdmFsaWQgdmFsdWUsIGFuZCByZXR1cm5zCi0gKiAtPmNwdV9tYXNrX3RvX2FwaWNpZCBvZiB0aGF0LCBvciByZXR1cm5zIEJBRF9BUElDSUQgYW5kCi0gKiBsZWF2ZXMgZGVzYy0+YWZmaW5pdHkgdW50b3VjaGVkLgotICovCi1zdGF0aWMgdW5zaWduZWQgaW50Ci1zZXRfZGVzY19hZmZpbml0eShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQotewotCXN0cnVjdCBpcnFfY2ZnICpjZmc7Ci0JdW5zaWduZWQgaW50IGlycTsKLQotCWlmICghY3B1bWFza19pbnRlcnNlY3RzKG1hc2ssIGNwdV9vbmxpbmVfbWFzaykpCi0JCXJldHVybiBCQURfQVBJQ0lEOwotCi0JaXJxID0gZGVzYy0+aXJxOwotCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQlpZiAoYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIG1hc2spKQotCQlyZXR1cm4gQkFEX0FQSUNJRDsKLQotCS8qIGNoZWNrIHRoYXQgYmVmb3JlIGRlc2MtPmFkZGluaXR5IGdldCB1cGRhdGVkICovCi0Jc2V0X2V4dHJhX21vdmVfZGVzYyhkZXNjLCBtYXNrKTsKLQotCWNwdW1hc2tfY29weShkZXNjLT5hZmZpbml0eSwgbWFzayk7Ci0KLQlyZXR1cm4gYXBpYy0+Y3B1X21hc2tfdG9fYXBpY2lkX2FuZChkZXNjLT5hZmZpbml0eSwgY2ZnLT5kb21haW4pOwotfQotCi1zdGF0aWMgdm9pZAotc2V0X2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQotewotCXN0cnVjdCBpcnFfY2ZnICpjZmc7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQl1bnNpZ25lZCBpbnQgZGVzdDsKLQl1bnNpZ25lZCBpbnQgaXJxOwotCi0JaXJxID0gZGVzYy0+aXJxOwotCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZpb2FwaWNfbG9jaywgZmxhZ3MpOwotCWRlc3QgPSBzZXRfZGVzY19hZmZpbml0eShkZXNjLCBtYXNrKTsKLQlpZiAoZGVzdCAhPSBCQURfQVBJQ0lEKSB7Ci0JCS8qIE9ubHkgdGhlIGhpZ2ggOCBiaXRzIGFyZSB2YWxpZC4gKi8KLQkJZGVzdCA9IFNFVF9BUElDX0xPR0lDQUxfSUQoZGVzdCk7Ci0JCV9fdGFyZ2V0X0lPX0FQSUNfaXJxKGlycSwgZGVzdCwgY2ZnKTsKLQl9Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLX0KLQotc3RhdGljIHZvaWQKLXNldF9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQotewotCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKLQotCWRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwotCi0Jc2V0X2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhkZXNjLCBtYXNrKTsKLX0KLSNlbmRpZiAvKiBDT05GSUdfU01QICovCi0KIC8qCiAgKiBUaGUgY29tbW9uIGNhc2UgaXMgMToxIElSUTwtPnBpbiBtYXBwaW5ncy4gU29tZXRpbWVzIHRoZXJlIGFyZQogICogc2hhcmVkIElTQS1zcGFjZSBJUlFzLCBzbyB3ZSBoYXZlIHRvIHN1cHBvcnQgdGhlbS4gV2UgYXJlIHN1cGVyCiAgKiBmYXN0IGluIHRoZSBjb21tb24gY2FzZSwgYW5kIGZhc3QgZm9yIHNoYXJlZCBJU0Etc3BhY2UgSVJRcy4KICAqLwotc3RhdGljIHZvaWQgYWRkX3Bpbl90b19pcnFfY3B1KHN0cnVjdCBpcnFfY2ZnICpjZmcsIGludCBjcHUsIGludCBhcGljLCBpbnQgcGluKQorc3RhdGljIHZvaWQgYWRkX3Bpbl90b19pcnFfbm9kZShzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBpbnQgbm9kZSwgaW50IGFwaWMsIGludCBwaW4pCiB7CiAJc3RydWN0IGlycV9waW5fbGlzdCAqZW50cnk7CiAKIAllbnRyeSA9IGNmZy0+aXJxXzJfcGluOwogCWlmICghZW50cnkpIHsKLQkJZW50cnkgPSBnZXRfb25lX2ZyZWVfaXJxXzJfcGluKGNwdSk7CisJCWVudHJ5ID0gZ2V0X29uZV9mcmVlX2lycV8yX3Bpbihub2RlKTsKIAkJaWYgKCFlbnRyeSkgewogCQkJcHJpbnRrKEtFUk5fRVJSICJjYW4gbm90IGFsbG9jIGlycV8yX3BpbiB0byBhZGQgJWQgLSAlZFxuIiwKIAkJCQkJYXBpYywgcGluKTsKQEAgLTY2Myw3ICs1MjEsNyBAQAogCQllbnRyeSA9IGVudHJ5LT5uZXh0OwogCX0KIAotCWVudHJ5LT5uZXh0ID0gZ2V0X29uZV9mcmVlX2lycV8yX3BpbihjcHUpOworCWVudHJ5LT5uZXh0ID0gZ2V0X29uZV9mcmVlX2lycV8yX3Bpbihub2RlKTsKIAllbnRyeSA9IGVudHJ5LT5uZXh0OwogCWVudHJ5LT5hcGljID0gYXBpYzsKIAllbnRyeS0+cGluID0gcGluOwpAQCAtNjcyLDcgKzUzMCw3IEBACiAvKgogICogUmVyb3V0ZSBhbiBJUlEgdG8gYSBkaWZmZXJlbnQgcGluLgogICovCi1zdGF0aWMgdm9pZCBfX2luaXQgcmVwbGFjZV9waW5fYXRfaXJxX2NwdShzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBpbnQgY3B1LAorc3RhdGljIHZvaWQgX19pbml0IHJlcGxhY2VfcGluX2F0X2lycV9ub2RlKHN0cnVjdCBpcnFfY2ZnICpjZmcsIGludCBub2RlLAogCQkJCSAgICAgIGludCBvbGRhcGljLCBpbnQgb2xkcGluLAogCQkJCSAgICAgIGludCBuZXdhcGljLCBpbnQgbmV3cGluKQogewpAQCAtNjkyLDcgKzU1MCw3IEBACiAKIAkvKiB3aHk/IGNhbGwgcmVwbGFjZSBiZWZvcmUgYWRkPyAqLwogCWlmICghcmVwbGFjZWQpCi0JCWFkZF9waW5fdG9faXJxX2NwdShjZmcsIGNwdSwgbmV3YXBpYywgbmV3cGluKTsKKwkJYWRkX3Bpbl90b19pcnFfbm9kZShjZmcsIG5vZGUsIG5ld2FwaWMsIG5ld3Bpbik7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpb19hcGljX21vZGlmeV9pcnEoc3RydWN0IGlycV9jZmcgKmNmZywKQEAgLTg1MCw3ICs3MDgsNiBAQAogX19zZXR1cCgicGlycT0iLCBpb2FwaWNfcGlycV9zZXR1cCk7CiAjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLwogCi0jaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKIHN0cnVjdCBJT19BUElDX3JvdXRlX2VudHJ5ICoqYWxsb2NfaW9hcGljX2VudHJpZXModm9pZCkKIHsKIAlpbnQgYXBpYzsKQEAgLTk0OCwyMCArODA1LDYgQEAKIAlyZXR1cm4gMDsKIH0KIAotdm9pZCByZWluaXRfaW50cl9yZW1hcHBlZF9JT19BUElDKGludCBpbnRyX3JlbWFwcGluZywKLQlzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzKQotCi17Ci0JLyoKLQkgKiBmb3Igbm93IHBsYWluIHJlc3RvcmUgb2YgcHJldmlvdXMgc2V0dGluZ3MuCi0JICogVEJEOiBJbiB0aGUgY2FzZSBvZiBPUyBlbmFibGluZyBpbnRlcnJ1cHQtcmVtYXBwaW5nLAotCSAqIElPLUFQSUMgUlRFJ3MgbmVlZCB0byBiZSBzZXR1cCB0byBwb2ludCB0byBpbnRlcnJ1cHQtcmVtYXBwaW5nCi0JICogdGFibGUgZW50cmllcy4gZm9yIG5vdywgZG8gYSBwbGFpbiByZXN0b3JlLCBhbmQgd2FpdCBmb3IKLQkgKiB0aGUgc2V0dXBfSU9fQVBJQ19pcnFzKCkgdG8gZG8gcHJvcGVyIGluaXRpYWxpemF0aW9uLgotCSAqLwotCXJlc3RvcmVfSU9fQVBJQ19zZXR1cChpb2FwaWNfZW50cmllcyk7Ci19Ci0KIHZvaWQgZnJlZV9pb2FwaWNfZW50cmllcyhzdHJ1Y3QgSU9fQVBJQ19yb3V0ZV9lbnRyeSAqKmlvYXBpY19lbnRyaWVzKQogewogCWludCBhcGljOwpAQCAtOTcxLDcgKzgxNCw2IEBACiAKIAlrZnJlZShpb2FwaWNfZW50cmllcyk7CiB9Ci0jZW5kaWYKIAogLyoKICAqIEZpbmQgdGhlIElSUSBlbnRyeSBudW1iZXIgb2YgYSBjZXJ0YWluIHBpbi4KQEAgLTEwMzIsNTQgKzg3NCw2IEBACiAJcmV0dXJuIC0xOwogfQogCi0vKgotICogRmluZCBhIHNwZWNpZmljIFBDSSBJUlEgZW50cnkuCi0gKiBOb3QgYW4gX19pbml0LCBwb3NzaWJseSBuZWVkZWQgYnkgbW9kdWxlcwotICovCi1zdGF0aWMgaW50IHBpbl8yX2lycShpbnQgaWR4LCBpbnQgYXBpYywgaW50IHBpbik7Ci0KLWludCBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IHBpbikKLXsKLQlpbnQgYXBpYywgaSwgYmVzdF9ndWVzcyA9IC0xOwotCi0JYXBpY19wcmludGsoQVBJQ19ERUJVRywgInF1ZXJ5aW5nIFBDSSAtPiBJUlEgbWFwcGluZyBidXM6JWQsIHNsb3Q6JWQsIHBpbjolZC5cbiIsCi0JCWJ1cywgc2xvdCwgcGluKTsKLQlpZiAodGVzdF9iaXQoYnVzLCBtcF9idXNfbm90X3BjaSkpIHsKLQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiUENJIEJJT1MgcGFzc2VkIG5vbmV4aXN0ZW50IFBDSSBidXMgJWQhXG4iLCBidXMpOwotCQlyZXR1cm4gLTE7Ci0JfQotCWZvciAoaSA9IDA7IGkgPCBtcF9pcnFfZW50cmllczsgaSsrKSB7Ci0JCWludCBsYnVzID0gbXBfaXJxc1tpXS5zcmNidXM7Ci0KLQkJZm9yIChhcGljID0gMDsgYXBpYyA8IG5yX2lvYXBpY3M7IGFwaWMrKykKLQkJCWlmIChtcF9pb2FwaWNzW2FwaWNdLmFwaWNpZCA9PSBtcF9pcnFzW2ldLmRzdGFwaWMgfHwKLQkJCSAgICBtcF9pcnFzW2ldLmRzdGFwaWMgPT0gTVBfQVBJQ19BTEwpCi0JCQkJYnJlYWs7Ci0KLQkJaWYgKCF0ZXN0X2JpdChsYnVzLCBtcF9idXNfbm90X3BjaSkgJiYKLQkJICAgICFtcF9pcnFzW2ldLmlycXR5cGUgJiYKLQkJICAgIChidXMgPT0gbGJ1cykgJiYKLQkJICAgIChzbG90ID09ICgobXBfaXJxc1tpXS5zcmNidXNpcnEgPj4gMikgJiAweDFmKSkpIHsKLQkJCWludCBpcnEgPSBwaW5fMl9pcnEoaSwgYXBpYywgbXBfaXJxc1tpXS5kc3RpcnEpOwotCi0JCQlpZiAoIShhcGljIHx8IElPX0FQSUNfSVJRKGlycSkpKQotCQkJCWNvbnRpbnVlOwotCi0JCQlpZiAocGluID09IChtcF9pcnFzW2ldLnNyY2J1c2lycSAmIDMpKQotCQkJCXJldHVybiBpcnE7Ci0JCQkvKgotCQkJICogVXNlIHRoZSBmaXJzdCBhbGwtYnV0LXBpbiBtYXRjaGluZyBlbnRyeSBhcyBhCi0JCQkgKiBiZXN0LWd1ZXNzIGZ1enp5IHJlc3VsdCBmb3IgYnJva2VuIG1wdGFibGVzLgotCQkJICovCi0JCQlpZiAoYmVzdF9ndWVzcyA8IDApCi0JCQkJYmVzdF9ndWVzcyA9IGlycTsKLQkJfQotCX0KLQlyZXR1cm4gYmVzdF9ndWVzczsKLX0KLQotRVhQT1JUX1NZTUJPTChJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3Rvcik7Ci0KICNpZiBkZWZpbmVkKENPTkZJR19FSVNBKSB8fCBkZWZpbmVkKENPTkZJR19NQ0EpCiAvKgogICogRUlTQSBFZGdlL0xldmVsIGNvbnRyb2wgcmVnaXN0ZXIsIEVMQ1IKQEAgLTEyOTgsNiArMTA5Miw2NCBAQAogCXJldHVybiBpcnE7CiB9CiAKKy8qCisgKiBGaW5kIGEgc3BlY2lmaWMgUENJIElSUSBlbnRyeS4KKyAqIE5vdCBhbiBfX2luaXQsIHBvc3NpYmx5IG5lZWRlZCBieSBtb2R1bGVzCisgKi8KK2ludCBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihpbnQgYnVzLCBpbnQgc2xvdCwgaW50IHBpbiwKKwkJCQlzdHJ1Y3QgaW9fYXBpY19pcnFfYXR0ciAqaXJxX2F0dHIpCit7CisJaW50IGFwaWMsIGksIGJlc3RfZ3Vlc3MgPSAtMTsKKworCWFwaWNfcHJpbnRrKEFQSUNfREVCVUcsCisJCSAgICAicXVlcnlpbmcgUENJIC0+IElSUSBtYXBwaW5nIGJ1czolZCwgc2xvdDolZCwgcGluOiVkLlxuIiwKKwkJICAgIGJ1cywgc2xvdCwgcGluKTsKKwlpZiAodGVzdF9iaXQoYnVzLCBtcF9idXNfbm90X3BjaSkpIHsKKwkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLAorCQkJICAgICJQQ0kgQklPUyBwYXNzZWQgbm9uZXhpc3RlbnQgUENJIGJ1cyAlZCFcbiIsIGJ1cyk7CisJCXJldHVybiAtMTsKKwl9CisJZm9yIChpID0gMDsgaSA8IG1wX2lycV9lbnRyaWVzOyBpKyspIHsKKwkJaW50IGxidXMgPSBtcF9pcnFzW2ldLnNyY2J1czsKKworCQlmb3IgKGFwaWMgPSAwOyBhcGljIDwgbnJfaW9hcGljczsgYXBpYysrKQorCQkJaWYgKG1wX2lvYXBpY3NbYXBpY10uYXBpY2lkID09IG1wX2lycXNbaV0uZHN0YXBpYyB8fAorCQkJICAgIG1wX2lycXNbaV0uZHN0YXBpYyA9PSBNUF9BUElDX0FMTCkKKwkJCQlicmVhazsKKworCQlpZiAoIXRlc3RfYml0KGxidXMsIG1wX2J1c19ub3RfcGNpKSAmJgorCQkgICAgIW1wX2lycXNbaV0uaXJxdHlwZSAmJgorCQkgICAgKGJ1cyA9PSBsYnVzKSAmJgorCQkgICAgKHNsb3QgPT0gKChtcF9pcnFzW2ldLnNyY2J1c2lycSA+PiAyKSAmIDB4MWYpKSkgeworCQkJaW50IGlycSA9IHBpbl8yX2lycShpLCBhcGljLCBtcF9pcnFzW2ldLmRzdGlycSk7CisKKwkJCWlmICghKGFwaWMgfHwgSU9fQVBJQ19JUlEoaXJxKSkpCisJCQkJY29udGludWU7CisKKwkJCWlmIChwaW4gPT0gKG1wX2lycXNbaV0uc3JjYnVzaXJxICYgMykpIHsKKwkJCQlzZXRfaW9fYXBpY19pcnFfYXR0cihpcnFfYXR0ciwgYXBpYywKKwkJCQkJCSAgICAgbXBfaXJxc1tpXS5kc3RpcnEsCisJCQkJCQkgICAgIGlycV90cmlnZ2VyKGkpLAorCQkJCQkJICAgICBpcnFfcG9sYXJpdHkoaSkpOworCQkJCXJldHVybiBpcnE7CisJCQl9CisJCQkvKgorCQkJICogVXNlIHRoZSBmaXJzdCBhbGwtYnV0LXBpbiBtYXRjaGluZyBlbnRyeSBhcyBhCisJCQkgKiBiZXN0LWd1ZXNzIGZ1enp5IHJlc3VsdCBmb3IgYnJva2VuIG1wdGFibGVzLgorCQkJICovCisJCQlpZiAoYmVzdF9ndWVzcyA8IDApIHsKKwkJCQlzZXRfaW9fYXBpY19pcnFfYXR0cihpcnFfYXR0ciwgYXBpYywKKwkJCQkJCSAgICAgbXBfaXJxc1tpXS5kc3RpcnEsCisJCQkJCQkgICAgIGlycV90cmlnZ2VyKGkpLAorCQkJCQkJICAgICBpcnFfcG9sYXJpdHkoaSkpOworCQkJCWJlc3RfZ3Vlc3MgPSBpcnE7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGJlc3RfZ3Vlc3M7Cit9CitFWFBPUlRfU1lNQk9MKElPX0FQSUNfZ2V0X1BDSV9pcnFfdmVjdG9yKTsKKwogdm9pZCBsb2NrX3ZlY3Rvcl9sb2NrKHZvaWQpCiB7CiAJLyogVXNlZCB0byB0aGUgb25saW5lIHNldCBvZiBjcHVzIGRvZXMgbm90IGNoYW5nZQpAQCAtMTYyOCw1OCArMTQ4MCw3MCBAQAogCWlvYXBpY193cml0ZV9lbnRyeShhcGljX2lkLCBwaW4sIGVudHJ5KTsKIH0KIAorc3RhdGljIHN0cnVjdCB7CisJREVDTEFSRV9CSVRNQVAocGluX3Byb2dyYW1tZWQsIE1QX01BWF9JT0FQSUNfUElOICsgMSk7Cit9IG1wX2lvYXBpY19yb3V0aW5nW01BWF9JT19BUElDU107CisKIHN0YXRpYyB2b2lkIF9faW5pdCBzZXR1cF9JT19BUElDX2lycXModm9pZCkKIHsKLQlpbnQgYXBpY19pZCwgcGluLCBpZHgsIGlycTsKKwlpbnQgYXBpY19pZCA9IDAsIHBpbiwgaWR4LCBpcnE7CiAJaW50IG5vdGNvbiA9IDA7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7Ci0JaW50IGNwdSA9IGJvb3RfY3B1X2lkOworCWludCBub2RlID0gY3B1X3RvX25vZGUoYm9vdF9jcHVfaWQpOwogCiAJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCBLRVJOX0RFQlVHICJpbml0IElPX0FQSUMgSVJRc1xuIik7CiAKLQlmb3IgKGFwaWNfaWQgPSAwOyBhcGljX2lkIDwgbnJfaW9hcGljczsgYXBpY19pZCsrKSB7Ci0JCWZvciAocGluID0gMDsgcGluIDwgbnJfaW9hcGljX3JlZ2lzdGVyc1thcGljX2lkXTsgcGluKyspIHsKKyNpZmRlZiBDT05GSUdfQUNQSQorCWlmICghYWNwaV9kaXNhYmxlZCAmJiBhY3BpX2lvYXBpYykgeworCQlhcGljX2lkID0gbXBfZmluZF9pb2FwaWMoMCk7CisJCWlmIChhcGljX2lkIDwgMCkKKwkJCWFwaWNfaWQgPSAwOworCX0KKyNlbmRpZgogCi0JCQlpZHggPSBmaW5kX2lycV9lbnRyeShhcGljX2lkLCBwaW4sIG1wX0lOVCk7Ci0JCQlpZiAoaWR4ID09IC0xKSB7Ci0JCQkJaWYgKCFub3Rjb24pIHsKLQkJCQkJbm90Y29uID0gMTsKLQkJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLAotCQkJCQkJS0VSTl9ERUJVRyAiICVkLSVkIiwKLQkJCQkJCW1wX2lvYXBpY3NbYXBpY19pZF0uYXBpY2lkLCBwaW4pOwotCQkJCX0gZWxzZQotCQkJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsICIgJWQtJWQiLAotCQkJCQkJbXBfaW9hcGljc1thcGljX2lkXS5hcGljaWQsIHBpbik7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQlpZiAobm90Y29uKSB7CisJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2FwaWNfaWRdOyBwaW4rKykgeworCQlpZHggPSBmaW5kX2lycV9lbnRyeShhcGljX2lkLCBwaW4sIG1wX0lOVCk7CisJCWlmIChpZHggPT0gLTEpIHsKKwkJCWlmICghbm90Y29uKSB7CisJCQkJbm90Y29uID0gMTsKIAkJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsCi0JCQkJCSIgKGFwaWNpZC1waW4pIG5vdCBjb25uZWN0ZWRcbiIpOwotCQkJCW5vdGNvbiA9IDA7Ci0JCQl9Ci0KLQkJCWlycSA9IHBpbl8yX2lycShpZHgsIGFwaWNfaWQsIHBpbik7Ci0KLQkJCS8qCi0JCQkgKiBTa2lwIHRoZSB0aW1lciBJUlEgaWYgdGhlcmUncyBhIHF1aXJrIGhhbmRsZXIKLQkJCSAqIGluc3RhbGxlZCBhbmQgaWYgaXQgcmV0dXJucyAxOgotCQkJICovCi0JCQlpZiAoYXBpYy0+bXVsdGlfdGltZXJfY2hlY2sgJiYKLQkJCQkJYXBpYy0+bXVsdGlfdGltZXJfY2hlY2soYXBpY19pZCwgaXJxKSkKLQkJCQljb250aW51ZTsKLQotCQkJZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX2NwdShpcnEsIGNwdSk7Ci0JCQlpZiAoIWRlc2MpIHsKLQkJCQlwcmludGsoS0VSTl9JTkZPICJjYW4gbm90IGdldCBpcnFfZGVzYyBmb3IgJWRcbiIsIGlycSk7Ci0JCQkJY29udGludWU7Ci0JCQl9Ci0JCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7Ci0JCQlhZGRfcGluX3RvX2lycV9jcHUoY2ZnLCBjcHUsIGFwaWNfaWQsIHBpbik7Ci0KLQkJCXNldHVwX0lPX0FQSUNfaXJxKGFwaWNfaWQsIHBpbiwgaXJxLCBkZXNjLAotCQkJCQlpcnFfdHJpZ2dlcihpZHgpLCBpcnFfcG9sYXJpdHkoaWR4KSk7CisJCQkJCUtFUk5fREVCVUcgIiAlZC0lZCIsCisJCQkJCW1wX2lvYXBpY3NbYXBpY19pZF0uYXBpY2lkLCBwaW4pOworCQkJfSBlbHNlCisJCQkJYXBpY19wcmludGsoQVBJQ19WRVJCT1NFLCAiICVkLSVkIiwKKwkJCQkJbXBfaW9hcGljc1thcGljX2lkXS5hcGljaWQsIHBpbik7CisJCQljb250aW51ZTsKIAkJfQorCQlpZiAobm90Y29uKSB7CisJCQlhcGljX3ByaW50ayhBUElDX1ZFUkJPU0UsCisJCQkJIiAoYXBpY2lkLXBpbikgbm90IGNvbm5lY3RlZFxuIik7CisJCQlub3Rjb24gPSAwOworCQl9CisKKwkJaXJxID0gcGluXzJfaXJxKGlkeCwgYXBpY19pZCwgcGluKTsKKworCQkvKgorCQkgKiBTa2lwIHRoZSB0aW1lciBJUlEgaWYgdGhlcmUncyBhIHF1aXJrIGhhbmRsZXIKKwkJICogaW5zdGFsbGVkIGFuZCBpZiBpdCByZXR1cm5zIDE6CisJCSAqLworCQlpZiAoYXBpYy0+bXVsdGlfdGltZXJfY2hlY2sgJiYKKwkJCQlhcGljLT5tdWx0aV90aW1lcl9jaGVjayhhcGljX2lkLCBpcnEpKQorCQkJY29udGludWU7CisKKwkJZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX25vZGUoaXJxLCBub2RlKTsKKwkJaWYgKCFkZXNjKSB7CisJCQlwcmludGsoS0VSTl9JTkZPICJjYW4gbm90IGdldCBpcnFfZGVzYyBmb3IgJWRcbiIsIGlycSk7CisJCQljb250aW51ZTsKKwkJfQorCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJCWFkZF9waW5fdG9faXJxX25vZGUoY2ZnLCBub2RlLCBhcGljX2lkLCBwaW4pOworCQkvKgorCQkgKiBkb24ndCBtYXJrIGl0IGluIHBpbl9wcm9ncmFtbWVkLCBzbyBsYXRlciBhY3BpIGNvdWxkCisJCSAqIHNldCBpdCBjb3JyZWN0bHkgd2hlbiBpcnEgPCAxNgorCQkgKi8KKwkJc2V0dXBfSU9fQVBJQ19pcnEoYXBpY19pZCwgcGluLCBpcnEsIGRlc2MsCisJCQkJaXJxX3RyaWdnZXIoaWR4KSwgaXJxX3BvbGFyaXR5KGlkeCkpOwogCX0KIAogCWlmIChub3Rjb24pCkBAIC0xODY5LDcgKzE3MzMsNyBAQAogCiBfX2FwaWNkZWJ1Z2luaXQodm9pZCkgcHJpbnRfbG9jYWxfQVBJQyh2b2lkICpkdW1teSkKIHsKLQl1bnNpZ25lZCBpbnQgdiwgdmVyLCBtYXhsdnQ7CisJdW5zaWduZWQgaW50IGksIHYsIHZlciwgbWF4bHZ0OwogCXU2NCBpY3I7CiAKIAlpZiAoYXBpY192ZXJib3NpdHkgPT0gQVBJQ19RVUlFVCkKQEAgLTE5NTcsNiArMTgyMSwxOCBAQAogCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBUTUNDVDogJTA4eFxuIiwgdik7CiAJdiA9IGFwaWNfcmVhZChBUElDX1REQ1IpOwogCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBURENSOiAlMDh4XG4iLCB2KTsKKworCWlmIChib290X2NwdV9oYXMoWDg2X0ZFQVRVUkVfRVhUQVBJQykpIHsKKwkJdiA9IGFwaWNfcmVhZChBUElDX0VGRUFUKTsKKwkJbWF4bHZ0ID0gKHYgPj4gMTYpICYgMHhmZjsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIEVGRUFUOiAlMDh4XG4iLCB2KTsKKwkJdiA9IGFwaWNfcmVhZChBUElDX0VDVFJMKTsKKwkJcHJpbnRrKEtFUk5fREVCVUcgIi4uLiBBUElDIEVDVFJMOiAlMDh4XG4iLCB2KTsKKwkJZm9yIChpID0gMDsgaSA8IG1heGx2dDsgaSsrKSB7CisJCQl2ID0gYXBpY19yZWFkKEFQSUNfRUlMVlRuKGkpKTsKKwkJCXByaW50ayhLRVJOX0RFQlVHICIuLi4gQVBJQyBFSUxWVCVkOiAlMDh4XG4iLCBpLCB2KTsKKwkJfQorCX0KIAlwcmludGsoIlxuIik7CiB9CiAKQEAgLTIwMDUsNiArMTg4MSwxMSBAQAogX19hcGljZGVidWdpbml0KGludCkgcHJpbnRfYWxsX0lDcyh2b2lkKQogewogCXByaW50X1BJQygpOworCisJLyogZG9uJ3QgcHJpbnQgb3V0IGlmIGFwaWMgaXMgbm90IHRoZXJlICovCisJaWYgKCFjcHVfaGFzX2FwaWMgfHwgZGlzYWJsZV9hcGljKQorCQlyZXR1cm4gMDsKKwogCXByaW50X2FsbF9sb2NhbF9BUElDcygpOwogCXByaW50X0lPX0FQSUMoKTsKIApAQCAtMjM2MCw2ICsyMjQxLDExOCBAQAogICovCiAKICNpZmRlZiBDT05GSUdfU01QCitzdGF0aWMgdm9pZCBzZW5kX2NsZWFudXBfdmVjdG9yKHN0cnVjdCBpcnFfY2ZnICpjZmcpCit7CisJY3B1bWFza192YXJfdCBjbGVhbnVwX21hc2s7CisKKwlpZiAodW5saWtlbHkoIWFsbG9jX2NwdW1hc2tfdmFyKCZjbGVhbnVwX21hc2ssIEdGUF9BVE9NSUMpKSkgeworCQl1bnNpZ25lZCBpbnQgaTsKKwkJY2ZnLT5tb3ZlX2NsZWFudXBfY291bnQgPSAwOworCQlmb3JfZWFjaF9jcHVfYW5kKGksIGNmZy0+b2xkX2RvbWFpbiwgY3B1X29ubGluZV9tYXNrKQorCQkJY2ZnLT5tb3ZlX2NsZWFudXBfY291bnQrKzsKKwkJZm9yX2VhY2hfY3B1X2FuZChpLCBjZmctPm9sZF9kb21haW4sIGNwdV9vbmxpbmVfbWFzaykKKwkJCWFwaWMtPnNlbmRfSVBJX21hc2soY3B1bWFza19vZihpKSwgSVJRX01PVkVfQ0xFQU5VUF9WRUNUT1IpOworCX0gZWxzZSB7CisJCWNwdW1hc2tfYW5kKGNsZWFudXBfbWFzaywgY2ZnLT5vbGRfZG9tYWluLCBjcHVfb25saW5lX21hc2spOworCQljZmctPm1vdmVfY2xlYW51cF9jb3VudCA9IGNwdW1hc2tfd2VpZ2h0KGNsZWFudXBfbWFzayk7CisJCWFwaWMtPnNlbmRfSVBJX21hc2soY2xlYW51cF9tYXNrLCBJUlFfTU9WRV9DTEVBTlVQX1ZFQ1RPUik7CisJCWZyZWVfY3B1bWFza192YXIoY2xlYW51cF9tYXNrKTsKKwl9CisJY2ZnLT5tb3ZlX2luX3Byb2dyZXNzID0gMDsKK30KKworc3RhdGljIHZvaWQgX190YXJnZXRfSU9fQVBJQ19pcnEodW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IGRlc3QsIHN0cnVjdCBpcnFfY2ZnICpjZmcpCit7CisJaW50IGFwaWMsIHBpbjsKKwlzdHJ1Y3QgaXJxX3Bpbl9saXN0ICplbnRyeTsKKwl1OCB2ZWN0b3IgPSBjZmctPnZlY3RvcjsKKworCWVudHJ5ID0gY2ZnLT5pcnFfMl9waW47CisJZm9yICg7OykgeworCQl1bnNpZ25lZCBpbnQgcmVnOworCisJCWlmICghZW50cnkpCisJCQlicmVhazsKKworCQlhcGljID0gZW50cnktPmFwaWM7CisJCXBpbiA9IGVudHJ5LT5waW47CisJCS8qCisJCSAqIFdpdGggaW50ZXJydXB0LXJlbWFwcGluZywgZGVzdGluYXRpb24gaW5mb3JtYXRpb24gY29tZXMKKwkJICogZnJvbSBpbnRlcnJ1cHQtcmVtYXBwaW5nIHRhYmxlIGVudHJ5LgorCQkgKi8KKwkJaWYgKCFpcnFfcmVtYXBwZWQoaXJxKSkKKwkJCWlvX2FwaWNfd3JpdGUoYXBpYywgMHgxMSArIHBpbioyLCBkZXN0KTsKKwkJcmVnID0gaW9fYXBpY19yZWFkKGFwaWMsIDB4MTAgKyBwaW4qMik7CisJCXJlZyAmPSB+SU9fQVBJQ19SRURJUl9WRUNUT1JfTUFTSzsKKwkJcmVnIHw9IHZlY3RvcjsKKwkJaW9fYXBpY19tb2RpZnkoYXBpYywgMHgxMCArIHBpbioyLCByZWcpOworCQlpZiAoIWVudHJ5LT5uZXh0KQorCQkJYnJlYWs7CisJCWVudHJ5ID0gZW50cnktPm5leHQ7CisJfQorfQorCitzdGF0aWMgaW50Cithc3NpZ25faXJxX3ZlY3RvcihpbnQgaXJxLCBzdHJ1Y3QgaXJxX2NmZyAqY2ZnLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayk7CisKKy8qCisgKiBFaXRoZXIgc2V0cyBkZXNjLT5hZmZpbml0eSB0byBhIHZhbGlkIHZhbHVlLCBhbmQgcmV0dXJucworICogLT5jcHVfbWFza190b19hcGljaWQgb2YgdGhhdCwgb3IgcmV0dXJucyBCQURfQVBJQ0lEIGFuZAorICogbGVhdmVzIGRlc2MtPmFmZmluaXR5IHVudG91Y2hlZC4KKyAqLworc3RhdGljIHVuc2lnbmVkIGludAorc2V0X2Rlc2NfYWZmaW5pdHkoc3RydWN0IGlycV9kZXNjICpkZXNjLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3sKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOworCXVuc2lnbmVkIGludCBpcnE7CisKKwlpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhtYXNrLCBjcHVfb25saW5lX21hc2spKQorCQlyZXR1cm4gQkFEX0FQSUNJRDsKKworCWlycSA9IGRlc2MtPmlycTsKKwljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgY2ZnLCBtYXNrKSkKKwkJcmV0dXJuIEJBRF9BUElDSUQ7CisKKwljcHVtYXNrX2NvcHkoZGVzYy0+YWZmaW5pdHksIG1hc2spOworCisJcmV0dXJuIGFwaWMtPmNwdV9tYXNrX3RvX2FwaWNpZF9hbmQoZGVzYy0+YWZmaW5pdHksIGNmZy0+ZG9tYWluKTsKK30KKworc3RhdGljIGludAorc2V0X2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQoreworCXN0cnVjdCBpcnFfY2ZnICpjZmc7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwl1bnNpZ25lZCBpbnQgZGVzdDsKKwl1bnNpZ25lZCBpbnQgaXJxOworCWludCByZXQgPSAtMTsKKworCWlycSA9IGRlc2MtPmlycTsKKwljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisKKwlzcGluX2xvY2tfaXJxc2F2ZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKKwlkZXN0ID0gc2V0X2Rlc2NfYWZmaW5pdHkoZGVzYywgbWFzayk7CisJaWYgKGRlc3QgIT0gQkFEX0FQSUNJRCkgeworCQkvKiBPbmx5IHRoZSBoaWdoIDggYml0cyBhcmUgdmFsaWQuICovCisJCWRlc3QgPSBTRVRfQVBJQ19MT0dJQ0FMX0lEKGRlc3QpOworCQlfX3RhcmdldF9JT19BUElDX2lycShpcnEsIGRlc3QsIGNmZyk7CisJCXJldCA9IDA7CisJfQorCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50CitzZXRfaW9hcGljX2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3sKKwlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2M7CisKKwlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCXJldHVybiBzZXRfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOworfQogCiAjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKIApAQCAtMjM3NCwyNiArMjM2NywyNSBAQAogICogUmVhbCB2ZWN0b3IgdGhhdCBpcyB1c2VkIGZvciBpbnRlcnJ1cHRpbmcgY3B1IHdpbGwgYmUgY29taW5nIGZyb20KICAqIHRoZSBpbnRlcnJ1cHQtcmVtYXBwaW5nIHRhYmxlIGVudHJ5LgogICovCi1zdGF0aWMgdm9pZAorc3RhdGljIGludAogbWlncmF0ZV9pb2FwaWNfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwogCXN0cnVjdCBpcnRlIGlydGU7CiAJdW5zaWduZWQgaW50IGRlc3Q7CiAJdW5zaWduZWQgaW50IGlycTsKKwlpbnQgcmV0ID0gLTE7CiAKIAlpZiAoIWNwdW1hc2tfaW50ZXJzZWN0cyhtYXNrLCBjcHVfb25saW5lX21hc2spKQotCQlyZXR1cm47CisJCXJldHVybiByZXQ7CiAKIAlpcnEgPSBkZXNjLT5pcnE7CiAJaWYgKGdldF9pcnRlKGlycSwgJmlydGUpKQotCQlyZXR1cm47CisJCXJldHVybiByZXQ7CiAKIAljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CiAJaWYgKGFzc2lnbl9pcnFfdmVjdG9yKGlycSwgY2ZnLCBtYXNrKSkKLQkJcmV0dXJuOwotCi0Jc2V0X2V4dHJhX21vdmVfZGVzYyhkZXNjLCBtYXNrKTsKKwkJcmV0dXJuIHJldDsKIAogCWRlc3QgPSBhcGljLT5jcHVfbWFza190b19hcGljaWRfYW5kKGNmZy0+ZG9tYWluLCBtYXNrKTsKIApAQCAtMjQwOSwyNyArMjQwMSwzMCBAQAogCQlzZW5kX2NsZWFudXBfdmVjdG9yKGNmZyk7CiAKIAljcHVtYXNrX2NvcHkoZGVzYy0+YWZmaW5pdHksIG1hc2spOworCisJcmV0dXJuIDA7CiB9CiAKIC8qCiAgKiBNaWdyYXRlcyB0aGUgSVJRIGRlc3RpbmF0aW9uIGluIHRoZSBwcm9jZXNzIGNvbnRleHQuCiAgKi8KLXN0YXRpYyB2b2lkIHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLAorc3RhdGljIGludCBzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywKIAkJCQkJICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewotCW1pZ3JhdGVfaW9hcGljX2lycV9kZXNjKGRlc2MsIG1hc2spOworCXJldHVybiBtaWdyYXRlX2lvYXBpY19pcnFfZGVzYyhkZXNjLCBtYXNrKTsKIH0KLXN0YXRpYyB2b2lkIHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsCitzdGF0aWMgaW50IHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGludCBpcnEsCiAJCQkJICAgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICptYXNrKQogewogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYyA9IGlycV90b19kZXNjKGlycSk7CiAKLQlzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOworCXJldHVybiBzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOwogfQogI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywKK3N0YXRpYyBpbmxpbmUgaW50IHNldF9pcl9pb2FwaWNfYWZmaW5pdHlfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLAogCQkJCQkJICAgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApAQCAtMjQ5MSw4NiArMjQ4NiwxOSBAQAogCXN0cnVjdCBpcnFfY2ZnICpjZmcgPSBkZXNjLT5jaGlwX2RhdGE7CiAJdW5zaWduZWQgdmVjdG9yLCBtZTsKIAotCWlmIChsaWtlbHkoIWNmZy0+bW92ZV9pbl9wcm9ncmVzcykpIHsKLSNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRFX0lSUV9ERVNDCi0JCWlmIChsaWtlbHkoIWNmZy0+bW92ZV9kZXNjX3BlbmRpbmcpKQotCQkJcmV0dXJuOwotCi0JCS8qIGRvbWFpbiBoYXMgbm90IGNoYW5nZWQsIGJ1dCBhZmZpbml0eSBkaWQgKi8KLQkJbWUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7Ci0JCWlmIChjcHVtYXNrX3Rlc3RfY3B1KG1lLCBkZXNjLT5hZmZpbml0eSkpIHsKLQkJCSpkZXNjcCA9IGRlc2MgPSBtb3ZlX2lycV9kZXNjKGRlc2MsIG1lKTsKLQkJCS8qIGdldCB0aGUgbmV3IG9uZSAqLwotCQkJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwotCQkJY2ZnLT5tb3ZlX2Rlc2NfcGVuZGluZyA9IDA7Ci0JCX0KLSNlbmRpZgorCWlmIChsaWtlbHkoIWNmZy0+bW92ZV9pbl9wcm9ncmVzcykpCiAJCXJldHVybjsKLQl9CiAKIAl2ZWN0b3IgPSB+Z2V0X2lycV9yZWdzKCktPm9yaWdfYXg7CiAJbWUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAKLQlpZiAodmVjdG9yID09IGNmZy0+dmVjdG9yICYmIGNwdW1hc2tfdGVzdF9jcHUobWUsIGNmZy0+ZG9tYWluKSkgewotI2lmZGVmIENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MKLQkJKmRlc2NwID0gZGVzYyA9IG1vdmVfaXJxX2Rlc2MoZGVzYywgbWUpOwotCQkvKiBnZXQgdGhlIG5ldyBvbmUgKi8KLQkJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwotI2VuZGlmCisJaWYgKHZlY3RvciA9PSBjZmctPnZlY3RvciAmJiBjcHVtYXNrX3Rlc3RfY3B1KG1lLCBjZmctPmRvbWFpbikpCiAJCXNlbmRfY2xlYW51cF92ZWN0b3IoY2ZnKTsKLQl9CiB9CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGlycV9jb21wbGV0ZV9tb3ZlKHN0cnVjdCBpcnFfZGVzYyAqKmRlc2NwKSB7fQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9fZW9pX2lvYXBpY19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9jZmcgKmNmZykKLXsKLQlpbnQgYXBpYywgcGluOwotCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5OwotCi0JZW50cnkgPSBjZmctPmlycV8yX3BpbjsKLQlmb3IgKDs7KSB7Ci0KLQkJaWYgKCFlbnRyeSkKLQkJCWJyZWFrOwotCi0JCWFwaWMgPSBlbnRyeS0+YXBpYzsKLQkJcGluID0gZW50cnktPnBpbjsKLQkJaW9fYXBpY19lb2koYXBpYywgcGluKTsKLQkJZW50cnkgPSBlbnRyeS0+bmV4dDsKLQl9Ci19Ci0KLXN0YXRpYyB2b2lkCi1lb2lfaW9hcGljX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCi17Ci0Jc3RydWN0IGlycV9jZmcgKmNmZzsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCXVuc2lnbmVkIGludCBpcnE7Ci0KLQlpcnEgPSBkZXNjLT5pcnE7Ci0JY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwotCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7Ci0JX19lb2lfaW9hcGljX2lycShpcnEsIGNmZyk7Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKLX0KLQotI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi1zdGF0aWMgdm9pZCBhY2tfeDJhcGljX2xldmVsKHVuc2lnbmVkIGludCBpcnEpCi17Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQlhY2tfeDJBUElDX2lycSgpOwotCWVvaV9pb2FwaWNfaXJxKGRlc2MpOwotfQotCi1zdGF0aWMgdm9pZCBhY2tfeDJhcGljX2VkZ2UodW5zaWduZWQgaW50IGlycSkKLXsKLQlhY2tfeDJBUElDX2lycSgpOwotfQotI2VuZGlmCi0KIHN0YXRpYyB2b2lkIGFja19hcGljX2VkZ2UodW5zaWduZWQgaW50IGlycSkKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwpAQCAtMjYzNCw5ICsyNTYyLDYgQEAKIAkgKi8KIAlhY2tfQVBJQ19pcnEoKTsKIAotCWlmIChpcnFfcmVtYXBwZWQoaXJxKSkKLQkJZW9pX2lvYXBpY19pcnEoZGVzYyk7Ci0KIAkvKiBOb3cgd2UgY2FuIG1vdmUgYW5kIHJlbmFibGUgdGhlIGlycSAqLwogCWlmICh1bmxpa2VseShkb191bm1hc2tfaXJxKSkgewogCQkvKiBPbmx5IG1pZ3JhdGUgdGhlIGlycSBpZiB0aGUgYWNrIGhhcyBiZWVuIHJlY2VpdmVkLgpAQCAtMjY4MywyMiArMjYwOCw1MCBAQAogfQogCiAjaWZkZWYgQ09ORklHX0lOVFJfUkVNQVAKK3N0YXRpYyB2b2lkIF9fZW9pX2lvYXBpY19pcnEodW5zaWduZWQgaW50IGlycSwgc3RydWN0IGlycV9jZmcgKmNmZykKK3sKKwlpbnQgYXBpYywgcGluOworCXN0cnVjdCBpcnFfcGluX2xpc3QgKmVudHJ5OworCisJZW50cnkgPSBjZmctPmlycV8yX3BpbjsKKwlmb3IgKDs7KSB7CisKKwkJaWYgKCFlbnRyeSkKKwkJCWJyZWFrOworCisJCWFwaWMgPSBlbnRyeS0+YXBpYzsKKwkJcGluID0gZW50cnktPnBpbjsKKwkJaW9fYXBpY19lb2koYXBpYywgcGluKTsKKwkJZW50cnkgPSBlbnRyeS0+bmV4dDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkCitlb2lfaW9hcGljX2lycShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7CisJc3RydWN0IGlycV9jZmcgKmNmZzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXVuc2lnbmVkIGludCBpcnE7CisKKwlpcnEgPSBkZXNjLT5pcnE7CisJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmlvYXBpY19sb2NrLCBmbGFncyk7CisJX19lb2lfaW9hcGljX2lycShpcnEsIGNmZyk7CisJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmaW9hcGljX2xvY2ssIGZsYWdzKTsKK30KKwogc3RhdGljIHZvaWQgaXJfYWNrX2FwaWNfZWRnZSh1bnNpZ25lZCBpbnQgaXJxKQogewotI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi0gICAgICAgaWYgKHgyYXBpY19lbmFibGVkKCkpCi0gICAgICAgICAgICAgICByZXR1cm4gYWNrX3gyYXBpY19lZGdlKGlycSk7Ci0jZW5kaWYKLSAgICAgICByZXR1cm4gYWNrX2FwaWNfZWRnZShpcnEpOworCWFja19BUElDX2lycSgpOwogfQogCiBzdGF0aWMgdm9pZCBpcl9hY2tfYXBpY19sZXZlbCh1bnNpZ25lZCBpbnQgaXJxKQogewotI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi0gICAgICAgaWYgKHgyYXBpY19lbmFibGVkKCkpCi0gICAgICAgICAgICAgICByZXR1cm4gYWNrX3gyYXBpY19sZXZlbChpcnEpOwotI2VuZGlmCi0gICAgICAgcmV0dXJuIGFja19hcGljX2xldmVsKGlycSk7CisJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCWFja19BUElDX2lycSgpOworCWVvaV9pb2FwaWNfaXJxKGRlc2MpOwogfQogI2VuZGlmIC8qIENPTkZJR19JTlRSX1JFTUFQICovCiAKQEAgLTI5MDMsNyArMjg1Niw3IEBACiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoMCk7CiAJc3RydWN0IGlycV9jZmcgKmNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQlpbnQgY3B1ID0gYm9vdF9jcHVfaWQ7CisJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShib290X2NwdV9pZCk7CiAJaW50IGFwaWMxLCBwaW4xLCBhcGljMiwgcGluMjsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBub19waW4xID0gMDsKQEAgLTI5NjksNyArMjkyMiw3IEBACiAJCSAqIE9rLCBkb2VzIElSUTAgdGhyb3VnaCB0aGUgSU9BUElDIHdvcms/CiAJCSAqLwogCQlpZiAobm9fcGluMSkgewotCQkJYWRkX3Bpbl90b19pcnFfY3B1KGNmZywgY3B1LCBhcGljMSwgcGluMSk7CisJCQlhZGRfcGluX3RvX2lycV9ub2RlKGNmZywgbm9kZSwgYXBpYzEsIHBpbjEpOwogCQkJc2V0dXBfdGltZXJfSVJRMF9waW4oYXBpYzEsIHBpbjEsIGNmZy0+dmVjdG9yKTsKIAkJfSBlbHNlIHsKIAkJCS8qIGZvciBlZGdlIHRyaWdnZXIsIHNldHVwX0lPX0FQSUNfaXJxIGFscmVhZHkKQEAgLTMwMDYsNyArMjk1OSw3IEBACiAJCS8qCiAJCSAqIGxlZ2FjeSBkZXZpY2VzIHNob3VsZCBiZSBjb25uZWN0ZWQgdG8gSU8gQVBJQyAjMAogCQkgKi8KLQkJcmVwbGFjZV9waW5fYXRfaXJxX2NwdShjZmcsIGNwdSwgYXBpYzEsIHBpbjEsIGFwaWMyLCBwaW4yKTsKKwkJcmVwbGFjZV9waW5fYXRfaXJxX25vZGUoY2ZnLCBub2RlLCBhcGljMSwgcGluMSwgYXBpYzIsIHBpbjIpOwogCQlzZXR1cF90aW1lcl9JUlEwX3BpbihhcGljMiwgcGluMiwgY2ZnLT52ZWN0b3IpOwogCQllbmFibGVfODI1OUFfaXJxKDApOwogCQlpZiAodGltZXJfaXJxX3dvcmtzKCkpIHsKQEAgLTMyMTgsMTQgKzMxNzEsMTMgQEAKIC8qCiAgKiBEeW5hbWljIGlycSBhbGxvY2F0ZSBhbmQgZGVhbGxvY2F0aW9uCiAgKi8KLXVuc2lnbmVkIGludCBjcmVhdGVfaXJxX25yKHVuc2lnbmVkIGludCBpcnFfd2FudCkKK3Vuc2lnbmVkIGludCBjcmVhdGVfaXJxX25yKHVuc2lnbmVkIGludCBpcnFfd2FudCwgaW50IG5vZGUpCiB7CiAJLyogQWxsb2NhdGUgYW4gdW51c2VkIGlycSAqLwogCXVuc2lnbmVkIGludCBpcnE7CiAJdW5zaWduZWQgaW50IG5ldzsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXN0cnVjdCBpcnFfY2ZnICpjZmdfbmV3ID0gTlVMTDsKLQlpbnQgY3B1ID0gYm9vdF9jcHVfaWQ7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjX25ldyA9IE5VTEw7CiAKIAlpcnEgPSAwOwpAQCAtMzIzNCw3ICszMTg2LDcgQEAKIAogCXNwaW5fbG9ja19pcnFzYXZlKCZ2ZWN0b3JfbG9jaywgZmxhZ3MpOwogCWZvciAobmV3ID0gaXJxX3dhbnQ7IG5ldyA8IG5yX2lycXM7IG5ldysrKSB7Ci0JCWRlc2NfbmV3ID0gaXJxX3RvX2Rlc2NfYWxsb2NfY3B1KG5ldywgY3B1KTsKKwkJZGVzY19uZXcgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKG5ldywgbm9kZSk7CiAJCWlmICghZGVzY19uZXcpIHsKIAkJCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjIGZvciAlZFxuIiwgbmV3KTsKIAkJCWNvbnRpbnVlOwpAQCAtMzI0Myw2ICszMTk1LDkgQEAKIAogCQlpZiAoY2ZnX25ldy0+dmVjdG9yICE9IDApCiAJCQljb250aW51ZTsKKworCQlkZXNjX25ldyA9IG1vdmVfaXJxX2Rlc2MoZGVzY19uZXcsIG5vZGUpOworCiAJCWlmIChfX2Fzc2lnbl9pcnFfdmVjdG9yKG5ldywgY2ZnX25ldywgYXBpYy0+dGFyZ2V0X2NwdXMoKSkgPT0gMCkKIAkJCWlycSA9IG5ldzsKIAkJYnJlYWs7CkBAIC0zMjYwLDExICszMjE1LDEyIEBACiAKIGludCBjcmVhdGVfaXJxKHZvaWQpCiB7CisJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShib290X2NwdV9pZCk7CiAJdW5zaWduZWQgaW50IGlycV93YW50OwogCWludCBpcnE7CiAKIAlpcnFfd2FudCA9IG5yX2lycXNfZ3NpOwotCWlycSA9IGNyZWF0ZV9pcnFfbnIoaXJxX3dhbnQpOworCWlycSA9IGNyZWF0ZV9pcnFfbnIoaXJxX3dhbnQsIG5vZGUpOwogCiAJaWYgKGlycSA9PSAwKQogCQlpcnEgPSAtMTsKQEAgLTMzNjYsNyArMzMyMiw3IEBACiB9CiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBzZXRfbXNpX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3N0YXRpYyBpbnQgc2V0X21zaV9pcnFfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKIAlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOwpAQCAtMzM3NSw3ICszMzMxLDcgQEAKIAogCWRlc3QgPSBzZXRfZGVzY19hZmZpbml0eShkZXNjLCBtYXNrKTsKIAlpZiAoZGVzdCA9PSBCQURfQVBJQ0lEKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKIApAQCAtMzM4NywxMyArMzM0MywxNSBAQAogCW1zZy5hZGRyZXNzX2xvIHw9IE1TSV9BRERSX0RFU1RfSUQoZGVzdCk7CiAKIAl3cml0ZV9tc2lfbXNnX2Rlc2MoZGVzYywgJm1zZyk7CisKKwlyZXR1cm4gMDsKIH0KICNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAogLyoKICAqIE1pZ3JhdGUgdGhlIE1TSSBpcnEgdG8gYW5vdGhlciBjcHVtYXNrLiBUaGlzIG1pZ3JhdGlvbiBpcwogICogZG9uZSBpbiB0aGUgcHJvY2VzcyBjb250ZXh0IHVzaW5nIGludGVycnVwdC1yZW1hcHBpbmcgaGFyZHdhcmUuCiAgKi8KLXN0YXRpYyB2b2lkCitzdGF0aWMgaW50CiBpcl9zZXRfbXNpX2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwpAQCAtMzQwMiwxMSArMzM2MCwxMSBAQAogCXN0cnVjdCBpcnRlIGlydGU7CiAKIAlpZiAoZ2V0X2lydGUoaXJxLCAmaXJ0ZSkpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJZGVzdCA9IHNldF9kZXNjX2FmZmluaXR5KGRlc2MsIG1hc2spOwogCWlmIChkZXN0ID09IEJBRF9BUElDSUQpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJaXJ0ZS52ZWN0b3IgPSBjZmctPnZlY3RvcjsKIAlpcnRlLmRlc3RfaWQgPSBJUlRFX0RFU1QoZGVzdCk7CkBAIC0zNDIzLDYgKzMzODEsOCBAQAogCSAqLwogCWlmIChjZmctPm1vdmVfaW5fcHJvZ3Jlc3MpCiAJCXNlbmRfY2xlYW51cF92ZWN0b3IoY2ZnKTsKKworCXJldHVybiAwOwogfQogCiAjZW5kaWYKQEAgLTM1MTgsMTUgKzM0NzgsMTcgQEAKIAl1bnNpZ25lZCBpbnQgaXJxX3dhbnQ7CiAJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IE5VTEw7CiAJaW50IGluZGV4ID0gMDsKKwlpbnQgbm9kZTsKIAogCS8qIHg4NiBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgTVNJIHlldCAqLwogCWlmICh0eXBlID09IFBDSV9DQVBfSURfTVNJICYmIG52ZWMgPiAxKQogCQlyZXR1cm4gMTsKIAorCW5vZGUgPSBkZXZfdG9fbm9kZSgmZGV2LT5kZXYpOwogCWlycV93YW50ID0gbnJfaXJxc19nc2k7CiAJc3ViX2hhbmRsZSA9IDA7CiAJbGlzdF9mb3JfZWFjaF9lbnRyeShtc2lkZXNjLCAmZGV2LT5tc2lfbGlzdCwgbGlzdCkgewotCQlpcnEgPSBjcmVhdGVfaXJxX25yKGlycV93YW50KTsKKwkJaXJxID0gY3JlYXRlX2lycV9ucihpcnFfd2FudCwgbm9kZSk7CiAJCWlmIChpcnEgPT0gMCkKIAkJCXJldHVybiAtMTsKIAkJaXJxX3dhbnQgPSBpcnEgKyAxOwpAQCAtMzU3Niw3ICszNTM4LDcgQEAKIAogI2lmIGRlZmluZWQgKENPTkZJR19ETUFSKSB8fCBkZWZpbmVkIChDT05GSUdfSU5UUl9SRU1BUCkKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBkbWFyX21zaV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCitzdGF0aWMgaW50IGRtYXJfbXNpX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CkBAIC0zNTg1LDcgKzM1NDcsNyBAQAogCiAJZGVzdCA9IHNldF9kZXNjX2FmZmluaXR5KGRlc2MsIG1hc2spOwogCWlmIChkZXN0ID09IEJBRF9BUElDSUQpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwogCkBAIC0zNTk3LDYgKzM1NTksOCBAQAogCW1zZy5hZGRyZXNzX2xvIHw9IE1TSV9BRERSX0RFU1RfSUQoZGVzdCk7CiAKIAlkbWFyX21zaV93cml0ZShpcnEsICZtc2cpOworCisJcmV0dXJuIDA7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCkBAIC0zNjMwLDcgKzM1OTQsNyBAQAogI2lmZGVmIENPTkZJR19IUEVUX1RJTUVSCiAKICNpZmRlZiBDT05GSUdfU01QCi1zdGF0aWMgdm9pZCBocGV0X21zaV9zZXRfYWZmaW5pdHkodW5zaWduZWQgaW50IGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2spCitzdGF0aWMgaW50IGhwZXRfbXNpX3NldF9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CkBAIC0zNjM5LDcgKzM2MDMsNyBAQAogCiAJZGVzdCA9IHNldF9kZXNjX2FmZmluaXR5KGRlc2MsIG1hc2spOwogCWlmIChkZXN0ID09IEJBRF9BUElDSUQpCi0JCXJldHVybjsKKwkJcmV0dXJuIC0xOwogCiAJY2ZnID0gZGVzYy0+Y2hpcF9kYXRhOwogCkBAIC0zNjUxLDYgKzM2MTUsOCBAQAogCW1zZy5hZGRyZXNzX2xvIHw9IE1TSV9BRERSX0RFU1RfSUQoZGVzdCk7CiAKIAlocGV0X21zaV93cml0ZShpcnEsICZtc2cpOworCisJcmV0dXJuIDA7CiB9CiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCkBAIC0zNzA3LDcgKzM2NzMsNyBAQAogCXdyaXRlX2h0X2lycV9tc2coaXJxLCAmbXNnKTsKIH0KIAotc3RhdGljIHZvaWQgc2V0X2h0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKK3N0YXRpYyBpbnQgc2V0X2h0X2lycV9hZmZpbml0eSh1bnNpZ25lZCBpbnQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzaykKIHsKIAlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpcnEpOwogCXN0cnVjdCBpcnFfY2ZnICpjZmc7CkBAIC0zNzE1LDExICszNjgxLDEzIEBACiAKIAlkZXN0ID0gc2V0X2Rlc2NfYWZmaW5pdHkoZGVzYywgbWFzayk7CiAJaWYgKGRlc3QgPT0gQkFEX0FQSUNJRCkKLQkJcmV0dXJuOworCQlyZXR1cm4gLTE7CiAKIAljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CiAKIAl0YXJnZXRfaHRfaXJxKGlycSwgZGVzdCwgY2ZnLT52ZWN0b3IpOworCisJcmV0dXJuIDA7CiB9CiAKICNlbmRpZgpAQCAtMzc5NCw2ICszNzYyLDggQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBlcnI7CiAKKwlCVUlMRF9CVUdfT04oc2l6ZW9mKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5KSAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpOworCiAJY2ZnID0gaXJxX2NmZyhpcnEpOwogCiAJZXJyID0gYXNzaWduX2lycV92ZWN0b3IoaXJxLCBjZmcsIGVsaWdpYmxlX2NwdSk7CkBAIC0zODA3LDE1ICszNzc3LDEzIEBACiAKIAltbXJfdmFsdWUgPSAwOwogCWVudHJ5ID0gKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5ICopJm1tcl92YWx1ZTsKLQlCVUdfT04oc2l6ZW9mKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5KSAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCi0JZW50cnktPnZlY3RvciA9IGNmZy0+dmVjdG9yOwotCWVudHJ5LT5kZWxpdmVyeV9tb2RlID0gYXBpYy0+aXJxX2RlbGl2ZXJ5X21vZGU7Ci0JZW50cnktPmRlc3RfbW9kZSA9IGFwaWMtPmlycV9kZXN0X21vZGU7Ci0JZW50cnktPnBvbGFyaXR5ID0gMDsKLQllbnRyeS0+dHJpZ2dlciA9IDA7Ci0JZW50cnktPm1hc2sgPSAwOwotCWVudHJ5LT5kZXN0ID0gYXBpYy0+Y3B1X21hc2tfdG9fYXBpY2lkKGVsaWdpYmxlX2NwdSk7CisJZW50cnktPnZlY3RvcgkJPSBjZmctPnZlY3RvcjsKKwllbnRyeS0+ZGVsaXZlcnlfbW9kZQk9IGFwaWMtPmlycV9kZWxpdmVyeV9tb2RlOworCWVudHJ5LT5kZXN0X21vZGUJPSBhcGljLT5pcnFfZGVzdF9tb2RlOworCWVudHJ5LT5wb2xhcml0eQkJPSAwOworCWVudHJ5LT50cmlnZ2VyCQk9IDA7CisJZW50cnktPm1hc2sJCT0gMDsKKwllbnRyeS0+ZGVzdAkJPSBhcGljLT5jcHVfbWFza190b19hcGljaWQoZWxpZ2libGVfY3B1KTsKIAogCW1tcl9wbm9kZSA9IHV2X2JsYWRlX3RvX3Bub2RlKG1tcl9ibGFkZSk7CiAJdXZfd3JpdGVfZ2xvYmFsX21tcjY0KG1tcl9wbm9kZSwgbW1yX29mZnNldCwgbW1yX3ZhbHVlKTsKQEAgLTM4MzMsMTAgKzM4MDEsMTAgQEAKIAlzdHJ1Y3QgdXZfSU9fQVBJQ19yb3V0ZV9lbnRyeSAqZW50cnk7CiAJaW50IG1tcl9wbm9kZTsKIAorCUJVSUxEX0JVR19PTihzaXplb2Yoc3RydWN0IHV2X0lPX0FQSUNfcm91dGVfZW50cnkpICE9IHNpemVvZih1bnNpZ25lZCBsb25nKSk7CisKIAltbXJfdmFsdWUgPSAwOwogCWVudHJ5ID0gKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5ICopJm1tcl92YWx1ZTsKLQlCVUdfT04oc2l6ZW9mKHN0cnVjdCB1dl9JT19BUElDX3JvdXRlX2VudHJ5KSAhPSBzaXplb2YodW5zaWduZWQgbG9uZykpOwotCiAJZW50cnktPm1hc2sgPSAxOwogCiAJbW1yX3Bub2RlID0gdXZfYmxhZGVfdG9fcG5vZGUobW1yX2JsYWRlKTsKQEAgLTM5MDAsNiArMzg2OCw3MSBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyBpbnQgX19pb19hcGljX3NldF9wY2lfcm91dGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpcnEsCisJCQkJc3RydWN0IGlvX2FwaWNfaXJxX2F0dHIgKmlycV9hdHRyKQoreworCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKKwlzdHJ1Y3QgaXJxX2NmZyAqY2ZnOworCWludCBub2RlOworCWludCBpb2FwaWMsIHBpbjsKKwlpbnQgdHJpZ2dlciwgcG9sYXJpdHk7CisKKwlpb2FwaWMgPSBpcnFfYXR0ci0+aW9hcGljOworCWlmICghSU9fQVBJQ19JUlEoaXJxKSkgeworCQlhcGljX3ByaW50ayhBUElDX1FVSUVULEtFUk5fRVJSICJJT0FQSUNbJWRdOiBJbnZhbGlkIHJlZmVyZW5jZSB0byBJUlEgMFxuIiwKKwkJCWlvYXBpYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChkZXYpCisJCW5vZGUgPSBkZXZfdG9fbm9kZShkZXYpOworCWVsc2UKKwkJbm9kZSA9IGNwdV90b19ub2RlKGJvb3RfY3B1X2lkKTsKKworCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKGlycSwgbm9kZSk7CisJaWYgKCFkZXNjKSB7CisJCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjICVkXG4iLCBpcnEpOworCQlyZXR1cm4gMDsKKwl9CisKKwlwaW4gPSBpcnFfYXR0ci0+aW9hcGljX3BpbjsKKwl0cmlnZ2VyID0gaXJxX2F0dHItPnRyaWdnZXI7CisJcG9sYXJpdHkgPSBpcnFfYXR0ci0+cG9sYXJpdHk7CisKKwkvKgorCSAqIElSUXMgPCAxNiBhcmUgYWxyZWFkeSBpbiB0aGUgaXJxXzJfcGluW10gbWFwCisJICovCisJaWYgKGlycSA+PSBOUl9JUlFTX0xFR0FDWSkgeworCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7CisJCWFkZF9waW5fdG9faXJxX25vZGUoY2ZnLCBub2RlLCBpb2FwaWMsIHBpbik7CisJfQorCisJc2V0dXBfSU9fQVBJQ19pcnEoaW9hcGljLCBwaW4sIGlycSwgZGVzYywgdHJpZ2dlciwgcG9sYXJpdHkpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBpb19hcGljX3NldF9wY2lfcm91dGluZyhzdHJ1Y3QgZGV2aWNlICpkZXYsIGludCBpcnEsCisJCQkJc3RydWN0IGlvX2FwaWNfaXJxX2F0dHIgKmlycV9hdHRyKQoreworCWludCBpb2FwaWMsIHBpbjsKKwkvKgorCSAqIEF2b2lkIHBpbiByZXByb2dyYW1taW5nLiAgUFJUcyB0eXBpY2FsbHkgaW5jbHVkZSBlbnRyaWVzCisJICogd2l0aCByZWR1bmRhbnQgcGluLT5nc2kgbWFwcGluZ3MgKGJ1dCB1bmlxdWUgUENJIGRldmljZXMpOworCSAqIHdlIG9ubHkgcHJvZ3JhbSB0aGUgSU9BUElDIG9uIHRoZSBmaXJzdC4KKwkgKi8KKwlpb2FwaWMgPSBpcnFfYXR0ci0+aW9hcGljOworCXBpbiA9IGlycV9hdHRyLT5pb2FwaWNfcGluOworCWlmICh0ZXN0X2JpdChwaW4sIG1wX2lvYXBpY19yb3V0aW5nW2lvYXBpY10ucGluX3Byb2dyYW1tZWQpKSB7CisJCXByX2RlYnVnKCJQaW4gJWQtJWQgYWxyZWFkeSBwcm9ncmFtbWVkXG4iLAorCQkJIG1wX2lvYXBpY3NbaW9hcGljXS5hcGljaWQsIHBpbik7CisJCXJldHVybiAwOworCX0KKwlzZXRfYml0KHBpbiwgbXBfaW9hcGljX3JvdXRpbmdbaW9hcGljXS5waW5fcHJvZ3JhbW1lZCk7CisKKwlyZXR1cm4gX19pb19hcGljX3NldF9wY2lfcm91dGluZyhkZXYsIGlycSwgaXJxX2F0dHIpOworfQorCiAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAgICAgICAgICAgICAgICBBQ1BJLWJhc2VkIElPQVBJQyBDb25maWd1cmF0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwpAQCAtMzk4MCw2ICs0MDEzLDcgQEAKIAogCXJldHVybiBhcGljX2lkOwogfQorI2VuZGlmCiAKIGludCBfX2luaXQgaW9fYXBpY19nZXRfdmVyc2lvbihpbnQgaW9hcGljKQogewpAQCAtMzk5MiwzOSArNDAyNiw2IEBACiAKIAlyZXR1cm4gcmVnXzAxLmJpdHMudmVyc2lvbjsKIH0KLSNlbmRpZgotCi1pbnQgaW9fYXBpY19zZXRfcGNpX3JvdXRpbmcgKGludCBpb2FwaWMsIGludCBwaW4sIGludCBpcnEsIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpCi17Ci0Jc3RydWN0IGlycV9kZXNjICpkZXNjOwotCXN0cnVjdCBpcnFfY2ZnICpjZmc7Ci0JaW50IGNwdSA9IGJvb3RfY3B1X2lkOwotCi0JaWYgKCFJT19BUElDX0lSUShpcnEpKSB7Ci0JCWFwaWNfcHJpbnRrKEFQSUNfUVVJRVQsS0VSTl9FUlIgIklPQVBJQ1slZF06IEludmFsaWQgcmVmZXJlbmNlIHRvIElSUSAwXG4iLAotCQkJaW9hcGljKTsKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX2NwdShpcnEsIGNwdSk7Ci0JaWYgKCFkZXNjKSB7Ci0JCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjICVkXG4iLCBpcnEpOwotCQlyZXR1cm4gMDsKLQl9Ci0KLQkvKgotCSAqIElSUXMgPCAxNiBhcmUgYWxyZWFkeSBpbiB0aGUgaXJxXzJfcGluW10gbWFwCi0JICovCi0JaWYgKGlycSA+PSBOUl9JUlFTX0xFR0FDWSkgewotCQljZmcgPSBkZXNjLT5jaGlwX2RhdGE7Ci0JCWFkZF9waW5fdG9faXJxX2NwdShjZmcsIGNwdSwgaW9hcGljLCBwaW4pOwotCX0KLQotCXNldHVwX0lPX0FQSUNfaXJxKGlvYXBpYywgcGluLCBpcnEsIGRlc2MsIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKLQotCXJldHVybiAwOwotfQotCiAKIGludCBhY3BpX2dldF9vdmVycmlkZV9pcnEoaW50IGJ1c19pcnEsIGludCAqdHJpZ2dlciwgaW50ICpwb2xhcml0eSkKIHsKQEAgLTQwNTUsNTEgKzQwNTYsNDQgQEAKICNpZmRlZiBDT05GSUdfU01QCiB2b2lkIF9faW5pdCBzZXR1cF9pb2FwaWNfZGVzdCh2b2lkKQogewotCWludCBwaW4sIGlvYXBpYywgaXJxLCBpcnFfZW50cnk7CisJaW50IHBpbiwgaW9hcGljID0gMCwgaXJxLCBpcnFfZW50cnk7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwotCXN0cnVjdCBpcnFfY2ZnICpjZmc7CiAJY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2s7CiAKIAlpZiAoc2tpcF9pb2FwaWNfc2V0dXAgPT0gMSkKIAkJcmV0dXJuOwogCi0JZm9yIChpb2FwaWMgPSAwOyBpb2FwaWMgPCBucl9pb2FwaWNzOyBpb2FwaWMrKykgewotCQlmb3IgKHBpbiA9IDA7IHBpbiA8IG5yX2lvYXBpY19yZWdpc3RlcnNbaW9hcGljXTsgcGluKyspIHsKLQkJCWlycV9lbnRyeSA9IGZpbmRfaXJxX2VudHJ5KGlvYXBpYywgcGluLCBtcF9JTlQpOwotCQkJaWYgKGlycV9lbnRyeSA9PSAtMSkKLQkJCQljb250aW51ZTsKLQkJCWlycSA9IHBpbl8yX2lycShpcnFfZW50cnksIGlvYXBpYywgcGluKTsKLQotCQkJLyogc2V0dXBfSU9fQVBJQ19pcnFzIGNvdWxkIGZhaWwgdG8gZ2V0IHZlY3RvciBmb3Igc29tZSBkZXZpY2UKLQkJCSAqIHdoZW4geW91IGhhdmUgdG9vIG1hbnkgZGV2aWNlcywgYmVjYXVzZSBhdCB0aGF0IHRpbWUgb25seSBib290Ci0JCQkgKiBjcHUgaXMgb25saW5lLgotCQkJICovCi0JCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKLQkJCWNmZyA9IGRlc2MtPmNoaXBfZGF0YTsKLQkJCWlmICghY2ZnLT52ZWN0b3IpIHsKLQkJCQlzZXR1cF9JT19BUElDX2lycShpb2FwaWMsIHBpbiwgaXJxLCBkZXNjLAotCQkJCQkJICBpcnFfdHJpZ2dlcihpcnFfZW50cnkpLAotCQkJCQkJICBpcnFfcG9sYXJpdHkoaXJxX2VudHJ5KSk7Ci0JCQkJY29udGludWU7Ci0KLQkJCX0KLQotCQkJLyoKLQkJCSAqIEhvbm91ciBhZmZpbml0aWVzIHdoaWNoIGhhdmUgYmVlbiBzZXQgaW4gZWFybHkgYm9vdAotCQkJICovCi0JCQlpZiAoZGVzYy0+c3RhdHVzICYKLQkJCSAgICAoSVJRX05PX0JBTEFOQ0lORyB8IElSUV9BRkZJTklUWV9TRVQpKQotCQkJCW1hc2sgPSBkZXNjLT5hZmZpbml0eTsKLQkJCWVsc2UKLQkJCQltYXNrID0gYXBpYy0+dGFyZ2V0X2NwdXMoKTsKLQotCQkJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpCi0JCQkJc2V0X2lyX2lvYXBpY19hZmZpbml0eV9pcnFfZGVzYyhkZXNjLCBtYXNrKTsKLQkJCWVsc2UKLQkJCQlzZXRfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOwotCQl9Ci0KKyNpZmRlZiBDT05GSUdfQUNQSQorCWlmICghYWNwaV9kaXNhYmxlZCAmJiBhY3BpX2lvYXBpYykgeworCQlpb2FwaWMgPSBtcF9maW5kX2lvYXBpYygwKTsKKwkJaWYgKGlvYXBpYyA8IDApCisJCQlpb2FwaWMgPSAwOwogCX0KKyNlbmRpZgorCisJZm9yIChwaW4gPSAwOyBwaW4gPCBucl9pb2FwaWNfcmVnaXN0ZXJzW2lvYXBpY107IHBpbisrKSB7CisJCWlycV9lbnRyeSA9IGZpbmRfaXJxX2VudHJ5KGlvYXBpYywgcGluLCBtcF9JTlQpOworCQlpZiAoaXJxX2VudHJ5ID09IC0xKQorCQkJY29udGludWU7CisJCWlycSA9IHBpbl8yX2lycShpcnFfZW50cnksIGlvYXBpYywgcGluKTsKKworCQlkZXNjID0gaXJxX3RvX2Rlc2MoaXJxKTsKKworCQkvKgorCQkgKiBIb25vdXIgYWZmaW5pdGllcyB3aGljaCBoYXZlIGJlZW4gc2V0IGluIGVhcmx5IGJvb3QKKwkJICovCisJCWlmIChkZXNjLT5zdGF0dXMgJgorCQkgICAgKElSUV9OT19CQUxBTkNJTkcgfCBJUlFfQUZGSU5JVFlfU0VUKSkKKwkJCW1hc2sgPSBkZXNjLT5hZmZpbml0eTsKKwkJZWxzZQorCQkJbWFzayA9IGFwaWMtPnRhcmdldF9jcHVzKCk7CisKKwkJaWYgKGludHJfcmVtYXBwaW5nX2VuYWJsZWQpCisJCQlzZXRfaXJfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOworCQllbHNlCisJCQlzZXRfaW9hcGljX2FmZmluaXR5X2lycV9kZXNjKGRlc2MsIG1hc2spOworCX0KKwogfQogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL25taS5jIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMKaW5kZXggY2U0ZmJmYS4uYTY5MTMwMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvbm1pLmMKQEAgLTEwNCw3ICsxMDQsNyBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIHJlcG9ydF9icm9rZW5fbm1pKGludCBjcHUsIGludCAqcHJldl9ubWlfY291bnQpCitzdGF0aWMgdm9pZCByZXBvcnRfYnJva2VuX25taShpbnQgY3B1LCB1bnNpZ25lZCBpbnQgKnByZXZfbm1pX2NvdW50KQogewogCXByaW50ayhLRVJOX0NPTlQgIlxuIik7CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV8zMi5jCmluZGV4IDAxZWRhMmEuLjQ0MGE4YmMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzMyLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfMzIuYwpAQCAtMTYwLDcgKzE2MCw2IEBACiBleHRlcm4gc3RydWN0IGFwaWMgYXBpY19iaWdzbXA7CiBleHRlcm4gc3RydWN0IGFwaWMgYXBpY19lczcwMDA7CiBleHRlcm4gc3RydWN0IGFwaWMgYXBpY19lczcwMDBfY2x1c3RlcjsKLWV4dGVybiBzdHJ1Y3QgYXBpYyBhcGljX2RlZmF1bHQ7CiAKIHN0cnVjdCBhcGljICphcGljID0gJmFwaWNfZGVmYXVsdDsKIEVYUE9SVF9TWU1CT0xfR1BMKGFwaWMpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3Byb2JlXzY0LmMKaW5kZXggMTc4MzY1Mi4uYmMzZTg4MCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMvcHJvYmVfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9wcm9iZV82NC5jCkBAIC01MCw3ICs1MCw3IEBACiB2b2lkIF9faW5pdCBkZWZhdWx0X3NldHVwX2FwaWNfcm91dGluZyh2b2lkKQogewogI2lmZGVmIENPTkZJR19YODZfWDJBUElDCi0JaWYgKHgyYXBpYyAmJiAoYXBpYyAhPSAmYXBpY194MmFwaWNfcGh5cyAmJgorCWlmICh4MmFwaWNfbW9kZSAmJiAoYXBpYyAhPSAmYXBpY194MmFwaWNfcGh5cyAmJgogI2lmZGVmIENPTkZJR19YODZfVVYKIAkJICAgICAgIGFwaWMgIT0gJmFwaWNfeDJhcGljX3V2X3ggJiYKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMvc3VtbWl0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYwppbmRleCA5Y2ZlMWY0Li4zNDRlZWU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy9zdW1taXRfMzIuYwpAQCAtMTczLDEzICsxNzMsNiBAQAogCQlyaW8tPnR5cGUgPT0gTG9va091dEFXUEVHIHx8IHJpby0+dHlwZSA9PSBMb29rT3V0QldQRUcpOwogfQogCi0KLS8qIEluIGNsdXN0ZXJlZCBtb2RlLCB0aGUgaGlnaCBuaWJibGUgb2YgQVBJQyBJRCBpcyBhIGNsdXN0ZXIgbnVtYmVyLgotICogVGhlIGxvdyBuaWJibGUgaXMgYSA0LWJpdCBiaXRtYXAuICovCi0jZGVmaW5lIFhBUElDX0RFU1RfQ1BVU19TSElGVAk0Ci0jZGVmaW5lIFhBUElDX0RFU1RfQ1BVU19NQVNLCSgoMXUgPDwgWEFQSUNfREVTVF9DUFVTX1NISUZUKSAtIDEpCi0jZGVmaW5lIFhBUElDX0RFU1RfQ0xVU1RFUl9NQVNLCShYQVBJQ19ERVNUX0NQVVNfTUFTSyA8PCBYQVBJQ19ERVNUX0NQVVNfU0hJRlQpCi0KICNkZWZpbmUgU1VNTUlUX0FQSUNfREZSX1ZBTFVFCShBUElDX0RGUl9DTFVTVEVSKQogCiBzdGF0aWMgY29uc3Qgc3RydWN0IGNwdW1hc2sgKnN1bW1pdF90YXJnZXRfY3B1cyh2b2lkKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYyBiL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY19jbHVzdGVyLmMKaW5kZXggNGE5MDNlMi4uOGU0Y2JiMiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX2NsdXN0ZXIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfY2x1c3Rlci5jCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaXBpLmg+CiAKLURFRklORV9QRVJfQ1BVKHUzMiwgeDg2X2NwdV90b19sb2dpY2FsX2FwaWNpZCk7CitzdGF0aWMgREVGSU5FX1BFUl9DUFUodTMyLCB4ODZfY3B1X3RvX2xvZ2ljYWxfYXBpY2lkKTsKIAogc3RhdGljIGludCB4MmFwaWNfYWNwaV9tYWR0X29lbV9jaGVjayhjaGFyICpvZW1faWQsIGNoYXIgKm9lbV90YWJsZV9pZCkKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXBpYy94MmFwaWNfdXZfeC5jCmluZGV4IDJiZGE2OTMuLmVmMGFlMjAgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9hcGljL3gyYXBpY191dl94LmMKKysrIGIvYXJjaC94ODYva2VybmVsL2FwaWMveDJhcGljX3V2X3guYwpAQCAtMTA1LDcgKzEwNSw3IEBACiAJY3B1bWFza19zZXRfY3B1KGNwdSwgcmV0bWFzayk7CiB9CiAKLXN0YXRpYyBpbnQgdXZfd2FrZXVwX3NlY29uZGFyeShpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcmlwKQorc3RhdGljIGludCBfX2NwdWluaXQgdXZfd2FrZXVwX3NlY29uZGFyeShpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcmlwKQogewogI2lmZGVmIENPTkZJR19TTVAKIAl1bnNpZ25lZCBsb25nIHZhbDsKQEAgLTU2Miw3ICs1NjIsNyBAQAogCXVuaW9uIHV2aF9ub2RlX2lkX3Ugbm9kZV9pZDsKIAl1bnNpZ25lZCBsb25nIGdub2RlX3VwcGVyLCBsb3dtZW1fcmVkaXJfYmFzZSwgbG93bWVtX3JlZGlyX3NpemU7CiAJaW50IGJ5dGVzLCBuaWQsIGNwdSwgbGNwdSwgcG5vZGUsIGJsYWRlLCBpLCBqLCBtX3ZhbCwgbl92YWw7Ci0JaW50IG1heF9wbm9kZSA9IDA7CisJaW50IGdub2RlX2V4dHJhLCBtYXhfcG5vZGUgPSAwOwogCXVuc2lnbmVkIGxvbmcgbW1yX2Jhc2UsIHByZXNlbnQsIHBhZGRyOwogCXVuc2lnbmVkIHNob3J0IHBub2RlX21hc2s7CiAKQEAgLTU3NCw2ICs1NzQsMTMgQEAKIAltbXJfYmFzZSA9CiAJICAgIHV2X3JlYWRfbG9jYWxfbW1yKFVWSF9SSF9HQU1fTU1SX09WRVJMQVlfQ09ORklHX01NUikgJgogCSAgICB+VVZfTU1SX0VOQUJMRTsKKwlwbm9kZV9tYXNrID0gKDEgPDwgbl92YWwpIC0gMTsKKwlub2RlX2lkLnYgPSB1dl9yZWFkX2xvY2FsX21tcihVVkhfTk9ERV9JRCk7CisJZ25vZGVfZXh0cmEgPSAobm9kZV9pZC5zLm5vZGVfaWQgJiB+KCgxIDw8IG5fdmFsKSAtIDEpKSA+PiAxOworCWdub2RlX3VwcGVyID0gKCh1bnNpZ25lZCBsb25nKWdub2RlX2V4dHJhICA8PCBtX3ZhbCk7CisJcHJpbnRrKEtFUk5fREVCVUcgIlVWOiBOICVkLCBNICVkLCBnbm9kZV91cHBlciAweCVseCwgZ25vZGVfZXh0cmEgMHgleFxuIiwKKwkJCW5fdmFsLCBtX3ZhbCwgZ25vZGVfdXBwZXIsIGdub2RlX2V4dHJhKTsKKwogCXByaW50ayhLRVJOX0RFQlVHICJVVjogZ2xvYmFsIE1NUiBiYXNlIDB4JWx4XG4iLCBtbXJfYmFzZSk7CiAKIAlmb3IoaSA9IDA7IGkgPCBVVkhfTk9ERV9QUkVTRU5UX1RBQkxFX0RFUFRIOyBpKyspCkBAIC01ODMsMTUgKzU5MCwxOCBAQAogCiAJYnl0ZXMgPSBzaXplb2Yoc3RydWN0IHV2X2JsYWRlX2luZm8pICogdXZfbnVtX3Bvc3NpYmxlX2JsYWRlcygpOwogCXV2X2JsYWRlX2luZm8gPSBrbWFsbG9jKGJ5dGVzLCBHRlBfS0VSTkVMKTsKKwlCVUdfT04oIXV2X2JsYWRlX2luZm8pOwogCiAJZ2V0X2xvd21lbV9yZWRpcmVjdCgmbG93bWVtX3JlZGlyX2Jhc2UsICZsb3dtZW1fcmVkaXJfc2l6ZSk7CiAKIAlieXRlcyA9IHNpemVvZih1dl9ub2RlX3RvX2JsYWRlWzBdKSAqIG51bV9wb3NzaWJsZV9ub2RlcygpOwogCXV2X25vZGVfdG9fYmxhZGUgPSBrbWFsbG9jKGJ5dGVzLCBHRlBfS0VSTkVMKTsKKwlCVUdfT04oIXV2X25vZGVfdG9fYmxhZGUpOwogCW1lbXNldCh1dl9ub2RlX3RvX2JsYWRlLCAyNTUsIGJ5dGVzKTsKIAogCWJ5dGVzID0gc2l6ZW9mKHV2X2NwdV90b19ibGFkZVswXSkgKiBudW1fcG9zc2libGVfY3B1cygpOwogCXV2X2NwdV90b19ibGFkZSA9IGttYWxsb2MoYnl0ZXMsIEdGUF9LRVJORUwpOworCUJVR19PTighdXZfY3B1X3RvX2JsYWRlKTsKIAltZW1zZXQodXZfY3B1X3RvX2JsYWRlLCAyNTUsIGJ5dGVzKTsKIAogCWJsYWRlID0gMDsKQEAgLTYwNywxMSArNjE3LDYgQEAKIAkJfQogCX0KIAotCXBub2RlX21hc2sgPSAoMSA8PCBuX3ZhbCkgLSAxOwotCW5vZGVfaWQudiA9IHV2X3JlYWRfbG9jYWxfbW1yKFVWSF9OT0RFX0lEKTsKLQlnbm9kZV91cHBlciA9ICgoKHVuc2lnbmVkIGxvbmcpbm9kZV9pZC5zLm5vZGVfaWQpICYKLQkJICAgICAgIH4oKDEgPDwgbl92YWwpIC0gMSkpIDw8IG1fdmFsOwotCiAJdXZfYmlvc19pbml0KCk7CiAJdXZfYmlvc19nZXRfc25faW5mbygwLCAmdXZfdHlwZSwgJnNuX3BhcnRpdGlvbl9pZCwKIAkJCSAgICAmc25fY29oZXJlbmN5X2lkLCAmc25fcmVnaW9uX3NpemUpOwpAQCAtNjM0LDYgKzYzOSw3IEBACiAJCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5wbm9kZV9tYXNrID0gcG5vZGVfbWFzazsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmdwYV9tYXNrID0gKDEgPDwgKG1fdmFsICsgbl92YWwpKSAtIDE7CiAJCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5nbm9kZV91cHBlciA9IGdub2RlX3VwcGVyOworCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+Z25vZGVfZXh0cmEgPSBnbm9kZV9leHRyYTsKIAkJdXZfY3B1X2h1Yl9pbmZvKGNwdSktPmdsb2JhbF9tbXJfYmFzZSA9IG1tcl9iYXNlOwogCQl1dl9jcHVfaHViX2luZm8oY3B1KS0+Y29oZXJlbmN5X2RvbWFpbl9udW1iZXIgPSBzbl9jb2hlcmVuY3lfaWQ7CiAJCXV2X2NwdV9odWJfaW5mbyhjcHUpLT5zY2lyLm9mZnNldCA9IFNDSVJfTE9DQUxfTU1SX0JBU0UgKyBsY3B1OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYwppbmRleCA1YTZhYTFjLi4xYTgzMGNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfMzIuYwpAQCAtMTQ2LDQgKzE0Niw1IEBACiAJT0ZGU0VUKEJQX2xvYWRmbGFncywgYm9vdF9wYXJhbXMsIGhkci5sb2FkZmxhZ3MpOwogCU9GRlNFVChCUF9oYXJkd2FyZV9zdWJhcmNoLCBib290X3BhcmFtcywgaGRyLmhhcmR3YXJlX3N1YmFyY2gpOwogCU9GRlNFVChCUF92ZXJzaW9uLCBib290X3BhcmFtcywgaGRyLnZlcnNpb24pOworCU9GRlNFVChCUF9rZXJuZWxfYWxpZ25tZW50LCBib290X3BhcmFtcywgaGRyLmtlcm5lbF9hbGlnbm1lbnQpOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2FzbS1vZmZzZXRzXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwppbmRleCBlNzJmMDYyLi44OThlY2M0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvYXNtLW9mZnNldHNfNjQuYwpAQCAtMTI1LDYgKzEyNSw3IEBACiAJT0ZGU0VUKEJQX2xvYWRmbGFncywgYm9vdF9wYXJhbXMsIGhkci5sb2FkZmxhZ3MpOwogCU9GRlNFVChCUF9oYXJkd2FyZV9zdWJhcmNoLCBib290X3BhcmFtcywgaGRyLmhhcmR3YXJlX3N1YmFyY2gpOwogCU9GRlNFVChCUF92ZXJzaW9uLCBib290X3BhcmFtcywgaGRyLnZlcnNpb24pOworCU9GRlNFVChCUF9rZXJuZWxfYWxpZ25tZW50LCBib290X3BhcmFtcywgaGRyLmtlcm5lbF9hbGlnbm1lbnQpOwogCiAJQkxBTksoKTsKIAlERUZJTkUoUEFHRV9TSVpFX2FzbSwgUEFHRV9TSVpFKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L01ha2VmaWxlCmluZGV4IDRlMjQyZjkuLjNlZmNiMmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvTWFrZWZpbGUKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9NYWtlZmlsZQpAQCAtMSw1ICsxLDUgQEAKICMKLSMgTWFrZWZpbGUgZm9yIHg4Ni1jb21wYXRpYmxlIENQVSBkZXRhaWxzIGFuZCBxdWlya3MKKyMgTWFrZWZpbGUgZm9yIHg4Ni1jb21wYXRpYmxlIENQVSBkZXRhaWxzLCBmZWF0dXJlcyBhbmQgcXVpcmtzCiAjCiAKICMgRG9uJ3QgdHJhY2UgZWFybHkgc3RhZ2VzIG9mIGEgc2Vjb25kYXJ5IENQVSBib290CkBAIC0yMywxMSArMjMsMTMgQEAKIG9iai0kKENPTkZJR19DUFVfU1VQX1RSQU5TTUVUQV8zMikJKz0gdHJhbnNtZXRhLm8KIG9iai0kKENPTkZJR19DUFVfU1VQX1VNQ18zMikJCSs9IHVtYy5vCiAKLW9iai0kKENPTkZJR19YODZfTUNFKQkrPSBtY2hlY2svCi1vYmotJChDT05GSUdfTVRSUikJKz0gbXRyci8KLW9iai0kKENPTkZJR19DUFVfRlJFUSkJKz0gY3B1ZnJlcS8KK29iai0kKENPTkZJR19QRVJGX0NPVU5URVJTKQkJKz0gcGVyZl9jb3VudGVyLm8KIAotb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSArPSBwZXJmY3RyLXdhdGNoZG9nLm8KK29iai0kKENPTkZJR19YODZfTUNFKQkJCSs9IG1jaGVjay8KK29iai0kKENPTkZJR19NVFJSKQkJCSs9IG10cnIvCitvYmotJChDT05GSUdfQ1BVX0ZSRVEpCQkJKz0gY3B1ZnJlcS8KKworb2JqLSQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQkJKz0gcGVyZmN0ci13YXRjaGRvZy5vCiAKIHF1aWV0X2NtZF9ta2NhcGZsYWdzID0gTUtDQVAgICAkQAogICAgICAgY21kX21rY2FwZmxhZ3MgPSAkKFBFUkwpICQoc3JjdHJlZSkvJChzcmMpL21rY2FwZmxhZ3MucGwgJDwgJEAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2FtZC5jCmluZGV4IDdlNGE0NTkuLmU1YjI3ZDggMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvYW1kLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9hbWQuYwpAQCAtNiw2ICs2LDcgQEAKICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+CiAjaW5jbHVkZSA8YXNtL2FwaWMuaD4KICNpbmNsdWRlIDxhc20vY3B1Lmg+CisjaW5jbHVkZSA8YXNtL3BjaS1kaXJlY3QuaD4KIAogI2lmZGVmIENPTkZJR19YODZfNjQKICMgaW5jbHVkZSA8YXNtL251bWFfNjQuaD4KQEAgLTI3Miw3ICsyNzMsNyBAQAogI2lmIGRlZmluZWQoQ09ORklHX05VTUEpICYmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkKIAlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOwogCWludCBub2RlOwotCXVuc2lnbmVkIGFwaWNpZCA9IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpOworCXVuc2lnbmVkIGFwaWNpZCA9IGNwdV9oYXNfYXBpYyA/IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpIDogYy0+YXBpY2lkOwogCiAJbm9kZSA9IGMtPnBoeXNfcHJvY19pZDsKIAlpZiAoYXBpY2lkX3RvX25vZGVbYXBpY2lkXSAhPSBOVU1BX05PX05PREUpCkBAIC0zNTEsNiArMzUyLDE1IEBACiAJCSAgICAoYy0+eDg2X21vZGVsID09IDggJiYgYy0+eDg2X21hc2sgPj0gOCkpCiAJCQlzZXRfY3B1X2NhcChjLCBYODZfRkVBVFVSRV9LNl9NVFJSKTsKICNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKSAmJiBkZWZpbmVkKENPTkZJR19QQ0kpCisJLyogY2hlY2sgQ1BVIGNvbmZpZyBzcGFjZSBmb3IgZXh0ZW5kZWQgQVBJQyBJRCAqLworCWlmIChjLT54ODYgPj0gMHhmKSB7CisJCXVuc2lnbmVkIGludCB2YWw7CisJCXZhbCA9IHJlYWRfcGNpX2NvbmZpZygwLCAyNCwgMCwgMHg2OCk7CisJCWlmICgodmFsICYgKCgxIDw8IDE3KSB8ICgxIDw8IDE4KSkpID09ICgoMSA8PCAxNykgfCAoMSA8PCAxOCkpKQorCQkJc2V0X2NwdV9jYXAoYywgWDg2X0ZFQVRVUkVfRVhURF9BUElDSUQpOworCX0KKyNlbmRpZgogfQogCiBzdGF0aWMgdm9pZCBfX2NwdWluaXQgaW5pdF9hbWQoc3RydWN0IGNwdWluZm9feDg2ICpjKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY29tbW9uLmMKaW5kZXggNzc4NDhkOS4uM2ZmZGNmYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jb21tb24uYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NvbW1vbi5jCkBAIC0xMyw2ICsxMyw3IEBACiAjaW5jbHVkZSA8bGludXgvaW8uaD4KIAogI2luY2x1ZGUgPGFzbS9zdGFja3Byb3RlY3Rvci5oPgorI2luY2x1ZGUgPGFzbS9wZXJmX2NvdW50ZXIuaD4KICNpbmNsdWRlIDxhc20vbW11X2NvbnRleHQuaD4KICNpbmNsdWRlIDxhc20vaHlwZXJ2aXNvci5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTI5OSw3ICszMDAsOCBAQAogCXJldHVybiBOVUxMOwkJLyogTm90IGZvdW5kICovCiB9CiAKLV9fdTMyIGNsZWFyZWRfY3B1X2NhcHNbTkNBUElOVFNdIF9fY3B1aW5pdGRhdGE7CitfX3UzMiBjcHVfY2Fwc19jbGVhcmVkW05DQVBJTlRTXSBfX2NwdWluaXRkYXRhOworX191MzIgY3B1X2NhcHNfc2V0W05DQVBJTlRTXSBfX2NwdWluaXRkYXRhOwogCiB2b2lkIGxvYWRfcGVyY3B1X3NlZ21lbnQoaW50IGNwdSkKIHsKQEAgLTc2OCw2ICs3NzAsMTIgQEAKIAlpZiAodGhpc19jcHUtPmNfaWRlbnRpZnkpCiAJCXRoaXNfY3B1LT5jX2lkZW50aWZ5KGMpOwogCisJLyogQ2xlYXIvU2V0IGFsbCBmbGFncyBvdmVycmlkZW4gYnkgb3B0aW9ucywgYWZ0ZXIgcHJvYmUgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykgeworCQljLT54ODZfY2FwYWJpbGl0eVtpXSAmPSB+Y3B1X2NhcHNfY2xlYXJlZFtpXTsKKwkJYy0+eDg2X2NhcGFiaWxpdHlbaV0gfD0gY3B1X2NhcHNfc2V0W2ldOworCX0KKwogI2lmZGVmIENPTkZJR19YODZfNjQKIAljLT5hcGljaWQgPSBhcGljLT5waHlzX3BrZ19pZChjLT5pbml0aWFsX2FwaWNpZCwgMCk7CiAjZW5kaWYKQEAgLTgxMyw2ICs4MjEsMTYgQEAKICNlbmRpZgogCiAJaW5pdF9oeXBlcnZpc29yKGMpOworCisJLyoKKwkgKiBDbGVhci9TZXQgYWxsIGZsYWdzIG92ZXJyaWRlbiBieSBvcHRpb25zLCBuZWVkIGRvIGl0CisJICogYmVmb3JlIGZvbGxvd2luZyBzbXAgYWxsIGNwdXMgY2FwIEFORC4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkNBUElOVFM7IGkrKykgeworCQljLT54ODZfY2FwYWJpbGl0eVtpXSAmPSB+Y3B1X2NhcHNfY2xlYXJlZFtpXTsKKwkJYy0+eDg2X2NhcGFiaWxpdHlbaV0gfD0gY3B1X2NhcHNfc2V0W2ldOworCX0KKwogCS8qCiAJICogT24gU01QLCBib290X2NwdV9kYXRhIGhvbGRzIHRoZSBjb21tb24gZmVhdHVyZSBzZXQgYmV0d2VlbgogCSAqIGFsbCBDUFVzOyBzbyBtYWtlIHN1cmUgdGhhdCB3ZSBpbmRpY2F0ZSB3aGljaCBmZWF0dXJlcyBhcmUKQEAgLTgyNSwxMCArODQzLDYgQEAKIAkJCWJvb3RfY3B1X2RhdGEueDg2X2NhcGFiaWxpdHlbaV0gJj0gYy0+eDg2X2NhcGFiaWxpdHlbaV07CiAJfQogCi0JLyogQ2xlYXIgYWxsIGZsYWdzIG92ZXJyaWRlbiBieSBvcHRpb25zICovCi0JZm9yIChpID0gMDsgaSA8IE5DQVBJTlRTOyBpKyspCi0JCWMtPng4Nl9jYXBhYmlsaXR5W2ldICY9IH5jbGVhcmVkX2NwdV9jYXBzW2ldOwotCiAjaWZkZWYgQ09ORklHX1g4Nl9NQ0UKIAkvKiBJbml0IE1hY2hpbmUgQ2hlY2sgRXhjZXB0aW9uIGlmIGF2YWlsYWJsZS4gKi8KIAltY2hlY2tfaW5pdChjKTsKQEAgLTg2MSw2ICs4NzUsNyBAQAogI2Vsc2UKIAl2Z2V0Y3B1X3NldF9tb2RlKCk7CiAjZW5kaWYKKwlpbml0X2h3X3BlcmZfY291bnRlcnMoKTsKIH0KIAogdm9pZCBfX2NwdWluaXQgaWRlbnRpZnlfc2Vjb25kYXJ5X2NwdShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdV9kZWJ1Zy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVfZGVidWcuYwppbmRleCA0NmUyOWFiLi42YjJhNTJkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdV9kZWJ1Zy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1X2RlYnVnLmMKQEAgLTMyLDkgKzMyLDcgQEAKIAogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfY3B1WF9iYXNlLCBjcHVfYXJyW0NQVV9SRUdfQUxMX0JJVF0pOwogc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfcHJpdmF0ZSAqLCBwcml2X2FycltNQVhfQ1BVX0ZJTEVTXSk7Ci1zdGF0aWMgREVGSU5FX1BFUl9DUFUodW5zaWduZWQsIGNwdV9tb2RlbGZsYWcpOwogc3RhdGljIERFRklORV9QRVJfQ1BVKGludCwgY3B1X3ByaXZfY291bnQpOwotc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkLCBjcHVfbW9kZWwpOwogCiBzdGF0aWMgREVGSU5FX01VVEVYKGNwdV9kZWJ1Z19sb2NrKTsKIApAQCAtODAsMzAyICs3OCwxMDIgQEAKIAl7ICJ2YWx1ZSIsCUNQVV9SRUdfQUxMLAkxCX0sCiB9OwogCi0vKiBJbnRlbCBSZWdpc3RlcnMgUmFuZ2UgKi8KLXN0YXRpYyBzdHJ1Y3QgY3B1X2RlYnVnX3JhbmdlIGNwdV9pbnRlbF9yYW5nZVtdID0gewotCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgQ1BVX01DLAlDUFVfSU5URUxfQUxMCQl9LAotCXsgMHgwMDAwMDAwNiwgMHgwMDAwMDAwNywgQ1BVX01PTklUT1IsCUNQVV9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAwMTAsIDB4MDAwMDAwMTAsIENQVV9USU1FLAlDUFVfSU5URUxfQUxMCQl9LAotCXsgMHgwMDAwMDAxMSwgMHgwMDAwMDAxMywgQ1BVX1BNQywJQ1BVX0lOVEVMX1BFTlRJVU0JfSwKLQl7IDB4MDAwMDAwMTcsIDB4MDAwMDAwMTcsIENQVV9QTEFURk9STSwJQ1BVX1BYX0NYX0FUX1hFCQl9LAotCXsgMHgwMDAwMDAxQiwgMHgwMDAwMDAxQiwgQ1BVX0FQSUMsCUNQVV9QNl9DWF9BVF9YRQkJfSwKKy8qIENQVSBSZWdpc3RlcnMgUmFuZ2UgKi8KK3N0YXRpYyBzdHJ1Y3QgY3B1X2RlYnVnX3JhbmdlIGNwdV9yZWdfcmFuZ2VbXSA9IHsKKwl7IDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEsIENQVV9NQywJfSwKKwl7IDB4MDAwMDAwMDYsIDB4MDAwMDAwMDcsIENQVV9NT05JVE9SLAl9LAorCXsgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgQ1BVX1RJTUUsCX0sCisJeyAweDAwMDAwMDExLCAweDAwMDAwMDEzLCBDUFVfUE1DLAl9LAorCXsgMHgwMDAwMDAxNywgMHgwMDAwMDAxNywgQ1BVX1BMQVRGT1JNLAl9LAorCXsgMHgwMDAwMDAxQiwgMHgwMDAwMDAxQiwgQ1BVX0FQSUMsCX0sCisJeyAweDAwMDAwMDJBLCAweDAwMDAwMDJCLCBDUFVfUE9XRVJPTiwJfSwKKwl7IDB4MDAwMDAwMkMsIDB4MDAwMDAwMkMsIENQVV9GUkVRLAl9LAorCXsgMHgwMDAwMDAzQSwgMHgwMDAwMDAzQSwgQ1BVX0NPTlRST0wsCX0sCisJeyAweDAwMDAwMDQwLCAweDAwMDAwMDQ3LCBDUFVfTEJSQU5DSCwJfSwKKwl7IDB4MDAwMDAwNjAsIDB4MDAwMDAwNjcsIENQVV9MQlJBTkNILAl9LAorCXsgMHgwMDAwMDA3OSwgMHgwMDAwMDA3OSwgQ1BVX0JJT1MsCX0sCisJeyAweDAwMDAwMDg4LCAweDAwMDAwMDhBLCBDUFVfQ0FDSEUsCX0sCisJeyAweDAwMDAwMDhCLCAweDAwMDAwMDhCLCBDUFVfQklPUywJfSwKKwl7IDB4MDAwMDAwOUIsIDB4MDAwMDAwOUIsIENQVV9NT05JVE9SLAl9LAorCXsgMHgwMDAwMDBDMSwgMHgwMDAwMDBDNCwgQ1BVX1BNQywJfSwKKwl7IDB4MDAwMDAwQ0QsIDB4MDAwMDAwQ0QsIENQVV9GUkVRLAl9LAorCXsgMHgwMDAwMDBFNywgMHgwMDAwMDBFOCwgQ1BVX1BFUkYsCX0sCisJeyAweDAwMDAwMEZFLCAweDAwMDAwMEZFLCBDUFVfTVRSUiwJfSwKIAotCXsgMHgwMDAwMDAyQSwgMHgwMDAwMDAyQSwgQ1BVX1BPV0VST04sCUNQVV9QWF9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAwMkIsIDB4MDAwMDAwMkIsIENQVV9QT1dFUk9OLAlDUFVfSU5URUxfWEVPTgkJfSwKLQl7IDB4MDAwMDAwMkMsIDB4MDAwMDAwMkMsIENQVV9GUkVRLAlDUFVfSU5URUxfWEVPTgkJfSwKLQl7IDB4MDAwMDAwM0EsIDB4MDAwMDAwM0EsIENQVV9DT05UUk9MLAlDUFVfQ1hfQVRfWEUJCX0sCisJeyAweDAwMDAwMTE2LCAweDAwMDAwMTFFLCBDUFVfQ0FDSEUsCX0sCisJeyAweDAwMDAwMTc0LCAweDAwMDAwMTc2LCBDUFVfU1lTRU5URVIsCX0sCisJeyAweDAwMDAwMTc5LCAweDAwMDAwMTdCLCBDUFVfTUMsCX0sCisJeyAweDAwMDAwMTg2LCAweDAwMDAwMTg5LCBDUFVfUE1DLAl9LAorCXsgMHgwMDAwMDE5OCwgMHgwMDAwMDE5OSwgQ1BVX1BFUkYsCX0sCisJeyAweDAwMDAwMTlBLCAweDAwMDAwMTlBLCBDUFVfVElNRSwJfSwKKwl7IDB4MDAwMDAxOUIsIDB4MDAwMDAxOUQsIENQVV9USEVSTSwJfSwKKwl7IDB4MDAwMDAxQTAsIDB4MDAwMDAxQTAsIENQVV9NSVNDLAl9LAorCXsgMHgwMDAwMDFDOSwgMHgwMDAwMDFDOSwgQ1BVX0xCUkFOQ0gsCX0sCisJeyAweDAwMDAwMUQ3LCAweDAwMDAwMUQ4LCBDUFVfTEJSQU5DSCwJfSwKKwl7IDB4MDAwMDAxRDksIDB4MDAwMDAxRDksIENQVV9ERUJVRywJfSwKKwl7IDB4MDAwMDAxREEsIDB4MDAwMDAxRTAsIENQVV9MQlJBTkNILAl9LAogCi0JeyAweDAwMDAwMDQwLCAweDAwMDAwMDQzLCBDUFVfTEJSQU5DSCwJQ1BVX1BNX0NYX0FUX1hFCQl9LAotCXsgMHgwMDAwMDA0NCwgMHgwMDAwMDA0NywgQ1BVX0xCUkFOQ0gsCUNQVV9QTV9DT19BVAkJfSwKLQl7IDB4MDAwMDAwNjAsIDB4MDAwMDAwNjMsIENQVV9MQlJBTkNILAlDUFVfQzJfQVQJCX0sCi0JeyAweDAwMDAwMDY0LCAweDAwMDAwMDY3LCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX0FUT00JCX0sCisJeyAweDAwMDAwMjAwLCAweDAwMDAwMjBGLCBDUFVfTVRSUiwJfSwKKwl7IDB4MDAwMDAyNTAsIDB4MDAwMDAyNTAsIENQVV9NVFJSLAl9LAorCXsgMHgwMDAwMDI1OCwgMHgwMDAwMDI1OSwgQ1BVX01UUlIsCX0sCisJeyAweDAwMDAwMjY4LCAweDAwMDAwMjZGLCBDUFVfTVRSUiwJfSwKKwl7IDB4MDAwMDAyNzcsIDB4MDAwMDAyNzcsIENQVV9QQVQsCX0sCisJeyAweDAwMDAwMkZGLCAweDAwMDAwMkZGLCBDUFVfTVRSUiwJfSwKIAotCXsgMHgwMDAwMDA3OSwgMHgwMDAwMDA3OSwgQ1BVX0JJT1MsCUNQVV9QNl9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAwODgsIDB4MDAwMDAwOEEsIENQVV9DQUNIRSwJQ1BVX0lOVEVMX1A2CQl9LAotCXsgMHgwMDAwMDA4QiwgMHgwMDAwMDA4QiwgQ1BVX0JJT1MsCUNQVV9QNl9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAwOUIsIDB4MDAwMDAwOUIsIENQVV9NT05JVE9SLAlDUFVfSU5URUxfWEVPTgkJfSwKKwl7IDB4MDAwMDAzMDAsIDB4MDAwMDAzMTEsIENQVV9QTUMsCX0sCisJeyAweDAwMDAwMzQ1LCAweDAwMDAwMzQ1LCBDUFVfUE1DLAl9LAorCXsgMHgwMDAwMDM2MCwgMHgwMDAwMDM3MSwgQ1BVX1BNQywJfSwKKwl7IDB4MDAwMDAzOEQsIDB4MDAwMDAzOTAsIENQVV9QTUMsCX0sCisJeyAweDAwMDAwM0EwLCAweDAwMDAwM0JFLCBDUFVfUE1DLAl9LAorCXsgMHgwMDAwMDNDMCwgMHgwMDAwMDNDRCwgQ1BVX1BNQywJfSwKKwl7IDB4MDAwMDAzRTAsIDB4MDAwMDAzRTEsIENQVV9QTUMsCX0sCisJeyAweDAwMDAwM0YwLCAweDAwMDAwM0YyLCBDUFVfUE1DLAl9LAogCi0JeyAweDAwMDAwMEMxLCAweDAwMDAwMEMyLCBDUFVfUE1DLAlDUFVfUDZfQ1hfQVQJCX0sCi0JeyAweDAwMDAwMENELCAweDAwMDAwMENELCBDUFVfRlJFUSwJQ1BVX0NYX0FUCQl9LAotCXsgMHgwMDAwMDBFNywgMHgwMDAwMDBFOCwgQ1BVX1BFUkYsCUNQVV9DWF9BVAkJfSwKLQl7IDB4MDAwMDAwRkUsIDB4MDAwMDAwRkUsIENQVV9NVFJSLAlDUFVfUDZfQ1hfWEUJCX0sCisJeyAweDAwMDAwNDAwLCAweDAwMDAwNDE3LCBDUFVfTUMsCX0sCisJeyAweDAwMDAwNDgwLCAweDAwMDAwNDhCLCBDUFVfVk1YLAl9LAogCi0JeyAweDAwMDAwMTE2LCAweDAwMDAwMTE2LCBDUFVfQ0FDSEUsCUNQVV9JTlRFTF9QNgkJfSwKLQl7IDB4MDAwMDAxMTgsIDB4MDAwMDAxMTgsIENQVV9DQUNIRSwJQ1BVX0lOVEVMX1A2CQl9LAotCXsgMHgwMDAwMDExOSwgMHgwMDAwMDExOSwgQ1BVX0NBQ0hFLAlDUFVfSU5URUxfUFgJCX0sCi0JeyAweDAwMDAwMTFBLCAweDAwMDAwMTFCLCBDUFVfQ0FDSEUsCUNQVV9JTlRFTF9QNgkJfSwKLQl7IDB4MDAwMDAxMUUsIDB4MDAwMDAxMUUsIENQVV9DQUNIRSwJQ1BVX1BYX0NYX0FUCQl9LAorCXsgMHgwMDAwMDYwMCwgMHgwMDAwMDYwMCwgQ1BVX0RFQlVHLAl9LAorCXsgMHgwMDAwMDY4MCwgMHgwMDAwMDY4RiwgQ1BVX0xCUkFOQ0gsCX0sCisJeyAweDAwMDAwNkMwLCAweDAwMDAwNkNGLCBDUFVfTEJSQU5DSCwJfSwKIAotCXsgMHgwMDAwMDE3NCwgMHgwMDAwMDE3NiwgQ1BVX1NZU0VOVEVSLAlDUFVfUDZfQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwMTc5LCAweDAwMDAwMTdBLCBDUFVfTUMsCUNQVV9QWF9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAxN0IsIDB4MDAwMDAxN0IsIENQVV9NQywJQ1BVX1A2X1hFCQl9LAotCXsgMHgwMDAwMDE4NiwgMHgwMDAwMDE4NywgQ1BVX1BNQywJQ1BVX1A2X0NYX0FUCQl9LAotCXsgMHgwMDAwMDE5OCwgMHgwMDAwMDE5OSwgQ1BVX1BFUkYsCUNQVV9QTV9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAxOUEsIDB4MDAwMDAxOUEsIENQVV9USU1FLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwMTlCLCAweDAwMDAwMTlELCBDUFVfVEhFUk0sCUNQVV9QTV9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDAxQTAsIDB4MDAwMDAxQTAsIENQVV9NSVNDLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCisJeyAweDAwMDEwN0NDLCAweDAwMDEwN0QzLCBDUFVfUE1DLAl9LAogCi0JeyAweDAwMDAwMUM5LCAweDAwMDAwMUM5LCBDUFVfTEJSQU5DSCwJQ1BVX1BNX0NYX0FUCQl9LAotCXsgMHgwMDAwMDFENywgMHgwMDAwMDFEOCwgQ1BVX0xCUkFOQ0gsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDFEOSwgMHgwMDAwMDFEOSwgQ1BVX0RFQlVHLAlDUFVfQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwMURBLCAweDAwMDAwMURBLCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwMURCLCAweDAwMDAwMURCLCBDUFVfTEJSQU5DSCwJQ1BVX1A2X1hFCQl9LAotCXsgMHgwMDAwMDFEQywgMHgwMDAwMDFEQywgQ1BVX0xCUkFOQ0gsCUNQVV9JTlRFTF9QNgkJfSwKLQl7IDB4MDAwMDAxREQsIDB4MDAwMDAxREUsIENQVV9MQlJBTkNILAlDUFVfUFhfQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwMUUwLCAweDAwMDAwMUUwLCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX1A2CQl9LAorCXsgMHhDMDAwMDA4MCwgMHhDMDAwMDA4MCwgQ1BVX0ZFQVRVUkVTLAl9LAorCXsgMHhDMDAwMDA4MSwgMHhDMDAwMDA4NCwgQ1BVX0NBTEwsCX0sCisJeyAweEMwMDAwMTAwLCAweEMwMDAwMTAyLCBDUFVfQkFTRSwJfSwKKwl7IDB4QzAwMDAxMDMsIDB4QzAwMDAxMDMsIENQVV9USU1FLAl9LAogCi0JeyAweDAwMDAwMjAwLCAweDAwMDAwMjBGLCBDUFVfTVRSUiwJQ1BVX1A2X0NYX1hFCQl9LAotCXsgMHgwMDAwMDI1MCwgMHgwMDAwMDI1MCwgQ1BVX01UUlIsCUNQVV9QNl9DWF9YRQkJfSwKLQl7IDB4MDAwMDAyNTgsIDB4MDAwMDAyNTksIENQVV9NVFJSLAlDUFVfUDZfQ1hfWEUJCX0sCi0JeyAweDAwMDAwMjY4LCAweDAwMDAwMjZGLCBDUFVfTVRSUiwJQ1BVX1A2X0NYX1hFCQl9LAotCXsgMHgwMDAwMDI3NywgMHgwMDAwMDI3NywgQ1BVX1BBVCwJQ1BVX0MyX0FUX1hFCQl9LAotCXsgMHgwMDAwMDJGRiwgMHgwMDAwMDJGRiwgQ1BVX01UUlIsCUNQVV9QNl9DWF9YRQkJfSwKLQotCXsgMHgwMDAwMDMwMCwgMHgwMDAwMDMwOCwgQ1BVX1BNQywJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwMzA5LCAweDAwMDAwMzBCLCBDUFVfUE1DLAlDUFVfQzJfQVRfWEUJCX0sCi0JeyAweDAwMDAwMzBDLCAweDAwMDAwMzExLCBDUFVfUE1DLAlDUFVfSU5URUxfWEVPTgkJfSwKLQl7IDB4MDAwMDAzNDUsIDB4MDAwMDAzNDUsIENQVV9QTUMsCUNQVV9DMl9BVAkJfSwKLQl7IDB4MDAwMDAzNjAsIDB4MDAwMDAzNzEsIENQVV9QTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDM4RCwgMHgwMDAwMDM5MCwgQ1BVX1BNQywJQ1BVX0MyX0FUCQl9LAotCXsgMHgwMDAwMDNBMCwgMHgwMDAwMDNCRSwgQ1BVX1BNQywJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwM0MwLCAweDAwMDAwM0NELCBDUFVfUE1DLAlDUFVfSU5URUxfWEVPTgkJfSwKLQl7IDB4MDAwMDAzRTAsIDB4MDAwMDAzRTEsIENQVV9QTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDNGMCwgMHgwMDAwMDNGMCwgQ1BVX1BNQywJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwM0YxLCAweDAwMDAwM0YxLCBDUFVfUE1DLAlDUFVfQzJfQVRfWEUJCX0sCi0JeyAweDAwMDAwM0YyLCAweDAwMDAwM0YyLCBDUFVfUE1DLAlDUFVfSU5URUxfWEVPTgkJfSwKLQotCXsgMHgwMDAwMDQwMCwgMHgwMDAwMDQwMiwgQ1BVX01DLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNDAzLCAweDAwMDAwNDAzLCBDUFVfTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDQwNCwgMHgwMDAwMDQwNiwgQ1BVX01DLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNDA3LCAweDAwMDAwNDA3LCBDUFVfTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDQwOCwgMHgwMDAwMDQwQSwgQ1BVX01DLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNDBCLCAweDAwMDAwNDBCLCBDUFVfTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDQwQywgMHgwMDAwMDQwRSwgQ1BVX01DLAlDUFVfUE1fQ1hfWEUJCX0sCi0JeyAweDAwMDAwNDBGLCAweDAwMDAwNDBGLCBDUFVfTUMsCUNQVV9JTlRFTF9YRU9OCQl9LAotCXsgMHgwMDAwMDQxMCwgMHgwMDAwMDQxMiwgQ1BVX01DLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNDEzLCAweDAwMDAwNDE3LCBDUFVfTUMsCUNQVV9DWF9BVF9YRQkJfSwKLQl7IDB4MDAwMDA0ODAsIDB4MDAwMDA0OEIsIENQVV9WTVgsCUNQVV9DWF9BVF9YRQkJfSwKLQotCXsgMHgwMDAwMDYwMCwgMHgwMDAwMDYwMCwgQ1BVX0RFQlVHLAlDUFVfUE1fQ1hfQVRfWEUJCX0sCi0JeyAweDAwMDAwNjgwLCAweDAwMDAwNjhGLCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweDAwMDAwNkMwLCAweDAwMDAwNkNGLCBDUFVfTEJSQU5DSCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0KLQl7IDB4MDAwMTA3Q0MsIDB4MDAwMTA3RDMsIENQVV9QTUMsCUNQVV9JTlRFTF9YRU9OX01QCX0sCi0KLQl7IDB4QzAwMDAwODAsIDB4QzAwMDAwODAsIENQVV9GRUFUVVJFUywJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweEMwMDAwMDgxLCAweEMwMDAwMDgyLCBDUFVfQ0FMTCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweEMwMDAwMDg0LCAweEMwMDAwMDg0LCBDUFVfQ0FMTCwJQ1BVX0lOVEVMX1hFT04JCX0sCi0JeyAweEMwMDAwMTAwLCAweEMwMDAwMTAyLCBDUFVfQkFTRSwJQ1BVX0lOVEVMX1hFT04JCX0sCisJeyAweEMwMDEwMDAwLCAweEMwMDEwMDA3LCBDUFVfUE1DLAl9LAorCXsgMHhDMDAxMDAxMCwgMHhDMDAxMDAxMCwgQ1BVX0NPTkYsCX0sCisJeyAweEMwMDEwMDE1LCAweEMwMDEwMDE1LCBDUFVfQ09ORiwJfSwKKwl7IDB4QzAwMTAwMTYsIDB4QzAwMTAwMUEsIENQVV9NVFJSLAl9LAorCXsgMHhDMDAxMDAxRCwgMHhDMDAxMDAxRCwgQ1BVX01UUlIsCX0sCisJeyAweEMwMDEwMDFGLCAweEMwMDEwMDFGLCBDUFVfQ09ORiwJfSwKKwl7IDB4QzAwMTAwMzAsIDB4QzAwMTAwMzUsIENQVV9CSU9TLAl9LAorCXsgMHhDMDAxMDA0NCwgMHhDMDAxMDA0OCwgQ1BVX01DLAl9LAorCXsgMHhDMDAxMDA1MCwgMHhDMDAxMDA1NiwgQ1BVX1NNTSwJfSwKKwl7IDB4QzAwMTAwNTgsIDB4QzAwMTAwNTgsIENQVV9DT05GLAl9LAorCXsgMHhDMDAxMDA2MCwgMHhDMDAxMDA2MCwgQ1BVX0NBQ0hFLAl9LAorCXsgMHhDMDAxMDA2MSwgMHhDMDAxMDA2OCwgQ1BVX1NNTSwJfSwKKwl7IDB4QzAwMTAwNjksIDB4QzAwMTAwNkIsIENQVV9TTU0sCX0sCisJeyAweEMwMDEwMDcwLCAweEMwMDEwMDcxLCBDUFVfU01NLAl9LAorCXsgMHhDMDAxMDExMSwgMHhDMDAxMDExMywgQ1BVX1NNTSwJfSwKKwl7IDB4QzAwMTAxMTQsIDB4QzAwMTAxMTgsIENQVV9TVk0sCX0sCisJeyAweEMwMDEwMTQwLCAweEMwMDEwMTQxLCBDUFVfT1NWTSwJfSwKKwl7IDB4QzAwMTEwMjIsIDB4QzAwMTEwMjMsIENQVV9DT05GLAl9LAogfTsKIAotLyogQU1EIFJlZ2lzdGVycyBSYW5nZSAqLwotc3RhdGljIHN0cnVjdCBjcHVfZGVidWdfcmFuZ2UgY3B1X2FtZF9yYW5nZVtdID0gewotCXsgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMSwgQ1BVX01DLAlDUFVfSzEwX1BMVVMsCQl9LAotCXsgMHgwMDAwMDAxMCwgMHgwMDAwMDAxMCwgQ1BVX1RJTUUsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4MDAwMDAwMUIsIDB4MDAwMDAwMUIsIENQVV9BUElDLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMDJBLCAweDAwMDAwMDJBLCBDUFVfUE9XRVJPTiwJQ1BVX0s3X1BMVVMJCX0sCi0JeyAweDAwMDAwMDhCLCAweDAwMDAwMDhCLCBDUFVfVkVSLAlDUFVfSzhfUExVUwkJfSwKLQl7IDB4MDAwMDAwRkUsIDB4MDAwMDAwRkUsIENQVV9NVFJSLAlDUFVfSzhfUExVUywJCX0sCi0KLQl7IDB4MDAwMDAxNzQsIDB4MDAwMDAxNzYsIENQVV9TWVNFTlRFUiwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHgwMDAwMDE3OSwgMHgwMDAwMDE3QiwgQ1BVX01DLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMUQ5LCAweDAwMDAwMUQ5LCBDUFVfREVCVUcsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4MDAwMDAxREIsIDB4MDAwMDAxREUsIENQVV9MQlJBTkNILAlDUFVfSzhfUExVUywJCX0sCi0KLQl7IDB4MDAwMDAyMDAsIDB4MDAwMDAyMEYsIENQVV9NVFJSLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMjUwLCAweDAwMDAwMjUwLCBDUFVfTVRSUiwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHgwMDAwMDI1OCwgMHgwMDAwMDI1OSwgQ1BVX01UUlIsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4MDAwMDAyNjgsIDB4MDAwMDAyNkYsIENQVV9NVFJSLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMjc3LCAweDAwMDAwMjc3LCBDUFVfUEFULAlDUFVfSzhfUExVUywJCX0sCi0JeyAweDAwMDAwMkZGLCAweDAwMDAwMkZGLCBDUFVfTVRSUiwJQ1BVX0s4X1BMVVMsCQl9LAotCi0JeyAweDAwMDAwNDAwLCAweDAwMDAwNDEzLCBDUFVfTUMsCUNQVV9LOF9QTFVTLAkJfSwKLQotCXsgMHhDMDAwMDA4MCwgMHhDMDAwMDA4MCwgQ1BVX0ZFQVRVUkVTLAlDUFVfQU1EX0FMTCwJCX0sCi0JeyAweEMwMDAwMDgxLCAweEMwMDAwMDg0LCBDUFVfQ0FMTCwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHhDMDAwMDEwMCwgMHhDMDAwMDEwMiwgQ1BVX0JBU0UsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4QzAwMDAxMDMsIDB4QzAwMDAxMDMsIENQVV9USU1FLAlDUFVfSzEwX1BMVVMsCQl9LAotCi0JeyAweEMwMDEwMDAwLCAweEMwMDEwMDA3LCBDUFVfUE1DLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweEMwMDEwMDEwLCAweEMwMDEwMDEwLCBDUFVfQ09ORiwJQ1BVX0s3X1BMVVMsCQl9LAotCXsgMHhDMDAxMDAxNSwgMHhDMDAxMDAxNSwgQ1BVX0NPTkYsCUNQVV9LN19QTFVTLAkJfSwKLQl7IDB4QzAwMTAwMTYsIDB4QzAwMTAwMUEsIENQVV9NVFJSLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweEMwMDEwMDFELCAweEMwMDEwMDFELCBDUFVfTVRSUiwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHhDMDAxMDAxRiwgMHhDMDAxMDAxRiwgQ1BVX0NPTkYsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4QzAwMTAwMzAsIDB4QzAwMTAwMzUsIENQVV9CSU9TLAlDUFVfSzhfUExVUywJCX0sCi0JeyAweEMwMDEwMDQ0LCAweEMwMDEwMDQ4LCBDUFVfTUMsCUNQVV9LOF9QTFVTLAkJfSwKLQl7IDB4QzAwMTAwNTAsIDB4QzAwMTAwNTYsIENQVV9TTU0sCUNQVV9LMEZfUExVUywJCX0sCi0JeyAweEMwMDEwMDU4LCAweEMwMDEwMDU4LCBDUFVfQ09ORiwJQ1BVX0sxMF9QTFVTLAkJfSwKLQl7IDB4QzAwMTAwNjAsIDB4QzAwMTAwNjAsIENQVV9DQUNIRSwJQ1BVX0FNRF8xMSwJCX0sCi0JeyAweEMwMDEwMDYxLCAweEMwMDEwMDY4LCBDUFVfU01NLAlDUFVfSzEwX1BMVVMsCQl9LAotCXsgMHhDMDAxMDA2OSwgMHhDMDAxMDA2QiwgQ1BVX1NNTSwJQ1BVX0FNRF8xMSwJCX0sCi0JeyAweEMwMDEwMDcwLCAweEMwMDEwMDcxLCBDUFVfU01NLAlDUFVfSzEwX1BMVVMsCQl9LAotCXsgMHhDMDAxMDExMSwgMHhDMDAxMDExMywgQ1BVX1NNTSwJQ1BVX0s4X1BMVVMsCQl9LAotCXsgMHhDMDAxMDExNCwgMHhDMDAxMDExOCwgQ1BVX1NWTSwJQ1BVX0sxMF9QTFVTLAkJfSwKLQl7IDB4QzAwMTAxNDAsIDB4QzAwMTAxNDEsIENQVV9PU1ZNLAlDUFVfSzEwX1BMVVMsCQl9LAotCXsgMHhDMDAxMTAyMiwgMHhDMDAxMTAyMywgQ1BVX0NPTkYsCUNQVV9LMTBfUExVUywJCX0sCi19OwotCi0KLS8qIEludGVsICovCi1zdGF0aWMgaW50IGdldF9pbnRlbF9tb2RlbGZsYWcodW5zaWduZWQgbW9kZWwpCi17Ci0JaW50IGZsYWc7Ci0KLQlzd2l0Y2ggKG1vZGVsKSB7Ci0JY2FzZSAweDA1MDE6Ci0JY2FzZSAweDA1MDI6Ci0JY2FzZSAweDA1MDQ6Ci0JCWZsYWcgPSBDUFVfSU5URUxfUEVOVElVTTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA2MDE6Ci0JY2FzZSAweDA2MDM6Ci0JY2FzZSAweDA2MDU6Ci0JY2FzZSAweDA2MDc6Ci0JY2FzZSAweDA2MDg6Ci0JY2FzZSAweDA2MEE6Ci0JY2FzZSAweDA2MEI6Ci0JCWZsYWcgPSBDUFVfSU5URUxfUDY7Ci0JCWJyZWFrOwotCWNhc2UgMHgwNjA5OgotCWNhc2UgMHgwNjBEOgotCQlmbGFnID0gQ1BVX0lOVEVMX1BFTlRJVU1fTTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA2MEU6Ci0JCWZsYWcgPSBDUFVfSU5URUxfQ09SRTsKLQkJYnJlYWs7Ci0JY2FzZSAweDA2MEY6Ci0JY2FzZSAweDA2MTc6Ci0JCWZsYWcgPSBDUFVfSU5URUxfQ09SRTI7Ci0JCWJyZWFrOwotCWNhc2UgMHgwNjFDOgotCQlmbGFnID0gQ1BVX0lOVEVMX0FUT007Ci0JCWJyZWFrOwotCWNhc2UgMHgwRjAwOgotCWNhc2UgMHgwRjAxOgotCWNhc2UgMHgwRjAyOgotCWNhc2UgMHgwRjAzOgotCWNhc2UgMHgwRjA0OgotCQlmbGFnID0gQ1BVX0lOVEVMX1hFT05fUDQ7Ci0JCWJyZWFrOwotCWNhc2UgMHgwRjA2OgotCQlmbGFnID0gQ1BVX0lOVEVMX1hFT05fTVA7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZsYWcgPSBDUFVfTk9ORTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGZsYWc7Ci19Ci0KLS8qIEFNRCAqLwotc3RhdGljIGludCBnZXRfYW1kX21vZGVsZmxhZyh1bnNpZ25lZCBtb2RlbCkKLXsKLQlpbnQgZmxhZzsKLQotCXN3aXRjaCAobW9kZWwgPj4gOCkgewotCWNhc2UgMHg2OgotCQlmbGFnID0gQ1BVX0FNRF9LNjsKLQkJYnJlYWs7Ci0JY2FzZSAweDc6Ci0JCWZsYWcgPSBDUFVfQU1EX0s3OwotCQlicmVhazsKLQljYXNlIDB4ODoKLQkJZmxhZyA9IENQVV9BTURfSzg7Ci0JCWJyZWFrOwotCWNhc2UgMHhmOgotCQlmbGFnID0gQ1BVX0FNRF8wRjsKLQkJYnJlYWs7Ci0JY2FzZSAweDEwOgotCQlmbGFnID0gQ1BVX0FNRF8xMDsKLQkJYnJlYWs7Ci0JY2FzZSAweDExOgotCQlmbGFnID0gQ1BVX0FNRF8xMTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJZmxhZyA9IENQVV9OT05FOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gZmxhZzsKLX0KLQotc3RhdGljIGludCBnZXRfY3B1X21vZGVsZmxhZyh1bnNpZ25lZCBjcHUpCi17Ci0JaW50IGZsYWc7Ci0KLQlmbGFnID0gcGVyX2NwdShjcHVfbW9kZWwsIGNwdSk7Ci0KLQlzd2l0Y2ggKGZsYWcgPj4gMTYpIHsKLQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6Ci0JCWZsYWcgPSBnZXRfaW50ZWxfbW9kZWxmbGFnKGZsYWcpOwotCQlicmVhazsKLQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQlmbGFnID0gZ2V0X2FtZF9tb2RlbGZsYWcoZmxhZyAmIDB4ZmZmZik7Ci0JCWJyZWFrOwotCWRlZmF1bHQ6Ci0JCWZsYWcgPSBDUFVfTk9ORTsKLQkJYnJlYWs7Ci0JfQotCi0JcmV0dXJuIGZsYWc7Ci19Ci0KLXN0YXRpYyBpbnQgZ2V0X2NwdV9yYW5nZV9jb3VudCh1bnNpZ25lZCBjcHUpCi17Ci0JaW50IGluZGV4OwotCi0Jc3dpdGNoIChwZXJfY3B1KGNwdV9tb2RlbCwgY3B1KSA+PiAxNikgewotCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKLQkJaW5kZXggPSBBUlJBWV9TSVpFKGNwdV9pbnRlbF9yYW5nZSk7Ci0JCWJyZWFrOwotCWNhc2UgWDg2X1ZFTkRPUl9BTUQ6Ci0JCWluZGV4ID0gQVJSQVlfU0laRShjcHVfYW1kX3JhbmdlKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJaW5kZXggPSAwOwotCQlicmVhazsKLQl9Ci0KLQlyZXR1cm4gaW5kZXg7Ci19Ci0KIHN0YXRpYyBpbnQgaXNfdHlwZWZsYWdfdmFsaWQodW5zaWduZWQgY3B1LCB1bnNpZ25lZCBmbGFnKQogewotCXVuc2lnbmVkIHZlbmRvciwgbW9kZWxmbGFnOwotCWludCBpLCBpbmRleDsKKwlpbnQgaTsKIAogCS8qIFN0YW5kYXJkIFJlZ2lzdGVycyBzaG91bGQgYmUgYWx3YXlzIHZhbGlkICovCiAJaWYgKGZsYWcgPj0gQ1BVX1RTUykKIAkJcmV0dXJuIDE7CiAKLQltb2RlbGZsYWcgPSBwZXJfY3B1KGNwdV9tb2RlbGZsYWcsIGNwdSk7Ci0JdmVuZG9yID0gcGVyX2NwdShjcHVfbW9kZWwsIGNwdSkgPj4gMTY7Ci0JaW5kZXggPSBnZXRfY3B1X3JhbmdlX2NvdW50KGNwdSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykgewotCQlzd2l0Y2ggKHZlbmRvcikgewotCQljYXNlIFg4Nl9WRU5ET1JfSU5URUw6Ci0JCQlpZiAoKGNwdV9pbnRlbF9yYW5nZVtpXS5tb2RlbCAmIG1vZGVsZmxhZykgJiYKLQkJCSAgICAoY3B1X2ludGVsX3JhbmdlW2ldLmZsYWcgJiBmbGFnKSkKLQkJCQlyZXR1cm4gMTsKLQkJCWJyZWFrOwotCQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQkJaWYgKChjcHVfYW1kX3JhbmdlW2ldLm1vZGVsICYgbW9kZWxmbGFnKSAmJgotCQkJICAgIChjcHVfYW1kX3JhbmdlW2ldLmZsYWcgJiBmbGFnKSkKLQkJCQlyZXR1cm4gMTsKLQkJCWJyZWFrOwotCQl9CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY3B1X3JlZ19yYW5nZSk7IGkrKykgeworCQlpZiAoY3B1X3JlZ19yYW5nZVtpXS5mbGFnID09IGZsYWcpCisJCQlyZXR1cm4gMTsKIAl9CiAKIAkvKiBJbnZhbGlkICovCkBAIC0zODUsMjYgKzE4MywxMSBAQAogc3RhdGljIHVuc2lnbmVkIGdldF9jcHVfcmFuZ2UodW5zaWduZWQgY3B1LCB1bnNpZ25lZCAqbWluLCB1bnNpZ25lZCAqbWF4LAogCQkJICAgICAgaW50IGluZGV4LCB1bnNpZ25lZCBmbGFnKQogewotCXVuc2lnbmVkIG1vZGVsZmxhZzsKLQotCW1vZGVsZmxhZyA9IHBlcl9jcHUoY3B1X21vZGVsZmxhZywgY3B1KTsKLQkqbWF4ID0gMDsKLQlzd2l0Y2ggKHBlcl9jcHUoY3B1X21vZGVsLCBjcHUpID4+IDE2KSB7Ci0JY2FzZSBYODZfVkVORE9SX0lOVEVMOgotCQlpZiAoKGNwdV9pbnRlbF9yYW5nZVtpbmRleF0ubW9kZWwgJiBtb2RlbGZsYWcpICYmCi0JCSAgICAoY3B1X2ludGVsX3JhbmdlW2luZGV4XS5mbGFnICYgZmxhZykpIHsKLQkJCSptaW4gPSBjcHVfaW50ZWxfcmFuZ2VbaW5kZXhdLm1pbjsKLQkJCSptYXggPSBjcHVfaW50ZWxfcmFuZ2VbaW5kZXhdLm1heDsKLQkJfQotCQlicmVhazsKLQljYXNlIFg4Nl9WRU5ET1JfQU1EOgotCQlpZiAoKGNwdV9hbWRfcmFuZ2VbaW5kZXhdLm1vZGVsICYgbW9kZWxmbGFnKSAmJgotCQkgICAgKGNwdV9hbWRfcmFuZ2VbaW5kZXhdLmZsYWcgJiBmbGFnKSkgewotCQkJKm1pbiA9IGNwdV9hbWRfcmFuZ2VbaW5kZXhdLm1pbjsKLQkJCSptYXggPSBjcHVfYW1kX3JhbmdlW2luZGV4XS5tYXg7Ci0JCX0KLQkJYnJlYWs7Ci0JfQorCWlmIChjcHVfcmVnX3JhbmdlW2luZGV4XS5mbGFnID09IGZsYWcpIHsKKwkJKm1pbiA9IGNwdV9yZWdfcmFuZ2VbaW5kZXhdLm1pbjsKKwkJKm1heCA9IGNwdV9yZWdfcmFuZ2VbaW5kZXhdLm1heDsKKwl9IGVsc2UKKwkJKm1heCA9IDA7CiAKIAlyZXR1cm4gKm1heDsKIH0KQEAgLTQzNCw3ICsyMTcsNyBAQAogCXVuc2lnbmVkIG1zciwgbXNyX21pbiwgbXNyX21heDsKIAlzdHJ1Y3QgY3B1X3ByaXZhdGUgKnByaXY7CiAJdTMyIGxvdywgaGlnaDsKLQlpbnQgaSwgcmFuZ2U7CisJaW50IGk7CiAKIAlpZiAoc2VxKSB7CiAJCXByaXYgPSBzZXEtPnByaXZhdGU7CkBAIC00NDYsOSArMjI5LDcgQEAKIAkJfQogCX0KIAotCXJhbmdlID0gZ2V0X2NwdV9yYW5nZV9jb3VudChjcHUpOwotCi0JZm9yIChpID0gMDsgaSA8IHJhbmdlOyBpKyspIHsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcHVfcmVnX3JhbmdlKTsgaSsrKSB7CiAJCWlmICghZ2V0X2NwdV9yYW5nZShjcHUsICZtc3JfbWluLCAmbXNyX21heCwgaSwgZmxhZykpCiAJCQljb250aW51ZTsKIApAQCAtNTg4LDggKzM2OSwyMCBAQAogCXNlcV9wcmludGYoc2VxLCAiIFRNSUNUXHRcdDogJTA4eFxuIiwgIGFwaWNfcmVhZChBUElDX1RNSUNUKSk7CiAJc2VxX3ByaW50ZihzZXEsICIgVE1DQ1RcdFx0OiAlMDh4XG4iLCAgYXBpY19yZWFkKEFQSUNfVE1DQ1QpKTsKIAlzZXFfcHJpbnRmKHNlcSwgIiBURENSXHRcdDogJTA4eFxuIiwgIGFwaWNfcmVhZChBUElDX1REQ1IpKTsKLSNlbmRpZiAvKiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMgKi8KKwlpZiAoYm9vdF9jcHVfaGFzKFg4Nl9GRUFUVVJFX0VYVEFQSUMpKSB7CisJCXVuc2lnbmVkIGludCBpLCB2LCBtYXhlaWx2dDsKIAorCQl2ID0gYXBpY19yZWFkKEFQSUNfRUZFQVQpOworCQltYXhlaWx2dCA9ICh2ID4+IDE2KSAmIDB4ZmY7CisJCXNlcV9wcmludGYoc2VxLCAiIEVGRUFUXHRcdDogJTA4eFxuIiwgdik7CisJCXNlcV9wcmludGYoc2VxLCAiIEVDVFJMXHRcdDogJTA4eFxuIiwgYXBpY19yZWFkKEFQSUNfRUNUUkwpKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbWF4ZWlsdnQ7IGkrKykgeworCQkJdiA9IGFwaWNfcmVhZChBUElDX0VJTFZUbihpKSk7CisJCQlzZXFfcHJpbnRmKHNlcSwgIiBFSUxWVCVkXHRcdDogJTA4eFxuIiwgaSwgdik7CisJCX0KKwl9CisjZW5kaWYgLyogQ09ORklHX1g4Nl9MT0NBTF9BUElDICovCiAJc2VxX3ByaW50ZihzZXEsICJcbiBNU1JcdDpcbiIpOwogfQogCkBAIC03ODgsMTMgKzU4MSwxMSBAQAogewogCXN0cnVjdCBkZW50cnkgKmNwdV9kZW50cnkgPSBOVUxMOwogCXVuc2lnbmVkIHJlZywgcmVnX21pbiwgcmVnX21heDsKLQlpbnQgaSwgcmFuZ2UsIGVyciA9IDA7CisJaW50IGksIGVyciA9IDA7CiAJY2hhciByZWdfZGlyWzEyXTsKIAl1MzIgbG93LCBoaWdoOwogCi0JcmFuZ2UgPSBnZXRfY3B1X3JhbmdlX2NvdW50KGNwdSk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgcmFuZ2U7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGNwdV9yZWdfcmFuZ2UpOyBpKyspIHsKIAkJaWYgKCFnZXRfY3B1X3JhbmdlKGNwdSwgJnJlZ19taW4sICZyZWdfbWF4LCBpLAogCQkJCSAgIGNwdV9iYXNlW3R5cGVdLmZsYWcpKQogCQkJY29udGludWU7CkBAIC04NTAsMTAgKzY0MSw2IEBACiAJCWNwdWkgPSAmY3B1X2RhdGEoY3B1KTsKIAkJaWYgKCFjcHVfaGFzKGNwdWksIFg4Nl9GRUFUVVJFX01TUikpCiAJCQljb250aW51ZTsKLQkJcGVyX2NwdShjcHVfbW9kZWwsIGNwdSkgPSAoKGNwdWktPng4Nl92ZW5kb3IgPDwgMTYpIHwKLQkJCQkJICAgKGNwdWktPng4NiA8PCA4KSB8Ci0JCQkJCSAgIChjcHVpLT54ODZfbW9kZWwpKTsKLQkJcGVyX2NwdShjcHVfbW9kZWxmbGFnLCBjcHUpID0gZ2V0X2NwdV9tb2RlbGZsYWcoY3B1KTsKIAogCQlzcHJpbnRmKGNwdV9kaXIsICJjcHUlZCIsIGNwdSk7CiAJCWNwdV9kZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoY3B1X2RpciwgY3B1X2RlYnVnZnNfZGlyKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvY3B1ZnJlcS9LY29uZmlnIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKaW5kZXggNTJjODM5OC4uZjEzOGM2YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL0tjb25maWcKQEAgLTIyMCwxMSArMjIwLDE0IEBACiAJICBJZiBpbiBkb3VidCwgc2F5IE4uCiAKIGNvbmZpZyBYODZfRV9QT1dFUlNBVkVSCi0JdHJpc3RhdGUgIlZJQSBDNyBFbmhhbmNlZCBQb3dlclNhdmVyIgorCXRyaXN0YXRlICJWSUEgQzcgRW5oYW5jZWQgUG93ZXJTYXZlciAoREFOR0VST1VTKSIKIAlzZWxlY3QgQ1BVX0ZSRVFfVEFCTEUKLQlkZXBlbmRzIG9uIFg4Nl8zMgorCWRlcGVuZHMgb24gWDg2XzMyICYmIEVYUEVSSU1FTlRBTAogCWhlbHAKLQkgIFRoaXMgYWRkcyB0aGUgQ1BVRnJlcSBkcml2ZXIgZm9yIFZJQSBDNyBwcm9jZXNzb3JzLgorCSAgVGhpcyBhZGRzIHRoZSBDUFVGcmVxIGRyaXZlciBmb3IgVklBIEM3IHByb2Nlc3NvcnMuICBIb3dldmVyLCB0aGlzIGRyaXZlcgorCSAgZG9lcyBub3QgaGF2ZSBhbnkgc2FmZWd1YXJkcyB0byBwcmV2ZW50IG9wZXJhdGluZyB0aGUgQ1BVIG91dCBvZiBzcGVjCisJICBhbmQgaXMgdGh1cyBjb25zaWRlcmVkIGRhbmdlcm91cy4gIFBsZWFzZSB1c2UgdGhlIHJlZ3VsYXIgQUNQSSBjcHVmcmVxCisJICBkcml2ZXIsIGVuYWJsZWQgYnkgQ09ORklHX1g4Nl9BQ1BJX0NQVUZSRVEuCiAKIAkgIElmIGluIGRvdWJ0LCBzYXkgTi4KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCmluZGV4IDc1MmU4YzYuLmFlOWI1MDMyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2NwdWZyZXEvYWNwaS1jcHVmcmVxLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9jcHVmcmVxL2FjcGktY3B1ZnJlcS5jCkBAIC05MCwxMSArOTAsNyBAQAogewogCXN0cnVjdCBjcHVpbmZvX3g4NiAqY3B1ID0gJmNwdV9kYXRhKGNwdWlkKTsKIAotCWlmIChjcHUtPng4Nl92ZW5kb3IgIT0gWDg2X1ZFTkRPUl9JTlRFTCB8fAotCSAgICAhY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX0VTVCkpCi0JCXJldHVybiAwOwotCi0JcmV0dXJuIDE7CisJcmV0dXJuIGNwdV9oYXMoY3B1LCBYODZfRkVBVFVSRV9FU1QpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgZXh0cmFjdF9pbyh1MzIgdmFsdWUsIHN0cnVjdCBhY3BpX2NwdWZyZXFfZGF0YSAqZGF0YSkKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWwuYwppbmRleCA3NDM3ZmExLi5kYWVkMzliIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbC5jCkBAIC0yMjksMTIgKzIyOSwxMiBAQAogfQogI2VuZGlmCiAKLXN0YXRpYyB2b2lkIF9fY3B1aW5pdCBzcmF0X2RldGVjdF9ub2RlKHZvaWQpCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgc3JhdF9kZXRlY3Rfbm9kZShzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CiAjaWYgZGVmaW5lZChDT05GSUdfTlVNQSkgJiYgZGVmaW5lZChDT05GSUdfWDg2XzY0KQogCXVuc2lnbmVkIG5vZGU7CiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKLQlpbnQgYXBpY2lkID0gaGFyZF9zbXBfcHJvY2Vzc29yX2lkKCk7CisJaW50IGFwaWNpZCA9IGNwdV9oYXNfYXBpYyA/IGhhcmRfc21wX3Byb2Nlc3Nvcl9pZCgpIDogYy0+YXBpY2lkOwogCiAJLyogRG9uJ3QgZG8gdGhlIGZ1bmt5IGZhbGxiYWNrIGhldXJpc3RpY3MgdGhlIEFNRCB2ZXJzaW9uIGVtcGxveXMKIAkgICBmb3Igbm93LiAqLwpAQCAtNDAwLDcgKzQwMCw3IEBACiAJfQogCiAJLyogV29yayBhcm91bmQgZXJyYXRhICovCi0Jc3JhdF9kZXRlY3Rfbm9kZSgpOworCXNyYXRfZGV0ZWN0X25vZGUoYyk7CiAKIAlpZiAoY3B1X2hhcyhjLCBYODZfRkVBVFVSRV9WTVgpKQogCQlkZXRlY3Rfdm14X3ZpcnRjYXAoYyk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9pbnRlbF9jYWNoZWluZm8uYwppbmRleCA0ODNlZGE5Li43ODllZmUyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L2ludGVsX2NhY2hlaW5mby5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvaW50ZWxfY2FjaGVpbmZvLmMKQEAgLTE3LDYgKzE3LDcgQEAKIAogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KICNpbmNsdWRlIDxhc20vc21wLmg+CisjaW5jbHVkZSA8YXNtL2s4Lmg+CiAKICNkZWZpbmUgTFZMXzFfSU5TVAkxCiAjZGVmaW5lIExWTF8xX0RBVEEJMgpAQCAtMTU5LDE0ICsxNjAsNiBAQAogCXVuc2lnbmVkIGxvbmcgY2FuX2Rpc2FibGU7CiB9OwogCi0jaWYgZGVmaW5lZChDT05GSUdfUENJKSAmJiBkZWZpbmVkKENPTkZJR19TWVNGUykKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldmljZV9pZCBrOF9uYl9pZFtdID0gewotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMTAzKSB9LAotCXsgUENJX0RFVklDRShQQ0lfVkVORE9SX0lEX0FNRCwgMHgxMjAzKSB9LAotCXt9Ci19OwotI2VuZGlmCi0KIHVuc2lnbmVkIHNob3J0CQkJbnVtX2NhY2hlX2xlYXZlczsKIAogLyogQU1EIGRvZXNuJ3QgaGF2ZSBDUFVJRDQuIEVtdWxhdGUgaXQgaGVyZSB0byByZXBvcnQgdGhlIHNhbWUKQEAgLTIwNywxMCArMjAwLDE3IEBACiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgX19jcHVpbml0Y29uc3QgYXNzb2NzW10gPSB7Ci0JWzFdID0gMSwgWzJdID0gMiwgWzRdID0gNCwgWzZdID0gOCwKLQlbOF0gPSAxNiwgWzB4YV0gPSAzMiwgWzB4Yl0gPSA0OCwKKwlbMV0gPSAxLAorCVsyXSA9IDIsCisJWzRdID0gNCwKKwlbNl0gPSA4LAorCVs4XSA9IDE2LAorCVsweGFdID0gMzIsCisJWzB4Yl0gPSA0OCwKIAlbMHhjXSA9IDY0LAotCVsweGZdID0gMHhmZmZmIC8vID8/CisJWzB4ZF0gPSA5NiwKKwlbMHhlXSA9IDEyOCwKKwlbMHhmXSA9IDB4ZmZmZiAvKiBmdWxseSBhc3NvY2lhdGl2ZSAtIG5vIHdheSB0byBzaG93IHRoaXMgY3VycmVudGx5ICovCiB9OwogCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfX2NwdWluaXRjb25zdCBsZXZlbHNbXSA9IHsgMSwgMSwgMiwgMyB9OwpAQCAtMjcxLDcgKzI3MSw4IEBACiAJZWF4LT5zcGxpdC50eXBlID0gdHlwZXNbbGVhZl07CiAJZWF4LT5zcGxpdC5sZXZlbCA9IGxldmVsc1tsZWFmXTsKIAlpZiAobGVhZiA9PSAzKQotCQllYXgtPnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmcgPSBjdXJyZW50X2NwdV9kYXRhLng4Nl9tYXhfY29yZXMgLSAxOworCQllYXgtPnNwbGl0Lm51bV90aHJlYWRzX3NoYXJpbmcgPQorCQkJY3VycmVudF9jcHVfZGF0YS54ODZfbWF4X2NvcmVzIC0gMTsKIAllbHNlCiAJCWVheC0+c3BsaXQubnVtX3RocmVhZHNfc2hhcmluZyA9IDA7CiAJZWF4LT5zcGxpdC5udW1fY29yZXNfb25fZGllID0gY3VycmVudF9jcHVfZGF0YS54ODZfbWF4X2NvcmVzIC0gMTsKQEAgLTI5MSw2ICsyOTIsMTQgQEAKIHsKIAlpZiAoaW5kZXggPCAzKQogCQlyZXR1cm47CisKKwlpZiAoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxMSkKKwkJcmV0dXJuOworCisJLyogc2VlIGVycmF0dW0gIzM4MiAqLworCWlmICgoYm9vdF9jcHVfZGF0YS54ODYgPT0gMHgxMCkgJiYgKGJvb3RfY3B1X2RhdGEueDg2X21vZGVsIDwgMHg4KSkKKwkJcmV0dXJuOworCiAJdGhpc19sZWFmLT5jYW5fZGlzYWJsZSA9IDE7CiB9CiAKQEAgLTY5Niw5OCArNzA1LDc2IEBACiAjZGVmaW5lIHRvX29iamVjdChrKQljb250YWluZXJfb2Yoaywgc3RydWN0IF9pbmRleF9rb2JqZWN0LCBrb2JqKQogI2RlZmluZSB0b19hdHRyKGEpCWNvbnRhaW5lcl9vZihhLCBzdHJ1Y3QgX2NhY2hlX2F0dHIsIGF0dHIpCiAKLSNpZmRlZiBDT05GSUdfUENJCi1zdGF0aWMgc3RydWN0IHBjaV9kZXYgKmdldF9rOF9ub3J0aGJyaWRnZShpbnQgbm9kZSkKK3N0YXRpYyBzc2l6ZV90IHNob3dfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZiwKKwkJCQkgIHVuc2lnbmVkIGludCBpbmRleCkKIHsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlpbnQgaTsKLQotCWZvciAoaSA9IDA7IGkgPD0gbm9kZTsgaSsrKSB7Ci0JCWRvIHsKLQkJCWRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldik7Ci0JCQlpZiAoIWRldikKLQkJCQlicmVhazsKLQkJfSB3aGlsZSAoIXBjaV9tYXRjaF9pZCgmazhfbmJfaWRbMF0sIGRldikpOwotCQlpZiAoIWRldikKLQkJCWJyZWFrOwotCX0KLQlyZXR1cm4gZGV2OwotfQotI2Vsc2UKLXN0YXRpYyBzdHJ1Y3QgcGNpX2RldiAqZ2V0X2s4X25vcnRoYnJpZGdlKGludCBub2RlKQotewotCXJldHVybiBOVUxMOwotfQotI2VuZGlmCi0KLXN0YXRpYyBzc2l6ZV90IHNob3dfY2FjaGVfZGlzYWJsZShzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikKLXsKLQljb25zdCBzdHJ1Y3QgY3B1bWFzayAqbWFzayA9IHRvX2NwdW1hc2sodGhpc19sZWFmLT5zaGFyZWRfY3B1X21hcCk7Ci0JaW50IG5vZGUgPSBjcHVfdG9fbm9kZShjcHVtYXNrX2ZpcnN0KG1hc2spKTsKLQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKLQlzc2l6ZV90IHJldCA9IDA7Ci0JaW50IGk7CisJaW50IGNwdSA9IGNwdW1hc2tfZmlyc3QodG9fY3B1bWFzayh0aGlzX2xlYWYtPnNoYXJlZF9jcHVfbWFwKSk7CisJaW50IG5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOworCXN0cnVjdCBwY2lfZGV2ICpkZXYgPSBub2RlX3RvX2s4X25iX21pc2Mobm9kZSk7CisJdW5zaWduZWQgaW50IHJlZyA9IDA7CiAKIAlpZiAoIXRoaXNfbGVhZi0+Y2FuX2Rpc2FibGUpCi0JCXJldHVybiBzcHJpbnRmKGJ1ZiwgIkZlYXR1cmUgbm90IGVuYWJsZWRcbiIpOwotCi0JZGV2ID0gZ2V0X2s4X25vcnRoYnJpZGdlKG5vZGUpOwotCWlmICghZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQXR0ZW1wdGluZyBBTUQgbm9ydGhicmlkZ2Ugb3BlcmF0aW9uIG9uIGEgc3lzdGVtIHdpdGggbm8gbm9ydGhicmlkZ2VcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKLQl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0JCXVuc2lnbmVkIGludCByZWc7CisJaWYgKCFkZXYpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4MUJDICsgaSAqIDQsICZyZWcpOwotCi0JCXJldCArPSBzcHJpbnRmKGJ1ZiwgIiVzRW50cnk6ICVkXG4iLCBidWYsIGkpOwotCQlyZXQgKz0gc3ByaW50ZihidWYsICIlc1JlYWRzOiAgJXNcdE5ldyBFbnRyaWVzOiAlc1xuIiwgIAotCQkJYnVmLAotCQkJcmVnICYgMHg4MDAwMDAwMCA/ICJEaXNhYmxlZCIgOiAiQWxsb3dlZCIsCi0JCQlyZWcgJiAweDQwMDAwMDAwID8gIkRpc2FibGVkIiA6ICJBbGxvd2VkIik7Ci0JCXJldCArPSBzcHJpbnRmKGJ1ZiwgIiVzU3ViQ2FjaGU6ICV4XHRJbmRleDogJXhcbiIsCi0JCQlidWYsIChyZWcgJiAweDMwMDAwKSA+PiAxNiwgcmVnICYgMHhmZmYpOwotCX0KLQlyZXR1cm4gcmV0OworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChkZXYsIDB4MUJDICsgaW5kZXggKiA0LCAmcmVnKTsKKwlyZXR1cm4gc3ByaW50ZihidWYsICIleFxuIiwgcmVnKTsKIH0KIAotc3RhdGljIHNzaXplX3QKLXN0b3JlX2NhY2hlX2Rpc2FibGUoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLCBjb25zdCBjaGFyICpidWYsCi0JCSAgICBzaXplX3QgY291bnQpCisjZGVmaW5lIFNIT1dfQ0FDSEVfRElTQUJMRShpbmRleCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzaG93X2NhY2hlX2Rpc2FibGVfIyNpbmRleChzdHJ1Y3QgX2NwdWlkNF9pbmZvICp0aGlzX2xlYWYsIGNoYXIgKmJ1ZikgIAlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzaG93X2NhY2hlX2Rpc2FibGUodGhpc19sZWFmLCBidWYsIGluZGV4KTsJCVwKK30KK1NIT1dfQ0FDSEVfRElTQUJMRSgwKQorU0hPV19DQUNIRV9ESVNBQkxFKDEpCisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX2NhY2hlX2Rpc2FibGUoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLAorCWNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCB1bnNpZ25lZCBpbnQgaW5kZXgpCiB7Ci0JY29uc3Qgc3RydWN0IGNwdW1hc2sgKm1hc2sgPSB0b19jcHVtYXNrKHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApOwotCWludCBub2RlID0gY3B1X3RvX25vZGUoY3B1bWFza19maXJzdChtYXNrKSk7Ci0Jc3RydWN0IHBjaV9kZXYgKmRldiA9IE5VTEw7Ci0JdW5zaWduZWQgaW50IHJldCwgaW5kZXgsIHZhbDsKKwlpbnQgY3B1ID0gY3B1bWFza19maXJzdCh0b19jcHVtYXNrKHRoaXNfbGVhZi0+c2hhcmVkX2NwdV9tYXApKTsKKwlpbnQgbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CisJc3RydWN0IHBjaV9kZXYgKmRldiA9IG5vZGVfdG9fazhfbmJfbWlzYyhub2RlKTsKKwl1bnNpZ25lZCBsb25nIHZhbCA9IDA7CisJdW5zaWduZWQgaW50IHNjcnViYmVyID0gMDsKIAogCWlmICghdGhpc19sZWFmLT5jYW5fZGlzYWJsZSkKLQkJcmV0dXJuIDA7Ci0KLQlpZiAoc3RybGVuKGJ1ZikgPiAxNSkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKLQlyZXQgPSBzc2NhbmYoYnVmLCAiJXggJXgiLCAmaW5kZXgsICZ2YWwpOwotCWlmIChyZXQgIT0gMikKKwlpZiAoIWNhcGFibGUoQ0FQX1NZU19BRE1JTikpCisJCXJldHVybiAtRVBFUk07CisKKwlpZiAoIWRldikKIAkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKGluZGV4ID4gMSkKKworCWlmIChzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKSA8IDApCiAJCXJldHVybiAtRUlOVkFMOwogCiAJdmFsIHw9IDB4YzAwMDAwMDA7Ci0JZGV2ID0gZ2V0X2s4X25vcnRoYnJpZGdlKG5vZGUpOwotCWlmICghZGV2KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiQXR0ZW1wdGluZyBBTUQgbm9ydGhicmlkZ2Ugb3BlcmF0aW9uIG9uIGEgc3lzdGVtIHdpdGggbm8gbm9ydGhicmlkZ2VcbiIpOwotCQlyZXR1cm4gLUVJTlZBTDsKLQl9CisKKwlwY2lfcmVhZF9jb25maWdfZHdvcmQoZGV2LCAweDU4LCAmc2NydWJiZXIpOworCXNjcnViYmVyICY9IH4weDFmMDAwMDAwOworCXBjaV93cml0ZV9jb25maWdfZHdvcmQoZGV2LCAweDU4LCBzY3J1YmJlcik7CiAKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHgxQkMgKyBpbmRleCAqIDQsIHZhbCAmIH4weDQwMDAwMDAwKTsKIAl3YmludmQoKTsKIAlwY2lfd3JpdGVfY29uZmlnX2R3b3JkKGRldiwgMHgxQkMgKyBpbmRleCAqIDQsIHZhbCk7Ci0KLQlyZXR1cm4gMTsKKwlyZXR1cm4gY291bnQ7CiB9CiAKKyNkZWZpbmUgU1RPUkVfQ0FDSEVfRElTQUJMRShpbmRleCkJCQkJCVwKK3N0YXRpYyBzc2l6ZV90CQkJCQkJCQlcCitzdG9yZV9jYWNoZV9kaXNhYmxlXyMjaW5kZXgoc3RydWN0IF9jcHVpZDRfaW5mbyAqdGhpc19sZWFmLAkgICAgIAlcCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgY291bnQpCQlcCit7CQkJCQkJCQkJXAorCXJldHVybiBzdG9yZV9jYWNoZV9kaXNhYmxlKHRoaXNfbGVhZiwgYnVmLCBjb3VudCwgaW5kZXgpOwlcCit9CitTVE9SRV9DQUNIRV9ESVNBQkxFKDApCitTVE9SRV9DQUNIRV9ESVNBQkxFKDEpCisKIHN0cnVjdCBfY2FjaGVfYXR0ciB7CiAJc3RydWN0IGF0dHJpYnV0ZSBhdHRyOwogCXNzaXplX3QgKCpzaG93KShzdHJ1Y3QgX2NwdWlkNF9pbmZvICosIGNoYXIgKik7CkBAIC04MDgsNyArNzk1LDEwIEBACiBkZWZpbmVfb25lX3JvKHNoYXJlZF9jcHVfbWFwKTsKIGRlZmluZV9vbmVfcm8oc2hhcmVkX2NwdV9saXN0KTsKIAotc3RhdGljIHN0cnVjdCBfY2FjaGVfYXR0ciBjYWNoZV9kaXNhYmxlID0gX19BVFRSKGNhY2hlX2Rpc2FibGUsIDA2NDQsIHNob3dfY2FjaGVfZGlzYWJsZSwgc3RvcmVfY2FjaGVfZGlzYWJsZSk7CitzdGF0aWMgc3RydWN0IF9jYWNoZV9hdHRyIGNhY2hlX2Rpc2FibGVfMCA9IF9fQVRUUihjYWNoZV9kaXNhYmxlXzAsIDA2NDQsCisJCXNob3dfY2FjaGVfZGlzYWJsZV8wLCBzdG9yZV9jYWNoZV9kaXNhYmxlXzApOworc3RhdGljIHN0cnVjdCBfY2FjaGVfYXR0ciBjYWNoZV9kaXNhYmxlXzEgPSBfX0FUVFIoY2FjaGVfZGlzYWJsZV8xLCAwNjQ0LAorCQlzaG93X2NhY2hlX2Rpc2FibGVfMSwgc3RvcmVfY2FjaGVfZGlzYWJsZV8xKTsKIAogc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKiBkZWZhdWx0X2F0dHJzW10gPSB7CiAJJnR5cGUuYXR0ciwKQEAgLTgyMCw3ICs4MTAsOCBAQAogCSZzaXplLmF0dHIsCiAJJnNoYXJlZF9jcHVfbWFwLmF0dHIsCiAJJnNoYXJlZF9jcHVfbGlzdC5hdHRyLAotCSZjYWNoZV9kaXNhYmxlLmF0dHIsCisJJmNhY2hlX2Rpc2FibGVfMC5hdHRyLAorCSZjYWNoZV9kaXNhYmxlXzEuYXR0ciwKIAlOVUxMCiB9OwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L21jaGVjay9tY2VfaW50ZWxfNjQuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbF82NC5jCmluZGV4IGNlZjNlZTMuLjY1YTBmY2UgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbF82NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbWNoZWNrL21jZV9pbnRlbF82NC5jCkBAIC0xNSw3ICsxNSw2IEBACiAjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9pZGxlLmg+CiAjaW5jbHVkZSA8YXNtL3RoZXJtX3Rocm90Lmg+Ci0jaW5jbHVkZSA8YXNtL2FwaWMuaD4KIAogYXNtbGlua2FnZSB2b2lkIHNtcF90aGVybWFsX2ludGVycnVwdCh2b2lkKQogewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2NsZWFudXAuYyBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9jbGVhbnVwLmMKaW5kZXggY2UwZmU0Yi4uMWQ1ODRhMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2NsZWFudXAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvY2xlYW51cC5jCkBAIC04MDgsNyArODA4LDcgQEAKIAogCWlmICghaXNfY3B1KElOVEVMKSB8fCBlbmFibGVfbXRycl9jbGVhbnVwIDwgMSkKIAkJcmV0dXJuIDA7Ci0JcmRtc3IoTVRSUmRlZlR5cGVfTVNSLCBkZWYsIGR1bW15KTsKKwlyZG1zcihNU1JfTVRSUmRlZlR5cGUsIGRlZiwgZHVtbXkpOwogCWRlZiAmPSAweGZmOwogCWlmIChkZWYgIT0gTVRSUl9UWVBFX1VOQ0FDSEFCTEUpCiAJCXJldHVybiAwOwpAQCAtMTAwMyw3ICsxMDAzLDcgQEAKIAkgKi8KIAlpZiAoIWlzX2NwdShJTlRFTCkgfHwgZGlzYWJsZV9tdHJyX3RyaW0pCiAJCXJldHVybiAwOwotCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmLCBkdW1teSk7CisJcmRtc3IoTVNSX01UUlJkZWZUeXBlLCBkZWYsIGR1bW15KTsKIAlkZWYgJj0gMHhmZjsKIAlpZiAoZGVmICE9IE1UUlJfVFlQRV9VTkNBQ0hBQkxFKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvZ2VuZXJpYy5jCmluZGV4IGQyMWQ0ZmIuLjA1NDNmNjkgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9nZW5lcmljLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL2dlbmVyaWMuYwpAQCAtMjAsOSArMjAsOSBAQAogfTsKIAogc3RhdGljIHN0cnVjdCBmaXhlZF9yYW5nZV9ibG9jayBmaXhlZF9yYW5nZV9ibG9ja3NbXSA9IHsKLQl7IE1UUlJmaXg2NEtfMDAwMDBfTVNSLCAxIH0sIC8qIG9uZSAgNjRrIE1UUlIgICovCi0JeyBNVFJSZml4MTZLXzgwMDAwX01TUiwgMiB9LCAvKiB0d28gIDE2ayBNVFJScyAqLwotCXsgTVRSUmZpeDRLX0MwMDAwX01TUiwgIDggfSwgLyogZWlnaHQgNGsgTVRSUnMgKi8KKwl7IE1TUl9NVFJSZml4NjRLXzAwMDAwLCAxIH0sIC8qIG9uZSAgNjRrIE1UUlIgICovCisJeyBNU1JfTVRSUmZpeDE2S184MDAwMCwgMiB9LCAvKiB0d28gIDE2ayBNVFJScyAqLworCXsgTVNSX01UUlJmaXg0S19DMDAwMCwgIDggfSwgLyogZWlnaHQgNGsgTVRSUnMgKi8KIAl7fQogfTsKIApAQCAtMTk0LDEyICsxOTQsMTIgQEAKIAogCWs4X2NoZWNrX3N5c2NmZ19kcmFtX21vZF9lbigpOwogCi0JcmRtc3IoTVRSUmZpeDY0S18wMDAwMF9NU1IsIHBbMF0sIHBbMV0pOworCXJkbXNyKE1TUl9NVFJSZml4NjRLXzAwMDAwLCBwWzBdLCBwWzFdKTsKIAogCWZvciAoaSA9IDA7IGkgPCAyOyBpKyspCi0JCXJkbXNyKE1UUlJmaXgxNktfODAwMDBfTVNSICsgaSwgcFsyICsgaSAqIDJdLCBwWzMgKyBpICogMl0pOworCQlyZG1zcihNU1JfTVRSUmZpeDE2S184MDAwMCArIGksIHBbMiArIGkgKiAyXSwgcFszICsgaSAqIDJdKTsKIAlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKQotCQlyZG1zcihNVFJSZml4NEtfQzAwMDBfTVNSICsgaSwgcFs2ICsgaSAqIDJdLCBwWzcgKyBpICogMl0pOworCQlyZG1zcihNU1JfTVRSUmZpeDRLX0MwMDAwICsgaSwgcFs2ICsgaSAqIDJdLCBwWzcgKyBpICogMl0pOwogfQogCiB2b2lkIG10cnJfc2F2ZV9maXhlZF9yYW5nZXModm9pZCAqaW5mbykKQEAgLTMxMCw3ICszMTAsNyBAQAogCiAJdnJzID0gbXRycl9zdGF0ZS52YXJfcmFuZ2VzOwogCi0JcmRtc3IoTVRSUmNhcF9NU1IsIGxvLCBkdW1teSk7CisJcmRtc3IoTVNSX01UUlJjYXAsIGxvLCBkdW1teSk7CiAJbXRycl9zdGF0ZS5oYXZlX2ZpeGVkID0gKGxvID4+IDgpICYgMTsKIAogCWZvciAoaSA9IDA7IGkgPCBudW1fdmFyX3JhbmdlczsgaSsrKQpAQCAtMzE4LDcgKzMxOCw3IEBACiAJaWYgKG10cnJfc3RhdGUuaGF2ZV9maXhlZCkKIAkJZ2V0X2ZpeGVkX3JhbmdlcyhtdHJyX3N0YXRlLmZpeGVkX3Jhbmdlcyk7CiAKLQlyZG1zcihNVFJSZGVmVHlwZV9NU1IsIGxvLCBkdW1teSk7CisJcmRtc3IoTVNSX01UUlJkZWZUeXBlLCBsbywgZHVtbXkpOwogCW10cnJfc3RhdGUuZGVmX3R5cGUgPSAobG8gJiAweGZmKTsKIAltdHJyX3N0YXRlLmVuYWJsZWQgPSAobG8gJiAweGMwMCkgPj4gMTA7CiAKQEAgLTU4MywxMCArNTgzLDEwIEBACiAJX19mbHVzaF90bGIoKTsKIAogCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KLQlyZG1zcihNVFJSZGVmVHlwZV9NU1IsIGRlZnR5cGVfbG8sIGRlZnR5cGVfaGkpOworCXJkbXNyKE1TUl9NVFJSZGVmVHlwZSwgZGVmdHlwZV9sbywgZGVmdHlwZV9oaSk7CiAKIAkvKiAgRGlzYWJsZSBNVFJScywgYW5kIHNldCB0aGUgZGVmYXVsdCB0eXBlIHRvIHVuY2FjaGVkICAqLwotCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBkZWZ0eXBlX2xvICYgfjB4Y2ZmLCBkZWZ0eXBlX2hpKTsKKwltdHJyX3dybXNyKE1TUl9NVFJSZGVmVHlwZSwgZGVmdHlwZV9sbyAmIH4weGNmZiwgZGVmdHlwZV9oaSk7CiB9CiAKIHN0YXRpYyB2b2lkIHBvc3Rfc2V0KHZvaWQpIF9fcmVsZWFzZXMoc2V0X2F0b21pY2l0eV9sb2NrKQpAQCAtNTk1LDcgKzU5NSw3IEBACiAJX19mbHVzaF90bGIoKTsKIAogCS8qIEludGVsIChQNikgc3RhbmRhcmQgTVRSUnMgKi8KLQltdHJyX3dybXNyKE1UUlJkZWZUeXBlX01TUiwgZGVmdHlwZV9sbywgZGVmdHlwZV9oaSk7CisJbXRycl93cm1zcihNU1JfTVRSUmRlZlR5cGUsIGRlZnR5cGVfbG8sIGRlZnR5cGVfaGkpOwogCQkKIAkvKiAgRW5hYmxlIGNhY2hlcyAgKi8KIAl3cml0ZV9jcjAocmVhZF9jcjAoKSAmIDB4YmZmZmZmZmYpOwpAQCAtNzA3LDcgKzcwNyw3IEBACiBzdGF0aWMgaW50IGdlbmVyaWNfaGF2ZV93cmNvbWIodm9pZCkKIHsKIAl1bnNpZ25lZCBsb25nIGNvbmZpZywgZHVtbXk7Ci0JcmRtc3IoTVRSUmNhcF9NU1IsIGNvbmZpZywgZHVtbXkpOworCXJkbXNyKE1TUl9NVFJSY2FwLCBjb25maWcsIGR1bW15KTsKIAlyZXR1cm4gKGNvbmZpZyAmICgxIDw8IDEwKSk7CiB9CiAKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbWFpbi5jCmluZGV4IDAzY2RhMDEuLjhmYzI0OGIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tYWluLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL21haW4uYwpAQCAtMTA0LDcgKzEwNCw3IEBACiAJdW5zaWduZWQgbG9uZyBjb25maWcgPSAwLCBkdW1teTsKIAogCWlmICh1c2VfaW50ZWwoKSkgewotCQlyZG1zcihNVFJSY2FwX01TUiwgY29uZmlnLCBkdW1teSk7CisJCXJkbXNyKE1TUl9NVFJSY2FwLCBjb25maWcsIGR1bW15KTsKIAl9IGVsc2UgaWYgKGlzX2NwdShBTUQpKQogCQljb25maWcgPSAyOwogCWVsc2UgaWYgKGlzX2NwdShDWVJJWCkgfHwgaXNfY3B1KENFTlRBVVIpKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL210cnIuaCBiL2FyY2gveDg2L2tlcm5lbC9jcHUvbXRyci9tdHJyLmgKaW5kZXggNzdmNjdmNy4uNzUzOGI3NiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL210cnIuaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvbXRyci5oCkBAIC01LDIxICs1LDYgQEAKICNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgogI2luY2x1ZGUgPGxpbnV4L3N0ZGRlZi5oPgogCi0jZGVmaW5lIE1UUlJjYXBfTVNSICAgICAweDBmZQotI2RlZmluZSBNVFJSZGVmVHlwZV9NU1IgMHgyZmYKLQotI2RlZmluZSBNVFJSZml4NjRLXzAwMDAwX01TUiAweDI1MAotI2RlZmluZSBNVFJSZml4MTZLXzgwMDAwX01TUiAweDI1OAotI2RlZmluZSBNVFJSZml4MTZLX0EwMDAwX01TUiAweDI1OQotI2RlZmluZSBNVFJSZml4NEtfQzAwMDBfTVNSIDB4MjY4Ci0jZGVmaW5lIE1UUlJmaXg0S19DODAwMF9NU1IgMHgyNjkKLSNkZWZpbmUgTVRSUmZpeDRLX0QwMDAwX01TUiAweDI2YQotI2RlZmluZSBNVFJSZml4NEtfRDgwMDBfTVNSIDB4MjZiCi0jZGVmaW5lIE1UUlJmaXg0S19FMDAwMF9NU1IgMHgyNmMKLSNkZWZpbmUgTVRSUmZpeDRLX0U4MDAwX01TUiAweDI2ZAotI2RlZmluZSBNVFJSZml4NEtfRjAwMDBfTVNSIDB4MjZlCi0jZGVmaW5lIE1UUlJmaXg0S19GODAwMF9NU1IgMHgyNmYKLQogI2RlZmluZSBNVFJSX0NIQU5HRV9NQVNLX0ZJWEVEICAgICAweDAxCiAjZGVmaW5lIE1UUlJfQ0hBTkdFX01BU0tfVkFSSUFCTEUgIDB4MDIKICNkZWZpbmUgTVRSUl9DSEFOR0VfTUFTS19ERUZUWVBFICAgMHgwNApkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2NwdS9tdHJyL3N0YXRlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYwppbmRleCA3ZjdlMjc1Li4xZjVmYjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L210cnIvc3RhdGUuYwpAQCAtMzUsNyArMzUsNyBAQAogCiAJCWlmICh1c2VfaW50ZWwoKSkKIAkJCS8qICBTYXZlIE1UUlIgc3RhdGUgKi8KLQkJCXJkbXNyKE1UUlJkZWZUeXBlX01TUiwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CisJCQlyZG1zcihNU1JfTVRSUmRlZlR5cGUsIGN0eHQtPmRlZnR5cGVfbG8sIGN0eHQtPmRlZnR5cGVfaGkpOwogCQllbHNlCiAJCQkvKiBDeXJpeCBBUlJzIC0gZXZlcnl0aGluZyBlbHNlIHdlcmUgZXhjbHVkZWQgYXQgdGhlIHRvcCAqLwogCQkJY3R4dC0+Y2NyMyA9IGdldEN4ODYoQ1g4Nl9DQ1IzKTsKQEAgLTQ2LDcgKzQ2LDcgQEAKIHsKIAlpZiAodXNlX2ludGVsKCkpCiAJCS8qICBEaXNhYmxlIE1UUlJzLCBhbmQgc2V0IHRoZSBkZWZhdWx0IHR5cGUgdG8gdW5jYWNoZWQgICovCi0JCW10cnJfd3Jtc3IoTVRSUmRlZlR5cGVfTVNSLCBjdHh0LT5kZWZ0eXBlX2xvICYgMHhmMzAwVUwsCisJCW10cnJfd3Jtc3IoTVNSX01UUlJkZWZUeXBlLCBjdHh0LT5kZWZ0eXBlX2xvICYgMHhmMzAwVUwsCiAJCSAgICAgIGN0eHQtPmRlZnR5cGVfaGkpOwogCWVsc2UgaWYgKGlzX2NwdShDWVJJWCkpCiAJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2VyZSBleGNsdWRlZCBhdCB0aGUgdG9wICovCkBAIC02NCw3ICs2NCw3IEBACiAJCS8qICBSZXN0b3JlIE1UUlJkZWZUeXBlICAqLwogCQlpZiAodXNlX2ludGVsKCkpCiAJCQkvKiBJbnRlbCAoUDYpIHN0YW5kYXJkIE1UUlJzICovCi0JCQltdHJyX3dybXNyKE1UUlJkZWZUeXBlX01TUiwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CisJCQltdHJyX3dybXNyKE1TUl9NVFJSZGVmVHlwZSwgY3R4dC0+ZGVmdHlwZV9sbywgY3R4dC0+ZGVmdHlwZV9oaSk7CiAJCWVsc2UKIAkJCS8qIEN5cml4IEFSUnMgLSBldmVyeXRoaW5nIGVsc2Ugd2FzIGV4Y2x1ZGVkIGF0IHRoZSB0b3AgKi8KIAkJCXNldEN4ODYoQ1g4Nl9DQ1IzLCBjdHh0LT5jY3IzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZl9jb3VudGVyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfY291bnRlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NWM4MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvY3B1L3BlcmZfY291bnRlci5jCkBAIC0wLDAgKzEsMTcwNCBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgeDg2IGFyY2hpdGVjdHVyZSBjb2RlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodCAoQykgMjAwOSBKYXN3aW5kZXIgU2luZ2ggUmFqcHV0CisgKiAgQ29weXJpZ2h0IChDKSAyMDA5IEFkdmFuY2VkIE1pY3JvIERldmljZXMsIEluYy4sIFJvYmVydCBSaWNodGVyCisgKiAgQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgUmVkIEhhdCwgSW5jLiwgUGV0ZXIgWmlqbHN0cmEgPHB6aWpsc3RyQHJlZGhhdC5jb20+CisgKgorICogIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisKKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CisjaW5jbHVkZSA8bGludXgvbm90aWZpZXIuaD4KKyNpbmNsdWRlIDxsaW51eC9oYXJkaXJxLmg+CisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgorI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8YXNtL2FwaWMuaD4KKyNpbmNsdWRlIDxhc20vc3RhY2t0cmFjZS5oPgorI2luY2x1ZGUgPGFzbS9ubWkuaD4KKworc3RhdGljIHU2NCBwZXJmX2NvdW50ZXJfbWFzayBfX3JlYWRfbW9zdGx5OworCitzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzIHsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyCSpjb3VudGVyc1tYODZfUE1DX0lEWF9NQVhdOworCXVuc2lnbmVkIGxvbmcJCXVzZWRfbWFza1tCSVRTX1RPX0xPTkdTKFg4Nl9QTUNfSURYX01BWCldOworCXVuc2lnbmVkIGxvbmcJCWFjdGl2ZV9tYXNrW0JJVFNfVE9fTE9OR1MoWDg2X1BNQ19JRFhfTUFYKV07CisJdW5zaWduZWQgbG9uZwkJaW50ZXJydXB0czsKKwlpbnQJCQllbmFibGVkOworfTsKKworLyoKKyAqIHN0cnVjdCB4ODZfcG11IC0gZ2VuZXJpYyB4ODYgcG11CisgKi8KK3N0cnVjdCB4ODZfcG11IHsKKwljb25zdCBjaGFyCSpuYW1lOworCWludAkJdmVyc2lvbjsKKwlpbnQJCSgqaGFuZGxlX2lycSkoc3RydWN0IHB0X3JlZ3MgKik7CisJdm9pZAkJKCpkaXNhYmxlX2FsbCkodm9pZCk7CisJdm9pZAkJKCplbmFibGVfYWxsKSh2b2lkKTsKKwl2b2lkCQkoKmVuYWJsZSkoc3RydWN0IGh3X3BlcmZfY291bnRlciAqLCBpbnQpOworCXZvaWQJCSgqZGlzYWJsZSkoc3RydWN0IGh3X3BlcmZfY291bnRlciAqLCBpbnQpOworCXVuc2lnbmVkCWV2ZW50c2VsOworCXVuc2lnbmVkCXBlcmZjdHI7CisJdTY0CQkoKmV2ZW50X21hcCkoaW50KTsKKwl1NjQJCSgqcmF3X2V2ZW50KSh1NjQpOworCWludAkJbWF4X2V2ZW50czsKKwlpbnQJCW51bV9jb3VudGVyczsKKwlpbnQJCW51bV9jb3VudGVyc19maXhlZDsKKwlpbnQJCWNvdW50ZXJfYml0czsKKwl1NjQJCWNvdW50ZXJfbWFzazsKKwl1NjQJCW1heF9wZXJpb2Q7CisJdTY0CQlpbnRlbF9jdHJsOworfTsKKworc3RhdGljIHN0cnVjdCB4ODZfcG11IHg4Nl9wbXUgX19yZWFkX21vc3RseTsKKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBjcHVfaHdfY291bnRlcnMsIGNwdV9od19jb3VudGVycykgPSB7CisJLmVuYWJsZWQgPSAxLAorfTsKKworLyoKKyAqIEludGVsIFBlcmZNb24gdjMuIFVzZWQgb24gQ29yZTIgYW5kIGxhdGVyLgorICovCitzdGF0aWMgY29uc3QgdTY0IGludGVsX3BlcmZtb25fZXZlbnRfbWFwW10gPQoreworICBbUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTXQkJPSAweDAwM2MsCisgIFtQRVJGX0NPVU5UX0hXX0lOU1RSVUNUSU9OU10JCT0gMHgwMGMwLAorICBbUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTXQk9IDB4NGYyZSwKKyAgW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTXQkJPSAweDQxMmUsCisgIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlNdCT0gMHgwMGM0LAorICBbUEVSRl9DT1VOVF9IV19CUkFOQ0hfTUlTU0VTXQkJPSAweDAwYzUsCisgIFtQRVJGX0NPVU5UX0hXX0JVU19DWUNMRVNdCQk9IDB4MDEzYywKK307CisKK3N0YXRpYyB1NjQgaW50ZWxfcG11X2V2ZW50X21hcChpbnQgZXZlbnQpCit7CisJcmV0dXJuIGludGVsX3BlcmZtb25fZXZlbnRfbWFwW2V2ZW50XTsKK30KKworLyoKKyAqIEdlbmVyYWxpemVkIGh3IGNhY2hpbmcgcmVsYXRlZCBldmVudCB0YWJsZSwgZmlsbGVkCisgKiBpbiBvbiBhIHBlciBtb2RlbCBiYXNpcy4gQSB2YWx1ZSBvZiAwIG1lYW5zCisgKiAnbm90IHN1cHBvcnRlZCcsIC0xIG1lYW5zICdldmVudCBtYWtlcyBubyBzZW5zZSBvbgorICogdGhpcyBDUFUnLCBhbnkgb3RoZXIgdmFsdWUgbWVhbnMgdGhlIHJhdyBldmVudAorICogSUQuCisgKi8KKworI2RlZmluZSBDKHgpIFBFUkZfQ09VTlRfSFdfQ0FDSEVfIyN4CisKK3N0YXRpYyB1NjQgX19yZWFkX21vc3RseSBod19jYWNoZV9ldmVudF9pZHMKKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVhdOworCitzdGF0aWMgY29uc3QgdTY0IG5laGFsZW1faHdfY2FjaGVfZXZlbnRfaWRzCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYXSA9Cit7CisgWyBDKEwxRCkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDBmNDAsIC8qIEwxRF9DQUNIRV9MRC5NRVNJICAgICAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAxNDAsIC8qIEwxRF9DQUNIRV9MRC5JX1NUQVRFICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDBmNDEsIC8qIEwxRF9DQUNIRV9TVC5NRVNJICAgICAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAxNDEsIC8qIEwxRF9DQUNIRV9TVC5JX1NUQVRFICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAxNGUsIC8qIEwxRF9QUkVGRVRDSC5SRVFVRVNUUyAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAyNGUsIC8qIEwxRF9QUkVGRVRDSC5NSVNTICAgICAgICAgICAgKi8KKwl9LAorIH0sCisgWyBDKEwxSSApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMzgwLCAvKiBMMUkuUkVBRFMgICAgICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMjgwLCAvKiBMMUkuTUlTU0VTICAgICAgICAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MCwKKwl9LAorIH0sCisgWyBDKExMICApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMzI0LCAvKiBMMl9SUVNUUy5MT0FEUyAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMjI0LCAvKiBMMl9SUVNUUy5MRF9NSVNTICAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwYzI0LCAvKiBMMl9SUVNUUy5SRk9TICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwODI0LCAvKiBMMl9SUVNUUy5SRk9fTUlTUyAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg0ZjJlLCAvKiBMTEMgUmVmZXJlbmNlICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHg0MTJlLCAvKiBMTEMgTWlzc2VzICAgICAgICAgICAgICAgICAgICovCisJfSwKKyB9LAorIFsgQyhEVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MGY0MCwgLyogTDFEX0NBQ0hFX0xELk1FU0kgICAoYWxpYXMpICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDEwOCwgLyogRFRMQl9MT0FEX01JU1NFUy5BTlkgICAgICAgICAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MGY0MSwgLyogTDFEX0NBQ0hFX1NULk1FU0kgICAoYWxpYXMpICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDEwYywgLyogTUVNX1NUT1JFX1JFVElSRUQuRFRMQl9NSVNTICAqLworCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAsCisJfSwKKyB9LAorIFsgQyhJVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDFjMCwgLyogSU5TVF9SRVRJUkVELkFOWV9QICAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MjBjOCwgLyogSVRMQl9NSVNTX1JFVElSRUQgICAgICAgICAgICAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisgfSwKKyBbIEMoQlBVICkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAwYzQsIC8qIEJSX0lOU1RfUkVUSVJFRC5BTExfQlJBTkNIRVMgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAzZTgsIC8qIEJQVV9DTEVBUlMuQU5ZICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorIH0sCit9OworCitzdGF0aWMgY29uc3QgdTY0IGNvcmUyX2h3X2NhY2hlX2V2ZW50X2lkcworCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPQoreworIFsgQyhMMUQpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwZjQwLCAvKiBMMURfQ0FDSEVfTEQuTUVTSSAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDE0MCwgLyogTDFEX0NBQ0hFX0xELklfU1RBVEUgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDBmNDEsIC8qIEwxRF9DQUNIRV9TVC5NRVNJICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMTQxLCAvKiBMMURfQ0FDSEVfU1QuSV9TVEFURSAgICAgICAqLworCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MTA0ZSwgLyogTDFEX1BSRUZFVENILlJFUVVFU1RTICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisgfSwKKyBbIEMoTDFJICkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAwODAsIC8qIEwxSS5SRUFEUyAgICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwMDgxLCAvKiBMMUkuTUlTU0VTICAgICAgICAgICAgICAgICAqLworCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IC0xLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IC0xLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKExMICApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg0ZjI5LCAvKiBMMl9MRC5NRVNJICAgICAgICAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4NDEyOSwgLyogTDJfTEQuSVNUQVRFICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDRmMkEsIC8qIEwyX1NULk1FU0kgICAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHg0MTJBLCAvKiBMMl9TVC5JU1RBVEUgICAgICAgICAgICAgICAqLworCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKERUTEIpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwZjQwLCAvKiBMMURfQ0FDSEVfTEQuTUVTSSAgKGFsaWFzKSAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDIwOCwgLyogRFRMQl9NSVNTRVMuTUlTU19MRCAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDBmNDEsIC8qIEwxRF9DQUNIRV9TVC5NRVNJICAoYWxpYXMpICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMHgwODA4LCAvKiBEVExCX01JU1NFUy5NSVNTX1NUICAgICAgICAqLworCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKElUTEIpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMGMwLCAvKiBJTlNUX1JFVElSRUQuQU5ZX1AgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MTI4MiwgLyogSVRMQk1JU1NFUyAgICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorIH0sCisgWyBDKEJQVSApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMGM0LCAvKiBCUl9JTlNUX1JFVElSRUQuQU5ZICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDBjNSwgLyogQlBfSU5TVF9SRVRJUkVELk1JU1BSRUQgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorIH0sCit9OworCitzdGF0aWMgY29uc3QgdTY0IGF0b21faHdfY2FjaGVfZXZlbnRfaWRzCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYXQorCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfTUFYXSA9Cit7CisgWyBDKEwxRCkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDIxNDAsIC8qIEwxRF9DQUNIRS5MRCAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDIyNDAsIC8qIEwxRF9DQUNIRS5TVCAgICAgICAgICAgICAgICovCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAweDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKEwxSSApIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgwMzgwLCAvKiBMMUkuUkVBRFMgICAgICAgICAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDI4MCwgLyogTDFJLk1JU1NFUyAgICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9XUklURSkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAtMSwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAtMSwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhMTCAgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4NGYyOSwgLyogTDJfTEQuTUVTSSAgICAgICAgICAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDQxMjksIC8qIEwyX0xELklTVEFURSAgICAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHg0ZjJBLCAvKiBMMl9TVC5NRVNJICAgICAgICAgICAgICAgICAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4NDEyQSwgLyogTDJfU1QuSVNUQVRFICAgICAgICAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhEVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MjE0MCwgLyogTDFEX0NBQ0hFX0xELk1FU0kgIChhbGlhcykgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDA1MDgsIC8qIERUTEJfTUlTU0VTLk1JU1NfTEQgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMHgyMjQwLCAvKiBMMURfQ0FDSEVfU1QuTUVTSSAgKGFsaWFzKSAqLworCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDB4MDYwOCwgLyogRFRMQl9NSVNTRVMuTUlTU19TVCAgICAgICAgKi8KKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhJVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDBjMCwgLyogSU5TVF9SRVRJUkVELkFOWV9QICAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAyODIsIC8qIElUTEIuTUlTU0VTICAgICAgICAgICAgICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorIFsgQyhCUFUgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDBjNCwgLyogQlJfSU5TVF9SRVRJUkVELkFOWSAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwYzUsIC8qIEJQX0lOU1RfUkVUSVJFRC5NSVNQUkVEICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorfTsKKworc3RhdGljIHU2NCBpbnRlbF9wbXVfcmF3X2V2ZW50KHU2NCBldmVudCkKK3sKKyNkZWZpbmUgQ09SRV9FVk5UU0VMX0VWRU5UX01BU0sJCTB4MDAwMDAwRkZVTEwKKyNkZWZpbmUgQ09SRV9FVk5UU0VMX1VOSVRfTUFTSwkJMHgwMDAwRkYwMFVMTAorI2RlZmluZSBDT1JFX0VWTlRTRUxfRURHRV9NQVNLCQkweDAwMDQwMDAwVUxMCisjZGVmaW5lIENPUkVfRVZOVFNFTF9JTlZfTUFTSwkJMHgwMDgwMDAwMFVMTAorI2RlZmluZSBDT1JFX0VWTlRTRUxfQ09VTlRFUl9NQVNLCTB4RkYwMDAwMDBVTEwKKworI2RlZmluZSBDT1JFX0VWTlRTRUxfTUFTSwkJXAorCShDT1JFX0VWTlRTRUxfRVZFTlRfTUFTSyB8CVwKKwkgQ09SRV9FVk5UU0VMX1VOSVRfTUFTSyAgfAlcCisJIENPUkVfRVZOVFNFTF9FREdFX01BU0sgIHwJXAorCSBDT1JFX0VWTlRTRUxfSU5WX01BU0sgIHwJXAorCSBDT1JFX0VWTlRTRUxfQ09VTlRFUl9NQVNLKQorCisJcmV0dXJuIGV2ZW50ICYgQ09SRV9FVk5UU0VMX01BU0s7Cit9CisKK3N0YXRpYyBjb25zdCB1NjQgYW1kXzBmX2h3X2NhY2hlX2V2ZW50X2lkcworCQkJCVtQRVJGX0NPVU5UX0hXX0NBQ0hFX01BWF0KKwkJCQlbUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVhdCisJCQkJW1BFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWF0gPQoreworIFsgQyhMMUQpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhMMUkgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDA4MCwgLyogSW5zdHJ1Y3Rpb24gY2FjaGUgZmV0Y2hlcyAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwODEsIC8qIEluc3RydWN0aW9uIGNhY2hlIG1pc3NlcyAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisgfSwKKyBbIEMoTEwgICkgXSA9IHsKKwlbIEMoT1BfUkVBRCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisJWyBDKE9QX1BSRUZFVENIKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorIH0sCisgWyBDKERUTEIpIF0gPSB7CisJWyBDKE9QX1JFQUQpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gMCwKKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAwLAorCX0sCisJWyBDKE9QX1dSSVRFKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDAsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gMCwKKwl9LAorCVsgQyhPUF9QUkVGRVRDSCkgXSA9IHsKKwkJWyBDKFJFU1VMVF9BQ0NFU1MpIF0gPSAwLAorCQlbIEMoUkVTVUxUX01JU1MpICAgXSA9IDAsCisJfSwKKyB9LAorIFsgQyhJVExCKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDA4MCwgLyogSW5zdHJ1Y3Rpb24gZmVjdGhlcyAgICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwODUsIC8qIEluc3RyLiBmZXRjaCBJVExCIG1pc3NlcyAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorIFsgQyhCUFUgKSBdID0geworCVsgQyhPUF9SRUFEKSBdID0geworCQlbIEMoUkVTVUxUX0FDQ0VTUykgXSA9IDB4MDBjMiwgLyogUmV0aXJlZCBCcmFuY2ggSW5zdHIuICAgICAgKi8KKwkJWyBDKFJFU1VMVF9NSVNTKSAgIF0gPSAweDAwYzMsIC8qIFJldGlyZWQgTWlzcHJlZGljdGVkIEJJICAgICovCisJfSwKKwlbIEMoT1BfV1JJVEUpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKwlbIEMoT1BfUFJFRkVUQ0gpIF0gPSB7CisJCVsgQyhSRVNVTFRfQUNDRVNTKSBdID0gLTEsCisJCVsgQyhSRVNVTFRfTUlTUykgICBdID0gLTEsCisJfSwKKyB9LAorfTsKKworLyoKKyAqIEFNRCBQZXJmb3JtYW5jZSBNb25pdG9yIEs3IGFuZCBsYXRlci4KKyAqLworc3RhdGljIGNvbnN0IHU2NCBhbWRfcGVyZm1vbl9ldmVudF9tYXBbXSA9Cit7CisgIFtQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVNdCQk9IDB4MDA3NiwKKyAgW1BFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TXQkJPSAweDAwYzAsCisgIFtQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVNdCT0gMHgwMDgwLAorICBbUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVNdCQk9IDB4MDA4MSwKKyAgW1BFUkZfQ09VTlRfSFdfQlJBTkNIX0lOU1RSVUNUSU9OU10JPSAweDAwYzQsCisgIFtQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVNdCQk9IDB4MDBjNSwKK307CisKK3N0YXRpYyB1NjQgYW1kX3BtdV9ldmVudF9tYXAoaW50IGV2ZW50KQoreworCXJldHVybiBhbWRfcGVyZm1vbl9ldmVudF9tYXBbZXZlbnRdOworfQorCitzdGF0aWMgdTY0IGFtZF9wbXVfcmF3X2V2ZW50KHU2NCBldmVudCkKK3sKKyNkZWZpbmUgSzdfRVZOVFNFTF9FVkVOVF9NQVNLCTB4NzAwMDAwMEZGVUxMCisjZGVmaW5lIEs3X0VWTlRTRUxfVU5JVF9NQVNLCTB4MDAwMDBGRjAwVUxMCisjZGVmaW5lIEs3X0VWTlRTRUxfRURHRV9NQVNLCTB4MDAwMDQwMDAwVUxMCisjZGVmaW5lIEs3X0VWTlRTRUxfSU5WX01BU0sJMHgwMDA4MDAwMDBVTEwKKyNkZWZpbmUgSzdfRVZOVFNFTF9DT1VOVEVSX01BU0sJMHgwRkYwMDAwMDBVTEwKKworI2RlZmluZSBLN19FVk5UU0VMX01BU0sJCQlcCisJKEs3X0VWTlRTRUxfRVZFTlRfTUFTSyB8CVwKKwkgSzdfRVZOVFNFTF9VTklUX01BU0sgIHwJXAorCSBLN19FVk5UU0VMX0VER0VfTUFTSyAgfAlcCisJIEs3X0VWTlRTRUxfSU5WX01BU0sgICB8CVwKKwkgSzdfRVZOVFNFTF9DT1VOVEVSX01BU0spCisKKwlyZXR1cm4gZXZlbnQgJiBLN19FVk5UU0VMX01BU0s7Cit9CisKKy8qCisgKiBQcm9wYWdhdGUgY291bnRlciBlbGFwc2VkIHRpbWUgaW50byB0aGUgZ2VuZXJpYyBjb3VudGVyLgorICogQ2FuIG9ubHkgYmUgZXhlY3V0ZWQgb24gdGhlIENQVSB3aGVyZSB0aGUgY291bnRlciBpcyBhY3RpdmUuCisgKiBSZXR1cm5zIHRoZSBkZWx0YSBldmVudHMgcHJvY2Vzc2VkLgorICovCitzdGF0aWMgdTY0Cit4ODZfcGVyZl9jb3VudGVyX3VwZGF0ZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCWludCBzaGlmdCA9IDY0IC0geDg2X3BtdS5jb3VudGVyX2JpdHM7CisJdTY0IHByZXZfcmF3X2NvdW50LCBuZXdfcmF3X2NvdW50OworCXM2NCBkZWx0YTsKKworCS8qCisJICogQ2FyZWZ1bDogYW4gTk1JIG1pZ2h0IG1vZGlmeSB0aGUgcHJldmlvdXMgY291bnRlciB2YWx1ZS4KKwkgKgorCSAqIE91ciB0YWN0aWMgdG8gaGFuZGxlIHRoaXMgaXMgdG8gZmlyc3QgYXRvbWljYWxseSByZWFkIGFuZAorCSAqIGV4Y2hhbmdlIGEgbmV3IHJhdyBjb3VudCAtIHRoZW4gYWRkIHRoYXQgbmV3LXByZXYgZGVsdGEKKwkgKiBjb3VudCB0byB0aGUgZ2VuZXJpYyBjb3VudGVyIGF0b21pY2FsbHk6CisJICovCithZ2FpbjoKKwlwcmV2X3Jhd19jb3VudCA9IGF0b21pYzY0X3JlYWQoJmh3Yy0+cHJldl9jb3VudCk7CisJcmRtc3JsKGh3Yy0+Y291bnRlcl9iYXNlICsgaWR4LCBuZXdfcmF3X2NvdW50KTsKKworCWlmIChhdG9taWM2NF9jbXB4Y2hnKCZod2MtPnByZXZfY291bnQsIHByZXZfcmF3X2NvdW50LAorCQkJCQluZXdfcmF3X2NvdW50KSAhPSBwcmV2X3Jhd19jb3VudCkKKwkJZ290byBhZ2FpbjsKKworCS8qCisJICogTm93IHdlIGhhdmUgdGhlIG5ldyByYXcgdmFsdWUgYW5kIGhhdmUgdXBkYXRlZCB0aGUgcHJldgorCSAqIHRpbWVzdGFtcCBhbHJlYWR5LiBXZSBjYW4gbm93IGNhbGN1bGF0ZSB0aGUgZWxhcHNlZCBkZWx0YQorCSAqIChjb3VudGVyLSl0aW1lIGFuZCBhZGQgdGhhdCB0byB0aGUgZ2VuZXJpYyBjb3VudGVyLgorCSAqCisJICogQ2FyZWZ1bCwgbm90IGFsbCBodyBzaWduLWV4dGVuZHMgYWJvdmUgdGhlIHBoeXNpY2FsIHdpZHRoCisJICogb2YgdGhlIGNvdW50LgorCSAqLworCWRlbHRhID0gKG5ld19yYXdfY291bnQgPDwgc2hpZnQpIC0gKHByZXZfcmF3X2NvdW50IDw8IHNoaWZ0KTsKKwlkZWx0YSA+Pj0gc2hpZnQ7CisKKwlhdG9taWM2NF9hZGQoZGVsdGEsICZjb3VudGVyLT5jb3VudCk7CisJYXRvbWljNjRfc3ViKGRlbHRhLCAmaHdjLT5wZXJpb2RfbGVmdCk7CisKKwlyZXR1cm4gbmV3X3Jhd19jb3VudDsKK30KKworc3RhdGljIGF0b21pY190IGFjdGl2ZV9jb3VudGVyczsKK3N0YXRpYyBERUZJTkVfTVVURVgocG1jX3Jlc2VydmVfbXV0ZXgpOworCitzdGF0aWMgYm9vbCByZXNlcnZlX3BtY19oYXJkd2FyZSh2b2lkKQoreworCWludCBpOworCisJaWYgKG5taV93YXRjaGRvZyA9PSBOTUlfTE9DQUxfQVBJQykKKwkJZGlzYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKworCWZvciAoaSA9IDA7IGkgPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaSsrKSB7CisJCWlmICghcmVzZXJ2ZV9wZXJmY3RyX25taSh4ODZfcG11LnBlcmZjdHIgKyBpKSkKKwkJCWdvdG8gcGVyZmN0cl9mYWlsOworCX0KKworCWZvciAoaSA9IDA7IGkgPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaSsrKSB7CisJCWlmICghcmVzZXJ2ZV9ldm50c2VsX25taSh4ODZfcG11LmV2ZW50c2VsICsgaSkpCisJCQlnb3RvIGV2ZW50c2VsX2ZhaWw7CisJfQorCisJcmV0dXJuIHRydWU7CisKK2V2ZW50c2VsX2ZhaWw6CisJZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQlyZWxlYXNlX2V2bnRzZWxfbm1pKHg4Nl9wbXUuZXZlbnRzZWwgKyBpKTsKKworCWkgPSB4ODZfcG11Lm51bV9jb3VudGVyczsKKworcGVyZmN0cl9mYWlsOgorCWZvciAoaS0tOyBpID49IDA7IGktLSkKKwkJcmVsZWFzZV9wZXJmY3RyX25taSh4ODZfcG11LnBlcmZjdHIgKyBpKTsKKworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCWVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKKworCXJldHVybiBmYWxzZTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9wbWNfaGFyZHdhcmUodm9pZCkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaSsrKSB7CisJCXJlbGVhc2VfcGVyZmN0cl9ubWkoeDg2X3BtdS5wZXJmY3RyICsgaSk7CisJCXJlbGVhc2VfZXZudHNlbF9ubWkoeDg2X3BtdS5ldmVudHNlbCArIGkpOworCX0KKworCWlmIChubWlfd2F0Y2hkb2cgPT0gTk1JX0xPQ0FMX0FQSUMpCisJCWVuYWJsZV9sYXBpY19ubWlfd2F0Y2hkb2coKTsKK30KKworc3RhdGljIHZvaWQgaHdfcGVyZl9jb3VudGVyX2Rlc3Ryb3koc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlpZiAoYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jaygmYWN0aXZlX2NvdW50ZXJzLCAmcG1jX3Jlc2VydmVfbXV0ZXgpKSB7CisJCXJlbGVhc2VfcG1jX2hhcmR3YXJlKCk7CisJCW11dGV4X3VubG9jaygmcG1jX3Jlc2VydmVfbXV0ZXgpOworCX0KK30KKworc3RhdGljIGlubGluZSBpbnQgeDg2X3BtdV9pbml0aWFsaXplZCh2b2lkKQoreworCXJldHVybiB4ODZfcG11LmhhbmRsZV9pcnEgIT0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQKK3NldF9leHRfaHdfYXR0cihzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MsIHN0cnVjdCBwZXJmX2NvdW50ZXJfYXR0ciAqYXR0cikKK3sKKwl1bnNpZ25lZCBpbnQgY2FjaGVfdHlwZSwgY2FjaGVfb3AsIGNhY2hlX3Jlc3VsdDsKKwl1NjQgY29uZmlnLCB2YWw7CisKKwljb25maWcgPSBhdHRyLT5jb25maWc7CisKKwljYWNoZV90eXBlID0gKGNvbmZpZyA+PiAgMCkgJiAweGZmOworCWlmIChjYWNoZV90eXBlID49IFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhY2hlX29wID0gKGNvbmZpZyA+PiAgOCkgJiAweGZmOworCWlmIChjYWNoZV9vcCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwljYWNoZV9yZXN1bHQgPSAoY29uZmlnID4+IDE2KSAmIDB4ZmY7CisJaWYgKGNhY2hlX3Jlc3VsdCA+PSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCisJCXJldHVybiAtRUlOVkFMOworCisJdmFsID0gaHdfY2FjaGVfZXZlbnRfaWRzW2NhY2hlX3R5cGVdW2NhY2hlX29wXVtjYWNoZV9yZXN1bHRdOworCisJaWYgKHZhbCA9PSAwKQorCQlyZXR1cm4gLUVOT0VOVDsKKworCWlmICh2YWwgPT0gLTEpCisJCXJldHVybiAtRUlOVkFMOworCisJaHdjLT5jb25maWcgfD0gdmFsOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBTZXR1cCB0aGUgaGFyZHdhcmUgY29uZmlndXJhdGlvbiBmb3IgYSBnaXZlbiBhdHRyX3R5cGUKKyAqLworc3RhdGljIGludCBfX2h3X3BlcmZfY291bnRlcl9pbml0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyID0gJmNvdW50ZXItPmF0dHI7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCWludCBlcnI7CisKKwlpZiAoIXg4Nl9wbXVfaW5pdGlhbGl6ZWQoKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwllcnIgPSAwOworCWlmICghYXRvbWljX2luY19ub3RfemVybygmYWN0aXZlX2NvdW50ZXJzKSkgeworCQltdXRleF9sb2NrKCZwbWNfcmVzZXJ2ZV9tdXRleCk7CisJCWlmIChhdG9taWNfcmVhZCgmYWN0aXZlX2NvdW50ZXJzKSA9PSAwICYmICFyZXNlcnZlX3BtY19oYXJkd2FyZSgpKQorCQkJZXJyID0gLUVCVVNZOworCQllbHNlCisJCQlhdG9taWNfaW5jKCZhY3RpdmVfY291bnRlcnMpOworCQltdXRleF91bmxvY2soJnBtY19yZXNlcnZlX211dGV4KTsKKwl9CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCS8qCisJICogR2VuZXJhdGUgUE1DIElSUXM6CisJICogKGtlZXAgJ2VuYWJsZWQnIGJpdCBjbGVhciBmb3Igbm93KQorCSAqLworCWh3Yy0+Y29uZmlnID0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVDsKKworCS8qCisJICogQ291bnQgdXNlciBhbmQgT1MgZXZlbnRzIHVubGVzcyByZXF1ZXN0ZWQgbm90IHRvLgorCSAqLworCWlmICghYXR0ci0+ZXhjbHVkZV91c2VyKQorCQlod2MtPmNvbmZpZyB8PSBBUkNIX1BFUkZNT05fRVZFTlRTRUxfVVNSOworCWlmICghYXR0ci0+ZXhjbHVkZV9rZXJuZWwpCisJCWh3Yy0+Y29uZmlnIHw9IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9PUzsKKworCWlmICghaHdjLT5zYW1wbGVfcGVyaW9kKSB7CisJCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IHg4Nl9wbXUubWF4X3BlcmlvZDsKKwkJaHdjLT5sYXN0X3BlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKKwkJYXRvbWljNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBod2MtPnNhbXBsZV9wZXJpb2QpOworCX0KKworCWNvdW50ZXItPmRlc3Ryb3kgPSBod19wZXJmX2NvdW50ZXJfZGVzdHJveTsKKworCS8qCisJICogUmF3IGV2ZW50IHR5cGUgcHJvdmlkZSB0aGUgY29uZmlnIGluIHRoZSBldmVudCBzdHJ1Y3R1cmUKKwkgKi8KKwlpZiAoYXR0ci0+dHlwZSA9PSBQRVJGX1RZUEVfUkFXKSB7CisJCWh3Yy0+Y29uZmlnIHw9IHg4Nl9wbXUucmF3X2V2ZW50KGF0dHItPmNvbmZpZyk7CisJCXJldHVybiAwOworCX0KKworCWlmIChhdHRyLT50eXBlID09IFBFUkZfVFlQRV9IV19DQUNIRSkKKwkJcmV0dXJuIHNldF9leHRfaHdfYXR0cihod2MsIGF0dHIpOworCisJaWYgKGF0dHItPmNvbmZpZyA+PSB4ODZfcG11Lm1heF9ldmVudHMpCisJCXJldHVybiAtRUlOVkFMOworCS8qCisJICogVGhlIGdlbmVyaWMgbWFwOgorCSAqLworCWh3Yy0+Y29uZmlnIHw9IHg4Nl9wbXUuZXZlbnRfbWFwKGF0dHItPmNvbmZpZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaW50ZWxfcG11X2Rpc2FibGVfYWxsKHZvaWQpCit7CisJd3Jtc3JsKE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwsIDApOworfQorCitzdGF0aWMgdm9pZCBhbWRfcG11X2Rpc2FibGVfYWxsKHZvaWQpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJaW50IGlkeDsKKworCWlmICghY3B1Yy0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJY3B1Yy0+ZW5hYmxlZCA9IDA7CisJLyoKKwkgKiBlbnN1cmUgd2Ugd3JpdGUgdGhlIGRpc2FibGUgYmVmb3JlIHdlIHN0YXJ0IGRpc2FibGluZyB0aGUKKwkgKiBjb3VudGVycyBwcm9wZXIsIHNvIHRoYXQgYW1kX3BtdV9lbmFibGVfY291bnRlcigpIGRvZXMgdGhlCisJICogcmlnaHQgdGhpbmcuCisJICovCisJYmFycmllcigpOworCisJZm9yIChpZHggPSAwOyBpZHggPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaWR4KyspIHsKKwkJdTY0IHZhbDsKKworCQlpZiAoIXRlc3RfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spKQorCQkJY29udGludWU7CisJCXJkbXNybChNU1JfSzdfRVZOVFNFTDAgKyBpZHgsIHZhbCk7CisJCWlmICghKHZhbCAmIEFSQ0hfUEVSRk1PTl9FVkVOVFNFTDBfRU5BQkxFKSkKKwkJCWNvbnRpbnVlOworCQl2YWwgJj0gfkFSQ0hfUEVSRk1PTl9FVkVOVFNFTDBfRU5BQkxFOworCQl3cm1zcmwoTVNSX0s3X0VWTlRTRUwwICsgaWR4LCB2YWwpOworCX0KK30KKwordm9pZCBod19wZXJmX2Rpc2FibGUodm9pZCkKK3sKKwlpZiAoIXg4Nl9wbXVfaW5pdGlhbGl6ZWQoKSkKKwkJcmV0dXJuOworCXJldHVybiB4ODZfcG11LmRpc2FibGVfYWxsKCk7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3BtdV9lbmFibGVfYWxsKHZvaWQpCit7CisJd3Jtc3JsKE1TUl9DT1JFX1BFUkZfR0xPQkFMX0NUUkwsIHg4Nl9wbXUuaW50ZWxfY3RybCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9wbXVfZW5hYmxlX2FsbCh2b2lkKQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCWludCBpZHg7CisKKwlpZiAoY3B1Yy0+ZW5hYmxlZCkKKwkJcmV0dXJuOworCisJY3B1Yy0+ZW5hYmxlZCA9IDE7CisJYmFycmllcigpOworCisJZm9yIChpZHggPSAwOyBpZHggPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaWR4KyspIHsKKwkJdTY0IHZhbDsKKworCQlpZiAoIXRlc3RfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spKQorCQkJY29udGludWU7CisJCXJkbXNybChNU1JfSzdfRVZOVFNFTDAgKyBpZHgsIHZhbCk7CisJCWlmICh2YWwgJiBBUkNIX1BFUkZNT05fRVZFTlRTRUwwX0VOQUJMRSkKKwkJCWNvbnRpbnVlOworCQl2YWwgfD0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEU7CisJCXdybXNybChNU1JfSzdfRVZOVFNFTDAgKyBpZHgsIHZhbCk7CisJfQorfQorCit2b2lkIGh3X3BlcmZfZW5hYmxlKHZvaWQpCit7CisJaWYgKCF4ODZfcG11X2luaXRpYWxpemVkKCkpCisJCXJldHVybjsKKwl4ODZfcG11LmVuYWJsZV9hbGwoKTsKK30KKworc3RhdGljIGlubGluZSB1NjQgaW50ZWxfcG11X2dldF9zdGF0dXModm9pZCkKK3sKKwl1NjQgc3RhdHVzOworCisJcmRtc3JsKE1TUl9DT1JFX1BFUkZfR0xPQkFMX1NUQVRVUywgc3RhdHVzKTsKKworCXJldHVybiBzdGF0dXM7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbnRlbF9wbXVfYWNrX3N0YXR1cyh1NjQgYWNrKQoreworCXdybXNybChNU1JfQ09SRV9QRVJGX0dMT0JBTF9PVkZfQ1RSTCwgYWNrKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHg4Nl9wbXVfZW5hYmxlX2NvdW50ZXIoc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCWludCBlcnI7CisJZXJyID0gY2hlY2tpbmdfd3Jtc3JsKGh3Yy0+Y29uZmlnX2Jhc2UgKyBpZHgsCisJCQkgICAgICBod2MtPmNvbmZpZyB8IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTDBfRU5BQkxFKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHg4Nl9wbXVfZGlzYWJsZV9jb3VudGVyKHN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YywgaW50IGlkeCkKK3sKKwlpbnQgZXJyOworCWVyciA9IGNoZWNraW5nX3dybXNybChod2MtPmNvbmZpZ19iYXNlICsgaWR4LAorCQkJICAgICAgaHdjLT5jb25maWcpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2ludGVsX3BtdV9kaXNhYmxlX2ZpeGVkKHN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YywgaW50IF9faWR4KQoreworCWludCBpZHggPSBfX2lkeCAtIFg4Nl9QTUNfSURYX0ZJWEVEOworCXU2NCBjdHJsX3ZhbCwgbWFzazsKKwlpbnQgZXJyOworCisJbWFzayA9IDB4ZlVMTCA8PCAoaWR4ICogNCk7CisKKwlyZG1zcmwoaHdjLT5jb25maWdfYmFzZSwgY3RybF92YWwpOworCWN0cmxfdmFsICY9IH5tYXNrOworCWVyciA9IGNoZWNraW5nX3dybXNybChod2MtPmNvbmZpZ19iYXNlLCBjdHJsX3ZhbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW50ZWxfcG11X2Rpc2FibGVfY291bnRlcihzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MsIGludCBpZHgpCit7CisJaWYgKHVubGlrZWx5KGh3Yy0+Y29uZmlnX2Jhc2UgPT0gTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFJfQ1RSTCkpIHsKKwkJaW50ZWxfcG11X2Rpc2FibGVfZml4ZWQoaHdjLCBpZHgpOworCQlyZXR1cm47CisJfQorCisJeDg2X3BtdV9kaXNhYmxlX2NvdW50ZXIoaHdjLCBpZHgpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK2FtZF9wbXVfZGlzYWJsZV9jb3VudGVyKHN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YywgaW50IGlkeCkKK3sKKwl4ODZfcG11X2Rpc2FibGVfY291bnRlcihod2MsIGlkeCk7Cit9CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVSh1NjQsIHByZXZfbGVmdFtYODZfUE1DX0lEWF9NQVhdKTsKKworLyoKKyAqIFNldCB0aGUgbmV4dCBJUlEgcGVyaW9kLCBiYXNlZCBvbiB0aGUgaHdjLT5wZXJpb2RfbGVmdCB2YWx1ZS4KKyAqIFRvIGJlIGNhbGxlZCB3aXRoIHRoZSBjb3VudGVyIGRpc2FibGVkIGluIGh3OgorICovCitzdGF0aWMgaW50Cit4ODZfcGVyZl9jb3VudGVyX3NldF9wZXJpb2Qoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCSAgICAgc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCXM2NCBsZWZ0ID0gYXRvbWljNjRfcmVhZCgmaHdjLT5wZXJpb2RfbGVmdCk7CisJczY0IHBlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZDsKKwlpbnQgZXJyLCByZXQgPSAwOworCisJLyoKKwkgKiBJZiB3ZSBhcmUgd2F5IG91dHNpZGUgYSByZWFzb2FibGUgcmFuZ2UgdGhlbiBqdXN0IHNraXAgZm9yd2FyZDoKKwkgKi8KKwlpZiAodW5saWtlbHkobGVmdCA8PSAtcGVyaW9kKSkgeworCQlsZWZ0ID0gcGVyaW9kOworCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOworCQlyZXQgPSAxOworCX0KKworCWlmICh1bmxpa2VseShsZWZ0IDw9IDApKSB7CisJCWxlZnQgKz0gcGVyaW9kOworCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOworCQlyZXQgPSAxOworCX0KKwkvKgorCSAqIFF1aXJrOiBjZXJ0YWluIENQVXMgZG9udCBsaWtlIGl0IGlmIGp1c3QgMSBldmVudCBpcyBsZWZ0OgorCSAqLworCWlmICh1bmxpa2VseShsZWZ0IDwgMikpCisJCWxlZnQgPSAyOworCisJaWYgKGxlZnQgPiB4ODZfcG11Lm1heF9wZXJpb2QpCisJCWxlZnQgPSB4ODZfcG11Lm1heF9wZXJpb2Q7CisKKwlwZXJfY3B1KHByZXZfbGVmdFtpZHhdLCBzbXBfcHJvY2Vzc29yX2lkKCkpID0gbGVmdDsKKworCS8qCisJICogVGhlIGh3IGNvdW50ZXIgc3RhcnRzIGNvdW50aW5nIGZyb20gdGhpcyBjb3VudGVyIG9mZnNldCwKKwkgKiBtYXJrIGl0IHRvIGJlIGFibGUgdG8gZXh0cmEgZnV0dXJlIGRlbHRhczoKKwkgKi8KKwlhdG9taWM2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgKHU2NCktbGVmdCk7CisKKwllcnIgPSBjaGVja2luZ193cm1zcmwoaHdjLT5jb3VudGVyX2Jhc2UgKyBpZHgsCisJCQkgICAgICh1NjQpKC1sZWZ0KSAmIHg4Nl9wbXUuY291bnRlcl9tYXNrKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAoraW50ZWxfcG11X2VuYWJsZV9maXhlZChzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MsIGludCBfX2lkeCkKK3sKKwlpbnQgaWR4ID0gX19pZHggLSBYODZfUE1DX0lEWF9GSVhFRDsKKwl1NjQgY3RybF92YWwsIGJpdHMsIG1hc2s7CisJaW50IGVycjsKKworCS8qCisJICogRW5hYmxlIElSUSBnZW5lcmF0aW9uICgweDgpLAorCSAqIGFuZCBlbmFibGUgcmluZy0zIGNvdW50aW5nICgweDIpIGFuZCByaW5nLTAgY291bnRpbmcgKDB4MSkKKwkgKiBpZiByZXF1ZXN0ZWQ6CisJICovCisJYml0cyA9IDB4OFVMTDsKKwlpZiAoaHdjLT5jb25maWcgJiBBUkNIX1BFUkZNT05fRVZFTlRTRUxfVVNSKQorCQliaXRzIHw9IDB4MjsKKwlpZiAoaHdjLT5jb25maWcgJiBBUkNIX1BFUkZNT05fRVZFTlRTRUxfT1MpCisJCWJpdHMgfD0gMHgxOworCWJpdHMgPDw9IChpZHggKiA0KTsKKwltYXNrID0gMHhmVUxMIDw8IChpZHggKiA0KTsKKworCXJkbXNybChod2MtPmNvbmZpZ19iYXNlLCBjdHJsX3ZhbCk7CisJY3RybF92YWwgJj0gfm1hc2s7CisJY3RybF92YWwgfD0gYml0czsKKwllcnIgPSBjaGVja2luZ193cm1zcmwoaHdjLT5jb25maWdfYmFzZSwgY3RybF92YWwpOworfQorCitzdGF0aWMgdm9pZCBpbnRlbF9wbXVfZW5hYmxlX2NvdW50ZXIoc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCWlmICh1bmxpa2VseShod2MtPmNvbmZpZ19iYXNlID09IE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSX0NUUkwpKSB7CisJCWludGVsX3BtdV9lbmFibGVfZml4ZWQoaHdjLCBpZHgpOworCQlyZXR1cm47CisJfQorCisJeDg2X3BtdV9lbmFibGVfY291bnRlcihod2MsIGlkeCk7Cit9CisKK3N0YXRpYyB2b2lkIGFtZF9wbXVfZW5hYmxlX2NvdW50ZXIoc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjLCBpbnQgaWR4KQoreworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWMgPSAmX19nZXRfY3B1X3ZhcihjcHVfaHdfY291bnRlcnMpOworCisJaWYgKGNwdWMtPmVuYWJsZWQpCisJCXg4Nl9wbXVfZW5hYmxlX2NvdW50ZXIoaHdjLCBpZHgpOworCWVsc2UKKwkJeDg2X3BtdV9kaXNhYmxlX2NvdW50ZXIoaHdjLCBpZHgpOworfQorCitzdGF0aWMgaW50CitmaXhlZF9tb2RlX2lkeChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MpCit7CisJdW5zaWduZWQgaW50IGV2ZW50OworCisJaWYgKCF4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZCkKKwkJcmV0dXJuIC0xOworCisJZXZlbnQgPSBod2MtPmNvbmZpZyAmIEFSQ0hfUEVSRk1PTl9FVkVOVF9NQVNLOworCisJaWYgKHVubGlrZWx5KGV2ZW50ID09IHg4Nl9wbXUuZXZlbnRfbWFwKFBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TKSkpCisJCXJldHVybiBYODZfUE1DX0lEWF9GSVhFRF9JTlNUUlVDVElPTlM7CisJaWYgKHVubGlrZWx5KGV2ZW50ID09IHg4Nl9wbXUuZXZlbnRfbWFwKFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUykpKQorCQlyZXR1cm4gWDg2X1BNQ19JRFhfRklYRURfQ1BVX0NZQ0xFUzsKKwlpZiAodW5saWtlbHkoZXZlbnQgPT0geDg2X3BtdS5ldmVudF9tYXAoUEVSRl9DT1VOVF9IV19CVVNfQ1lDTEVTKSkpCisJCXJldHVybiBYODZfUE1DX0lEWF9GSVhFRF9CVVNfQ1lDTEVTOworCisJcmV0dXJuIC0xOworfQorCisvKgorICogRmluZCBhIFBNQyBzbG90IGZvciB0aGUgZnJlc2hseSBlbmFibGVkIC8gc2NoZWR1bGVkIGluIGNvdW50ZXI6CisgKi8KK3N0YXRpYyBpbnQgeDg2X3BtdV9lbmFibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVjID0gJl9fZ2V0X2NwdV92YXIoY3B1X2h3X2NvdW50ZXJzKTsKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MgPSAmY291bnRlci0+aHc7CisJaW50IGlkeDsKKworCWlkeCA9IGZpeGVkX21vZGVfaWR4KGNvdW50ZXIsIGh3Yyk7CisJaWYgKGlkeCA+PSAwKSB7CisJCS8qCisJCSAqIFRyeSB0byBnZXQgdGhlIGZpeGVkIGNvdW50ZXIsIGlmIHRoYXQgaXMgYWxyZWFkeSB0YWtlbgorCQkgKiB0aGVuIHRyeSB0byBnZXQgYSBnZW5lcmljIGNvdW50ZXI6CisJCSAqLworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzaykpCisJCQlnb3RvIHRyeV9nZW5lcmljOworCisJCWh3Yy0+Y29uZmlnX2Jhc2UgPSBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUl9DVFJMOworCQkvKgorCQkgKiBXZSBzZXQgaXQgc28gdGhhdCBjb3VudGVyX2Jhc2UgKyBpZHggaW4gd3Jtc3IvcmRtc3IgbWFwcyB0bworCQkgKiBNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUjAgLi4uIENUUjI6CisJCSAqLworCQlod2MtPmNvdW50ZXJfYmFzZSA9CisJCQlNU1JfQVJDSF9QRVJGTU9OX0ZJWEVEX0NUUjAgLSBYODZfUE1DX0lEWF9GSVhFRDsKKwkJaHdjLT5pZHggPSBpZHg7CisJfSBlbHNlIHsKKwkJaWR4ID0gaHdjLT5pZHg7CisJCS8qIFRyeSB0byBnZXQgdGhlIHByZXZpb3VzIGdlbmVyaWMgY291bnRlciBhZ2FpbiAqLworCQlpZiAodGVzdF9hbmRfc2V0X2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzaykpIHsKK3RyeV9nZW5lcmljOgorCQkJaWR4ID0gZmluZF9maXJzdF96ZXJvX2JpdChjcHVjLT51c2VkX21hc2ssCisJCQkJCQkgIHg4Nl9wbXUubnVtX2NvdW50ZXJzKTsKKwkJCWlmIChpZHggPT0geDg2X3BtdS5udW1fY291bnRlcnMpCisJCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJCXNldF9iaXQoaWR4LCBjcHVjLT51c2VkX21hc2spOworCQkJaHdjLT5pZHggPSBpZHg7CisJCX0KKwkJaHdjLT5jb25maWdfYmFzZSAgPSB4ODZfcG11LmV2ZW50c2VsOworCQlod2MtPmNvdW50ZXJfYmFzZSA9IHg4Nl9wbXUucGVyZmN0cjsKKwl9CisKKwlwZXJmX2NvdW50ZXJzX2xhcGljX2luaXQoKTsKKworCXg4Nl9wbXUuZGlzYWJsZShod2MsIGlkeCk7CisKKwljcHVjLT5jb3VudGVyc1tpZHhdID0gY291bnRlcjsKKwlzZXRfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spOworCisJeDg2X3BlcmZfY291bnRlcl9zZXRfcGVyaW9kKGNvdW50ZXIsIGh3YywgaWR4KTsKKwl4ODZfcG11LmVuYWJsZShod2MsIGlkeCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgeDg2X3BtdV91bnRocm90dGxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCisJaWYgKFdBUk5fT05fT05DRShod2MtPmlkeCA+PSBYODZfUE1DX0lEWF9NQVggfHwKKwkJCQljcHVjLT5jb3VudGVyc1tod2MtPmlkeF0gIT0gY291bnRlcikpCisJCXJldHVybjsKKworCXg4Nl9wbXUuZW5hYmxlKGh3YywgaHdjLT5pZHgpOworfQorCit2b2lkIHBlcmZfY291bnRlcl9wcmludF9kZWJ1Zyh2b2lkKQoreworCXU2NCBjdHJsLCBzdGF0dXMsIG92ZXJmbG93LCBwbWNfY3RybCwgcG1jX2NvdW50LCBwcmV2X2xlZnQsIGZpeGVkOworCXN0cnVjdCBjcHVfaHdfY291bnRlcnMgKmNwdWM7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY3B1LCBpZHg7CisKKwlpZiAoIXg4Nl9wbXUubnVtX2NvdW50ZXJzKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisJY3B1YyA9ICZwZXJfY3B1KGNwdV9od19jb3VudGVycywgY3B1KTsKKworCWlmICh4ODZfcG11LnZlcnNpb24gPj0gMikgeworCQlyZG1zcmwoTVNSX0NPUkVfUEVSRl9HTE9CQUxfQ1RSTCwgY3RybCk7CisJCXJkbXNybChNU1JfQ09SRV9QRVJGX0dMT0JBTF9TVEFUVVMsIHN0YXR1cyk7CisJCXJkbXNybChNU1JfQ09SRV9QRVJGX0dMT0JBTF9PVkZfQ1RSTCwgb3ZlcmZsb3cpOworCQlyZG1zcmwoTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFJfQ1RSTCwgZml4ZWQpOworCisJCXByX2luZm8oIlxuIik7CisJCXByX2luZm8oIkNQVSMlZDogY3RybDogICAgICAgJTAxNmxseFxuIiwgY3B1LCBjdHJsKTsKKwkJcHJfaW5mbygiQ1BVIyVkOiBzdGF0dXM6ICAgICAlMDE2bGx4XG4iLCBjcHUsIHN0YXR1cyk7CisJCXByX2luZm8oIkNQVSMlZDogb3ZlcmZsb3c6ICAgJTAxNmxseFxuIiwgY3B1LCBvdmVyZmxvdyk7CisJCXByX2luZm8oIkNQVSMlZDogZml4ZWQ6ICAgICAgJTAxNmxseFxuIiwgY3B1LCBmaXhlZCk7CisJfQorCXByX2luZm8oIkNQVSMlZDogdXNlZDogICAgICAgJTAxNmxseFxuIiwgY3B1LCAqKHU2NCAqKWNwdWMtPnVzZWRfbWFzayk7CisKKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHg4Nl9wbXUubnVtX2NvdW50ZXJzOyBpZHgrKykgeworCQlyZG1zcmwoeDg2X3BtdS5ldmVudHNlbCArIGlkeCwgcG1jX2N0cmwpOworCQlyZG1zcmwoeDg2X3BtdS5wZXJmY3RyICArIGlkeCwgcG1jX2NvdW50KTsKKworCQlwcmV2X2xlZnQgPSBwZXJfY3B1KHByZXZfbGVmdFtpZHhdLCBjcHUpOworCisJCXByX2luZm8oIkNQVSMlZDogICBnZW4tUE1DJWQgY3RybDogICUwMTZsbHhcbiIsCisJCQljcHUsIGlkeCwgcG1jX2N0cmwpOworCQlwcl9pbmZvKCJDUFUjJWQ6ICAgZ2VuLVBNQyVkIGNvdW50OiAlMDE2bGx4XG4iLAorCQkJY3B1LCBpZHgsIHBtY19jb3VudCk7CisJCXByX2luZm8oIkNQVSMlZDogICBnZW4tUE1DJWQgbGVmdDogICUwMTZsbHhcbiIsCisJCQljcHUsIGlkeCwgcHJldl9sZWZ0KTsKKwl9CisJZm9yIChpZHggPSAwOyBpZHggPCB4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZDsgaWR4KyspIHsKKwkJcmRtc3JsKE1TUl9BUkNIX1BFUkZNT05fRklYRURfQ1RSMCArIGlkeCwgcG1jX2NvdW50KTsKKworCQlwcl9pbmZvKCJDUFUjJWQ6IGZpeGVkLVBNQyVkIGNvdW50OiAlMDE2bGx4XG4iLAorCQkJY3B1LCBpZHgsIHBtY19jb3VudCk7CisJfQorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHZvaWQgeDg2X3BtdV9kaXNhYmxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGNwdV9od19jb3VudGVycyAqY3B1YyA9ICZfX2dldF9jcHVfdmFyKGNwdV9od19jb3VudGVycyk7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCWludCBpZHggPSBod2MtPmlkeDsKKworCS8qCisJICogTXVzdCBiZSBkb25lIGJlZm9yZSB3ZSBkaXNhYmxlLCBvdGhlcndpc2UgdGhlIG5taSBoYW5kbGVyCisJICogY291bGQgcmVlbmFibGUgYWdhaW46CisJICovCisJY2xlYXJfYml0KGlkeCwgY3B1Yy0+YWN0aXZlX21hc2spOworCXg4Nl9wbXUuZGlzYWJsZShod2MsIGlkeCk7CisKKwkvKgorCSAqIE1ha2Ugc3VyZSB0aGUgY2xlYXJlZCBwb2ludGVyIGJlY29tZXMgdmlzaWJsZSBiZWZvcmUgd2UKKwkgKiAocG90ZW50aWFsbHkpIGZyZWUgdGhlIGNvdW50ZXI6CisJICovCisJYmFycmllcigpOworCisJLyoKKwkgKiBEcmFpbiB0aGUgcmVtYWluaW5nIGRlbHRhIGNvdW50IG91dCBvZiBhIGNvdW50ZXIKKwkgKiB0aGF0IHdlIGFyZSBkaXNhYmxpbmc6CisJICovCisJeDg2X3BlcmZfY291bnRlcl91cGRhdGUoY291bnRlciwgaHdjLCBpZHgpOworCWNwdWMtPmNvdW50ZXJzW2lkeF0gPSBOVUxMOworCWNsZWFyX2JpdChpZHgsIGNwdWMtPnVzZWRfbWFzayk7Cit9CisKKy8qCisgKiBTYXZlIGFuZCByZXN0YXJ0IGFuIGV4cGlyZWQgY291bnRlci4gQ2FsbGVkIGJ5IE5NSSBjb250ZXh0cywKKyAqIHNvIGl0IGhhcyB0byBiZSBjYXJlZnVsIGFib3V0IHByZWVtcHRpbmcgbm9ybWFsIGNvdW50ZXIgb3BzOgorICovCitzdGF0aWMgaW50IGludGVsX3BtdV9zYXZlX2FuZF9yZXN0YXJ0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCWludCBpZHggPSBod2MtPmlkeDsKKwlpbnQgcmV0OworCisJeDg2X3BlcmZfY291bnRlcl91cGRhdGUoY291bnRlciwgaHdjLCBpZHgpOworCXJldCA9IHg4Nl9wZXJmX2NvdW50ZXJfc2V0X3BlcmlvZChjb3VudGVyLCBod2MsIGlkeCk7CisKKwlpZiAoY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRSkKKwkJaW50ZWxfcG11X2VuYWJsZV9jb3VudGVyKGh3YywgaWR4KTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIGludGVsX3BtdV9yZXNldCh2b2lkKQoreworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGlkeDsKKworCWlmICgheDg2X3BtdS5udW1fY291bnRlcnMpCisJCXJldHVybjsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKworCXByaW50aygiY2xlYXJpbmcgUE1VIHN0YXRlIG9uIENQVSMlZFxuIiwgc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCWZvciAoaWR4ID0gMDsgaWR4IDwgeDg2X3BtdS5udW1fY291bnRlcnM7IGlkeCsrKSB7CisJCWNoZWNraW5nX3dybXNybCh4ODZfcG11LmV2ZW50c2VsICsgaWR4LCAwdWxsKTsKKwkJY2hlY2tpbmdfd3Jtc3JsKHg4Nl9wbXUucGVyZmN0ciAgKyBpZHgsIDB1bGwpOworCX0KKwlmb3IgKGlkeCA9IDA7IGlkeCA8IHg4Nl9wbXUubnVtX2NvdW50ZXJzX2ZpeGVkOyBpZHgrKykgeworCQljaGVja2luZ193cm1zcmwoTVNSX0FSQ0hfUEVSRk1PTl9GSVhFRF9DVFIwICsgaWR4LCAwdWxsKTsKKwl9CisKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Cit9CisKKworLyoKKyAqIFRoaXMgaGFuZGxlciBpcyB0cmlnZ2VyZWQgYnkgdGhlIGxvY2FsIEFQSUMsIHNvIHRoZSBBUElDIElSUSBoYW5kbGluZworICogcnVsZXMgYXBwbHk6CisgKi8KK3N0YXRpYyBpbnQgaW50ZWxfcG11X2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVjOworCWludCBiaXQsIGNwdSwgbG9vcHM7CisJdTY0IGFjaywgc3RhdHVzOworCisJZGF0YS5yZWdzID0gcmVnczsKKwlkYXRhLmFkZHIgPSAwOworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWNwdWMgPSAmcGVyX2NwdShjcHVfaHdfY291bnRlcnMsIGNwdSk7CisKKwlwZXJmX2Rpc2FibGUoKTsKKwlzdGF0dXMgPSBpbnRlbF9wbXVfZ2V0X3N0YXR1cygpOworCWlmICghc3RhdHVzKSB7CisJCXBlcmZfZW5hYmxlKCk7CisJCXJldHVybiAwOworCX0KKworCWxvb3BzID0gMDsKK2FnYWluOgorCWlmICgrK2xvb3BzID4gMTAwKSB7CisJCVdBUk5fT05DRSgxLCAicGVyZmNvdW50ZXJzOiBpcnEgbG9vcCBzdHVjayFcbiIpOworCQlwZXJmX2NvdW50ZXJfcHJpbnRfZGVidWcoKTsKKwkJaW50ZWxfcG11X3Jlc2V0KCk7CisJCXBlcmZfZW5hYmxlKCk7CisJCXJldHVybiAxOworCX0KKworCWluY19pcnFfc3RhdChhcGljX3BlcmZfaXJxcyk7CisJYWNrID0gc3RhdHVzOworCWZvcl9lYWNoX2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopJnN0YXR1cywgWDg2X1BNQ19JRFhfTUFYKSB7CisJCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBjcHVjLT5jb3VudGVyc1tiaXRdOworCisJCWNsZWFyX2JpdChiaXQsICh1bnNpZ25lZCBsb25nICopICZzdGF0dXMpOworCQlpZiAoIXRlc3RfYml0KGJpdCwgY3B1Yy0+YWN0aXZlX21hc2spKQorCQkJY29udGludWU7CisKKwkJaWYgKCFpbnRlbF9wbXVfc2F2ZV9hbmRfcmVzdGFydChjb3VudGVyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwZXJmX2NvdW50ZXJfb3ZlcmZsb3coY291bnRlciwgMSwgJmRhdGEpKQorCQkJaW50ZWxfcG11X2Rpc2FibGVfY291bnRlcigmY291bnRlci0+aHcsIGJpdCk7CisJfQorCisJaW50ZWxfcG11X2Fja19zdGF0dXMoYWNrKTsKKworCS8qCisJICogUmVwZWF0IGlmIHRoZXJlIGlzIG1vcmUgd29yayB0byBiZSBkb25lOgorCSAqLworCXN0YXR1cyA9IGludGVsX3BtdV9nZXRfc3RhdHVzKCk7CisJaWYgKHN0YXR1cykKKwkJZ290byBhZ2FpbjsKKworCXBlcmZfZW5hYmxlKCk7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGludCBhbWRfcG11X2hhbmRsZV9pcnEoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgZGF0YTsKKwlzdHJ1Y3QgY3B1X2h3X2NvdW50ZXJzICpjcHVjOworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjOworCWludCBjcHUsIGlkeCwgaGFuZGxlZCA9IDA7CisJdTY0IHZhbDsKKworCWRhdGEucmVncyA9IHJlZ3M7CisJZGF0YS5hZGRyID0gMDsKKworCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwljcHVjID0gJnBlcl9jcHUoY3B1X2h3X2NvdW50ZXJzLCBjcHUpOworCisJZm9yIChpZHggPSAwOyBpZHggPCB4ODZfcG11Lm51bV9jb3VudGVyczsgaWR4KyspIHsKKwkJaWYgKCF0ZXN0X2JpdChpZHgsIGNwdWMtPmFjdGl2ZV9tYXNrKSkKKwkJCWNvbnRpbnVlOworCisJCWNvdW50ZXIgPSBjcHVjLT5jb3VudGVyc1tpZHhdOworCQlod2MgPSAmY291bnRlci0+aHc7CisKKwkJdmFsID0geDg2X3BlcmZfY291bnRlcl91cGRhdGUoY291bnRlciwgaHdjLCBpZHgpOworCQlpZiAodmFsICYgKDFVTEwgPDwgKHg4Nl9wbXUuY291bnRlcl9iaXRzIC0gMSkpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogY291bnRlciBvdmVyZmxvdworCQkgKi8KKwkJaGFuZGxlZAkJPSAxOworCQlkYXRhLnBlcmlvZAk9IGNvdW50ZXItPmh3Lmxhc3RfcGVyaW9kOworCisJCWlmICgheDg2X3BlcmZfY291bnRlcl9zZXRfcGVyaW9kKGNvdW50ZXIsIGh3YywgaWR4KSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChwZXJmX2NvdW50ZXJfb3ZlcmZsb3coY291bnRlciwgMSwgJmRhdGEpKQorCQkJYW1kX3BtdV9kaXNhYmxlX2NvdW50ZXIoaHdjLCBpZHgpOworCX0KKworCWlmIChoYW5kbGVkKQorCQlpbmNfaXJxX3N0YXQoYXBpY19wZXJmX2lycXMpOworCisJcmV0dXJuIGhhbmRsZWQ7Cit9CisKK3ZvaWQgc21wX3BlcmZfcGVuZGluZ19pbnRlcnJ1cHQoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJaXJxX2VudGVyKCk7CisJYWNrX0FQSUNfaXJxKCk7CisJaW5jX2lycV9zdGF0KGFwaWNfcGVuZGluZ19pcnFzKTsKKwlwZXJmX2NvdW50ZXJfZG9fcGVuZGluZygpOworCWlycV9leGl0KCk7Cit9CisKK3ZvaWQgc2V0X3BlcmZfY291bnRlcl9wZW5kaW5nKHZvaWQpCit7CisJYXBpYy0+c2VuZF9JUElfc2VsZihMT0NBTF9QRU5ESU5HX1ZFQ1RPUik7Cit9CisKK3ZvaWQgcGVyZl9jb3VudGVyc19sYXBpY19pbml0KHZvaWQpCit7CisJaWYgKCF4ODZfcG11X2luaXRpYWxpemVkKCkpCisJCXJldHVybjsKKworCS8qCisJICogQWx3YXlzIHVzZSBOTUkgZm9yIFBNVQorCSAqLworCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgQVBJQ19ETV9OTUkpOworfQorCitzdGF0aWMgaW50IF9fa3Byb2JlcworcGVyZl9jb3VudGVyX25taV9oYW5kbGVyKHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCSB1bnNpZ25lZCBsb25nIGNtZCwgdm9pZCAqX19hcmdzKQoreworCXN0cnVjdCBkaWVfYXJncyAqYXJncyA9IF9fYXJnczsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKworCWlmICghYXRvbWljX3JlYWQoJmFjdGl2ZV9jb3VudGVycykpCisJCXJldHVybiBOT1RJRllfRE9ORTsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBESUVfTk1JOgorCWNhc2UgRElFX05NSV9JUEk6CisJCWJyZWFrOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIE5PVElGWV9ET05FOworCX0KKworCXJlZ3MgPSBhcmdzLT5yZWdzOworCisJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CisJLyoKKwkgKiBDYW4ndCByZWx5IG9uIHRoZSBoYW5kbGVkIHJldHVybiB2YWx1ZSB0byBzYXkgaXQgd2FzIG91ciBOTUksIHR3bworCSAqIGNvdW50ZXJzIGNvdWxkIHRyaWdnZXIgJ3NpbXVsdGFuZW91c2x5JyByYWlzaW5nIHR3byBiYWNrLXRvLWJhY2sgTk1Jcy4KKwkgKgorCSAqIElmIHRoZSBmaXJzdCBOTUkgaGFuZGxlcyBib3RoLCB0aGUgbGF0dGVyIHdpbGwgYmUgZW1wdHkgYW5kIGRhemUKKwkgKiB0aGUgQ1BVLgorCSAqLworCXg4Nl9wbXUuaGFuZGxlX2lycShyZWdzKTsKKworCXJldHVybiBOT1RJRllfU1RPUDsKK30KKworc3RhdGljIF9fcmVhZF9tb3N0bHkgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHBlcmZfY291bnRlcl9ubWlfbm90aWZpZXIgPSB7CisJLm5vdGlmaWVyX2NhbGwJCT0gcGVyZl9jb3VudGVyX25taV9oYW5kbGVyLAorCS5uZXh0CQkJPSBOVUxMLAorCS5wcmlvcml0eQkJPSAxCit9OworCitzdGF0aWMgc3RydWN0IHg4Nl9wbXUgaW50ZWxfcG11ID0geworCS5uYW1lCQkJPSAiSW50ZWwiLAorCS5oYW5kbGVfaXJxCQk9IGludGVsX3BtdV9oYW5kbGVfaXJxLAorCS5kaXNhYmxlX2FsbAkJPSBpbnRlbF9wbXVfZGlzYWJsZV9hbGwsCisJLmVuYWJsZV9hbGwJCT0gaW50ZWxfcG11X2VuYWJsZV9hbGwsCisJLmVuYWJsZQkJCT0gaW50ZWxfcG11X2VuYWJsZV9jb3VudGVyLAorCS5kaXNhYmxlCQk9IGludGVsX3BtdV9kaXNhYmxlX2NvdW50ZXIsCisJLmV2ZW50c2VsCQk9IE1TUl9BUkNIX1BFUkZNT05fRVZFTlRTRUwwLAorCS5wZXJmY3RyCQk9IE1TUl9BUkNIX1BFUkZNT05fUEVSRkNUUjAsCisJLmV2ZW50X21hcAkJPSBpbnRlbF9wbXVfZXZlbnRfbWFwLAorCS5yYXdfZXZlbnQJCT0gaW50ZWxfcG11X3Jhd19ldmVudCwKKwkubWF4X2V2ZW50cwkJPSBBUlJBWV9TSVpFKGludGVsX3BlcmZtb25fZXZlbnRfbWFwKSwKKwkvKgorCSAqIEludGVsIFBNQ3MgY2Fubm90IGJlIGFjY2Vzc2VkIHNhbmVseSBhYm92ZSAzMiBiaXQgd2lkdGgsCisJICogc28gd2UgaW5zdGFsbCBhbiBhcnRpZmljaWFsIDE8PDMxIHBlcmlvZCByZWdhcmRsZXNzIG9mCisJICogdGhlIGdlbmVyaWMgY291bnRlciBwZXJpb2Q6CisJICovCisJLm1heF9wZXJpb2QJCT0gKDFVTEwgPDwgMzEpIC0gMSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgeDg2X3BtdSBhbWRfcG11ID0geworCS5uYW1lCQkJPSAiQU1EIiwKKwkuaGFuZGxlX2lycQkJPSBhbWRfcG11X2hhbmRsZV9pcnEsCisJLmRpc2FibGVfYWxsCQk9IGFtZF9wbXVfZGlzYWJsZV9hbGwsCisJLmVuYWJsZV9hbGwJCT0gYW1kX3BtdV9lbmFibGVfYWxsLAorCS5lbmFibGUJCQk9IGFtZF9wbXVfZW5hYmxlX2NvdW50ZXIsCisJLmRpc2FibGUJCT0gYW1kX3BtdV9kaXNhYmxlX2NvdW50ZXIsCisJLmV2ZW50c2VsCQk9IE1TUl9LN19FVk5UU0VMMCwKKwkucGVyZmN0cgkJPSBNU1JfSzdfUEVSRkNUUjAsCisJLmV2ZW50X21hcAkJPSBhbWRfcG11X2V2ZW50X21hcCwKKwkucmF3X2V2ZW50CQk9IGFtZF9wbXVfcmF3X2V2ZW50LAorCS5tYXhfZXZlbnRzCQk9IEFSUkFZX1NJWkUoYW1kX3BlcmZtb25fZXZlbnRfbWFwKSwKKwkubnVtX2NvdW50ZXJzCQk9IDQsCisJLmNvdW50ZXJfYml0cwkJPSA0OCwKKwkuY291bnRlcl9tYXNrCQk9ICgxVUxMIDw8IDQ4KSAtIDEsCisJLyogdXNlIGhpZ2hlc3QgYml0IHRvIGRldGVjdCBvdmVyZmxvdyAqLworCS5tYXhfcGVyaW9kCQk9ICgxVUxMIDw8IDQ3KSAtIDEsCit9OworCitzdGF0aWMgaW50IGludGVsX3BtdV9pbml0KHZvaWQpCit7CisJdW5pb24gY3B1aWQxMF9lZHggZWR4OworCXVuaW9uIGNwdWlkMTBfZWF4IGVheDsKKwl1bnNpZ25lZCBpbnQgdW51c2VkOworCXVuc2lnbmVkIGludCBlYng7CisJaW50IHZlcnNpb247CisKKwlpZiAoIWNwdV9oYXMoJmJvb3RfY3B1X2RhdGEsIFg4Nl9GRUFUVVJFX0FSQ0hfUEVSRk1PTikpCisJCXJldHVybiAtRU5PREVWOworCisJLyoKKwkgKiBDaGVjayB3aGV0aGVyIHRoZSBBcmNoaXRlY3R1cmFsIFBlcmZNb24gc3VwcG9ydHMKKwkgKiBCcmFuY2ggTWlzc2VzIFJldGlyZWQgRXZlbnQgb3Igbm90LgorCSAqLworCWNwdWlkKDEwLCAmZWF4LmZ1bGwsICZlYngsICZ1bnVzZWQsICZlZHguZnVsbCk7CisJaWYgKGVheC5zcGxpdC5tYXNrX2xlbmd0aCA8PSBBUkNIX1BFUkZNT05fQlJBTkNIX01JU1NFU19SRVRJUkVEKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCXZlcnNpb24gPSBlYXguc3BsaXQudmVyc2lvbl9pZDsKKwlpZiAodmVyc2lvbiA8IDIpCisJCXJldHVybiAtRU5PREVWOworCisJeDg2X3BtdQkJCQk9IGludGVsX3BtdTsKKwl4ODZfcG11LnZlcnNpb24JCQk9IHZlcnNpb247CisJeDg2X3BtdS5udW1fY291bnRlcnMJCT0gZWF4LnNwbGl0Lm51bV9jb3VudGVyczsKKwl4ODZfcG11LmNvdW50ZXJfYml0cwkJPSBlYXguc3BsaXQuYml0X3dpZHRoOworCXg4Nl9wbXUuY291bnRlcl9tYXNrCQk9ICgxVUxMIDw8IGVheC5zcGxpdC5iaXRfd2lkdGgpIC0gMTsKKworCS8qCisJICogUXVpcms6IHYyIHBlcmZtb24gZG9lcyBub3QgcmVwb3J0IGZpeGVkLXB1cnBvc2UgY291bnRlcnMsIHNvCisJICogYXNzdW1lIGF0IGxlYXN0IDMgY291bnRlcnM6CisJICovCisJeDg2X3BtdS5udW1fY291bnRlcnNfZml4ZWQJPSBtYXgoKGludCllZHguc3BsaXQubnVtX2NvdW50ZXJzX2ZpeGVkLCAzKTsKKworCXJkbXNybChNU1JfQ09SRV9QRVJGX0dMT0JBTF9DVFJMLCB4ODZfcG11LmludGVsX2N0cmwpOworCisJLyoKKwkgKiBJbnN0YWxsIHRoZSBody1jYWNoZS1ldmVudHMgdGFibGU6CisJICovCisJc3dpdGNoIChib290X2NwdV9kYXRhLng4Nl9tb2RlbCkgeworCWNhc2UgMTU6IC8qIG9yaWdpbmFsIDY1IG5tIGNlbGVyb24vcGVudGl1bS9jb3JlMi94ZW9uLCAiTWVyb20iLyJDb25yb2UiICovCisJY2FzZSAyMjogLyogc2luZ2xlLWNvcmUgNjUgbm0gY2VsZXJvbi9jb3JlMnNvbG8gIk1lcm9tLUwiLyJDb25yb2UtTCIgKi8KKwljYXNlIDIzOiAvKiBjdXJyZW50IDQ1IG5tIGNlbGVyb24vY29yZTIveGVvbiAiUGVucnluIi8iV29sZmRhbGUiICovCisJY2FzZSAyOTogLyogc2l4LWNvcmUgNDUgbm0geGVvbiAiRHVubmluZ3RvbiIgKi8KKwkJbWVtY3B5KGh3X2NhY2hlX2V2ZW50X2lkcywgY29yZTJfaHdfY2FjaGVfZXZlbnRfaWRzLAorCQkgICAgICAgc2l6ZW9mKGh3X2NhY2hlX2V2ZW50X2lkcykpOworCisJCXByX2NvbnQoIkNvcmUyIGV2ZW50cywgIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJY2FzZSAyNjoKKwkJbWVtY3B5KGh3X2NhY2hlX2V2ZW50X2lkcywgbmVoYWxlbV9od19jYWNoZV9ldmVudF9pZHMsCisJCSAgICAgICBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7CisKKwkJcHJfY29udCgiTmVoYWxlbS9Db3JlaTcgZXZlbnRzLCAiKTsKKwkJYnJlYWs7CisJY2FzZSAyODoKKwkJbWVtY3B5KGh3X2NhY2hlX2V2ZW50X2lkcywgYXRvbV9od19jYWNoZV9ldmVudF9pZHMsCisJCSAgICAgICBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7CisKKwkJcHJfY29udCgiQXRvbSBldmVudHMsICIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1kX3BtdV9pbml0KHZvaWQpCit7CisJeDg2X3BtdSA9IGFtZF9wbXU7CisKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2KSB7CisJY2FzZSAweDBmOgorCWNhc2UgMHgxMDoKKwljYXNlIDB4MTE6CisJCW1lbWNweShod19jYWNoZV9ldmVudF9pZHMsIGFtZF8wZl9od19jYWNoZV9ldmVudF9pZHMsCisJCSAgICAgICBzaXplb2YoaHdfY2FjaGVfZXZlbnRfaWRzKSk7CisKKwkJcHJfY29udCgiQU1EIEZhbWlseSAwZi8xMC8xMSBldmVudHMsICIpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX19pbml0IGluaXRfaHdfcGVyZl9jb3VudGVycyh2b2lkKQoreworCWludCBlcnI7CisKKwlwcl9pbmZvKCJQZXJmb3JtYW5jZSBDb3VudGVyczogIik7CisKKwlzd2l0Y2ggKGJvb3RfY3B1X2RhdGEueDg2X3ZlbmRvcikgeworCWNhc2UgWDg2X1ZFTkRPUl9JTlRFTDoKKwkJZXJyID0gaW50ZWxfcG11X2luaXQoKTsKKwkJYnJlYWs7CisJY2FzZSBYODZfVkVORE9SX0FNRDoKKwkJZXJyID0gYW1kX3BtdV9pbml0KCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisJaWYgKGVyciAhPSAwKSB7CisJCXByX2NvbnQoIm5vIFBNVSBkcml2ZXIsIHNvZnR3YXJlIGNvdW50ZXJzIG9ubHkuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXByX2NvbnQoIiVzIFBNVSBkcml2ZXIuXG4iLCB4ODZfcG11Lm5hbWUpOworCisJaWYgKHg4Nl9wbXUubnVtX2NvdW50ZXJzID4gWDg2X1BNQ19NQVhfR0VORVJJQykgeworCQl4ODZfcG11Lm51bV9jb3VudGVycyA9IFg4Nl9QTUNfTUFYX0dFTkVSSUM7CisJCVdBUk4oMSwgS0VSTl9FUlIgImh3IHBlcmYgY291bnRlcnMgJWQgPiBtYXgoJWQpLCBjbGlwcGluZyEiLAorCQkgICAgIHg4Nl9wbXUubnVtX2NvdW50ZXJzLCBYODZfUE1DX01BWF9HRU5FUklDKTsKKwl9CisJcGVyZl9jb3VudGVyX21hc2sgPSAoMSA8PCB4ODZfcG11Lm51bV9jb3VudGVycykgLSAxOworCXBlcmZfbWF4X2NvdW50ZXJzID0geDg2X3BtdS5udW1fY291bnRlcnM7CisKKwlpZiAoeDg2X3BtdS5udW1fY291bnRlcnNfZml4ZWQgPiBYODZfUE1DX01BWF9GSVhFRCkgeworCQl4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZCA9IFg4Nl9QTUNfTUFYX0ZJWEVEOworCQlXQVJOKDEsIEtFUk5fRVJSICJodyBwZXJmIGNvdW50ZXJzIGZpeGVkICVkID4gbWF4KCVkKSwgY2xpcHBpbmchIiwKKwkJICAgICB4ODZfcG11Lm51bV9jb3VudGVyc19maXhlZCwgWDg2X1BNQ19NQVhfRklYRUQpOworCX0KKworCXBlcmZfY291bnRlcl9tYXNrIHw9CisJCSgoMUxMIDw8IHg4Nl9wbXUubnVtX2NvdW50ZXJzX2ZpeGVkKS0xKSA8PCBYODZfUE1DX0lEWF9GSVhFRDsKKworCXBlcmZfY291bnRlcnNfbGFwaWNfaW5pdCgpOworCXJlZ2lzdGVyX2RpZV9ub3RpZmllcigmcGVyZl9jb3VudGVyX25taV9ub3RpZmllcik7CisKKwlwcl9pbmZvKCIuLi4gdmVyc2lvbjogICAgICAgICAgICAgICAgICVkXG4iLCAgICAgeDg2X3BtdS52ZXJzaW9uKTsKKwlwcl9pbmZvKCIuLi4gYml0IHdpZHRoOiAgICAgICAgICAgICAgICVkXG4iLCAgICAgeDg2X3BtdS5jb3VudGVyX2JpdHMpOworCXByX2luZm8oIi4uLiBnZW5lcmljIGNvdW50ZXJzOiAgICAgICAgJWRcbiIsICAgICB4ODZfcG11Lm51bV9jb3VudGVycyk7CisJcHJfaW5mbygiLi4uIHZhbHVlIG1hc2s6ICAgICAgICAgICAgICAlMDE2THhcbiIsIHg4Nl9wbXUuY291bnRlcl9tYXNrKTsKKwlwcl9pbmZvKCIuLi4gbWF4IHBlcmlvZDogICAgICAgICAgICAgICUwMTZMeFxuIiwgeDg2X3BtdS5tYXhfcGVyaW9kKTsKKwlwcl9pbmZvKCIuLi4gZml4ZWQtcHVycG9zZSBjb3VudGVyczogICVkXG4iLCAgICAgeDg2X3BtdS5udW1fY291bnRlcnNfZml4ZWQpOworCXByX2luZm8oIi4uLiBjb3VudGVyIG1hc2s6ICAgICAgICAgICAgJTAxNkx4XG4iLCBwZXJmX2NvdW50ZXJfbWFzayk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCB4ODZfcG11X3JlYWQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwl4ODZfcGVyZl9jb3VudGVyX3VwZGF0ZShjb3VudGVyLCAmY291bnRlci0+aHcsIGNvdW50ZXItPmh3LmlkeCk7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgcG11IHBtdSA9IHsKKwkuZW5hYmxlCQk9IHg4Nl9wbXVfZW5hYmxlLAorCS5kaXNhYmxlCT0geDg2X3BtdV9kaXNhYmxlLAorCS5yZWFkCQk9IHg4Nl9wbXVfcmVhZCwKKwkudW50aHJvdHRsZQk9IHg4Nl9wbXVfdW50aHJvdHRsZSwKK307CisKK2NvbnN0IHN0cnVjdCBwbXUgKmh3X3BlcmZfY291bnRlcl9pbml0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJaW50IGVycjsKKworCWVyciA9IF9faHdfcGVyZl9jb3VudGVyX2luaXQoY291bnRlcik7CisJaWYgKGVycikKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKworCXJldHVybiAmcG11OworfQorCisvKgorICogY2FsbGNoYWluIHN1cHBvcnQKKyAqLworCitzdGF0aWMgaW5saW5lCit2b2lkIGNhbGxjaGFpbl9zdG9yZShzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIGlwKQoreworCWlmIChlbnRyeS0+bnIgPCBNQVhfU1RBQ0tfREVQVEgpCisJCWVudHJ5LT5pcFtlbnRyeS0+bnIrK10gPSBpcDsKK30KKworc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSwgaXJxX2VudHJ5KTsKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnksIG5taV9lbnRyeSk7CisKKworc3RhdGljIHZvaWQKK2JhY2t0cmFjZV93YXJuaW5nX3N5bWJvbCh2b2lkICpkYXRhLCBjaGFyICptc2csIHVuc2lnbmVkIGxvbmcgc3ltYm9sKQoreworCS8qIElnbm9yZSB3YXJuaW5ncyAqLworfQorCitzdGF0aWMgdm9pZCBiYWNrdHJhY2Vfd2FybmluZyh2b2lkICpkYXRhLCBjaGFyICptc2cpCit7CisJLyogSWdub3JlIHdhcm5pbmdzICovCit9CisKK3N0YXRpYyBpbnQgYmFja3RyYWNlX3N0YWNrKHZvaWQgKmRhdGEsIGNoYXIgKm5hbWUpCit7CisJLyogRG9uJ3QgYm90aGVyIHdpdGggSVJRIHN0YWNrcyBmb3Igbm93ICovCisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBiYWNrdHJhY2VfYWRkcmVzcyh2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIGFkZHIsIGludCByZWxpYWJsZSkKK3sKKwlzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5ID0gZGF0YTsKKworCWlmIChyZWxpYWJsZSkKKwkJY2FsbGNoYWluX3N0b3JlKGVudHJ5LCBhZGRyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBzdGFja3RyYWNlX29wcyBiYWNrdHJhY2Vfb3BzID0geworCS53YXJuaW5nCQk9IGJhY2t0cmFjZV93YXJuaW5nLAorCS53YXJuaW5nX3N5bWJvbAkJPSBiYWNrdHJhY2Vfd2FybmluZ19zeW1ib2wsCisJLnN0YWNrCQkJPSBiYWNrdHJhY2Vfc3RhY2ssCisJLmFkZHJlc3MJCT0gYmFja3RyYWNlX2FkZHJlc3MsCit9OworCitzdGF0aWMgdm9pZAorcGVyZl9jYWxsY2hhaW5fa2VybmVsKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5KQoreworCXVuc2lnbmVkIGxvbmcgYnA7CisJY2hhciAqc3RhY2s7CisJaW50IG5yID0gZW50cnktPm5yOworCisJY2FsbGNoYWluX3N0b3JlKGVudHJ5LCBpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpKTsKKworCXN0YWNrID0gKChjaGFyICopcmVncyArIHNpemVvZihzdHJ1Y3QgcHRfcmVncykpOworI2lmZGVmIENPTkZJR19GUkFNRV9QT0lOVEVSCisJYnAgPSBmcmFtZV9wb2ludGVyKHJlZ3MpOworI2Vsc2UKKwlicCA9IDA7CisjZW5kaWYKKworCWR1bXBfdHJhY2UoTlVMTCwgcmVncywgKHZvaWQgKilzdGFjaywgYnAsICZiYWNrdHJhY2Vfb3BzLCBlbnRyeSk7CisKKwllbnRyeS0+a2VybmVsID0gZW50cnktPm5yIC0gbnI7Cit9CisKKworc3RydWN0IHN0YWNrX2ZyYW1lIHsKKwljb25zdCB2b2lkIF9fdXNlcgkqbmV4dF9mcDsKKwl1bnNpZ25lZCBsb25nCQlyZXR1cm5fYWRkcmVzczsKK307CisKK3N0YXRpYyBpbnQgY29weV9zdGFja19mcmFtZShjb25zdCB2b2lkIF9fdXNlciAqZnAsIHN0cnVjdCBzdGFja19mcmFtZSAqZnJhbWUpCit7CisJaW50IHJldDsKKworCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBmcCwgc2l6ZW9mKCpmcmFtZSkpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IDE7CisJcGFnZWZhdWx0X2Rpc2FibGUoKTsKKwlpZiAoX19jb3B5X2Zyb21fdXNlcl9pbmF0b21pYyhmcmFtZSwgZnAsIHNpemVvZigqZnJhbWUpKSkKKwkJcmV0ID0gMDsKKwlwYWdlZmF1bHRfZW5hYmxlKCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZAorcGVyZl9jYWxsY2hhaW5fdXNlcihzdHJ1Y3QgcHRfcmVncyAqcmVncywgc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeSkKK3sKKwlzdHJ1Y3Qgc3RhY2tfZnJhbWUgZnJhbWU7CisJY29uc3Qgdm9pZCBfX3VzZXIgKmZwOworCWludCBuciA9IGVudHJ5LT5ucjsKKworCXJlZ3MgPSAoc3RydWN0IHB0X3JlZ3MgKiljdXJyZW50LT50aHJlYWQuc3AwIC0gMTsKKwlmcCAgID0gKHZvaWQgX191c2VyICopcmVncy0+YnA7CisKKwljYWxsY2hhaW5fc3RvcmUoZW50cnksIHJlZ3MtPmlwKTsKKworCXdoaWxlIChlbnRyeS0+bnIgPCBNQVhfU1RBQ0tfREVQVEgpIHsKKwkJZnJhbWUubmV4dF9mcAkgICAgID0gTlVMTDsKKwkJZnJhbWUucmV0dXJuX2FkZHJlc3MgPSAwOworCisJCWlmICghY29weV9zdGFja19mcmFtZShmcCwgJmZyYW1lKSkKKwkJCWJyZWFrOworCisJCWlmICgodW5zaWduZWQgbG9uZylmcCA8IHVzZXJfc3RhY2tfcG9pbnRlcihyZWdzKSkKKwkJCWJyZWFrOworCisJCWNhbGxjaGFpbl9zdG9yZShlbnRyeSwgZnJhbWUucmV0dXJuX2FkZHJlc3MpOworCQlmcCA9IGZyYW1lLm5leHRfZnA7CisJfQorCisJZW50cnktPnVzZXIgPSBlbnRyeS0+bnIgLSBucjsKK30KKworc3RhdGljIHZvaWQKK3BlcmZfZG9fY2FsbGNoYWluKHN0cnVjdCBwdF9yZWdzICpyZWdzLCBzdHJ1Y3QgcGVyZl9jYWxsY2hhaW5fZW50cnkgKmVudHJ5KQoreworCWludCBpc191c2VyOworCisJaWYgKCFyZWdzKQorCQlyZXR1cm47CisKKwlpc191c2VyID0gdXNlcl9tb2RlKHJlZ3MpOworCisJaWYgKCFjdXJyZW50IHx8IGN1cnJlbnQtPnBpZCA9PSAwKQorCQlyZXR1cm47CisKKwlpZiAoaXNfdXNlciAmJiBjdXJyZW50LT5zdGF0ZSAhPSBUQVNLX1JVTk5JTkcpCisJCXJldHVybjsKKworCWlmICghaXNfdXNlcikKKwkJcGVyZl9jYWxsY2hhaW5fa2VybmVsKHJlZ3MsIGVudHJ5KTsKKworCWlmIChjdXJyZW50LT5tbSkKKwkJcGVyZl9jYWxsY2hhaW5fdXNlcihyZWdzLCBlbnRyeSk7Cit9CisKK3N0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqcGVyZl9jYWxsY2hhaW4oc3RydWN0IHB0X3JlZ3MgKnJlZ3MpCit7CisJc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICplbnRyeTsKKworCWlmIChpbl9ubWkoKSkKKwkJZW50cnkgPSAmX19nZXRfY3B1X3ZhcihubWlfZW50cnkpOworCWVsc2UKKwkJZW50cnkgPSAmX19nZXRfY3B1X3ZhcihpcnFfZW50cnkpOworCisJZW50cnktPm5yID0gMDsKKwllbnRyeS0+aHYgPSAwOworCWVudHJ5LT5rZXJuZWwgPSAwOworCWVudHJ5LT51c2VyID0gMDsKKworCXBlcmZfZG9fY2FsbGNoYWluKHJlZ3MsIGVudHJ5KTsKKworCXJldHVybiBlbnRyeTsKK30KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9jcHUvcGVyZmN0ci13YXRjaGRvZy5jIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKaW5kZXggZjZjNzBhMS4uZDZmNWI5ZiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2NwdS9wZXJmY3RyLXdhdGNoZG9nLmMKQEAgLTE5LDggKzE5LDggQEAKICNpbmNsdWRlIDxsaW51eC9ubWkuaD4KICNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAKLSNpbmNsdWRlIDxhc20vZ2VuYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9pbnRlbF9hcmNoX3BlcmZtb24uaD4KKyNpbmNsdWRlIDxhc20vYXBpYy5oPgorI2luY2x1ZGUgPGFzbS9wZXJmX2NvdW50ZXIuaD4KIAogc3RydWN0IG5taV93YXRjaGRvZ19jdGxibGsgewogCXVuc2lnbmVkIGludCBjY2NyX21zcjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kcy5jIGIvYXJjaC94ODYva2VybmVsL2RzLmMKaW5kZXggODdiNjdlMy4uNDhiZmUxMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2RzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2RzLmMKQEAgLTE5LDQ1ICsxOSw2MSBAQAogICogTWFya3VzIE1ldHpnZXIgPG1hcmt1cy50Lm1ldHpnZXJAaW50ZWwuY29tPiwgMjAwNy0yMDA5CiAgKi8KIAorI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZV9jbG9jay5oPgogCiAjaW5jbHVkZSA8YXNtL2RzLmg+CiAKLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+Ci0jaW5jbHVkZSA8bGludXgva2VybmVsLmg+Ci0KKyNpbmNsdWRlICJkc19zZWxmdGVzdC5oIgogCiAvKgotICogVGhlIGNvbmZpZ3VyYXRpb24gZm9yIGEgcGFydGljdWxhciBEUyBoYXJkd2FyZSBpbXBsZW1lbnRhdGlvbi4KKyAqIFRoZSBjb25maWd1cmF0aW9uIGZvciBhIHBhcnRpY3VsYXIgRFMgaGFyZHdhcmUgaW1wbGVtZW50YXRpb246CiAgKi8KIHN0cnVjdCBkc19jb25maWd1cmF0aW9uIHsKLQkvKiB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiAqLwotCWNvbnN0IGNoYXIgKm5hbWU7Ci0JLyogdGhlIHNpemUgb2Ygb25lIHBvaW50ZXItdHlwZWQgZmllbGQgaW4gdGhlIERTIHN0cnVjdHVyZSBhbmQKLQkgICBpbiB0aGUgQlRTIGFuZCBQRUJTIGJ1ZmZlcnMgaW4gYnl0ZXM7Ci0JICAgdGhpcyBjb3ZlcnMgdGhlIGZpcnN0IDggRFMgZmllbGRzIHJlbGF0ZWQgdG8gYnVmZmVyIG1hbmFnZW1lbnQuICovCi0JdW5zaWduZWQgY2hhciAgc2l6ZW9mX2ZpZWxkOwotCS8qIHRoZSBzaXplIG9mIGEgQlRTL1BFQlMgcmVjb3JkIGluIGJ5dGVzICovCi0JdW5zaWduZWQgY2hhciAgc2l6ZW9mX3JlY1syXTsKLQkvKiBhIHNlcmllcyBvZiBiaXQtbWFza3MgdG8gY29udHJvbCB2YXJpb3VzIGZlYXR1cmVzIGluZGV4ZWQKLQkgKiBieSBlbnVtIGRzX2ZlYXR1cmUgKi8KLQl1bnNpZ25lZCBsb25nIGN0bFtkc2ZfY3RsX21heF07CisJLyogVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb246ICovCisJY29uc3QgY2hhcgkJKm5hbWU7CisKKwkvKiBUaGUgc2l6ZSBvZiBwb2ludGVyLXR5cGVkIGZpZWxkcyBpbiBEUywgQlRTLCBhbmQgUEVCUzogKi8KKwl1bnNpZ25lZCBjaGFyCQlzaXplb2ZfcHRyX2ZpZWxkOworCisJLyogVGhlIHNpemUgb2YgYSBCVFMvUEVCUyByZWNvcmQgaW4gYnl0ZXM6ICovCisJdW5zaWduZWQgY2hhcgkJc2l6ZW9mX3JlY1syXTsKKworCS8qIFRoZSBudW1iZXIgb2YgcGVicyBjb3VudGVyIHJlc2V0IHZhbHVlcyBpbiB0aGUgRFMgc3RydWN0dXJlLiAqLworCXVuc2lnbmVkIGNoYXIJCW5yX2NvdW50ZXJfcmVzZXQ7CisKKwkvKiBDb250cm9sIGJpdC1tYXNrcyBpbmRleGVkIGJ5IGVudW0gZHNfZmVhdHVyZTogKi8KKwl1bnNpZ25lZCBsb25nCQljdGxbZHNmX2N0bF9tYXhdOwogfTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiwgZHNfY2ZnX2FycmF5KTsKK3N0YXRpYyBzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiBkc19jZmcgX19yZWFkX21vc3RseTsKIAotI2RlZmluZSBkc19jZmcgcGVyX2NwdShkc19jZmdfYXJyYXksIHNtcF9wcm9jZXNzb3JfaWQoKSkKIAotI2RlZmluZSBNQVhfU0laRU9GX0RTICgxMiAqIDgpCS8qIG1heGltYWwgc2l6ZSBvZiBhIERTIGNvbmZpZ3VyYXRpb24gKi8KLSNkZWZpbmUgTUFYX1NJWkVPRl9CVFMgKDMgKiA4KQkvKiBtYXhpbWFsIHNpemUgb2YgYSBCVFMgcmVjb3JkICovCi0jZGVmaW5lIERTX0FMSUdOTUVOVCAoMSA8PCAzKQkvKiBCVFMgYW5kIFBFQlMgYnVmZmVyIGFsaWdubWVudCAqLworLyogTWF4aW1hbCBzaXplIG9mIGEgRFMgY29uZmlndXJhdGlvbjogKi8KKyNkZWZpbmUgTUFYX1NJWkVPRl9EUwkJMHg4MAogCi0jZGVmaW5lIEJUU19DT05UUk9MIFwKLSAoZHNfY2ZnLmN0bFtkc2ZfYnRzXSB8IGRzX2NmZy5jdGxbZHNmX2J0c19rZXJuZWxdIHwgZHNfY2ZnLmN0bFtkc2ZfYnRzX3VzZXJdIHxcCi0gIGRzX2NmZy5jdGxbZHNmX2J0c19vdmVyZmxvd10pCisvKiBNYXhpbWFsIHNpemUgb2YgYSBCVFMgcmVjb3JkOiAqLworI2RlZmluZSBNQVhfU0laRU9GX0JUUwkJKDMgKiA4KQogCisvKiBCVFMgYW5kIFBFQlMgYnVmZmVyIGFsaWdubWVudDogKi8KKyNkZWZpbmUgRFNfQUxJR05NRU5UCQkoMSA8PCAzKQorCisvKiBOdW1iZXIgb2YgYnVmZmVyIHBvaW50ZXJzIGluIERTOiAqLworI2RlZmluZSBOVU1fRFNfUFRSX0ZJRUxEUwk4CisKKy8qIFNpemUgb2YgYSBwZWJzIHJlc2V0IHZhbHVlIGluIERTOiAqLworI2RlZmluZSBQRUJTX1JFU0VUX0ZJRUxEX1NJWkUJOAorCisvKiBNYXNrIG9mIGNvbnRyb2wgYml0cyBpbiB0aGUgRFMgTVNSIHJlZ2lzdGVyOiAqLworI2RlZmluZSBCVFNfQ09OVFJPTAkJCQkgIFwKKwkoIGRzX2NmZy5jdGxbZHNmX2J0c10JCQl8IFwKKwkgIGRzX2NmZy5jdGxbZHNmX2J0c19rZXJuZWxdCQl8IFwKKwkgIGRzX2NmZy5jdGxbZHNmX2J0c191c2VyXQkJfCBcCisJICBkc19jZmcuY3RsW2RzZl9idHNfb3ZlcmZsb3ddICkKIAogLyoKICAqIEEgQlRTIG9yIFBFQlMgdHJhY2VyLgpAQCAtNjYsMjkgKzgyLDM2IEBACiAgKiB0byBpZGVudGlmeSB0cmFjZXJzLgogICovCiBzdHJ1Y3QgZHNfdHJhY2VyIHsKLQkvKiB0aGUgRFMgY29udGV4dCAocGFydGlhbGx5KSBvd25lZCBieSB0aGlzIHRyYWNlciAqLwotCXN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0OwotCS8qIHRoZSBidWZmZXIgcHJvdmlkZWQgb24gZHNfcmVxdWVzdCgpIGFuZCBpdHMgc2l6ZSBpbiBieXRlcyAqLwotCXZvaWQgKmJ1ZmZlcjsKLQlzaXplX3Qgc2l6ZTsKKwkvKiBUaGUgRFMgY29udGV4dCAocGFydGlhbGx5KSBvd25lZCBieSB0aGlzIHRyYWNlci4gKi8KKwlzdHJ1Y3QgZHNfY29udGV4dAkqY29udGV4dDsKKwkvKiBUaGUgYnVmZmVyIHByb3ZpZGVkIG9uIGRzX3JlcXVlc3QoKSBhbmQgaXRzIHNpemUgaW4gYnl0ZXMuICovCisJdm9pZAkJCSpidWZmZXI7CisJc2l6ZV90CQkJc2l6ZTsKIH07CiAKIHN0cnVjdCBidHNfdHJhY2VyIHsKLQkvKiB0aGUgY29tbW9uIERTIHBhcnQgKi8KLQlzdHJ1Y3QgZHNfdHJhY2VyIGRzOwotCS8qIHRoZSB0cmFjZSBpbmNsdWRpbmcgdGhlIERTIGNvbmZpZ3VyYXRpb24gKi8KLQlzdHJ1Y3QgYnRzX3RyYWNlIHRyYWNlOwotCS8qIGJ1ZmZlciBvdmVyZmxvdyBub3RpZmljYXRpb24gZnVuY3Rpb24gKi8KLQlidHNfb3ZmbF9jYWxsYmFja190IG92Zmw7CisJLyogVGhlIGNvbW1vbiBEUyBwYXJ0OiAqLworCXN0cnVjdCBkc190cmFjZXIJZHM7CisKKwkvKiBUaGUgdHJhY2UgaW5jbHVkaW5nIHRoZSBEUyBjb25maWd1cmF0aW9uOiAqLworCXN0cnVjdCBidHNfdHJhY2UJdHJhY2U7CisKKwkvKiBCdWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGZ1bmN0aW9uOiAqLworCWJ0c19vdmZsX2NhbGxiYWNrX3QJb3ZmbDsKKworCS8qIEFjdGl2ZSBmbGFncyBhZmZlY3RpbmcgdHJhY2UgY29sbGVjdGlvbi4gKi8KKwl1bnNpZ25lZCBpbnQJCWZsYWdzOwogfTsKIAogc3RydWN0IHBlYnNfdHJhY2VyIHsKLQkvKiB0aGUgY29tbW9uIERTIHBhcnQgKi8KLQlzdHJ1Y3QgZHNfdHJhY2VyIGRzOwotCS8qIHRoZSB0cmFjZSBpbmNsdWRpbmcgdGhlIERTIGNvbmZpZ3VyYXRpb24gKi8KLQlzdHJ1Y3QgcGVic190cmFjZSB0cmFjZTsKLQkvKiBidWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGZ1bmN0aW9uICovCi0JcGVic19vdmZsX2NhbGxiYWNrX3Qgb3ZmbDsKKwkvKiBUaGUgY29tbW9uIERTIHBhcnQ6ICovCisJc3RydWN0IGRzX3RyYWNlcglkczsKKworCS8qIFRoZSB0cmFjZSBpbmNsdWRpbmcgdGhlIERTIGNvbmZpZ3VyYXRpb246ICovCisJc3RydWN0IHBlYnNfdHJhY2UJdHJhY2U7CisKKwkvKiBCdWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGZ1bmN0aW9uOiAqLworCXBlYnNfb3ZmbF9jYWxsYmFja190CW92Zmw7CiB9OwogCiAvKgpAQCAtOTcsNiArMTIwLDcgQEAKICAqCiAgKiBUaGUgRFMgY29uZmlndXJhdGlvbiBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIGZpZWxkczsgZGlmZmVyZW50CiAgKiBhcmNoaXRldHVyZXMgdmFyeSBpbiB0aGUgc2l6ZSBvZiB0aG9zZSBmaWVsZHMuCisgKgogICogLSBkb3VibGUtd29yZCBhbGlnbmVkIGJhc2UgbGluZWFyIGFkZHJlc3Mgb2YgdGhlIEJUUyBidWZmZXIKICAqIC0gd3JpdGUgcG9pbnRlciBpbnRvIHRoZSBCVFMgYnVmZmVyCiAgKiAtIGVuZCBsaW5lYXIgYWRkcmVzcyBvZiB0aGUgQlRTIGJ1ZmZlciAob25lIGJ5dGUgYmV5b25kIHRoZSBlbmQgb2YKQEAgLTEzNSwyMSArMTU5LDIyIEBACiB9OwogCiBlbnVtIGRzX3F1YWxpZmllciB7Ci0JZHNfYnRzICA9IDAsCisJZHNfYnRzID0gMCwKIAlkc19wZWJzCiB9OwogCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZHNfZ2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2UsCi0JCQkJICAgZW51bSBkc19xdWFsaWZpZXIgcXVhbCwgZW51bSBkc19maWVsZCBmaWVsZCkKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZworZHNfZ2V0KGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJhc2UsIGVudW0gZHNfcXVhbGlmaWVyIHF1YWwsIGVudW0gZHNfZmllbGQgZmllbGQpCiB7Ci0JYmFzZSArPSAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIChmaWVsZCArICg0ICogcXVhbCkpKTsKKwliYXNlICs9IChkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCAqIChmaWVsZCArICg0ICogcXVhbCkpKTsKIAlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopYmFzZTsKIH0KIAotc3RhdGljIGlubGluZSB2b2lkIGRzX3NldCh1bnNpZ25lZCBjaGFyICpiYXNlLCBlbnVtIGRzX3F1YWxpZmllciBxdWFsLAotCQkJICBlbnVtIGRzX2ZpZWxkIGZpZWxkLCB1bnNpZ25lZCBsb25nIHZhbHVlKQorc3RhdGljIGlubGluZSB2b2lkCitkc19zZXQodW5zaWduZWQgY2hhciAqYmFzZSwgZW51bSBkc19xdWFsaWZpZXIgcXVhbCwgZW51bSBkc19maWVsZCBmaWVsZCwKKyAgICAgICB1bnNpZ25lZCBsb25nIHZhbHVlKQogewotCWJhc2UgKz0gKGRzX2NmZy5zaXplb2ZfZmllbGQgKiAoZmllbGQgKyAoNCAqIHF1YWwpKSk7CisJYmFzZSArPSAoZHNfY2ZnLnNpemVvZl9wdHJfZmllbGQgKiAoZmllbGQgKyAoNCAqIHF1YWwpKSk7CiAJKCoodW5zaWduZWQgbG9uZyAqKWJhc2UpID0gdmFsdWU7CiB9CiAKQEAgLTE1OSw3ICsxODQsNiBAQAogICovCiBzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGRzX2xvY2spOwogCi0KIC8qCiAgKiBXZSBlaXRoZXIgc3VwcG9ydCAoc3lzdGVtLXdpZGUpIHBlci1jcHUgb3IgcGVyLXRocmVhZCBhbGxvY2F0aW9uLgogICogV2UgZGlzdGluZ3Vpc2ggdGhlIHR3byBiYXNlZCBvbiB0aGUgdGFza19zdHJ1Y3QgcG9pbnRlciwgd2hlcmUgYQpAQCAtMTc4LDEyICsyMDIsMjggQEAKICAqLwogc3RhdGljIGF0b21pY190IHRyYWNlcnMgPSBBVE9NSUNfSU5JVCgwKTsKIAotc3RhdGljIGlubGluZSB2b2lkIGdldF90cmFjZXIoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQorc3RhdGljIGlubGluZSBpbnQgZ2V0X3RyYWNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCiB7Ci0JaWYgKHRhc2spCisJaW50IGVycm9yOworCisJc3Bpbl9sb2NrX2lycSgmZHNfbG9jayk7CisKKwlpZiAodGFzaykgeworCQllcnJvciA9IC1FUEVSTTsKKwkJaWYgKGF0b21pY19yZWFkKCZ0cmFjZXJzKSA8IDApCisJCQlnb3RvIG91dDsKIAkJYXRvbWljX2luYygmdHJhY2Vycyk7Ci0JZWxzZQorCX0gZWxzZSB7CisJCWVycm9yID0gLUVQRVJNOworCQlpZiAoYXRvbWljX3JlYWQoJnRyYWNlcnMpID4gMCkKKwkJCWdvdG8gb3V0OwogCQlhdG9taWNfZGVjKCZ0cmFjZXJzKTsKKwl9CisKKwllcnJvciA9IDA7CitvdXQ6CisJc3Bpbl91bmxvY2tfaXJxKCZkc19sb2NrKTsKKwlyZXR1cm4gZXJyb3I7CiB9CiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBwdXRfdHJhY2VyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKQEAgLTE5NCwxNCArMjM0LDYgQEAKIAkJYXRvbWljX2luYygmdHJhY2Vycyk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX3RyYWNlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCi17Ci0JcmV0dXJuIHRhc2sgPwotCQkoYXRvbWljX3JlYWQoJnRyYWNlcnMpID49IDApIDoKLQkJKGF0b21pY19yZWFkKCZ0cmFjZXJzKSA8PSAwKTsKLX0KLQotCiAvKgogICogVGhlIERTIGNvbnRleHQgaXMgZWl0aGVyIGF0dGFjaGVkIHRvIGEgdGhyZWFkIG9yIHRvIGEgY3B1OgogICogLSBpbiB0aGUgZm9ybWVyIGNhc2UsIHRoZSB0aHJlYWRfc3RydWN0IGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUKQEAgLTIxMyw2MSArMjQ1LDU4IEBACiAgKiBkZWFsbG9jYXRlZCB3aGVuIHRoZSBsYXN0IHVzZXIgcHV0cyB0aGUgY29udGV4dC4KICAqLwogc3RydWN0IGRzX2NvbnRleHQgewotCS8qIHBvaW50ZXIgdG8gdGhlIERTIGNvbmZpZ3VyYXRpb247IGdvZXMgaW50byBNU1JfSUEzMl9EU19BUkVBICovCi0JdW5zaWduZWQgY2hhciBkc1tNQVhfU0laRU9GX0RTXTsKLQkvKiB0aGUgb3duZXIgb2YgdGhlIEJUUyBhbmQgUEVCUyBjb25maWd1cmF0aW9uLCByZXNwZWN0aXZlbHkgKi8KLQlzdHJ1Y3QgYnRzX3RyYWNlciAqYnRzX21hc3RlcjsKLQlzdHJ1Y3QgcGVic190cmFjZXIgKnBlYnNfbWFzdGVyOwotCS8qIHVzZSBjb3VudCAqLwotCXVuc2lnbmVkIGxvbmcgY291bnQ7Ci0JLyogYSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IGxvY2F0aW9uIGluc2lkZSB0aGUgdGhyZWFkX3N0cnVjdAotCSAqIG9yIHRoZSBwZXJfY3B1IGNvbnRleHQgYXJyYXkgKi8KLQlzdHJ1Y3QgZHNfY29udGV4dCAqKnRoaXM7Ci0JLyogYSBwb2ludGVyIHRvIHRoZSB0YXNrIG93bmluZyB0aGlzIGNvbnRleHQsIG9yIE5VTEwsIGlmIHRoZQotCSAqIGNvbnRleHQgaXMgb3duZWQgYnkgYSBjcHUgKi8KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJLyogVGhlIERTIGNvbmZpZ3VyYXRpb247IGdvZXMgaW50byBNU1JfSUEzMl9EU19BUkVBOiAqLworCXVuc2lnbmVkIGNoYXIJCWRzW01BWF9TSVpFT0ZfRFNdOworCisJLyogVGhlIG93bmVyIG9mIHRoZSBCVFMgYW5kIFBFQlMgY29uZmlndXJhdGlvbiwgcmVzcGVjdGl2ZWx5OiAqLworCXN0cnVjdCBidHNfdHJhY2VyCSpidHNfbWFzdGVyOworCXN0cnVjdCBwZWJzX3RyYWNlcgkqcGVic19tYXN0ZXI7CisKKwkvKiBVc2UgY291bnQ6ICovCisJdW5zaWduZWQgbG9uZwkJY291bnQ7CisKKwkvKiBQb2ludGVyIHRvIHRoZSBjb250ZXh0IHBvaW50ZXIgZmllbGQ6ICovCisJc3RydWN0IGRzX2NvbnRleHQJKip0aGlzOworCisJLyogVGhlIHRyYWNlZCB0YXNrOyBOVUxMIGZvciBjcHUgdHJhY2luZzogKi8KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CisKKwkvKiBUaGUgdHJhY2VkIGNwdTsgb25seSB2YWxpZCBpZiB0YXNrIGlzIE5VTEw6ICovCisJaW50CQkJY3B1OwogfTsKIAotc3RhdGljIERFRklORV9QRVJfQ1BVKHN0cnVjdCBkc19jb250ZXh0ICosIHN5c3RlbV9jb250ZXh0X2FycmF5KTsKLQotI2RlZmluZSBzeXN0ZW1fY29udGV4dCBwZXJfY3B1KHN5c3RlbV9jb250ZXh0X2FycmF5LCBzbXBfcHJvY2Vzc29yX2lkKCkpCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGRzX2NvbnRleHQgKiwgY3B1X2NvbnRleHQpOwogCiAKLXN0YXRpYyBpbmxpbmUgc3RydWN0IGRzX2NvbnRleHQgKmRzX2dldF9jb250ZXh0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3N0YXRpYyBzdHJ1Y3QgZHNfY29udGV4dCAqZHNfZ2V0X2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQogewogCXN0cnVjdCBkc19jb250ZXh0ICoqcF9jb250ZXh0ID0KLQkJKHRhc2sgPyAmdGFzay0+dGhyZWFkLmRzX2N0eCA6ICZzeXN0ZW1fY29udGV4dCk7CisJCSh0YXNrID8gJnRhc2stPnRocmVhZC5kc19jdHggOiAmcGVyX2NwdShjcHVfY29udGV4dCwgY3B1KSk7CiAJc3RydWN0IGRzX2NvbnRleHQgKmNvbnRleHQgPSBOVUxMOwogCXN0cnVjdCBkc19jb250ZXh0ICpuZXdfY29udGV4dCA9IE5VTEw7Ci0JdW5zaWduZWQgbG9uZyBpcnE7CiAKIAkvKiBDaGFuY2VzIGFyZSBzbWFsbCB0aGF0IHdlIGFscmVhZHkgaGF2ZSBhIGNvbnRleHQuICovCiAJbmV3X2NvbnRleHQgPSBremFsbG9jKHNpemVvZigqbmV3X2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIW5ld19jb250ZXh0KQogCQlyZXR1cm4gTlVMTDsKIAotCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBpcnEpOworCXNwaW5fbG9ja19pcnEoJmRzX2xvY2spOwogCiAJY29udGV4dCA9ICpwX2NvbnRleHQ7Ci0JaWYgKCFjb250ZXh0KSB7CisJaWYgKGxpa2VseSghY29udGV4dCkpIHsKIAkJY29udGV4dCA9IG5ld19jb250ZXh0OwogCiAJCWNvbnRleHQtPnRoaXMgPSBwX2NvbnRleHQ7CiAJCWNvbnRleHQtPnRhc2sgPSB0YXNrOworCQljb250ZXh0LT5jcHUgPSBjcHU7CiAJCWNvbnRleHQtPmNvdW50ID0gMDsKIAotCQlpZiAodGFzaykKLQkJCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0RTX0FSRUFfTVNSKTsKLQotCQlpZiAoIXRhc2sgfHwgKHRhc2sgPT0gY3VycmVudCkpCi0JCQl3cm1zcmwoTVNSX0lBMzJfRFNfQVJFQSwgKHVuc2lnbmVkIGxvbmcpY29udGV4dC0+ZHMpOwotCiAJCSpwX2NvbnRleHQgPSBjb250ZXh0OwogCX0KIAogCWNvbnRleHQtPmNvdW50Kys7CiAKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBpcnEpOworCXNwaW5fdW5sb2NrX2lycSgmZHNfbG9jayk7CiAKIAlpZiAoY29udGV4dCAhPSBuZXdfY29udGV4dCkKIAkJa2ZyZWUobmV3X2NvbnRleHQpOwpAQCAtMjc1LDggKzMwNCw5IEBACiAJcmV0dXJuIGNvbnRleHQ7CiB9CiAKLXN0YXRpYyBpbmxpbmUgdm9pZCBkc19wdXRfY29udGV4dChzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dCkKK3N0YXRpYyB2b2lkIGRzX3B1dF9jb250ZXh0KHN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0KQogeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKIAl1bnNpZ25lZCBsb25nIGlycTsKIAogCWlmICghY29udGV4dCkKQEAgLTI5MSwxNyArMzIxLDU1IEBACiAKIAkqKGNvbnRleHQtPnRoaXMpID0gTlVMTDsKIAotCWlmIChjb250ZXh0LT50YXNrKQotCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcoY29udGV4dC0+dGFzaywgVElGX0RTX0FSRUFfTVNSKTsKKwl0YXNrID0gY29udGV4dC0+dGFzazsKIAotCWlmICghY29udGV4dC0+dGFzayB8fCAoY29udGV4dC0+dGFzayA9PSBjdXJyZW50KSkKLQkJd3Jtc3JsKE1TUl9JQTMyX0RTX0FSRUEsIDApOworCWlmICh0YXNrKQorCQljbGVhcl90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0RTX0FSRUFfTVNSKTsKKworCS8qCisJICogV2UgbGVhdmUgdGhlIChub3cgZGFuZ2xpbmcpIHBvaW50ZXIgdG8gdGhlIERTIGNvbmZpZ3VyYXRpb24gaW4KKwkgKiB0aGUgRFNfQVJFQSBtc3IuIFRoaXMgaXMgYXMgZ29vZCBvciBhcyBiYWQgYXMgcmVwbGFjaW5nIGl0IHdpdGgKKwkgKiBOVUxMIC0gdGhlIGhhcmR3YXJlIHdvdWxkIGNyYXNoIGlmIHdlIGVuYWJsZWQgdHJhY2luZy4KKwkgKgorCSAqIFRoaXMgc2F2ZXMgdXMgc29tZSBwcm9ibGVtcyB3aXRoIGhhdmluZyB0byB3cml0ZSBhbiBtc3Igb24gYQorCSAqIGRpZmZlcmVudCBjcHUgd2hpbGUgcHJldmVudGluZyBvdGhlcnMgZnJvbSBkb2luZyB0aGUgc2FtZSBmb3IgdGhlCisJICogbmV4dCBjb250ZXh0IGZvciB0aGF0IHNhbWUgY3B1LgorCSAqLwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgaXJxKTsKIAorCS8qIFRoZSBjb250ZXh0IG1pZ2h0IHN0aWxsIGJlIGluIHVzZSBmb3IgY29udGV4dCBzd2l0Y2hpbmcuICovCisJaWYgKHRhc2sgJiYgKHRhc2sgIT0gY3VycmVudCkpCisJCXdhaXRfdGFza19jb250ZXh0X3N3aXRjaCh0YXNrKTsKKwogCWtmcmVlKGNvbnRleHQpOwogfQogCitzdGF0aWMgdm9pZCBkc19pbnN0YWxsX2RzX2FyZWEoc3RydWN0IGRzX2NvbnRleHQgKmNvbnRleHQpCit7CisJdW5zaWduZWQgbG9uZyBkczsKKworCWRzID0gKHVuc2lnbmVkIGxvbmcpY29udGV4dC0+ZHM7CisKKwkvKgorCSAqIFRoZXJlIGlzIGEgcmFjZSBiZXR3ZWVuIHRoZSBidHMgbWFzdGVyIGFuZCB0aGUgcGVicyBtYXN0ZXIuCisJICoKKwkgKiBUaGUgdGhyZWFkL2NwdSBhY2Nlc3MgaXMgc3luY2hyb25pemVkIHZpYSBnZXQvcHV0X2NwdSgpIGZvcgorCSAqIHRhc2sgdHJhY2luZyBhbmQgdmlhIHdybXNyX29uX2NwdSBmb3IgY3B1IHRyYWNpbmcuCisJICoKKwkgKiBJZiBidHMgYW5kIHBlYnMgYXJlIGNvbGxlY3RlZCBmb3IgdGhlIHNhbWUgdGFzayBvciBzYW1lIGNwdSwKKwkgKiB0aGUgc2FtZSBjb25maXVyYXRpb24gaXMgd3JpdHRlbiB0d2ljZS4KKwkgKi8KKwlpZiAoY29udGV4dC0+dGFzaykgeworCQlnZXRfY3B1KCk7CisJCWlmIChjb250ZXh0LT50YXNrID09IGN1cnJlbnQpCisJCQl3cm1zcmwoTVNSX0lBMzJfRFNfQVJFQSwgZHMpOworCQlzZXRfdHNrX3RocmVhZF9mbGFnKGNvbnRleHQtPnRhc2ssIFRJRl9EU19BUkVBX01TUik7CisJCXB1dF9jcHUoKTsKKwl9IGVsc2UKKwkJd3Jtc3Jfb25fY3B1KGNvbnRleHQtPmNwdSwgTVNSX0lBMzJfRFNfQVJFQSwKKwkJCSAgICAgKHUzMikoKHU2NClkcyksICh1MzIpKCh1NjQpZHMgPj4gMzIpKTsKK30KIAogLyoKICAqIENhbGwgdGhlIHRyYWNlcidzIGNhbGxiYWNrIG9uIGEgYnVmZmVyIG92ZXJmbG93LgpAQCAtMzMyLDkgKzQwMCw5IEBACiAgKiBUaGUgcmVtYWluZGVyIG9mIGFueSBwYXJ0aWFsbHkgd3JpdHRlbiByZWNvcmQgaXMgemVyb2VkIG91dC4KICAqCiAgKiBjb250ZXh0OiB0aGUgRFMgY29udGV4dAotICogcXVhbDogdGhlIGJ1ZmZlciB0eXBlCi0gKiByZWNvcmQ6IHRoZSBkYXRhIHRvIHdyaXRlCi0gKiBzaXplOiB0aGUgc2l6ZSBvZiB0aGUgZGF0YQorICogcXVhbDogICAgdGhlIGJ1ZmZlciB0eXBlCisgKiByZWNvcmQ6ICB0aGUgZGF0YSB0byB3cml0ZQorICogc2l6ZTogICAgdGhlIHNpemUgb2YgdGhlIGRhdGEKICAqLwogc3RhdGljIGludCBkc193cml0ZShzdHJ1Y3QgZHNfY29udGV4dCAqY29udGV4dCwgZW51bSBkc19xdWFsaWZpZXIgcXVhbCwKIAkJICAgIGNvbnN0IHZvaWQgKnJlY29yZCwgc2l6ZV90IHNpemUpCkBAIC0zNDksMTQgKzQxNywxNCBAQAogCQl1bnNpZ25lZCBsb25nIHdyaXRlX3NpemUsIGFkal93cml0ZV9zaXplOwogCiAJCS8qCi0JCSAqIHdyaXRlIGFzIG11Y2ggYXMgcG9zc2libGUgd2l0aG91dCBwcm9kdWNpbmcgYW4KKwkJICogV3JpdGUgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aXRob3V0IHByb2R1Y2luZyBhbgogCQkgKiBvdmVyZmxvdyBpbnRlcnJ1cHQuCiAJCSAqCi0JCSAqIGludGVycnVwdF90aHJlc2hvbGQgbXVzdCBlaXRoZXIgYmUKKwkJICogSW50ZXJydXB0X3RocmVzaG9sZCBtdXN0IGVpdGhlciBiZQogCQkgKiAtIGJpZ2dlciB0aGFuIGFic29sdXRlX21heGltdW0gb3IKIAkJICogLSBwb2ludCB0byBhIHJlY29yZCBiZXR3ZWVuIGJ1ZmZlcl9iYXNlIGFuZCBhYnNvbHV0ZV9tYXhpbXVtCiAJCSAqCi0JCSAqIGluZGV4IHBvaW50cyB0byBhIHZhbGlkIHJlY29yZC4KKwkJICogSW5kZXggcG9pbnRzIHRvIGEgdmFsaWQgcmVjb3JkLgogCQkgKi8KIAkJYmFzZSAgID0gZHNfZ2V0KGNvbnRleHQtPmRzLCBxdWFsLCBkc19idWZmZXJfYmFzZSk7CiAJCWluZGV4ICA9IGRzX2dldChjb250ZXh0LT5kcywgcXVhbCwgZHNfaW5kZXgpOwpAQCAtMzY1LDggKzQzMywxMCBAQAogCiAJCXdyaXRlX2VuZCA9IG1pbihlbmQsIGludF90aCk7CiAKLQkJLyogaWYgd2UgYXJlIGFscmVhZHkgYmV5b25kIHRoZSBpbnRlcnJ1cHQgdGhyZXNob2xkLAotCQkgKiB3ZSBmaWxsIHRoZSBlbnRpcmUgYnVmZmVyICovCisJCS8qCisJCSAqIElmIHdlIGFyZSBhbHJlYWR5IGJleW9uZCB0aGUgaW50ZXJydXB0IHRocmVzaG9sZCwKKwkJICogd2UgZmlsbCB0aGUgZW50aXJlIGJ1ZmZlci4KKwkJICovCiAJCWlmICh3cml0ZV9lbmQgPD0gaW5kZXgpCiAJCQl3cml0ZV9lbmQgPSBlbmQ7CiAKQEAgLTM4Myw3ICs0NTMsNyBAQAogCQlhZGpfd3JpdGVfc2l6ZSA9IHdyaXRlX3NpemUgLyBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXTsKIAkJYWRqX3dyaXRlX3NpemUgKj0gZHNfY2ZnLnNpemVvZl9yZWNbcXVhbF07CiAKLQkJLyogemVybyBvdXQgdHJhaWxpbmcgYnl0ZXMgKi8KKwkJLyogWmVybyBvdXQgdHJhaWxpbmcgYnl0ZXMuICovCiAJCW1lbXNldCgoY2hhciAqKWluZGV4ICsgd3JpdGVfc2l6ZSwgMCwKIAkJICAgICAgIGFkal93cml0ZV9zaXplIC0gd3JpdGVfc2l6ZSk7CiAJCWluZGV4ICs9IGFkal93cml0ZV9zaXplOwpAQCAtNDEwLDcgKzQ4MCw3IEBACiAgKiBMYXRlciBhcmNoaXRlY3R1cmVzIHVzZSA2NGJpdCBwb2ludGVycyB0aHJvdWdob3V0LCB3aGVyZWFzIGVhcmxpZXIKICAqIGFyY2hpdGVjdHVyZXMgdXNlIDMyYml0IHBvaW50ZXJzIGluIDMyYml0IG1vZGUuCiAgKgotICogV2UgY29tcHV0ZSB0aGUgYmFzZSBhZGRyZXNzIGZvciB0aGUgZmlyc3QgOCBmaWVsZHMgYmFzZWQgb246CisgKiBXZSBjb21wdXRlIHRoZSBiYXNlIGFkZHJlc3MgZm9yIHRoZSBmaWVsZHMgYmFzZWQgb246CiAgKiAtIHRoZSBmaWVsZCBzaXplIHN0b3JlZCBpbiB0aGUgRFMgY29uZmlndXJhdGlvbgogICogLSB0aGUgcmVsYXRpdmUgZmllbGQgcG9zaXRpb24KICAqCkBAIC00MzEsMjMgKzUwMSwyMyBAQAogCWJ0c190bywKIAlidHNfZmxhZ3MsCiAKLQlidHNfcXVhbCA9IGJ0c19mcm9tLAotCWJ0c19qaWZmaWVzID0gYnRzX3RvLAotCWJ0c19waWQgPSBidHNfZmxhZ3MsCisJYnRzX3F1YWwJCT0gYnRzX2Zyb20sCisJYnRzX2Nsb2NrCQk9IGJ0c190bywKKwlidHNfcGlkCQkJPSBidHNfZmxhZ3MsCiAKLQlidHNfcXVhbF9tYXNrID0gKGJ0c19xdWFsX21heCAtIDEpLAotCWJ0c19lc2NhcGUgPSAoKHVuc2lnbmVkIGxvbmcpLTEgJiB+YnRzX3F1YWxfbWFzaykKKwlidHNfcXVhbF9tYXNrCQk9IChidHNfcXVhbF9tYXggLSAxKSwKKwlidHNfZXNjYXBlCQk9ICgodW5zaWduZWQgbG9uZyktMSAmIH5idHNfcXVhbF9tYXNrKQogfTsKIAogc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGJ0c19nZXQoY29uc3QgY2hhciAqYmFzZSwgZW51bSBidHNfZmllbGQgZmllbGQpCiB7Ci0JYmFzZSArPSAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIGZpZWxkKTsKKwliYXNlICs9IChkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCAqIGZpZWxkKTsKIAlyZXR1cm4gKih1bnNpZ25lZCBsb25nICopYmFzZTsKIH0KIAogc3RhdGljIGlubGluZSB2b2lkIGJ0c19zZXQoY2hhciAqYmFzZSwgZW51bSBidHNfZmllbGQgZmllbGQsIHVuc2lnbmVkIGxvbmcgdmFsKQogewotCWJhc2UgKz0gKGRzX2NmZy5zaXplb2ZfZmllbGQgKiBmaWVsZCk7OworCWJhc2UgKz0gKGRzX2NmZy5zaXplb2ZfcHRyX2ZpZWxkICogZmllbGQpOzsKIAkoKih1bnNpZ25lZCBsb25nICopYmFzZSkgPSB2YWw7CiB9CiAKQEAgLTQ2Myw4ICs1MzMsOCBAQAogICoKICAqIHJldHVybjogYnl0ZXMgcmVhZC93cml0dGVuIG9uIHN1Y2Nlc3M7IC1FZXJybm8sIG90aGVyd2lzZQogICovCi1zdGF0aWMgaW50IGJ0c19yZWFkKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIsIGNvbnN0IHZvaWQgKmF0LAotCQkgICAgc3RydWN0IGJ0c19zdHJ1Y3QgKm91dCkKK3N0YXRpYyBpbnQKK2J0c19yZWFkKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIsIGNvbnN0IHZvaWQgKmF0LCBzdHJ1Y3QgYnRzX3N0cnVjdCAqb3V0KQogewogCWlmICghdHJhY2VyKQogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTQ3OCw4ICs1NDgsOCBAQAogCW1lbXNldChvdXQsIDAsIHNpemVvZigqb3V0KSk7CiAJaWYgKChidHNfZ2V0KGF0LCBidHNfcXVhbCkgJiB+YnRzX3F1YWxfbWFzaykgPT0gYnRzX2VzY2FwZSkgewogCQlvdXQtPnF1YWxpZmllciA9IChidHNfZ2V0KGF0LCBidHNfcXVhbCkgJiBidHNfcXVhbF9tYXNrKTsKLQkJb3V0LT52YXJpYW50LnRpbWVzdGFtcC5qaWZmaWVzID0gYnRzX2dldChhdCwgYnRzX2ppZmZpZXMpOwotCQlvdXQtPnZhcmlhbnQudGltZXN0YW1wLnBpZCA9IGJ0c19nZXQoYXQsIGJ0c19waWQpOworCQlvdXQtPnZhcmlhbnQuZXZlbnQuY2xvY2sgPSBidHNfZ2V0KGF0LCBidHNfY2xvY2spOworCQlvdXQtPnZhcmlhbnQuZXZlbnQucGlkID0gYnRzX2dldChhdCwgYnRzX3BpZCk7CiAJfSBlbHNlIHsKIAkJb3V0LT5xdWFsaWZpZXIgPSBidHNfYnJhbmNoOwogCQlvdXQtPnZhcmlhbnQubGJyLmZyb20gPSBidHNfZ2V0KGF0LCBidHNfZnJvbSk7CkBAIC01MTYsOCArNTg2LDggQEAKIAljYXNlIGJ0c190YXNrX2Fycml2ZXM6CiAJY2FzZSBidHNfdGFza19kZXBhcnRzOgogCQlidHNfc2V0KHJhdywgYnRzX3F1YWwsIChidHNfZXNjYXBlIHwgaW4tPnF1YWxpZmllcikpOwotCQlidHNfc2V0KHJhdywgYnRzX2ppZmZpZXMsIGluLT52YXJpYW50LnRpbWVzdGFtcC5qaWZmaWVzKTsKLQkJYnRzX3NldChyYXcsIGJ0c19waWQsIGluLT52YXJpYW50LnRpbWVzdGFtcC5waWQpOworCQlidHNfc2V0KHJhdywgYnRzX2Nsb2NrLCBpbi0+dmFyaWFudC5ldmVudC5jbG9jayk7CisJCWJ0c19zZXQocmF3LCBidHNfcGlkLCBpbi0+dmFyaWFudC5ldmVudC5waWQpOwogCQlicmVhazsKIAlkZWZhdWx0OgogCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTU1NSw3ICs2MjUsOCBAQAogCQkJICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MpIHsKIAl1bnNpZ25lZCBsb25nIGJ1ZmZlciwgYWRqOwogCi0JLyogYWRqdXN0IHRoZSBidWZmZXIgYWRkcmVzcyBhbmQgc2l6ZSB0byBtZWV0IGFsaWdubWVudAorCS8qCisJICogQWRqdXN0IHRoZSBidWZmZXIgYWRkcmVzcyBhbmQgc2l6ZSB0byBtZWV0IGFsaWdubWVudAogCSAqIGNvbnN0cmFpbnRzOgogCSAqIC0gYnVmZmVyIGlzIGRvdWJsZS13b3JkIGFsaWduZWQKIAkgKiAtIHNpemUgaXMgbXVsdGlwbGUgb2YgcmVjb3JkIHNpemUKQEAgLTU3Nyw5ICs2NDgsMTEgQEAKIAl0cmFjZS0+YmVnaW4gPSAodm9pZCAqKWJ1ZmZlcjsKIAl0cmFjZS0+dG9wID0gdHJhY2UtPmJlZ2luOwogCXRyYWNlLT5lbmQgPSAodm9pZCAqKShidWZmZXIgKyBzaXplKTsKLQkvKiBUaGUgdmFsdWUgZm9yICdubyB0aHJlc2hvbGQnIGlzIC0xLCB3aGljaCB3aWxsIHNldCB0aGUKKwkvKgorCSAqIFRoZSB2YWx1ZSBmb3IgJ25vIHRocmVzaG9sZCcgaXMgLTEsIHdoaWNoIHdpbGwgc2V0IHRoZQogCSAqIHRocmVzaG9sZCBvdXRzaWRlIG9mIHRoZSBidWZmZXIsIGp1c3QgbGlrZSB3ZSB3YW50IGl0LgogCSAqLworCWl0aCAqPSBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXTsKIAl0cmFjZS0+aXRoID0gKHZvaWQgKikoYnVmZmVyICsgc2l6ZSAtIGl0aCk7CiAKIAl0cmFjZS0+ZmxhZ3MgPSBmbGFnczsKQEAgLTU4OCwxOCArNjYxLDI3IEBACiAKIHN0YXRpYyBpbnQgZHNfcmVxdWVzdChzdHJ1Y3QgZHNfdHJhY2VyICp0cmFjZXIsIHN0cnVjdCBkc190cmFjZSAqdHJhY2UsCiAJCSAgICAgIGVudW0gZHNfcXVhbGlmaWVyIHF1YWwsIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKLQkJICAgICAgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsIHNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKQorCQkgICAgICBpbnQgY3B1LCB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHRoKQogewogCXN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0OwogCWludCBlcnJvcjsKKwlzaXplX3QgcmVxX3NpemU7CisKKwllcnJvciA9IC1FT1BOT1RTVVBQOworCWlmICghZHNfY2ZnLnNpemVvZl9yZWNbcXVhbF0pCisJCWdvdG8gb3V0OwogCiAJZXJyb3IgPSAtRUlOVkFMOwogCWlmICghYmFzZSkKIAkJZ290byBvdXQ7CiAKLQkvKiB3ZSByZXF1aXJlIHNvbWUgc3BhY2UgdG8gZG8gYWxpZ25tZW50IGFkanVzdG1lbnRzIGJlbG93ICovCisJcmVxX3NpemUgPSBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXTsKKwkvKiBXZSBtaWdodCBuZWVkIHNwYWNlIGZvciBhbGlnbm1lbnQgYWRqdXN0bWVudHMuICovCisJaWYgKCFJU19BTElHTkVEKCh1bnNpZ25lZCBsb25nKWJhc2UsIERTX0FMSUdOTUVOVCkpCisJCXJlcV9zaXplICs9IERTX0FMSUdOTUVOVDsKKwogCWVycm9yID0gLUVJTlZBTDsKLQlpZiAoc2l6ZSA8IChEU19BTElHTk1FTlQgKyBkc19jZmcuc2l6ZW9mX3JlY1txdWFsXSkpCisJaWYgKHNpemUgPCByZXFfc2l6ZSkKIAkJZ290byBvdXQ7CiAKIAlpZiAodGggIT0gKHNpemVfdCktMSkgewpAQCAtNjE0LDE4MiArNjk2LDMxOCBAQAogCXRyYWNlci0+c2l6ZSA9IHNpemU7CiAKIAllcnJvciA9IC1FTk9NRU07Ci0JY29udGV4dCA9IGRzX2dldF9jb250ZXh0KHRhc2spOworCWNvbnRleHQgPSBkc19nZXRfY29udGV4dCh0YXNrLCBjcHUpOwogCWlmICghY29udGV4dCkKIAkJZ290byBvdXQ7CiAJdHJhY2VyLT5jb250ZXh0ID0gY29udGV4dDsKIAotCWRzX2luaXRfZHNfdHJhY2UodHJhY2UsIHF1YWwsIGJhc2UsIHNpemUsIHRoLCBmbGFncyk7CisJLyoKKwkgKiBEZWZlciBhbnkgdHJhY2VyLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIHdvcmsgZm9yIHRoZSBjb250ZXh0IHVudGlsCisJICogY29udGV4dCBvd25lcnNoaXAgaGFzIGJlZW4gY2xhcmlmaWVkLgorCSAqLwogCiAJZXJyb3IgPSAwOwogIG91dDoKIAlyZXR1cm4gZXJyb3I7CiB9CiAKLXN0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkJICB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKLQkJCQkgIGJ0c19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwgc2l6ZV90IHRoLAotCQkJCSAgdW5zaWduZWQgaW50IGZsYWdzKQorc3RhdGljIHN0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0cyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjcHUsCisJCQkJCSB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJCQkJIGJ0c19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwgc2l6ZV90IHRoLAorCQkJCQkgdW5zaWduZWQgaW50IGZsYWdzKQogewogCXN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXI7Ci0JdW5zaWduZWQgbG9uZyBpcnE7CiAJaW50IGVycm9yOwogCi0JZXJyb3IgPSAtRU9QTk9UU1VQUDsKLQlpZiAoIWRzX2NmZy5jdGxbZHNmX2J0c10pCi0JCWdvdG8gb3V0OwotCi0JLyogYnVmZmVyIG92ZXJmbG93IG5vdGlmaWNhdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkICovCisJLyogQnVmZmVyIG92ZXJmbG93IG5vdGlmaWNhdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkLiAqLwogCWVycm9yID0gLUVPUE5PVFNVUFA7CiAJaWYgKG92ZmwpCiAJCWdvdG8gb3V0OwogCisJZXJyb3IgPSBnZXRfdHJhY2VyKHRhc2spOworCWlmIChlcnJvciA8IDApCisJCWdvdG8gb3V0OworCiAJZXJyb3IgPSAtRU5PTUVNOwogCXRyYWNlciA9IGt6YWxsb2Moc2l6ZW9mKCp0cmFjZXIpLCBHRlBfS0VSTkVMKTsKIAlpZiAoIXRyYWNlcikKLQkJZ290byBvdXQ7CisJCWdvdG8gb3V0X3B1dF90cmFjZXI7CiAJdHJhY2VyLT5vdmZsID0gb3ZmbDsKIAorCS8qIERvIHNvbWUgbW9yZSBlcnJvciBjaGVja2luZyBhbmQgYWNxdWlyZSBhIHRyYWNpbmcgY29udGV4dC4gKi8KIAllcnJvciA9IGRzX3JlcXVlc3QoJnRyYWNlci0+ZHMsICZ0cmFjZXItPnRyYWNlLmRzLAotCQkJICAgZHNfYnRzLCB0YXNrLCBiYXNlLCBzaXplLCB0aCwgZmxhZ3MpOworCQkJICAgZHNfYnRzLCB0YXNrLCBjcHUsIGJhc2UsIHNpemUsIHRoKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlnb3RvIG91dF90cmFjZXI7CiAKLQotCXNwaW5fbG9ja19pcnFzYXZlKCZkc19sb2NrLCBpcnEpOwotCi0JZXJyb3IgPSAtRVBFUk07Ci0JaWYgKCFjaGVja190cmFjZXIodGFzaykpCi0JCWdvdG8gb3V0X3VubG9jazsKLQlnZXRfdHJhY2VyKHRhc2spOworCS8qIENsYWltIHRoZSBidHMgcGFydCBvZiB0aGUgdHJhY2luZyBjb250ZXh0IHdlIGFjcXVpcmVkIGFib3ZlLiAqLworCXNwaW5fbG9ja19pcnEoJmRzX2xvY2spOwogCiAJZXJyb3IgPSAtRVBFUk07CiAJaWYgKHRyYWNlci0+ZHMuY29udGV4dC0+YnRzX21hc3RlcikKLQkJZ290byBvdXRfcHV0X3RyYWNlcjsKKwkJZ290byBvdXRfdW5sb2NrOwogCXRyYWNlci0+ZHMuY29udGV4dC0+YnRzX21hc3RlciA9IHRyYWNlcjsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRzX2xvY2ssIGlycSk7CisJc3Bpbl91bmxvY2tfaXJxKCZkc19sb2NrKTsKIAorCS8qCisJICogTm93IHRoYXQgd2Ugb3duIHRoZSBidHMgcGFydCBvZiB0aGUgY29udGV4dCwgbGV0J3MgY29tcGxldGUgdGhlCisJICogaW5pdGlhbGl6YXRpb24gZm9yIHRoYXQgcGFydC4KKwkgKi8KKwlkc19pbml0X2RzX3RyYWNlKCZ0cmFjZXItPnRyYWNlLmRzLCBkc19idHMsIGJhc2UsIHNpemUsIHRoLCBmbGFncyk7CisJZHNfd3JpdGVfY29uZmlnKHRyYWNlci0+ZHMuY29udGV4dCwgJnRyYWNlci0+dHJhY2UuZHMsIGRzX2J0cyk7CisJZHNfaW5zdGFsbF9kc19hcmVhKHRyYWNlci0+ZHMuY29udGV4dCk7CiAKIAl0cmFjZXItPnRyYWNlLnJlYWQgID0gYnRzX3JlYWQ7CiAJdHJhY2VyLT50cmFjZS53cml0ZSA9IGJ0c193cml0ZTsKIAotCWRzX3dyaXRlX2NvbmZpZyh0cmFjZXItPmRzLmNvbnRleHQsICZ0cmFjZXItPnRyYWNlLmRzLCBkc19idHMpOworCS8qIFN0YXJ0IHRyYWNpbmcuICovCiAJZHNfcmVzdW1lX2J0cyh0cmFjZXIpOwogCiAJcmV0dXJuIHRyYWNlcjsKIAotIG91dF9wdXRfdHJhY2VyOgotCXB1dF90cmFjZXIodGFzayk7CiAgb3V0X3VubG9jazoKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkc19sb2NrLCBpcnEpOworCXNwaW5fdW5sb2NrX2lycSgmZHNfbG9jayk7CiAJZHNfcHV0X2NvbnRleHQodHJhY2VyLT5kcy5jb250ZXh0KTsKICBvdXRfdHJhY2VyOgogCWtmcmVlKHRyYWNlcik7Cisgb3V0X3B1dF90cmFjZXI6CisJcHV0X3RyYWNlcih0YXNrKTsKICBvdXQ6CiAJcmV0dXJuIEVSUl9QVFIoZXJyb3IpOwogfQogCi1zdHJ1Y3QgcGVic190cmFjZXIgKmRzX3JlcXVlc3RfcGVicyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCi0JCQkJICAgIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAotCQkJCSAgICBwZWJzX292ZmxfY2FsbGJhY2tfdCBvdmZsLCBzaXplX3QgdGgsCi0JCQkJICAgIHVuc2lnbmVkIGludCBmbGFncykKK3N0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0c190YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgICAgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgIGJ0c19vdmZsX2NhbGxiYWNrX3Qgb3ZmbCwKKwkJCQkgICAgICAgc2l6ZV90IHRoLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJcmV0dXJuIGRzX3JlcXVlc3RfYnRzKHRhc2ssIDAsIGJhc2UsIHNpemUsIG92ZmwsIHRoLCBmbGFncyk7Cit9CisKK3N0cnVjdCBidHNfdHJhY2VyICpkc19yZXF1ZXN0X2J0c19jcHUoaW50IGNwdSwgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJICAgICAgYnRzX292ZmxfY2FsbGJhY2tfdCBvdmZsLAorCQkJCSAgICAgIHNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBkc19yZXF1ZXN0X2J0cyhOVUxMLCBjcHUsIGJhc2UsIHNpemUsIG92ZmwsIHRoLCBmbGFncyk7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgcGVic190cmFjZXIgKmRzX3JlcXVlc3RfcGVicyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjcHUsCisJCQkJCSAgIHZvaWQgKmJhc2UsIHNpemVfdCBzaXplLAorCQkJCQkgICBwZWJzX292ZmxfY2FsbGJhY2tfdCBvdmZsLCBzaXplX3QgdGgsCisJCQkJCSAgIHVuc2lnbmVkIGludCBmbGFncykKIHsKIAlzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcjsKLQl1bnNpZ25lZCBsb25nIGlycTsKIAlpbnQgZXJyb3I7CiAKLQkvKiBidWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQgKi8KKwkvKiBCdWZmZXIgb3ZlcmZsb3cgbm90aWZpY2F0aW9uIGlzIG5vdCB5ZXQgaW1wbGVtZW50ZWQuICovCiAJZXJyb3IgPSAtRU9QTk9UU1VQUDsKIAlpZiAob3ZmbCkKIAkJZ290byBvdXQ7CiAKKwllcnJvciA9IGdldF90cmFjZXIodGFzayk7CisJaWYgKGVycm9yIDwgMCkKKwkJZ290byBvdXQ7CisKIAllcnJvciA9IC1FTk9NRU07CiAJdHJhY2VyID0ga3phbGxvYyhzaXplb2YoKnRyYWNlciksIEdGUF9LRVJORUwpOwogCWlmICghdHJhY2VyKQotCQlnb3RvIG91dDsKKwkJZ290byBvdXRfcHV0X3RyYWNlcjsKIAl0cmFjZXItPm92ZmwgPSBvdmZsOwogCisJLyogRG8gc29tZSBtb3JlIGVycm9yIGNoZWNraW5nIGFuZCBhY3F1aXJlIGEgdHJhY2luZyBjb250ZXh0LiAqLwogCWVycm9yID0gZHNfcmVxdWVzdCgmdHJhY2VyLT5kcywgJnRyYWNlci0+dHJhY2UuZHMsCi0JCQkgICBkc19wZWJzLCB0YXNrLCBiYXNlLCBzaXplLCB0aCwgZmxhZ3MpOworCQkJICAgZHNfcGVicywgdGFzaywgY3B1LCBiYXNlLCBzaXplLCB0aCk7CiAJaWYgKGVycm9yIDwgMCkKIAkJZ290byBvdXRfdHJhY2VyOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmRzX2xvY2ssIGlycSk7Ci0KLQllcnJvciA9IC1FUEVSTTsKLQlpZiAoIWNoZWNrX3RyYWNlcih0YXNrKSkKLQkJZ290byBvdXRfdW5sb2NrOwotCWdldF90cmFjZXIodGFzayk7CisJLyogQ2xhaW0gdGhlIHBlYnMgcGFydCBvZiB0aGUgdHJhY2luZyBjb250ZXh0IHdlIGFjcXVpcmVkIGFib3ZlLiAqLworCXNwaW5fbG9ja19pcnEoJmRzX2xvY2spOwogCiAJZXJyb3IgPSAtRVBFUk07CiAJaWYgKHRyYWNlci0+ZHMuY29udGV4dC0+cGVic19tYXN0ZXIpCi0JCWdvdG8gb3V0X3B1dF90cmFjZXI7CisJCWdvdG8gb3V0X3VubG9jazsKIAl0cmFjZXItPmRzLmNvbnRleHQtPnBlYnNfbWFzdGVyID0gdHJhY2VyOwogCi0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgaXJxKTsKKwlzcGluX3VubG9ja19pcnEoJmRzX2xvY2spOwogCisJLyoKKwkgKiBOb3cgdGhhdCB3ZSBvd24gdGhlIHBlYnMgcGFydCBvZiB0aGUgY29udGV4dCwgbGV0J3MgY29tcGxldGUgdGhlCisJICogaW5pdGlhbGl6YXRpb24gZm9yIHRoYXQgcGFydC4KKwkgKi8KKwlkc19pbml0X2RzX3RyYWNlKCZ0cmFjZXItPnRyYWNlLmRzLCBkc19wZWJzLCBiYXNlLCBzaXplLCB0aCwgZmxhZ3MpOwogCWRzX3dyaXRlX2NvbmZpZyh0cmFjZXItPmRzLmNvbnRleHQsICZ0cmFjZXItPnRyYWNlLmRzLCBkc19wZWJzKTsKKwlkc19pbnN0YWxsX2RzX2FyZWEodHJhY2VyLT5kcy5jb250ZXh0KTsKKworCS8qIFN0YXJ0IHRyYWNpbmcuICovCiAJZHNfcmVzdW1lX3BlYnModHJhY2VyKTsKIAogCXJldHVybiB0cmFjZXI7CiAKLSBvdXRfcHV0X3RyYWNlcjoKLQlwdXRfdHJhY2VyKHRhc2spOwogIG91dF91bmxvY2s6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZHNfbG9jaywgaXJxKTsKKwlzcGluX3VubG9ja19pcnEoJmRzX2xvY2spOwogCWRzX3B1dF9jb250ZXh0KHRyYWNlci0+ZHMuY29udGV4dCk7CiAgb3V0X3RyYWNlcjoKIAlrZnJlZSh0cmFjZXIpOworIG91dF9wdXRfdHJhY2VyOgorCXB1dF90cmFjZXIodGFzayk7CiAgb3V0OgogCXJldHVybiBFUlJfUFRSKGVycm9yKTsKIH0KIAotdm9pZCBkc19yZWxlYXNlX2J0cyhzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQorc3RydWN0IHBlYnNfdHJhY2VyICpkc19yZXF1ZXN0X3BlYnNfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkJCSB2b2lkICpiYXNlLCBzaXplX3Qgc2l6ZSwKKwkJCQkJIHBlYnNfb3ZmbF9jYWxsYmFja190IG92ZmwsCisJCQkJCSBzaXplX3QgdGgsIHVuc2lnbmVkIGludCBmbGFncykKIHsKLQlpZiAoIXRyYWNlcikKLQkJcmV0dXJuOworCXJldHVybiBkc19yZXF1ZXN0X3BlYnModGFzaywgMCwgYmFzZSwgc2l6ZSwgb3ZmbCwgdGgsIGZsYWdzKTsKK30KIAotCWRzX3N1c3BlbmRfYnRzKHRyYWNlcik7CitzdHJ1Y3QgcGVic190cmFjZXIgKmRzX3JlcXVlc3RfcGVic19jcHUoaW50IGNwdSwgdm9pZCAqYmFzZSwgc2l6ZV90IHNpemUsCisJCQkJCXBlYnNfb3ZmbF9jYWxsYmFja190IG92ZmwsCisJCQkJCXNpemVfdCB0aCwgdW5zaWduZWQgaW50IGZsYWdzKQoreworCXJldHVybiBkc19yZXF1ZXN0X3BlYnMoTlVMTCwgY3B1LCBiYXNlLCBzaXplLCBvdmZsLCB0aCwgZmxhZ3MpOworfQorCitzdGF0aWMgdm9pZCBkc19mcmVlX2J0cyhzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKworCXRhc2sgPSB0cmFjZXItPmRzLmNvbnRleHQtPnRhc2s7CiAKIAlXQVJOX09OX09OQ0UodHJhY2VyLT5kcy5jb250ZXh0LT5idHNfbWFzdGVyICE9IHRyYWNlcik7CiAJdHJhY2VyLT5kcy5jb250ZXh0LT5idHNfbWFzdGVyID0gTlVMTDsKIAotCXB1dF90cmFjZXIodHJhY2VyLT5kcy5jb250ZXh0LT50YXNrKTsKKwkvKiBNYWtlIHN1cmUgdHJhY2luZyBzdG9wcGVkIGFuZCB0aGUgdHJhY2VyIGlzIG5vdCBpbiB1c2UuICovCisJaWYgKHRhc2sgJiYgKHRhc2sgIT0gY3VycmVudCkpCisJCXdhaXRfdGFza19jb250ZXh0X3N3aXRjaCh0YXNrKTsKKwogCWRzX3B1dF9jb250ZXh0KHRyYWNlci0+ZHMuY29udGV4dCk7CisJcHV0X3RyYWNlcih0YXNrKTsKIAogCWtmcmVlKHRyYWNlcik7CiB9CiAKK3ZvaWQgZHNfcmVsZWFzZV9idHMoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcikKK3sKKwltaWdodF9zbGVlcCgpOworCisJaWYgKCF0cmFjZXIpCisJCXJldHVybjsKKworCWRzX3N1c3BlbmRfYnRzKHRyYWNlcik7CisJZHNfZnJlZV9idHModHJhY2VyKTsKK30KKworaW50IGRzX3JlbGVhc2VfYnRzX25vaXJxKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXVuc2lnbmVkIGxvbmcgaXJxOworCWludCBlcnJvcjsKKworCWlmICghdHJhY2VyKQorCQlyZXR1cm4gMDsKKworCXRhc2sgPSB0cmFjZXItPmRzLmNvbnRleHQtPnRhc2s7CisKKwlsb2NhbF9pcnFfc2F2ZShpcnEpOworCisJZXJyb3IgPSAtRVBFUk07CisJaWYgKCF0YXNrICYmCisJICAgICh0cmFjZXItPmRzLmNvbnRleHQtPmNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQlnb3RvIG91dDsKKworCWVycm9yID0gLUVQRVJNOworCWlmICh0YXNrICYmICh0YXNrICE9IGN1cnJlbnQpKQorCQlnb3RvIG91dDsKKworCWRzX3N1c3BlbmRfYnRzX25vaXJxKHRyYWNlcik7CisJZHNfZnJlZV9idHModHJhY2VyKTsKKworCWVycm9yID0gMDsKKyBvdXQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoaXJxKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB2b2lkIHVwZGF0ZV90YXNrX2RlYnVnY3RsbXNyKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgdW5zaWduZWQgbG9uZyBkZWJ1Z2N0bG1zcikKK3sKKwl0YXNrLT50aHJlYWQuZGVidWdjdGxtc3IgPSBkZWJ1Z2N0bG1zcjsKKworCWdldF9jcHUoKTsKKwlpZiAodGFzayA9PSBjdXJyZW50KQorCQl1cGRhdGVfZGVidWdjdGxtc3IoZGVidWdjdGxtc3IpOworCXB1dF9jcHUoKTsKK30KKwogdm9pZCBkc19zdXNwZW5kX2J0cyhzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwl1bnNpZ25lZCBsb25nIGRlYnVnY3RsbXNyOworCWludCBjcHU7CiAKIAlpZiAoIXRyYWNlcikKIAkJcmV0dXJuOwogCisJdHJhY2VyLT5mbGFncyA9IDA7CisKIAl0YXNrID0gdHJhY2VyLT5kcy5jb250ZXh0LT50YXNrOworCWNwdSAgPSB0cmFjZXItPmRzLmNvbnRleHQtPmNwdTsKIAotCWlmICghdGFzayB8fCAodGFzayA9PSBjdXJyZW50KSkKLQkJdXBkYXRlX2RlYnVnY3RsbXNyKGdldF9kZWJ1Z2N0bG1zcigpICYgfkJUU19DT05UUk9MKTsKKwlXQVJOX09OKCF0YXNrICYmIGlycXNfZGlzYWJsZWQoKSk7CiAKLQlpZiAodGFzaykgewotCQl0YXNrLT50aHJlYWQuZGVidWdjdGxtc3IgJj0gfkJUU19DT05UUk9MOworCWRlYnVnY3RsbXNyID0gKHRhc2sgPworCQkgICAgICAgdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIDoKKwkJICAgICAgIGdldF9kZWJ1Z2N0bG1zcl9vbl9jcHUoY3B1KSk7CisJZGVidWdjdGxtc3IgJj0gfkJUU19DT05UUk9MOwogCi0JCWlmICghdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyKQotCQkJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHRhc2ssIFRJRl9ERUJVR0NUTE1TUik7Ci0JfQorCWlmICh0YXNrKQorCQl1cGRhdGVfdGFza19kZWJ1Z2N0bG1zcih0YXNrLCBkZWJ1Z2N0bG1zcik7CisJZWxzZQorCQl1cGRhdGVfZGVidWdjdGxtc3Jfb25fY3B1KGNwdSwgZGVidWdjdGxtc3IpOwogfQogCi12b2lkIGRzX3Jlc3VtZV9idHMoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcikKK2ludCBkc19zdXNwZW5kX2J0c19ub2lycShzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKLQl1bnNpZ25lZCBsb25nIGNvbnRyb2w7CisJdW5zaWduZWQgbG9uZyBkZWJ1Z2N0bG1zciwgaXJxOworCWludCBjcHUsIGVycm9yID0gMDsKIAogCWlmICghdHJhY2VyKQotCQlyZXR1cm47CisJCXJldHVybiAwOworCisJdHJhY2VyLT5mbGFncyA9IDA7CiAKIAl0YXNrID0gdHJhY2VyLT5kcy5jb250ZXh0LT50YXNrOworCWNwdSAgPSB0cmFjZXItPmRzLmNvbnRleHQtPmNwdTsKKworCWxvY2FsX2lycV9zYXZlKGlycSk7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoIXRhc2sgJiYgKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQlnb3RvIG91dDsKKworCWRlYnVnY3RsbXNyID0gKHRhc2sgPworCQkgICAgICAgdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIDoKKwkJICAgICAgIGdldF9kZWJ1Z2N0bG1zcigpKTsKKwlkZWJ1Z2N0bG1zciAmPSB+QlRTX0NPTlRST0w7CisKKwlpZiAodGFzaykKKwkJdXBkYXRlX3Rhc2tfZGVidWdjdGxtc3IodGFzaywgZGVidWdjdGxtc3IpOworCWVsc2UKKwkJdXBkYXRlX2RlYnVnY3RsbXNyKGRlYnVnY3RsbXNyKTsKKworCWVycm9yID0gMDsKKyBvdXQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoaXJxKTsKKwlyZXR1cm4gZXJyb3I7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIGRzX2J0c19jb250cm9sKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpCit7CisJdW5zaWduZWQgbG9uZyBjb250cm9sOwogCiAJY29udHJvbCA9IGRzX2NmZy5jdGxbZHNmX2J0c107CiAJaWYgKCEodHJhY2VyLT50cmFjZS5kcy5mbGFncyAmIEJUU19LRVJORUwpKQpAQCAtNzk3LDQxICsxMDE1LDE0OSBAQAogCWlmICghKHRyYWNlci0+dHJhY2UuZHMuZmxhZ3MgJiBCVFNfVVNFUikpCiAJCWNvbnRyb2wgfD0gZHNfY2ZnLmN0bFtkc2ZfYnRzX3VzZXJdOwogCi0JaWYgKHRhc2spIHsKLQkJdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIHw9IGNvbnRyb2w7Ci0JCXNldF90c2tfdGhyZWFkX2ZsYWcodGFzaywgVElGX0RFQlVHQ1RMTVNSKTsKLQl9Ci0KLQlpZiAoIXRhc2sgfHwgKHRhc2sgPT0gY3VycmVudCkpCi0JCXVwZGF0ZV9kZWJ1Z2N0bG1zcihnZXRfZGVidWdjdGxtc3IoKSB8IGNvbnRyb2wpOworCXJldHVybiBjb250cm9sOwogfQogCi12b2lkIGRzX3JlbGVhc2VfcGVicyhzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcikKK3ZvaWQgZHNfcmVzdW1lX2J0cyhzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQogeworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwl1bnNpZ25lZCBsb25nIGRlYnVnY3RsbXNyOworCWludCBjcHU7CisKIAlpZiAoIXRyYWNlcikKIAkJcmV0dXJuOwogCi0JZHNfc3VzcGVuZF9wZWJzKHRyYWNlcik7CisJdHJhY2VyLT5mbGFncyA9IHRyYWNlci0+dHJhY2UuZHMuZmxhZ3M7CisKKwl0YXNrID0gdHJhY2VyLT5kcy5jb250ZXh0LT50YXNrOworCWNwdSAgPSB0cmFjZXItPmRzLmNvbnRleHQtPmNwdTsKKworCVdBUk5fT04oIXRhc2sgJiYgaXJxc19kaXNhYmxlZCgpKTsKKworCWRlYnVnY3RsbXNyID0gKHRhc2sgPworCQkgICAgICAgdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIDoKKwkJICAgICAgIGdldF9kZWJ1Z2N0bG1zcl9vbl9jcHUoY3B1KSk7CisJZGVidWdjdGxtc3IgfD0gZHNfYnRzX2NvbnRyb2wodHJhY2VyKTsKKworCWlmICh0YXNrKQorCQl1cGRhdGVfdGFza19kZWJ1Z2N0bG1zcih0YXNrLCBkZWJ1Z2N0bG1zcik7CisJZWxzZQorCQl1cGRhdGVfZGVidWdjdGxtc3Jfb25fY3B1KGNwdSwgZGVidWdjdGxtc3IpOworfQorCitpbnQgZHNfcmVzdW1lX2J0c19ub2lycShzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQoreworCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKwl1bnNpZ25lZCBsb25nIGRlYnVnY3RsbXNyLCBpcnE7CisJaW50IGNwdSwgZXJyb3IgPSAwOworCisJaWYgKCF0cmFjZXIpCisJCXJldHVybiAwOworCisJdHJhY2VyLT5mbGFncyA9IHRyYWNlci0+dHJhY2UuZHMuZmxhZ3M7CisKKwl0YXNrID0gdHJhY2VyLT5kcy5jb250ZXh0LT50YXNrOworCWNwdSAgPSB0cmFjZXItPmRzLmNvbnRleHQtPmNwdTsKKworCWxvY2FsX2lycV9zYXZlKGlycSk7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoIXRhc2sgJiYgKGNwdSAhPSBzbXBfcHJvY2Vzc29yX2lkKCkpKQorCQlnb3RvIG91dDsKKworCWRlYnVnY3RsbXNyID0gKHRhc2sgPworCQkgICAgICAgdGFzay0+dGhyZWFkLmRlYnVnY3RsbXNyIDoKKwkJICAgICAgIGdldF9kZWJ1Z2N0bG1zcigpKTsKKwlkZWJ1Z2N0bG1zciB8PSBkc19idHNfY29udHJvbCh0cmFjZXIpOworCisJaWYgKHRhc2spCisJCXVwZGF0ZV90YXNrX2RlYnVnY3RsbXNyKHRhc2ssIGRlYnVnY3RsbXNyKTsKKwllbHNlCisJCXVwZGF0ZV9kZWJ1Z2N0bG1zcihkZWJ1Z2N0bG1zcik7CisKKwllcnJvciA9IDA7Cisgb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGlycSk7CisJcmV0dXJuIGVycm9yOworfQorCitzdGF0aWMgdm9pZCBkc19mcmVlX3BlYnMoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCisJdGFzayA9IHRyYWNlci0+ZHMuY29udGV4dC0+dGFzazsKIAogCVdBUk5fT05fT05DRSh0cmFjZXItPmRzLmNvbnRleHQtPnBlYnNfbWFzdGVyICE9IHRyYWNlcik7CiAJdHJhY2VyLT5kcy5jb250ZXh0LT5wZWJzX21hc3RlciA9IE5VTEw7CiAKLQlwdXRfdHJhY2VyKHRyYWNlci0+ZHMuY29udGV4dC0+dGFzayk7CiAJZHNfcHV0X2NvbnRleHQodHJhY2VyLT5kcy5jb250ZXh0KTsKKwlwdXRfdHJhY2VyKHRhc2spOwogCiAJa2ZyZWUodHJhY2VyKTsKIH0KIAordm9pZCBkc19yZWxlYXNlX3BlYnMoc3RydWN0IHBlYnNfdHJhY2VyICp0cmFjZXIpCit7CisJbWlnaHRfc2xlZXAoKTsKKworCWlmICghdHJhY2VyKQorCQlyZXR1cm47CisKKwlkc19zdXNwZW5kX3BlYnModHJhY2VyKTsKKwlkc19mcmVlX3BlYnModHJhY2VyKTsKK30KKworaW50IGRzX3JlbGVhc2VfcGVic19ub2lycShzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcikKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJdW5zaWduZWQgbG9uZyBpcnE7CisJaW50IGVycm9yOworCisJaWYgKCF0cmFjZXIpCisJCXJldHVybiAwOworCisJdGFzayA9IHRyYWNlci0+ZHMuY29udGV4dC0+dGFzazsKKworCWxvY2FsX2lycV9zYXZlKGlycSk7CisKKwllcnJvciA9IC1FUEVSTTsKKwlpZiAoIXRhc2sgJiYKKwkgICAgKHRyYWNlci0+ZHMuY29udGV4dC0+Y3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkpCisJCWdvdG8gb3V0OworCisJZXJyb3IgPSAtRVBFUk07CisJaWYgKHRhc2sgJiYgKHRhc2sgIT0gY3VycmVudCkpCisJCWdvdG8gb3V0OworCisJZHNfc3VzcGVuZF9wZWJzX25vaXJxKHRyYWNlcik7CisJZHNfZnJlZV9wZWJzKHRyYWNlcik7CisKKwllcnJvciA9IDA7Cisgb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGlycSk7CisJcmV0dXJuIGVycm9yOworfQorCiB2b2lkIGRzX3N1c3BlbmRfcGVicyhzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcikKIHsKIAogfQogCitpbnQgZHNfc3VzcGVuZF9wZWJzX25vaXJxKHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyKQoreworCXJldHVybiAwOworfQorCiB2b2lkIGRzX3Jlc3VtZV9wZWJzKHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyKQogewogCiB9CiAKK2ludCBkc19yZXN1bWVfcGVic19ub2lycShzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlcikKK3sKKwlyZXR1cm4gMDsKK30KKwogY29uc3Qgc3RydWN0IGJ0c190cmFjZSAqZHNfcmVhZF9idHMoc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcikKIHsKIAlpZiAoIXRyYWNlcikKQEAgLTg0Nyw4ICsxMTczLDEyIEBACiAJCXJldHVybiBOVUxMOwogCiAJZHNfcmVhZF9jb25maWcodHJhY2VyLT5kcy5jb250ZXh0LCAmdHJhY2VyLT50cmFjZS5kcywgZHNfcGVicyk7Ci0JdHJhY2VyLT50cmFjZS5yZXNldF92YWx1ZSA9Ci0JCSoodTY0ICopKHRyYWNlci0+ZHMuY29udGV4dC0+ZHMgKyAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIDgpKTsKKworCXRyYWNlci0+dHJhY2UuY291bnRlcnMgPSBkc19jZmcubnJfY291bnRlcl9yZXNldDsKKwltZW1jcHkodHJhY2VyLT50cmFjZS5jb3VudGVyX3Jlc2V0LAorCSAgICAgICB0cmFjZXItPmRzLmNvbnRleHQtPmRzICsKKwkgICAgICAgKE5VTV9EU19QVFJfRklFTERTICogZHNfY2ZnLnNpemVvZl9wdHJfZmllbGQpLAorCSAgICAgICBkc19jZmcubnJfY291bnRlcl9yZXNldCAqIFBFQlNfUkVTRVRfRklFTERfU0laRSk7CiAKIAlyZXR1cm4gJnRyYWNlci0+dHJhY2U7CiB9CkBAIC04NzMsMTggKzEyMDMsMjQgQEAKIAogCXRyYWNlci0+dHJhY2UuZHMudG9wID0gdHJhY2VyLT50cmFjZS5kcy5iZWdpbjsKIAotCWRzX3NldCh0cmFjZXItPmRzLmNvbnRleHQtPmRzLCBkc19idHMsIGRzX2luZGV4LAorCWRzX3NldCh0cmFjZXItPmRzLmNvbnRleHQtPmRzLCBkc19wZWJzLCBkc19pbmRleCwKIAkgICAgICAgKHVuc2lnbmVkIGxvbmcpdHJhY2VyLT50cmFjZS5kcy50b3ApOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBkc19zZXRfcGVic19yZXNldChzdHJ1Y3QgcGVic190cmFjZXIgKnRyYWNlciwgdTY0IHZhbHVlKQoraW50IGRzX3NldF9wZWJzX3Jlc2V0KHN0cnVjdCBwZWJzX3RyYWNlciAqdHJhY2VyLAorCQkgICAgICB1bnNpZ25lZCBpbnQgY291bnRlciwgdTY0IHZhbHVlKQogewogCWlmICghdHJhY2VyKQogCQlyZXR1cm4gLUVJTlZBTDsKIAotCSoodTY0ICopKHRyYWNlci0+ZHMuY29udGV4dC0+ZHMgKyAoZHNfY2ZnLnNpemVvZl9maWVsZCAqIDgpKSA9IHZhbHVlOworCWlmIChkc19jZmcubnJfY291bnRlcl9yZXNldCA8IGNvdW50ZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJKih1NjQgKikodHJhY2VyLT5kcy5jb250ZXh0LT5kcyArCisJCSAoTlVNX0RTX1BUUl9GSUVMRFMgKiBkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCkgKworCQkgKGNvdW50ZXIgKiBQRUJTX1JFU0VUX0ZJRUxEX1NJWkUpKSA9IHZhbHVlOwogCiAJcmV0dXJuIDA7CiB9CkBAIC04OTQsNzMgKzEyMzAsMTE3IEBACiAJLmN0bFtkc2ZfYnRzXQkJPSAoMSA8PCAyKSB8ICgxIDw8IDMpLAogCS5jdGxbZHNmX2J0c19rZXJuZWxdCT0gKDEgPDwgNSksCiAJLmN0bFtkc2ZfYnRzX3VzZXJdCT0gKDEgPDwgNiksCi0KLQkuc2l6ZW9mX2ZpZWxkCQk9IHNpemVvZihsb25nKSwKLQkuc2l6ZW9mX3JlY1tkc19idHNdCT0gc2l6ZW9mKGxvbmcpICogMywKLSNpZmRlZiBfX2kzODZfXwotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gc2l6ZW9mKGxvbmcpICogMTAsCi0jZWxzZQotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gc2l6ZW9mKGxvbmcpICogMTgsCi0jZW5kaWYKKwkubnJfY291bnRlcl9yZXNldAk9IDEsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBkc19jb25maWd1cmF0aW9uIGRzX2NmZ19wZW50aXVtX20gPSB7CiAJLm5hbWUgPSAiUGVudGl1bSBNIiwKIAkuY3RsW2RzZl9idHNdCQk9ICgxIDw8IDYpIHwgKDEgPDwgNyksCi0KLQkuc2l6ZW9mX2ZpZWxkCQk9IHNpemVvZihsb25nKSwKLQkuc2l6ZW9mX3JlY1tkc19idHNdCT0gc2l6ZW9mKGxvbmcpICogMywKLSNpZmRlZiBfX2kzODZfXwotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gc2l6ZW9mKGxvbmcpICogMTAsCi0jZWxzZQotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gc2l6ZW9mKGxvbmcpICogMTgsCi0jZW5kaWYKKwkubnJfY291bnRlcl9yZXNldAk9IDEsCiB9Owogc3RhdGljIGNvbnN0IHN0cnVjdCBkc19jb25maWd1cmF0aW9uIGRzX2NmZ19jb3JlMl9hdG9tID0gewogCS5uYW1lID0gIkNvcmUgMi9BdG9tIiwKIAkuY3RsW2RzZl9idHNdCQk9ICgxIDw8IDYpIHwgKDEgPDwgNyksCiAJLmN0bFtkc2ZfYnRzX2tlcm5lbF0JPSAoMSA8PCA5KSwKIAkuY3RsW2RzZl9idHNfdXNlcl0JPSAoMSA8PCAxMCksCi0KLQkuc2l6ZW9mX2ZpZWxkCQk9IDgsCi0JLnNpemVvZl9yZWNbZHNfYnRzXQk9IDggKiAzLAotCS5zaXplb2ZfcmVjW2RzX3BlYnNdCT0gOCAqIDE4LAorCS5ucl9jb3VudGVyX3Jlc2V0CT0gMSwKK307CitzdGF0aWMgY29uc3Qgc3RydWN0IGRzX2NvbmZpZ3VyYXRpb24gZHNfY2ZnX2NvcmVfaTcgPSB7CisJLm5hbWUgPSAiQ29yZSBpNyIsCisJLmN0bFtkc2ZfYnRzXQkJPSAoMSA8PCA2KSB8ICgxIDw8IDcpLAorCS5jdGxbZHNmX2J0c19rZXJuZWxdCT0gKDEgPDwgOSksCisJLmN0bFtkc2ZfYnRzX3VzZXJdCT0gKDEgPDwgMTApLAorCS5ucl9jb3VudGVyX3Jlc2V0CT0gNCwKIH07CiAKIHN0YXRpYyB2b2lkCi1kc19jb25maWd1cmUoY29uc3Qgc3RydWN0IGRzX2NvbmZpZ3VyYXRpb24gKmNmZykKK2RzX2NvbmZpZ3VyZShjb25zdCBzdHJ1Y3QgZHNfY29uZmlndXJhdGlvbiAqY2ZnLAorCSAgICAgc3RydWN0IGNwdWluZm9feDg2ICpjcHUpCiB7CisJdW5zaWduZWQgbG9uZyBucl9wZWJzX2ZpZWxkcyA9IDA7CisKKwlwcmludGsoS0VSTl9JTkZPICJbZHNdIHVzaW5nICVzIGNvbmZpZ3VyYXRpb25cbiIsIGNmZy0+bmFtZSk7CisKKyNpZmRlZiBfX2kzODZfXworCW5yX3BlYnNfZmllbGRzID0gMTA7CisjZWxzZQorCW5yX3BlYnNfZmllbGRzID0gMTg7CisjZW5kaWYKKworCS8qCisJICogU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIsIGFyY2hpdGVjdHVyYWwgcGVyZm9ybWFuY2UKKwkgKiBtb25pdG9yaW5nIHN1cHBvcnRzIGEgZm9ybWF0IHNwZWNpZmllci4KKwkgKi8KKwlpZiAoKGNwdWlkX2VheCgweGEpICYgMHhmZikgPiAxKSB7CisJCXVuc2lnbmVkIGxvbmcgcGVyZl9jYXBhYmlsaXRpZXMsIGZvcm1hdDsKKworCQlyZG1zcmwoTVNSX0lBMzJfUEVSRl9DQVBBQklMSVRJRVMsIHBlcmZfY2FwYWJpbGl0aWVzKTsKKworCQlmb3JtYXQgPSAocGVyZl9jYXBhYmlsaXRpZXMgPj4gOCkgJiAweGY7CisKKwkJc3dpdGNoIChmb3JtYXQpIHsKKwkJY2FzZSAwOgorCQkJbnJfcGVic19maWVsZHMgPSAxODsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlucl9wZWJzX2ZpZWxkcyA9IDIyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlwcmludGsoS0VSTl9JTkZPCisJCQkgICAgICAgIltkc10gdW5rbm93biBQRUJTIGZvcm1hdDogJWx1XG4iLCBmb3JtYXQpOworCQkJbnJfcGVic19maWVsZHMgPSAwOworCQkJYnJlYWs7CisJCX0KKwl9CisKIAltZW1zZXQoJmRzX2NmZywgMCwgc2l6ZW9mKGRzX2NmZykpOwogCWRzX2NmZyA9ICpjZmc7CiAKLQlwcmludGsoS0VSTl9JTkZPICJbZHNdIHVzaW5nICVzIGNvbmZpZ3VyYXRpb25cbiIsIGRzX2NmZy5uYW1lKTsKKwlkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCA9CisJCShjcHVfaGFzKGNwdSwgWDg2X0ZFQVRVUkVfRFRFUzY0KSA/IDggOiA0KTsKIAotCWlmICghY3B1X2hhc19idHMpIHsKLQkJZHNfY2ZnLmN0bFtkc2ZfYnRzXSA9IDA7CisJZHNfY2ZnLnNpemVvZl9yZWNbZHNfYnRzXSAgPSBkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCAqIDM7CisJZHNfY2ZnLnNpemVvZl9yZWNbZHNfcGVic10gPSBkc19jZmcuc2l6ZW9mX3B0cl9maWVsZCAqIG5yX3BlYnNfZmllbGRzOworCisJaWYgKCFjcHVfaGFzKGNwdSwgWDg2X0ZFQVRVUkVfQlRTKSkgeworCQlkc19jZmcuc2l6ZW9mX3JlY1tkc19idHNdID0gMDsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiW2RzXSBidHMgbm90IGF2YWlsYWJsZVxuIik7CiAJfQotCWlmICghY3B1X2hhc19wZWJzKQorCWlmICghY3B1X2hhcyhjcHUsIFg4Nl9GRUFUVVJFX1BFQlMpKSB7CisJCWRzX2NmZy5zaXplb2ZfcmVjW2RzX3BlYnNdID0gMDsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiW2RzXSBwZWJzIG5vdCBhdmFpbGFibGVcbiIpOworCX0KIAotCVdBUk5fT05fT05DRShNQVhfU0laRU9GX0RTIDwgKDEyICogZHNfY2ZnLnNpemVvZl9maWVsZCkpOworCXByaW50ayhLRVJOX0lORk8gIltkc10gc2l6ZXM6IGFkZHJlc3M6ICV1IGJpdCwgIiwKKwkgICAgICAgOCAqIGRzX2NmZy5zaXplb2ZfcHRyX2ZpZWxkKTsKKwlwcmludGsoImJ0cy9wZWJzIHJlY29yZDogJXUvJXUgYnl0ZXNcbiIsCisJICAgICAgIGRzX2NmZy5zaXplb2ZfcmVjW2RzX2J0c10sIGRzX2NmZy5zaXplb2ZfcmVjW2RzX3BlYnNdKTsKKworCVdBUk5fT05fT05DRShNQVhfUEVCU19DT1VOVEVSUyA8IGRzX2NmZy5ucl9jb3VudGVyX3Jlc2V0KTsKIH0KIAogdm9pZCBfX2NwdWluaXQgZHNfaW5pdF9pbnRlbChzdHJ1Y3QgY3B1aW5mb194ODYgKmMpCiB7CisJLyogT25seSBjb25maWd1cmUgdGhlIGZpcnN0IGNwdS4gT3RoZXJzIGFyZSBpZGVudGljYWwuICovCisJaWYgKGRzX2NmZy5uYW1lKQorCQlyZXR1cm47CisKIAlzd2l0Y2ggKGMtPng4NikgewogCWNhc2UgMHg2OgogCQlzd2l0Y2ggKGMtPng4Nl9tb2RlbCkgewogCQljYXNlIDB4OToKIAkJY2FzZSAweGQ6IC8qIFBlbnRpdW0gTSAqLwotCQkJZHNfY29uZmlndXJlKCZkc19jZmdfcGVudGl1bV9tKTsKKwkJCWRzX2NvbmZpZ3VyZSgmZHNfY2ZnX3BlbnRpdW1fbSwgYyk7CiAJCQlicmVhazsKIAkJY2FzZSAweGY6CiAJCWNhc2UgMHgxNzogLyogQ29yZTIgKi8KIAkJY2FzZSAweDFjOiAvKiBBdG9tICovCi0JCQlkc19jb25maWd1cmUoJmRzX2NmZ19jb3JlMl9hdG9tKTsKKwkJCWRzX2NvbmZpZ3VyZSgmZHNfY2ZnX2NvcmUyX2F0b20sIGMpOwogCQkJYnJlYWs7Ci0JCWNhc2UgMHgxYTogLyogaTcgKi8KKwkJY2FzZSAweDFhOiAvKiBDb3JlIGk3ICovCisJCQlkc19jb25maWd1cmUoJmRzX2NmZ19jb3JlX2k3LCBjKTsKKwkJCWJyZWFrOwogCQlkZWZhdWx0OgotCQkJLyogc29ycnksIGRvbid0IGtub3cgYWJvdXQgdGhlbSAqLworCQkJLyogU29ycnksIGRvbid0IGtub3cgYWJvdXQgdGhlbS4gKi8KIAkJCWJyZWFrOwogCQl9CiAJCWJyZWFrOwpAQCAtOTY5LDY0ICsxMzQ5LDg5IEBACiAJCWNhc2UgMHgwOgogCQljYXNlIDB4MToKIAkJY2FzZSAweDI6IC8qIE5ldGJ1cnN0ICovCi0JCQlkc19jb25maWd1cmUoJmRzX2NmZ19uZXRidXJzdCk7CisJCQlkc19jb25maWd1cmUoJmRzX2NmZ19uZXRidXJzdCwgYyk7CiAJCQlicmVhazsKIAkJZGVmYXVsdDoKLQkJCS8qIHNvcnJ5LCBkb24ndCBrbm93IGFib3V0IHRoZW0gKi8KKwkJCS8qIFNvcnJ5LCBkb24ndCBrbm93IGFib3V0IHRoZW0uICovCiAJCQlicmVhazsKIAkJfQogCQlicmVhazsKIAlkZWZhdWx0OgotCQkvKiBzb3JyeSwgZG9uJ3Qga25vdyBhYm91dCB0aGVtICovCisJCS8qIFNvcnJ5LCBkb24ndCBrbm93IGFib3V0IHRoZW0uICovCiAJCWJyZWFrOwogCX0KIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGRzX3Rha2VfdGltZXN0YW1wKHN0cnVjdCBkc19jb250ZXh0ICpjb250ZXh0LAorCQkJCSAgICAgZW51bSBidHNfcXVhbGlmaWVyIHF1YWxpZmllciwKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyID0gY29udGV4dC0+YnRzX21hc3RlcjsKKwlzdHJ1Y3QgYnRzX3N0cnVjdCB0czsKKworCS8qIFByZXZlbnQgY29tcGlsZXJzIGZyb20gcmVhZGluZyB0aGUgdHJhY2VyIHBvaW50ZXIgdHdpY2UuICovCisJYmFycmllcigpOworCisJaWYgKCF0cmFjZXIgfHwgISh0cmFjZXItPmZsYWdzICYgQlRTX1RJTUVTVEFNUFMpKQorCQlyZXR1cm47CisKKwltZW1zZXQoJnRzLCAwLCBzaXplb2YodHMpKTsKKwl0cy5xdWFsaWZpZXIJCT0gcXVhbGlmaWVyOworCXRzLnZhcmlhbnQuZXZlbnQuY2xvY2sJPSB0cmFjZV9jbG9ja19nbG9iYWwoKTsKKwl0cy52YXJpYW50LmV2ZW50LnBpZAk9IHRhc2stPnBpZDsKKworCWJ0c193cml0ZSh0cmFjZXIsICZ0cyk7Cit9CisKIC8qCiAgKiBDaGFuZ2UgdGhlIERTIGNvbmZpZ3VyYXRpb24gZnJvbSB0cmFjaW5nIHByZXYgdG8gdHJhY2luZyBuZXh0LgogICovCiB2b2lkIGRzX3N3aXRjaF90byhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnByZXYsIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlzdHJ1Y3QgZHNfY29udGV4dCAqcHJldl9jdHggPSBwcmV2LT50aHJlYWQuZHNfY3R4OwotCXN0cnVjdCBkc19jb250ZXh0ICpuZXh0X2N0eCA9IG5leHQtPnRocmVhZC5kc19jdHg7CisJc3RydWN0IGRzX2NvbnRleHQgKnByZXZfY3R4CT0gcHJldi0+dGhyZWFkLmRzX2N0eDsKKwlzdHJ1Y3QgZHNfY29udGV4dCAqbmV4dF9jdHgJPSBuZXh0LT50aHJlYWQuZHNfY3R4OworCXVuc2lnbmVkIGxvbmcgZGVidWdjdGxtc3IJPSBuZXh0LT50aHJlYWQuZGVidWdjdGxtc3I7CisKKwkvKiBNYWtlIHN1cmUgYWxsIGRhdGEgaXMgcmVhZCBiZWZvcmUgd2Ugc3RhcnQuICovCisJYmFycmllcigpOwogCiAJaWYgKHByZXZfY3R4KSB7CiAJCXVwZGF0ZV9kZWJ1Z2N0bG1zcigwKTsKIAotCQlpZiAocHJldl9jdHgtPmJ0c19tYXN0ZXIgJiYKLQkJICAgIChwcmV2X2N0eC0+YnRzX21hc3Rlci0+dHJhY2UuZHMuZmxhZ3MgJiBCVFNfVElNRVNUQU1QUykpIHsKLQkJCXN0cnVjdCBidHNfc3RydWN0IHRzID0gewotCQkJCS5xdWFsaWZpZXIgPSBidHNfdGFza19kZXBhcnRzLAotCQkJCS52YXJpYW50LnRpbWVzdGFtcC5qaWZmaWVzID0gamlmZmllc182NCwKLQkJCQkudmFyaWFudC50aW1lc3RhbXAucGlkID0gcHJldi0+cGlkCi0JCQl9OwotCQkJYnRzX3dyaXRlKHByZXZfY3R4LT5idHNfbWFzdGVyLCAmdHMpOwotCQl9CisJCWRzX3Rha2VfdGltZXN0YW1wKHByZXZfY3R4LCBidHNfdGFza19kZXBhcnRzLCBwcmV2KTsKIAl9CiAKIAlpZiAobmV4dF9jdHgpIHsKLQkJaWYgKG5leHRfY3R4LT5idHNfbWFzdGVyICYmCi0JCSAgICAobmV4dF9jdHgtPmJ0c19tYXN0ZXItPnRyYWNlLmRzLmZsYWdzICYgQlRTX1RJTUVTVEFNUFMpKSB7Ci0JCQlzdHJ1Y3QgYnRzX3N0cnVjdCB0cyA9IHsKLQkJCQkucXVhbGlmaWVyID0gYnRzX3Rhc2tfYXJyaXZlcywKLQkJCQkudmFyaWFudC50aW1lc3RhbXAuamlmZmllcyA9IGppZmZpZXNfNjQsCi0JCQkJLnZhcmlhbnQudGltZXN0YW1wLnBpZCA9IG5leHQtPnBpZAotCQkJfTsKLQkJCWJ0c193cml0ZShuZXh0X2N0eC0+YnRzX21hc3RlciwgJnRzKTsKLQkJfQorCQlkc190YWtlX3RpbWVzdGFtcChuZXh0X2N0eCwgYnRzX3Rhc2tfYXJyaXZlcywgbmV4dCk7CiAKIAkJd3Jtc3JsKE1TUl9JQTMyX0RTX0FSRUEsICh1bnNpZ25lZCBsb25nKW5leHRfY3R4LT5kcyk7CiAJfQogCi0JdXBkYXRlX2RlYnVnY3RsbXNyKG5leHQtPnRocmVhZC5kZWJ1Z2N0bG1zcik7CisJdXBkYXRlX2RlYnVnY3RsbXNyKGRlYnVnY3RsbXNyKTsKIH0KIAotdm9pZCBkc19jb3B5X3RocmVhZChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaywgc3RydWN0IHRhc2tfc3RydWN0ICpmYXRoZXIpCitzdGF0aWMgX19pbml0IGludCBkc19zZWxmdGVzdCh2b2lkKQogewotCWNsZWFyX3Rza190aHJlYWRfZmxhZyh0c2ssIFRJRl9EU19BUkVBX01TUik7Ci0JdHNrLT50aHJlYWQuZHNfY3R4ID0gTlVMTDsKLX0KKwlpZiAoZHNfY2ZnLnNpemVvZl9yZWNbZHNfYnRzXSkgeworCQlpbnQgZXJyb3I7CiAKLXZvaWQgZHNfZXhpdF90aHJlYWQoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spCi17CisJCWVycm9yID0gZHNfc2VsZnRlc3RfYnRzKCk7CisJCWlmIChlcnJvcikgeworCQkJV0FSTigxLCAiW2RzXSBzZWxmdGVzdCBmYWlsZWQuIGRpc2FibGluZyBidHMuXG4iKTsKKwkJCWRzX2NmZy5zaXplb2ZfcmVjW2RzX2J0c10gPSAwOworCQl9CisJfQorCisJaWYgKGRzX2NmZy5zaXplb2ZfcmVjW2RzX3BlYnNdKSB7CisJCWludCBlcnJvcjsKKworCQllcnJvciA9IGRzX3NlbGZ0ZXN0X3BlYnMoKTsKKwkJaWYgKGVycm9yKSB7CisJCQlXQVJOKDEsICJbZHNdIHNlbGZ0ZXN0IGZhaWxlZC4gZGlzYWJsaW5nIHBlYnMuXG4iKTsKKwkJCWRzX2NmZy5zaXplb2ZfcmVjW2RzX3BlYnNdID0gMDsKKwkJfQorCX0KKworCXJldHVybiAwOwogfQorZGV2aWNlX2luaXRjYWxsKGRzX3NlbGZ0ZXN0KTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9kc19zZWxmdGVzdC5jIGIvYXJjaC94ODYva2VybmVsL2RzX3NlbGZ0ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjN2MxOQotLS0gL2Rldi9udWxsCisrKyBiL2FyY2gveDg2L2tlcm5lbC9kc19zZWxmdGVzdC5jCkBAIC0wLDAgKzEsNDA4IEBACisvKgorICogRGVidWcgU3RvcmUgc3VwcG9ydCAtIHNlbGZ0ZXN0CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIE1hcmt1cyBNZXR6Z2VyIDxtYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbT4sIDIwMDkKKyAqLworCisjaW5jbHVkZSAiZHNfc2VsZnRlc3QuaCIKKworI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgorI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgorCisjaW5jbHVkZSA8YXNtL2RzLmg+CisKKworI2RlZmluZSBCVUZGRVJfU0laRQkJNTIxCS8qIEludGVudGlvbmFsbHkgY2hvc2UgYW4gb2RkIHNpemUuICovCisjZGVmaW5lIFNNQUxMX0JVRkZFUl9TSVpFCTI0CS8qIEEgc2luZ2xlIGJ0cyBlbnRyeS4gKi8KKworc3RydWN0IGRzX3NlbGZ0ZXN0X2J0c19jb25mIHsKKwlzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyOworCWludCBlcnJvcjsKKwlpbnQgKCpzdXNwZW5kKShzdHJ1Y3QgYnRzX3RyYWNlciAqKTsKKwlpbnQgKCpyZXN1bWUpKHN0cnVjdCBidHNfdHJhY2VyICopOworfTsKKworc3RhdGljIGludCBkc19zZWxmdGVzdF9idHNfY29uc2lzdGVuY3koY29uc3Qgc3RydWN0IGJ0c190cmFjZSAqdHJhY2UpCit7CisJaW50IGVycm9yID0gMDsKKworCWlmICghdHJhY2UpIHsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiZmFpbGVkIHRvIGFjY2VzcyB0cmFjZS4uLiIpOworCQkvKiBCYWlsIG91dC4gT3RoZXIgdGVzdHMgYXJlIHBvaW50bGVzcy4gKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWlmICghdHJhY2UtPnJlYWQpIHsKKwkJcHJpbnRrKEtFUk5fQ09OVCAiYnRzIHJlYWQgbm90IGF2YWlsYWJsZS4uLiIpOworCQllcnJvciA9IC0xOworCX0KKworCS8qIERvIHNvbWUgc2FuaXR5IGNoZWNrcyBvbiB0aGUgdHJhY2UgY29uZmlndXJhdGlvbi4gKi8KKwlpZiAoIXRyYWNlLT5kcy5uKSB7CisJCXByaW50ayhLRVJOX0NPTlQgImVtcHR5IGJ0cyBidWZmZXIuLi4iKTsKKwkJZXJyb3IgPSAtMTsKKwl9CisJaWYgKCF0cmFjZS0+ZHMuc2l6ZSkgeworCQlwcmludGsoS0VSTl9DT05UICJiYWQgYnRzIHRyYWNlIHNldHVwLi4uIik7CisJCWVycm9yID0gLTE7CisJfQorCWlmICh0cmFjZS0+ZHMuZW5kICE9CisJICAgIChjaGFyICopdHJhY2UtPmRzLmJlZ2luICsgKHRyYWNlLT5kcy5uICogdHJhY2UtPmRzLnNpemUpKSB7CisJCXByaW50ayhLRVJOX0NPTlQgImJhZCBidHMgYnVmZmVyIHNldHVwLi4uIik7CisJCWVycm9yID0gLTE7CisJfQorCS8qCisJICogV2UgYWxsb3cgdG9wIGluIFtiZWdpbjsgZW5kXSwgc2luY2UgaXRzIG5vdCBjbGVhciB3aGVuIHRoZQorCSAqIG92ZXJmbG93IGFkanVzdG1lbnQgaGFwcGVuczogYWZ0ZXIgdGhlIGluY3JlbWVudCBvciBiZWZvcmUgdGhlCisJICogd3JpdGUuCisJICovCisJaWYgKCh0cmFjZS0+ZHMudG9wIDwgdHJhY2UtPmRzLmJlZ2luKSB8fAorCSAgICAodHJhY2UtPmRzLmVuZCA8IHRyYWNlLT5kcy50b3ApKSB7CisJCXByaW50ayhLRVJOX0NPTlQgImJ0cyB0b3Agb3V0IG9mIGJvdW5kcy4uLiIpOworCQllcnJvciA9IC0xOworCX0KKworCXJldHVybiBlcnJvcjsKK30KKworc3RhdGljIGludCBkc19zZWxmdGVzdF9idHNfcmVhZChzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyLAorCQkJCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlLAorCQkJCWNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvKQoreworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmF0OworCisJLyoKKwkgKiBDaGVjayBhIGZldyB0aGluZ3Mgd2hpY2ggZG8gbm90IGJlbG9uZyB0byB0aGlzIHRlc3QuCisJICogVGhleSBzaG91bGQgYmUgY292ZXJlZCBieSBvdGhlciB0ZXN0cy4KKwkgKi8KKwlpZiAoIXRyYWNlKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoIXRyYWNlLT5yZWFkKQorCQlyZXR1cm4gLTE7CisKKwlpZiAodG8gPCBmcm9tKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoZnJvbSA8IHRyYWNlLT5kcy5iZWdpbikKKwkJcmV0dXJuIC0xOworCisJaWYgKHRyYWNlLT5kcy5lbmQgPCB0bykKKwkJcmV0dXJuIC0xOworCisJaWYgKCF0cmFjZS0+ZHMuc2l6ZSkKKwkJcmV0dXJuIC0xOworCisJLyogTm93IHRvIHRoZSB0ZXN0IGl0c2VsZi4gKi8KKwlmb3IgKGF0ID0gZnJvbTsgKHZvaWQgKilhdCA8IHRvOyBhdCArPSB0cmFjZS0+ZHMuc2l6ZSkgeworCQlzdHJ1Y3QgYnRzX3N0cnVjdCBidHM7CisJCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJCWludCBlcnJvcjsKKworCQlpZiAoKCh2b2lkICopYXQgLSB0cmFjZS0+ZHMuYmVnaW4pICUgdHJhY2UtPmRzLnNpemUpIHsKKwkJCXByaW50ayhLRVJOX0NPTlQKKwkJCSAgICAgICAicmVhZCBmcm9tIG5vbi1pbnRlZ2VyIGluZGV4Li4uIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJaW5kZXggPSAoKHZvaWQgKilhdCAtIHRyYWNlLT5kcy5iZWdpbikgLyB0cmFjZS0+ZHMuc2l6ZTsKKworCQltZW1zZXQoJmJ0cywgMCwgc2l6ZW9mKGJ0cykpOworCQllcnJvciA9IHRyYWNlLT5yZWFkKHRyYWNlciwgYXQsICZidHMpOworCQlpZiAoZXJyb3IgPCAwKSB7CisJCQlwcmludGsoS0VSTl9DT05UCisJCQkgICAgICAgImVycm9yIHJlYWRpbmcgYnRzIHRyYWNlIGF0IFslbHVdICgweCVwKS4uLiIsCisJCQkgICAgICAgaW5kZXgsIGF0KTsKKwkJCXJldHVybiBlcnJvcjsKKwkJfQorCisJCXN3aXRjaCAoYnRzLnF1YWxpZmllcikgeworCQljYXNlIEJUU19CUkFOQ0g6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXByaW50ayhLRVJOX0NPTlQKKwkJCSAgICAgICAidW5leHBlY3RlZCBidHMgZW50cnkgJWxsdSBhdCBbJWx1XSAoMHglcCkuLi4iLAorCQkJICAgICAgIGJ0cy5xdWFsaWZpZXIsIGluZGV4LCBhdCk7CisJCQlyZXR1cm4gLTE7CisJCX0KKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHNfc2VsZnRlc3RfYnRzX2NwdSh2b2lkICphcmcpCit7CisJc3RydWN0IGRzX3NlbGZ0ZXN0X2J0c19jb25mICpjb25mID0gYXJnOworCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlOworCXZvaWQgKnRvcDsKKworCWlmIChJU19FUlIoY29uZi0+dHJhY2VyKSkgeworCQljb25mLT5lcnJvciA9IFBUUl9FUlIoY29uZi0+dHJhY2VyKTsKKwkJY29uZi0+dHJhY2VyID0gTlVMTDsKKworCQlwcmludGsoS0VSTl9DT05UCisJCSAgICAgICAiaW5pdGlhbGl6YXRpb24gZmFpbGVkIChlcnI6ICVkKS4uLiIsIGNvbmYtPmVycm9yKTsKKwkJcmV0dXJuOworCX0KKworCS8qIFdlIHNob3VsZCBtZWFud2hpbGUgaGF2ZSBlbm91Z2ggdHJhY2UuICovCisJY29uZi0+ZXJyb3IgPSBjb25mLT5zdXNwZW5kKGNvbmYtPnRyYWNlcik7CisJaWYgKGNvbmYtPmVycm9yIDwgMCkKKwkJcmV0dXJuOworCisJLyogTGV0J3Mgc2VlIGlmIHdlIGNhbiBhY2Nlc3MgdGhlIHRyYWNlLiAqLworCXRyYWNlID0gZHNfcmVhZF9idHMoY29uZi0+dHJhY2VyKTsKKworCWNvbmYtPmVycm9yID0gZHNfc2VsZnRlc3RfYnRzX2NvbnNpc3RlbmN5KHRyYWNlKTsKKwlpZiAoY29uZi0+ZXJyb3IgPCAwKQorCQlyZXR1cm47CisKKwkvKiBJZiBldmVyeXRoaW5nIHdlbnQgd2VsbCwgd2Ugc2hvdWxkIGhhdmUgYSBmZXcgdHJhY2UgZW50cmllcy4gKi8KKwlpZiAodHJhY2UtPmRzLnRvcCA9PSB0cmFjZS0+ZHMuYmVnaW4pIHsKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgYnV0IGhpZ2hseSB1bmxpa2VseSB0aGF0IHdlIGdvdCBhCisJCSAqIGJ1ZmZlciBvdmVyZmxvdyBhbmQgZW5kIHVwIGF0IGV4YWN0bHkgdGhlIHNhbWUKKwkJICogcG9zaXRpb24gd2Ugc3RhcnRlZCBmcm9tLgorCQkgKiBMZXQncyBpc3N1ZSBhIHdhcm5pbmcsIGJ1dCBjb250aW51ZS4KKwkJICovCisJCXByaW50ayhLRVJOX0NPTlQgIm5vIHRyYWNlL292ZXJmbG93Li4uIik7CisJfQorCisJLyogTGV0J3MgdHJ5IHRvIHJlYWQgdGhlIHRyYWNlIHdlIGNvbGxlY3RlZC4gKi8KKwljb25mLT5lcnJvciA9CisJCWRzX3NlbGZ0ZXN0X2J0c19yZWFkKGNvbmYtPnRyYWNlciwgdHJhY2UsCisJCQkJICAgICB0cmFjZS0+ZHMuYmVnaW4sIHRyYWNlLT5kcy50b3ApOworCWlmIChjb25mLT5lcnJvciA8IDApCisJCXJldHVybjsKKworCS8qCisJICogTGV0J3MgcmVhZCB0aGUgdHJhY2UgYWdhaW4uCisJICogU2luY2Ugd2Ugc3VzcGVuZGVkIHRyYWNpbmcsIHdlIHNob3VsZCBnZXQgdGhlIHNhbWUgcmVzdWx0LgorCSAqLworCXRvcCA9IHRyYWNlLT5kcy50b3A7CisKKwl0cmFjZSA9IGRzX3JlYWRfYnRzKGNvbmYtPnRyYWNlcik7CisJY29uZi0+ZXJyb3IgPSBkc19zZWxmdGVzdF9idHNfY29uc2lzdGVuY3kodHJhY2UpOworCWlmIChjb25mLT5lcnJvciA8IDApCisJCXJldHVybjsKKworCWlmICh0b3AgIT0gdHJhY2UtPmRzLnRvcCkgeworCQlwcmludGsoS0VSTl9DT05UICJzdXNwZW5kIG5vdCB3b3JraW5nLi4uIik7CisJCWNvbmYtPmVycm9yID0gLTE7CisJCXJldHVybjsKKwl9CisKKwkvKiBMZXQncyBjb2xsZWN0IHNvbWUgbW9yZSB0cmFjZSAtIHNlZSBpZiByZXN1bWUgaXMgd29ya2luZy4gKi8KKwljb25mLT5lcnJvciA9IGNvbmYtPnJlc3VtZShjb25mLT50cmFjZXIpOworCWlmIChjb25mLT5lcnJvciA8IDApCisJCXJldHVybjsKKworCWNvbmYtPmVycm9yID0gY29uZi0+c3VzcGVuZChjb25mLT50cmFjZXIpOworCWlmIChjb25mLT5lcnJvciA8IDApCisJCXJldHVybjsKKworCXRyYWNlID0gZHNfcmVhZF9idHMoY29uZi0+dHJhY2VyKTsKKworCWNvbmYtPmVycm9yID0gZHNfc2VsZnRlc3RfYnRzX2NvbnNpc3RlbmN5KHRyYWNlKTsKKwlpZiAoY29uZi0+ZXJyb3IgPCAwKQorCQlyZXR1cm47CisKKwlpZiAodHJhY2UtPmRzLnRvcCA9PSB0b3ApIHsKKwkJLyoKKwkJICogSXQgaXMgcG9zc2libGUgYnV0IGhpZ2hseSB1bmxpa2VseSB0aGF0IHdlIGdvdCBhCisJCSAqIGJ1ZmZlciBvdmVyZmxvdyBhbmQgZW5kIHVwIGF0IGV4YWN0bHkgdGhlIHNhbWUKKwkJICogcG9zaXRpb24gd2Ugc3RhcnRlZCBmcm9tLgorCQkgKiBMZXQncyBpc3N1ZSBhIHdhcm5pbmcgYW5kIGNoZWNrIHRoZSBmdWxsIHRyYWNlLgorCQkgKi8KKwkJcHJpbnRrKEtFUk5fQ09OVAorCQkgICAgICAgIm5vIHJlc3VtZSBwcm9ncmVzcy9vdmVyZmxvdy4uLiIpOworCisJCWNvbmYtPmVycm9yID0KKwkJCWRzX3NlbGZ0ZXN0X2J0c19yZWFkKGNvbmYtPnRyYWNlciwgdHJhY2UsCisJCQkJCSAgICAgdHJhY2UtPmRzLmJlZ2luLCB0cmFjZS0+ZHMuZW5kKTsKKwl9IGVsc2UgaWYgKHRyYWNlLT5kcy50b3AgPCB0b3ApIHsKKwkJLyoKKwkJICogV2UgaGFkIGEgYnVmZmVyIG92ZXJmbG93IC0gdGhlIGVudGlyZSBidWZmZXIgc2hvdWxkCisJCSAqIGNvbnRhaW4gdHJhY2UgcmVjb3Jkcy4KKwkJICovCisJCWNvbmYtPmVycm9yID0KKwkJCWRzX3NlbGZ0ZXN0X2J0c19yZWFkKGNvbmYtPnRyYWNlciwgdHJhY2UsCisJCQkJCSAgICAgdHJhY2UtPmRzLmJlZ2luLCB0cmFjZS0+ZHMuZW5kKTsKKwl9IGVsc2UgeworCQkvKgorCQkgKiBJdCBpcyBxdWl0ZSBsaWtlbHkgdGhhdCB0aGUgYnVmZmVyIGRpZCBub3Qgb3ZlcmZsb3cuCisJCSAqIExldCdzIGp1c3QgY2hlY2sgdGhlIGRlbHRhIHRyYWNlLgorCQkgKi8KKwkJY29uZi0+ZXJyb3IgPQorCQkJZHNfc2VsZnRlc3RfYnRzX3JlYWQoY29uZi0+dHJhY2VyLCB0cmFjZSwgdG9wLAorCQkJCQkgICAgIHRyYWNlLT5kcy50b3ApOworCX0KKwlpZiAoY29uZi0+ZXJyb3IgPCAwKQorCQlyZXR1cm47CisKKwljb25mLT5lcnJvciA9IDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfc3VzcGVuZF9idHNfd3JhcChzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyKQoreworCWRzX3N1c3BlbmRfYnRzKHRyYWNlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZHNfcmVzdW1lX2J0c193cmFwKHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpCit7CisJZHNfcmVzdW1lX2J0cyh0cmFjZXIpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBkc19yZWxlYXNlX2J0c19ub2lycV93cmFwKHZvaWQgKnRyYWNlcikKK3sKKwkodm9pZClkc19yZWxlYXNlX2J0c19ub2lycSh0cmFjZXIpOworfQorCitzdGF0aWMgaW50IGRzX3NlbGZ0ZXN0X2J0c19iYWRfcmVsZWFzZV9ub2lycShpbnQgY3B1LAorCQkJCQkgICAgIHN0cnVjdCBidHNfdHJhY2VyICp0cmFjZXIpCit7CisJaW50IGVycm9yID0gLUVQRVJNOworCisJLyogVHJ5IHRvIHJlbGVhc2UgdGhlIHRyYWNlciBvbiB0aGUgd3JvbmcgY3B1LiAqLworCWdldF9jcHUoKTsKKwlpZiAoY3B1ICE9IHNtcF9wcm9jZXNzb3JfaWQoKSkgeworCQllcnJvciA9IGRzX3JlbGVhc2VfYnRzX25vaXJxKHRyYWNlcik7CisJCWlmIChlcnJvciAhPSAtRVBFUk0pCisJCQlwcmludGsoS0VSTl9DT05UICJyZWxlYXNlIG9uIHdyb25nIGNwdS4uLiIpOworCX0KKwlwdXRfY3B1KCk7CisKKwlyZXR1cm4gZXJyb3IgPyAwIDogLTE7Cit9CisKK3N0YXRpYyBpbnQgZHNfc2VsZnRlc3RfYnRzX2JhZF9yZXF1ZXN0X2NwdShpbnQgY3B1LCB2b2lkICpidWZmZXIpCit7CisJc3RydWN0IGJ0c190cmFjZXIgKnRyYWNlcjsKKwlpbnQgZXJyb3I7CisKKwkvKiBUcnkgdG8gcmVxdWVzdCBjcHUgdHJhY2luZyB3aGlsZSB0YXNrIHRyYWNpbmcgaXMgYWN0aXZlLiAqLworCXRyYWNlciA9IGRzX3JlcXVlc3RfYnRzX2NwdShjcHUsIGJ1ZmZlciwgQlVGRkVSX1NJWkUsIE5VTEwsCisJCQkJICAgIChzaXplX3QpLTEsIEJUU19LRVJORUwpOworCWVycm9yID0gUFRSX0VSUih0cmFjZXIpOworCWlmICghSVNfRVJSKHRyYWNlcikpIHsKKwkJZHNfcmVsZWFzZV9idHModHJhY2VyKTsKKwkJZXJyb3IgPSAwOworCX0KKworCWlmIChlcnJvciAhPSAtRVBFUk0pCisJCXByaW50ayhLRVJOX0NPTlQgImNwdS90YXNrIHRyYWNpbmcgb3ZlcmxhcC4uLiIpOworCisJcmV0dXJuIGVycm9yID8gMCA6IC0xOworfQorCitzdGF0aWMgaW50IGRzX3NlbGZ0ZXN0X2J0c19iYWRfcmVxdWVzdF90YXNrKHZvaWQgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgYnRzX3RyYWNlciAqdHJhY2VyOworCWludCBlcnJvcjsKKworCS8qIFRyeSB0byByZXF1ZXN0IGNwdSB0cmFjaW5nIHdoaWxlIHRhc2sgdHJhY2luZyBpcyBhY3RpdmUuICovCisJdHJhY2VyID0gZHNfcmVxdWVzdF9idHNfdGFzayhjdXJyZW50LCBidWZmZXIsIEJVRkZFUl9TSVpFLCBOVUxMLAorCQkJCSAgICAoc2l6ZV90KS0xLCBCVFNfS0VSTkVMKTsKKwllcnJvciA9IFBUUl9FUlIodHJhY2VyKTsKKwlpZiAoIUlTX0VSUih0cmFjZXIpKSB7CisJCWVycm9yID0gMDsKKwkJZHNfcmVsZWFzZV9idHModHJhY2VyKTsKKwl9CisKKwlpZiAoZXJyb3IgIT0gLUVQRVJNKQorCQlwcmludGsoS0VSTl9DT05UICJ0YXNrL2NwdSB0cmFjaW5nIG92ZXJsYXAuLi4iKTsKKworCXJldHVybiBlcnJvciA/IDAgOiAtMTsKK30KKworaW50IGRzX3NlbGZ0ZXN0X2J0cyh2b2lkKQoreworCXN0cnVjdCBkc19zZWxmdGVzdF9idHNfY29uZiBjb25mOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXSwgKnNtYWxsX2J1ZmZlcjsKKwl1bnNpZ25lZCBsb25nIGlycTsKKwlpbnQgY3B1OworCisJcHJpbnRrKEtFUk5fSU5GTyAiW2RzXSBidHMgc2VsZnRlc3QuLi4iKTsKKwljb25mLmVycm9yID0gMDsKKworCXNtYWxsX2J1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopQUxJR04oKHVuc2lnbmVkIGxvbmcpYnVmZmVyLCA4KSArIDg7CisKKwlnZXRfb25saW5lX2NwdXMoKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkgeworCQljb25mLnN1c3BlbmQgPSBkc19zdXNwZW5kX2J0c193cmFwOworCQljb25mLnJlc3VtZSA9IGRzX3Jlc3VtZV9idHNfd3JhcDsKKwkJY29uZi50cmFjZXIgPQorCQkJZHNfcmVxdWVzdF9idHNfY3B1KGNwdSwgYnVmZmVyLCBCVUZGRVJfU0laRSwKKwkJCQkJICAgTlVMTCwgKHNpemVfdCktMSwgQlRTX0tFUk5FTCk7CisJCWRzX3NlbGZ0ZXN0X2J0c19jcHUoJmNvbmYpOworCQlpZiAoY29uZi5lcnJvciA+PSAwKQorCQkJY29uZi5lcnJvciA9IGRzX3NlbGZ0ZXN0X2J0c19iYWRfcmVxdWVzdF90YXNrKGJ1ZmZlcik7CisJCWRzX3JlbGVhc2VfYnRzKGNvbmYudHJhY2VyKTsKKwkJaWYgKGNvbmYuZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisKKwkJY29uZi5zdXNwZW5kID0gZHNfc3VzcGVuZF9idHNfbm9pcnE7CisJCWNvbmYucmVzdW1lID0gZHNfcmVzdW1lX2J0c19ub2lycTsKKwkJY29uZi50cmFjZXIgPQorCQkJZHNfcmVxdWVzdF9idHNfY3B1KGNwdSwgYnVmZmVyLCBCVUZGRVJfU0laRSwKKwkJCQkJICAgTlVMTCwgKHNpemVfdCktMSwgQlRTX0tFUk5FTCk7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGRzX3NlbGZ0ZXN0X2J0c19jcHUsICZjb25mLCAxKTsKKwkJaWYgKGNvbmYuZXJyb3IgPj0gMCkgeworCQkJY29uZi5lcnJvciA9CisJCQkJZHNfc2VsZnRlc3RfYnRzX2JhZF9yZWxlYXNlX25vaXJxKGNwdSwKKwkJCQkJCQkJICBjb25mLnRyYWNlcik7CisJCQkvKiBXZSBtdXN0IG5vdCByZWxlYXNlIHRoZSB0cmFjZXIgdHdpY2UuICovCisJCQlpZiAoY29uZi5lcnJvciA8IDApCisJCQkJY29uZi50cmFjZXIgPSBOVUxMOworCQl9CisJCWlmIChjb25mLmVycm9yID49IDApCisJCQljb25mLmVycm9yID0gZHNfc2VsZnRlc3RfYnRzX2JhZF9yZXF1ZXN0X3Rhc2soYnVmZmVyKTsKKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgZHNfcmVsZWFzZV9idHNfbm9pcnFfd3JhcCwKKwkJCQkJIGNvbmYudHJhY2VyLCAxKTsKKwkJaWYgKGNvbmYuZXJyb3IgPCAwKQorCQkJZ290byBvdXQ7CisJfQorCisJY29uZi5zdXNwZW5kID0gZHNfc3VzcGVuZF9idHNfd3JhcDsKKwljb25mLnJlc3VtZSA9IGRzX3Jlc3VtZV9idHNfd3JhcDsKKwljb25mLnRyYWNlciA9CisJCWRzX3JlcXVlc3RfYnRzX3Rhc2soY3VycmVudCwgYnVmZmVyLCBCVUZGRVJfU0laRSwKKwkJCQkgICAgTlVMTCwgKHNpemVfdCktMSwgQlRTX0tFUk5FTCk7CisJZHNfc2VsZnRlc3RfYnRzX2NwdSgmY29uZik7CisJaWYgKGNvbmYuZXJyb3IgPj0gMCkKKwkJY29uZi5lcnJvciA9IGRzX3NlbGZ0ZXN0X2J0c19iYWRfcmVxdWVzdF9jcHUoMCwgYnVmZmVyKTsKKwlkc19yZWxlYXNlX2J0cyhjb25mLnRyYWNlcik7CisJaWYgKGNvbmYuZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWNvbmYuc3VzcGVuZCA9IGRzX3N1c3BlbmRfYnRzX25vaXJxOworCWNvbmYucmVzdW1lID0gZHNfcmVzdW1lX2J0c19ub2lycTsKKwljb25mLnRyYWNlciA9CisJCWRzX3JlcXVlc3RfYnRzX3Rhc2soY3VycmVudCwgc21hbGxfYnVmZmVyLCBTTUFMTF9CVUZGRVJfU0laRSwKKwkJCQkgICBOVUxMLCAoc2l6ZV90KS0xLCBCVFNfS0VSTkVMKTsKKwlsb2NhbF9pcnFfc2F2ZShpcnEpOworCWRzX3NlbGZ0ZXN0X2J0c19jcHUoJmNvbmYpOworCWlmIChjb25mLmVycm9yID49IDApCisJCWNvbmYuZXJyb3IgPSBkc19zZWxmdGVzdF9idHNfYmFkX3JlcXVlc3RfY3B1KDAsIGJ1ZmZlcik7CisJZHNfcmVsZWFzZV9idHNfbm9pcnEoY29uZi50cmFjZXIpOworCWxvY2FsX2lycV9yZXN0b3JlKGlycSk7CisJaWYgKGNvbmYuZXJyb3IgPCAwKQorCQlnb3RvIG91dDsKKworCWNvbmYuZXJyb3IgPSAwOworIG91dDoKKwlwdXRfb25saW5lX2NwdXMoKTsKKwlwcmludGsoS0VSTl9DT05UICIlcy5cbiIsIChjb25mLmVycm9yID8gImZhaWxlZCIgOiAicGFzc2VkIikpOworCisJcmV0dXJuIGNvbmYuZXJyb3I7Cit9CisKK2ludCBkc19zZWxmdGVzdF9wZWJzKHZvaWQpCit7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHNfc2VsZnRlc3QuaCBiL2FyY2gveDg2L2tlcm5lbC9kc19zZWxmdGVzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYTg3NDUKLS0tIC9kZXYvbnVsbAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHNfc2VsZnRlc3QuaApAQCAtMCwwICsxLDE1IEBACisvKgorICogRGVidWcgU3RvcmUgc3VwcG9ydCAtIHNlbGZ0ZXN0CisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBJbnRlbCBDb3Jwb3JhdGlvbi4KKyAqIE1hcmt1cyBNZXR6Z2VyIDxtYXJrdXMudC5tZXR6Z2VyQGludGVsLmNvbT4sIDIwMDkKKyAqLworCisjaWZkZWYgQ09ORklHX1g4Nl9EU19TRUxGVEVTVAorZXh0ZXJuIGludCBkc19zZWxmdGVzdF9idHModm9pZCk7CitleHRlcm4gaW50IGRzX3NlbGZ0ZXN0X3BlYnModm9pZCk7CisjZWxzZQorc3RhdGljIGlubGluZSBpbnQgZHNfc2VsZnRlc3RfYnRzKHZvaWQpIHsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgaW50IGRzX3NlbGZ0ZXN0X3BlYnModm9pZCkgeyByZXR1cm4gMDsgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmggYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmgKaW5kZXggZGE4NzU5MGIuLjgxMDg2YzIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9kdW1wc3RhY2suaAorKysgYi9hcmNoL3g4Ni9rZXJuZWwvZHVtcHN0YWNrLmgKQEAgLTI5LDcgKzI5LDYgQEAKIAkJdW5zaWduZWQgbG9uZyAqc3AsIHVuc2lnbmVkIGxvbmcgYnAsIGNoYXIgKmxvZ19sdmwpOwogCiBleHRlcm4gdW5zaWduZWQgaW50IGNvZGVfYnl0ZXM7Ci1leHRlcm4gaW50IGtzdGFja19kZXB0aF90b19wcmludDsKIAogLyogVGhlIGZvcm0gb2YgdGhlIHRvcCBvZiB0aGUgZnJhbWUgb24gdGhlIHN0YWNrICovCiBzdHJ1Y3Qgc3RhY2tfZnJhbWUgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2U4MjAuYyBiL2FyY2gveDg2L2tlcm5lbC9lODIwLmMKaW5kZXggMDA2MjgxMy4uNzI3MWZhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2U4MjAuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvZTgyMC5jCkBAIC02MTcsNyArNjE3LDcgQEAKICAqLwogX19pbml0IHZvaWQgZTgyMF9zZXR1cF9nYXAodm9pZCkKIHsKLQl1bnNpZ25lZCBsb25nIGdhcHN0YXJ0LCBnYXBzaXplLCByb3VuZDsKKwl1bnNpZ25lZCBsb25nIGdhcHN0YXJ0LCBnYXBzaXplOwogCWludCBmb3VuZDsKIAogCWdhcHN0YXJ0ID0gMHgxMDAwMDAwMDsKQEAgLTYzNSwxNCArNjM1LDkgQEAKICNlbmRpZgogCiAJLyoKLQkgKiBTZWUgaG93IG11Y2ggd2Ugd2FudCB0byByb3VuZCB1cDogc3RhcnQgb2ZmIHdpdGgKLQkgKiByb3VuZGluZyB0byB0aGUgbmV4dCAxTUIgYXJlYS4KKwkgKiBlODIwX3Jlc2VydmVfcmVzb3VyY2VzX2xhdGUgcHJvdGVjdCBzdG9sZW4gUkFNIGFscmVhZHkKIAkgKi8KLQlyb3VuZCA9IDB4MTAwMDAwOwotCXdoaWxlICgoZ2Fwc2l6ZSA+PiA0KSA+IHJvdW5kKQotCQlyb3VuZCArPSByb3VuZDsKLQkvKiBGdW4gd2l0aCB0d28ncyBjb21wbGVtZW50ICovCi0JcGNpX21lbV9zdGFydCA9IChnYXBzdGFydCArIHJvdW5kKSAmIC1yb3VuZDsKKwlwY2lfbWVtX3N0YXJ0ID0gZ2Fwc3RhcnQ7CiAKIAlwcmludGsoS0VSTl9JTkZPCiAJICAgICAgICJBbGxvY2F0aW5nIFBDSSByZXNvdXJjZXMgc3RhcnRpbmcgYXQgJWx4IChnYXA6ICVseDolbHgpXG4iLApAQCAtMTM3MSw2ICsxMzY2LDIzIEBACiAJfQogfQogCisvKiBIb3cgbXVjaCBzaG91bGQgd2UgcGFkIFJBTSBlbmRpbmcgZGVwZW5kaW5nIG9uIHdoZXJlIGl0IGlzPyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmFtX2FsaWdubWVudChyZXNvdXJjZV9zaXplX3QgcG9zKQoreworCXVuc2lnbmVkIGxvbmcgbWIgPSBwb3MgPj4gMjA7CisKKwkvKiBUbyA2NGtCIGluIHRoZSBmaXJzdCBtZWdhYnl0ZSAqLworCWlmICghbWIpCisJCXJldHVybiA2NCoxMDI0OworCisJLyogVG8gMU1CIGluIHRoZSBmaXJzdCAxNk1CICovCisJaWYgKG1iIDwgMTYpCisJCXJldHVybiAxMDI0KjEwMjQ7CisKKwkvKiBUbyAzMk1CIGZvciBhbnl0aGluZyBhYm92ZSB0aGF0ICovCisJcmV0dXJuIDMyKjEwMjQqMTAyNDsKK30KKwogdm9pZCBfX2luaXQgZTgyMF9yZXNlcnZlX3Jlc291cmNlc19sYXRlKHZvaWQpCiB7CiAJaW50IGk7CkBAIC0xMzgyLDYgKzEzOTQsMjQgQEAKIAkJCWluc2VydF9yZXNvdXJjZV9leHBhbmRfdG9fZml0KCZpb21lbV9yZXNvdXJjZSwgcmVzKTsKIAkJcmVzKys7CiAJfQorCisJLyoKKwkgKiBUcnkgdG8gYnVtcCB1cCBSQU0gcmVnaW9ucyB0byByZWFzb25hYmxlIGJvdW5kYXJpZXMgdG8KKwkgKiBhdm9pZCBzdG9sZW4gUkFNOgorCSAqLworCWZvciAoaSA9IDA7IGkgPCBlODIwLm5yX21hcDsgaSsrKSB7CisJCXN0cnVjdCBlODIwZW50cnkgKmVudHJ5ID0gJmU4MjBfc2F2ZWQubWFwW2ldOworCQlyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIGVuZDsKKworCQlpZiAoZW50cnktPnR5cGUgIT0gRTgyMF9SQU0pCisJCQljb250aW51ZTsKKwkJc3RhcnQgPSBlbnRyeS0+YWRkciArIGVudHJ5LT5zaXplOworCQllbmQgPSByb3VuZF91cChzdGFydCwgcmFtX2FsaWdubWVudChzdGFydCkpOworCQlpZiAoc3RhcnQgPT0gZW5kKQorCQkJY29udGludWU7CisJCXJlc2VydmVfcmVnaW9uX3dpdGhfc3BsaXQoJmlvbWVtX3Jlc291cmNlLCBzdGFydCwKKwkJCQkJCSAgZW5kIC0gMSwgIlJBTSBidWZmZXIiKTsKKwl9CiB9CiAKIGNoYXIgKl9faW5pdCBkZWZhdWx0X21hY2hpbmVfc3BlY2lmaWNfbWVtb3J5X3NldHVwKHZvaWQpCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvZWFybHktcXVpcmtzLmMKaW5kZXggNzZiOGNkOS4uZWJkYjg1YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2Vhcmx5LXF1aXJrcy5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9lYXJseS1xdWlya3MuYwpAQCAtOTcsNiArOTcsNyBAQAogfQogCiAjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgJiYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpCisjaWYgZGVmaW5lZChDT05GSUdfQUNQSSkgJiYgZGVmaW5lZChDT05GSUdfWDg2X0lPX0FQSUMpCiBzdGF0aWMgdTMyIF9faW5pdCBhdGlfaXhwNHgwX3JldihpbnQgbnVtLCBpbnQgc2xvdCwgaW50IGZ1bmMpCiB7CiAJdTMyIGQ7CkBAIC0xMTQsNiArMTE1LDcgQEAKIAlkICY9IDB4ZmY7CiAJcmV0dXJuIGQ7CiB9CisjZW5kaWYKIAogc3RhdGljIHZvaWQgX19pbml0IGF0aV9idWdzKGludCBudW0sIGludCBzbG90LCBpbnQgZnVuYykKIHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9lbnRyeV82NC5TIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKaW5kZXggMzg5NDZjNi4uYTQ3NDJhMyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKKysrIGIvYXJjaC94ODYva2VybmVsL2VudHJ5XzY0LlMKQEAgLTE0NywyNyArMTQ3LDE0IEBACiBHTE9CQUwocmV0dXJuX3RvX2hhbmRsZXIpCiAJc3VicSAgJDgwLCAlcnNwCiAKKwkvKiBTYXZlIHRoZSByZXR1cm4gdmFsdWVzICovCiAJbW92cSAlcmF4LCAoJXJzcCkKLQltb3ZxICVyY3gsIDgoJXJzcCkKLQltb3ZxICVyZHgsIDE2KCVyc3ApCi0JbW92cSAlcnNpLCAyNCglcnNwKQotCW1vdnEgJXJkaSwgMzIoJXJzcCkKLQltb3ZxICVyOCwgNDAoJXJzcCkKLQltb3ZxICVyOSwgNDgoJXJzcCkKLQltb3ZxICVyMTAsIDU2KCVyc3ApCi0JbW92cSAlcjExLCA2NCglcnNwKQorCW1vdnEgJXJkeCwgOCglcnNwKQogCiAJY2FsbCBmdHJhY2VfcmV0dXJuX3RvX2hhbmRsZXIKIAogCW1vdnEgJXJheCwgNzIoJXJzcCkKLQltb3ZxIDY0KCVyc3ApLCAlcjExCi0JbW92cSA1NiglcnNwKSwgJXIxMAotCW1vdnEgNDgoJXJzcCksICVyOQotCW1vdnEgNDAoJXJzcCksICVyOAotCW1vdnEgMzIoJXJzcCksICVyZGkKLQltb3ZxIDI0KCVyc3ApLCAlcnNpCi0JbW92cSAxNiglcnNwKSwgJXJkeAotCW1vdnEgOCglcnNwKSwgJXJjeAorCW1vdnEgOCglcnNwKSwgJXJkeAogCW1vdnEgKCVyc3ApLCAlcmF4CiAJYWRkcSAkNzIsICVyc3AKIAlyZXRxCkBAIC0xMDI1LDYgKzEwMTIsMTEgQEAKIGFwaWNpbnRlcnJ1cHQgU1BVUklPVVNfQVBJQ19WRUNUT1IgXAogCXNwdXJpb3VzX2ludGVycnVwdCBzbXBfc3B1cmlvdXNfaW50ZXJydXB0CiAKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworYXBpY2ludGVycnVwdCBMT0NBTF9QRU5ESU5HX1ZFQ1RPUiBcCisJcGVyZl9wZW5kaW5nX2ludGVycnVwdCBzbXBfcGVyZl9wZW5kaW5nX2ludGVycnVwdAorI2VuZGlmCisKIC8qCiAgKiBFeGNlcHRpb24gZW50cnkgcG9pbnRzLgogICovCkBAIC0xMzc5LDYgKzEzNzEsMTEgQEAKIHBhcmFub2lkemVyb2VudHJ5X2lzdCBkZWJ1ZyBkb19kZWJ1ZyBERUJVR19TVEFDSwogcGFyYW5vaWR6ZXJvZW50cnlfaXN0IGludDMgZG9faW50MyBERUJVR19TVEFDSwogcGFyYW5vaWRlcnJvcmVudHJ5IHN0YWNrX3NlZ21lbnQgZG9fc3RhY2tfc2VnbWVudAorI2lmZGVmIENPTkZJR19YRU4KK3plcm9lbnRyeSB4ZW5fZGVidWcgZG9fZGVidWcKK3plcm9lbnRyeSB4ZW5faW50MyBkb19pbnQzCitlcnJvcmVudHJ5IHhlbl9zdGFja19zZWdtZW50IGRvX3N0YWNrX3NlZ21lbnQKKyNlbmRpZgogZXJyb3JlbnRyeSBnZW5lcmFsX3Byb3RlY3Rpb24gZG9fZ2VuZXJhbF9wcm90ZWN0aW9uCiBlcnJvcmVudHJ5IHBhZ2VfZmF1bHQgZG9fcGFnZV9mYXVsdAogI2lmZGVmIENPTkZJR19YODZfTUNFCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TIGIvYXJjaC94ODYva2VybmVsL2hlYWRfMzIuUwppbmRleCAzMDY4Mzg4Li5kYzVlZDRiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaGVhZF8zMi5TCisrKyBiL2FyY2gveDg2L2tlcm5lbC9oZWFkXzMyLlMKQEAgLTYwOCwxMyArNjA4LDYgQEAKIEVOVFJZKGluaXRpYWxfY29kZSkKIAkubG9uZyBpMzg2X3N0YXJ0X2tlcm5lbAogCi0uc2VjdGlvbiAudGV4dAotLyoKLSAqIFJlYWwgYmVnaW5uaW5nIG9mIG5vcm1hbCAidGV4dCIgc2VnbWVudAotICovCi1FTlRSWShzdGV4dCkKLUVOVFJZKF9zdGV4dCkKLQogLyoKICAqIEJTUyBzZWN0aW9uCiAgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnEuYyBiL2FyY2gveDg2L2tlcm5lbC9pcnEuYwppbmRleCBjM2ZlMDEwLi4zODI4N2I1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvaXJxLmMKKysrIGIvYXJjaC94ODYva2VybmVsL2lycS5jCkBAIC0xMiw2ICsxMiw3IEBACiAjaW5jbHVkZSA8YXNtL2lvX2FwaWMuaD4KICNpbmNsdWRlIDxhc20vaXJxLmg+CiAjaW5jbHVkZSA8YXNtL2lkbGUuaD4KKyNpbmNsdWRlIDxhc20vaHdfaXJxLmg+CiAKIGF0b21pY190IGlycV9lcnJfY291bnQ7CiAKQEAgLTI0LDkgKzI1LDkgQEAKICAqLwogdm9pZCBhY2tfYmFkX2lycSh1bnNpZ25lZCBpbnQgaXJxKQogewotCXByaW50ayhLRVJOX0VSUiAidW5leHBlY3RlZCBJUlEgdHJhcCBhdCB2ZWN0b3IgJTAyeFxuIiwgaXJxKTsKKwlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQorCQlwcl9lcnIoInVuZXhwZWN0ZWQgSVJRIHRyYXAgYXQgdmVjdG9yICUwMnhcbiIsIGlycSk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X0xPQ0FMX0FQSUMKIAkvKgogCSAqIEN1cnJlbnRseSB1bmV4cGVjdGVkIHZlY3RvcnMgaGFwcGVuIG9ubHkgb24gU01QIGFuZCBBUElDLgogCSAqIFdlIF9tdXN0XyBhY2sgdGhlc2UgYmVjYXVzZSBldmVyeSBsb2NhbCBBUElDIGhhcyBvbmx5IE4KQEAgLTM2LDkgKzM3LDcgQEAKIAkgKiBjb21wbGV0ZWx5LgogCSAqIEJ1dCBvbmx5IGFjayB3aGVuIHRoZSBBUElDIGlzIGVuYWJsZWQgLUFLCiAJICovCi0JaWYgKGNwdV9oYXNfYXBpYykKLQkJYWNrX0FQSUNfaXJxKCk7Ci0jZW5kaWYKKwlhY2tfQVBJQ19pcnEoKTsKIH0KIAogI2RlZmluZSBpcnFfc3RhdHMoeCkJCSgmcGVyX2NwdShpcnFfc3RhdCwgeCkpCkBAIC02Myw2ICs2MiwxNCBAQAogCWZvcl9lYWNoX29ubGluZV9jcHUoaikKIAkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBpcnFfc3RhdHMoaiktPmlycV9zcHVyaW91c19jb3VudCk7CiAJc2VxX3ByaW50ZihwLCAiICBTcHVyaW91cyBpbnRlcnJ1cHRzXG4iKTsKKwlzZXFfcHJpbnRmKHAsICIlKnM6ICIsIHByZWMsICJDTlQiKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGopCisJCXNlcV9wcmludGYocCwgIiUxMHUgIiwgaXJxX3N0YXRzKGopLT5hcGljX3BlcmZfaXJxcyk7CisJc2VxX3ByaW50ZihwLCAiICBQZXJmb3JtYW5jZSBjb3VudGVyIGludGVycnVwdHNcbiIpOworCXNlcV9wcmludGYocCwgIiUqczogIiwgcHJlYywgIlBORCIpOworCWZvcl9lYWNoX29ubGluZV9jcHUoaikKKwkJc2VxX3ByaW50ZihwLCAiJTEwdSAiLCBpcnFfc3RhdHMoaiktPmFwaWNfcGVuZGluZ19pcnFzKTsKKwlzZXFfcHJpbnRmKHAsICIgIFBlcmZvcm1hbmNlIHBlbmRpbmcgd29ya1xuIik7CiAjZW5kaWYKIAlpZiAoZ2VuZXJpY19pbnRlcnJ1cHRfZXh0ZW5zaW9uKSB7CiAJCXNlcV9wcmludGYocCwgIiUqczogIiwgcHJlYywgIlBMVCIpOwpAQCAtMTY2LDYgKzE3Myw4IEBACiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDCiAJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5hcGljX3RpbWVyX2lycXM7CiAJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5pcnFfc3B1cmlvdXNfY291bnQ7CisJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5hcGljX3BlcmZfaXJxczsKKwlzdW0gKz0gaXJxX3N0YXRzKGNwdSktPmFwaWNfcGVuZGluZ19pcnFzOwogI2VuZGlmCiAJaWYgKGdlbmVyaWNfaW50ZXJydXB0X2V4dGVuc2lvbikKIAkJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5nZW5lcmljX2lycXM7CkBAIC0xNzgsNyArMTg3LDcgQEAKIAlzdW0gKz0gaXJxX3N0YXRzKGNwdSktPmlycV90aGVybWFsX2NvdW50OwogIyBpZmRlZiBDT05GSUdfWDg2XzY0CiAJc3VtICs9IGlycV9zdGF0cyhjcHUpLT5pcnFfdGhyZXNob2xkX2NvdW50OwotI2VuZGlmCisjIGVuZGlmCiAjZW5kaWYKIAlyZXR1cm4gc3VtOwogfQpAQCAtMjEzLDE0ICsyMjIsMTEgQEAKIAlpcnEgPSBfX2dldF9jcHVfdmFyKHZlY3Rvcl9pcnEpW3ZlY3Rvcl07CiAKIAlpZiAoIWhhbmRsZV9pcnEoaXJxLCByZWdzKSkgewotI2lmZGVmIENPTkZJR19YODZfNjQKLQkJaWYgKCFkaXNhYmxlX2FwaWMpCi0JCQlhY2tfQVBJQ19pcnEoKTsKLSNlbmRpZgorCQlhY2tfQVBJQ19pcnEoKTsKIAogCQlpZiAocHJpbnRrX3JhdGVsaW1pdCgpKQotCQkJcHJpbnRrKEtFUk5fRU1FUkcgIiVzOiAlZC4lZCBObyBpcnEgaGFuZGxlciBmb3IgdmVjdG9yIChpcnEgJWQpXG4iLAotCQkJICAgICAgIF9fZnVuY19fLCBzbXBfcHJvY2Vzc29yX2lkKCksIHZlY3RvciwgaXJxKTsKKwkJCXByX2VtZXJnKCIlczogJWQuJWQgTm8gaXJxIGhhbmRsZXIgZm9yIHZlY3RvciAoaXJxICVkKVxuIiwKKwkJCQlfX2Z1bmNfXywgc21wX3Byb2Nlc3Nvcl9pZCgpLCB2ZWN0b3IsIGlycSk7CiAJfQogCiAJaXJxX2V4aXQoKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdC5jCnNpbWlsYXJpdHkgaW5kZXggNjclCnJlbmFtZSBmcm9tIGFyY2gveDg2L2tlcm5lbC9pcnFpbml0XzMyLmMKcmVuYW1lIHRvIGFyY2gveDg2L2tlcm5lbC9pcnFpbml0LmMKaW5kZXggMzY4YjBhOC4uMjY3YzY2MiAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2lycWluaXRfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdC5jCkBAIC0xLDIwICsxLDI1IEBACisjaW5jbHVkZSA8bGludXgvbGlua2FnZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiAjaW5jbHVkZSA8bGludXgvc2lnbmFsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pb3BvcnQuaD4KICNpbmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1leC5oPgogI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KICNpbmNsdWRlIDxsaW51eC9yYW5kb20uaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVkZSA8bGludXgvYWNwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2lvLmg+CiAjaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KIAogI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KICNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CiAjaW5jbHVkZSA8YXNtL3RpbWVyLmg+CisjaW5jbHVkZSA8YXNtL2h3X2lycS5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CiAjaW5jbHVkZSA8YXNtL2Rlc2MuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgpAQCAtMjIsOCArMjcsMjQgQEAKICNpbmNsdWRlIDxhc20vaTgyNTkuaD4KICNpbmNsdWRlIDxhc20vdHJhcHMuaD4KIAorLyoKKyAqIElTQSBQSUMgb3IgbG93IElPLUFQSUMgdHJpZ2dlcmVkIChJTlRBLWN5Y2xlIG9yIEFQSUMpIGludGVycnVwdHM6CisgKiAodGhlc2UgYXJlIHVzdWFsbHkgbWFwcGVkIHRvIHZlY3RvcnMgMHgzMC0weDNmKQorICovCiAKIC8qCisgKiBUaGUgSU8tQVBJQyBnaXZlcyB1cyBtYW55IG1vcmUgaW50ZXJydXB0IHNvdXJjZXMuIE1vc3Qgb2YgdGhlc2UKKyAqIGFyZSB1bnVzZWQgYnV0IGFuIFNNUCBzeXN0ZW0gaXMgc3VwcG9zZWQgdG8gaGF2ZSBlbm91Z2ggbWVtb3J5IC4uLgorICogc29tZXRpbWVzIChtb3N0bHkgd3J0LiBodyBidWdzKSB3ZSBnZXQgY29ycnVwdGVkIHZlY3RvcnMgYWxsCisgKiBhY3Jvc3MgdGhlIHNwZWN0cnVtLCBzbyB3ZSByZWFsbHkgd2FudCB0byBiZSBwcmVwYXJlZCB0byBnZXQgYWxsCisgKiBvZiB0aGVzZS4gUGx1cywgbW9yZSBwb3dlcmZ1bCBzeXN0ZW1zIG1pZ2h0IGhhdmUgbW9yZSB0aGFuIDY0CisgKiBJTy1BUElDIHJlZ2lzdGVycy4KKyAqCisgKiAodGhlc2UgYXJlIHVzdWFsbHkgbWFwcGVkIGludG8gdGhlIDB4MzAtMHhmZiB2ZWN0b3IgcmFuZ2UpCisgKi8KKworI2lmZGVmIENPTkZJR19YODZfMzIKKy8qCiAgKiBOb3RlIHRoYXQgb24gYSA0ODYsIHdlIGRvbid0IHdhbnQgdG8gZG8gYSBTSUdGUEUgb24gYW4gaXJxMTMKICAqIGFzIHRoZSBpcnEgaXMgdW5yZWxpYWJsZSwgYW5kIGV4Y2VwdGlvbiAxNiB3b3JrcyBjb3JyZWN0bHkKICAqIChpZSBhcyBleHBsYWluZWQgaW4gdGhlIGludGVsIGxpdGVyYXR1cmUpLiBPbiBhIDM4NiwgeW91CkBAIC01MiwzMCArNzMsNyBAQAogCS5oYW5kbGVyID0gbWF0aF9lcnJvcl9pcnEsCiAJLm5hbWUgPSAiZnB1IiwKIH07Ci0KLXZvaWQgX19pbml0IGluaXRfSVNBX2lycXModm9pZCkKLXsKLQlpbnQgaTsKLQotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwotCWluaXRfYnNwX0FQSUMoKTsKICNlbmRpZgotCWluaXRfODI1OUEoMCk7Ci0KLQkvKgotCSAqIDE2IG9sZC1zdHlsZSBJTlRBLWN5Y2xlIGludGVycnVwdHM6Ci0JICovCi0JZm9yIChpID0gMDsgaSA8IE5SX0lSUVNfTEVHQUNZOyBpKyspIHsKLQkJc3RydWN0IGlycV9kZXNjICpkZXNjID0gaXJxX3RvX2Rlc2MoaSk7Ci0KLQkJZGVzYy0+c3RhdHVzID0gSVJRX0RJU0FCTEVEOwotCQlkZXNjLT5hY3Rpb24gPSBOVUxMOwotCQlkZXNjLT5kZXB0aCA9IDE7Ci0KLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaSwgJmk4MjU5QV9jaGlwLAotCQkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAiWFQiKTsKLQl9Ci19CiAKIC8qCiAgKiBJUlEyIGlzIGNhc2NhZGUgaW50ZXJydXB0IHRvIHNlY29uZCBpbnRlcnJ1cHQgY29udHJvbGxlcgpAQCAtMTE4LDI5ICsxMTYsMzcgQEAKIAlyZXR1cm4gMDsKIH0KIAotLyogT3ZlcnJpZGRlbiBpbiBwYXJhdmlydC5jICovCi12b2lkIGluaXRfSVJRKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJuYXRpdmVfaW5pdF9JUlEiKSkpOwotCi12b2lkIF9faW5pdCBuYXRpdmVfaW5pdF9JUlEodm9pZCkKK3N0YXRpYyB2b2lkIF9faW5pdCBpbml0X0lTQV9pcnFzKHZvaWQpCiB7CiAJaW50IGk7CiAKLQkvKiBFeGVjdXRlIGFueSBxdWlya3MgYmVmb3JlIHRoZSBjYWxsIGdhdGVzIGFyZSBpbml0aWFsaXNlZDogKi8KLQl4ODZfcXVpcmtfcHJlX2ludHJfaW5pdCgpOworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCisJaW5pdF9ic3BfQVBJQygpOworI2VuZGlmCisJaW5pdF84MjU5QSgwKTsKIAogCS8qCi0JICogQ292ZXIgdGhlIHdob2xlIHZlY3RvciBzcGFjZSwgbm8gdmVjdG9yIGNhbiBlc2NhcGUKLQkgKiB1cy4gKHNvbWUgb2YgdGhlc2Ugd2lsbCBiZSBvdmVycmlkZGVuIGFuZCBiZWNvbWUKLQkgKiAnc3BlY2lhbCcgU01QIGludGVycnVwdHMpCisJICogMTYgb2xkLXN0eWxlIElOVEEtY3ljbGUgaW50ZXJydXB0czoKIAkgKi8KLQlmb3IgKGkgPSAgRklSU1RfRVhURVJOQUxfVkVDVE9SOyBpIDwgTlJfVkVDVE9SUzsgaSsrKSB7Ci0JCS8qIFNZU0NBTExfVkVDVE9SIHdhcyByZXNlcnZlZCBpbiB0cmFwX2luaXQuICovCi0JCWlmIChpICE9IFNZU0NBTExfVkVDVE9SKQotCQkJc2V0X2ludHJfZ2F0ZShpLCBpbnRlcnJ1cHRbaS1GSVJTVF9FWFRFUk5BTF9WRUNUT1JdKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRU19MRUdBQ1k7IGkrKykgeworCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpKTsKKworCQlkZXNjLT5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7CisJCWRlc2MtPmFjdGlvbiA9IE5VTEw7CisJCWRlc2MtPmRlcHRoID0gMTsKKworCQlzZXRfaXJxX2NoaXBfYW5kX2hhbmRsZXJfbmFtZShpLCAmaTgyNTlBX2NoaXAsCisJCQkJCSAgICAgIGhhbmRsZV9sZXZlbF9pcnEsICJYVCIpOwogCX0KK30KIAorLyogT3ZlcnJpZGRlbiBpbiBwYXJhdmlydC5jICovCit2b2lkIGluaXRfSVJRKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJuYXRpdmVfaW5pdF9JUlEiKSkpOwogCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1NNUCkKK3N0YXRpYyB2b2lkIF9faW5pdCBzbXBfaW50cl9pbml0KHZvaWQpCit7CisjaWZkZWYgQ09ORklHX1NNUAorI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCiAJLyoKIAkgKiBUaGUgcmVzY2hlZHVsZSBpbnRlcnJ1cHQgaXMgYSBDUFUtdG8tQ1BVIHJlc2NoZWR1bGUtaGVscGVyCiAJICogSVBJLCBkcml2ZW4gYnkgd2FrZXVwLgpAQCAtMTYwLDE2ICsxNjYsMzIgQEAKIAkvKiBJUEkgZm9yIGdlbmVyaWMgZnVuY3Rpb24gY2FsbCAqLwogCWFsbG9jX2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1ZFQ1RPUiwgY2FsbF9mdW5jdGlvbl9pbnRlcnJ1cHQpOwogCi0JLyogSVBJIGZvciBzaW5nbGUgY2FsbCBmdW5jdGlvbiAqLworCS8qIElQSSBmb3IgZ2VuZXJpYyBzaW5nbGUgZnVuY3Rpb24gY2FsbCAqLwogCWFsbG9jX2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1NJTkdMRV9WRUNUT1IsCi0JCQkJIGNhbGxfZnVuY3Rpb25fc2luZ2xlX2ludGVycnVwdCk7CisJCQljYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQpOwogCiAJLyogTG93IHByaW9yaXR5IElQSSB0byBjbGVhbnVwIGFmdGVyIG1vdmluZyBhbiBpcnEgKi8KIAlzZXRfaW50cl9nYXRlKElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SLCBpcnFfbW92ZV9jbGVhbnVwX2ludGVycnVwdCk7CiAJc2V0X2JpdChJUlFfTU9WRV9DTEVBTlVQX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKICNlbmRpZgorI2VuZGlmIC8qIENPTkZJR19TTVAgKi8KK30KIAotI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQworc3RhdGljIHZvaWQgX19pbml0IGFwaWNfaW50cl9pbml0KHZvaWQpCit7CisJc21wX2ludHJfaW5pdCgpOworCisjaWZkZWYgQ09ORklHX1g4Nl9USEVSTUFMX1ZFQ1RPUgorCWFsbG9jX2ludHJfZ2F0ZShUSEVSTUFMX0FQSUNfVkVDVE9SLCB0aGVybWFsX2ludGVycnVwdCk7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfWDg2X1RIUkVTSE9MRAorCWFsbG9jX2ludHJfZ2F0ZShUSFJFU0hPTERfQVBJQ19WRUNUT1IsIHRocmVzaG9sZF9pbnRlcnJ1cHQpOworI2VuZGlmCisjaWYgZGVmaW5lZChDT05GSUdfWDg2X05FV19NQ0UpICYmIGRlZmluZWQoQ09ORklHX1g4Nl9MT0NBTF9BUElDKQorCWFsbG9jX2ludHJfZ2F0ZShNQ0VfU0VMRl9WRUNUT1IsIG1jZV9zZWxmX2ludGVycnVwdCk7CisjZW5kaWYKKworI2lmIGRlZmluZWQoQ09ORklHX1g4Nl82NCkgfHwgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpCiAJLyogc2VsZiBnZW5lcmF0ZWQgSVBJIGZvciBsb2NhbCBBUElDIHRpbWVyICovCiAJYWxsb2NfaW50cl9nYXRlKExPQ0FMX1RJTUVSX1ZFQ1RPUiwgYXBpY190aW1lcl9pbnRlcnJ1cHQpOwogCkBAIC0xNzksMTYgKzIwMSw1OSBAQAogCS8qIElQSSB2ZWN0b3JzIGZvciBBUElDIHNwdXJpb3VzIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCiAJYWxsb2NfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOwogCWFsbG9jX2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKLSNlbmRpZgogCi0jaWYgZGVmaW5lZChDT05GSUdfWDg2X0xPQ0FMX0FQSUMpICYmIGRlZmluZWQoQ09ORklHX1g4Nl9NQ0VfUDRUSEVSTUFMKQotCS8qIHRoZXJtYWwgbW9uaXRvciBMVlQgaW50ZXJydXB0ICovCi0JYWxsb2NfaW50cl9nYXRlKFRIRVJNQUxfQVBJQ19WRUNUT1IsIHRoZXJtYWxfaW50ZXJydXB0KTsKKwkvKiBQZXJmb3JtYW5jZSBtb25pdG9yaW5nIGludGVycnVwdHM6ICovCisjIGlmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCisJYWxsb2NfaW50cl9nYXRlKExPQ0FMX1BFTkRJTkdfVkVDVE9SLCBwZXJmX3BlbmRpbmdfaW50ZXJydXB0KTsKKyMgZW5kaWYKKwogI2VuZGlmCit9CisKKy8qKgorICogeDg2X3F1aXJrX3ByZV9pbnRyX2luaXQgLSBpbml0aWFsaXNhdGlvbiBwcmlvciB0byBzZXR0aW5nIHVwIGludGVycnVwdCB2ZWN0b3JzCisgKgorICogRGVzY3JpcHRpb246CisgKglQZXJmb3JtIGFueSBuZWNlc3NhcnkgaW50ZXJydXB0IGluaXRpYWxpc2F0aW9uIHByaW9yIHRvIHNldHRpbmcgdXAKKyAqCXRoZSAib3JkaW5hcnkiIGludGVycnVwdCBjYWxsIGdhdGVzLiAgRm9yIGxlZ2FjeSByZWFzb25zLCB0aGUgSVNBCisgKglpbnRlcnJ1cHRzIHNob3VsZCBiZSBpbml0aWFsaXNlZCBoZXJlIGlmIHRoZSBtYWNoaW5lIGVtdWxhdGVzIGEgUEMKKyAqCWluIGFueSB3YXkuCisgKiovCitzdGF0aWMgdm9pZCBfX2luaXQgeDg2X3F1aXJrX3ByZV9pbnRyX2luaXQodm9pZCkKK3sKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJaWYgKHg4Nl9xdWlya3MtPmFyY2hfcHJlX2ludHJfaW5pdCkgeworCQlpZiAoeDg2X3F1aXJrcy0+YXJjaF9wcmVfaW50cl9pbml0KCkpCisJCQlyZXR1cm47CisJfQorI2VuZGlmCisJaW5pdF9JU0FfaXJxcygpOworfQorCit2b2lkIF9faW5pdCBuYXRpdmVfaW5pdF9JUlEodm9pZCkKK3sKKwlpbnQgaTsKKworCS8qIEV4ZWN1dGUgYW55IHF1aXJrcyBiZWZvcmUgdGhlIGNhbGwgZ2F0ZXMgYXJlIGluaXRpYWxpc2VkOiAqLworCXg4Nl9xdWlya19wcmVfaW50cl9pbml0KCk7CisKKwlhcGljX2ludHJfaW5pdCgpOworCisJLyoKKwkgKiBDb3ZlciB0aGUgd2hvbGUgdmVjdG9yIHNwYWNlLCBubyB2ZWN0b3IgY2FuIGVzY2FwZQorCSAqIHVzLiAoc29tZSBvZiB0aGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIGJlY29tZQorCSAqICdzcGVjaWFsJyBTTVAgaW50ZXJydXB0cykKKwkgKi8KKwlmb3IgKGkgPSBGSVJTVF9FWFRFUk5BTF9WRUNUT1I7IGkgPCBOUl9WRUNUT1JTOyBpKyspIHsKKwkJLyogSUEzMl9TWVNDQUxMX1ZFQ1RPUiBjb3VsZCBiZSB1c2VkIGluIHRyYXBfaW5pdCBhbHJlYWR5LiAqLworCQlpZiAoIXRlc3RfYml0KGksIHVzZWRfdmVjdG9ycykpCisJCQlzZXRfaW50cl9nYXRlKGksIGludGVycnVwdFtpLUZJUlNUX0VYVEVSTkFMX1ZFQ1RPUl0pOworCX0KIAogCWlmICghYWNwaV9pb2FwaWMpCiAJCXNldHVwX2lycSgyLCAmaXJxMik7CiAKKyNpZmRlZiBDT05GSUdfWDg2XzMyCiAJLyoKIAkgKiBDYWxsIHF1aXJrcyBhZnRlciBjYWxsIGdhdGVzIGFyZSBpbml0aWFsaXNlZCAodXN1YWxseSBhZGQgaW4KIAkgKiB0aGUgYXJjaGl0ZWN0dXJlIHNwZWNpZmljIGdhdGVzKToKQEAgLTIwMyw0ICsyNjgsNSBAQAogCQlzZXR1cF9pcnEoRlBVX0lSUSwgJmZwdV9pcnEpOwogCiAJaXJxX2N0eF9pbml0KHNtcF9wcm9jZXNzb3JfaWQoKSk7CisjZW5kaWYKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvaXJxaW5pdF82NC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2QxMDUzLi4wMDAwMDAwCi0tLSBhL2FyY2gveDg2L2tlcm5lbC9pcnFpbml0XzY0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNzcgKzAsMCBAQAotI2luY2x1ZGUgPGxpbnV4L2xpbmthZ2UuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+Ci0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdGltZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc3lzZGV2Lmg+Ci0jaW5jbHVkZSA8bGludXgvYml0b3BzLmg+Ci0jaW5jbHVkZSA8bGludXgvYWNwaS5oPgotI2luY2x1ZGUgPGxpbnV4L2lvLmg+Ci0jaW5jbHVkZSA8bGludXgvZGVsYXkuaD4KLQotI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KLSNpbmNsdWRlIDxhc20vc3lzdGVtLmg+Ci0jaW5jbHVkZSA8YXNtL2h3X2lycS5oPgotI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+Ci0jaW5jbHVkZSA8YXNtL2Rlc2MuaD4KLSNpbmNsdWRlIDxhc20vYXBpYy5oPgotI2luY2x1ZGUgPGFzbS9pODI1OS5oPgotCi0vKgotICogSVNBIFBJQyBvciBsb3cgSU8tQVBJQyB0cmlnZ2VyZWQgKElOVEEtY3ljbGUgb3IgQVBJQykgaW50ZXJydXB0czoKLSAqICh0aGVzZSBhcmUgdXN1YWxseSBtYXBwZWQgdG8gdmVjdG9ycyAweDMwLTB4M2YpCi0gKi8KLQotLyoKLSAqIFRoZSBJTy1BUElDIGdpdmVzIHVzIG1hbnkgbW9yZSBpbnRlcnJ1cHQgc291cmNlcy4gTW9zdCBvZiB0aGVzZQotICogYXJlIHVudXNlZCBidXQgYW4gU01QIHN5c3RlbSBpcyBzdXBwb3NlZCB0byBoYXZlIGVub3VnaCBtZW1vcnkgLi4uCi0gKiBzb21ldGltZXMgKG1vc3RseSB3cnQuIGh3IGJ1Z3MpIHdlIGdldCBjb3JydXB0ZWQgdmVjdG9ycyBhbGwKLSAqIGFjcm9zcyB0aGUgc3BlY3RydW0sIHNvIHdlIHJlYWxseSB3YW50IHRvIGJlIHByZXBhcmVkIHRvIGdldCBhbGwKLSAqIG9mIHRoZXNlLiBQbHVzLCBtb3JlIHBvd2VyZnVsIHN5c3RlbXMgbWlnaHQgaGF2ZSBtb3JlIHRoYW4gNjQKLSAqIElPLUFQSUMgcmVnaXN0ZXJzLgotICoKLSAqICh0aGVzZSBhcmUgdXN1YWxseSBtYXBwZWQgaW50byB0aGUgMHgzMC0weGZmIHZlY3RvciByYW5nZSkKLSAqLwotCi0vKgotICogSVJRMiBpcyBjYXNjYWRlIGludGVycnVwdCB0byBzZWNvbmQgaW50ZXJydXB0IGNvbnRyb2xsZXIKLSAqLwotCi1zdGF0aWMgc3RydWN0IGlycWFjdGlvbiBpcnEyID0gewotCS5oYW5kbGVyID0gbm9fYWN0aW9uLAotCS5uYW1lID0gImNhc2NhZGUiLAotfTsKLURFRklORV9QRVJfQ1BVKHZlY3Rvcl9pcnFfdCwgdmVjdG9yX2lycSkgPSB7Ci0JWzAgLi4uIElSUTBfVkVDVE9SIC0gMV0gPSAtMSwKLQlbSVJRMF9WRUNUT1JdID0gMCwKLQlbSVJRMV9WRUNUT1JdID0gMSwKLQlbSVJRMl9WRUNUT1JdID0gMiwKLQlbSVJRM19WRUNUT1JdID0gMywKLQlbSVJRNF9WRUNUT1JdID0gNCwKLQlbSVJRNV9WRUNUT1JdID0gNSwKLQlbSVJRNl9WRUNUT1JdID0gNiwKLQlbSVJRN19WRUNUT1JdID0gNywKLQlbSVJROF9WRUNUT1JdID0gOCwKLQlbSVJROV9WRUNUT1JdID0gOSwKLQlbSVJRMTBfVkVDVE9SXSA9IDEwLAotCVtJUlExMV9WRUNUT1JdID0gMTEsCi0JW0lSUTEyX1ZFQ1RPUl0gPSAxMiwKLQlbSVJRMTNfVkVDVE9SXSA9IDEzLAotCVtJUlExNF9WRUNUT1JdID0gMTQsCi0JW0lSUTE1X1ZFQ1RPUl0gPSAxNSwKLQlbSVJRMTVfVkVDVE9SICsgMSAuLi4gTlJfVkVDVE9SUyAtIDFdID0gLTEKLX07Ci0KLWludCB2ZWN0b3JfdXNlZF9ieV9wZXJjcHVfaXJxKHVuc2lnbmVkIGludCB2ZWN0b3IpCi17Ci0JaW50IGNwdTsKLQotCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7Ci0JCWlmIChwZXJfY3B1KHZlY3Rvcl9pcnEsIGNwdSlbdmVjdG9yXSAhPSAtMSkKLQkJCXJldHVybiAxOwotCX0KLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgaW5pdF9JU0FfaXJxcyh2b2lkKQotewotCWludCBpOwotCi0JaW5pdF9ic3BfQVBJQygpOwotCWluaXRfODI1OUEoMCk7Ci0KLQlmb3IgKGkgPSAwOyBpIDwgTlJfSVJRU19MRUdBQ1k7IGkrKykgewotCQlzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MgPSBpcnFfdG9fZGVzYyhpKTsKLQotCQlkZXNjLT5zdGF0dXMgPSBJUlFfRElTQUJMRUQ7Ci0JCWRlc2MtPmFjdGlvbiA9IE5VTEw7Ci0JCWRlc2MtPmRlcHRoID0gMTsKLQotCQkvKgotCQkgKiAxNiBvbGQtc3R5bGUgSU5UQS1jeWNsZSBpbnRlcnJ1cHRzOgotCQkgKi8KLQkJc2V0X2lycV9jaGlwX2FuZF9oYW5kbGVyX25hbWUoaSwgJmk4MjU5QV9jaGlwLAotCQkJCQkJICAgICAgaGFuZGxlX2xldmVsX2lycSwgIlhUIik7Ci0JfQotfQotCi12b2lkIGluaXRfSVJRKHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWssIGFsaWFzKCJuYXRpdmVfaW5pdF9JUlEiKSkpOwotCi1zdGF0aWMgdm9pZCBfX2luaXQgc21wX2ludHJfaW5pdCh2b2lkKQotewotI2lmZGVmIENPTkZJR19TTVAKLQkvKgotCSAqIFRoZSByZXNjaGVkdWxlIGludGVycnVwdCBpcyBhIENQVS10by1DUFUgcmVzY2hlZHVsZS1oZWxwZXIKLQkgKiBJUEksIGRyaXZlbiBieSB3YWtldXAuCi0JICovCi0JYWxsb2NfaW50cl9nYXRlKFJFU0NIRURVTEVfVkVDVE9SLCByZXNjaGVkdWxlX2ludGVycnVwdCk7Ci0KLQkvKiBJUElzIGZvciBpbnZhbGlkYXRpb24gKi8KLQlhbGxvY19pbnRyX2dhdGUoSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUKzAsIGludmFsaWRhdGVfaW50ZXJydXB0MCk7Ci0JYWxsb2NfaW50cl9nYXRlKElOVkFMSURBVEVfVExCX1ZFQ1RPUl9TVEFSVCsxLCBpbnZhbGlkYXRlX2ludGVycnVwdDEpOwotCWFsbG9jX2ludHJfZ2F0ZShJTlZBTElEQVRFX1RMQl9WRUNUT1JfU1RBUlQrMiwgaW52YWxpZGF0ZV9pbnRlcnJ1cHQyKTsKLQlhbGxvY19pbnRyX2dhdGUoSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUKzMsIGludmFsaWRhdGVfaW50ZXJydXB0Myk7Ci0JYWxsb2NfaW50cl9nYXRlKElOVkFMSURBVEVfVExCX1ZFQ1RPUl9TVEFSVCs0LCBpbnZhbGlkYXRlX2ludGVycnVwdDQpOwotCWFsbG9jX2ludHJfZ2F0ZShJTlZBTElEQVRFX1RMQl9WRUNUT1JfU1RBUlQrNSwgaW52YWxpZGF0ZV9pbnRlcnJ1cHQ1KTsKLQlhbGxvY19pbnRyX2dhdGUoSU5WQUxJREFURV9UTEJfVkVDVE9SX1NUQVJUKzYsIGludmFsaWRhdGVfaW50ZXJydXB0Nik7Ci0JYWxsb2NfaW50cl9nYXRlKElOVkFMSURBVEVfVExCX1ZFQ1RPUl9TVEFSVCs3LCBpbnZhbGlkYXRlX2ludGVycnVwdDcpOwotCi0JLyogSVBJIGZvciBnZW5lcmljIGZ1bmN0aW9uIGNhbGwgKi8KLQlhbGxvY19pbnRyX2dhdGUoQ0FMTF9GVU5DVElPTl9WRUNUT1IsIGNhbGxfZnVuY3Rpb25faW50ZXJydXB0KTsKLQotCS8qIElQSSBmb3IgZ2VuZXJpYyBzaW5nbGUgZnVuY3Rpb24gY2FsbCAqLwotCWFsbG9jX2ludHJfZ2F0ZShDQUxMX0ZVTkNUSU9OX1NJTkdMRV9WRUNUT1IsCi0JCQljYWxsX2Z1bmN0aW9uX3NpbmdsZV9pbnRlcnJ1cHQpOwotCi0JLyogTG93IHByaW9yaXR5IElQSSB0byBjbGVhbnVwIGFmdGVyIG1vdmluZyBhbiBpcnEgKi8KLQlzZXRfaW50cl9nYXRlKElSUV9NT1ZFX0NMRUFOVVBfVkVDVE9SLCBpcnFfbW92ZV9jbGVhbnVwX2ludGVycnVwdCk7Ci0Jc2V0X2JpdChJUlFfTU9WRV9DTEVBTlVQX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKLSNlbmRpZgotfQotCi1zdGF0aWMgdm9pZCBfX2luaXQgYXBpY19pbnRyX2luaXQodm9pZCkKLXsKLQlzbXBfaW50cl9pbml0KCk7Ci0KLQlhbGxvY19pbnRyX2dhdGUoVEhFUk1BTF9BUElDX1ZFQ1RPUiwgdGhlcm1hbF9pbnRlcnJ1cHQpOwotCWFsbG9jX2ludHJfZ2F0ZShUSFJFU0hPTERfQVBJQ19WRUNUT1IsIHRocmVzaG9sZF9pbnRlcnJ1cHQpOwotCi0JLyogc2VsZiBnZW5lcmF0ZWQgSVBJIGZvciBsb2NhbCBBUElDIHRpbWVyICovCi0JYWxsb2NfaW50cl9nYXRlKExPQ0FMX1RJTUVSX1ZFQ1RPUiwgYXBpY190aW1lcl9pbnRlcnJ1cHQpOwotCi0JLyogZ2VuZXJpYyBJUEkgZm9yIHBsYXRmb3JtIHNwZWNpZmljIHVzZSAqLwotCWFsbG9jX2ludHJfZ2F0ZShHRU5FUklDX0lOVEVSUlVQVF9WRUNUT1IsIGdlbmVyaWNfaW50ZXJydXB0KTsKLQotCS8qIElQSSB2ZWN0b3JzIGZvciBBUElDIHNwdXJpb3VzIGFuZCBlcnJvciBpbnRlcnJ1cHRzICovCi0JYWxsb2NfaW50cl9nYXRlKFNQVVJJT1VTX0FQSUNfVkVDVE9SLCBzcHVyaW91c19pbnRlcnJ1cHQpOwotCWFsbG9jX2ludHJfZ2F0ZShFUlJPUl9BUElDX1ZFQ1RPUiwgZXJyb3JfaW50ZXJydXB0KTsKLX0KLQotdm9pZCBfX2luaXQgbmF0aXZlX2luaXRfSVJRKHZvaWQpCi17Ci0JaW50IGk7Ci0KLQlpbml0X0lTQV9pcnFzKCk7Ci0JLyoKLQkgKiBDb3ZlciB0aGUgd2hvbGUgdmVjdG9yIHNwYWNlLCBubyB2ZWN0b3IgY2FuIGVzY2FwZQotCSAqIHVzLiAoc29tZSBvZiB0aGVzZSB3aWxsIGJlIG92ZXJyaWRkZW4gYW5kIGJlY29tZQotCSAqICdzcGVjaWFsJyBTTVAgaW50ZXJydXB0cykKLQkgKi8KLQlmb3IgKGkgPSAwOyBpIDwgKE5SX1ZFQ1RPUlMgLSBGSVJTVF9FWFRFUk5BTF9WRUNUT1IpOyBpKyspIHsKLQkJaW50IHZlY3RvciA9IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUiArIGk7Ci0JCWlmICh2ZWN0b3IgIT0gSUEzMl9TWVNDQUxMX1ZFQ1RPUikKLQkJCXNldF9pbnRyX2dhdGUodmVjdG9yLCBpbnRlcnJ1cHRbaV0pOwotCX0KLQotCWFwaWNfaW50cl9pbml0KCk7Ci0KLQlpZiAoIWFjcGlfaW9hcGljKQotCQlzZXR1cF9pcnEoMiwgJmlycTIpOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL2tnZGIuYyBiL2FyY2gveDg2L2tlcm5lbC9rZ2RiLmMKaW5kZXggYjFmNGRmZi4uOGQ4MmE3NyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2tnZGIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwva2dkYi5jCkBAIC0xNDIsNyArMTQyLDcgQEAKIAlnZGJfcmVnczMyW0dEQl9QU10JPSAqKHVuc2lnbmVkIGxvbmcgKikocC0+dGhyZWFkLnNwICsgOCk7CiAJZ2RiX3JlZ3MzMltHREJfQ1NdCT0gX19LRVJORUxfQ1M7CiAJZ2RiX3JlZ3MzMltHREJfU1NdCT0gX19LRVJORUxfRFM7Ci0JZ2RiX3JlZ3NbR0RCX1BDXQk9IHAtPnRocmVhZC5pcDsKKwlnZGJfcmVnc1tHREJfUENdCT0gMDsKIAlnZGJfcmVnc1tHREJfUjhdCT0gMDsKIAlnZGJfcmVnc1tHREJfUjldCT0gMDsKIAlnZGJfcmVnc1tHREJfUjEwXQk9IDA7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMgYi9hcmNoL3g4Ni9rZXJuZWwva3ZtLmMKaW5kZXggMzMwMTlkZC4uNjU1MWRlZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL2t2bS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9rdm0uYwpAQCAtMTk1LDcgKzE5NSw3IEBACiAJc3RydWN0IGt2bV9wYXJhX3N0YXRlICpzdGF0ZSA9IGt2bV9wYXJhX3N0YXRlKCk7CiAKIAltbXVfcXVldWVfZmx1c2goc3RhdGUpOwotCXBhcmF2aXJ0X2xlYXZlX2xhenkocGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpKTsKKwlwYXJhdmlydF9sZWF2ZV9sYXp5X21tdSgpOwogCXN0YXRlLT5tb2RlID0gcGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jIGIvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9hbWQuYwppbmRleCA0NTNiNTc5Li4zNjZiYWExIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2FtZC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfYW1kLmMKQEAgLTEzLDI1ICsxMywxMyBAQAogICogIExpY2Vuc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAgKiAgTGljZW5zZSB2ZXJzaW9uIDIuIFNlZSBmaWxlIENPUFlJTkcgZm9yIGRldGFpbHMuCiAgKi8KLSNpbmNsdWRlIDxsaW51eC9wbGF0Zm9ybV9kZXZpY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Zpcm13YXJlLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGNpX2lkcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+Ci0jaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9zbGFiLmg+Ci0jaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvcGNpLmg+Ci0jaW5jbHVkZSA8bGludXgvZnMuaD4KLSNpbmNsdWRlIDxsaW51eC9tbS5oPgogCiAjaW5jbHVkZSA8YXNtL21pY3JvY29kZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTc5LDkgKzY3LDYgQEAKICNkZWZpbmUgVUNPREVfQ09OVEFJTkVSX1NFQ1RJT05fSERSCTgKICNkZWZpbmUgVUNPREVfQ09OVEFJTkVSX0hFQURFUl9TSVpFCTEyCiAKLS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pY3JvY29kZV91cGRhdGVfbG9jayk7Ci0KIHN0YXRpYyBzdHJ1Y3QgZXF1aXZfY3B1X2VudHJ5ICplcXVpdl9jcHVfdGFibGU7CiAKIHN0YXRpYyBpbnQgY29sbGVjdF9jcHVfaW5mb19hbWQoaW50IGNwdSwgc3RydWN0IGNwdV9zaWduYXR1cmUgKmNzaWcpCkBAIC0xNDQsOSArMTI5LDggQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQgYXBwbHlfbWljcm9jb2RlX2FtZChpbnQgY3B1KQorc3RhdGljIGludCBhcHBseV9taWNyb2NvZGVfYW1kKGludCBjcHUpCiB7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKIAl1MzIgcmV2LCBkdW1teTsKIAlpbnQgY3B1X251bSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdV9udW07CkBAIC0xNTYsMjUgKzE0MCwyNSBAQAogCUJVR19PTihjcHVfbnVtICE9IGNwdSk7CiAKIAlpZiAobWNfYW1kID09IE5VTEwpCi0JCXJldHVybjsKKwkJcmV0dXJuIDA7CiAKLQlzcGluX2xvY2tfaXJxc2F2ZSgmbWljcm9jb2RlX3VwZGF0ZV9sb2NrLCBmbGFncyk7CiAJd3Jtc3JsKE1TUl9BTUQ2NF9QQVRDSF9MT0FERVIsICh1NjQpKGxvbmcpJm1jX2FtZC0+aGRyLmRhdGFfY29kZSk7CiAJLyogZ2V0IHBhdGNoIGlkIGFmdGVyIHBhdGNoaW5nICovCiAJcmRtc3IoTVNSX0FNRDY0X1BBVENIX0xFVkVMLCByZXYsIGR1bW15KTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKIAogCS8qIGNoZWNrIGN1cnJlbnQgcGF0Y2ggaWQgYW5kIHBhdGNoJ3MgaWQgZm9yIG1hdGNoICovCiAJaWYgKHJldiAhPSBtY19hbWQtPmhkci5wYXRjaF9pZCkgewogCQlwcmludGsoS0VSTl9FUlIgIm1pY3JvY29kZTogQ1BVJWQ6IHVwZGF0ZSBmYWlsZWQgIgogCQkgICAgICAgIihmb3IgcGF0Y2hfbGV2ZWw9MHgleClcbiIsIGNwdSwgbWNfYW1kLT5oZHIucGF0Y2hfaWQpOwotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAl9CiAKIAlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IENQVSVkOiB1cGRhdGVkIChuZXcgcGF0Y2hfbGV2ZWw9MHgleClcbiIsCiAJICAgICAgIGNwdSwgcmV2KTsKIAogCXVjaS0+Y3B1X3NpZy5yZXYgPSByZXY7CisKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIGludCBnZXRfdWNvZGVfZGF0YSh2b2lkICp0bywgY29uc3QgdTggKmZyb20sIHNpemVfdCBuKQpAQCAtMjU3LDEzICsyNDEsMTIgQEAKIAogc3RhdGljIHZvaWQgZnJlZV9lcXVpdl9jcHVfdGFibGUodm9pZCkKIHsKLQlpZiAoZXF1aXZfY3B1X3RhYmxlKSB7Ci0JCXZmcmVlKGVxdWl2X2NwdV90YWJsZSk7Ci0JCWVxdWl2X2NwdV90YWJsZSA9IE5VTEw7Ci0JfQorCXZmcmVlKGVxdWl2X2NwdV90YWJsZSk7CisJZXF1aXZfY3B1X3RhYmxlID0gTlVMTDsKIH0KIAotc3RhdGljIGludCBnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3Qgc2l6ZSkKK3N0YXRpYyBlbnVtIHVjb2RlX3N0YXRlCitnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIGNvbnN0IHU4ICpkYXRhLCBzaXplX3Qgc2l6ZSkKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCWNvbnN0IHU4ICp1Y29kZV9wdHIgPSBkYXRhOwpAQCAtMjcyLDEyICsyNTUsMTMgQEAKIAlpbnQgbmV3X3JldiA9IHVjaS0+Y3B1X3NpZy5yZXY7CiAJdW5zaWduZWQgaW50IGxlZnRvdmVyOwogCXVuc2lnbmVkIGxvbmcgb2Zmc2V0OworCWVudW0gdWNvZGVfc3RhdGUgc3RhdGUgPSBVQ09ERV9PSzsKIAogCW9mZnNldCA9IGluc3RhbGxfZXF1aXZfY3B1X3RhYmxlKHVjb2RlX3B0cik7CiAJaWYgKCFvZmZzZXQpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGZhaWxlZCB0byBjcmVhdGUgIgogCQkgICAgICAgImVxdWl2YWxlbnQgY3B1IHRhYmxlXG4iKTsKLQkJcmV0dXJuIC1FSU5WQUw7CisJCXJldHVybiBVQ09ERV9FUlJPUjsKIAl9CiAKIAl1Y29kZV9wdHIgKz0gb2Zmc2V0OwpAQCAtMjkzLDggKzI3Nyw3IEBACiAKIAkJbWNfaGVhZGVyID0gKHN0cnVjdCBtaWNyb2NvZGVfaGVhZGVyX2FtZCAqKW1jOwogCQlpZiAoZ2V0X21hdGNoaW5nX21pY3JvY29kZShjcHUsIG1jLCBuZXdfcmV2KSkgewotCQkJaWYgKG5ld19tYykKLQkJCQl2ZnJlZShuZXdfbWMpOworCQkJdmZyZWUobmV3X21jKTsKIAkJCW5ld19yZXYgPSBtY19oZWFkZXItPnBhdGNoX2lkOwogCQkJbmV3X21jICA9IG1jOwogCQl9IGVsc2UKQEAgLTMwNiwzNCArMjg5LDMyIEBACiAKIAlpZiAobmV3X21jKSB7CiAJCWlmICghbGVmdG92ZXIpIHsKLQkJCWlmICh1Y2ktPm1jKQotCQkJCXZmcmVlKHVjaS0+bWMpOworCQkJdmZyZWUodWNpLT5tYyk7CiAJCQl1Y2ktPm1jID0gbmV3X21jOwogCQkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgZm91bmQgYSBtYXRjaGluZyBtaWNyb2NvZGUgIgogCQkJCSAidXBkYXRlIHdpdGggdmVyc2lvbiAweCV4IChjdXJyZW50PTB4JXgpXG4iLAogCQkJCSBjcHUsIG5ld19yZXYsIHVjaS0+Y3B1X3NpZy5yZXYpOwotCQl9IGVsc2UKKwkJfSBlbHNlIHsKIAkJCXZmcmVlKG5ld19tYyk7Ci0JfQorCQkJc3RhdGUgPSBVQ09ERV9FUlJPUjsKKwkJfQorCX0gZWxzZQorCQlzdGF0ZSA9IFVDT0RFX05GT1VORDsKIAogCWZyZWVfZXF1aXZfY3B1X3RhYmxlKCk7CiAKLQlyZXR1cm4gKGludClsZWZ0b3ZlcjsKKwlyZXR1cm4gc3RhdGU7CiB9CiAKLXN0YXRpYyBpbnQgcmVxdWVzdF9taWNyb2NvZGVfZncoaW50IGNwdSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQorc3RhdGljIGVudW0gdWNvZGVfc3RhdGUgcmVxdWVzdF9taWNyb2NvZGVfZncoaW50IGNwdSwgc3RydWN0IGRldmljZSAqZGV2aWNlKQogewogCWNvbnN0IGNoYXIgKmZ3X25hbWUgPSAiYW1kLXVjb2RlL21pY3JvY29kZV9hbWQuYmluIjsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwotCWludCByZXQ7CisJZW51bSB1Y29kZV9zdGF0ZSByZXQ7CiAKLQkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCi0JQlVHX09OKGNwdSAhPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQotCXJldCA9IHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBmd19uYW1lLCBkZXZpY2UpOwotCWlmIChyZXQpIHsKKwlpZiAocmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIGZ3X25hbWUsIGRldmljZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IGZhaWxlZCB0byBsb2FkIGZpbGUgJXNcbiIsIGZ3X25hbWUpOwotCQlyZXR1cm4gcmV0OworCQlyZXR1cm4gVUNPREVfTkZPVU5EOwogCX0KIAogCXJldCA9IGdlbmVyaWNfbG9hZF9taWNyb2NvZGUoY3B1LCBmaXJtd2FyZS0+ZGF0YSwgZmlybXdhcmUtPnNpemUpOwpAQCAtMzQzLDExICszMjQsMTIgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgaW50IHJlcXVlc3RfbWljcm9jb2RlX3VzZXIoaW50IGNwdSwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpCitzdGF0aWMgZW51bSB1Y29kZV9zdGF0ZQorcmVxdWVzdF9taWNyb2NvZGVfdXNlcihpbnQgY3B1LCBjb25zdCB2b2lkIF9fdXNlciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKIAlwcmludGsoS0VSTl9JTkZPICJtaWNyb2NvZGU6IEFNRCBtaWNyb2NvZGUgdXBkYXRlIHZpYSAiCiAJICAgICAgICIvZGV2L2NwdS9taWNyb2NvZGUgbm90IHN1cHBvcnRlZFxuIik7Ci0JcmV0dXJuIC0xOworCXJldHVybiBVQ09ERV9FUlJPUjsKIH0KIAogc3RhdGljIHZvaWQgbWljcm9jb2RlX2ZpbmlfY3B1X2FtZChpbnQgY3B1KQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9jb3JlLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYwppbmRleCA5OGM0NzBjLi45YzQ0NjE1IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2NvcmUuYwpAQCAtNzEsMjcgKzcxLDE4IEBACiAgKgkJVGhhbmtzIHRvIFN0dWFydCBTd2FsZXMgZm9yIHBvaW50aW5nIG91dCB0aGlzIGJ1Zy4KICAqLwogI2luY2x1ZGUgPGxpbnV4L3BsYXRmb3JtX2RldmljZS5oPgotI2luY2x1ZGUgPGxpbnV4L2NhcGFiaWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9taXNjZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvZmlybXdhcmUuaD4KKyNpbmNsdWRlIDxsaW51eC9jYXBhYmlsaXR5Lmg+CiAjaW5jbHVkZSA8bGludXgvc21wX2xvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9zcGlubG9jay5oPgotI2luY2x1ZGUgPGxpbnV4L2NwdW1hc2suaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC9pbml0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L2NwdS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvbW0uaD4KIAogI2luY2x1ZGUgPGFzbS9taWNyb2NvZGUuaD4KICNpbmNsdWRlIDxhc20vcHJvY2Vzc29yLmg+Ci0jaW5jbHVkZSA8YXNtL21zci5oPgogCiBNT0RVTEVfREVTQ1JJUFRJT04oIk1pY3JvY29kZSBVcGRhdGUgRHJpdmVyIik7CiBNT0RVTEVfQVVUSE9SKCJUaWdyYW4gQWl2YXppYW4gPHRpZ3JhbkBhaXZhemlhbi5mc25ldC5jby51az4iKTsKQEAgLTEwMSwzNiArOTIsMTEwIEBACiAKIHN0YXRpYyBzdHJ1Y3QgbWljcm9jb2RlX29wcwkqbWljcm9jb2RlX29wczsKIAotLyogbm8gY29uY3VycmVudCAtPndyaXRlKClzIGFyZSBhbGxvd2VkIG9uIC9kZXYvY3B1L21pY3JvY29kZSAqLworLyoKKyAqIFN5bmNocm9uaXphdGlvbi4KKyAqCisgKiBBbGwgbm9uIGNwdS1ob3RwbHVnLWNhbGxiYWNrIGNhbGwgc2l0ZXMgdXNlOgorICoKKyAqIC0gbWljcm9jb2RlX211dGV4IHRvIHN5bmNocm9uaXplIHdpdGggZWFjaCBvdGhlcjsKKyAqIC0gZ2V0L3B1dF9vbmxpbmVfY3B1cygpIHRvIHN5bmNocm9uaXplIHdpdGgKKyAqICAgdGhlIGNwdS1ob3RwbHVnLWNhbGxiYWNrIGNhbGwgc2l0ZXMuCisgKgorICogV2UgZ3VhcmFudGVlIHRoYXQgb25seSBhIHNpbmdsZSBjcHUgaXMgYmVpbmcKKyAqIHVwZGF0ZWQgYXQgYW55IHBhcnRpY3VsYXIgbW9tZW50IG9mIHRpbWUuCisgKi8KIHN0YXRpYyBERUZJTkVfTVVURVgobWljcm9jb2RlX211dGV4KTsKIAogc3RydWN0IHVjb2RlX2NwdV9pbmZvCQl1Y29kZV9jcHVfaW5mb1tOUl9DUFVTXTsKIEVYUE9SVF9TWU1CT0xfR1BMKHVjb2RlX2NwdV9pbmZvKTsKIAorLyoKKyAqIE9wZXJhdGlvbnMgdGhhdCBhcmUgcnVuIG9uIGEgdGFyZ2V0IGNwdToKKyAqLworCitzdHJ1Y3QgY3B1X2luZm9fY3R4IHsKKwlzdHJ1Y3QgY3B1X3NpZ25hdHVyZQkqY3B1X3NpZzsKKwlpbnQJCQllcnI7Cit9OworCitzdGF0aWMgdm9pZCBjb2xsZWN0X2NwdV9pbmZvX2xvY2FsKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgY3B1X2luZm9fY3R4ICpjdHggPSBhcmc7CisKKwljdHgtPmVyciA9IG1pY3JvY29kZV9vcHMtPmNvbGxlY3RfY3B1X2luZm8oc21wX3Byb2Nlc3Nvcl9pZCgpLAorCQkJCQkJICAgY3R4LT5jcHVfc2lnKTsKK30KKworc3RhdGljIGludCBjb2xsZWN0X2NwdV9pbmZvX29uX3RhcmdldChpbnQgY3B1LCBzdHJ1Y3QgY3B1X3NpZ25hdHVyZSAqY3B1X3NpZykKK3sKKwlzdHJ1Y3QgY3B1X2luZm9fY3R4IGN0eCA9IHsgLmNwdV9zaWcgPSBjcHVfc2lnLCAuZXJyID0gMCB9OworCWludCByZXQ7CisKKwlyZXQgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBjb2xsZWN0X2NwdV9pbmZvX2xvY2FsLCAmY3R4LCAxKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gY3R4LmVycjsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgY29sbGVjdF9jcHVfaW5mbyhpbnQgY3B1KQoreworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CisJaW50IHJldDsKKworCW1lbXNldCh1Y2ksIDAsIHNpemVvZigqdWNpKSk7CisKKwlyZXQgPSBjb2xsZWN0X2NwdV9pbmZvX29uX3RhcmdldChjcHUsICZ1Y2ktPmNwdV9zaWcpOworCWlmICghcmV0KQorCQl1Y2ktPnZhbGlkID0gMTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0cnVjdCBhcHBseV9taWNyb2NvZGVfY3R4IHsKKwlpbnQgZXJyOworfTsKKworc3RhdGljIHZvaWQgYXBwbHlfbWljcm9jb2RlX2xvY2FsKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgYXBwbHlfbWljcm9jb2RlX2N0eCAqY3R4ID0gYXJnOworCisJY3R4LT5lcnIgPSBtaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKK30KKworc3RhdGljIGludCBhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGludCBjcHUpCit7CisJc3RydWN0IGFwcGx5X21pY3JvY29kZV9jdHggY3R4ID0geyAuZXJyID0gMCB9OworCWludCByZXQ7CisKKwlyZXQgPSBzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBhcHBseV9taWNyb2NvZGVfbG9jYWwsICZjdHgsIDEpOworCWlmICghcmV0KQorCQlyZXQgPSBjdHguZXJyOworCisJcmV0dXJuIHJldDsKK30KKwogI2lmZGVmIENPTkZJR19NSUNST0NPREVfT0xEX0lOVEVSRkFDRQogc3RhdGljIGludCBkb19taWNyb2NvZGVfdXBkYXRlKGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBzaXplKQogewotCWNwdW1hc2tfdCBvbGQ7CiAJaW50IGVycm9yID0gMDsKIAlpbnQgY3B1OwogCi0Jb2xkID0gY3VycmVudC0+Y3B1c19hbGxvd2VkOwotCiAJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKIAkJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKKwkJZW51bSB1Y29kZV9zdGF0ZSB1c3RhdGU7CiAKIAkJaWYgKCF1Y2ktPnZhbGlkKQogCQkJY29udGludWU7CiAKLQkJc2V0X2NwdXNfYWxsb3dlZF9wdHIoY3VycmVudCwgJmNwdW1hc2tfb2ZfY3B1KGNwdSkpOwotCQllcnJvciA9IG1pY3JvY29kZV9vcHMtPnJlcXVlc3RfbWljcm9jb2RlX3VzZXIoY3B1LCBidWYsIHNpemUpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJZ290byBvdXQ7Ci0JCWlmICghZXJyb3IpCi0JCQltaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoY3B1KTsKKwkJdXN0YXRlID0gbWljcm9jb2RlX29wcy0+cmVxdWVzdF9taWNyb2NvZGVfdXNlcihjcHUsIGJ1Ziwgc2l6ZSk7CisJCWlmICh1c3RhdGUgPT0gVUNPREVfRVJST1IpIHsKKwkJCWVycm9yID0gLTE7CisJCQlicmVhazsKKwkJfSBlbHNlIGlmICh1c3RhdGUgPT0gVUNPREVfT0spCisJCQlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CiAJfQotb3V0OgotCXNldF9jcHVzX2FsbG93ZWRfcHRyKGN1cnJlbnQsICZvbGQpOworCiAJcmV0dXJuIGVycm9yOwogfQogCkBAIC0xNDMsMTkgKzIwOCwxNyBAQAogc3RhdGljIHNzaXplX3QgbWljcm9jb2RlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyIF9fdXNlciAqYnVmLAogCQkJICAgICAgIHNpemVfdCBsZW4sIGxvZmZfdCAqcHBvcykKIHsKLQlzc2l6ZV90IHJldDsKKwlzc2l6ZV90IHJldCA9IC1FSU5WQUw7CiAKIAlpZiAoKGxlbiA+PiBQQUdFX1NISUZUKSA+IG51bV9waHlzcGFnZXMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IHRvbyBtdWNoIGRhdGEgKG1heCAlbGQgcGFnZXMpXG4iLAotCQkgICAgICAgbnVtX3BoeXNwYWdlcyk7Ci0JCXJldHVybiAtRUlOVkFMOworCQlwcl9lcnIoIm1pY3JvY29kZTogdG9vIG11Y2ggZGF0YSAobWF4ICVsZCBwYWdlcylcbiIsIG51bV9waHlzcGFnZXMpOworCQlyZXR1cm4gcmV0OwogCX0KIAogCWdldF9vbmxpbmVfY3B1cygpOwogCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CiAKLQlyZXQgPSBkb19taWNyb2NvZGVfdXBkYXRlKGJ1ZiwgbGVuKTsKLQlpZiAoIXJldCkKKwlpZiAoZG9fbWljcm9jb2RlX3VwZGF0ZShidWYsIGxlbikgPT0gMCkKIAkJcmV0ID0gKHNzaXplX3QpbGVuOwogCiAJbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwpAQCAtMTY1LDE1ICsyMjgsMTUgQEAKIH0KIAogc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgbWljcm9jb2RlX2ZvcHMgPSB7Ci0JLm93bmVyCQk9IFRISVNfTU9EVUxFLAotCS53cml0ZQkJPSBtaWNyb2NvZGVfd3JpdGUsCi0JLm9wZW4JCT0gbWljcm9jb2RlX29wZW4sCisJLm93bmVyCQkJPSBUSElTX01PRFVMRSwKKwkud3JpdGUJCQk9IG1pY3JvY29kZV93cml0ZSwKKwkub3BlbgkJCT0gbWljcm9jb2RlX29wZW4sCiB9OwogCiBzdGF0aWMgc3RydWN0IG1pc2NkZXZpY2UgbWljcm9jb2RlX2RldiA9IHsKLQkubWlub3IJCT0gTUlDUk9DT0RFX01JTk9SLAotCS5uYW1lCQk9ICJtaWNyb2NvZGUiLAotCS5mb3BzCQk9ICZtaWNyb2NvZGVfZm9wcywKKwkubWlub3IJCQk9IE1JQ1JPQ09ERV9NSU5PUiwKKwkubmFtZQkJCT0gIm1pY3JvY29kZSIsCisJLmZvcHMJCQk9ICZtaWNyb2NvZGVfZm9wcywKIH07CiAKIHN0YXRpYyBpbnQgX19pbml0IG1pY3JvY29kZV9kZXZfaW5pdCh2b2lkKQpAQCAtMTgyLDkgKzI0NSw3IEBACiAKIAllcnJvciA9IG1pc2NfcmVnaXN0ZXIoJm1pY3JvY29kZV9kZXYpOwogCWlmIChlcnJvcikgewotCQlwcmludGsoS0VSTl9FUlIKLQkJCSJtaWNyb2NvZGU6IGNhbid0IG1pc2NfcmVnaXN0ZXIgb24gbWlub3I9JWRcbiIsCi0JCQlNSUNST0NPREVfTUlOT1IpOworCQlwcl9lcnIoIm1pY3JvY29kZTogY2FuJ3QgbWlzY19yZWdpc3RlciBvbiBtaW5vcj0lZFxuIiwgTUlDUk9DT0RFX01JTk9SKTsKIAkJcmV0dXJuIGVycm9yOwogCX0KIApAQCAtMjA1LDQyICsyNjYsNTEgQEAKIC8qIGZha2UgZGV2aWNlIGZvciByZXF1ZXN0X2Zpcm13YXJlICovCiBzdGF0aWMgc3RydWN0IHBsYXRmb3JtX2RldmljZQkqbWljcm9jb2RlX3BkZXY7CiAKLXN0YXRpYyBsb25nIHJlbG9hZF9mb3JfY3B1KHZvaWQgKnVudXNlZCkKK3N0YXRpYyBpbnQgcmVsb2FkX2Zvcl9jcHUoaW50IGNwdSkKIHsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgc21wX3Byb2Nlc3Nvcl9pZCgpOworCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CiAJaW50IGVyciA9IDA7CiAKIAltdXRleF9sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwogCWlmICh1Y2ktPnZhbGlkKSB7Ci0JCWVyciA9IG1pY3JvY29kZV9vcHMtPnJlcXVlc3RfbWljcm9jb2RlX2Z3KHNtcF9wcm9jZXNzb3JfaWQoKSwKLQkJCQkJCQkgICZtaWNyb2NvZGVfcGRldi0+ZGV2KTsKLQkJaWYgKCFlcnIpCi0JCQltaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwkJZW51bSB1Y29kZV9zdGF0ZSB1c3RhdGU7CisKKwkJdXN0YXRlID0gbWljcm9jb2RlX29wcy0+cmVxdWVzdF9taWNyb2NvZGVfZncoY3B1LCAmbWljcm9jb2RlX3BkZXYtPmRldik7CisJCWlmICh1c3RhdGUgPT0gVUNPREVfT0spCisJCQlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CisJCWVsc2UKKwkJCWlmICh1c3RhdGUgPT0gVUNPREVfRVJST1IpCisJCQkJZXJyID0gLUVJTlZBTDsKIAl9CiAJbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOworCiAJcmV0dXJuIGVycjsKIH0KIAogc3RhdGljIHNzaXplX3QgcmVsb2FkX3N0b3JlKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYsCiAJCQkgICAgc3RydWN0IHN5c2Rldl9hdHRyaWJ1dGUgKmF0dHIsCi0JCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc3opCisJCQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSkKIHsKLQljaGFyICplbmQ7Ci0JdW5zaWduZWQgbG9uZyB2YWwgPSBzaW1wbGVfc3RydG91bChidWYsICZlbmQsIDApOwotCWludCBlcnIgPSAwOworCXVuc2lnbmVkIGxvbmcgdmFsOwogCWludCBjcHUgPSBkZXYtPmlkOworCWludCByZXQgPSAwOworCWNoYXIgKmVuZDsKIAorCXZhbCA9IHNpbXBsZV9zdHJ0b3VsKGJ1ZiwgJmVuZCwgMCk7CiAJaWYgKGVuZCA9PSBidWYpCiAJCXJldHVybiAtRUlOVkFMOworCiAJaWYgKHZhbCA9PSAxKSB7CiAJCWdldF9vbmxpbmVfY3B1cygpOwogCQlpZiAoY3B1X29ubGluZShjcHUpKQotCQkJZXJyID0gd29ya19vbl9jcHUoY3B1LCByZWxvYWRfZm9yX2NwdSwgTlVMTCk7CisJCQlyZXQgPSByZWxvYWRfZm9yX2NwdShjcHUpOwogCQlwdXRfb25saW5lX2NwdXMoKTsKIAl9Ci0JaWYgKGVycikKLQkJcmV0dXJuIGVycjsKLQlyZXR1cm4gc3o7CisKKwlpZiAoIXJldCkKKwkJcmV0ID0gc2l6ZTsKKworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBzc2l6ZV90IHZlcnNpb25fc2hvdyhzdHJ1Y3Qgc3lzX2RldmljZSAqZGV2LApAQCAtMjcxLDExICszNDEsMTEgQEAKIH07CiAKIHN0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIG1jX2F0dHJfZ3JvdXAgPSB7Ci0JLmF0dHJzCQk9IG1jX2RlZmF1bHRfYXR0cnMsCi0JLm5hbWUJCT0gIm1pY3JvY29kZSIsCisJLmF0dHJzCQkJPSBtY19kZWZhdWx0X2F0dHJzLAorCS5uYW1lCQkJPSAibWljcm9jb2RlIiwKIH07CiAKLXN0YXRpYyB2b2lkIF9fbWljcm9jb2RlX2ZpbmlfY3B1KGludCBjcHUpCitzdGF0aWMgdm9pZCBtaWNyb2NvZGVfZmluaV9jcHUoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCkBAIC0yODMsMTAzICszNTMsNjggQEAKIAl1Y2ktPnZhbGlkID0gMDsKIH0KIAotc3RhdGljIHZvaWQgbWljcm9jb2RlX2ZpbmlfY3B1KGludCBjcHUpCi17Ci0JbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKLQlfX21pY3JvY29kZV9maW5pX2NwdShjcHUpOwotCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKLX0KLQotc3RhdGljIHZvaWQgY29sbGVjdF9jcHVfaW5mbyhpbnQgY3B1KQorc3RhdGljIGVudW0gdWNvZGVfc3RhdGUgbWljcm9jb2RlX3Jlc3VtZV9jcHUoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCi0JbWVtc2V0KHVjaSwgMCwgc2l6ZW9mKCp1Y2kpKTsKLQlpZiAoIW1pY3JvY29kZV9vcHMtPmNvbGxlY3RfY3B1X2luZm8oY3B1LCAmdWNpLT5jcHVfc2lnKSkKLQkJdWNpLT52YWxpZCA9IDE7Ci19Ci0KLXN0YXRpYyBpbnQgbWljcm9jb2RlX3Jlc3VtZV9jcHUoaW50IGNwdSkKLXsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwotCXN0cnVjdCBjcHVfc2lnbmF0dXJlIG5zaWc7Ci0KLQlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUlZCByZXN1bWVkXG4iLCBjcHUpOwotCiAJaWYgKCF1Y2ktPm1jKQotCQlyZXR1cm4gMTsKKwkJcmV0dXJuIFVDT0RFX05GT1VORDsKIAotCS8qCi0JICogTGV0J3MgdmVyaWZ5IHRoYXQgdGhlICdjYWNoZWQnIHVjb2RlIGRvZXMgYmVsb25nCi0JICogdG8gdGhpcyBjcHUgKGEgYml0IG9mIHBhcmFub2lhKToKLQkgKi8KLQlpZiAobWljcm9jb2RlX29wcy0+Y29sbGVjdF9jcHVfaW5mbyhjcHUsICZuc2lnKSkgewotCQlfX21pY3JvY29kZV9maW5pX2NwdShjcHUpOwotCQlwcmludGsoS0VSTl9FUlIgImZhaWxlZCB0byBjb2xsZWN0X2NwdV9pbmZvIGZvciByZXN1bWluZyBjcHUgIyVkXG4iLAotCQkJCWNwdSk7Ci0JCXJldHVybiAtMTsKLQl9CisJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgdXBkYXRlZCB1cG9uIHJlc3VtZVxuIiwgY3B1KTsKKwlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CiAKLQlpZiAoKG5zaWcuc2lnICE9IHVjaS0+Y3B1X3NpZy5zaWcpIHx8IChuc2lnLnBmICE9IHVjaS0+Y3B1X3NpZy5wZikpIHsKLQkJX19taWNyb2NvZGVfZmluaV9jcHUoY3B1KTsKLQkJcHJpbnRrKEtFUk5fRVJSICJjYWNoZWQgdWNvZGUgZG9lc24ndCBtYXRjaCB0aGUgcmVzdW1pbmcgY3B1ICMlZFxuIiwKLQkJCQljcHUpOwotCQkvKiBTaG91bGQgd2UgbG9vayBmb3IgYSBuZXcgdWNvZGUgaGVyZT8gKi8KLQkJcmV0dXJuIDE7Ci0JfQotCi0JcmV0dXJuIDA7CisJcmV0dXJuIFVDT0RFX09LOwogfQogCi1zdGF0aWMgbG9uZyBtaWNyb2NvZGVfdXBkYXRlX2NwdSh2b2lkICp1bnVzZWQpCitzdGF0aWMgZW51bSB1Y29kZV9zdGF0ZSBtaWNyb2NvZGVfaW5pdF9jcHUoaW50IGNwdSkKIHsKLQlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgc21wX3Byb2Nlc3Nvcl9pZCgpOwotCWludCBlcnIgPSAwOworCWVudW0gdWNvZGVfc3RhdGUgdXN0YXRlOwogCi0JLyoKLQkgKiBDaGVjayBpZiB0aGUgc3lzdGVtIHJlc3VtZSBpcyBpbiBwcm9ncmVzcyAodWNpLT52YWxpZCAhPSBOVUxMKSwKLQkgKiBvdGhlcndpc2UganVzdCByZXF1ZXN0IGEgZmlybXdhcmU6Ci0JICovCi0JaWYgKHVjaS0+dmFsaWQpIHsKLQkJZXJyID0gbWljcm9jb2RlX3Jlc3VtZV9jcHUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQl9IGVsc2UgewotCQljb2xsZWN0X2NwdV9pbmZvKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JCWlmICh1Y2ktPnZhbGlkICYmIHN5c3RlbV9zdGF0ZSA9PSBTWVNURU1fUlVOTklORykKLQkJCWVyciA9IG1pY3JvY29kZV9vcHMtPnJlcXVlc3RfbWljcm9jb2RlX2Z3KAotCQkJCQlzbXBfcHJvY2Vzc29yX2lkKCksCi0JCQkJCSZtaWNyb2NvZGVfcGRldi0+ZGV2KTsKKwlpZiAoY29sbGVjdF9jcHVfaW5mbyhjcHUpKQorCQlyZXR1cm4gVUNPREVfRVJST1I7CisKKwkvKiAtLWRpbW0uIFRyaWdnZXIgYSBkZWxheWVkIHVwZGF0ZT8gKi8KKwlpZiAoc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SVU5OSU5HKQorCQlyZXR1cm4gVUNPREVfTkZPVU5EOworCisJdXN0YXRlID0gbWljcm9jb2RlX29wcy0+cmVxdWVzdF9taWNyb2NvZGVfZncoY3B1LCAmbWljcm9jb2RlX3BkZXYtPmRldik7CisKKwlpZiAodXN0YXRlID09IFVDT0RFX09LKSB7CisJCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZWQgdXBvbiBpbml0XG4iLCBjcHUpOworCQlhcHBseV9taWNyb2NvZGVfb25fdGFyZ2V0KGNwdSk7CiAJfQotCWlmICghZXJyKQotCQltaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoc21wX3Byb2Nlc3Nvcl9pZCgpKTsKLQlyZXR1cm4gZXJyOworCisJcmV0dXJuIHVzdGF0ZTsKIH0KIAotc3RhdGljIGludCBtaWNyb2NvZGVfaW5pdF9jcHUoaW50IGNwdSkKK3N0YXRpYyBlbnVtIHVjb2RlX3N0YXRlIG1pY3JvY29kZV91cGRhdGVfY3B1KGludCBjcHUpCiB7Ci0JaW50IGVycjsKLQltdXRleF9sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwotCWVyciA9IHdvcmtfb25fY3B1KGNwdSwgbWljcm9jb2RlX3VwZGF0ZV9jcHUsIE5VTEwpOwotCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKKwlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OworCWVudW0gdWNvZGVfc3RhdGUgdXN0YXRlOwogCi0JcmV0dXJuIGVycjsKKwlpZiAodWNpLT52YWxpZCkKKwkJdXN0YXRlID0gbWljcm9jb2RlX3Jlc3VtZV9jcHUoY3B1KTsKKwllbHNlCisJCXVzdGF0ZSA9IG1pY3JvY29kZV9pbml0X2NwdShjcHUpOworCisJcmV0dXJuIHVzdGF0ZTsKIH0KIAogc3RhdGljIGludCBtY19zeXNkZXZfYWRkKHN0cnVjdCBzeXNfZGV2aWNlICpzeXNfZGV2KQogewogCWludCBlcnIsIGNwdSA9IHN5c19kZXYtPmlkOwotCXN0cnVjdCB1Y29kZV9jcHVfaW5mbyAqdWNpID0gdWNvZGVfY3B1X2luZm8gKyBjcHU7CiAKIAlpZiAoIWNwdV9vbmxpbmUoY3B1KSkKIAkJcmV0dXJuIDA7CiAKIAlwcl9kZWJ1ZygibWljcm9jb2RlOiBDUFUlZCBhZGRlZFxuIiwgY3B1KTsKLQltZW1zZXQodWNpLCAwLCBzaXplb2YoKnVjaSkpOwogCiAJZXJyID0gc3lzZnNfY3JlYXRlX2dyb3VwKCZzeXNfZGV2LT5rb2JqLCAmbWNfYXR0cl9ncm91cCk7CiAJaWYgKGVycikKIAkJcmV0dXJuIGVycjsKIAotCWVyciA9IG1pY3JvY29kZV9pbml0X2NwdShjcHUpOworCWlmIChtaWNyb2NvZGVfaW5pdF9jcHUoY3B1KSA9PSBVQ09ERV9FUlJPUikKKwkJZXJyID0gLUVJTlZBTDsKIAogCXJldHVybiBlcnI7CiB9CkBAIC00MDAsMTkgKzQzNSwzMCBAQAogc3RhdGljIGludCBtY19zeXNkZXZfcmVzdW1lKHN0cnVjdCBzeXNfZGV2aWNlICpkZXYpCiB7CiAJaW50IGNwdSA9IGRldi0+aWQ7CisJc3RydWN0IHVjb2RlX2NwdV9pbmZvICp1Y2kgPSB1Y29kZV9jcHVfaW5mbyArIGNwdTsKIAogCWlmICghY3B1X29ubGluZShjcHUpKQogCQlyZXR1cm4gMDsKIAotCS8qIG9ubHkgQ1BVIDAgd2lsbCBhcHBseSB1Y29kZSBoZXJlICovCi0JbWljcm9jb2RlX3VwZGF0ZV9jcHUoTlVMTCk7CisJLyoKKwkgKiBBbGwgbm9uLWJvb3R1cCBjcHVzIGFyZSBzdGlsbCBkaXNhYmxlZCwKKwkgKiBzbyBvbmx5IENQVSAwIHdpbGwgYXBwbHkgdWNvZGUgaGVyZS4KKwkgKgorCSAqIE1vcmVvdmVyLCB0aGVyZSBjYW4gYmUgbm8gY29uY3VycmVudAorCSAqIHVwZGF0ZXMgZnJvbSBhbnkgb3RoZXIgcGxhY2VzIGF0IHRoaXMgcG9pbnQuCisJICovCisJV0FSTl9PTihjcHUgIT0gMCk7CisKKwlpZiAodWNpLT52YWxpZCAmJiB1Y2ktPm1jKQorCQltaWNyb2NvZGVfb3BzLT5hcHBseV9taWNyb2NvZGUoY3B1KTsKKwogCXJldHVybiAwOwogfQogCiBzdGF0aWMgc3RydWN0IHN5c2Rldl9kcml2ZXIgbWNfc3lzZGV2X2RyaXZlciA9IHsKLQkuYWRkCQk9IG1jX3N5c2Rldl9hZGQsCi0JLnJlbW92ZQkJPSBtY19zeXNkZXZfcmVtb3ZlLAotCS5yZXN1bWUJCT0gbWNfc3lzZGV2X3Jlc3VtZSwKKwkuYWRkCQkJPSBtY19zeXNkZXZfYWRkLAorCS5yZW1vdmUJCQk9IG1jX3N5c2Rldl9yZW1vdmUsCisJLnJlc3VtZQkJCT0gbWNfc3lzZGV2X3Jlc3VtZSwKIH07CiAKIHN0YXRpYyBfX2NwdWluaXQgaW50CkBAIC00MjUsMTUgKzQ3MSwxMiBAQAogCXN3aXRjaCAoYWN0aW9uKSB7CiAJY2FzZSBDUFVfT05MSU5FOgogCWNhc2UgQ1BVX09OTElORV9GUk9aRU46Ci0JCWlmIChtaWNyb2NvZGVfaW5pdF9jcHUoY3B1KSkKLQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBmYWlsZWQgdG8gaW5pdCBDUFUlZFxuIiwKLQkJCSAgICAgICBjcHUpOworCQltaWNyb2NvZGVfdXBkYXRlX2NwdShjcHUpOwogCWNhc2UgQ1BVX0RPV05fRkFJTEVEOgogCWNhc2UgQ1BVX0RPV05fRkFJTEVEX0ZST1pFTjoKIAkJcHJfZGVidWcoIm1pY3JvY29kZTogQ1BVJWQgYWRkZWRcbiIsIGNwdSk7CiAJCWlmIChzeXNmc19jcmVhdGVfZ3JvdXAoJnN5c19kZXYtPmtvYmosICZtY19hdHRyX2dyb3VwKSkKLQkJCXByaW50ayhLRVJOX0VSUiAibWljcm9jb2RlOiBGYWlsZWQgdG8gY3JlYXRlIHRoZSBzeXNmcyAiCi0JCQkJImdyb3VwIGZvciBDUFUlZFxuIiwgY3B1KTsKKwkJCXByX2VycigibWljcm9jb2RlOiBGYWlsZWQgdG8gY3JlYXRlIGdyb3VwIGZvciBDUFUlZFxuIiwgY3B1KTsKIAkJYnJlYWs7CiAJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgogCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CkBAIC00NjUsMTMgKzUwOCwxMCBAQAogCQltaWNyb2NvZGVfb3BzID0gaW5pdF9hbWRfbWljcm9jb2RlKCk7CiAKIAlpZiAoIW1pY3JvY29kZV9vcHMpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IG5vIHN1cHBvcnQgZm9yIHRoaXMgQ1BVIHZlbmRvclxuIik7CisJCXByX2VycigibWljcm9jb2RlOiBubyBzdXBwb3J0IGZvciB0aGlzIENQVSB2ZW5kb3JcbiIpOwogCQlyZXR1cm4gLUVOT0RFVjsKIAl9CiAKLQllcnJvciA9IG1pY3JvY29kZV9kZXZfaW5pdCgpOwotCWlmIChlcnJvcikKLQkJcmV0dXJuIGVycm9yOwogCW1pY3JvY29kZV9wZGV2ID0gcGxhdGZvcm1fZGV2aWNlX3JlZ2lzdGVyX3NpbXBsZSgibWljcm9jb2RlIiwgLTEsCiAJCQkJCQkJIE5VTEwsIDApOwogCWlmIChJU19FUlIobWljcm9jb2RlX3BkZXYpKSB7CkBAIC00ODAsMjMgKzUyMCwzMSBAQAogCX0KIAogCWdldF9vbmxpbmVfY3B1cygpOworCW11dGV4X2xvY2soJm1pY3JvY29kZV9tdXRleCk7CisKIAllcnJvciA9IHN5c2Rldl9kcml2ZXJfcmVnaXN0ZXIoJmNwdV9zeXNkZXZfY2xhc3MsICZtY19zeXNkZXZfZHJpdmVyKTsKKworCW11dGV4X3VubG9jaygmbWljcm9jb2RlX211dGV4KTsKIAlwdXRfb25saW5lX2NwdXMoKTsKKwogCWlmIChlcnJvcikgewotCQltaWNyb2NvZGVfZGV2X2V4aXQoKTsKIAkJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWljcm9jb2RlX3BkZXYpOwogCQlyZXR1cm4gZXJyb3I7CiAJfQogCisJZXJyb3IgPSBtaWNyb2NvZGVfZGV2X2luaXQoKTsKKwlpZiAoZXJyb3IpCisJCXJldHVybiBlcnJvcjsKKwogCXJlZ2lzdGVyX2hvdGNwdV9ub3RpZmllcigmbWNfY3B1X25vdGlmaWVyKTsKIAotCXByaW50ayhLRVJOX0lORk8KLQkgICAgICAgIk1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTgorCXByX2luZm8oIk1pY3JvY29kZSBVcGRhdGUgRHJpdmVyOiB2IiBNSUNST0NPREVfVkVSU0lPTgogCSAgICAgICAiIDx0aWdyYW5AYWl2YXppYW4uZnNuZXQuY28udWs+LCIKIAkgICAgICAgIiBQZXRlciBPcnViYVxuIik7CiAKIAlyZXR1cm4gMDsKIH0KK21vZHVsZV9pbml0KG1pY3JvY29kZV9pbml0KTsKIAogc3RhdGljIHZvaWQgX19leGl0IG1pY3JvY29kZV9leGl0KHZvaWQpCiB7CkBAIC01MDUsMTYgKzU1MywxNyBAQAogCXVucmVnaXN0ZXJfaG90Y3B1X25vdGlmaWVyKCZtY19jcHVfbm90aWZpZXIpOwogCiAJZ2V0X29ubGluZV9jcHVzKCk7CisJbXV0ZXhfbG9jaygmbWljcm9jb2RlX211dGV4KTsKKwogCXN5c2Rldl9kcml2ZXJfdW5yZWdpc3RlcigmY3B1X3N5c2Rldl9jbGFzcywgJm1jX3N5c2Rldl9kcml2ZXIpOworCisJbXV0ZXhfdW5sb2NrKCZtaWNyb2NvZGVfbXV0ZXgpOwogCXB1dF9vbmxpbmVfY3B1cygpOwogCiAJcGxhdGZvcm1fZGV2aWNlX3VucmVnaXN0ZXIobWljcm9jb2RlX3BkZXYpOwogCiAJbWljcm9jb2RlX29wcyA9IE5VTEw7CiAKLQlwcmludGsoS0VSTl9JTkZPCi0JICAgICAgICJNaWNyb2NvZGUgVXBkYXRlIERyaXZlcjogdiIgTUlDUk9DT0RFX1ZFUlNJT04gIiByZW1vdmVkLlxuIik7CisJcHJfaW5mbygiTWljcm9jb2RlIFVwZGF0ZSBEcml2ZXI6IHYiIE1JQ1JPQ09ERV9WRVJTSU9OICIgcmVtb3ZlZC5cbiIpOwogfQotCi1tb2R1bGVfaW5pdChtaWNyb2NvZGVfaW5pdCk7CiBtb2R1bGVfZXhpdChtaWNyb2NvZGVfZXhpdCk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvbWljcm9jb2RlX2ludGVsLmMKaW5kZXggMTQ5YjllYy4uMGQzMzRkZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL21pY3JvY29kZV9pbnRlbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9taWNyb2NvZGVfaW50ZWwuYwpAQCAtNzAsMjQgKzcwLDExIEBACiAgKgkJRml4IHNpZ21hdGNoKCkgbWFjcm8gdG8gaGFuZGxlIG9sZCBDUFVzIHdpdGggcGYgPT0gMC4KICAqCQlUaGFua3MgdG8gU3R1YXJ0IFN3YWxlcyBmb3IgcG9pbnRpbmcgb3V0IHRoaXMgYnVnLgogICovCi0jaW5jbHVkZSA8bGludXgvcGxhdGZvcm1fZGV2aWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvY2FwYWJpbGl0eS5oPgotI2luY2x1ZGUgPGxpbnV4L21pc2NkZXZpY2UuaD4KICNpbmNsdWRlIDxsaW51eC9maXJtd2FyZS5oPgotI2luY2x1ZGUgPGxpbnV4L3NtcF9sb2NrLmg+Ci0jaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KLSNpbmNsdWRlIDxsaW51eC9jcHVtYXNrLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgotI2luY2x1ZGUgPGxpbnV4L3ZtYWxsb2MuaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgotI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+Ci0jaW5jbHVkZSA8bGludXgvaW5pdC5oPgotI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KLSNpbmNsdWRlIDxsaW51eC9jcHUuaD4KLSNpbmNsdWRlIDxsaW51eC9mcy5oPgotI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgogCiAjaW5jbHVkZSA8YXNtL21pY3JvY29kZS5oPgogI2luY2x1ZGUgPGFzbS9wcm9jZXNzb3IuaD4KQEAgLTE1MCwxMyArMTM3LDkgQEAKIAogI2RlZmluZSBleHR0YWJsZV9zaXplKGV0KSAoKGV0KS0+Y291bnQgKiBFWFRfU0lHTkFUVVJFX1NJWkUgKyBFWFRfSEVBREVSX1NJWkUpCiAKLS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlIHRvIE1TUiAweDc5ICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKG1pY3JvY29kZV91cGRhdGVfbG9jayk7Ci0KIHN0YXRpYyBpbnQgY29sbGVjdF9jcHVfaW5mbyhpbnQgY3B1X251bSwgc3RydWN0IGNwdV9zaWduYXR1cmUgKmNzaWcpCiB7CiAJc3RydWN0IGNwdWluZm9feDg2ICpjID0gJmNwdV9kYXRhKGNwdV9udW0pOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJdW5zaWduZWQgaW50IHZhbFsyXTsKIAogCW1lbXNldChjc2lnLCAwLCBzaXplb2YoKmNzaWcpKTsKQEAgLTE3NiwxOCArMTU5LDE0IEBACiAJCWNzaWctPnBmID0gMSA8PCAoKHZhbFsxXSA+PiAxOCkgJiA3KTsKIAl9CiAKLQkvKiBzZXJpYWxpemUgYWNjZXNzIHRvIHRoZSBwaHlzaWNhbCB3cml0ZSB0byBNU1IgMHg3OSAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZtaWNyb2NvZGVfdXBkYXRlX2xvY2ssIGZsYWdzKTsKLQogCXdybXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgMCwgMCk7CiAJLyogc2VlIG5vdGVzIGFib3ZlIGZvciByZXZpc2lvbiAxLjA3LiAgQXBwYXJlbnQgY2hpcCBidWcgKi8KIAlzeW5jX2NvcmUoKTsKIAkvKiBnZXQgdGhlIGN1cnJlbnQgcmV2aXNpb24gZnJvbSBNU1IgMHg4QiAqLwogCXJkbXNyKE1TUl9JQTMyX1VDT0RFX1JFViwgdmFsWzBdLCBjc2lnLT5yZXYpOwotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOwogCi0JcHJfZGVidWcoIm1pY3JvY29kZTogY29sbGVjdF9jcHVfaW5mbyA6IHNpZz0weCV4LCBwZj0weCV4LCByZXY9MHgleFxuIiwKLQkJCWNzaWctPnNpZywgY3NpZy0+cGYsIGNzaWctPnJldik7CisJcHJpbnRrKEtFUk5fSU5GTyAibWljcm9jb2RlOiBDUFUlZCBzaWc9MHgleCwgcGY9MHgleCwgcmV2aXNpb249MHgleFxuIiwKKwkJCWNwdV9udW0sIGNzaWctPnNpZywgY3NpZy0+cGYsIGNzaWctPnJldik7CiAKIAlyZXR1cm4gMDsKIH0KQEAgLTMxOCwxMSArMjk3LDEwIEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyB2b2lkIGFwcGx5X21pY3JvY29kZShpbnQgY3B1KQorc3RhdGljIGludCBhcHBseV9taWNyb2NvZGUoaW50IGNwdSkKIHsKIAlzdHJ1Y3QgbWljcm9jb2RlX2ludGVsICptY19pbnRlbDsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaTsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwogCXVuc2lnbmVkIGludCB2YWxbMl07CiAJaW50IGNwdV9udW07CiAKQEAgLTMzNCwxMCArMzEyLDcgQEAKIAlCVUdfT04oY3B1X251bSAhPSBjcHUpOwogCiAJaWYgKG1jX2ludGVsID09IE5VTEwpCi0JCXJldHVybjsKLQotCS8qIHNlcmlhbGl6ZSBhY2Nlc3MgdG8gdGhlIHBoeXNpY2FsIHdyaXRlIHRvIE1TUiAweDc5ICovCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOworCQlyZXR1cm4gMDsKIAogCS8qIHdyaXRlIG1pY3JvY29kZSB2aWEgTVNSIDB4NzkgKi8KIAl3cm1zcihNU1JfSUEzMl9VQ09ERV9XUklURSwKQEAgLTM1MSwzMCArMzI2LDMyIEBACiAJLyogZ2V0IHRoZSBjdXJyZW50IHJldmlzaW9uIGZyb20gTVNSIDB4OEIgKi8KIAlyZG1zcihNU1JfSUEzMl9VQ09ERV9SRVYsIHZhbFswXSwgdmFsWzFdKTsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJm1pY3JvY29kZV91cGRhdGVfbG9jaywgZmxhZ3MpOwogCWlmICh2YWxbMV0gIT0gbWNfaW50ZWwtPmhkci5yZXYpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZSBmcm9tIHJldmlzaW9uICIKLQkJCQkiMHgleCB0byAweCV4IGZhaWxlZFxuIiwKLQkJCWNwdV9udW0sIHVjaS0+Y3B1X3NpZy5yZXYsIHZhbFsxXSk7Ci0JCXJldHVybjsKKwkJcHJpbnRrKEtFUk5fRVJSICJtaWNyb2NvZGU6IENQVSVkIHVwZGF0ZSAiCisJCQkJInRvIHJldmlzaW9uIDB4JXggZmFpbGVkXG4iLAorCQkJY3B1X251bSwgbWNfaW50ZWwtPmhkci5yZXYpOworCQlyZXR1cm4gLTE7CiAJfQotCXByaW50ayhLRVJOX0lORk8gIm1pY3JvY29kZTogQ1BVJWQgdXBkYXRlZCBmcm9tIHJldmlzaW9uICIKLQkJCSAiMHgleCB0byAweCV4LCBkYXRlID0gJTA0eC0lMDJ4LSUwMnggXG4iLAotCQljcHVfbnVtLCB1Y2ktPmNwdV9zaWcucmV2LCB2YWxbMV0sCisJcHJpbnRrKEtFUk5fSU5GTyAibWljcm9jb2RlOiBDUFUlZCB1cGRhdGVkIHRvIHJldmlzaW9uICIKKwkJCSAiMHgleCwgZGF0ZSA9ICUwNHgtJTAyeC0lMDJ4IFxuIiwKKwkJY3B1X251bSwgdmFsWzFdLAogCQltY19pbnRlbC0+aGRyLmRhdGUgJiAweGZmZmYsCiAJCW1jX2ludGVsLT5oZHIuZGF0ZSA+PiAyNCwKIAkJKG1jX2ludGVsLT5oZHIuZGF0ZSA+PiAxNikgJiAweGZmKTsKIAogCXVjaS0+Y3B1X3NpZy5yZXYgPSB2YWxbMV07CisKKwlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAotCQlpbnQgKCpnZXRfdWNvZGVfZGF0YSkodm9pZCAqLCBjb25zdCB2b2lkICosIHNpemVfdCkpCitzdGF0aWMgZW51bSB1Y29kZV9zdGF0ZSBnZW5lcmljX2xvYWRfbWljcm9jb2RlKGludCBjcHUsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorCQkJCWludCAoKmdldF91Y29kZV9kYXRhKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KSkKIHsKIAlzdHJ1Y3QgdWNvZGVfY3B1X2luZm8gKnVjaSA9IHVjb2RlX2NwdV9pbmZvICsgY3B1OwogCXU4ICp1Y29kZV9wdHIgPSBkYXRhLCAqbmV3X21jID0gTlVMTCwgKm1jOwogCWludCBuZXdfcmV2ID0gdWNpLT5jcHVfc2lnLnJldjsKIAl1bnNpZ25lZCBpbnQgbGVmdG92ZXIgPSBzaXplOworCWVudW0gdWNvZGVfc3RhdGUgc3RhdGUgPSBVQ09ERV9PSzsKIAogCXdoaWxlIChsZWZ0b3ZlcikgewogCQlzdHJ1Y3QgbWljcm9jb2RlX2hlYWRlcl9pbnRlbCBtY19oZWFkZXI7CkBAIC00MTIsMTEgKzM4OSwxNSBAQAogCQlsZWZ0b3ZlciAgLT0gbWNfc2l6ZTsKIAl9CiAKLQlpZiAoIW5ld19tYykKLQkJZ290byBvdXQ7Ci0KIAlpZiAobGVmdG92ZXIpIHsKLQkJdmZyZWUobmV3X21jKTsKKwkJaWYgKG5ld19tYykKKwkJCXZmcmVlKG5ld19tYyk7CisJCXN0YXRlID0gVUNPREVfRVJST1I7CisJCWdvdG8gb3V0OworCX0KKworCWlmICghbmV3X21jKSB7CisJCXN0YXRlID0gVUNPREVfTkZPVU5EOwogCQlnb3RvIG91dDsKIAl9CiAKQEAgLTQyNyw5ICs0MDgsOCBAQAogCXByX2RlYnVnKCJtaWNyb2NvZGU6IENQVSVkIGZvdW5kIGEgbWF0Y2hpbmcgbWljcm9jb2RlIHVwZGF0ZSB3aXRoIgogCQkgIiB2ZXJzaW9uIDB4JXggKGN1cnJlbnQ9MHgleClcbiIsCiAJCQljcHUsIG5ld19yZXYsIHVjaS0+Y3B1X3NpZy5yZXYpOwotCi0gb3V0OgotCXJldHVybiAoaW50KWxlZnRvdmVyOworb3V0OgorCXJldHVybiBzdGF0ZTsKIH0KIAogc3RhdGljIGludCBnZXRfdWNvZGVfZncodm9pZCAqdG8sIGNvbnN0IHZvaWQgKmZyb20sIHNpemVfdCBuKQpAQCAtNDM4LDIxICs0MTgsMTkgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCByZXF1ZXN0X21pY3JvY29kZV9mdyhpbnQgY3B1LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCitzdGF0aWMgZW51bSB1Y29kZV9zdGF0ZSByZXF1ZXN0X21pY3JvY29kZV9mdyhpbnQgY3B1LCBzdHJ1Y3QgZGV2aWNlICpkZXZpY2UpCiB7CiAJY2hhciBuYW1lWzMwXTsKIAlzdHJ1Y3QgY3B1aW5mb194ODYgKmMgPSAmY3B1X2RhdGEoY3B1KTsKIAljb25zdCBzdHJ1Y3QgZmlybXdhcmUgKmZpcm13YXJlOwotCWludCByZXQ7CisJZW51bSB1Y29kZV9zdGF0ZSByZXQ7CiAKLQkvKiBXZSBzaG91bGQgYmluZCB0aGUgdGFzayB0byB0aGUgQ1BVICovCi0JQlVHX09OKGNwdSAhPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAlzcHJpbnRmKG5hbWUsICJpbnRlbC11Y29kZS8lMDJ4LSUwMngtJTAyeCIsCiAJCWMtPng4NiwgYy0+eDg2X21vZGVsLCBjLT54ODZfbWFzayk7Ci0JcmV0ID0gcmVxdWVzdF9maXJtd2FyZSgmZmlybXdhcmUsIG5hbWUsIGRldmljZSk7Ci0JaWYgKHJldCkgeworCisJaWYgKHJlcXVlc3RfZmlybXdhcmUoJmZpcm13YXJlLCBuYW1lLCBkZXZpY2UpKSB7CiAJCXByX2RlYnVnKCJtaWNyb2NvZGU6IGRhdGEgZmlsZSAlcyBsb2FkIGZhaWxlZFxuIiwgbmFtZSk7Ci0JCXJldHVybiByZXQ7CisJCXJldHVybiBVQ09ERV9ORk9VTkQ7CiAJfQogCiAJcmV0ID0gZ2VuZXJpY19sb2FkX21pY3JvY29kZShjcHUsICh2b2lkICopZmlybXdhcmUtPmRhdGEsCkBAIC00NjgsMTEgKzQ0Niw5IEBACiAJcmV0dXJuIGNvcHlfZnJvbV91c2VyKHRvLCBmcm9tLCBuKTsKIH0KIAotc3RhdGljIGludCByZXF1ZXN0X21pY3JvY29kZV91c2VyKGludCBjcHUsIGNvbnN0IHZvaWQgX191c2VyICpidWYsIHNpemVfdCBzaXplKQorc3RhdGljIGVudW0gdWNvZGVfc3RhdGUKK3JlcXVlc3RfbWljcm9jb2RlX3VzZXIoaW50IGNwdSwgY29uc3Qgdm9pZCBfX3VzZXIgKmJ1Ziwgc2l6ZV90IHNpemUpCiB7Ci0JLyogV2Ugc2hvdWxkIGJpbmQgdGhlIHRhc2sgdG8gdGhlIENQVSAqLwotCUJVR19PTihjcHUgIT0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKSk7Ci0KIAlyZXR1cm4gZ2VuZXJpY19sb2FkX21pY3JvY29kZShjcHUsICh2b2lkICopYnVmLCBzaXplLCAmZ2V0X3Vjb2RlX3VzZXIpOwogfQogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jIGIvYXJjaC94ODYva2VybmVsL21wcGFyc2UuYwppbmRleCA3MGZkN2U0Li42NTFjOTNiIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvbXBwYXJzZS5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9tcHBhcnNlLmMKQEAgLTE3LDYgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9hY3BpLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvcGNpLmg+CiAKICNpbmNsdWRlIDxhc20vbXRyci5oPgogI2luY2x1ZGUgPGFzbS9tcHNwZWMuaD4KQEAgLTg3MCwyNCArODcxLDE3IEBACiBpbmxpbmUgdm9pZCBfX2luaXQgY2hlY2tfaXJxX3NyYyhzdHJ1Y3QgbXBjX2ludHNyYyAqbSwgaW50ICpucl9tX3NwYXJlKSB7fQogI2VuZGlmIC8qIENPTkZJR19YODZfSU9fQVBJQyAqLwogCi1zdGF0aWMgaW50IGNoZWNrX3Nsb3QodW5zaWduZWQgbG9uZyBtcGNfbmV3X3BoeXMsIHVuc2lnbmVkIGxvbmcgbXBjX25ld19sZW5ndGgsCi0JCSAgICAgIGludCBjb3VudCkKK3N0YXRpYyBpbnQKK2NoZWNrX3Nsb3QodW5zaWduZWQgbG9uZyBtcGNfbmV3X3BoeXMsIHVuc2lnbmVkIGxvbmcgbXBjX25ld19sZW5ndGgsIGludCBjb3VudCkKIHsKLQlpZiAoIW1wY19uZXdfcGh5cykgewotCQlwcl9pbmZvKCJObyBzcGFyZSBzbG90cywgdHJ5IHRvIGFwcGVuZC4uLnRha2UgeW91ciByaXNrLCAiCi0JCQkibmV3IG1wY19sZW5ndGggJXhcbiIsIGNvdW50KTsKLQl9IGVsc2UgewotCQlpZiAoY291bnQgPD0gbXBjX25ld19sZW5ndGgpCi0JCQlwcl9pbmZvKCJObyBzcGFyZSBzbG90cywgdHJ5IHRvIGFwcGVuZC4uLiwgIgotCQkJCSJuZXcgbXBjX2xlbmd0aCAleFxuIiwgY291bnQpOwotCQllbHNlIHsKLQkJCXByX2VycigibXBjX25ld19sZW5ndGggJWx4IGlzIHRvbyBzbWFsbFxuIiwKLQkJCQltcGNfbmV3X2xlbmd0aCk7Ci0JCQlyZXR1cm4gLTE7Ci0JCX0KKwlpbnQgcmV0ID0gMDsKKworCWlmICghbXBjX25ld19waHlzIHx8IGNvdW50IDw9IG1wY19uZXdfbGVuZ3RoKSB7CisJCVdBUk4oMSwgInVwZGF0ZV9tcHRhYmxlOiBObyBzcGFyZSBzbG90cyAobGVuZ3RoOiAleClcbiIsIGNvdW50KTsKKwkJcmV0dXJuIC0xOwogCX0KIAotCXJldHVybiAwOworCXJldHVybiByZXQ7CiB9CiAKIHN0YXRpYyBpbnQgIF9faW5pdCByZXBsYWNlX2ludHNyY19hbGwoc3RydWN0IG1wY190YWJsZSAqbXBjLApAQCAtOTQ2LDcgKzk0MCw3IEBACiAJCX0gZWxzZSB7CiAJCQlzdHJ1Y3QgbXBjX2ludHNyYyAqbSA9IChzdHJ1Y3QgbXBjX2ludHNyYyAqKW1wdDsKIAkJCWNvdW50ICs9IHNpemVvZihzdHJ1Y3QgbXBjX2ludHNyYyk7Ci0JCQlpZiAoIWNoZWNrX3Nsb3QobXBjX25ld19waHlzLCBtcGNfbmV3X2xlbmd0aCwgY291bnQpKQorCQkJaWYgKGNoZWNrX3Nsb3QobXBjX25ld19waHlzLCBtcGNfbmV3X2xlbmd0aCwgY291bnQpIDwgMCkKIAkJCQlnb3RvIG91dDsKIAkJCWFzc2lnbl90b19tcGNfaW50c3JjKCZtcF9pcnFzW2ldLCBtKTsKIAkJCW1wYy0+bGVuZ3RoID0gY291bnQ7CkBAIC05NjMsMTEgKzk1NywxNCBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgaW50IF9faW5pdGRhdGEgZW5hYmxlX3VwZGF0ZV9tcHRhYmxlOworaW50IGVuYWJsZV91cGRhdGVfbXB0YWJsZTsKIAogc3RhdGljIGludCBfX2luaXQgdXBkYXRlX21wdGFibGVfc2V0dXAoY2hhciAqc3RyKQogewogCWVuYWJsZV91cGRhdGVfbXB0YWJsZSA9IDE7CisjaWZkZWYgQ09ORklHX1BDSQorCXBjaV9yb3V0ZWlycSA9IDE7CisjZW5kaWYKIAlyZXR1cm4gMDsKIH0KIGVhcmx5X3BhcmFtKCJ1cGRhdGVfbXB0YWJsZSIsIHVwZGF0ZV9tcHRhYmxlX3NldHVwKTsKQEAgLTk4MCw2ICs5NzcsOSBAQAogc3RhdGljIGludCBfX2luaXQgcGFyc2VfYWxsb2NfbXB0YWJsZV9vcHQoY2hhciAqcCkKIHsKIAllbmFibGVfdXBkYXRlX21wdGFibGUgPSAxOworI2lmZGVmIENPTkZJR19QQ0kKKwlwY2lfcm91dGVpcnEgPSAxOworI2VuZGlmCiAJYWxsb2NfbXB0YWJsZSA9IDE7CiAJaWYgKCFwKQogCQlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wYXJhdmlydC5jIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKaW5kZXggOWZhZjQzYi4uNzBlYzliOSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BhcmF2aXJ0LmMKQEAgLTI0OCwxOCArMjQ4LDE2IEBACiAKIHN0YXRpYyBpbmxpbmUgdm9pZCBlbnRlcl9sYXp5KGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpCiB7Ci0JQlVHX09OKF9fZ2V0X2NwdV92YXIocGFyYXZpcnRfbGF6eV9tb2RlKSAhPSBQQVJBVklSVF9MQVpZX05PTkUpOwotCUJVR19PTihwcmVlbXB0aWJsZSgpKTsKKwlCVUdfT04ocGVyY3B1X3JlYWQocGFyYXZpcnRfbGF6eV9tb2RlKSAhPSBQQVJBVklSVF9MQVpZX05PTkUpOwogCi0JX19nZXRfY3B1X3ZhcihwYXJhdmlydF9sYXp5X21vZGUpID0gbW9kZTsKKwlwZXJjcHVfd3JpdGUocGFyYXZpcnRfbGF6eV9tb2RlLCBtb2RlKTsKIH0KIAotdm9pZCBwYXJhdmlydF9sZWF2ZV9sYXp5KGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpCitzdGF0aWMgdm9pZCBsZWF2ZV9sYXp5KGVudW0gcGFyYXZpcnRfbGF6eV9tb2RlIG1vZGUpCiB7Ci0JQlVHX09OKF9fZ2V0X2NwdV92YXIocGFyYXZpcnRfbGF6eV9tb2RlKSAhPSBtb2RlKTsKLQlCVUdfT04ocHJlZW1wdGlibGUoKSk7CisJQlVHX09OKHBlcmNwdV9yZWFkKHBhcmF2aXJ0X2xhenlfbW9kZSkgIT0gbW9kZSk7CiAKLQlfX2dldF9jcHVfdmFyKHBhcmF2aXJ0X2xhenlfbW9kZSkgPSBQQVJBVklSVF9MQVpZX05PTkU7CisJcGVyY3B1X3dyaXRlKHBhcmF2aXJ0X2xhenlfbW9kZSwgUEFSQVZJUlRfTEFaWV9OT05FKTsKIH0KIAogdm9pZCBwYXJhdmlydF9lbnRlcl9sYXp5X21tdSh2b2lkKQpAQCAtMjY5LDIyICsyNjcsMzYgQEAKIAogdm9pZCBwYXJhdmlydF9sZWF2ZV9sYXp5X21tdSh2b2lkKQogewotCXBhcmF2aXJ0X2xlYXZlX2xhenkoUEFSQVZJUlRfTEFaWV9NTVUpOworCWxlYXZlX2xhenkoUEFSQVZJUlRfTEFaWV9NTVUpOwogfQogCi12b2lkIHBhcmF2aXJ0X2VudGVyX2xhenlfY3B1KHZvaWQpCit2b2lkIHBhcmF2aXJ0X3N0YXJ0X2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldikKIHsKKwlCVUdfT04ocHJlZW1wdGlibGUoKSk7CisKKwlpZiAocGVyY3B1X3JlYWQocGFyYXZpcnRfbGF6eV9tb2RlKSA9PSBQQVJBVklSVF9MQVpZX01NVSkgeworCQlhcmNoX2xlYXZlX2xhenlfbW11X21vZGUoKTsKKwkJc2V0X3RpX3RocmVhZF9mbGFnKHRhc2tfdGhyZWFkX2luZm8ocHJldiksIFRJRl9MQVpZX01NVV9VUERBVEVTKTsKKwl9CiAJZW50ZXJfbGF6eShQQVJBVklSVF9MQVpZX0NQVSk7CiB9CiAKLXZvaWQgcGFyYXZpcnRfbGVhdmVfbGF6eV9jcHUodm9pZCkKK3ZvaWQgcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlwYXJhdmlydF9sZWF2ZV9sYXp5KFBBUkFWSVJUX0xBWllfQ1BVKTsKKwlCVUdfT04ocHJlZW1wdGlibGUoKSk7CisKKwlsZWF2ZV9sYXp5KFBBUkFWSVJUX0xBWllfQ1BVKTsKKworCWlmICh0ZXN0X2FuZF9jbGVhcl90aV90aHJlYWRfZmxhZyh0YXNrX3RocmVhZF9pbmZvKG5leHQpLCBUSUZfTEFaWV9NTVVfVVBEQVRFUykpCisJCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOwogfQogCiBlbnVtIHBhcmF2aXJ0X2xhenlfbW9kZSBwYXJhdmlydF9nZXRfbGF6eV9tb2RlKHZvaWQpCiB7Ci0JcmV0dXJuIF9fZ2V0X2NwdV92YXIocGFyYXZpcnRfbGF6eV9tb2RlKTsKKwlpZiAoaW5faW50ZXJydXB0KCkpCisJCXJldHVybiBQQVJBVklSVF9MQVpZX05PTkU7CisKKwlyZXR1cm4gcGVyY3B1X3JlYWQocGFyYXZpcnRfbGF6eV9tb2RlKTsKIH0KIAogdm9pZCBhcmNoX2ZsdXNoX2xhenlfbW11X21vZGUodm9pZCkKQEAgLTI5Miw3ICszMDQsNiBAQAogCXByZWVtcHRfZGlzYWJsZSgpOwogCiAJaWYgKHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSA9PSBQQVJBVklSVF9MQVpZX01NVSkgewotCQlXQVJOX09OKHByZWVtcHRfY291bnQoKSA9PSAxKTsKIAkJYXJjaF9sZWF2ZV9sYXp5X21tdV9tb2RlKCk7CiAJCWFyY2hfZW50ZXJfbGF6eV9tbXVfbW9kZSgpOwogCX0KQEAgLTMwMCwxOSArMzExLDYgQEAKIAlwcmVlbXB0X2VuYWJsZSgpOwogfQogCi12b2lkIGFyY2hfZmx1c2hfbGF6eV9jcHVfbW9kZSh2b2lkKQotewotCXByZWVtcHRfZGlzYWJsZSgpOwotCi0JaWYgKHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSA9PSBQQVJBVklSVF9MQVpZX0NQVSkgewotCQlXQVJOX09OKHByZWVtcHRfY291bnQoKSA9PSAxKTsKLQkJYXJjaF9sZWF2ZV9sYXp5X2NwdV9tb2RlKCk7Ci0JCWFyY2hfZW50ZXJfbGF6eV9jcHVfbW9kZSgpOwotCX0KLQotCXByZWVtcHRfZW5hYmxlKCk7Ci19Ci0KIHN0cnVjdCBwdl9pbmZvIHB2X2luZm8gPSB7CiAJLm5hbWUgPSAiYmFyZSBoYXJkd2FyZSIsCiAJLnBhcmF2aXJ0X2VuYWJsZWQgPSAwLApAQCAtNDA0LDEwICs0MDIsOCBAQAogCS5zZXRfaW9wbF9tYXNrID0gbmF0aXZlX3NldF9pb3BsX21hc2ssCiAJLmlvX2RlbGF5ID0gbmF0aXZlX2lvX2RlbGF5LAogCi0JLmxhenlfbW9kZSA9IHsKLQkJLmVudGVyID0gcGFyYXZpcnRfbm9wLAotCQkubGVhdmUgPSBwYXJhdmlydF9ub3AsCi0JfSwKKwkuc3RhcnRfY29udGV4dF9zd2l0Y2ggPSBwYXJhdmlydF9ub3AsCisJLmVuZF9jb250ZXh0X3N3aXRjaCA9IHBhcmF2aXJ0X25vcCwKIH07CiAKIHN0cnVjdCBwdl9hcGljX29wcyBwdl9hcGljX29wcyA9IHsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wY2ktY2FsZ2FyeV82NC5jIGIvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKaW5kZXggNzU1YzIxZS4uOTcxYTNiZSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3BjaS1jYWxnYXJ5XzY0LmMKQEAgLTE4NiwzNyArMTg2LDYgQEAKIAogc3RhdGljIHN0cnVjdCBjYWxnYXJ5X2J1c19pbmZvIGJ1c19pbmZvW01BWF9QSEJfQlVTX05VTV0gPSB7IHsgTlVMTCwgMCwgMCB9LCB9OwogCi0vKiBlbmFibGUgdGhpcyB0byBzdHJlc3MgdGVzdCB0aGUgY2hpcCdzIFRDRSBjYWNoZSAqLwotI2lmZGVmIENPTkZJR19JT01NVV9ERUJVRwotc3RhdGljIGludCBkZWJ1Z2dpbmcgPSAxOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmVyaWZ5X2JpdF9yYW5nZSh1bnNpZ25lZCBsb25nKiBiaXRtYXAsCi0JaW50IGV4cGVjdGVkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQl1bnNpZ25lZCBsb25nIGlkeCA9IHN0YXJ0OwotCi0JQlVHX09OKHN0YXJ0ID49IGVuZCk7Ci0KLQl3aGlsZSAoaWR4IDwgZW5kKSB7Ci0JCWlmICghIXRlc3RfYml0KGlkeCwgYml0bWFwKSAhPSBleHBlY3RlZCkKLQkJCXJldHVybiBpZHg7Ci0JCSsraWR4OwotCX0KLQotCS8qIGFsbCBiaXRzIGhhdmUgdGhlIGV4cGVjdGVkIHZhbHVlICovCi0JcmV0dXJuIH4wVUw7Ci19Ci0jZWxzZSAvKiBkZWJ1Z2dpbmcgaXMgZGlzYWJsZWQgKi8KLXN0YXRpYyBpbnQgZGVidWdnaW5nOwotCi1zdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgdmVyaWZ5X2JpdF9yYW5nZSh1bnNpZ25lZCBsb25nKiBiaXRtYXAsCi0JaW50IGV4cGVjdGVkLCB1bnNpZ25lZCBsb25nIHN0YXJ0LCB1bnNpZ25lZCBsb25nIGVuZCkKLXsKLQlyZXR1cm4gfjBVTDsKLX0KLQotI2VuZGlmIC8qIENPTkZJR19JT01NVV9ERUJVRyAqLwotCiBzdGF0aWMgaW5saW5lIGludCB0cmFuc2xhdGlvbl9lbmFibGVkKHN0cnVjdCBpb21tdV90YWJsZSAqdGJsKQogewogCS8qIG9ubHkgUEhCcyB3aXRoIHRyYW5zbGF0aW9uIGVuYWJsZWQgaGF2ZSBhbiBJT01NVSB0YWJsZSAqLwpAQCAtMjI4LDcgKzE5Nyw2IEBACiB7CiAJdW5zaWduZWQgbG9uZyBpbmRleDsKIAl1bnNpZ25lZCBsb25nIGVuZDsKLQl1bnNpZ25lZCBsb25nIGJhZGJpdDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJaW5kZXggPSBzdGFydF9hZGRyID4+IFBBR0VfU0hJRlQ7CkBAIC0yNDMsMTQgKzIxMSw2IEBACiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmdGJsLT5pdF9sb2NrLCBmbGFncyk7CiAKLQliYWRiaXQgPSB2ZXJpZnlfYml0X3JhbmdlKHRibC0+aXRfbWFwLCAwLCBpbmRleCwgZW5kKTsKLQlpZiAoYmFkYml0ICE9IH4wVUwpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogZW50cnkgYWxyZWFkeSBhbGxvY2F0ZWQgYXQgIgotCQkJICAgICAgICIweCVseCB0YmwgJXAgZG1hIDB4JWx4IG5wYWdlcyAldVxuIiwKLQkJCSAgICAgICBiYWRiaXQsIHRibCwgc3RhcnRfYWRkciwgbnBhZ2VzKTsKLQl9Ci0KIAlpb21tdV9hcmVhX3Jlc2VydmUodGJsLT5pdF9tYXAsIGluZGV4LCBucGFnZXMpOwogCiAJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmdGJsLT5pdF9sb2NrLCBmbGFncyk7CkBAIC0zMjYsNyArMjg2LDYgQEAKIAl1bnNpZ25lZCBpbnQgbnBhZ2VzKQogewogCXVuc2lnbmVkIGxvbmcgZW50cnk7Ci0JdW5zaWduZWQgbG9uZyBiYWRiaXQ7CiAJdW5zaWduZWQgbG9uZyBiYWRlbmQ7CiAJdW5zaWduZWQgbG9uZyBmbGFnczsKIApAQCAtMzQ2LDE0ICszMDUsNiBAQAogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnRibC0+aXRfbG9jaywgZmxhZ3MpOwogCi0JYmFkYml0ID0gdmVyaWZ5X2JpdF9yYW5nZSh0YmwtPml0X21hcCwgMSwgZW50cnksIGVudHJ5ICsgbnBhZ2VzKTsKLQlpZiAoYmFkYml0ICE9IH4wVUwpIHsKLQkJaWYgKHByaW50a19yYXRlbGltaXQoKSkKLQkJCXByaW50ayhLRVJOX0VSUiAiQ2FsZ2FyeTogYml0IGlzIG9mZiBhdCAweCVseCAiCi0JCQkgICAgICAgInRibCAlcCBkbWEgMHglTHggZW50cnkgMHglbHggbnBhZ2VzICV1XG4iLAotCQkJICAgICAgIGJhZGJpdCwgdGJsLCBkbWFfYWRkciwgZW50cnksIG5wYWdlcyk7Ci0JfQotCiAJaW9tbXVfYXJlYV9mcmVlKHRibC0+aXRfbWFwLCBlbnRyeSwgbnBhZ2VzKTsKIAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnRibC0+aXRfbG9jaywgZmxhZ3MpOwpAQCAtMTQ4OCw5ICsxNDM5LDggQEAKIAkJaW9tbXVfZGV0ZWN0ZWQgPSAxOwogCQljYWxnYXJ5X2RldGVjdGVkID0gMTsKIAkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogQ2FsZ2FyeSBJT01NVSBkZXRlY3RlZC5cbiIpOwotCQlwcmludGsoS0VSTl9JTkZPICJQQ0ktRE1BOiBDYWxnYXJ5IFRDRSB0YWJsZSBzcGVjIGlzICVkLCAiCi0JCSAgICAgICAiQ09ORklHX0lPTU1VX0RFQlVHIGlzICVzLlxuIiwgc3BlY2lmaWVkX3RhYmxlX3NpemUsCi0JCSAgICAgICBkZWJ1Z2dpbmcgPyAiZW5hYmxlZCIgOiAiZGlzYWJsZWQiKTsKKwkJcHJpbnRrKEtFUk5fSU5GTyAiUENJLURNQTogQ2FsZ2FyeSBUQ0UgdGFibGUgc3BlYyBpcyAlZFxuIiwKKwkJICAgICAgIHNwZWNpZmllZF90YWJsZV9zaXplKTsKIAogCQkvKiBzd2lvdGxiIGZvciBkZXZpY2VzIHRoYXQgYXJlbid0IGJlaGluZCB0aGUgQ2FsZ2FyeS4gKi8KIAkJaWYgKG1heF9wZm4gPiBNQVhfRE1BMzJfUEZOKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3BjaS1nYXJ0XzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYwppbmRleCBiMjg0YjU4Li5jZmQ5ZjkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcGNpLWdhcnRfNjQuYwpAQCAtMTQ0LDQ4ICsxNDQsMjEgQEAKIH0KIAogI2lmZGVmIENPTkZJR19JT01NVV9MRUFLCi0KLSNkZWZpbmUgU0VUX0xFQUsoeCkJCQkJCQkJXAotCWRvIHsJCQkJCQkJCVwKLQkJaWYgKGlvbW11X2xlYWtfdGFiKQkJCQkJXAotCQkJaW9tbXVfbGVha190YWJbeF0gPSBfX2J1aWx0aW5fcmV0dXJuX2FkZHJlc3MoMCk7XAotCX0gd2hpbGUgKDApCi0KLSNkZWZpbmUgQ0xFQVJfTEVBSyh4KQkJCQkJCQlcCi0JZG8gewkJCQkJCQkJXAotCQlpZiAoaW9tbXVfbGVha190YWIpCQkJCQlcCi0JCQlpb21tdV9sZWFrX3RhYlt4XSA9IE5VTEw7CQkJXAotCX0gd2hpbGUgKDApCi0KIC8qIERlYnVnZ2luZyBhaWQgZm9yIGRyaXZlcnMgdGhhdCBkb24ndCBmcmVlIHRoZWlyIElPTU1VIHRhYmxlcyAqLwotc3RhdGljIHZvaWQgKippb21tdV9sZWFrX3RhYjsKIHN0YXRpYyBpbnQgbGVha190cmFjZTsKIHN0YXRpYyBpbnQgaW9tbXVfbGVha19wYWdlcyA9IDIwOwogCiBzdGF0aWMgdm9pZCBkdW1wX2xlYWsodm9pZCkKIHsKLQlpbnQgaTsKIAlzdGF0aWMgaW50IGR1bXA7CiAKLQlpZiAoZHVtcCB8fCAhaW9tbXVfbGVha190YWIpCisJaWYgKGR1bXApCiAJCXJldHVybjsKIAlkdW1wID0gMTsKLQlzaG93X3N0YWNrKE5VTEwsIE5VTEwpOwogCi0JLyogVmVyeSBjcnVkZS4gZHVtcCBzb21lIGZyb20gdGhlIGVuZCBvZiB0aGUgdGFibGUgdG9vICovCi0JcHJpbnRrKEtFUk5fREVCVUcgIkR1bXBpbmcgJWQgcGFnZXMgZnJvbSBlbmQgb2YgSU9NTVU6XG4iLAotCSAgICAgICBpb21tdV9sZWFrX3BhZ2VzKTsKLQlmb3IgKGkgPSAwOyBpIDwgaW9tbXVfbGVha19wYWdlczsgaSArPSAyKSB7Ci0JCXByaW50ayhLRVJOX0RFQlVHICIlbHU6ICIsIGlvbW11X3BhZ2VzLWkpOwotCQlwcmludGtfYWRkcmVzcygodW5zaWduZWQgbG9uZykgaW9tbXVfbGVha190YWJbaW9tbXVfcGFnZXMtaV0sCi0JCQkJMCk7Ci0JCXByaW50ayhLRVJOX0NPTlQgIiVjIiwgKGkrMSklMiA9PSAwID8gJ1xuJyA6ICcgJyk7Ci0JfQotCXByaW50ayhLRVJOX0RFQlVHICJcbiIpOworCXNob3dfc3RhY2soTlVMTCwgTlVMTCk7CisJZGVidWdfZG1hX2R1bXBfbWFwcGluZ3MoTlVMTCk7CiB9Ci0jZWxzZQotIyBkZWZpbmUgU0VUX0xFQUsoeCkKLSMgZGVmaW5lIENMRUFSX0xFQUsoeCkKICNlbmRpZgogCiBzdGF0aWMgdm9pZCBpb21tdV9mdWxsKHN0cnVjdCBkZXZpY2UgKmRldiwgc2l6ZV90IHNpemUsIGludCBkaXIpCkBAIC0yNDgsNyArMjIxLDYgQEAKIAogCWZvciAoaSA9IDA7IGkgPCBucGFnZXM7IGkrKykgewogCQlpb21tdV9nYXR0X2Jhc2VbaW9tbXVfcGFnZSArIGldID0gR1BURV9FTkNPREUocGh5c19tZW0pOwotCQlTRVRfTEVBSyhpb21tdV9wYWdlICsgaSk7CiAJCXBoeXNfbWVtICs9IFBBR0VfU0laRTsKIAl9CiAJcmV0dXJuIGlvbW11X2J1c19iYXNlICsgaW9tbXVfcGFnZSpQQUdFX1NJWkUgKyAocGh5c19tZW0gJiB+UEFHRV9NQVNLKTsKQEAgLTI5NCw3ICsyNjYsNiBAQAogCW5wYWdlcyA9IGlvbW11X251bV9wYWdlcyhkbWFfYWRkciwgc2l6ZSwgUEFHRV9TSVpFKTsKIAlmb3IgKGkgPSAwOyBpIDwgbnBhZ2VzOyBpKyspIHsKIAkJaW9tbXVfZ2F0dF9iYXNlW2lvbW11X3BhZ2UgKyBpXSA9IGdhcnRfdW5tYXBwZWRfZW50cnk7Ci0JCUNMRUFSX0xFQUsoaW9tbXVfcGFnZSArIGkpOwogCX0KIAlmcmVlX2lvbW11KGlvbW11X3BhZ2UsIG5wYWdlcyk7CiB9CkBAIC0zNzcsNyArMzQ4LDYgQEAKIAkJcGFnZXMgPSBpb21tdV9udW1fcGFnZXMocy0+b2Zmc2V0LCBzLT5sZW5ndGgsIFBBR0VfU0laRSk7CiAJCXdoaWxlIChwYWdlcy0tKSB7CiAJCQlpb21tdV9nYXR0X2Jhc2VbaW9tbXVfcGFnZV0gPSBHUFRFX0VOQ09ERShhZGRyKTsKLQkJCVNFVF9MRUFLKGlvbW11X3BhZ2UpOwogCQkJYWRkciArPSBQQUdFX1NJWkU7CiAJCQlpb21tdV9wYWdlKys7CiAJCX0KQEAgLTY4OCw4ICs2NTgsNiBAQAogCiAJYWdwX2dhdHRfdGFibGUgPSBnYXR0OwogCi0JZW5hYmxlX2dhcnRfdHJhbnNsYXRpb25zKCk7Ci0KIAllcnJvciA9IHN5c2Rldl9jbGFzc19yZWdpc3RlcigmZ2FydF9zeXNkZXZfY2xhc3MpOwogCWlmICghZXJyb3IpCiAJCWVycm9yID0gc3lzZGV2X3JlZ2lzdGVyKCZkZXZpY2VfZ2FydCk7CkBAIC04MDEsMTEgKzc2OSwxMiBAQAogCiAjaWZkZWYgQ09ORklHX0lPTU1VX0xFQUsKIAlpZiAobGVha190cmFjZSkgewotCQlpb21tdV9sZWFrX3RhYiA9ICh2b2lkICopX19nZXRfZnJlZV9wYWdlcyhHRlBfS0VSTkVMfF9fR0ZQX1pFUk8sCi0JCQkJICBnZXRfb3JkZXIoaW9tbXVfcGFnZXMqc2l6ZW9mKHZvaWQgKikpKTsKLQkJaWYgKCFpb21tdV9sZWFrX3RhYikKKwkJaW50IHJldDsKKworCQlyZXQgPSBkbWFfZGVidWdfcmVzaXplX2VudHJpZXMoaW9tbXVfcGFnZXMpOworCQlpZiAocmV0KQogCQkJcHJpbnRrKEtFUk5fREVCVUcKLQkJCSAgICAgICAiUENJLURNQTogQ2Fubm90IGFsbG9jYXRlIGxlYWsgdHJhY2UgYXJlYVxuIik7CisJCQkgICAgICAgIlBDSS1ETUE6IENhbm5vdCB0cmFjZSBhbGwgdGhlIGVudHJpZXNcbiIpOwogCX0KICNlbmRpZgogCkBAIC04NDUsNiArODE0LDE0IEBACiAJICogdGhlIHBhZ2VzIGFzIE5vdC1QcmVzZW50OgogCSAqLwogCXdiaW52ZCgpOworCQorCS8qCisJICogTm93IGFsbCBjYWNoZXMgYXJlIGZsdXNoZWQgYW5kIHdlIGNhbiBzYWZlbHkgZW5hYmxlCisJICogR0FSVCBoYXJkd2FyZS4gIERvaW5nIGl0IGVhcmx5IGxlYXZlcyB0aGUgcG9zc2liaWxpdHkKKwkgKiBvZiBzdGFsZSBjYWNoZSBlbnRyaWVzIHRoYXQgY2FuIGxlYWQgdG8gR0FSVCBQVEUKKwkgKiBlcnJvcnMuCisJICovCisJZW5hYmxlX2dhcnRfdHJhbnNsYXRpb25zKCk7CiAKIAkvKgogCSAqIFRyeSB0byB3b3JrYXJvdW5kIGEgYnVnICh0aGFua3MgdG8gQmVuSCk6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcGNpLXN3aW90bGIuYyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYi5jCmluZGV4IDIyMWEzODUuLmExNzEyZjIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYi5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wY2ktc3dpb3RsYi5jCkBAIC0yOCw3ICsyOCw3IEBACiAJcmV0dXJuIHBhZGRyOwogfQogCi1waHlzX2FkZHJfdCBzd2lvdGxiX2J1c190b19waHlzKGRtYV9hZGRyX3QgYmFkZHIpCitwaHlzX2FkZHJfdCBzd2lvdGxiX2J1c190b19waHlzKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGJhZGRyKQogewogCXJldHVybiBiYWRkcjsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzcy5jCmluZGV4IGNhOTg5MTUuLjNiYjJiZTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3MuYwpAQCAtOCwxMiArOCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3BtLmg+CiAjaW5jbHVkZSA8bGludXgvY2xvY2tjaGlwcy5oPgorI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPHRyYWNlL3Bvd2VyLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS9hcGljLmg+CisjaW5jbHVkZSA8YXNtL3N5c2NhbGxzLmg+CiAjaW5jbHVkZSA8YXNtL2lkbGUuaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9pMzg3Lmg+CisjaW5jbHVkZSA8YXNtL2RzLmg+CiAKIHVuc2lnbmVkIGxvbmcgaWRsZV9oYWx0OwogRVhQT1JUX1NZTUJPTChpZGxlX2hhbHQpOwpAQCAtNDUsNiArNDgsOCBAQAogCQlrbWVtX2NhY2hlX2ZyZWUodGFza194c3RhdGVfY2FjaGVwLCB0c2stPnRocmVhZC54c3RhdGUpOwogCQl0c2stPnRocmVhZC54c3RhdGUgPSBOVUxMOwogCX0KKworCVdBUk4odHNrLT50aHJlYWQuZHNfY3R4LCAibGVha2luZyBEUyBjb250ZXh0XG4iKTsKIH0KIAogdm9pZCBmcmVlX3RocmVhZF9pbmZvKHN0cnVjdCB0aHJlYWRfaW5mbyAqdGkpCkBAIC04Myw4ICs4OCw2IEBACiAJCXB1dF9jcHUoKTsKIAkJa2ZyZWUoYnApOwogCX0KLQotCWRzX2V4aXRfdGhyZWFkKGN1cnJlbnQpOwogfQogCiB2b2lkIGZsdXNoX3RocmVhZCh2b2lkKQpAQCAtNjEzLDMgKzYxNiwxNiBAQAogfQogZWFybHlfcGFyYW0oImlkbGUiLCBpZGxlX3NldHVwKTsKIAordW5zaWduZWQgbG9uZyBhcmNoX2FsaWduX3N0YWNrKHVuc2lnbmVkIGxvbmcgc3ApCit7CisJaWYgKCEoY3VycmVudC0+cGVyc29uYWxpdHkgJiBBRERSX05PX1JBTkRPTUlaRSkgJiYgcmFuZG9taXplX3ZhX3NwYWNlKQorCQlzcCAtPSBnZXRfcmFuZG9tX2ludCgpICUgODE5MjsKKwlyZXR1cm4gc3AgJiB+MHhmOworfQorCit1bnNpZ25lZCBsb25nIGFyY2hfcmFuZG9taXplX2JyayhzdHJ1Y3QgbW1fc3RydWN0ICptbSkKK3sKKwl1bnNpZ25lZCBsb25nIHJhbmdlX2VuZCA9IG1tLT5icmsgKyAweDAyMDAwMDAwOworCXJldHVybiByYW5kb21pemVfcmFuZ2UobW0tPmJyaywgcmFuZ2VfZW5kLCAwKSA/IDogbW0tPmJyazsKK30KKwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzMyLmMKaW5kZXggNzZmOGY4NC4uNTlmNDUyNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc18zMi5jCkBAIC05LDggKzksNiBAQAogICogVGhpcyBmaWxlIGhhbmRsZXMgdGhlIGFyY2hpdGVjdHVyZS1kZXBlbmRlbnQgcGFydHMgb2YgcHJvY2VzcyBoYW5kbGluZy4uCiAgKi8KIAotI2luY2x1ZGUgPHN0ZGFyZy5oPgotCiAjaW5jbHVkZSA8bGludXgvc3RhY2twcm90ZWN0b3IuaD4KICNpbmNsdWRlIDxsaW51eC9jcHUuaD4KICNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgpAQCAtMzMsNyArMzEsNiBAQAogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyc29uYWxpdHkuaD4KICNpbmNsdWRlIDxsaW51eC90aWNrLmg+CiAjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CkBAIC0yOTAsNyArMjg3LDggQEAKIAkJcC0+dGhyZWFkLmlvX2JpdG1hcF9tYXggPSAwOwogCX0KIAotCWRzX2NvcHlfdGhyZWFkKHAsIGN1cnJlbnQpOworCWNsZWFyX3Rza190aHJlYWRfZmxhZyhwLCBUSUZfRFNfQVJFQV9NU1IpOworCXAtPnRocmVhZC5kc19jdHggPSBOVUxMOwogCiAJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9ERUJVR0NUTE1TUik7CiAJcC0+dGhyZWFkLmRlYnVnY3RsbXNyID0gMDsKQEAgLTQwNyw3ICs0MDUsNyBAQAogCSAqIGRvbmUgYmVmb3JlIG1hdGhfc3RhdGVfcmVzdG9yZSwgc28gdGhlIFRTIGJpdCBpcyB1cAogCSAqIHRvIGRhdGUuCiAJICovCi0JYXJjaF9sZWF2ZV9sYXp5X2NwdV9tb2RlKCk7CisJYXJjaF9lbmRfY29udGV4dF9zd2l0Y2gobmV4dF9wKTsKIAogCS8qIElmIHRoZSB0YXNrIGhhcyB1c2VkIGZwdSB0aGUgbGFzdCA1IHRpbWVzbGljZXMsIGp1c3QgZG8gYSBmdWxsCiAJICogcmVzdG9yZSBvZiB0aGUgbWF0aCBzdGF0ZSBpbW1lZGlhdGVseSB0byBhdm9pZCB0aGUgdHJhcDsgdGhlCkBAIC00OTcsMTUgKzQ5NSwzIEBACiAJcmV0dXJuIDA7CiB9CiAKLXVuc2lnbmVkIGxvbmcgYXJjaF9hbGlnbl9zdGFjayh1bnNpZ25lZCBsb25nIHNwKQotewotCWlmICghKGN1cnJlbnQtPnBlcnNvbmFsaXR5ICYgQUREUl9OT19SQU5ET01JWkUpICYmIHJhbmRvbWl6ZV92YV9zcGFjZSkKLQkJc3AgLT0gZ2V0X3JhbmRvbV9pbnQoKSAlIDgxOTI7Ci0JcmV0dXJuIHNwICYgfjB4ZjsKLX0KLQotdW5zaWduZWQgbG9uZyBhcmNoX3JhbmRvbWl6ZV9icmsoc3RydWN0IG1tX3N0cnVjdCAqbW0pCi17Ci0JdW5zaWduZWQgbG9uZyByYW5nZV9lbmQgPSBtbS0+YnJrICsgMHgwMjAwMDAwMDsKLQlyZXR1cm4gcmFuZG9taXplX3JhbmdlKG1tLT5icmssIHJhbmdlX2VuZCwgMCkgPyA6IG1tLT5icms7Ci19CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jIGIvYXJjaC94ODYva2VybmVsL3Byb2Nlc3NfNjQuYwppbmRleCBiNzUxYTQxLi5lYmVmYjU0IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcHJvY2Vzc182NC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9wcm9jZXNzXzY0LmMKQEAgLTE0LDggKzE0LDYgQEAKICAqIFRoaXMgZmlsZSBoYW5kbGVzIHRoZSBhcmNoaXRlY3R1cmUtZGVwZW5kZW50IHBhcnRzIG9mIHByb2Nlc3MgaGFuZGxpbmcuLgogICovCiAKLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQogI2luY2x1ZGUgPGxpbnV4L3N0YWNrcHJvdGVjdG9yLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KQEAgLTMyLDcgKzMwLDYgQEAKICNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgotI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgogI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgpAQCAtMzM1LDcgKzMzMiw4IEBACiAJCQlnb3RvIG91dDsKIAl9CiAKLQlkc19jb3B5X3RocmVhZChwLCBtZSk7CisJY2xlYXJfdHNrX3RocmVhZF9mbGFnKHAsIFRJRl9EU19BUkVBX01TUik7CisJcC0+dGhyZWFkLmRzX2N0eCA9IE5VTEw7CiAKIAljbGVhcl90c2tfdGhyZWFkX2ZsYWcocCwgVElGX0RFQlVHQ1RMTVNSKTsKIAlwLT50aHJlYWQuZGVidWdjdGxtc3IgPSAwOwpAQCAtNDI4LDcgKzQyNiw3IEBACiAJICogZG9uZSBiZWZvcmUgbWF0aF9zdGF0ZV9yZXN0b3JlLCBzbyB0aGUgVFMgYml0IGlzIHVwCiAJICogdG8gZGF0ZS4KIAkgKi8KLQlhcmNoX2xlYXZlX2xhenlfY3B1X21vZGUoKTsKKwlhcmNoX2VuZF9jb250ZXh0X3N3aXRjaChuZXh0X3ApOwogCiAJLyoKIAkgKiBTd2l0Y2ggRlMgYW5kIEdTLgpAQCAtNjYwLDE1ICs2NTgsMyBAQAogCXJldHVybiBkb19hcmNoX3ByY3RsKGN1cnJlbnQsIGNvZGUsIGFkZHIpOwogfQogCi11bnNpZ25lZCBsb25nIGFyY2hfYWxpZ25fc3RhY2sodW5zaWduZWQgbG9uZyBzcCkKLXsKLQlpZiAoIShjdXJyZW50LT5wZXJzb25hbGl0eSAmIEFERFJfTk9fUkFORE9NSVpFKSAmJiByYW5kb21pemVfdmFfc3BhY2UpCi0JCXNwIC09IGdldF9yYW5kb21faW50KCkgJSA4MTkyOwotCXJldHVybiBzcCAmIH4weGY7Ci19Ci0KLXVuc2lnbmVkIGxvbmcgYXJjaF9yYW5kb21pemVfYnJrKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKQotewotCXVuc2lnbmVkIGxvbmcgcmFuZ2VfZW5kID0gbW0tPmJyayArIDB4MDIwMDAwMDA7Ci0JcmV0dXJuIHJhbmRvbWl6ZV9yYW5nZShtbS0+YnJrLCByYW5nZV9lbmQsIDApID8gOiBtbS0+YnJrOwotfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jIGIvYXJjaC94ODYva2VybmVsL3B0cmFjZS5jCmluZGV4IDIzYjdjOGYuLjA5ZWNiZGUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9wdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcHRyYWNlLmMKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxsaW51eC9hdWRpdC5oPgogI2luY2x1ZGUgPGxpbnV4L3NlY2NvbXAuaD4KICNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KQEAgLTU3OCwxNyArNTc5LDEzMCBAQAogfQogCiAjaWZkZWYgQ09ORklHX1g4Nl9QVFJBQ0VfQlRTCisvKgorICogQSBicmFuY2ggdHJhY2Ugc3RvcmUgY29udGV4dC4KKyAqCisgKiBDb250ZXh0cyBtYXkgb25seSBiZSBpbnN0YWxsZWQgYnkgcHRyYWNlX2J0c19jb25maWcoKSBhbmQgb25seSBmb3IKKyAqIHB0cmFjZWQgdGFza3MuCisgKgorICogQ29udGV4dHMgYXJlIGRlc3Ryb3llZCB3aGVuIHRoZSB0cmFjZWUgaXMgZGV0YWNoZWQgZnJvbSB0aGUgdHJhY2VyLgorICogVGhlIGFjdHVhbCBkZXN0cnVjdGlvbiB3b3JrIHJlcXVpcmVzIGludGVycnVwdHMgZW5hYmxlZCwgc28gdGhlCisgKiB3b3JrIGlzIGRlZmVycmVkIGFuZCB3aWxsIGJlIHNjaGVkdWxlZCBkdXJpbmcgX19wdHJhY2VfdW5saW5rKCkuCisgKgorICogQ29udGV4dHMgaG9sZCBhbiBhZGRpdGlvbmFsIHRhc2tfc3RydWN0IHJlZmVyZW5jZSBvbiB0aGUgdHJhY2VkCisgKiB0YXNrLCBhcyB3ZWxsIGFzIGEgcmVmZXJlbmNlIG9uIHRoZSB0cmFjZXIncyBtbS4KKyAqCisgKiBQdHJhY2UgYWxyZWFkeSBob2xkcyBhIHRhc2tfc3RydWN0IGZvciB0aGUgZHVyYXRpb24gb2YgcHRyYWNlIG9wZXJhdGlvbnMsCisgKiBidXQgc2luY2UgZGVzdHJ1Y3Rpb24gaXMgZGVmZXJyZWQsIGl0IG1heSBiZSBleGVjdXRlZCBhZnRlciBib3RoCisgKiB0cmFjZXIgYW5kIHRyYWNlZSBleGl0ZWQuCisgKi8KK3N0cnVjdCBidHNfY29udGV4dCB7CisJLyogVGhlIGJyYW5jaCB0cmFjZSBoYW5kbGUuICovCisJc3RydWN0IGJ0c190cmFjZXIJKnRyYWNlcjsKKworCS8qIFRoZSBidWZmZXIgdXNlZCB0byBzdG9yZSB0aGUgYnJhbmNoIHRyYWNlIGFuZCBpdHMgc2l6ZS4gKi8KKwl2b2lkCQkJKmJ1ZmZlcjsKKwl1bnNpZ25lZCBpbnQJCXNpemU7CisKKwkvKiBUaGUgbW0gdGhhdCBwYWlkIGZvciB0aGUgYWJvdmUgYnVmZmVyLiAqLworCXN0cnVjdCBtbV9zdHJ1Y3QJKm1tOworCisJLyogVGhlIHRhc2sgdGhpcyBjb250ZXh0IGJlbG9uZ3MgdG8uICovCisJc3RydWN0IHRhc2tfc3RydWN0CSp0YXNrOworCisJLyogVGhlIHNpZ25hbCB0byBzZW5kIG9uIGEgYnRzIGJ1ZmZlciBvdmVyZmxvdy4gKi8KKwl1bnNpZ25lZCBpbnQJCWJ0c19vdmZsX3NpZ25hbDsKKworCS8qIFRoZSB3b3JrIHN0cnVjdCB0byBkZXN0cm95IGEgY29udGV4dC4gKi8KKwlzdHJ1Y3Qgd29ya19zdHJ1Y3QJd29yazsKK307CisKK3N0YXRpYyBpbnQgYWxsb2NfYnRzX2J1ZmZlcihzdHJ1Y3QgYnRzX2NvbnRleHQgKmNvbnRleHQsIHVuc2lnbmVkIGludCBzaXplKQoreworCXZvaWQgKmJ1ZmZlciA9IE5VTEw7CisJaW50IGVyciA9IC1FTk9NRU07CisKKwllcnIgPSBhY2NvdW50X2xvY2tlZF9tZW1vcnkoY3VycmVudC0+bW0sIGN1cnJlbnQtPnNpZ25hbC0+cmxpbSwgc2l6ZSk7CisJaWYgKGVyciA8IDApCisJCXJldHVybiBlcnI7CisKKwlidWZmZXIgPSBremFsbG9jKHNpemUsIEdGUF9LRVJORUwpOworCWlmICghYnVmZmVyKQorCQlnb3RvIG91dF9yZWZ1bmQ7CisKKwljb250ZXh0LT5idWZmZXIgPSBidWZmZXI7CisJY29udGV4dC0+c2l6ZSA9IHNpemU7CisJY29udGV4dC0+bW0gPSBnZXRfdGFza19tbShjdXJyZW50KTsKKworCXJldHVybiAwOworCisgb3V0X3JlZnVuZDoKKwlyZWZ1bmRfbG9ja2VkX21lbW9yeShjdXJyZW50LT5tbSwgc2l6ZSk7CisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGZyZWVfYnRzX2J1ZmZlcihzdHJ1Y3QgYnRzX2NvbnRleHQgKmNvbnRleHQpCit7CisJaWYgKCFjb250ZXh0LT5idWZmZXIpCisJCXJldHVybjsKKworCWtmcmVlKGNvbnRleHQtPmJ1ZmZlcik7CisJY29udGV4dC0+YnVmZmVyID0gTlVMTDsKKworCXJlZnVuZF9sb2NrZWRfbWVtb3J5KGNvbnRleHQtPm1tLCBjb250ZXh0LT5zaXplKTsKKwljb250ZXh0LT5zaXplID0gMDsKKworCW1tcHV0KGNvbnRleHQtPm1tKTsKKwljb250ZXh0LT5tbSA9IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIGZyZWVfYnRzX2NvbnRleHRfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKncpCit7CisJc3RydWN0IGJ0c19jb250ZXh0ICpjb250ZXh0OworCisJY29udGV4dCA9IGNvbnRhaW5lcl9vZih3LCBzdHJ1Y3QgYnRzX2NvbnRleHQsIHdvcmspOworCisJZHNfcmVsZWFzZV9idHMoY29udGV4dC0+dHJhY2VyKTsKKwlwdXRfdGFza19zdHJ1Y3QoY29udGV4dC0+dGFzayk7CisJZnJlZV9idHNfYnVmZmVyKGNvbnRleHQpOworCWtmcmVlKGNvbnRleHQpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZnJlZV9idHNfY29udGV4dChzdHJ1Y3QgYnRzX2NvbnRleHQgKmNvbnRleHQpCit7CisJSU5JVF9XT1JLKCZjb250ZXh0LT53b3JrLCBmcmVlX2J0c19jb250ZXh0X3dvcmspOworCXNjaGVkdWxlX3dvcmsoJmNvbnRleHQtPndvcmspOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBidHNfY29udGV4dCAqYWxsb2NfYnRzX2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCBidHNfY29udGV4dCAqY29udGV4dCA9IGt6YWxsb2Moc2l6ZW9mKCpjb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKGNvbnRleHQpIHsKKwkJY29udGV4dC0+dGFzayA9IHRhc2s7CisJCXRhc2stPmJ0cyA9IGNvbnRleHQ7CisKKwkJZ2V0X3Rhc2tfc3RydWN0KHRhc2spOworCX0KKworCXJldHVybiBjb250ZXh0OworfQorCiBzdGF0aWMgaW50IHB0cmFjZV9idHNfcmVhZF9yZWNvcmQoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgc2l6ZV90IGluZGV4LAogCQkJCSAgc3RydWN0IGJ0c19zdHJ1Y3QgX191c2VyICpvdXQpCiB7CisJc3RydWN0IGJ0c19jb250ZXh0ICpjb250ZXh0OwogCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlOwogCXN0cnVjdCBidHNfc3RydWN0IGJ0czsKIAljb25zdCB1bnNpZ25lZCBjaGFyICphdDsKIAlpbnQgZXJyb3I7CiAKLQl0cmFjZSA9IGRzX3JlYWRfYnRzKGNoaWxkLT5idHMpOworCWNvbnRleHQgPSBjaGlsZC0+YnRzOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuIC1FU1JDSDsKKworCXRyYWNlID0gZHNfcmVhZF9idHMoY29udGV4dC0+dHJhY2VyKTsKIAlpZiAoIXRyYWNlKQotCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gLUVTUkNIOwogCiAJYXQgPSB0cmFjZS0+ZHMudG9wIC0gKChpbmRleCArIDEpICogdHJhY2UtPmRzLnNpemUpOwogCWlmICgodm9pZCAqKWF0IDwgdHJhY2UtPmRzLmJlZ2luKQpAQCAtNTk3LDcgKzcxMSw3IEBACiAJaWYgKCF0cmFjZS0+cmVhZCkKIAkJcmV0dXJuIC1FT1BOT1RTVVBQOwogCi0JZXJyb3IgPSB0cmFjZS0+cmVhZChjaGlsZC0+YnRzLCBhdCwgJmJ0cyk7CisJZXJyb3IgPSB0cmFjZS0+cmVhZChjb250ZXh0LT50cmFjZXIsIGF0LCAmYnRzKTsKIAlpZiAoZXJyb3IgPCAwKQogCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTYxMSwxMyArNzI1LDE4IEBACiAJCQkgICAgbG9uZyBzaXplLAogCQkJICAgIHN0cnVjdCBidHNfc3RydWN0IF9fdXNlciAqb3V0KQogeworCXN0cnVjdCBidHNfY29udGV4dCAqY29udGV4dDsKIAljb25zdCBzdHJ1Y3QgYnRzX3RyYWNlICp0cmFjZTsKIAljb25zdCB1bnNpZ25lZCBjaGFyICphdDsKIAlpbnQgZXJyb3IsIGRyYWluZWQgPSAwOwogCi0JdHJhY2UgPSBkc19yZWFkX2J0cyhjaGlsZC0+YnRzKTsKKwljb250ZXh0ID0gY2hpbGQtPmJ0czsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAtRVNSQ0g7CisKKwl0cmFjZSA9IGRzX3JlYWRfYnRzKGNvbnRleHQtPnRyYWNlcik7CiAJaWYgKCF0cmFjZSkKLQkJcmV0dXJuIC1FUEVSTTsKKwkJcmV0dXJuIC1FU1JDSDsKIAogCWlmICghdHJhY2UtPnJlYWQpCiAJCXJldHVybiAtRU9QTk9UU1VQUDsKQEAgLTYyOCw5ICs3NDcsOCBAQAogCWZvciAoYXQgPSB0cmFjZS0+ZHMuYmVnaW47ICh2b2lkICopYXQgPCB0cmFjZS0+ZHMudG9wOwogCSAgICAgb3V0KyssIGRyYWluZWQrKywgYXQgKz0gdHJhY2UtPmRzLnNpemUpIHsKIAkJc3RydWN0IGJ0c19zdHJ1Y3QgYnRzOwotCQlpbnQgZXJyb3I7CiAKLQkJZXJyb3IgPSB0cmFjZS0+cmVhZChjaGlsZC0+YnRzLCBhdCwgJmJ0cyk7CisJCWVycm9yID0gdHJhY2UtPnJlYWQoY29udGV4dC0+dHJhY2VyLCBhdCwgJmJ0cyk7CiAJCWlmIChlcnJvciA8IDApCiAJCQlyZXR1cm4gZXJyb3I7CiAKQEAgLTY0MCwzNSArNzU4LDE4IEBACiAKIAltZW1zZXQodHJhY2UtPmRzLmJlZ2luLCAwLCB0cmFjZS0+ZHMubiAqIHRyYWNlLT5kcy5zaXplKTsKIAotCWVycm9yID0gZHNfcmVzZXRfYnRzKGNoaWxkLT5idHMpOworCWVycm9yID0gZHNfcmVzZXRfYnRzKGNvbnRleHQtPnRyYWNlcik7CiAJaWYgKGVycm9yIDwgMCkKIAkJcmV0dXJuIGVycm9yOwogCiAJcmV0dXJuIGRyYWluZWQ7CiB9CiAKLXN0YXRpYyBpbnQgcHRyYWNlX2J0c19hbGxvY2F0ZV9idWZmZXIoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCwgc2l6ZV90IHNpemUpCi17Ci0JY2hpbGQtPmJ0c19idWZmZXIgPSBhbGxvY19sb2NrZWRfYnVmZmVyKHNpemUpOwotCWlmICghY2hpbGQtPmJ0c19idWZmZXIpCi0JCXJldHVybiAtRU5PTUVNOwotCi0JY2hpbGQtPmJ0c19zaXplID0gc2l6ZTsKLQotCXJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBwdHJhY2VfYnRzX2ZyZWVfYnVmZmVyKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCi17Ci0JZnJlZV9sb2NrZWRfYnVmZmVyKGNoaWxkLT5idHNfYnVmZmVyLCBjaGlsZC0+YnRzX3NpemUpOwotCWNoaWxkLT5idHNfYnVmZmVyID0gTlVMTDsKLQljaGlsZC0+YnRzX3NpemUgPSAwOwotfQotCiBzdGF0aWMgaW50IHB0cmFjZV9idHNfY29uZmlnKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCiAJCQkgICAgIGxvbmcgY2ZnX3NpemUsCiAJCQkgICAgIGNvbnN0IHN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBfX3VzZXIgKnVjZmcpCiB7CisJc3RydWN0IGJ0c19jb250ZXh0ICpjb250ZXh0OwogCXN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBjZmc7CiAJdW5zaWduZWQgaW50IGZsYWdzID0gMDsKIApAQCAtNjc4LDI4ICs3NzksMzMgQEAKIAlpZiAoY29weV9mcm9tX3VzZXIoJmNmZywgdWNmZywgc2l6ZW9mKGNmZykpKQogCQlyZXR1cm4gLUVGQVVMVDsKIAotCWlmIChjaGlsZC0+YnRzKSB7Ci0JCWRzX3JlbGVhc2VfYnRzKGNoaWxkLT5idHMpOwotCQljaGlsZC0+YnRzID0gTlVMTDsKLQl9CisJY29udGV4dCA9IGNoaWxkLT5idHM7CisJaWYgKCFjb250ZXh0KQorCQljb250ZXh0ID0gYWxsb2NfYnRzX2NvbnRleHQoY2hpbGQpOworCWlmICghY29udGV4dCkKKwkJcmV0dXJuIC1FTk9NRU07CiAKIAlpZiAoY2ZnLmZsYWdzICYgUFRSQUNFX0JUU19PX1NJR05BTCkgewogCQlpZiAoIWNmZy5zaWduYWwpCiAJCQlyZXR1cm4gLUVJTlZBTDsKIAotCQljaGlsZC0+dGhyZWFkLmJ0c19vdmZsX3NpZ25hbCA9IGNmZy5zaWduYWw7CiAJCXJldHVybiAtRU9QTk9UU1VQUDsKKwkJY29udGV4dC0+YnRzX292Zmxfc2lnbmFsID0gY2ZnLnNpZ25hbDsKIAl9CiAKLQlpZiAoKGNmZy5mbGFncyAmIFBUUkFDRV9CVFNfT19BTExPQykgJiYKLQkgICAgKGNmZy5zaXplICE9IGNoaWxkLT5idHNfc2l6ZSkpIHsKLQkJaW50IGVycm9yOworCWRzX3JlbGVhc2VfYnRzKGNvbnRleHQtPnRyYWNlcik7CisJY29udGV4dC0+dHJhY2VyID0gTlVMTDsKIAotCQlwdHJhY2VfYnRzX2ZyZWVfYnVmZmVyKGNoaWxkKTsKKwlpZiAoKGNmZy5mbGFncyAmIFBUUkFDRV9CVFNfT19BTExPQykgJiYgKGNmZy5zaXplICE9IGNvbnRleHQtPnNpemUpKSB7CisJCWludCBlcnI7CiAKLQkJZXJyb3IgPSBwdHJhY2VfYnRzX2FsbG9jYXRlX2J1ZmZlcihjaGlsZCwgY2ZnLnNpemUpOwotCQlpZiAoZXJyb3IgPCAwKQotCQkJcmV0dXJuIGVycm9yOworCQlmcmVlX2J0c19idWZmZXIoY29udGV4dCk7CisJCWlmICghY2ZnLnNpemUpCisJCQlyZXR1cm4gMDsKKworCQllcnIgPSBhbGxvY19idHNfYnVmZmVyKGNvbnRleHQsIGNmZy5zaXplKTsKKwkJaWYgKGVyciA8IDApCisJCQlyZXR1cm4gZXJyOwogCX0KIAogCWlmIChjZmcuZmxhZ3MgJiBQVFJBQ0VfQlRTX09fVFJBQ0UpCkBAIC03MDgsMTUgKzgxNCwxNCBAQAogCWlmIChjZmcuZmxhZ3MgJiBQVFJBQ0VfQlRTX09fU0NIRUQpCiAJCWZsYWdzIHw9IEJUU19USU1FU1RBTVBTOwogCi0JY2hpbGQtPmJ0cyA9IGRzX3JlcXVlc3RfYnRzKGNoaWxkLCBjaGlsZC0+YnRzX2J1ZmZlciwgY2hpbGQtPmJ0c19zaXplLAotCQkJCSAgICAvKiBvdmZsID0gKi8gTlVMTCwgLyogdGggPSAqLyAoc2l6ZV90KS0xLAotCQkJCSAgICBmbGFncyk7Ci0JaWYgKElTX0VSUihjaGlsZC0+YnRzKSkgewotCQlpbnQgZXJyb3IgPSBQVFJfRVJSKGNoaWxkLT5idHMpOworCWNvbnRleHQtPnRyYWNlciA9CisJCWRzX3JlcXVlc3RfYnRzX3Rhc2soY2hpbGQsIGNvbnRleHQtPmJ1ZmZlciwgY29udGV4dC0+c2l6ZSwKKwkJCQkgICAgTlVMTCwgKHNpemVfdCktMSwgZmxhZ3MpOworCWlmICh1bmxpa2VseShJU19FUlIoY29udGV4dC0+dHJhY2VyKSkpIHsKKwkJaW50IGVycm9yID0gUFRSX0VSUihjb250ZXh0LT50cmFjZXIpOwogCi0JCXB0cmFjZV9idHNfZnJlZV9idWZmZXIoY2hpbGQpOwotCQljaGlsZC0+YnRzID0gTlVMTDsKLQorCQlmcmVlX2J0c19idWZmZXIoY29udGV4dCk7CisJCWNvbnRleHQtPnRyYWNlciA9IE5VTEw7CiAJCXJldHVybiBlcnJvcjsKIAl9CiAKQEAgLTcyNywyMCArODMyLDI1IEBACiAJCQkgICAgIGxvbmcgY2ZnX3NpemUsCiAJCQkgICAgIHN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBfX3VzZXIgKnVjZmcpCiB7CisJc3RydWN0IGJ0c19jb250ZXh0ICpjb250ZXh0OwogCWNvbnN0IHN0cnVjdCBidHNfdHJhY2UgKnRyYWNlOwogCXN0cnVjdCBwdHJhY2VfYnRzX2NvbmZpZyBjZmc7CiAKKwljb250ZXh0ID0gY2hpbGQtPmJ0czsKKwlpZiAoIWNvbnRleHQpCisJCXJldHVybiAtRVNSQ0g7CisKIAlpZiAoY2ZnX3NpemUgPCBzaXplb2YoY2ZnKSkKIAkJcmV0dXJuIC1FSU87CiAKLQl0cmFjZSA9IGRzX3JlYWRfYnRzKGNoaWxkLT5idHMpOworCXRyYWNlID0gZHNfcmVhZF9idHMoY29udGV4dC0+dHJhY2VyKTsKIAlpZiAoIXRyYWNlKQotCQlyZXR1cm4gLUVQRVJNOworCQlyZXR1cm4gLUVTUkNIOwogCiAJbWVtc2V0KCZjZmcsIDAsIHNpemVvZihjZmcpKTsKLQljZmcuc2l6ZSA9IHRyYWNlLT5kcy5lbmQgLSB0cmFjZS0+ZHMuYmVnaW47Ci0JY2ZnLnNpZ25hbCA9IGNoaWxkLT50aHJlYWQuYnRzX292Zmxfc2lnbmFsOwotCWNmZy5idHNfc2l6ZSA9IHNpemVvZihzdHJ1Y3QgYnRzX3N0cnVjdCk7CisJY2ZnLnNpemUJPSB0cmFjZS0+ZHMuZW5kIC0gdHJhY2UtPmRzLmJlZ2luOworCWNmZy5zaWduYWwJPSBjb250ZXh0LT5idHNfb3ZmbF9zaWduYWw7CisJY2ZnLmJ0c19zaXplCT0gc2l6ZW9mKHN0cnVjdCBidHNfc3RydWN0KTsKIAogCWlmIChjZmcuc2lnbmFsKQogCQljZmcuZmxhZ3MgfD0gUFRSQUNFX0JUU19PX1NJR05BTDsKQEAgLTc1OSw4MCArODY5LDUxIEBACiAKIHN0YXRpYyBpbnQgcHRyYWNlX2J0c19jbGVhcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogeworCXN0cnVjdCBidHNfY29udGV4dCAqY29udGV4dDsKIAljb25zdCBzdHJ1Y3QgYnRzX3RyYWNlICp0cmFjZTsKIAotCXRyYWNlID0gZHNfcmVhZF9idHMoY2hpbGQtPmJ0cyk7CisJY29udGV4dCA9IGNoaWxkLT5idHM7CisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gLUVTUkNIOworCisJdHJhY2UgPSBkc19yZWFkX2J0cyhjb250ZXh0LT50cmFjZXIpOwogCWlmICghdHJhY2UpCi0JCXJldHVybiAtRVBFUk07CisJCXJldHVybiAtRVNSQ0g7CiAKIAltZW1zZXQodHJhY2UtPmRzLmJlZ2luLCAwLCB0cmFjZS0+ZHMubiAqIHRyYWNlLT5kcy5zaXplKTsKIAotCXJldHVybiBkc19yZXNldF9idHMoY2hpbGQtPmJ0cyk7CisJcmV0dXJuIGRzX3Jlc2V0X2J0cyhjb250ZXh0LT50cmFjZXIpOwogfQogCiBzdGF0aWMgaW50IHB0cmFjZV9idHNfc2l6ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKQogeworCXN0cnVjdCBidHNfY29udGV4dCAqY29udGV4dDsKIAljb25zdCBzdHJ1Y3QgYnRzX3RyYWNlICp0cmFjZTsKIAotCXRyYWNlID0gZHNfcmVhZF9idHMoY2hpbGQtPmJ0cyk7CisJY29udGV4dCA9IGNoaWxkLT5idHM7CisJaWYgKCFjb250ZXh0KQorCQlyZXR1cm4gLUVTUkNIOworCisJdHJhY2UgPSBkc19yZWFkX2J0cyhjb250ZXh0LT50cmFjZXIpOwogCWlmICghdHJhY2UpCi0JCXJldHVybiAtRVBFUk07CisJCXJldHVybiAtRVNSQ0g7CiAKIAlyZXR1cm4gKHRyYWNlLT5kcy50b3AgLSB0cmFjZS0+ZHMuYmVnaW4pIC8gdHJhY2UtPmRzLnNpemU7CiB9CiAKLXN0YXRpYyB2b2lkIHB0cmFjZV9idHNfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykKLXsKLQl0c2stPmJ0cyA9IE5VTEw7Ci0JdHNrLT5idHNfYnVmZmVyID0gTlVMTDsKLQl0c2stPmJ0c19zaXplID0gMDsKLQl0c2stPnRocmVhZC5idHNfb3ZmbF9zaWduYWwgPSAwOwotfQotCi1zdGF0aWMgdm9pZCBwdHJhY2VfYnRzX3VudHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKKy8qCisgKiBDYWxsZWQgZnJvbSBfX3B0cmFjZV91bmxpbmsoKSBhZnRlciB0aGUgY2hpbGQgaGFzIGJlZW4gbW92ZWQgYmFjaworICogdG8gaXRzIG9yaWdpbmFsIHBhcmVudC4KKyAqLwordm9pZCBwdHJhY2VfYnRzX3VudHJhY2Uoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKIHsKIAlpZiAodW5saWtlbHkoY2hpbGQtPmJ0cykpIHsKLQkJZHNfcmVsZWFzZV9idHMoY2hpbGQtPmJ0cyk7CisJCWZyZWVfYnRzX2NvbnRleHQoY2hpbGQtPmJ0cyk7CiAJCWNoaWxkLT5idHMgPSBOVUxMOwotCi0JCS8qIFdlIGNhbm5vdCB1cGRhdGUgdG90YWxfdm0gYW5kIGxvY2tlZF92bSBzaW5jZQotCQkgICBjaGlsZCdzIG1tIGlzIGFscmVhZHkgZ29uZS4gQnV0IHdlIGNhbiByZWNsYWltIHRoZQotCQkgICBtZW1vcnkuICovCi0JCWtmcmVlKGNoaWxkLT5idHNfYnVmZmVyKTsKLQkJY2hpbGQtPmJ0c19idWZmZXIgPSBOVUxMOwotCQljaGlsZC0+YnRzX3NpemUgPSAwOwogCX0KIH0KLQotc3RhdGljIHZvaWQgcHRyYWNlX2J0c19kZXRhY2goc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKLXsKLQkvKgotCSAqIFB0cmFjZV9kZXRhY2goKSByYWNlcyB3aXRoIHB0cmFjZV91bnRyYWNlKCkgaW4gY2FzZQotCSAqIHRoZSBjaGlsZCBkaWVzIGFuZCBpcyByZWFwZWQgYnkgYW5vdGhlciB0aHJlYWQuCi0JICoKLQkgKiBXZSBvbmx5IGRvIHRoZSBtZW1vcnkgYWNjb3VudGluZyBhdCB0aGlzIHBvaW50IGFuZAotCSAqIGxlYXZlIHRoZSBidWZmZXIgZGVhbGxvY2F0aW9uIGFuZCB0aGUgYnRzIHRyYWNlcgotCSAqIHJlbGVhc2UgdG8gcHRyYWNlX2J0c191bnRyYWNlKCkgd2hpY2ggd2lsbCBiZSBjYWxsZWQKLQkgKiBsYXRlciBvbiB3aXRoIHRhc2tsaXN0X2xvY2sgaGVsZC4KLQkgKi8KLQlyZWxlYXNlX2xvY2tlZF9idWZmZXIoY2hpbGQtPmJ0c19idWZmZXIsIGNoaWxkLT5idHNfc2l6ZSk7Ci19Ci0jZWxzZQotc3RhdGljIGlubGluZSB2b2lkIHB0cmFjZV9idHNfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykge30KLXN0YXRpYyBpbmxpbmUgdm9pZCBwdHJhY2VfYnRzX2RldGFjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKSB7fQotc3RhdGljIGlubGluZSB2b2lkIHB0cmFjZV9idHNfdW50cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKSB7fQogI2VuZGlmIC8qIENPTkZJR19YODZfUFRSQUNFX0JUUyAqLwogCi12b2lkIHg4Nl9wdHJhY2VfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkLCB1bnNpZ25lZCBsb25nIGNsb25lX2ZsYWdzKQotewotCXB0cmFjZV9idHNfZm9yayhjaGlsZCk7Ci19Ci0KLXZvaWQgeDg2X3B0cmFjZV91bnRyYWNlKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCi17Ci0JcHRyYWNlX2J0c191bnRyYWNlKGNoaWxkKTsKLX0KLQogLyoKICAqIENhbGxlZCBieSBrZXJuZWwvcHRyYWNlLmMgd2hlbiBkZXRhY2hpbmcuLgogICoKQEAgLTg0NCw3ICs5MjUsNiBAQAogI2lmZGVmIFRJRl9TWVNDQUxMX0VNVQogCWNsZWFyX3Rza190aHJlYWRfZmxhZyhjaGlsZCwgVElGX1NZU0NBTExfRU1VKTsKICNlbmRpZgotCXB0cmFjZV9idHNfZGV0YWNoKGNoaWxkKTsKIH0KIAogI2lmIGRlZmluZWQgQ09ORklHX1g4Nl8zMiB8fCBkZWZpbmVkIENPTkZJR19JQTMyX0VNVUxBVElPTgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jIGIvYXJjaC94ODYva2VybmVsL3F1aXJrcy5jCmluZGV4IDc1NjNiMzEuLmFmNzFkMDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9xdWlya3MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvcXVpcmtzLmMKQEAgLTQ5MSw1ICs0OTEsNDIgQEAKIAkJYnJlYWs7CiAJfQogfQorI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19QQ0kpICYmIGRlZmluZWQoQ09ORklHX05VTUEpCisvKiBTZXQgY29ycmVjdCBudW1hX25vZGUgaW5mb3JtYXRpb24gZm9yIEFNRCBOQiBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIF9faW5pdCBxdWlya19hbWRfbmJfbm9kZShzdHJ1Y3QgcGNpX2RldiAqZGV2KQoreworCXN0cnVjdCBwY2lfZGV2ICpuYl9odDsKKwl1bnNpZ25lZCBpbnQgZGV2Zm47CisJdTMyIHZhbDsKKworCWRldmZuID0gUENJX0RFVkZOKFBDSV9TTE9UKGRldi0+ZGV2Zm4pLCAwKTsKKwluYl9odCA9IHBjaV9nZXRfc2xvdChkZXYtPmJ1cywgZGV2Zm4pOworCWlmICghbmJfaHQpCisJCXJldHVybjsKKworCXBjaV9yZWFkX2NvbmZpZ19kd29yZChuYl9odCwgMHg2MCwgJnZhbCk7CisJc2V0X2Rldl9ub2RlKCZkZXYtPmRldiwgdmFsICYgNyk7CisJcGNpX2Rldl9wdXQoZGV2KTsKK30KKworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CLAorCQkJcXVpcmtfYW1kX25iX25vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX0FERFJNQVAsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfSzhfTkJfTUVNQ1RMLAorCQkJcXVpcmtfYW1kX25iX25vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EX0s4X05CX01JU0MsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX0hULAorCQkJcXVpcmtfYW1kX25iX25vZGUpOworREVDTEFSRV9QQ0lfRklYVVBfRklOQUwoUENJX1ZFTkRPUl9JRF9BTUQsIFBDSV9ERVZJQ0VfSURfQU1EXzEwSF9OQl9NQVAsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX0RSQU0sCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX01JU0MsCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CitERUNMQVJFX1BDSV9GSVhVUF9GSU5BTChQQ0lfVkVORE9SX0lEX0FNRCwgUENJX0RFVklDRV9JRF9BTURfMTBIX05CX0xJTkssCisJCQlxdWlya19hbWRfbmJfbm9kZSk7CiAjZW5kaWYKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYyBiL2FyY2gveDg2L2tlcm5lbC9yZWJvb3QuYwppbmRleCA2NjcxODhlLi5kMmQxY2U4IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvcmVib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3JlYm9vdC5jCkBAIC0xOTIsNiArMTkyLDE1IEBACiAJCQlETUlfTUFUQ0goRE1JX0JPQVJEX05BTUUsICIwS1A1NjEiKSwKIAkJfSwKIAl9LAorCXsgICAvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gRGVsbCBPcHRpcGxleCAzNjAgd2l0aCAwVDY1NkYgKi8KKwkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LAorCQkuaWRlbnQgPSAiRGVsbCBPcHRpUGxleCAzNjAiLAorCQkubWF0Y2hlcyA9IHsKKwkJCURNSV9NQVRDSChETUlfU1lTX1ZFTkRPUiwgIkRlbGwgSW5jLiIpLAorCQkJRE1JX01BVENIKERNSV9QUk9EVUNUX05BTUUsICJPcHRpUGxleCAzNjAiKSwKKwkJCURNSV9NQVRDSChETUlfQk9BUkRfTkFNRSwgIjBUNjU2RiIpLAorCQl9LAorCX0sCiAJewkvKiBIYW5kbGUgcHJvYmxlbXMgd2l0aCByZWJvb3Rpbmcgb24gRGVsbCAyNDAwJ3MgKi8KIAkJLmNhbGxiYWNrID0gc2V0X2Jpb3NfcmVib290LAogCQkuaWRlbnQgPSAiRGVsbCBQb3dlckVkZ2UgMjQwMCIsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXAuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCmluZGV4IGI0MTU4NDMuLmQxYzYzNmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cC5jCkBAIC0xMTIsNiArMTEyLDE0IEBACiAjZGVmaW5lIEFSQ0hfU0VUVVAKICNlbmRpZgogCisvKgorICogZW5kX3BmbiBvbmx5IGluY2x1ZGVzIFJBTSwgd2hpbGUgbWF4X3Bmbl9tYXBwZWQgaW5jbHVkZXMgYWxsIGU4MjAgZW50cmllcy4KKyAqIFRoZSBkaXJlY3QgbWFwcGluZyBleHRlbmRzIHRvIG1heF9wZm5fbWFwcGVkLCBzbyB0aGF0IHdlIGNhbiBkaXJlY3RseSBhY2Nlc3MKKyAqIGFwZXJ0dXJlcywgQUNQSSBhbmQgb3RoZXIgdGFibGVzIHdpdGhvdXQgaGF2aW5nIHRvIHBsYXkgd2l0aCBmaXhtYXBzLgorICovCit1bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuX21hcHBlZDsKK3Vuc2lnbmVkIGxvbmcgbWF4X3Bmbl9tYXBwZWQ7CisKIFJFU0VSVkVfQlJLKGRtaV9hbGxvYywgNjU1MzYpOwogCiB1bnNpZ25lZCBpbnQgYm9vdF9jcHVfaWQgX19yZWFkX21vc3RseTsKQEAgLTIxNCw4ICsyMjIsOCBAQAogdW5zaWduZWQgbG9uZyBtbXVfY3I0X2ZlYXR1cmVzID0gWDg2X0NSNF9QQUU7CiAjZW5kaWYKIAotLyogQm9vdCBsb2FkZXIgSUQgYXMgYW4gaW50ZWdlciwgZm9yIHRoZSBiZW5lZml0IG9mIHByb2NfZG9pbnR2ZWMgKi8KLWludCBib290bG9hZGVyX3R5cGU7CisvKiBCb290IGxvYWRlciBJRCBhbmQgdmVyc2lvbiBhcyBpbnRlZ2VycywgZm9yIHRoZSBiZW5lZml0IG9mIHByb2NfZG9pbnR2ZWMgKi8KK2ludCBib290bG9hZGVyX3R5cGUsIGJvb3Rsb2FkZXJfdmVyc2lvbjsKIAogLyoKICAqIFNldHVwIG9wdGlvbnMKQEAgLTcwNiw2ICs3MTQsMTIgQEAKICNlbmRpZgogCXNhdmVkX3ZpZGVvX21vZGUgPSBib290X3BhcmFtcy5oZHIudmlkX21vZGU7CiAJYm9vdGxvYWRlcl90eXBlID0gYm9vdF9wYXJhbXMuaGRyLnR5cGVfb2ZfbG9hZGVyOworCWlmICgoYm9vdGxvYWRlcl90eXBlID4+IDQpID09IDB4ZSkgeworCQlib290bG9hZGVyX3R5cGUgJj0gMHhmOworCQlib290bG9hZGVyX3R5cGUgfD0gKGJvb3RfcGFyYW1zLmhkci5leHRfbG9hZGVyX3R5cGUrMHgxMCkgPDwgNDsKKwl9CisJYm9vdGxvYWRlcl92ZXJzaW9uICA9IGJvb3Rsb2FkZXJfdHlwZSAmIDB4ZjsKKwlib290bG9hZGVyX3ZlcnNpb24gfD0gYm9vdF9wYXJhbXMuaGRyLmV4dF9sb2FkZXJfdmVyIDw8IDQ7CiAKICNpZmRlZiBDT05GSUdfQkxLX0RFVl9SQU0KIAlyZF9pbWFnZV9zdGFydCA9IGJvb3RfcGFyYW1zLmhkci5yYW1fc2l6ZSAmIFJBTURJU0tfSU1BR0VfU1RBUlRfTUFTSzsKQEAgLTg1NCwxMiArODY4LDE2IEBACiAJCW1heF9sb3dfcGZuID0gbWF4X3BmbjsKIAogCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKilfX3ZhKG1heF9wZm4gKiBQQUdFX1NJWkUgLSAxKSArIDE7CisJbWF4X3Bmbl9tYXBwZWQgPSBLRVJORUxfSU1BR0VfU0laRSA+PiBQQUdFX1NISUZUOwogI2VuZGlmCiAKICNpZmRlZiBDT05GSUdfWDg2X0NIRUNLX0JJT1NfQ09SUlVQVElPTgogCXNldHVwX2Jpb3NfY29ycnVwdGlvbl9jaGVjaygpOwogI2VuZGlmCiAKKwlwcmludGsoS0VSTl9ERUJVRyAiaW5pdGlhbCBtZW1vcnkgbWFwcGVkIDogMCAtICUwOGx4XG4iLAorCQkJbWF4X3Bmbl9tYXBwZWQ8PFBBR0VfU0hJRlQpOworCiAJcmVzZXJ2ZV9icmsoKTsKIAogCS8qIG1heF9wZm5fbWFwcGVkIGlzIHVwZGF0ZWQgaGVyZSAqLwpAQCAtOTk3LDI0ICsxMDE1LDYgQEAKICNpZmRlZiBDT05GSUdfWDg2XzMyCiAKIC8qKgotICogeDg2X3F1aXJrX3ByZV9pbnRyX2luaXQgLSBpbml0aWFsaXNhdGlvbiBwcmlvciB0byBzZXR0aW5nIHVwIGludGVycnVwdCB2ZWN0b3JzCi0gKgotICogRGVzY3JpcHRpb246Ci0gKglQZXJmb3JtIGFueSBuZWNlc3NhcnkgaW50ZXJydXB0IGluaXRpYWxpc2F0aW9uIHByaW9yIHRvIHNldHRpbmcgdXAKLSAqCXRoZSAib3JkaW5hcnkiIGludGVycnVwdCBjYWxsIGdhdGVzLiAgRm9yIGxlZ2FjeSByZWFzb25zLCB0aGUgSVNBCi0gKglpbnRlcnJ1cHRzIHNob3VsZCBiZSBpbml0aWFsaXNlZCBoZXJlIGlmIHRoZSBtYWNoaW5lIGVtdWxhdGVzIGEgUEMKLSAqCWluIGFueSB3YXkuCi0gKiovCi12b2lkIF9faW5pdCB4ODZfcXVpcmtfcHJlX2ludHJfaW5pdCh2b2lkKQotewotCWlmICh4ODZfcXVpcmtzLT5hcmNoX3ByZV9pbnRyX2luaXQpIHsKLQkJaWYgKHg4Nl9xdWlya3MtPmFyY2hfcHJlX2ludHJfaW5pdCgpKQotCQkJcmV0dXJuOwotCX0KLQlpbml0X0lTQV9pcnFzKCk7Ci19Ci0KLS8qKgogICogeDg2X3F1aXJrX2ludHJfaW5pdCAtIHBvc3QgZ2F0ZSBzZXR1cCBpbnRlcnJ1cHQgaW5pdGlhbGlzYXRpb24KICAqCiAgKiBEZXNjcmlwdGlvbjoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYyBiL2FyY2gveDg2L2tlcm5lbC9zZXR1cF9wZXJjcHUuYwppbmRleCA4ZjBlMTNiLi45YzNmMDgyIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvc2V0dXBfcGVyY3B1LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NldHVwX3BlcmNwdS5jCkBAIC00MjUsNiArNDI1LDE0IEBACiAJZWFybHlfcGVyX2NwdV9wdHIoeDg2X2NwdV90b19ub2RlX21hcCkgPSBOVUxMOwogI2VuZGlmCiAKKyNpZiBkZWZpbmVkKENPTkZJR19YODZfNjQpICYmIGRlZmluZWQoQ09ORklHX05VTUEpCisJLyoKKwkgKiBtYWtlIHN1cmUgYm9vdCBjcHUgbm9kZV9udW1iZXIgaXMgcmlnaHQsIHdoZW4gYm9vdCBjcHUgaXMgb24gdGhlCisJICogbm9kZSB0aGF0IGRvZXNuJ3QgaGF2ZSBtZW0gaW5zdGFsbGVkCisJICovCisJcGVyX2NwdShub2RlX251bWJlciwgYm9vdF9jcHVfaWQpID0gY3B1X3RvX25vZGUoYm9vdF9jcHVfaWQpOworI2VuZGlmCisKIAkvKiBTZXR1cCBub2RlIHRvIGNwdW1hc2sgbWFwICovCiAJc2V0dXBfbm9kZV90b19jcHVtYXNrX21hcCgpOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc2lnbmFsLmMKaW5kZXggMTQ0MjUxNi4uMGE4MTNiMSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NpZ25hbC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zaWduYWwuYwpAQCAtNiw3ICs2LDYgQEAKICAqICAyMDAwLTA2LTIwICBQZW50aXVtIElJSSBGWFNSLCBTU0Ugc3VwcG9ydCBieSBHYXJldGggSHVnaGVzCiAgKiAgMjAwMC0yMDAyICAgeDg2LTY0IHN1cHBvcnQgYnkgQW5kaSBLbGVlbgogICovCi0KICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CiAjaW5jbHVkZSA8bGludXgvc21wLmg+CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvc21wLmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wLmMKaW5kZXggMTNmMzNlYS4uZjZkYjQ4YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3NtcC5jCisrKyBiL2FyY2gveDg2L2tlcm5lbC9zbXAuYwpAQCAtMTkzLDE5ICsxOTMsMTkgQEAKIH0KIAogc3RydWN0IHNtcF9vcHMgc21wX29wcyA9IHsKLQkuc21wX3ByZXBhcmVfYm9vdF9jcHUgPSBuYXRpdmVfc21wX3ByZXBhcmVfYm9vdF9jcHUsCi0JLnNtcF9wcmVwYXJlX2NwdXMgPSBuYXRpdmVfc21wX3ByZXBhcmVfY3B1cywKLQkuc21wX2NwdXNfZG9uZSA9IG5hdGl2ZV9zbXBfY3B1c19kb25lLAorCS5zbXBfcHJlcGFyZV9ib290X2NwdQk9IG5hdGl2ZV9zbXBfcHJlcGFyZV9ib290X2NwdSwKKwkuc21wX3ByZXBhcmVfY3B1cwk9IG5hdGl2ZV9zbXBfcHJlcGFyZV9jcHVzLAorCS5zbXBfY3B1c19kb25lCQk9IG5hdGl2ZV9zbXBfY3B1c19kb25lLAogCi0JLnNtcF9zZW5kX3N0b3AgPSBuYXRpdmVfc21wX3NlbmRfc3RvcCwKLQkuc21wX3NlbmRfcmVzY2hlZHVsZSA9IG5hdGl2ZV9zbXBfc2VuZF9yZXNjaGVkdWxlLAorCS5zbXBfc2VuZF9zdG9wCQk9IG5hdGl2ZV9zbXBfc2VuZF9zdG9wLAorCS5zbXBfc2VuZF9yZXNjaGVkdWxlCT0gbmF0aXZlX3NtcF9zZW5kX3Jlc2NoZWR1bGUsCiAKLQkuY3B1X3VwID0gbmF0aXZlX2NwdV91cCwKLQkuY3B1X2RpZSA9IG5hdGl2ZV9jcHVfZGllLAotCS5jcHVfZGlzYWJsZSA9IG5hdGl2ZV9jcHVfZGlzYWJsZSwKLQkucGxheV9kZWFkID0gbmF0aXZlX3BsYXlfZGVhZCwKKwkuY3B1X3VwCQkJPSBuYXRpdmVfY3B1X3VwLAorCS5jcHVfZGllCQk9IG5hdGl2ZV9jcHVfZGllLAorCS5jcHVfZGlzYWJsZQkJPSBuYXRpdmVfY3B1X2Rpc2FibGUsCisJLnBsYXlfZGVhZAkJPSBuYXRpdmVfcGxheV9kZWFkLAogCi0JLnNlbmRfY2FsbF9mdW5jX2lwaSA9IG5hdGl2ZV9zZW5kX2NhbGxfZnVuY19pcGksCisJLnNlbmRfY2FsbF9mdW5jX2lwaQk9IG5hdGl2ZV9zZW5kX2NhbGxfZnVuY19pcGksCiAJLnNlbmRfY2FsbF9mdW5jX3NpbmdsZV9pcGkgPSBuYXRpdmVfc2VuZF9jYWxsX2Z1bmNfc2luZ2xlX2lwaSwKIH07CiBFWFBPUlRfU1lNQk9MX0dQTChzbXBfb3BzKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMgYi9hcmNoL3g4Ni9rZXJuZWwvc21wYm9vdC5jCmluZGV4IDU4ZDI0ZWYuLjdjODAwMDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC9zbXBib290LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3NtcGJvb3QuYwpAQCAtNTA0LDcgKzUwNCw3IEBACiAgKiBJTklULCBJTklULCBTVEFSVFVQIHNlcXVlbmNlIHdpbGwgcmVzZXQgdGhlIGNoaXAgaGFyZCBmb3IgdXMsIGFuZCB0aGlzCiAgKiB3b24ndCAuLi4gcmVtZW1iZXIgdG8gY2xlYXIgZG93biB0aGUgQVBJQywgZXRjIGxhdGVyLgogICovCi1pbnQgX19kZXZpbml0CitpbnQgX19jcHVpbml0CiB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfbm1pKGludCBsb2dpY2FsX2FwaWNpZCwgdW5zaWduZWQgbG9uZyBzdGFydF9laXApCiB7CiAJdW5zaWduZWQgbG9uZyBzZW5kX3N0YXR1cywgYWNjZXB0X3N0YXR1cyA9IDA7CkBAIC01MzgsNyArNTM4LDcgQEAKIAlyZXR1cm4gKHNlbmRfc3RhdHVzIHwgYWNjZXB0X3N0YXR1cyk7CiB9CiAKLWludCBfX2RldmluaXQKK3N0YXRpYyBpbnQgX19jcHVpbml0CiB3YWtldXBfc2Vjb25kYXJ5X2NwdV92aWFfaW5pdChpbnQgcGh5c19hcGljaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfZWlwKQogewogCXVuc2lnbmVkIGxvbmcgc2VuZF9zdGF0dXMsIGFjY2VwdF9zdGF0dXMgPSAwOwpAQCAtODIyLDEwICs4MjIsMTIgQEAKIAkvKiBtYXJrICJzdHVjayIgYXJlYSBhcyBub3Qgc3R1Y2sgKi8KIAkqKCh2b2xhdGlsZSB1bnNpZ25lZCBsb25nICopdHJhbXBvbGluZV9iYXNlKSA9IDA7CiAKLQkvKgotCSAqIENsZWFudXAgcG9zc2libGUgZGFuZ2xpbmcgZW5kcy4uLgotCSAqLwotCXNtcGJvb3RfcmVzdG9yZV93YXJtX3Jlc2V0X3ZlY3RvcigpOworCWlmIChnZXRfdXZfc3lzdGVtX3R5cGUoKSAhPSBVVl9OT05fVU5JUVVFX0FQSUMpIHsKKwkJLyoKKwkJICogQ2xlYW51cCBwb3NzaWJsZSBkYW5nbGluZyBlbmRzLi4uCisJCSAqLworCQlzbXBib290X3Jlc3RvcmVfd2FybV9yZXNldF92ZWN0b3IoKTsKKwl9CiAKIAlyZXR1cm4gYm9vdF9lcnJvcjsKIH0KQEAgLTk5MCwxMCArOTkyLDEyIEBACiAJICovCiAJaWYgKEFQSUNfSU5URUdSQVRFRChhcGljX3ZlcnNpb25bYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkXSkgJiYKIAkgICAgIWNwdV9oYXNfYXBpYykgewotCQlwcmludGsoS0VSTl9FUlIgIkJJT1MgYnVnLCBsb2NhbCBBUElDICMlZCBub3QgZGV0ZWN0ZWQhLi4uXG4iLAotCQkJYm9vdF9jcHVfcGh5c2ljYWxfYXBpY2lkKTsKLQkJcHJpbnRrKEtFUk5fRVJSICIuLi4gZm9yY2luZyB1c2Ugb2YgZHVtbXkgQVBJQyBlbXVsYXRpb24uIgorCQlpZiAoIWRpc2FibGVfYXBpYykgeworCQkJcHJfZXJyKCJCSU9TIGJ1ZywgbG9jYWwgQVBJQyAjJWQgbm90IGRldGVjdGVkIS4uLlxuIiwKKwkJCQlib290X2NwdV9waHlzaWNhbF9hcGljaWQpOworCQkJcHJfZXJyKCIuLi4gZm9yY2luZyB1c2Ugb2YgZHVtbXkgQVBJQyBlbXVsYXRpb24uIgogCQkJCSIodGVsbCB5b3VyIGh3IHZlbmRvcilcbiIpOworCQl9CiAJCXNtcGJvb3RfY2xlYXJfaW9fYXBpYygpOwogCQlhcmNoX2Rpc2FibGVfc21wX3N1cHBvcnQoKTsKIAkJcmV0dXJuIC0xOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYyBiL2FyY2gveDg2L2tlcm5lbC9zdGFja3RyYWNlLmMKaW5kZXggZjdiZGRjMi4uNGFhZjdlNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N0YWNrdHJhY2UuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3RhY2t0cmFjZS5jCkBAIC0yMCw3ICsyMCw3IEBACiAKIHN0YXRpYyBpbnQgc2F2ZV9zdGFja19zdGFjayh2b2lkICpkYXRhLCBjaGFyICpuYW1lKQogewotCXJldHVybiAtMTsKKwlyZXR1cm4gMDsKIH0KIAogc3RhdGljIHZvaWQgc2F2ZV9zdGFja19hZGRyZXNzKHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgYWRkciwgaW50IHJlbGlhYmxlKQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUyBiL2FyY2gveDg2L2tlcm5lbC9zeXNjYWxsX3RhYmxlXzMyLlMKaW5kZXggZmY1Yzg3My4uZDUxMzIxZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3N5c2NhbGxfdGFibGVfMzIuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvc3lzY2FsbF90YWJsZV8zMi5TCkBAIC0zMzQsMyArMzM0LDUgQEAKIAkubG9uZyBzeXNfaW5vdGlmeV9pbml0MQogCS5sb25nIHN5c19wcmVhZHYKIAkubG9uZyBzeXNfcHdyaXRldgorCS5sb25nIHN5c19ydF90Z3NpZ3F1ZXVlaW5mbwkvKiAzMzUgKi8KKwkubG9uZyBzeXNfcGVyZl9jb3VudGVyX29wZW4KZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90bGJfdXYuYyBiL2FyY2gveDg2L2tlcm5lbC90bGJfdXYuYwppbmRleCA4YzdiMDNiLi4xMjRkNDBjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdGxiX3V2LmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RsYl91di5jCkBAIC03MTUsNyArNzE1LDEyIEBACiAJc3RydWN0IGJhdV9kZXNjICphZHA7CiAJc3RydWN0IGJhdV9kZXNjICphZDI7CiAKLQlhZHAgPSAoc3RydWN0IGJhdV9kZXNjICopa21hbGxvY19ub2RlKDE2Mzg0LCBHRlBfS0VSTkVMLCBub2RlKTsKKwkvKgorCSAqIGVhY2ggYmF1X2Rlc2MgaXMgNjQgYnl0ZXM7IHRoZXJlIGFyZSA4IChVVl9JVEVNU19QRVJfREVTQ1JJUFRPUikKKwkgKiBwZXIgY3B1OyBhbmQgdXAgdG8gMzIgKFVWX0FEUF9TSVpFKSBjcHUncyBwZXIgYmxhZGUKKwkgKi8KKwlhZHAgPSAoc3RydWN0IGJhdV9kZXNjICopa21hbGxvY19ub2RlKHNpemVvZihzdHJ1Y3QgYmF1X2Rlc2MpKgorCQlVVl9BRFBfU0laRSpVVl9JVEVNU19QRVJfREVTQ1JJUFRPUiwgR0ZQX0tFUk5FTCwgbm9kZSk7CiAJQlVHX09OKCFhZHApOwogCiAJcGEgPSB1dl9ncGEoYWRwKTsgLyogbmVlZCB0aGUgcmVhbCBuYXNpZCovCkBAIC03MjksNyArNzM0LDEzIEBACiAJCQkJICAgICAgKG4gPDwgVVZfREVTQ19CQVNFX1BOT0RFX1NISUZUIHwgbSkpOwogCX0KIAotCWZvciAoaSA9IDAsIGFkMiA9IGFkcDsgaSA8IFVWX0FDVElWQVRJT05fREVTQ1JJUFRPUl9TSVpFOyBpKyssIGFkMisrKSB7CisJLyoKKwkgKiBpbml0aWFsaXppbmcgYWxsIDggKFVWX0lURU1TX1BFUl9ERVNDUklQVE9SKSBkZXNjcmlwdG9ycyBmb3IgZWFjaAorCSAqIGNwdSBldmVuIHRob3VnaCB3ZSBvbmx5IHVzZSB0aGUgZmlyc3Qgb25lOyBvbmUgZGVzY3JpcHRvciBjYW4KKwkgKiBkZXNjcmliZSBhIGJyb2FkY2FzdCB0byAyNTYgbm9kZXMuCisJICovCisJZm9yIChpID0gMCwgYWQyID0gYWRwOyBpIDwgKFVWX0FEUF9TSVpFKlVWX0lURU1TX1BFUl9ERVNDUklQVE9SKTsKKwkJaSsrLCBhZDIrKykgewogCQltZW1zZXQoYWQyLCAwLCBzaXplb2Yoc3RydWN0IGJhdV9kZXNjKSk7CiAJCWFkMi0+aGVhZGVyLnN3X2Fja19mbGFnID0gMTsKIAkJLyoKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90cmFwcy5jIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKaW5kZXggYTFkMjg4My4uMDdkNjBjOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RyYXBzLmMKQEAgLTgzOSw5ICs4MzksNiBAQAogCX0KIAogCWNsdHMoKTsJCQkJLyogQWxsb3cgbWF0aHMgb3BzIChvciB3ZSByZWN1cnNlKSAqLwotI2lmZGVmIENPTkZJR19YODZfMzIKLQlyZXN0b3JlX2ZwdSh0c2spOwotI2Vsc2UKIAkvKgogCSAqIFBhcmFub2lkIHJlc3RvcmUuIHNlbmQgYSBTSUdTRUdWIGlmIHdlIGZhaWwgdG8gcmVzdG9yZSB0aGUgc3RhdGUuCiAJICovCkBAIC04NTAsNyArODQ3LDcgQEAKIAkJZm9yY2Vfc2lnKFNJR1NFR1YsIHRzayk7CiAJCXJldHVybjsKIAl9Ci0jZW5kaWYKKwogCXRocmVhZC0+c3RhdHVzIHw9IFRTX1VTRURGUFU7CS8qIFNvIHdlIGZuc2F2ZSBvbiBzd2l0Y2hfdG8oKSAqLwogCXRzay0+ZnB1X2NvdW50ZXIrKzsKIH0KQEAgLTk0NSw4ICs5NDIsMTMgQEAKICNlbmRpZgogCXNldF9pbnRyX2dhdGUoMTksICZzaW1kX2NvcHJvY2Vzc29yX2Vycm9yKTsKIAorCS8qIFJlc2VydmUgYWxsIHRoZSBidWlsdGluIGFuZCB0aGUgc3lzY2FsbCB2ZWN0b3I6ICovCisJZm9yIChpID0gMDsgaSA8IEZJUlNUX0VYVEVSTkFMX1ZFQ1RPUjsgaSsrKQorCQlzZXRfYml0KGksIHVzZWRfdmVjdG9ycyk7CisKICNpZmRlZiBDT05GSUdfSUEzMl9FTVVMQVRJT04KIAlzZXRfc3lzdGVtX2ludHJfZ2F0ZShJQTMyX1NZU0NBTExfVkVDVE9SLCBpYTMyX3N5c2NhbGwpOworCXNldF9iaXQoSUEzMl9TWVNDQUxMX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKICNlbmRpZgogCiAjaWZkZWYgQ09ORklHX1g4Nl8zMgpAQCAtOTYzLDE3ICs5NjUsOSBAQAogCX0KIAogCXNldF9zeXN0ZW1fdHJhcF9nYXRlKFNZU0NBTExfVkVDVE9SLCAmc3lzdGVtX2NhbGwpOwotI2VuZGlmCi0KLQkvKiBSZXNlcnZlIGFsbCB0aGUgYnVpbHRpbiBhbmQgdGhlIHN5c2NhbGwgdmVjdG9yOiAqLwotCWZvciAoaSA9IDA7IGkgPCBGSVJTVF9FWFRFUk5BTF9WRUNUT1I7IGkrKykKLQkJc2V0X2JpdChpLCB1c2VkX3ZlY3RvcnMpOwotCi0jaWZkZWYgQ09ORklHX1g4Nl82NAotCXNldF9iaXQoSUEzMl9TWVNDQUxMX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKLSNlbHNlCiAJc2V0X2JpdChTWVNDQUxMX1ZFQ1RPUiwgdXNlZF92ZWN0b3JzKTsKICNlbmRpZgorCiAJLyoKIAkgKiBTaG91bGQgYmUgYSBiYXJyaWVyIGZvciBhbnkgZXh0ZXJuYWwgQ1BVIHN0YXRlOgogCSAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3RzYy5jIGIvYXJjaC94ODYva2VybmVsL3RzYy5jCmluZGV4IGQ1N2RlMDUuLjNlMWMwNTcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC90c2MuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdHNjLmMKQEAgLTM4NCwxMyArMzg0LDEzIEBACiB7CiAJdTY0IHRzYzEsIHRzYzIsIGRlbHRhLCByZWYxLCByZWYyOwogCXVuc2lnbmVkIGxvbmcgdHNjX3BpdF9taW4gPSBVTE9OR19NQVgsIHRzY19yZWZfbWluID0gVUxPTkdfTUFYOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGxhdGNoLCBtcywgZmFzdF9jYWxpYnJhdGUsIHRzY19raHo7CisJdW5zaWduZWQgbG9uZyBmbGFncywgbGF0Y2gsIG1zLCBmYXN0X2NhbGlicmF0ZSwgaHZfdHNjX2toejsKIAlpbnQgaHBldCA9IGlzX2hwZXRfZW5hYmxlZCgpLCBpLCBsb29wbWluOwogCi0JdHNjX2toeiA9IGdldF9oeXBlcnZpc29yX3RzY19mcmVxKCk7Ci0JaWYgKHRzY19raHopIHsKKwlodl90c2Nfa2h6ID0gZ2V0X2h5cGVydmlzb3JfdHNjX2ZyZXEoKTsKKwlpZiAoaHZfdHNjX2toeikgewogCQlwcmludGsoS0VSTl9JTkZPICJUU0M6IEZyZXF1ZW5jeSByZWFkIGZyb20gdGhlIGh5cGVydmlzb3JcbiIpOwotCQlyZXR1cm4gdHNjX2toejsKKwkJcmV0dXJuIGh2X3RzY19raHo7CiAJfQogCiAJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwpAQCAtNzEwLDcgKzcxMCwxNiBAQAogI2lmZGVmIENPTkZJR19YODZfNjQKIHN0YXRpYyBjeWNsZV90IF9fdnN5c2NhbGxfZm4gdnJlYWRfdHNjKHZvaWQpCiB7Ci0JY3ljbGVfdCByZXQgPSAoY3ljbGVfdCl2Z2V0X2N5Y2xlcygpOworCWN5Y2xlX3QgcmV0OworCisJLyoKKwkgKiBTdXJyb3VuZCB0aGUgUkRUU0MgYnkgYmFycmllcnMsIHRvIG1ha2Ugc3VyZSBpdCdzIG5vdAorCSAqIHNwZWN1bGF0ZWQgdG8gb3V0c2lkZSB0aGUgc2VxbG9jayBjcml0aWNhbCBzZWN0aW9uIGFuZAorCSAqIGRvZXMgbm90IGNhdXNlIHRpbWUgd2FycHM6CisJICovCisJcmR0c2NfYmFycmllcigpOworCXJldCA9IChjeWNsZV90KXZnZXRfY3ljbGVzKCk7CisJcmR0c2NfYmFycmllcigpOwogCiAJcmV0dXJuIHJldCA+PSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5jeWNsZV9sYXN0ID8KIAkJcmV0IDogX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2suY3ljbGVfbGFzdDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC90c2Nfc3luYy5jIGIvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKaW5kZXggYmYzNjMyOC4uMDI3YjViNCAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKKysrIGIvYXJjaC94ODYva2VybmVsL3RzY19zeW5jLmMKQEAgLTM0LDYgKzM0LDcgQEAKICAqIG9mIGEgY3JpdGljYWwgc2VjdGlvbiwgdG8gYmUgYWJsZSB0byBwcm92ZSBUU0MgdGltZS13YXJwczoKICAqLwogc3RhdGljIF9fY3B1aW5pdGRhdGEgcmF3X3NwaW5sb2NrX3Qgc3luY19sb2NrID0gX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEOworCiBzdGF0aWMgX19jcHVpbml0ZGF0YSBjeWNsZXNfdCBsYXN0X3RzYzsKIHN0YXRpYyBfX2NwdWluaXRkYXRhIGN5Y2xlc190IG1heF93YXJwOwogc3RhdGljIF9fY3B1aW5pdGRhdGEgaW50IG5yX3dhcnBzOwpAQCAtMTEzLDEzICsxMTQsMTIgQEAKIAkJcmV0dXJuOwogCiAJaWYgKGJvb3RfY3B1X2hhcyhYODZfRkVBVFVSRV9UU0NfUkVMSUFCTEUpKSB7Ci0JCXByaW50ayhLRVJOX0lORk8KLQkJICAgICAgICJTa2lwcGluZyBzeW5jaHJvbml6YXRpb24gY2hlY2tzIGFzIFRTQyBpcyByZWxpYWJsZS5cbiIpOworCQlwcl9pbmZvKCJTa2lwcGluZyBzeW5jaHJvbml6YXRpb24gY2hlY2tzIGFzIFRTQyBpcyByZWxpYWJsZS5cbiIpOwogCQlyZXR1cm47CiAJfQogCi0JcHJpbnRrKEtFUk5fSU5GTyAiY2hlY2tpbmcgVFNDIHN5bmNocm9uaXphdGlvbiBbQ1BVIyVkIC0+IENQVSMlZF06IiwKLQkJCSAgc21wX3Byb2Nlc3Nvcl9pZCgpLCBjcHUpOworCXByX2luZm8oImNoZWNraW5nIFRTQyBzeW5jaHJvbml6YXRpb24gW0NQVSMlZCAtPiBDUFUjJWRdOiIsCisJCXNtcF9wcm9jZXNzb3JfaWQoKSwgY3B1KTsKIAogCS8qCiAJICogUmVzZXQgaXQgLSBpbiBjYXNlIHRoaXMgaXMgYSBzZWNvbmQgYm9vdHVwOgpAQCAtMTQzLDggKzE0Myw4IEBACiAKIAlpZiAobnJfd2FycHMpIHsKIAkJcHJpbnRrKCJcbiIpOwotCQlwcmludGsoS0VSTl9XQVJOSU5HICJNZWFzdXJlZCAlTGQgY3ljbGVzIFRTQyB3YXJwIGJldHdlZW4gQ1BVcywiCi0JCQkJICAgICIgdHVybmluZyBvZmYgVFNDIGNsb2NrLlxuIiwgbWF4X3dhcnApOworCQlwcl93YXJuaW5nKCJNZWFzdXJlZCAlTGQgY3ljbGVzIFRTQyB3YXJwIGJldHdlZW4gQ1BVcywgIgorCQkJICAgInR1cm5pbmcgb2ZmIFRTQyBjbG9jay5cbiIsIG1heF93YXJwKTsKIAkJbWFya190c2NfdW5zdGFibGUoImNoZWNrX3RzY19zeW5jX3NvdXJjZSBmYWlsZWQiKTsKIAl9IGVsc2UgewogCQlwcmludGsoIiBwYXNzZWQuXG4iKTsKQEAgLTE5NSw1ICsxOTUsMyBAQAogCXdoaWxlIChhdG9taWNfcmVhZCgmc3RvcF9jb3VudCkgIT0gY3B1cykKIAkJY3B1X3JlbGF4KCk7CiB9Ci0jdW5kZWYgTlJfTE9PUFMKLQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtODZfMzIuYyBiL2FyY2gveDg2L2tlcm5lbC92bTg2XzMyLmMKaW5kZXggZDdhYzg0ZS4uOWM0ZTYyNSAxMDA2NDQKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZtODZfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm04Nl8zMi5jCkBAIC0yODcsMTAgKzI4Nyw5IEBACiAJaW5mby0+cmVncy5wdC5kcyA9IDA7CiAJaW5mby0+cmVncy5wdC5lcyA9IDA7CiAJaW5mby0+cmVncy5wdC5mcyA9IDA7Ci0KLS8qIHdlIGFyZSBjbGVhcmluZyBncyBsYXRlciBqdXN0IGJlZm9yZSAiam1wIHJlc3VtZV91c2Vyc3BhY2UiLAotICogYmVjYXVzZSBpdCBpcyBub3Qgc2F2ZWQvcmVzdG9yZWQuCi0gKi8KKyNpZm5kZWYgQ09ORklHX1g4Nl8zMl9MQVpZX0dTCisJaW5mby0+cmVncy5wdC5ncyA9IDA7CisjZW5kaWYKIAogLyoKICAqIFRoZSBmbGFncyByZWdpc3RlciBpcyBhbHNvIHNwZWNpYWw6IHdlIGNhbm5vdCB0cnVzdCB0aGF0IHRoZSB1c2VyCkBAIC0zMTgsOSArMzE3LDkgQEAKIAl9CiAKIC8qCi0gKiBTYXZlIG9sZCBzdGF0ZSwgc2V0IGRlZmF1bHQgcmV0dXJuIHZhbHVlICglYXgpIHRvIDAKKyAqIFNhdmUgb2xkIHN0YXRlLCBzZXQgZGVmYXVsdCByZXR1cm4gdmFsdWUgKCVheCkgdG8gMCAoVk04Nl9TSUdOQUwpCiAgKi8KLQlpbmZvLT5yZWdzMzItPmF4ID0gMDsKKwlpbmZvLT5yZWdzMzItPmF4ID0gVk04Nl9TSUdOQUw7CiAJdHNrLT50aHJlYWQuc2F2ZWRfc3AwID0gdHNrLT50aHJlYWQuc3AwOwogCXRzay0+dGhyZWFkLnNhdmVkX2ZzID0gaW5mby0+cmVnczMyLT5mczsKIAl0c2stPnRocmVhZC5zYXZlZF9ncyA9IGdldF91c2VyX2dzKGluZm8tPnJlZ3MzMik7CkBAIC0zNDMsNyArMzQyLDkgQEAKIAlfX2FzbV9fIF9fdm9sYXRpbGVfXygKIAkJIm1vdmwgJTAsJSVlc3Bcblx0IgogCQkibW92bCAlMSwlJWVicFxuXHQiCisjaWZkZWYgQ09ORklHX1g4Nl8zMl9MQVpZX0dTCiAJCSJtb3YgICUyLCAlJWdzXG5cdCIKKyNlbmRpZgogCQkiam1wIHJlc3VtZV91c2Vyc3BhY2UiCiAJCTogLyogbm8gb3V0cHV0cyAqLwogCQk6InIiICgmaW5mby0+cmVncyksICJyIiAodGFza190aHJlYWRfaW5mbyh0c2spKSwgInIiICgwKSk7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMKaW5kZXggOTVkZWI5ZjIuLmIyNjM0MjMgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L2tlcm5lbC92bWlfMzIuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm1pXzMyLmMKQEAgLTQ2MiwyMiArNDYyLDI4IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgdm1pX2VudGVyX2xhenlfY3B1KHZvaWQpCitzdGF0aWMgdm9pZCB2bWlfc3RhcnRfY29udGV4dF9zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2KQogewotCXBhcmF2aXJ0X2VudGVyX2xhenlfY3B1KCk7CisJcGFyYXZpcnRfc3RhcnRfY29udGV4dF9zd2l0Y2gocHJldik7CiAJdm1pX29wcy5zZXRfbGF6eV9tb2RlKDIpOwogfQogCitzdGF0aWMgdm9pZCB2bWlfZW5kX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKK3sKKwl2bWlfb3BzLnNldF9sYXp5X21vZGUoMCk7CisJcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKG5leHQpOworfQorCiBzdGF0aWMgdm9pZCB2bWlfZW50ZXJfbGF6eV9tbXUodm9pZCkKIHsKIAlwYXJhdmlydF9lbnRlcl9sYXp5X21tdSgpOwogCXZtaV9vcHMuc2V0X2xhenlfbW9kZSgxKTsKIH0KIAotc3RhdGljIHZvaWQgdm1pX2xlYXZlX2xhenkodm9pZCkKK3N0YXRpYyB2b2lkIHZtaV9sZWF2ZV9sYXp5X21tdSh2b2lkKQogewotCXBhcmF2aXJ0X2xlYXZlX2xhenkocGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpKTsKIAl2bWlfb3BzLnNldF9sYXp5X21vZGUoMCk7CisJcGFyYXZpcnRfbGVhdmVfbGF6eV9tbXUoKTsKIH0KIAogc3RhdGljIGlubGluZSBpbnQgX19pbml0IGNoZWNrX3ZtaV9yb20oc3RydWN0IHZyb21faGVhZGVyICpyb20pCkBAIC03MTEsMTQgKzcxNywxNCBAQAogCXBhcmFfZmlsbChwdl9jcHVfb3BzLnNldF9pb3BsX21hc2ssIFNldElPUExNYXNrKTsKIAlwYXJhX2ZpbGwocHZfY3B1X29wcy5pb19kZWxheSwgSU9EZWxheSk7CiAKLQlwYXJhX3dyYXAocHZfY3B1X29wcy5sYXp5X21vZGUuZW50ZXIsIHZtaV9lbnRlcl9sYXp5X2NwdSwKKwlwYXJhX3dyYXAocHZfY3B1X29wcy5zdGFydF9jb250ZXh0X3N3aXRjaCwgdm1pX3N0YXJ0X2NvbnRleHRfc3dpdGNoLAogCQkgIHNldF9sYXp5X21vZGUsIFNldExhenlNb2RlKTsKLQlwYXJhX3dyYXAocHZfY3B1X29wcy5sYXp5X21vZGUubGVhdmUsIHZtaV9sZWF2ZV9sYXp5LAorCXBhcmFfd3JhcChwdl9jcHVfb3BzLmVuZF9jb250ZXh0X3N3aXRjaCwgdm1pX2VuZF9jb250ZXh0X3N3aXRjaCwKIAkJICBzZXRfbGF6eV9tb2RlLCBTZXRMYXp5TW9kZSk7CiAKIAlwYXJhX3dyYXAocHZfbW11X29wcy5sYXp5X21vZGUuZW50ZXIsIHZtaV9lbnRlcl9sYXp5X21tdSwKIAkJICBzZXRfbGF6eV9tb2RlLCBTZXRMYXp5TW9kZSk7Ci0JcGFyYV93cmFwKHB2X21tdV9vcHMubGF6eV9tb2RlLmxlYXZlLCB2bWlfbGVhdmVfbGF6eSwKKwlwYXJhX3dyYXAocHZfbW11X29wcy5sYXp5X21vZGUubGVhdmUsIHZtaV9sZWF2ZV9sYXp5X21tdSwKIAkJICBzZXRfbGF6eV9tb2RlLCBTZXRMYXp5TW9kZSk7CiAKIAkvKiB1c2VyIGFuZCBrZXJuZWwgZmx1c2ggYXJlIGp1c3QgaGFuZGxlZCB3aXRoIGRpZmZlcmVudCBmbGFncyB0byBGbHVzaFRMQiAqLwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtbGludXgubGRzLlMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwppbmRleCA4NDllZTYxLi40Yzg1YjJlIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eC5sZHMuUwpAQCAtMSw1ICsxLDQzMSBAQAorLyoKKyAqIGxkIHNjcmlwdCBmb3IgdGhlIHg4NiBrZXJuZWwKKyAqCisgKiBIaXN0b3JpYyAzMi1iaXQgdmVyc2lvbiB3cml0dGVuIGJ5IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PgorICoKKyAqIE1vZGVybmlzYXRpb24sIHVuaWZpY2F0aW9uIGFuZCBvdGhlciBjaGFuZ2VzIGFuZCBmaXhlczoKKyAqICAgQ29weXJpZ2h0IChDKSAyMDA3LTIwMDkgIFNhbSBSYXZuYm9yZyA8c2FtQHJhdm5ib3JnLm9yZz4KKyAqCisgKgorICogRG9uJ3QgZGVmaW5lIGFic29sdXRlIHN5bWJvbHMgdW50aWwgYW5kIHVubGVzcyB5b3Uga25vdyB0aGF0IHN5bWJvbAorICogdmFsdWUgaXMgc2hvdWxkIHJlbWFpbiBjb25zdGFudCBldmVuIGlmIGtlcm5lbCBpbWFnZSBpcyByZWxvY2F0ZWQKKyAqIGF0IHJ1biB0aW1lLiBBYnNvbHV0ZSBzeW1ib2xzIGFyZSBub3QgcmVsb2NhdGVkLiBJZiBzeW1ib2wgdmFsdWUgc2hvdWxkCisgKiBjaGFuZ2UgaWYga2VybmVsIGlzIHJlbG9jYXRlZCwgbWFrZSB0aGUgc3ltYm9sIHNlY3Rpb24gcmVsYXRpdmUgYW5kCisgKiBwdXQgaXQgaW5zaWRlIHRoZSBzZWN0aW9uIGRlZmluaXRpb24uCisgKi8KKwogI2lmZGVmIENPTkZJR19YODZfMzIKLSMgaW5jbHVkZSAidm1saW51eF8zMi5sZHMuUyIKKyNkZWZpbmUgTE9BRF9PRkZTRVQgX19QQUdFX09GRlNFVAogI2Vsc2UKLSMgaW5jbHVkZSAidm1saW51eF82NC5sZHMuUyIKKyNkZWZpbmUgTE9BRF9PRkZTRVQgX19TVEFSVF9LRVJORUxfbWFwCiAjZW5kaWYKKworI2luY2x1ZGUgPGFzbS1nZW5lcmljL3ZtbGludXgubGRzLmg+CisjaW5jbHVkZSA8YXNtL2FzbS1vZmZzZXRzLmg+CisjaW5jbHVkZSA8YXNtL3RocmVhZF9pbmZvLmg+CisjaW5jbHVkZSA8YXNtL3BhZ2VfdHlwZXMuaD4KKyNpbmNsdWRlIDxhc20vY2FjaGUuaD4KKyNpbmNsdWRlIDxhc20vYm9vdC5oPgorCisjdW5kZWYgaTM4NiAgICAgLyogaW4gY2FzZSB0aGUgcHJlcHJvY2Vzc29yIGlzIGEgMzJiaXQgb25lICovCisKK09VVFBVVF9GT1JNQVQoQ09ORklHX09VVFBVVF9GT1JNQVQsIENPTkZJR19PVVRQVVRfRk9STUFULCBDT05GSUdfT1VUUFVUX0ZPUk1BVCkKKworI2lmZGVmIENPTkZJR19YODZfMzIKK09VVFBVVF9BUkNIKGkzODYpCitFTlRSWShwaHlzX3N0YXJ0dXBfMzIpCitqaWZmaWVzID0gamlmZmllc182NDsKKyNlbHNlCitPVVRQVVRfQVJDSChpMzg2Ong4Ni02NCkKK0VOVFJZKHBoeXNfc3RhcnR1cF82NCkKK2ppZmZpZXNfNjQgPSBqaWZmaWVzOworI2VuZGlmCisKK1BIRFJTIHsKKwl0ZXh0IFBUX0xPQUQgRkxBR1MoNSk7ICAgICAgICAgIC8qIFJfRSAqLworCWRhdGEgUFRfTE9BRCBGTEFHUyg3KTsgICAgICAgICAgLyogUldFICovCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCXVzZXIgUFRfTE9BRCBGTEFHUyg3KTsgICAgICAgICAgLyogUldFICovCisJZGF0YS5pbml0IFBUX0xPQUQgRkxBR1MoNyk7ICAgICAvKiBSV0UgKi8KKyNpZmRlZiBDT05GSUdfU01QCisJcGVyY3B1IFBUX0xPQUQgRkxBR1MoNyk7ICAgICAgICAvKiBSV0UgKi8KKyNlbmRpZgorCWRhdGEuaW5pdDIgUFRfTE9BRCBGTEFHUyg3KTsgICAgLyogUldFICovCisjZW5kaWYKKwlub3RlIFBUX05PVEUgRkxBR1MoMCk7ICAgICAgICAgIC8qIF9fXyAqLworfQorCitTRUNUSU9OUworeworI2lmZGVmIENPTkZJR19YODZfMzIKKyAgICAgICAgLiA9IExPQURfT0ZGU0VUICsgTE9BRF9QSFlTSUNBTF9BRERSOworICAgICAgICBwaHlzX3N0YXJ0dXBfMzIgPSBzdGFydHVwXzMyIC0gTE9BRF9PRkZTRVQ7CisjZWxzZQorICAgICAgICAuID0gX19TVEFSVF9LRVJORUw7CisgICAgICAgIHBoeXNfc3RhcnR1cF82NCA9IHN0YXJ0dXBfNjQgLSBMT0FEX09GRlNFVDsKKyNlbmRpZgorCisJLyogVGV4dCBhbmQgcmVhZC1vbmx5IGRhdGEgKi8KKworCS8qIGJvb3RzdHJhcHBpbmcgY29kZSAqLworCS50ZXh0LmhlYWQgOiBBVChBRERSKC50ZXh0LmhlYWQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX3RleHQgPSAuOworCQkqKC50ZXh0LmhlYWQpCisJfSA6dGV4dCA9IDB4OTA5MAorCisJLyogVGhlIHJlc3Qgb2YgdGhlIHRleHQgKi8KKwkudGV4dCA6ICBBVChBRERSKC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7CisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCQkvKiBub3QgcmVhbGx5IG5lZWRlZCwgYWxyZWFkeSBwYWdlIGFsaWduZWQgKi8KKwkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJCSooLnRleHQucGFnZV9hbGlnbmVkKQorI2VuZGlmCisJCS4gPSBBTElHTig4KTsKKwkJX3N0ZXh0ID0gLjsKKwkJVEVYVF9URVhUCisJCVNDSEVEX1RFWFQKKwkJTE9DS19URVhUCisJCUtQUk9CRVNfVEVYVAorCQlJUlFFTlRSWV9URVhUCisJCSooLmZpeHVwKQorCQkqKC5nbnUud2FybmluZykKKwkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLworCQlfZXRleHQgPSAuOworCX0gOnRleHQgPSAweDkwOTAKKworCU5PVEVTIDp0ZXh0IDpub3RlCisKKwkvKiBFeGNlcHRpb24gdGFibGUgKi8KKwkuID0gQUxJR04oMTYpOworCV9fZXhfdGFibGUgOiBBVChBRERSKF9fZXhfdGFibGUpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19zdGFydF9fX2V4X3RhYmxlID0gLjsKKwkJKihfX2V4X3RhYmxlKQorCQlfX3N0b3BfX19leF90YWJsZSA9IC47CisJfSA6dGV4dCA9IDB4OTA5MAorCisJUk9EQVRBCisKKwkvKiBEYXRhICovCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJLmRhdGEgOiBBVChBRERSKC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7CisJCURBVEFfREFUQQorCQlDT05TVFJVQ1RPUlMKKworI2lmZGVmIENPTkZJR19YODZfNjQKKwkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLworCQlfZWRhdGEgPSAuOworI2VuZGlmCisJfSA6ZGF0YQorCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCS8qIDMyIGJpdCBoYXMgbm9zYXZlIGJlZm9yZSBfZWRhdGEgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuZGF0YV9ub3NhdmUgOiBBVChBRERSKC5kYXRhX25vc2F2ZSkgLSBMT0FEX09GRlNFVCkgeworCQlfX25vc2F2ZV9iZWdpbiA9IC47CisJCSooLmRhdGEubm9zYXZlKQorCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkJX19ub3NhdmVfZW5kID0gLjsKKwl9CisjZW5kaWYKKworCS4gPSBBTElHTihQQUdFX1NJWkUpOworCS5kYXRhLnBhZ2VfYWxpZ25lZCA6IEFUKEFERFIoLmRhdGEucGFnZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CisJCSooLmRhdGEucGFnZV9hbGlnbmVkKQorCQkqKC5kYXRhLmlkdCkKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2XzMyCisJLiA9IEFMSUdOKDMyKTsKKyNlbHNlCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworI2VuZGlmCisJLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOgorCQlBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7CisJCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCisJfQorCisJLyogcmFyZWx5IGNoYW5nZWQgZGF0YSBsaWtlIGNwdSBtYXBzICovCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorCS4gPSBBTElHTigzMik7CisjZWxzZQorCS4gPSBBTElHTihDT05GSUdfWDg2X0lOVEVSTk9ERV9DQUNIRV9CWVRFUyk7CisjZW5kaWYKKwkuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsKKwkJKiguZGF0YS5yZWFkX21vc3RseSkKKworI2lmZGVmIENPTkZJR19YODZfMzIKKwkJLyogRW5kIG9mIGRhdGEgc2VjdGlvbiAqLworCQlfZWRhdGEgPSAuOworI2VuZGlmCisJfQorCisjaWZkZWYgQ09ORklHX1g4Nl82NAorCisjZGVmaW5lIFZTWVNDQUxMX0FERFIgKC0xMCoxMDI0KjEwMjQpCisjZGVmaW5lIFZTWVNDQUxMX1BIWVNfQUREUiAoKExPQURBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFT0YoLmRhdGEucmVhZF9tb3N0bHkpICsgNDA5NSkgJiB+KDQwOTUpKQorI2RlZmluZSBWU1lTQ0FMTF9WSVJUX0FERFIgKChBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVpFT0YoLmRhdGEucmVhZF9tb3N0bHkpICsgNDA5NSkgJiB+KDQwOTUpKQorCisjZGVmaW5lIFZMT0FEX09GRlNFVCAoVlNZU0NBTExfQUREUiAtIFZTWVNDQUxMX1BIWVNfQUREUikKKyNkZWZpbmUgVkxPQUQoeCkgKEFERFIoeCkgLSBWTE9BRF9PRkZTRVQpCisKKyNkZWZpbmUgVlZJUlRfT0ZGU0VUIChWU1lTQ0FMTF9BRERSIC0gVlNZU0NBTExfVklSVF9BRERSKQorI2RlZmluZSBWVklSVCh4KSAoQUREUih4KSAtIFZWSVJUX09GRlNFVCkKKworCS4gPSBWU1lTQ0FMTF9BRERSOworCS52c3lzY2FsbF8wIDogQVQoVlNZU0NBTExfUEhZU19BRERSKSB7CisJCSooLnZzeXNjYWxsXzApCisJfSA6dXNlcgorCisJX192c3lzY2FsbF8wID0gVlNZU0NBTExfVklSVF9BRERSOworCisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworCS52c3lzY2FsbF9mbiA6IEFUKFZMT0FEKC52c3lzY2FsbF9mbikpIHsKKwkJKigudnN5c2NhbGxfZm4pCisJfQorCisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworCS52c3lzY2FsbF9ndG9kX2RhdGEgOiBBVChWTE9BRCgudnN5c2NhbGxfZ3RvZF9kYXRhKSkgeworCQkqKC52c3lzY2FsbF9ndG9kX2RhdGEpCisJfQorCisJdnN5c2NhbGxfZ3RvZF9kYXRhID0gVlZJUlQoLnZzeXNjYWxsX2d0b2RfZGF0YSk7CisJLnZzeXNjYWxsX2Nsb2NrIDogQVQoVkxPQUQoLnZzeXNjYWxsX2Nsb2NrKSkgeworCQkqKC52c3lzY2FsbF9jbG9jaykKKwl9CisJdnN5c2NhbGxfY2xvY2sgPSBWVklSVCgudnN5c2NhbGxfY2xvY2spOworCisKKwkudnN5c2NhbGxfMSBBRERSKC52c3lzY2FsbF8wKSArIDEwMjQ6IEFUKFZMT0FEKC52c3lzY2FsbF8xKSkgeworCQkqKC52c3lzY2FsbF8xKQorCX0KKwkudnN5c2NhbGxfMiBBRERSKC52c3lzY2FsbF8wKSArIDIwNDg6IEFUKFZMT0FEKC52c3lzY2FsbF8yKSkgeworCQkqKC52c3lzY2FsbF8yKQorCX0KKworCS52Z2V0Y3B1X21vZGUgOiBBVChWTE9BRCgudmdldGNwdV9tb2RlKSkgeworCQkqKC52Z2V0Y3B1X21vZGUpCisJfQorCXZnZXRjcHVfbW9kZSA9IFZWSVJUKC52Z2V0Y3B1X21vZGUpOworCisJLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOworCS5qaWZmaWVzIDogQVQoVkxPQUQoLmppZmZpZXMpKSB7CisJCSooLmppZmZpZXMpCisJfQorCWppZmZpZXMgPSBWVklSVCguamlmZmllcyk7CisKKwkudnN5c2NhbGxfMyBBRERSKC52c3lzY2FsbF8wKSArIDMwNzI6IEFUKFZMT0FEKC52c3lzY2FsbF8zKSkgeworCQkqKC52c3lzY2FsbF8zKQorCX0KKworCS4gPSBWU1lTQ0FMTF9WSVJUX0FERFIgKyBQQUdFX1NJWkU7CisKKyN1bmRlZiBWU1lTQ0FMTF9BRERSCisjdW5kZWYgVlNZU0NBTExfUEhZU19BRERSCisjdW5kZWYgVlNZU0NBTExfVklSVF9BRERSCisjdW5kZWYgVkxPQURfT0ZGU0VUCisjdW5kZWYgVkxPQUQKKyN1bmRlZiBWVklSVF9PRkZTRVQKKyN1bmRlZiBWVklSVAorCisjZW5kaWYgLyogQ09ORklHX1g4Nl82NCAqLworCisJLyogaW5pdF90YXNrICovCisJLiA9IEFMSUdOKFRIUkVBRF9TSVpFKTsKKwkuZGF0YS5pbml0X3Rhc2sgOiBBVChBRERSKC5kYXRhLmluaXRfdGFzaykgLSBMT0FEX09GRlNFVCkgeworCQkqKC5kYXRhLmluaXRfdGFzaykKKwl9CisjaWZkZWYgQ09ORklHX1g4Nl82NAorCSA6ZGF0YS5pbml0CisjZW5kaWYKKworCS8qCisJICogc21wX2xvY2tzIG1pZ2h0IGJlIGZyZWVkIGFmdGVyIGluaXQKKwkgKiBzdGFydC9lbmQgbXVzdCBiZSBwYWdlIGFsaWduZWQKKwkgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuc21wX2xvY2tzIDogQVQoQUREUiguc21wX2xvY2tzKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fc21wX2xvY2tzID0gLjsKKwkJKiguc21wX2xvY2tzKQorCQlfX3NtcF9sb2Nrc19lbmQgPSAuOworCQkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwl9CisKKwkvKiBJbml0IGNvZGUgYW5kIGRhdGEgLSB3aWxsIGJlIGZyZWVkIGFmdGVyIGluaXQgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuaW5pdC50ZXh0IDogQVQoQUREUiguaW5pdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7CisJCV9faW5pdF9iZWdpbiA9IC47IC8qIHBhaXJlZCB3aXRoIF9faW5pdF9lbmQgKi8KKwkJX3Npbml0dGV4dCA9IC47CisJCUlOSVRfVEVYVAorCQlfZWluaXR0ZXh0ID0gLjsKKwl9CisKKwkuaW5pdC5kYXRhIDogQVQoQUREUiguaW5pdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7CisJCUlOSVRfREFUQQorCX0KKworCS4gPSBBTElHTigxNik7CisJLmluaXQuc2V0dXAgOiBBVChBRERSKC5pbml0LnNldHVwKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fc2V0dXBfc3RhcnQgPSAuOworCQkqKC5pbml0LnNldHVwKQorCQlfX3NldHVwX2VuZCA9IC47CisJfQorCS5pbml0Y2FsbC5pbml0IDogQVQoQUREUiguaW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX2luaXRjYWxsX3N0YXJ0ID0gLjsKKwkJSU5JVENBTExTCisJCV9faW5pdGNhbGxfZW5kID0gLjsKKwl9CisKKwkuY29uX2luaXRjYWxsLmluaXQgOiBBVChBRERSKC5jb25faW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX2Nvbl9pbml0Y2FsbF9zdGFydCA9IC47CisJCSooLmNvbl9pbml0Y2FsbC5pbml0KQorCQlfX2Nvbl9pbml0Y2FsbF9lbmQgPSAuOworCX0KKworCS54ODZfY3B1X2Rldi5pbml0IDogQVQoQUREUigueDg2X2NwdV9kZXYuaW5pdCkgLSBMT0FEX09GRlNFVCkgeworCQlfX3g4Nl9jcHVfZGV2X3N0YXJ0ID0gLjsKKwkJKigueDg2X2NwdV9kZXYuaW5pdCkKKwkJX194ODZfY3B1X2Rldl9lbmQgPSAuOworCX0KKworCVNFQ1VSSVRZX0lOSVQKKworCS4gPSBBTElHTig4KTsKKwkucGFyYWluc3RydWN0aW9ucyA6IEFUKEFERFIoLnBhcmFpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19wYXJhaW5zdHJ1Y3Rpb25zID0gLjsKKwkJKigucGFyYWluc3RydWN0aW9ucykKKwkJX19wYXJhaW5zdHJ1Y3Rpb25zX2VuZCA9IC47CisJfQorCisJLiA9IEFMSUdOKDgpOworCS5hbHRpbnN0cnVjdGlvbnMgOiBBVChBRERSKC5hbHRpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19hbHRfaW5zdHJ1Y3Rpb25zID0gLjsKKwkJKiguYWx0aW5zdHJ1Y3Rpb25zKQorCQlfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsKKwl9CisKKwkuYWx0aW5zdHJfcmVwbGFjZW1lbnQgOiBBVChBRERSKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgLSBMT0FEX09GRlNFVCkgeworCQkqKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkKKwl9CisKKwkvKgorCSAqIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGgKKwkgKiAgcmVmZXJlbmNlcyBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZQorCSAqLworCS5leGl0LnRleHQgOiBBVChBRERSKC5leGl0LnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJRVhJVF9URVhUCisJfQorCisJLmV4aXQuZGF0YSA6IEFUKEFERFIoLmV4aXQuZGF0YSkgLSBMT0FEX09GRlNFVCkgeworCQlFWElUX0RBVEEKKwl9CisKKyNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuaW5pdC5yYW1mcyA6IEFUKEFERFIoLmluaXQucmFtZnMpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19pbml0cmFtZnNfc3RhcnQgPSAuOworCQkqKC5pbml0LnJhbWZzKQorCQlfX2luaXRyYW1mc19lbmQgPSAuOworCX0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSAmJiBkZWZpbmVkKENPTkZJR19TTVApCisJLyoKKwkgKiBwZXJjcHUgb2Zmc2V0cyBhcmUgemVyby1iYXNlZCBvbiBTTVAuICBQRVJDUFVfVkFERFIoKSBjaGFuZ2VzIHRoZQorCSAqIG91dHB1dCBQSERSLCBzbyB0aGUgbmV4dCBvdXRwdXQgc2VjdGlvbiAtIF9fZGF0YV9ub3NhdmUgLSBzaG91bGQKKwkgKiBzdGFydCBhbm90aGVyIHNlY3Rpb24gZGF0YS5pbml0Mi4gIEFsc28sIHBkYSBzaG91bGQgYmUgYXQgdGhlIGhlYWQgb2YKKwkgKiBwZXJjcHUgYXJlYS4gIFByZWFsbG9jYXRlIGl0IGFuZCBkZWZpbmUgdGhlIHBlcmNwdSBvZmZzZXQgc3ltYm9sCisJICogc28gdGhhdCBpdCBjYW4gYmUgYWNjZXNzZWQgYXMgYSBwZXJjcHUgdmFyaWFibGUuCisJICovCisJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJUEVSQ1BVX1ZBRERSKDAsIDpwZXJjcHUpCisjZWxzZQorCVBFUkNQVShQQUdFX1NJWkUpCisjZW5kaWYKKworCS4gPSBBTElHTihQQUdFX1NJWkUpOworCisJLyogZnJlZWQgYWZ0ZXIgaW5pdCBlbmRzIGhlcmUgKi8KKwkuaW5pdC5lbmQgOiBBVChBRERSKC5pbml0LmVuZCkgLSBMT0FEX09GRlNFVCkgeworCQlfX2luaXRfZW5kID0gLjsKKwl9CisKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLmRhdGFfbm9zYXZlIDogQVQoQUREUiguZGF0YV9ub3NhdmUpIC0gTE9BRF9PRkZTRVQpIHsKKwkJLiA9IEFMSUdOKFBBR0VfU0laRSk7CisJCV9fbm9zYXZlX2JlZ2luID0gLjsKKwkJKiguZGF0YS5ub3NhdmUpCisJCS4gPSBBTElHTihQQUdFX1NJWkUpOworCQlfX25vc2F2ZV9lbmQgPSAuOworCX0gOmRhdGEuaW5pdDIKKwkvKiB1c2UgYW5vdGhlciBzZWN0aW9uIGRhdGEuaW5pdDIsIHNlZSBQRVJDUFVfVkFERFIoKSBhYm92ZSAqLworI2VuZGlmCisKKwkvKiBCU1MgKi8KKwkuID0gQUxJR04oUEFHRV9TSVpFKTsKKwkuYnNzIDogQVQoQUREUiguYnNzKSAtIExPQURfT0ZGU0VUKSB7CisJCV9fYnNzX3N0YXJ0ID0gLjsKKwkJKiguYnNzLnBhZ2VfYWxpZ25lZCkKKwkJKiguYnNzKQorCQkuID0gQUxJR04oNCk7CisJCV9fYnNzX3N0b3AgPSAuOworCX0KKworCS4gPSBBTElHTihQQUdFX1NJWkUpOworCS5icmsgOiBBVChBRERSKC5icmspIC0gTE9BRF9PRkZTRVQpIHsKKwkJX19icmtfYmFzZSA9IC47CisJCS4gKz0gNjQgKiAxMDI0OwkJLyogNjRrIGFsaWdubWVudCBzbG9wIHNwYWNlICovCisJCSooLmJya19yZXNlcnZhdGlvbikJLyogYXJlYXMgYnJrIHVzZXJzIGhhdmUgcmVzZXJ2ZWQgKi8KKwkJX19icmtfbGltaXQgPSAuOworCX0KKworCS5lbmQgOiBBVChBRERSKC5lbmQpIC0gTE9BRF9PRkZTRVQpIHsKKwkJX2VuZCA9IC47CisJfQorCisJLyogU2VjdGlvbnMgdG8gYmUgZGlzY2FyZGVkICovCisJL0RJU0NBUkQvIDogeworCQkqKC5leGl0Y2FsbC5leGl0KQorCQkqKC5laF9mcmFtZSkKKwkJKiguZGlzY2FyZCkKKwl9CisKKyAgICAgICAgU1RBQlNfREVCVUcKKyAgICAgICAgRFdBUkZfREVCVUcKK30KKworCisjaWZkZWYgQ09ORklHX1g4Nl8zMgorQVNTRVJUKChfZW5kIC0gTE9BRF9PRkZTRVQgPD0gS0VSTkVMX0lNQUdFX1NJWkUpLAorICAgICAgICAia2VybmVsIGltYWdlIGJpZ2dlciB0aGFuIEtFUk5FTF9JTUFHRV9TSVpFIikKKyNlbHNlCisvKgorICogUGVyLWNwdSBzeW1ib2xzIHdoaWNoIG5lZWQgdG8gYmUgb2Zmc2V0IGZyb20gX19wZXJfY3B1X2xvYWQKKyAqIGZvciB0aGUgYm9vdCBwcm9jZXNzb3IuCisgKi8KKyNkZWZpbmUgSU5JVF9QRVJfQ1BVKHgpIGluaXRfcGVyX2NwdV9fIyN4ID0gcGVyX2NwdV9fIyN4ICsgX19wZXJfY3B1X2xvYWQKK0lOSVRfUEVSX0NQVShnZHRfcGFnZSk7CitJTklUX1BFUl9DUFUoaXJxX3N0YWNrX3VuaW9uKTsKKworLyoKKyAqIEJ1aWxkLXRpbWUgY2hlY2sgb24gdGhlIGltYWdlIHNpemU6CisgKi8KK0FTU0VSVCgoX2VuZCAtIF90ZXh0IDw9IEtFUk5FTF9JTUFHRV9TSVpFKSwKKwkia2VybmVsIGltYWdlIGJpZ2dlciB0aGFuIEtFUk5FTF9JTUFHRV9TSVpFIikKKworI2lmZGVmIENPTkZJR19TTVAKK0FTU0VSVCgocGVyX2NwdV9faXJxX3N0YWNrX3VuaW9uID09IDApLAorICAgICAgICAiaXJxX3N0YWNrX3VuaW9uIGlzIG5vdCBhdCBzdGFydCBvZiBwZXItY3B1IGFyZWEiKTsKKyNlbmRpZgorCisjZW5kaWYgLyogQ09ORklHX1g4Nl8zMiAqLworCisjaWZkZWYgQ09ORklHX0tFWEVDCisjaW5jbHVkZSA8YXNtL2tleGVjLmg+CisKK0FTU0VSVChrZXhlY19jb250cm9sX2NvZGVfc2l6ZSA8PSBLRVhFQ19DT05UUk9MX0NPREVfTUFYX1NJWkUsCisgICAgICAgImtleGVjIGNvbnRyb2wgY29kZSBzaXplIGlzIHRvbyBiaWciKQorI2VuZGlmCisKZGlmZiAtLWdpdCBhL2FyY2gveDg2L2tlcm5lbC92bWxpbnV4XzMyLmxkcy5TIGIvYXJjaC94ODYva2VybmVsL3ZtbGludXhfMzIubGRzLlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYWQ1MDAuLjAwMDAwMDAKLS0tIGEvYXJjaC94ODYva2VybmVsL3ZtbGludXhfMzIubGRzLlMKKysrIC9kZXYvbnVsbApAQCAtMSwyMjkgKzAsMCBAQAotLyogbGQgc2NyaXB0IHRvIG1ha2UgaTM4NiBMaW51eCBrZXJuZWwKLSAqIFdyaXR0ZW4gYnkgTWFydGluIE1hcmVzIDxtakBhdHJleS5rYXJsaW4ubWZmLmN1bmkuY3o+OwotICoKLSAqIERvbid0IGRlZmluZSBhYnNvbHV0ZSBzeW1ib2xzIHVudGlsIGFuZCB1bmxlc3MgeW91IGtub3cgdGhhdCBzeW1ib2wKLSAqIHZhbHVlIGlzIHNob3VsZCByZW1haW4gY29uc3RhbnQgZXZlbiBpZiBrZXJuZWwgaW1hZ2UgaXMgcmVsb2NhdGVkCi0gKiBhdCBydW4gdGltZS4gQWJzb2x1dGUgc3ltYm9scyBhcmUgbm90IHJlbG9jYXRlZC4gSWYgc3ltYm9sIHZhbHVlIHNob3VsZAotICogY2hhbmdlIGlmIGtlcm5lbCBpcyByZWxvY2F0ZWQsIG1ha2UgdGhlIHN5bWJvbCBzZWN0aW9uIHJlbGF0aXZlIGFuZAotICogcHV0IGl0IGluc2lkZSB0aGUgc2VjdGlvbiBkZWZpbml0aW9uLgotICovCi0KLSNkZWZpbmUgTE9BRF9PRkZTRVQgX19QQUdFX09GRlNFVAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KLSNpbmNsdWRlIDxhc20vdGhyZWFkX2luZm8uaD4KLSNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgotI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgotI2luY2x1ZGUgPGFzbS9ib290Lmg+Ci0KLU9VVFBVVF9GT1JNQVQoImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIsICJlbGYzMi1pMzg2IikKLU9VVFBVVF9BUkNIKGkzODYpCi1FTlRSWShwaHlzX3N0YXJ0dXBfMzIpCi1qaWZmaWVzID0gamlmZmllc182NDsKLQotUEhEUlMgewotCXRleHQgUFRfTE9BRCBGTEFHUyg1KTsJLyogUl9FICovCi0JZGF0YSBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KLQlub3RlIFBUX05PVEUgRkxBR1MoMCk7CS8qIF9fXyAqLwotfQotU0VDVElPTlMKLXsKLSAgLiA9IExPQURfT0ZGU0VUICsgTE9BRF9QSFlTSUNBTF9BRERSOwotICBwaHlzX3N0YXJ0dXBfMzIgPSBzdGFydHVwXzMyIC0gTE9BRF9PRkZTRVQ7Ci0KLSAgLnRleHQuaGVhZCA6IEFUKEFERFIoLnRleHQuaGVhZCkgLSBMT0FEX09GRlNFVCkgewotICAJX3RleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCi0JKigudGV4dC5oZWFkKQotICB9IDp0ZXh0ID0gMHg5MDkwCi0KLSAgLyogcmVhZC1vbmx5ICovCi0gIC50ZXh0IDogQVQoQUREUigudGV4dCkgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOyAvKiBub3QgcmVhbGx5IG5lZWRlZCwgYWxyZWFkeSBwYWdlIGFsaWduZWQgKi8KLQkqKC50ZXh0LnBhZ2VfYWxpZ25lZCkKLQlURVhUX1RFWFQKLQlTQ0hFRF9URVhUCi0JTE9DS19URVhUCi0JS1BST0JFU19URVhUCi0JSVJRRU5UUllfVEVYVAotCSooLmZpeHVwKQotCSooLmdudS53YXJuaW5nKQotICAJX2V0ZXh0ID0gLjsJCQkvKiBFbmQgb2YgdGV4dCBzZWN0aW9uICovCi0gIH0gOnRleHQgPSAweDkwOTAKLQotICBOT1RFUyA6dGV4dCA6bm90ZQotCi0gIC4gPSBBTElHTigxNik7CQkvKiBFeGNlcHRpb24gdGFibGUgKi8KLSAgX19leF90YWJsZSA6IEFUKEFERFIoX19leF90YWJsZSkgLSBMT0FEX09GRlNFVCkgewotICAJX19zdGFydF9fX2V4X3RhYmxlID0gLjsKLQkgKihfX2V4X3RhYmxlKQotICAJX19zdG9wX19fZXhfdGFibGUgPSAuOwotICB9IDp0ZXh0ID0gMHg5MDkwCi0KLSAgUk9EQVRBCi0KLSAgLyogd3JpdGVhYmxlICovCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuZGF0YSA6IEFUKEFERFIoLmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsJLyogRGF0YSAqLwotCURBVEFfREFUQQotCUNPTlNUUlVDVE9SUwotCX0gOmRhdGEKLQotICAuID0gQUxJR04oUEFHRV9TSVpFKTsKLSAgLmRhdGFfbm9zYXZlIDogQVQoQUREUiguZGF0YV9ub3NhdmUpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fbm9zYXZlX2JlZ2luID0gLjsKLQkqKC5kYXRhLm5vc2F2ZSkKLSAgCS4gPSBBTElHTihQQUdFX1NJWkUpOwotICAJX19ub3NhdmVfZW5kID0gLjsKLSAgfQotCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuZGF0YS5wYWdlX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLnBhZ2VfYWxpZ25lZCkgLSBMT0FEX09GRlNFVCkgewotCSooLmRhdGEucGFnZV9hbGlnbmVkKQotCSooLmRhdGEuaWR0KQotICB9Ci0KLSAgLiA9IEFMSUdOKDMyKTsKLSAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7Ci0JKiguZGF0YS5jYWNoZWxpbmVfYWxpZ25lZCkKLSAgfQotCi0gIC8qIHJhcmVseSBjaGFuZ2VkIGRhdGEgbGlrZSBjcHUgbWFwcyAqLwotICAuID0gQUxJR04oMzIpOwotICAuZGF0YS5yZWFkX21vc3RseSA6IEFUKEFERFIoLmRhdGEucmVhZF9tb3N0bHkpIC0gTE9BRF9PRkZTRVQpIHsKLQkqKC5kYXRhLnJlYWRfbW9zdGx5KQotCV9lZGF0YSA9IC47CQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCi0gIH0KLQotICAuID0gQUxJR04oVEhSRUFEX1NJWkUpOwkvKiBpbml0X3Rhc2sgKi8KLSAgLmRhdGEuaW5pdF90YXNrIDogQVQoQUREUiguZGF0YS5pbml0X3Rhc2spIC0gTE9BRF9PRkZTRVQpIHsKLQkqKC5kYXRhLmluaXRfdGFzaykKLSAgfQotCi0gIC8qIG1pZ2h0IGdldCBmcmVlZCBhZnRlciBpbml0ICovCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuc21wX2xvY2tzIDogQVQoQUREUiguc21wX2xvY2tzKSAtIExPQURfT0ZGU0VUKSB7Ci0gIAlfX3NtcF9sb2NrcyA9IC47Ci0JKiguc21wX2xvY2tzKQotCV9fc21wX2xvY2tzX2VuZCA9IC47Ci0gIH0KLSAgLyogd2lsbCBiZSBmcmVlZCBhZnRlciBpbml0Ci0gICAqIEZvbGxvd2luZyBBTElHTigpIGlzIHJlcXVpcmVkIHRvIG1ha2Ugc3VyZSBubyBvdGhlciBkYXRhIGZhbGxzIG9uIHRoZQotICAgKiBzYW1lIHBhZ2Ugd2hlcmUgX19zbXBfYWx0X2VuZCBpcyBwb2ludGluZyBhcyB0aGF0IHBhZ2UgbWlnaHQgYmUgZnJlZWQKLSAgICogYWZ0ZXIgYm9vdC4gQWx3YXlzIG1ha2Ugc3VyZSB0aGF0IEFMSUdOKCkgZGlyZWN0aXZlIGlzIHByZXNlbnQgYWZ0ZXIKLSAgICogdGhlIHNlY3Rpb24gd2hpY2ggY29udGFpbnMgX19zbXBfYWx0X2VuZC4KLSAgICovCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotCi0gIC8qIHdpbGwgYmUgZnJlZWQgYWZ0ZXIgaW5pdCAqLwotICAuID0gQUxJR04oUEFHRV9TSVpFKTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwotICAuaW5pdC50ZXh0IDogQVQoQUREUiguaW5pdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0gIAlfX2luaXRfYmVnaW4gPSAuOwotCV9zaW5pdHRleHQgPSAuOwotCUlOSVRfVEVYVAotCV9laW5pdHRleHQgPSAuOwotICB9Ci0gIC5pbml0LmRhdGEgOiBBVChBRERSKC5pbml0LmRhdGEpIC0gTE9BRF9PRkZTRVQpIHsKLQlJTklUX0RBVEEKLSAgfQotICAuID0gQUxJR04oMTYpOwotICAuaW5pdC5zZXR1cCA6IEFUKEFERFIoLmluaXQuc2V0dXApIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fc2V0dXBfc3RhcnQgPSAuOwotCSooLmluaXQuc2V0dXApCi0gIAlfX3NldHVwX2VuZCA9IC47Ci0gICB9Ci0gIC5pbml0Y2FsbC5pbml0IDogQVQoQUREUiguaW5pdGNhbGwuaW5pdCkgLSBMT0FEX09GRlNFVCkgewotICAJX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JSU5JVENBTExTCi0gIAlfX2luaXRjYWxsX2VuZCA9IC47Ci0gIH0KLSAgLmNvbl9pbml0Y2FsbC5pbml0IDogQVQoQUREUiguY29uX2luaXRjYWxsLmluaXQpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fY29uX2luaXRjYWxsX3N0YXJ0ID0gLjsKLQkqKC5jb25faW5pdGNhbGwuaW5pdCkKLSAgCV9fY29uX2luaXRjYWxsX2VuZCA9IC47Ci0gIH0KLSAgLng4Nl9jcHVfZGV2LmluaXQgOiBBVChBRERSKC54ODZfY3B1X2Rldi5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX194ODZfY3B1X2Rldl9zdGFydCA9IC47Ci0JKigueDg2X2NwdV9kZXYuaW5pdCkKLQlfX3g4Nl9jcHVfZGV2X2VuZCA9IC47Ci0gIH0KLSAgU0VDVVJJVFlfSU5JVAotICAuID0gQUxJR04oNCk7Ci0gIC5hbHRpbnN0cnVjdGlvbnMgOiBBVChBRERSKC5hbHRpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fYWx0X2luc3RydWN0aW9ucyA9IC47Ci0JKiguYWx0aW5zdHJ1Y3Rpb25zKQotCV9fYWx0X2luc3RydWN0aW9uc19lbmQgPSAuOwotICB9Ci0gIC5hbHRpbnN0cl9yZXBsYWNlbWVudCA6IEFUKEFERFIoLmFsdGluc3RyX3JlcGxhY2VtZW50KSAtIExPQURfT0ZGU0VUKSB7Ci0JKiguYWx0aW5zdHJfcmVwbGFjZW1lbnQpCi0gIH0KLSAgLiA9IEFMSUdOKDQpOwotICAucGFyYWluc3RydWN0aW9ucyA6IEFUKEFERFIoLnBhcmFpbnN0cnVjdGlvbnMpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fcGFyYWluc3RydWN0aW9ucyA9IC47Ci0JKigucGFyYWluc3RydWN0aW9ucykKLSAgCV9fcGFyYWluc3RydWN0aW9uc19lbmQgPSAuOwotICB9Ci0gIC8qIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcwotICAgICBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZSAqLwotICAuZXhpdC50ZXh0IDogQVQoQUREUiguZXhpdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0JRVhJVF9URVhUCi0gIH0KLSAgLmV4aXQuZGF0YSA6IEFUKEFERFIoLmV4aXQuZGF0YSkgLSBMT0FEX09GRlNFVCkgewotCUVYSVRfREFUQQotICB9Ci0jaWYgZGVmaW5lZChDT05GSUdfQkxLX0RFVl9JTklUUkQpCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICAuaW5pdC5yYW1mcyA6IEFUKEFERFIoLmluaXQucmFtZnMpIC0gTE9BRF9PRkZTRVQpIHsKLQlfX2luaXRyYW1mc19zdGFydCA9IC47Ci0JKiguaW5pdC5yYW1mcykKLQlfX2luaXRyYW1mc19lbmQgPSAuOwotICB9Ci0jZW5kaWYKLSAgUEVSQ1BVKFBBR0VfU0laRSkKLSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0gIC8qIGZyZWVkIGFmdGVyIGluaXQgZW5kcyBoZXJlICovCi0KLSAgLmJzcyA6IEFUKEFERFIoLmJzcykgLSBMT0FEX09GRlNFVCkgewotCV9faW5pdF9lbmQgPSAuOwotCV9fYnNzX3N0YXJ0ID0gLjsJCS8qIEJTUyAqLwotCSooLmJzcy5wYWdlX2FsaWduZWQpCi0JKiguYnNzKQotCS4gPSBBTElHTig0KTsKLQlfX2Jzc19zdG9wID0gLjsKLSAgfQotCi0gIC5icmsgOiBBVChBRERSKC5icmspIC0gTE9BRF9PRkZTRVQpIHsKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX2Jya19iYXNlID0gLiA7Ci0gCS4gKz0gNjQgKiAxMDI0IDsJLyogNjRrIGFsaWdubWVudCBzbG9wIHNwYWNlICovCi0JKiguYnJrX3Jlc2VydmF0aW9uKQkvKiBhcmVhcyBicmsgdXNlcnMgaGF2ZSByZXNlcnZlZCAqLwotCV9fYnJrX2xpbWl0ID0gLiA7Ci0gIH0KLQotICAuZW5kIDogQVQoQUREUiguZW5kKSAtIExPQURfT0ZGU0VUKSB7Ci0JX2VuZCA9IC4gOwotICB9Ci0KLSAgLyogU2VjdGlvbnMgdG8gYmUgZGlzY2FyZGVkICovCi0gIC9ESVNDQVJELyA6IHsKLQkqKC5leGl0Y2FsbC5leGl0KQotCSooLmRpc2NhcmQpCi0JfQotCi0gIFNUQUJTX0RFQlVHCi0KLSAgRFdBUkZfREVCVUcKLX0KLQotLyoKLSAqIEJ1aWxkLXRpbWUgY2hlY2sgb24gdGhlIGltYWdlIHNpemU6Ci0gKi8KLUFTU0VSVCgoX2VuZCAtIExPQURfT0ZGU0VUIDw9IEtFUk5FTF9JTUFHRV9TSVpFKSwKLQkia2VybmVsIGltYWdlIGJpZ2dlciB0aGFuIEtFUk5FTF9JTUFHRV9TSVpFIikKLQotI2lmZGVmIENPTkZJR19LRVhFQwotLyogTGluayB0aW1lIGNoZWNrcyAqLwotI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgotCi1BU1NFUlQoa2V4ZWNfY29udHJvbF9jb2RlX3NpemUgPD0gS0VYRUNfQ09OVFJPTF9DT0RFX01BWF9TSVpFLAotICAgICAgICJrZXhlYyBjb250cm9sIGNvZGUgc2l6ZSBpcyB0b28gYmlnIikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZtbGludXhfNjQubGRzLlMgYi9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF82NC5sZHMuUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg3NDI1MC4uMDAwMDAwMAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdm1saW51eF82NC5sZHMuUworKysgL2Rldi9udWxsCkBAIC0xLDI5OCArMCwwIEBACi0vKiBsZCBzY3JpcHQgdG8gbWFrZSB4ODYtNjQgTGludXgga2VybmVsCi0gKiBXcml0dGVuIGJ5IE1hcnRpbiBNYXJlcyA8bWpAYXRyZXkua2FybGluLm1mZi5jdW5pLmN6PjsKLSAqLwotCi0jZGVmaW5lIExPQURfT0ZGU0VUIF9fU1RBUlRfS0VSTkVMX21hcAotCi0jaW5jbHVkZSA8YXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaD4KLSNpbmNsdWRlIDxhc20vYXNtLW9mZnNldHMuaD4KLSNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgotCi0jdW5kZWYgaTM4NgkvKiBpbiBjYXNlIHRoZSBwcmVwcm9jZXNzb3IgaXMgYSAzMmJpdCBvbmUgKi8KLQotT1VUUFVUX0ZPUk1BVCgiZWxmNjQteDg2LTY0IiwgImVsZjY0LXg4Ni02NCIsICJlbGY2NC14ODYtNjQiKQotT1VUUFVUX0FSQ0goaTM4Njp4ODYtNjQpCi1FTlRSWShwaHlzX3N0YXJ0dXBfNjQpCi1qaWZmaWVzXzY0ID0gamlmZmllczsKLVBIRFJTIHsKLQl0ZXh0IFBUX0xPQUQgRkxBR1MoNSk7CS8qIFJfRSAqLwotCWRhdGEgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCi0JdXNlciBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KLQlkYXRhLmluaXQgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCi0jaWZkZWYgQ09ORklHX1NNUAotCXBlcmNwdSBQVF9MT0FEIEZMQUdTKDcpOwkvKiBSV0UgKi8KLSNlbmRpZgotCWRhdGEuaW5pdDIgUFRfTE9BRCBGTEFHUyg3KTsJLyogUldFICovCi0Jbm90ZSBQVF9OT1RFIEZMQUdTKDApOwkvKiBfX18gKi8KLX0KLVNFQ1RJT05TCi17Ci0gIC4gPSBfX1NUQVJUX0tFUk5FTDsKLSAgcGh5c19zdGFydHVwXzY0ID0gc3RhcnR1cF82NCAtIExPQURfT0ZGU0VUOwotICAudGV4dCA6ICBBVChBRERSKC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX3RleHQgPSAuOwkJCS8qIFRleHQgYW5kIHJlYWQtb25seSBkYXRhICovCi0JLyogRmlyc3QgdGhlIGNvZGUgdGhhdCBoYXMgdG8gYmUgZmlyc3QgZm9yIGJvb3RzdHJhcHBpbmcgKi8KLQkqKC50ZXh0LmhlYWQpCi0JX3N0ZXh0ID0gLjsKLQkvKiBUaGVuIHRoZSByZXN0ICovCi0JVEVYVF9URVhUCi0JU0NIRURfVEVYVAotCUxPQ0tfVEVYVAotCUtQUk9CRVNfVEVYVAotCUlSUUVOVFJZX1RFWFQKLQkqKC5maXh1cCkKLQkqKC5nbnUud2FybmluZykKLQlfZXRleHQgPSAuOwkJLyogRW5kIG9mIHRleHQgc2VjdGlvbiAqLwotICB9IDp0ZXh0ID0gMHg5MDkwCi0KLSAgTk9URVMgOnRleHQgOm5vdGUKLQotICAuID0gQUxJR04oMTYpOwkJLyogRXhjZXB0aW9uIHRhYmxlICovCi0gIF9fZXhfdGFibGUgOiBBVChBRERSKF9fZXhfdGFibGUpIC0gTE9BRF9PRkZTRVQpIHsKLSAgCV9fc3RhcnRfX19leF90YWJsZSA9IC47Ci0JICooX19leF90YWJsZSkKLSAgCV9fc3RvcF9fX2V4X3RhYmxlID0gLjsKLSAgfSA6dGV4dCA9IDB4OTA5MAotCi0gIFJPREFUQQotCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwkJLyogQWxpZ24gZGF0YSBzZWdtZW50IHRvIHBhZ2Ugc2l6ZSBib3VuZGFyeSAqLwotCQkJCS8qIERhdGEgKi8KLSAgLmRhdGEgOiBBVChBRERSKC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7Ci0JREFUQV9EQVRBCi0JQ09OU1RSVUNUT1JTCi0JX2VkYXRhID0gLjsJCQkvKiBFbmQgb2YgZGF0YSBzZWN0aW9uICovCi0JfSA6ZGF0YQotCi0KLSAgLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLmNhY2hlbGluZV9hbGlnbmVkKSAtIExPQURfT0ZGU0VUKSB7Ci0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JLiA9IEFMSUdOKENPTkZJR19YODZfTDFfQ0FDSEVfQllURVMpOwotCSooLmRhdGEuY2FjaGVsaW5lX2FsaWduZWQpCi0gIH0KLSAgLiA9IEFMSUdOKENPTkZJR19YODZfSU5URVJOT0RFX0NBQ0hFX0JZVEVTKTsKLSAgLmRhdGEucmVhZF9tb3N0bHkgOiBBVChBRERSKC5kYXRhLnJlYWRfbW9zdGx5KSAtIExPQURfT0ZGU0VUKSB7Ci0gIAkqKC5kYXRhLnJlYWRfbW9zdGx5KQotICB9Ci0KLSNkZWZpbmUgVlNZU0NBTExfQUREUiAoLTEwKjEwMjQqMTAyNCkKLSNkZWZpbmUgVlNZU0NBTExfUEhZU19BRERSICgoTE9BREFERFIoLmRhdGEucmVhZF9tb3N0bHkpICsgU0laRU9GKC5kYXRhLnJlYWRfbW9zdGx5KSArIDQwOTUpICYgfig0MDk1KSkKLSNkZWZpbmUgVlNZU0NBTExfVklSVF9BRERSICgoQUREUiguZGF0YS5yZWFkX21vc3RseSkgKyBTSVpFT0YoLmRhdGEucmVhZF9tb3N0bHkpICsgNDA5NSkgJiB+KDQwOTUpKQotCi0jZGVmaW5lIFZMT0FEX09GRlNFVCAoVlNZU0NBTExfQUREUiAtIFZTWVNDQUxMX1BIWVNfQUREUikKLSNkZWZpbmUgVkxPQUQoeCkgKEFERFIoeCkgLSBWTE9BRF9PRkZTRVQpCi0KLSNkZWZpbmUgVlZJUlRfT0ZGU0VUIChWU1lTQ0FMTF9BRERSIC0gVlNZU0NBTExfVklSVF9BRERSKQotI2RlZmluZSBWVklSVCh4KSAoQUREUih4KSAtIFZWSVJUX09GRlNFVCkKLQotICAuID0gVlNZU0NBTExfQUREUjsKLSAgLnZzeXNjYWxsXzAgOgkgQVQoVlNZU0NBTExfUEhZU19BRERSKSB7ICooLnZzeXNjYWxsXzApIH0gOnVzZXIKLSAgX192c3lzY2FsbF8wID0gVlNZU0NBTExfVklSVF9BRERSOwotCi0gIC4gPSBBTElHTihDT05GSUdfWDg2X0wxX0NBQ0hFX0JZVEVTKTsKLSAgLnZzeXNjYWxsX2ZuIDogQVQoVkxPQUQoLnZzeXNjYWxsX2ZuKSkgeyAqKC52c3lzY2FsbF9mbikgfQotICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7Ci0gIC52c3lzY2FsbF9ndG9kX2RhdGEgOiBBVChWTE9BRCgudnN5c2NhbGxfZ3RvZF9kYXRhKSkKLQkJeyAqKC52c3lzY2FsbF9ndG9kX2RhdGEpIH0KLSAgdnN5c2NhbGxfZ3RvZF9kYXRhID0gVlZJUlQoLnZzeXNjYWxsX2d0b2RfZGF0YSk7Ci0gIC52c3lzY2FsbF9jbG9jayA6IEFUKFZMT0FEKC52c3lzY2FsbF9jbG9jaykpCi0JCXsgKigudnN5c2NhbGxfY2xvY2spIH0KLSAgdnN5c2NhbGxfY2xvY2sgPSBWVklSVCgudnN5c2NhbGxfY2xvY2spOwotCi0KLSAgLnZzeXNjYWxsXzEgQUREUigudnN5c2NhbGxfMCkgKyAxMDI0OiBBVChWTE9BRCgudnN5c2NhbGxfMSkpCi0JCXsgKigudnN5c2NhbGxfMSkgfQotICAudnN5c2NhbGxfMiBBRERSKC52c3lzY2FsbF8wKSArIDIwNDg6IEFUKFZMT0FEKC52c3lzY2FsbF8yKSkKLQkJeyAqKC52c3lzY2FsbF8yKSB9Ci0KLSAgLnZnZXRjcHVfbW9kZSA6IEFUKFZMT0FEKC52Z2V0Y3B1X21vZGUpKSB7ICooLnZnZXRjcHVfbW9kZSkgfQotICB2Z2V0Y3B1X21vZGUgPSBWVklSVCgudmdldGNwdV9tb2RlKTsKLQotICAuID0gQUxJR04oQ09ORklHX1g4Nl9MMV9DQUNIRV9CWVRFUyk7Ci0gIC5qaWZmaWVzIDogQVQoVkxPQUQoLmppZmZpZXMpKSB7ICooLmppZmZpZXMpIH0KLSAgamlmZmllcyA9IFZWSVJUKC5qaWZmaWVzKTsKLQotICAudnN5c2NhbGxfMyBBRERSKC52c3lzY2FsbF8wKSArIDMwNzI6IEFUKFZMT0FEKC52c3lzY2FsbF8zKSkKLQkJeyAqKC52c3lzY2FsbF8zKSB9Ci0KLSAgLiA9IFZTWVNDQUxMX1ZJUlRfQUREUiArIFBBR0VfU0laRTsKLQotI3VuZGVmIFZTWVNDQUxMX0FERFIKLSN1bmRlZiBWU1lTQ0FMTF9QSFlTX0FERFIKLSN1bmRlZiBWU1lTQ0FMTF9WSVJUX0FERFIKLSN1bmRlZiBWTE9BRF9PRkZTRVQKLSN1bmRlZiBWTE9BRAotI3VuZGVmIFZWSVJUX09GRlNFVAotI3VuZGVmIFZWSVJUCi0KLSAgLmRhdGEuaW5pdF90YXNrIDogQVQoQUREUiguZGF0YS5pbml0X3Rhc2spIC0gTE9BRF9PRkZTRVQpIHsKLQkuID0gQUxJR04oVEhSRUFEX1NJWkUpOwkvKiBpbml0X3Rhc2sgKi8KLQkqKC5kYXRhLmluaXRfdGFzaykKLSAgfTpkYXRhLmluaXQKLQotICAuZGF0YS5wYWdlX2FsaWduZWQgOiBBVChBRERSKC5kYXRhLnBhZ2VfYWxpZ25lZCkgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCSooLmRhdGEucGFnZV9hbGlnbmVkKQotICB9Ci0KLSAgLnNtcF9sb2NrcyA6IEFUKEFERFIoLnNtcF9sb2NrcykgLSBMT0FEX09GRlNFVCkgewotCS8qIG1pZ2h0IGdldCBmcmVlZCBhZnRlciBpbml0ICovCi0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JX19zbXBfYWx0X2JlZ2luID0gLjsKLQlfX3NtcF9sb2NrcyA9IC47Ci0JKiguc21wX2xvY2tzKQotCV9fc21wX2xvY2tzX2VuZCA9IC47Ci0JLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0JX19zbXBfYWx0X2VuZCA9IC47Ci0gIH0KLQotICAuID0gQUxJR04oUEFHRV9TSVpFKTsJCS8qIEluaXQgY29kZSBhbmQgZGF0YSAqLwotICBfX2luaXRfYmVnaW4gPSAuOwkvKiBwYWlyZWQgd2l0aCBfX2luaXRfZW5kICovCi0gIC5pbml0LnRleHQgOiBBVChBRERSKC5pbml0LnRleHQpIC0gTE9BRF9PRkZTRVQpIHsKLQlfc2luaXR0ZXh0ID0gLjsKLQlJTklUX1RFWFQKLQlfZWluaXR0ZXh0ID0gLjsKLSAgfQotICAuaW5pdC5kYXRhIDogQVQoQUREUiguaW5pdC5kYXRhKSAtIExPQURfT0ZGU0VUKSB7Ci0JX19pbml0ZGF0YV9iZWdpbiA9IC47Ci0JSU5JVF9EQVRBCi0JX19pbml0ZGF0YV9lbmQgPSAuOwotICAgfQotCi0gIC5pbml0LnNldHVwIDogQVQoQUREUiguaW5pdC5zZXR1cCkgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTigxNik7Ci0JX19zZXR1cF9zdGFydCA9IC47Ci0JKiguaW5pdC5zZXR1cCkKLQlfX3NldHVwX2VuZCA9IC47Ci0gIH0KLSAgLmluaXRjYWxsLmluaXQgOiBBVChBRERSKC5pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX19pbml0Y2FsbF9zdGFydCA9IC47Ci0JSU5JVENBTExTCi0JX19pbml0Y2FsbF9lbmQgPSAuOwotICB9Ci0gIC5jb25faW5pdGNhbGwuaW5pdCA6IEFUKEFERFIoLmNvbl9pbml0Y2FsbC5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX19jb25faW5pdGNhbGxfc3RhcnQgPSAuOwotCSooLmNvbl9pbml0Y2FsbC5pbml0KQotCV9fY29uX2luaXRjYWxsX2VuZCA9IC47Ci0gIH0KLSAgLng4Nl9jcHVfZGV2LmluaXQgOiBBVChBRERSKC54ODZfY3B1X2Rldi5pbml0KSAtIExPQURfT0ZGU0VUKSB7Ci0JX194ODZfY3B1X2Rldl9zdGFydCA9IC47Ci0JKigueDg2X2NwdV9kZXYuaW5pdCkKLQlfX3g4Nl9jcHVfZGV2X2VuZCA9IC47Ci0gIH0KLSAgU0VDVVJJVFlfSU5JVAotCi0gIC4gPSBBTElHTig4KTsKLSAgLnBhcmFpbnN0cnVjdGlvbnMgOiBBVChBRERSKC5wYXJhaW5zdHJ1Y3Rpb25zKSAtIExPQURfT0ZGU0VUKSB7Ci0JX19wYXJhaW5zdHJ1Y3Rpb25zID0gLjsKLSAgICAgICAqKC5wYXJhaW5zdHJ1Y3Rpb25zKQotCV9fcGFyYWluc3RydWN0aW9uc19lbmQgPSAuOwotICB9Ci0KLSAgLmFsdGluc3RydWN0aW9ucyA6IEFUKEFERFIoLmFsdGluc3RydWN0aW9ucykgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTig4KTsKLQlfX2FsdF9pbnN0cnVjdGlvbnMgPSAuOwotCSooLmFsdGluc3RydWN0aW9ucykKLQlfX2FsdF9pbnN0cnVjdGlvbnNfZW5kID0gLjsKLSAgfQotICAuYWx0aW5zdHJfcmVwbGFjZW1lbnQgOiBBVChBRERSKC5hbHRpbnN0cl9yZXBsYWNlbWVudCkgLSBMT0FEX09GRlNFVCkgewotCSooLmFsdGluc3RyX3JlcGxhY2VtZW50KQotICB9Ci0gIC8qIC5leGl0LnRleHQgaXMgZGlzY2FyZCBhdCBydW50aW1lLCBub3QgbGluayB0aW1lLCB0byBkZWFsIHdpdGggcmVmZXJlbmNlcwotICAgICBmcm9tIC5hbHRpbnN0cnVjdGlvbnMgYW5kIC5laF9mcmFtZSAqLwotICAuZXhpdC50ZXh0IDogQVQoQUREUiguZXhpdC50ZXh0KSAtIExPQURfT0ZGU0VUKSB7Ci0JRVhJVF9URVhUCi0gIH0KLSAgLmV4aXQuZGF0YSA6IEFUKEFERFIoLmV4aXQuZGF0YSkgLSBMT0FEX09GRlNFVCkgewotCUVYSVRfREFUQQotICB9Ci0KLSNpZmRlZiBDT05GSUdfQkxLX0RFVl9JTklUUkQKLSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0gIC5pbml0LnJhbWZzIDogQVQoQUREUiguaW5pdC5yYW1mcykgLSBMT0FEX09GRlNFVCkgewotCV9faW5pdHJhbWZzX3N0YXJ0ID0gLjsKLQkqKC5pbml0LnJhbWZzKQotCV9faW5pdHJhbWZzX2VuZCA9IC47Ci0gIH0KLSNlbmRpZgotCi0jaWZkZWYgQ09ORklHX1NNUAotICAvKgotICAgKiBwZXJjcHUgb2Zmc2V0cyBhcmUgemVyby1iYXNlZCBvbiBTTVAuICBQRVJDUFVfVkFERFIoKSBjaGFuZ2VzIHRoZQotICAgKiBvdXRwdXQgUEhEUiwgc28gdGhlIG5leHQgb3V0cHV0IHNlY3Rpb24gLSBfX2RhdGFfbm9zYXZlIC0gc2hvdWxkCi0gICAqIHN0YXJ0IGFub3RoZXIgc2VjdGlvbiBkYXRhLmluaXQyLiAgQWxzbywgcGRhIHNob3VsZCBiZSBhdCB0aGUgaGVhZCBvZgotICAgKiBwZXJjcHUgYXJlYS4gIFByZWFsbG9jYXRlIGl0IGFuZCBkZWZpbmUgdGhlIHBlcmNwdSBvZmZzZXQgc3ltYm9sCi0gICAqIHNvIHRoYXQgaXQgY2FuIGJlIGFjY2Vzc2VkIGFzIGEgcGVyY3B1IHZhcmlhYmxlLgotICAgKi8KLSAgLiA9IEFMSUdOKFBBR0VfU0laRSk7Ci0gIFBFUkNQVV9WQUREUigwLCA6cGVyY3B1KQotI2Vsc2UKLSAgUEVSQ1BVKFBBR0VfU0laRSkKLSNlbmRpZgotCi0gIC4gPSBBTElHTihQQUdFX1NJWkUpOwotICBfX2luaXRfZW5kID0gLjsKLQotICAuZGF0YV9ub3NhdmUgOiBBVChBRERSKC5kYXRhX25vc2F2ZSkgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCV9fbm9zYXZlX2JlZ2luID0gLjsKLQkqKC5kYXRhLm5vc2F2ZSkKLQkuID0gQUxJR04oUEFHRV9TSVpFKTsKLQlfX25vc2F2ZV9lbmQgPSAuOwotICB9IDpkYXRhLmluaXQyIC8qIHVzZSBhbm90aGVyIHNlY3Rpb24gZGF0YS5pbml0Miwgc2VlIFBFUkNQVV9WQUREUigpIGFib3ZlICovCi0KLSAgLmJzcyA6IEFUKEFERFIoLmJzcykgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCV9fYnNzX3N0YXJ0ID0gLjsJCS8qIEJTUyAqLwotCSooLmJzcy5wYWdlX2FsaWduZWQpCi0JKiguYnNzKQotCV9fYnNzX3N0b3AgPSAuOwotICB9Ci0KLSAgLmJyayA6IEFUKEFERFIoLmJyaykgLSBMT0FEX09GRlNFVCkgewotCS4gPSBBTElHTihQQUdFX1NJWkUpOwotCV9fYnJrX2Jhc2UgPSAuIDsKLSAJLiArPSA2NCAqIDEwMjQgOwkvKiA2NGsgYWxpZ25tZW50IHNsb3Agc3BhY2UgKi8KLQkqKC5icmtfcmVzZXJ2YXRpb24pCS8qIGFyZWFzIGJyayB1c2VycyBoYXZlIHJlc2VydmVkICovCi0JX19icmtfbGltaXQgPSAuIDsKLSAgfQotCi0gIF9lbmQgPSAuIDsKLQotICAvKiBTZWN0aW9ucyB0byBiZSBkaXNjYXJkZWQgKi8KLSAgL0RJU0NBUkQvIDogewotCSooLmV4aXRjYWxsLmV4aXQpCi0JKiguZWhfZnJhbWUpCi0JKiguZGlzY2FyZCkKLQl9Ci0KLSAgU1RBQlNfREVCVUcKLQotICBEV0FSRl9ERUJVRwotfQotCi0gLyoKLSAgKiBQZXItY3B1IHN5bWJvbHMgd2hpY2ggbmVlZCB0byBiZSBvZmZzZXQgZnJvbSBfX3Blcl9jcHVfbG9hZAotICAqIGZvciB0aGUgYm9vdCBwcm9jZXNzb3IuCi0gICovCi0jZGVmaW5lIElOSVRfUEVSX0NQVSh4KSBpbml0X3Blcl9jcHVfXyMjeCA9IHBlcl9jcHVfXyMjeCArIF9fcGVyX2NwdV9sb2FkCi1JTklUX1BFUl9DUFUoZ2R0X3BhZ2UpOwotSU5JVF9QRVJfQ1BVKGlycV9zdGFja191bmlvbik7Ci0KLS8qCi0gKiBCdWlsZC10aW1lIGNoZWNrIG9uIHRoZSBpbWFnZSBzaXplOgotICovCi1BU1NFUlQoKF9lbmQgLSBfdGV4dCA8PSBLRVJORUxfSU1BR0VfU0laRSksCi0JImtlcm5lbCBpbWFnZSBiaWdnZXIgdGhhbiBLRVJORUxfSU1BR0VfU0laRSIpCi0KLSNpZmRlZiBDT05GSUdfU01QCi1BU1NFUlQoKHBlcl9jcHVfX2lycV9zdGFja191bmlvbiA9PSAwKSwKLSAgICAgICAgImlycV9zdGFja191bmlvbiBpcyBub3QgYXQgc3RhcnQgb2YgcGVyLWNwdSBhcmVhIik7Ci0jZW5kaWYKLQotI2lmZGVmIENPTkZJR19LRVhFQwotI2luY2x1ZGUgPGFzbS9rZXhlYy5oPgotCi1BU1NFUlQoa2V4ZWNfY29udHJvbF9jb2RlX3NpemUgPD0gS0VYRUNfQ09OVFJPTF9DT0RFX01BWF9TSVpFLAotICAgICAgICJrZXhlYyBjb250cm9sIGNvZGUgc2l6ZSBpcyB0b28gYmlnIikKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYva2VybmVsL3ZzeXNjYWxsXzY0LmMgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwppbmRleCA0NDE1M2FmLi4yNWVlMDZhIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYworKysgYi9hcmNoL3g4Ni9rZXJuZWwvdnN5c2NhbGxfNjQuYwpAQCAtMTMyLDE1ICsxMzIsNyBAQAogCQkJcmV0dXJuOwogCQl9CiAKLQkJLyoKLQkJICogU3Vycm91bmQgdGhlIFJEVFNDIGJ5IGJhcnJpZXJzLCB0byBtYWtlIHN1cmUgaXQncyBub3QKLQkJICogc3BlY3VsYXRlZCB0byBvdXRzaWRlIHRoZSBzZXFsb2NrIGNyaXRpY2FsIHNlY3Rpb24gYW5kCi0JCSAqIGRvZXMgbm90IGNhdXNlIHRpbWUgd2FycHM6Ci0JCSAqLwotCQlyZHRzY19iYXJyaWVyKCk7CiAJCW5vdyA9IHZyZWFkKCk7Ci0JCXJkdHNjX2JhcnJpZXIoKTsKLQogCQliYXNlID0gX192c3lzY2FsbF9ndG9kX2RhdGEuY2xvY2suY3ljbGVfbGFzdDsKIAkJbWFzayA9IF9fdnN5c2NhbGxfZ3RvZF9kYXRhLmNsb2NrLm1hc2s7CiAJCW11bHQgPSBfX3ZzeXNjYWxsX2d0b2RfZGF0YS5jbG9jay5tdWx0OwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYyBiL2FyY2gveDg2L2xndWVzdC9ib290LmMKaW5kZXggMzNhOTNiNC4uNGUwYzI2NSAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbGd1ZXN0L2Jvb3QuYworKysgYi9hcmNoL3g4Ni9sZ3Vlc3QvYm9vdC5jCkBAIC0xNjcsMTAgKzE2NywxNiBAQAogCiAvKiBXaGVuIGxhenkgbW9kZSBpcyB0dXJuZWQgb2ZmIHJlc2V0IHRoZSBwZXItY3B1IGxhenkgbW9kZSB2YXJpYWJsZSBhbmQgdGhlbgogICogaXNzdWUgdGhlIGRvLW5vdGhpbmcgaHlwZXJjYWxsIHRvIGZsdXNoIGFueSBzdG9yZWQgY2FsbHMuICovCi1zdGF0aWMgdm9pZCBsZ3Vlc3RfbGVhdmVfbGF6eV9tb2RlKHZvaWQpCitzdGF0aWMgdm9pZCBsZ3Vlc3RfbGVhdmVfbGF6eV9tbXVfbW9kZSh2b2lkKQogewotCXBhcmF2aXJ0X2xlYXZlX2xhenkocGFyYXZpcnRfZ2V0X2xhenlfbW9kZSgpKTsKIAlrdm1faHlwZXJjYWxsMChMSENBTExfRkxVU0hfQVNZTkMpOworCXBhcmF2aXJ0X2xlYXZlX2xhenlfbW11KCk7Cit9CisKK3N0YXRpYyB2b2lkIGxndWVzdF9lbmRfY29udGV4dF9zd2l0Y2goc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0KQoreworCWt2bV9oeXBlcmNhbGwwKExIQ0FMTF9GTFVTSF9BU1lOQyk7CisJcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKG5leHQpOwogfQogCiAvKkc6MDMzCkBAIC02MzcsNyArNjQzLDcgQEAKIAogdm9pZCBsZ3Vlc3Rfc2V0dXBfaXJxKHVuc2lnbmVkIGludCBpcnEpCiB7Ci0JaXJxX3RvX2Rlc2NfYWxsb2NfY3B1KGlycSwgMCk7CisJaXJxX3RvX2Rlc2NfYWxsb2Nfbm9kZShpcnEsIDApOwogCXNldF9pcnFfY2hpcF9hbmRfaGFuZGxlcl9uYW1lKGlycSwgJmxndWVzdF9pcnFfY29udHJvbGxlciwKIAkJCQkgICAgICBoYW5kbGVfbGV2ZWxfaXJxLCAibGV2ZWwiKTsKIH0KQEAgLTEwNTQsOCArMTA2MCw4IEBACiAJcHZfY3B1X29wcy53cml0ZV9nZHRfZW50cnkgPSBsZ3Vlc3Rfd3JpdGVfZ2R0X2VudHJ5OwogCXB2X2NwdV9vcHMud3JpdGVfaWR0X2VudHJ5ID0gbGd1ZXN0X3dyaXRlX2lkdF9lbnRyeTsKIAlwdl9jcHVfb3BzLndiaW52ZCA9IGxndWVzdF93YmludmQ7Ci0JcHZfY3B1X29wcy5sYXp5X21vZGUuZW50ZXIgPSBwYXJhdmlydF9lbnRlcl9sYXp5X2NwdTsKLQlwdl9jcHVfb3BzLmxhenlfbW9kZS5sZWF2ZSA9IGxndWVzdF9sZWF2ZV9sYXp5X21vZGU7CisJcHZfY3B1X29wcy5zdGFydF9jb250ZXh0X3N3aXRjaCA9IHBhcmF2aXJ0X3N0YXJ0X2NvbnRleHRfc3dpdGNoOworCXB2X2NwdV9vcHMuZW5kX2NvbnRleHRfc3dpdGNoID0gbGd1ZXN0X2VuZF9jb250ZXh0X3N3aXRjaDsKIAogCS8qIHBhZ2V0YWJsZSBtYW5hZ2VtZW50ICovCiAJcHZfbW11X29wcy53cml0ZV9jcjMgPSBsZ3Vlc3Rfd3JpdGVfY3IzOwpAQCAtMTA2OCw3ICsxMDc0LDcgQEAKIAlwdl9tbXVfb3BzLnJlYWRfY3IyID0gbGd1ZXN0X3JlYWRfY3IyOwogCXB2X21tdV9vcHMucmVhZF9jcjMgPSBsZ3Vlc3RfcmVhZF9jcjM7CiAJcHZfbW11X29wcy5sYXp5X21vZGUuZW50ZXIgPSBwYXJhdmlydF9lbnRlcl9sYXp5X21tdTsKLQlwdl9tbXVfb3BzLmxhenlfbW9kZS5sZWF2ZSA9IGxndWVzdF9sZWF2ZV9sYXp5X21vZGU7CisJcHZfbW11X29wcy5sYXp5X21vZGUubGVhdmUgPSBsZ3Vlc3RfbGVhdmVfbGF6eV9tbXVfbW9kZTsKIAlwdl9tbXVfb3BzLnB0ZV91cGRhdGUgPSBsZ3Vlc3RfcHRlX3VwZGF0ZTsKIAlwdl9tbXVfb3BzLnB0ZV91cGRhdGVfZGVmZXIgPSBsZ3Vlc3RfcHRlX3VwZGF0ZTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZHVtcF9wYWdldGFibGVzLmMgYi9hcmNoL3g4Ni9tbS9kdW1wX3BhZ2V0YWJsZXMuYwppbmRleCBlNzI3N2NiLi5hNzI1YjdmIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9kdW1wX3BhZ2V0YWJsZXMuYworKysgYi9hcmNoL3g4Ni9tbS9kdW1wX3BhZ2V0YWJsZXMuYwpAQCAtMTYxLDEzICsxNjEsMTQgQEAKIAkJICAgc3QtPmN1cnJlbnRfYWRkcmVzcyA+PSBzdC0+bWFya2VyWzFdLnN0YXJ0X2FkZHJlc3MpIHsKIAkJY29uc3QgY2hhciAqdW5pdCA9IHVuaXRzOwogCQl1bnNpZ25lZCBsb25nIGRlbHRhOworCQlpbnQgd2lkdGggPSBzaXplb2YodW5zaWduZWQgbG9uZykgKiAyOwogCiAJCS8qCiAJCSAqIE5vdyBwcmludCB0aGUgYWN0dWFsIGZpbmlzaGVkIHNlcmllcwogCQkgKi8KLQkJc2VxX3ByaW50ZihtLCAiMHglcC0weCVwICAgIiwKLQkJCSAgICh2b2lkICopc3QtPnN0YXJ0X2FkZHJlc3MsCi0JCQkgICAodm9pZCAqKXN0LT5jdXJyZW50X2FkZHJlc3MpOworCQlzZXFfcHJpbnRmKG0sICIweCUwKmx4LTB4JTAqbHggICAiLAorCQkJICAgd2lkdGgsIHN0LT5zdGFydF9hZGRyZXNzLAorCQkJICAgd2lkdGgsIHN0LT5jdXJyZW50X2FkZHJlc3MpOwogCiAJCWRlbHRhID0gKHN0LT5jdXJyZW50X2FkZHJlc3MgLSBzdC0+c3RhcnRfYWRkcmVzcykgPj4gMTA7CiAJCXdoaWxlICghKGRlbHRhICYgMTAyMykgJiYgdW5pdFsxXSkgewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vZmF1bHQuYyBiL2FyY2gveDg2L21tL2ZhdWx0LmMKaW5kZXggYTAzYjcyNy4uYzZhY2M2MyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vZmF1bHQuYworKysgYi9hcmNoL3g4Ni9tbS9mYXVsdC5jCkBAIC0zLDQwICszLDE3IEBACiAgKiAgQ29weXJpZ2h0IChDKSAyMDAxLCAyMDAyIEFuZGkgS2xlZW4sIFN1U0UgTGFicy4KICAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgUmVkIEhhdCBJbmMuLCBJbmdvIE1vbG5hcgogICovCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvbW1pb3RyYWNlLmg+Ci0jaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2NvbXBpbGVyLmg+Ci0jaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgotI2luY2x1ZGUgPGxpbnV4L2twcm9iZXMuaD4KLSNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+Ci0jaW5jbHVkZSA8bGludXgvdm1hbGxvYy5oPgotI2luY2x1ZGUgPGxpbnV4L3Z0X2tlcm4uaD4KLSNpbmNsdWRlIDxsaW51eC9zaWduYWwuaD4KLSNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KLSNpbmNsdWRlIDxsaW51eC9wdHJhY2UuaD4KLSNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KLSNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlIDxsaW51eC9rZGVidWcuaD4KLSNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgotI2luY2x1ZGUgPGxpbnV4L21hZ2ljLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgotI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KLSNpbmNsdWRlIDxsaW51eC9tbWFuLmg+Ci0jaW5jbHVkZSA8bGludXgvdHR5Lmg+Ci0jaW5jbHVkZSA8bGludXgvc21wLmg+Ci0jaW5jbHVkZSA8bGludXgvbW0uaD4KKyNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgkJLyogU1RBQ0tfRU5EX01BR0lDCQkqLworI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CQkvKiB0ZXN0X3RocmVhZF9mbGFnKCksIC4uLgkqLworI2luY2x1ZGUgPGxpbnV4L2tkZWJ1Zy5oPgkJLyogb29wc19iZWdpbi9lbmQsIC4uLgkJKi8KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4JCS8qIHNlYXJjaF9leGNlcHRpb25fdGFibGUJKi8KKyNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CQkvKiBtYXhfbG93X3BmbgkJCSovCisjaW5jbHVkZSA8bGludXgva3Byb2Jlcy5oPgkJLyogX19rcHJvYmVzLCAuLi4JCSovCisjaW5jbHVkZSA8bGludXgvbW1pb3RyYWNlLmg+CQkvKiBrbW1pb19oYW5kbGVyLCAuLi4JCSovCisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CQkvKiBwZXJmX3N3Y291bnRlcl9ldmVudAkJKi8KIAotI2luY2x1ZGUgPGFzbS1nZW5lcmljL3NlY3Rpb25zLmg+Ci0KLSNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KLSNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgotI2luY2x1ZGUgPGFzbS9zZWdtZW50Lmg+Ci0jaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgotI2luY2x1ZGUgPGFzbS9wcm90by5oPgotI2luY2x1ZGUgPGFzbS90cmFwcy5oPgotI2luY2x1ZGUgPGFzbS9kZXNjLmg+CisjaW5jbHVkZSA8YXNtL3RyYXBzLmg+CQkJLyogZG90cmFwbGlua2FnZSwgLi4uCQkqLworI2luY2x1ZGUgPGFzbS9wZ2FsbG9jLmg+CQkvKiBwZ2RfKigpLCAuLi4JCQkqLwogCiAvKgogICogUGFnZSBmYXVsdCBlcnJvciBjb2RlIGJpdHM6CkBAIC0yMjUsMTIgKzIwMiwxMCBAQAogCWlmICghcG1kX3ByZXNlbnQoKnBtZF9rKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQlpZiAoIXBtZF9wcmVzZW50KCpwbWQpKSB7CisJaWYgKCFwbWRfcHJlc2VudCgqcG1kKSkKIAkJc2V0X3BtZChwbWQsICpwbWRfayk7Ci0JCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwotCX0gZWxzZSB7CisJZWxzZQogCQlCVUdfT04ocG1kX3BhZ2UoKnBtZCkgIT0gcG1kX3BhZ2UoKnBtZF9rKSk7Ci0JfQogCiAJcmV0dXJuIHBtZF9rOwogfQpAQCAtNTM4LDggKzUxMyw2IEBACiBzdGF0aWMgaW50IGlzX2VycmF0YTkzKHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1bnNpZ25lZCBsb25nIGFkZHJlc3MpCiB7CiAjaWZkZWYgQ09ORklHX1g4Nl82NAotCXN0YXRpYyBpbnQgb25jZTsKLQogCWlmIChhZGRyZXNzICE9IHJlZ3MtPmlwKQogCQlyZXR1cm4gMDsKIApAQCAtNTQ5LDEwICs1MjIsNyBAQAogCWFkZHJlc3MgfD0gMHhmZmZmZmZmZlVMIDw8IDMyOwogCWlmICgoYWRkcmVzcyA+PSAodTY0KV9zdGV4dCAmJiBhZGRyZXNzIDw9ICh1NjQpX2V0ZXh0KSB8fAogCSAgICAoYWRkcmVzcyA+PSBNT0RVTEVTX1ZBRERSICYmIGFkZHJlc3MgPD0gTU9EVUxFU19FTkQpKSB7Ci0JCWlmICghb25jZSkgewotCQkJcHJpbnRrKGVycmF0YTkzX3dhcm5pbmcpOwotCQkJb25jZSA9IDE7Ci0JCX0KKwkJcHJpbnRrX29uY2UoZXJyYXRhOTNfd2FybmluZyk7CiAJCXJlZ3MtPmlwID0gYWRkcmVzczsKIAkJcmV0dXJuIDE7CiAJfQpAQCAtMTA0NCw2ICsxMDE0LDggQEAKIAlpZiAodW5saWtlbHkoZXJyb3JfY29kZSAmIFBGX1JTVkQpKQogCQlwZ3RhYmxlX2JhZChyZWdzLCBlcnJvcl9jb2RlLCBhZGRyZXNzKTsKIAorCXBlcmZfc3djb3VudGVyX2V2ZW50KFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFMsIDEsIDAsIHJlZ3MsIGFkZHJlc3MpOworCiAJLyoKIAkgKiBJZiB3ZSdyZSBpbiBhbiBpbnRlcnJ1cHQsIGhhdmUgbm8gdXNlciBjb250ZXh0IG9yIGFyZSBydW5uaW5nCiAJICogaW4gYW4gYXRvbWljIHJlZ2lvbiB0aGVuIHdlIG11c3Qgbm90IHRha2UgdGhlIGZhdWx0OgpAQCAtMTEzNywxMCArMTEwOSwxNSBAQAogCQlyZXR1cm47CiAJfQogCi0JaWYgKGZhdWx0ICYgVk1fRkFVTFRfTUFKT1IpCisJaWYgKGZhdWx0ICYgVk1fRkFVTFRfTUFKT1IpIHsKIAkJdHNrLT5tYWpfZmx0Kys7Ci0JZWxzZQorCQlwZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01BSiwgMSwgMCwKKwkJCQkgICAgIHJlZ3MsIGFkZHJlc3MpOworCX0gZWxzZSB7CiAJCXRzay0+bWluX2ZsdCsrOworCQlwZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTiwgMSwgMCwKKwkJCQkgICAgIHJlZ3MsIGFkZHJlc3MpOworCX0KIAogCWNoZWNrX3Y4MDg2X21vZGUocmVncywgYWRkcmVzcywgdHNrKTsKIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaGlnaG1lbV8zMi5jIGIvYXJjaC94ODYvbW0vaGlnaG1lbV8zMi5jCmluZGV4IDgxMjZlOGQuLjU4ZjYyMWUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2hpZ2htZW1fMzIuYworKysgYi9hcmNoL3g4Ni9tbS9oaWdobWVtXzMyLmMKQEAgLTQ0LDcgKzQ0LDYgQEAKIAl2YWRkciA9IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4gKyBpZHgpOwogCUJVR19PTighcHRlX25vbmUoKihrbWFwX3B0ZS1pZHgpKSk7CiAJc2V0X3B0ZShrbWFwX3B0ZS1pZHgsIG1rX3B0ZShwYWdlLCBwcm90KSk7Ci0JYXJjaF9mbHVzaF9sYXp5X21tdV9tb2RlKCk7CiAKIAlyZXR1cm4gKHZvaWQgKil2YWRkcjsKIH0KQEAgLTc0LDcgKzczLDYgQEAKICNlbmRpZgogCX0KIAotCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwogCXBhZ2VmYXVsdF9lbmFibGUoKTsKIH0KIApkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdC5jIGIvYXJjaC94ODYvbW0vaW5pdC5jCmluZGV4IGFlNGY3YjUuLjM0YzFiZmIgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0LmMKQEAgLTEsMyArMSw0IEBACisjaW5jbHVkZSA8bGludXgvaW5pdHJkLmg+CiAjaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPgogCkBAIC0xMCw2ICsxMSw5IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3N5c3RlbS5oPgogI2luY2x1ZGUgPGFzbS90bGJmbHVzaC5oPgorI2luY2x1ZGUgPGFzbS90bGIuaD4KKworREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKIAogdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIGU4MjBfdGFibGVfc3RhcnQ7CiB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgZTgyMF90YWJsZV9lbmQ7CkBAIC0yMyw2ICsyNyw2OSBAQAogI2VuZGlmCiA7CiAKK2ludCBueF9lbmFibGVkOworCisjaWYgZGVmaW5lZChDT05GSUdfWDg2XzY0KSB8fCBkZWZpbmVkKENPTkZJR19YODZfUEFFKQorc3RhdGljIGludCBkaXNhYmxlX254IF9fY3B1aW5pdGRhdGE7CisKKy8qCisgKiBub2V4ZWMgPSBvbnxvZmYKKyAqCisgKiBDb250cm9sIG5vbi1leGVjdXRhYmxlIG1hcHBpbmdzIGZvciBwcm9jZXNzZXMuCisgKgorICogb24gICAgICBFbmFibGUKKyAqIG9mZiAgICAgRGlzYWJsZQorICovCitzdGF0aWMgaW50IF9faW5pdCBub2V4ZWNfc2V0dXAoY2hhciAqc3RyKQoreworCWlmICghc3RyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoIXN0cm5jbXAoc3RyLCAib24iLCAyKSkgeworCQlfX3N1cHBvcnRlZF9wdGVfbWFzayB8PSBfUEFHRV9OWDsKKwkJZGlzYWJsZV9ueCA9IDA7CisJfSBlbHNlIGlmICghc3RybmNtcChzdHIsICJvZmYiLCAzKSkgeworCQlkaXNhYmxlX254ID0gMTsKKwkJX19zdXBwb3J0ZWRfcHRlX21hc2sgJj0gfl9QQUdFX05YOworCX0KKwlyZXR1cm4gMDsKK30KK2Vhcmx5X3BhcmFtKCJub2V4ZWMiLCBub2V4ZWNfc2V0dXApOworI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfWDg2X1BBRQorc3RhdGljIHZvaWQgX19pbml0IHNldF9ueCh2b2lkKQoreworCXVuc2lnbmVkIGludCB2WzRdLCBsLCBoOworCisJaWYgKGNwdV9oYXNfcGFlICYmIChjcHVpZF9lYXgoMHg4MDAwMDAwMCkgPiAweDgwMDAwMDAxKSkgeworCQljcHVpZCgweDgwMDAwMDAxLCAmdlswXSwgJnZbMV0sICZ2WzJdLCAmdlszXSk7CisKKwkJaWYgKCh2WzNdICYgKDEgPDwgMjApKSAmJiAhZGlzYWJsZV9ueCkgeworCQkJcmRtc3IoTVNSX0VGRVIsIGwsIGgpOworCQkJbCB8PSBFRkVSX05YOworCQkJd3Jtc3IoTVNSX0VGRVIsIGwsIGgpOworCQkJbnhfZW5hYmxlZCA9IDE7CisJCQlfX3N1cHBvcnRlZF9wdGVfbWFzayB8PSBfUEFHRV9OWDsKKwkJfQorCX0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgc2V0X254KHZvaWQpCit7Cit9CisjZW5kaWYKKworI2lmZGVmIENPTkZJR19YODZfNjQKK3ZvaWQgX19jcHVpbml0IGNoZWNrX2VmZXIodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGVmZXI7CisKKwlyZG1zcmwoTVNSX0VGRVIsIGVmZXIpOworCWlmICghKGVmZXIgJiBFRkVSX05YKSB8fCBkaXNhYmxlX254KQorCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7Cit9CisjZW5kaWYKKwogc3RhdGljIHZvaWQgX19pbml0IGZpbmRfZWFybHlfdGFibGVfc3BhY2UodW5zaWduZWQgbG9uZyBlbmQsIGludCB1c2VfcHNlLAogCQkJCQkgIGludCB1c2VfZ2JwYWdlcykKIHsKQEAgLTY2LDEyICsxMzMsMTEgQEAKIAkgKi8KICNpZmRlZiBDT05GSUdfWDg2XzMyCiAJc3RhcnQgPSAweDcwMDA7CisjZWxzZQorCXN0YXJ0ID0gMHg4MDAwOworI2VuZGlmCiAJZTgyMF90YWJsZV9zdGFydCA9IGZpbmRfZTgyMF9hcmVhKHN0YXJ0LCBtYXhfcGZuX21hcHBlZDw8UEFHRV9TSElGVCwKIAkJCQkJdGFibGVzLCBQQUdFX1NJWkUpOwotI2Vsc2UgLyogQ09ORklHX1g4Nl82NCAqLwotCXN0YXJ0ID0gMHg4MDAwOwotCWU4MjBfdGFibGVfc3RhcnQgPSBmaW5kX2U4MjBfYXJlYShzdGFydCwgZW5kLCB0YWJsZXMsIFBBR0VfU0laRSk7Ci0jZW5kaWYKIAlpZiAoZTgyMF90YWJsZV9zdGFydCA9PSAtMVVMKQogCQlwYW5pYygiQ2Fubm90IGZpbmQgc3BhY2UgZm9yIHRoZSBrZXJuZWwgcGFnZSB0YWJsZXMiKTsKIApAQCAtMTU5LDEyICsyMjUsOSBAQAogCXVzZV9nYnBhZ2VzID0gZGlyZWN0X2dicGFnZXM7CiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19YODZfMzIKLSNpZmRlZiBDT05GSUdfWDg2X1BBRQogCXNldF9ueCgpOwogCWlmIChueF9lbmFibGVkKQogCQlwcmludGsoS0VSTl9JTkZPICJOWCAoRXhlY3V0ZSBEaXNhYmxlKSBwcm90ZWN0aW9uOiBhY3RpdmVcbiIpOwotI2VuZGlmCiAKIAkvKiBFbmFibGUgUFNFIGlmIGF2YWlsYWJsZSAqLwogCWlmIChjcHVfaGFzX3BzZSkKQEAgLTE3NSw3ICsyMzgsNiBAQAogCQlzZXRfaW5fY3I0KFg4Nl9DUjRfUEdFKTsKIAkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfR0xPQkFMOwogCX0KLSNlbmRpZgogCiAJaWYgKHVzZV9nYnBhZ2VzKQogCQlwYWdlX3NpemVfbWFzayB8PSAxIDw8IFBHX0xFVkVMXzFHOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF8zMi5jIGIvYXJjaC94ODYvbW0vaW5pdF8zMi5jCmluZGV4IDc0OTU1OWUuLjk0OTcwOGQgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzMyLmMKQEAgLTQ5LDEyICs0OSw5IEBACiAjaW5jbHVkZSA8YXNtL3BhcmF2aXJ0Lmg+CiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KKyNpbmNsdWRlIDxhc20vcGFnZV90eXBlcy5oPgogI2luY2x1ZGUgPGFzbS9pbml0Lmg+CiAKLXVuc2lnbmVkIGxvbmcgbWF4X2xvd19wZm5fbWFwcGVkOwotdW5zaWduZWQgbG9uZyBtYXhfcGZuX21hcHBlZDsKLQotREVGSU5FX1BFUl9DUFUoc3RydWN0IG1tdV9nYXRoZXIsIG1tdV9nYXRoZXJzKTsKIHVuc2lnbmVkIGxvbmcgaGlnaHN0YXJ0X3BmbiwgaGlnaGVuZF9wZm47CiAKIHN0YXRpYyBub2lubGluZSBpbnQgZG9fdGVzdF93cF9iaXQodm9pZCk7CkBAIC01ODcsNjEgKzU4NCw5IEBACiAJZmx1c2hfdGxiX2FsbCgpOwogfQogCi1pbnQgbnhfZW5hYmxlZDsKLQogcHRldmFsX3QgX19zdXBwb3J0ZWRfcHRlX21hc2sgX19yZWFkX21vc3RseSA9IH4oX1BBR0VfTlggfCBfUEFHRV9HTE9CQUwgfCBfUEFHRV9JT01BUCk7CiBFWFBPUlRfU1lNQk9MX0dQTChfX3N1cHBvcnRlZF9wdGVfbWFzayk7CiAKLSNpZmRlZiBDT05GSUdfWDg2X1BBRQotCi1zdGF0aWMgaW50IGRpc2FibGVfbnggX19pbml0ZGF0YTsKLQotLyoKLSAqIG5vZXhlYyA9IG9ufG9mZgotICoKLSAqIENvbnRyb2wgbm9uIGV4ZWN1dGFibGUgbWFwcGluZ3MuCi0gKgotICogb24gICAgICBFbmFibGUKLSAqIG9mZiAgICAgRGlzYWJsZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBub2V4ZWNfc2V0dXAoY2hhciAqc3RyKQotewotCWlmICghc3RyIHx8ICFzdHJjbXAoc3RyLCAib24iKSkgewotCQlpZiAoY3B1X2hhc19ueCkgewotCQkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfTlg7Ci0JCQlkaXNhYmxlX254ID0gMDsKLQkJfQotCX0gZWxzZSB7Ci0JCWlmICghc3RyY21wKHN0ciwgIm9mZiIpKSB7Ci0JCQlkaXNhYmxlX254ID0gMTsKLQkJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9OWDsKLQkJfSBlbHNlIHsKLQkJCXJldHVybiAtRUlOVkFMOwotCQl9Ci0JfQotCi0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgibm9leGVjIiwgbm9leGVjX3NldHVwKTsKLQotdm9pZCBfX2luaXQgc2V0X254KHZvaWQpCi17Ci0JdW5zaWduZWQgaW50IHZbNF0sIGwsIGg7Ci0KLQlpZiAoY3B1X2hhc19wYWUgJiYgKGNwdWlkX2VheCgweDgwMDAwMDAwKSA+IDB4ODAwMDAwMDEpKSB7Ci0JCWNwdWlkKDB4ODAwMDAwMDEsICZ2WzBdLCAmdlsxXSwgJnZbMl0sICZ2WzNdKTsKLQotCQlpZiAoKHZbM10gJiAoMSA8PCAyMCkpICYmICFkaXNhYmxlX254KSB7Ci0JCQlyZG1zcihNU1JfRUZFUiwgbCwgaCk7Ci0JCQlsIHw9IEVGRVJfTlg7Ci0JCQl3cm1zcihNU1JfRUZFUiwgbCwgaCk7Ci0JCQlueF9lbmFibGVkID0gMTsKLQkJCV9fc3VwcG9ydGVkX3B0ZV9tYXNrIHw9IF9QQUdFX05YOwotCQl9Ci0JfQotfQotI2VuZGlmCi0KIC8qIHVzZXItZGVmaW5lZCBoaWdobWVtIHNpemUgKi8KIHN0YXRpYyB1bnNpZ25lZCBpbnQgaGlnaG1lbV9wYWdlcyA9IC0xOwogCkBAIC03NjEsMTUgKzcwNiwxNSBAQAogCWhpZ2hzdGFydF9wZm4gPSBoaWdoZW5kX3BmbiA9IG1heF9wZm47CiAJaWYgKG1heF9wZm4gPiBtYXhfbG93X3BmbikKIAkJaGlnaHN0YXJ0X3BmbiA9IG1heF9sb3dfcGZuOwotCW1lbW9yeV9wcmVzZW50KDAsIDAsIGhpZ2hlbmRfcGZuKTsKIAllODIwX3JlZ2lzdGVyX2FjdGl2ZV9yZWdpb25zKDAsIDAsIGhpZ2hlbmRfcGZuKTsKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucygwKTsKIAlwcmludGsoS0VSTl9OT1RJQ0UgIiVsZE1CIEhJR0hNRU0gYXZhaWxhYmxlLlxuIiwKIAkJcGFnZXNfdG9fbWIoaGlnaGVuZF9wZm4gLSBoaWdoc3RhcnRfcGZuKSk7CiAJbnVtX3BoeXNwYWdlcyA9IGhpZ2hlbmRfcGZuOwogCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShoaWdoc3RhcnRfcGZuICogUEFHRV9TSVpFIC0gMSkgKyAxOwogI2Vsc2UKLQltZW1vcnlfcHJlc2VudCgwLCAwLCBtYXhfbG93X3Bmbik7CiAJZTgyMF9yZWdpc3Rlcl9hY3RpdmVfcmVnaW9ucygwLCAwLCBtYXhfbG93X3Bmbik7CisJc3BhcnNlX21lbW9yeV9wcmVzZW50X3dpdGhfYWN0aXZlX3JlZ2lvbnMoMCk7CiAJbnVtX3BoeXNwYWdlcyA9IG1heF9sb3dfcGZuOwogCWhpZ2hfbWVtb3J5ID0gKHZvaWQgKikgX192YShtYXhfbG93X3BmbiAqIFBBR0VfU0laRSAtIDEpICsgMTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW5pdF82NC5jIGIvYXJjaC94ODYvbW0vaW5pdF82NC5jCmluZGV4IDE3NTNlODAuLjUyYmI5NTEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2luaXRfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9pbml0XzY0LmMKQEAgLTUwLDE4ICs1MCw4IEBACiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KICNpbmNsdWRlIDxhc20vaW5pdC5oPgogCi0vKgotICogZW5kX3BmbiBvbmx5IGluY2x1ZGVzIFJBTSwgd2hpbGUgbWF4X3Bmbl9tYXBwZWQgaW5jbHVkZXMgYWxsIGU4MjAgZW50cmllcy4KLSAqIFRoZSBkaXJlY3QgbWFwcGluZyBleHRlbmRzIHRvIG1heF9wZm5fbWFwcGVkLCBzbyB0aGF0IHdlIGNhbiBkaXJlY3RseSBhY2Nlc3MKLSAqIGFwZXJ0dXJlcywgQUNQSSBhbmQgb3RoZXIgdGFibGVzIHdpdGhvdXQgaGF2aW5nIHRvIHBsYXkgd2l0aCBmaXhtYXBzLgotICovCi11bnNpZ25lZCBsb25nIG1heF9sb3dfcGZuX21hcHBlZDsKLXVuc2lnbmVkIGxvbmcgbWF4X3Bmbl9tYXBwZWQ7Ci0KIHN0YXRpYyB1bnNpZ25lZCBsb25nIGRtYV9yZXNlcnZlIF9faW5pdGRhdGE7CiAKLURFRklORV9QRVJfQ1BVKHN0cnVjdCBtbXVfZ2F0aGVyLCBtbXVfZ2F0aGVycyk7Ci0KIHN0YXRpYyBpbnQgX19pbml0IHBhcnNlX2RpcmVjdF9nYnBhZ2VzX29mZihjaGFyICphcmcpCiB7CiAJZGlyZWN0X2dicGFnZXMgPSAwOwpAQCAtODUsMzkgKzc1LDYgQEAKIHB0ZXZhbF90IF9fc3VwcG9ydGVkX3B0ZV9tYXNrIF9fcmVhZF9tb3N0bHkgPSB+X1BBR0VfSU9NQVA7CiBFWFBPUlRfU1lNQk9MX0dQTChfX3N1cHBvcnRlZF9wdGVfbWFzayk7CiAKLXN0YXRpYyBpbnQgZGlzYWJsZV9ueCBfX2NwdWluaXRkYXRhOwotCi0vKgotICogbm9leGVjPW9ufG9mZgotICogQ29udHJvbCBub24tZXhlY3V0YWJsZSBtYXBwaW5ncyBmb3IgNjQtYml0IHByb2Nlc3Nlcy4KLSAqCi0gKiBvbglFbmFibGUgKGRlZmF1bHQpCi0gKiBvZmYJRGlzYWJsZQotICovCi1zdGF0aWMgaW50IF9faW5pdCBub254X3NldHVwKGNoYXIgKnN0cikKLXsKLQlpZiAoIXN0cikKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JaWYgKCFzdHJuY21wKHN0ciwgIm9uIiwgMikpIHsKLQkJX19zdXBwb3J0ZWRfcHRlX21hc2sgfD0gX1BBR0VfTlg7Ci0JCWRpc2FibGVfbnggPSAwOwotCX0gZWxzZSBpZiAoIXN0cm5jbXAoc3RyLCAib2ZmIiwgMykpIHsKLQkJZGlzYWJsZV9ueCA9IDE7Ci0JCV9fc3VwcG9ydGVkX3B0ZV9tYXNrICY9IH5fUEFHRV9OWDsKLQl9Ci0JcmV0dXJuIDA7Ci19Ci1lYXJseV9wYXJhbSgibm9leGVjIiwgbm9ueF9zZXR1cCk7Ci0KLXZvaWQgX19jcHVpbml0IGNoZWNrX2VmZXIodm9pZCkKLXsKLQl1bnNpZ25lZCBsb25nIGVmZXI7Ci0KLQlyZG1zcmwoTVNSX0VGRVIsIGVmZXIpOwotCWlmICghKGVmZXIgJiBFRkVSX05YKSB8fCBkaXNhYmxlX254KQotCQlfX3N1cHBvcnRlZF9wdGVfbWFzayAmPSB+X1BBR0VfTlg7Ci19Ci0KIGludCBmb3JjZV9wZXJzb25hbGl0eTMyOwogCiAvKgpAQCAtNjI4LDYgKzU4NSw3IEBACiAJZWFybHlfcmVzX3RvX2Jvb3RtZW0oMCwgZW5kX3Bmbjw8UEFHRV9TSElGVCk7CiAJcmVzZXJ2ZV9ib290bWVtKGJvb3RtYXAsIGJvb3RtYXBfc2l6ZSwgQk9PVE1FTV9ERUZBVUxUKTsKIH0KKyNlbmRpZgogCiB2b2lkIF9faW5pdCBwYWdpbmdfaW5pdCh2b2lkKQogewpAQCAtNjM4LDExICs1OTYsMTAgQEAKIAltYXhfem9uZV9wZm5zW1pPTkVfRE1BMzJdID0gTUFYX0RNQTMyX1BGTjsKIAltYXhfem9uZV9wZm5zW1pPTkVfTk9STUFMXSA9IG1heF9wZm47CiAKLQltZW1vcnlfcHJlc2VudCgwLCAwLCBtYXhfcGZuKTsKKwlzcGFyc2VfbWVtb3J5X3ByZXNlbnRfd2l0aF9hY3RpdmVfcmVnaW9ucyhNQVhfTlVNTk9ERVMpOwogCXNwYXJzZV9pbml0KCk7CiAJZnJlZV9hcmVhX2luaXRfbm9kZXMobWF4X3pvbmVfcGZucyk7CiB9Ci0jZW5kaWYKIAogLyoKICAqIE1lbW9yeSBob3RwbHVnIHNwZWNpZmljIGZ1bmN0aW9ucwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vaW9tYXBfMzIuYyBiL2FyY2gveDg2L21tL2lvbWFwXzMyLmMKaW5kZXggODA1NjU0NS4uZmU2Zjg0YyAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vaW9tYXBfMzIuYworKysgYi9hcmNoL3g4Ni9tbS9pb21hcF8zMi5jCkBAIC04Miw3ICs4Miw2IEBACiAJaWYgKHZhZGRyID09IF9fZml4X3RvX3ZpcnQoRklYX0tNQVBfQkVHSU4raWR4KSkKIAkJa3B0ZV9jbGVhcl9mbHVzaChrbWFwX3B0ZS1pZHgsIHZhZGRyKTsKIAotCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwogCXBhZ2VmYXVsdF9lbmFibGUoKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGlvdW5tYXBfYXRvbWljKTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL2ttbWlvLmMgYi9hcmNoL3g4Ni9tbS9rbW1pby5jCmluZGV4IDUwZGM4MDIuLjE2Y2NiZDcgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL2ttbWlvLmMKKysrIGIvYXJjaC94ODYvbW0va21taW8uYwpAQCAtMzIsNyArMzIsNyBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsKIAlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqcmVsZWFzZV9uZXh0OwogCXVuc2lnbmVkIGxvbmcgcGFnZTsgLyogbG9jYXRpb24gb2YgdGhlIGZhdWx0IHBhZ2UgKi8KLQlib29sIG9sZF9wcmVzZW5jZTsgLyogcGFnZSBwcmVzZW5jZSBwcmlvciB0byBhcm1pbmcgKi8KKwlwdGV2YWxfdCBvbGRfcHJlc2VuY2U7IC8qIHBhZ2UgcHJlc2VuY2UgcHJpb3IgdG8gYXJtaW5nICovCiAJYm9vbCBhcm1lZDsKIAogCS8qCkBAIC05Nyw2MCArOTcsNjIgQEAKIHN0YXRpYyBzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqZ2V0X2ttbWlvX2ZhdWx0X3BhZ2UodW5zaWduZWQgbG9uZyBwYWdlKQogewogCXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQ7Ci0Jc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKnA7CisJc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKmY7CiAKIAlwYWdlICY9IFBBR0VfTUFTSzsKIAloZWFkID0ga21taW9fcGFnZV9saXN0KHBhZ2UpOwotCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHAsIGhlYWQsIGxpc3QpIHsKLQkJaWYgKHAtPnBhZ2UgPT0gcGFnZSkKLQkJCXJldHVybiBwOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGYsIGhlYWQsIGxpc3QpIHsKKwkJaWYgKGYtPnBhZ2UgPT0gcGFnZSkKKwkJCXJldHVybiBmOwogCX0KIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIHZvaWQgc2V0X3BtZF9wcmVzZW5jZShwbWRfdCAqcG1kLCBib29sIHByZXNlbnQsIGJvb2wgKm9sZCkKK3N0YXRpYyB2b2lkIGNsZWFyX3BtZF9wcmVzZW5jZShwbWRfdCAqcG1kLCBib29sIGNsZWFyLCBwbWR2YWxfdCAqb2xkKQogewogCXBtZHZhbF90IHYgPSBwbWRfdmFsKCpwbWQpOwotCSpvbGQgPSAhISh2ICYgX1BBR0VfUFJFU0VOVCk7Ci0JdiAmPSB+X1BBR0VfUFJFU0VOVDsKLQlpZiAocHJlc2VudCkKLQkJdiB8PSBfUEFHRV9QUkVTRU5UOworCWlmIChjbGVhcikgeworCQkqb2xkID0gdiAmIF9QQUdFX1BSRVNFTlQ7CisJCXYgJj0gfl9QQUdFX1BSRVNFTlQ7CisJfSBlbHNlCS8qIHByZXN1bWUgdGhpcyBoYXMgYmVlbiBjYWxsZWQgd2l0aCBjbGVhcj09dHJ1ZSBwcmV2aW91c2x5ICovCisJCXYgfD0gKm9sZDsKIAlzZXRfcG1kKHBtZCwgX19wbWQodikpOwogfQogCi1zdGF0aWMgdm9pZCBzZXRfcHRlX3ByZXNlbmNlKHB0ZV90ICpwdGUsIGJvb2wgcHJlc2VudCwgYm9vbCAqb2xkKQorc3RhdGljIHZvaWQgY2xlYXJfcHRlX3ByZXNlbmNlKHB0ZV90ICpwdGUsIGJvb2wgY2xlYXIsIHB0ZXZhbF90ICpvbGQpCiB7CiAJcHRldmFsX3QgdiA9IHB0ZV92YWwoKnB0ZSk7Ci0JKm9sZCA9ICEhKHYgJiBfUEFHRV9QUkVTRU5UKTsKLQl2ICY9IH5fUEFHRV9QUkVTRU5UOwotCWlmIChwcmVzZW50KQotCQl2IHw9IF9QQUdFX1BSRVNFTlQ7CisJaWYgKGNsZWFyKSB7CisJCSpvbGQgPSB2ICYgX1BBR0VfUFJFU0VOVDsKKwkJdiAmPSB+X1BBR0VfUFJFU0VOVDsKKwl9IGVsc2UJLyogcHJlc3VtZSB0aGlzIGhhcyBiZWVuIGNhbGxlZCB3aXRoIGNsZWFyPT10cnVlIHByZXZpb3VzbHkgKi8KKwkJdiB8PSAqb2xkOwogCXNldF9wdGVfYXRvbWljKHB0ZSwgX19wdGUodikpOwogfQogCi1zdGF0aWMgaW50IHNldF9wYWdlX3ByZXNlbmNlKHVuc2lnbmVkIGxvbmcgYWRkciwgYm9vbCBwcmVzZW50LCBib29sICpvbGQpCitzdGF0aWMgaW50IGNsZWFyX3BhZ2VfcHJlc2VuY2Uoc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKmYsIGJvb2wgY2xlYXIpCiB7CiAJdW5zaWduZWQgaW50IGxldmVsOwotCXB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhhZGRyLCAmbGV2ZWwpOworCXB0ZV90ICpwdGUgPSBsb29rdXBfYWRkcmVzcyhmLT5wYWdlLCAmbGV2ZWwpOwogCiAJaWYgKCFwdGUpIHsKLQkJcHJfZXJyKCJrbW1pbzogbm8gcHRlIGZvciBwYWdlIDB4JTA4bHhcbiIsIGFkZHIpOworCQlwcl9lcnIoImttbWlvOiBubyBwdGUgZm9yIHBhZ2UgMHglMDhseFxuIiwgZi0+cGFnZSk7CiAJCXJldHVybiAtMTsKIAl9CiAKIAlzd2l0Y2ggKGxldmVsKSB7CiAJY2FzZSBQR19MRVZFTF8yTToKLQkJc2V0X3BtZF9wcmVzZW5jZSgocG1kX3QgKilwdGUsIHByZXNlbnQsIG9sZCk7CisJCWNsZWFyX3BtZF9wcmVzZW5jZSgocG1kX3QgKilwdGUsIGNsZWFyLCAmZi0+b2xkX3ByZXNlbmNlKTsKIAkJYnJlYWs7CiAJY2FzZSBQR19MRVZFTF80SzoKLQkJc2V0X3B0ZV9wcmVzZW5jZShwdGUsIHByZXNlbnQsIG9sZCk7CisJCWNsZWFyX3B0ZV9wcmVzZW5jZShwdGUsIGNsZWFyLCAmZi0+b2xkX3ByZXNlbmNlKTsKIAkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJcHJfZXJyKCJrbW1pbzogdW5leHBlY3RlZCBwYWdlIGxldmVsIDB4JXguXG4iLCBsZXZlbCk7CiAJCXJldHVybiAtMTsKIAl9CiAKLQlfX2ZsdXNoX3RsYl9vbmUoYWRkcik7CisJX19mbHVzaF90bGJfb25lKGYtPnBhZ2UpOwogCXJldHVybiAwOwogfQogCkBAIC0xNzEsOSArMTczLDkgQEAKIAlXQVJOX09OQ0UoZi0+YXJtZWQsIEtFUk5fRVJSICJrbW1pbyBwYWdlIGFscmVhZHkgYXJtZWQuXG4iKTsKIAlpZiAoZi0+YXJtZWQpIHsKIAkJcHJfd2FybmluZygia21taW8gZG91YmxlLWFybTogcGFnZSAweCUwOGx4LCByZWYgJWQsIG9sZCAlZFxuIiwKLQkJCQkJZi0+cGFnZSwgZi0+Y291bnQsIGYtPm9sZF9wcmVzZW5jZSk7CisJCQkJCWYtPnBhZ2UsIGYtPmNvdW50LCAhIWYtPm9sZF9wcmVzZW5jZSk7CiAJfQotCXJldCA9IHNldF9wYWdlX3ByZXNlbmNlKGYtPnBhZ2UsIGZhbHNlLCAmZi0+b2xkX3ByZXNlbmNlKTsKKwlyZXQgPSBjbGVhcl9wYWdlX3ByZXNlbmNlKGYsIHRydWUpOwogCVdBUk5fT05DRShyZXQgPCAwLCBLRVJOX0VSUiAia21taW8gYXJtaW5nIDB4JTA4bHggZmFpbGVkLlxuIiwgZi0+cGFnZSk7CiAJZi0+YXJtZWQgPSB0cnVlOwogCXJldHVybiByZXQ7CkBAIC0xODIsOCArMTg0LDcgQEAKIC8qKiBSZXN0b3JlIHRoZSBnaXZlbiBwYWdlIHRvIHNhdmVkIHByZXNlbmNlIHN0YXRlLiAqLwogc3RhdGljIHZvaWQgZGlzYXJtX2ttbWlvX2ZhdWx0X3BhZ2Uoc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKmYpCiB7Ci0JYm9vbCB0bXA7Ci0JaW50IHJldCA9IHNldF9wYWdlX3ByZXNlbmNlKGYtPnBhZ2UsIGYtPm9sZF9wcmVzZW5jZSwgJnRtcCk7CisJaW50IHJldCA9IGNsZWFyX3BhZ2VfcHJlc2VuY2UoZiwgZmFsc2UpOwogCVdBUk5fT05DRShyZXQgPCAwLAogCQkJS0VSTl9FUlIgImttbWlvIGRpc2FybWluZyAweCUwOGx4IGZhaWxlZC5cbiIsIGYtPnBhZ2UpOwogCWYtPmFybWVkID0gZmFsc2U7CkBAIC0zMTAsNyArMzExLDEyIEBACiAJc3RydWN0IGttbWlvX2NvbnRleHQgKmN0eCA9ICZnZXRfY3B1X3ZhcihrbW1pb19jdHgpOwogCiAJaWYgKCFjdHgtPmFjdGl2ZSkgewotCQlwcl9kZWJ1Zygia21taW86IHNwdXJpb3VzIGRlYnVnIHRyYXAgb24gQ1BVICVkLlxuIiwKKwkJLyoKKwkJICogZGVidWcgdHJhcHMgd2l0aG91dCBhbiBhY3RpdmUgY29udGV4dCBhcmUgZHVlIHRvIGVpdGhlcgorCQkgKiBzb21ldGhpbmcgZXh0ZXJuYWwgY2F1c2luZyB0aGVtIChmLmUuIHVzaW5nIGEgZGVidWdnZXIgd2hpbGUKKwkJICogbW1pbyB0cmFjaW5nIGVuYWJsZWQpLCBvciBlcnJvbmVvdXMgYmVoYXZpb3VyCisJCSAqLworCQlwcl93YXJuaW5nKCJrbW1pbzogdW5leHBlY3RlZCBkZWJ1ZyB0cmFwIG9uIENQVSAlZC5cbiIsCiAJCQkJCQkJc21wX3Byb2Nlc3Nvcl9pZCgpKTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtNDM5LDEyICs0NDUsMTIgQEAKIAkJCQkJCWhlYWQsCiAJCQkJCQlzdHJ1Y3Qga21taW9fZGVsYXllZF9yZWxlYXNlLAogCQkJCQkJcmN1KTsKLQlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqcCA9IGRyLT5yZWxlYXNlX2xpc3Q7Ci0Jd2hpbGUgKHApIHsKLQkJc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKm5leHQgPSBwLT5yZWxlYXNlX25leHQ7Ci0JCUJVR19PTihwLT5jb3VudCk7Ci0JCWtmcmVlKHApOwotCQlwID0gbmV4dDsKKwlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqZiA9IGRyLT5yZWxlYXNlX2xpc3Q7CisJd2hpbGUgKGYpIHsKKwkJc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKm5leHQgPSBmLT5yZWxlYXNlX25leHQ7CisJCUJVR19PTihmLT5jb3VudCk7CisJCWtmcmVlKGYpOworCQlmID0gbmV4dDsKIAl9CiAJa2ZyZWUoZHIpOwogfQpAQCAtNDUzLDE5ICs0NTksMTkgQEAKIHsKIAlzdHJ1Y3Qga21taW9fZGVsYXllZF9yZWxlYXNlICpkciA9CiAJCWNvbnRhaW5lcl9vZihoZWFkLCBzdHJ1Y3Qga21taW9fZGVsYXllZF9yZWxlYXNlLCByY3UpOwotCXN0cnVjdCBrbW1pb19mYXVsdF9wYWdlICpwID0gZHItPnJlbGVhc2VfbGlzdDsKKwlzdHJ1Y3Qga21taW9fZmF1bHRfcGFnZSAqZiA9IGRyLT5yZWxlYXNlX2xpc3Q7CiAJc3RydWN0IGttbWlvX2ZhdWx0X3BhZ2UgKipwcmV2cCA9ICZkci0+cmVsZWFzZV9saXN0OwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgma21taW9fbG9jaywgZmxhZ3MpOwotCXdoaWxlIChwKSB7Ci0JCWlmICghcC0+Y291bnQpIHsKLQkJCWxpc3RfZGVsX3JjdSgmcC0+bGlzdCk7Ci0JCQlwcmV2cCA9ICZwLT5yZWxlYXNlX25leHQ7CisJd2hpbGUgKGYpIHsKKwkJaWYgKCFmLT5jb3VudCkgeworCQkJbGlzdF9kZWxfcmN1KCZmLT5saXN0KTsKKwkJCXByZXZwID0gJmYtPnJlbGVhc2VfbmV4dDsKIAkJfSBlbHNlIHsKLQkJCSpwcmV2cCA9IHAtPnJlbGVhc2VfbmV4dDsKKwkJCSpwcmV2cCA9IGYtPnJlbGVhc2VfbmV4dDsKIAkJfQotCQlwID0gcC0+cmVsZWFzZV9uZXh0OworCQlmID0gZi0+cmVsZWFzZV9uZXh0OwogCX0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZrbW1pb19sb2NrLCBmbGFncyk7CiAKQEAgLTUyOCw4ICs1MzQsOCBAQAogfQogRVhQT1JUX1NZTUJPTCh1bnJlZ2lzdGVyX2ttbWlvX3Byb2JlKTsKIAotc3RhdGljIGludCBrbW1pb19kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsCi0JCQkJCQkJCXZvaWQgKmFyZ3MpCitzdGF0aWMgaW50CitrbW1pb19kaWVfbm90aWZpZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYiwgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmFyZ3MpCiB7CiAJc3RydWN0IGRpZV9hcmdzICphcmcgPSBhcmdzOwogCkBAIC01NDQsMTEgKzU1MCwyMyBAQAogCS5ub3RpZmllcl9jYWxsID0ga21taW9fZGllX25vdGlmaWVyCiB9OwogCi1zdGF0aWMgaW50IF9faW5pdCBpbml0X2ttbWlvKHZvaWQpCitpbnQga21taW9faW5pdCh2b2lkKQogewogCWludCBpOworCiAJZm9yIChpID0gMDsgaSA8IEtNTUlPX1BBR0VfVEFCTEVfU0laRTsgaSsrKQogCQlJTklUX0xJU1RfSEVBRCgma21taW9fcGFnZV90YWJsZVtpXSk7CisKIAlyZXR1cm4gcmVnaXN0ZXJfZGllX25vdGlmaWVyKCZuYl9kaWUpOwogfQotZnNfaW5pdGNhbGwoaW5pdF9rbW1pbyk7IC8qIHNob3VsZCBiZSBiZWZvcmUgZGV2aWNlX2luaXRjYWxsKCkgKi8KKwordm9pZCBrbW1pb19jbGVhbnVwKHZvaWQpCit7CisJaW50IGk7CisKKwl1bnJlZ2lzdGVyX2RpZV9ub3RpZmllcigmbmJfZGllKTsKKwlmb3IgKGkgPSAwOyBpIDwgS01NSU9fUEFHRV9UQUJMRV9TSVpFOyBpKyspIHsKKwkJV0FSTl9PTkNFKCFsaXN0X2VtcHR5KCZrbW1pb19wYWdlX3RhYmxlW2ldKSwKKwkJCUtFUk5fRVJSICJrbW1pb19wYWdlX3RhYmxlIG5vdCBlbXB0eSBhdCBjbGVhbnVwLCBhbnkgZnVydGhlciB0cmFjaW5nIHdpbGwgbGVhayBtZW1vcnkuXG4iKTsKKwl9Cit9CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9tbS9tZW10ZXN0LmMgYi9hcmNoL3g4Ni9tbS9tZW10ZXN0LmMKaW5kZXggNjA1YzhiZS4uYzBiZWRjZCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vbWVtdGVzdC5jCisrKyBiL2FyY2gveDg2L21tL21lbXRlc3QuYwpAQCAtNDAsMjMgKzQwLDIzIEBACiAKIHN0YXRpYyB2b2lkIF9faW5pdCBtZW10ZXN0KHU2NCBwYXR0ZXJuLCB1NjQgc3RhcnRfcGh5cywgdTY0IHNpemUpCiB7Ci0JdTY0IGksIGNvdW50OwotCXU2NCAqc3RhcnQ7CisJdTY0ICpwOworCXZvaWQgKnN0YXJ0LCAqZW5kOwogCXU2NCBzdGFydF9iYWQsIGxhc3RfYmFkOwogCXU2NCBzdGFydF9waHlzX2FsaWduZWQ7CiAJc2l6ZV90IGluY3I7CiAKIAlpbmNyID0gc2l6ZW9mKHBhdHRlcm4pOwogCXN0YXJ0X3BoeXNfYWxpZ25lZCA9IEFMSUdOKHN0YXJ0X3BoeXMsIGluY3IpOwotCWNvdW50ID0gKHNpemUgLSAoc3RhcnRfcGh5c19hbGlnbmVkIC0gc3RhcnRfcGh5cykpL2luY3I7CiAJc3RhcnQgPSBfX3ZhKHN0YXJ0X3BoeXNfYWxpZ25lZCk7CisJZW5kID0gc3RhcnQgKyBzaXplIC0gKHN0YXJ0X3BoeXNfYWxpZ25lZCAtIHN0YXJ0X3BoeXMpOwogCXN0YXJ0X2JhZCA9IDA7CiAJbGFzdF9iYWQgPSAwOwogCi0JZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspCi0JCXN0YXJ0W2ldID0gcGF0dGVybjsKLQlmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKywgc3RhcnQrKywgc3RhcnRfcGh5c19hbGlnbmVkICs9IGluY3IpIHsKLQkJaWYgKCpzdGFydCA9PSBwYXR0ZXJuKQorCWZvciAocCA9IHN0YXJ0OyBwIDwgZW5kOyBwKyspCisJCSpwID0gcGF0dGVybjsKKwlmb3IgKHAgPSBzdGFydDsgcCA8IGVuZDsgcCsrLCBzdGFydF9waHlzX2FsaWduZWQgKz0gaW5jcikgeworCQlpZiAoKnAgPT0gcGF0dGVybikKIAkJCWNvbnRpbnVlOwogCQlpZiAoc3RhcnRfcGh5c19hbGlnbmVkID09IGxhc3RfYmFkICsgaW5jcikgewogCQkJbGFzdF9iYWQgKz0gaW5jcjsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL21taW8tbW9kLmMgYi9hcmNoL3g4Ni9tbS9tbWlvLW1vZC5jCmluZGV4IGM5MzQyZWQuLjEzMjc3MmEgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL21taW8tbW9kLmMKKysrIGIvYXJjaC94ODYvbW0vbW1pby1tb2QuYwpAQCAtNDUxLDYgKzQ1MSw3IEBACiAKIAlpZiAobm9tbWlvdHJhY2UpCiAJCXByX2luZm8oTkFNRSAiTU1JTyB0cmFjaW5nIGRpc2FibGVkLlxuIik7CisJa21taW9faW5pdCgpOwogCWVudGVyX3VuaXByb2Nlc3NvcigpOwogCXNwaW5fbG9ja19pcnEoJnRyYWNlX2xvY2spOwogCWF0b21pY19pbmMoJm1taW90cmFjZV9lbmFibGVkKTsKQEAgLTQ3Myw2ICs0NzQsNyBAQAogCiAJY2xlYXJfdHJhY2VfbGlzdCgpOyAvKiBndWFyYW50ZWVzOiBubyBtb3JlIGttbWlvIGNhbGxiYWNrcyAqLwogCWxlYXZlX3VuaXByb2Nlc3NvcigpOworCWttbWlvX2NsZWFudXAoKTsKIAlwcl9pbmZvKE5BTUUgImRpc2FibGVkLlxuIik7CiBvdXQ6CiAJbXV0ZXhfdW5sb2NrKCZtbWlvdHJhY2VfbXV0ZXgpOwpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vbnVtYV82NC5jIGIvYXJjaC94ODYvbW0vbnVtYV82NC5jCmluZGV4IDJkMDVhMTIuLjQ1OTkxM2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L21tL251bWFfNjQuYworKysgYi9hcmNoL3g4Ni9tbS9udW1hXzY0LmMKQEAgLTE3OSwxOCArMTc5LDI1IEBACiB9CiAKIC8qIEluaXRpYWxpemUgYm9vdG1lbSBhbGxvY2F0b3IgZm9yIGEgbm9kZSAqLwotdm9pZCBfX2luaXQgc2V0dXBfbm9kZV9ib290bWVtKGludCBub2RlaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyBlbmQpCit2b2lkIF9faW5pdAorc2V0dXBfbm9kZV9ib290bWVtKGludCBub2RlaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCBsYXN0X3BmbiwgYm9vdG1hcF9wYWdlcywgYm9vdG1hcF9zaXplOworCWNvbnN0IGludCBwZ2RhdF9zaXplID0gcm91bmR1cChzaXplb2YocGdfZGF0YV90KSwgUEFHRV9TSVpFKTsKIAl1bnNpZ25lZCBsb25nIGJvb3RtYXBfc3RhcnQsIG5vZGVkYXRhX3BoeXM7CiAJdm9pZCAqYm9vdG1hcDsKLQljb25zdCBpbnQgcGdkYXRfc2l6ZSA9IHJvdW5kdXAoc2l6ZW9mKHBnX2RhdGFfdCksIFBBR0VfU0laRSk7CiAJaW50IG5pZDsKIAogCWlmICghZW5kKQogCQlyZXR1cm47CiAKKwkvKgorCSAqIERvbid0IGNvbmZ1c2UgVk0gd2l0aCBhIG5vZGUgdGhhdCBkb2Vzbid0IGhhdmUgdGhlCisJICogbWluaW11bSBhbW91bnQgb2YgbWVtb3J5OgorCSAqLworCWlmIChlbmQgJiYgKGVuZCAtIHN0YXJ0KSA8IE5PREVfTUlOX1NJWkUpCisJCXJldHVybjsKKwogCXN0YXJ0ID0gcm91bmR1cChzdGFydCwgWk9ORV9BTElHTik7CiAKIAlwcmludGsoS0VSTl9JTkZPICJCb290bWVtIHNldHVwIG5vZGUgJWQgJTAxNmx4LSUwMTZseFxuIiwgbm9kZWlkLApAQCAtMjcyLDkgKzI3OSw2IEBACiAJCXJlc2VydmVfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlaWQpLCBib290bWFwX3N0YXJ0LAogCQkJCSBib290bWFwX3BhZ2VzPDxQQUdFX1NISUZULCBCT09UTUVNX0RFRkFVTFQpOwogCi0jaWZkZWYgQ09ORklHX0FDUElfTlVNQQotCXNyYXRfcmVzZXJ2ZV9hZGRfYXJlYShub2RlaWQpOwotI2VuZGlmCiAJbm9kZV9zZXRfb25saW5lKG5vZGVpZCk7CiB9CiAKQEAgLTU3OCwyMSArNTgyLDYgQEAKIAlyZXR1cm4gcGFnZXM7CiB9CiAKLXZvaWQgX19pbml0IHBhZ2luZ19pbml0KHZvaWQpCi17Ci0JdW5zaWduZWQgbG9uZyBtYXhfem9uZV9wZm5zW01BWF9OUl9aT05FU107Ci0KLQltZW1zZXQobWF4X3pvbmVfcGZucywgMCwgc2l6ZW9mKG1heF96b25lX3BmbnMpKTsKLQltYXhfem9uZV9wZm5zW1pPTkVfRE1BXSA9IE1BWF9ETUFfUEZOOwotCW1heF96b25lX3BmbnNbWk9ORV9ETUEzMl0gPSBNQVhfRE1BMzJfUEZOOwotCW1heF96b25lX3BmbnNbWk9ORV9OT1JNQUxdID0gbWF4X3BmbjsKLQotCXNwYXJzZV9tZW1vcnlfcHJlc2VudF93aXRoX2FjdGl2ZV9yZWdpb25zKE1BWF9OVU1OT0RFUyk7Ci0Jc3BhcnNlX2luaXQoKTsKLQotCWZyZWVfYXJlYV9pbml0X25vZGVzKG1heF96b25lX3BmbnMpOwotfQotCiBzdGF0aWMgX19pbml0IGludCBudW1hX3NldHVwKGNoYXIgKm9wdCkKIHsKIAlpZiAoIW9wdCkKQEAgLTYwNiw4ICs1OTUsNiBAQAogI2lmZGVmIENPTkZJR19BQ1BJX05VTUEKIAlpZiAoIXN0cm5jbXAob3B0LCAibm9hY3BpIiwgNikpCiAJCWFjcGlfbnVtYSA9IC0xOwotCWlmICghc3RybmNtcChvcHQsICJob3RhZGQ9IiwgNykpCi0JCWhvdGFkZF9wZXJjZW50ID0gc2ltcGxlX3N0cnRvdWwob3B0KzcsIE5VTEwsIDEwKTsKICNlbmRpZgogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYyBiL2FyY2gveDg2L21tL3BhZ2VhdHRyLmMKaW5kZXggZTE3ZWZlZC4uNmNlOTUxOCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvbW0vcGFnZWF0dHIuYworKysgYi9hcmNoL3g4Ni9tbS9wYWdlYXR0ci5jCkBAIC04MzksMTMgKzgzOSw2IEBACiAKIAl2bV91bm1hcF9hbGlhc2VzKCk7CiAKLQkvKgotCSAqIElmIHdlJ3JlIGNhbGxlZCB3aXRoIGxhenkgbW11IHVwZGF0ZXMgZW5hYmxlZCwgdGhlCi0JICogaW4tbWVtb3J5IHB0ZSBzdGF0ZSBtYXkgYmUgc3RhbGUuICBGbHVzaCBwZW5kaW5nIHVwZGF0ZXMgdG8KLQkgKiBicmluZyB0aGVtIHVwIHRvIGRhdGUuCi0JICovCi0JYXJjaF9mbHVzaF9sYXp5X21tdV9tb2RlKCk7Ci0KIAljcGEudmFkZHIgPSBhZGRyOwogCWNwYS5wYWdlcyA9IHBhZ2VzOwogCWNwYS5udW1wYWdlcyA9IG51bXBhZ2VzOwpAQCAtODkwLDEzICs4ODMsNiBAQAogCX0gZWxzZQogCQljcGFfZmx1c2hfYWxsKGNhY2hlKTsKIAotCS8qCi0JICogSWYgd2UndmUgYmVlbiBjYWxsZWQgd2l0aCBsYXp5IG1tdSB1cGRhdGVzIGVuYWJsZWQsIHRoZW4KLQkgKiBtYWtlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGdldHMgZmx1c2hlZCBvdXQgYmVmb3JlIHdlCi0JICogcmV0dXJuLgotCSAqLwotCWFyY2hfZmx1c2hfbGF6eV9tbXVfbW9kZSgpOwotCiBvdXQ6CiAJcmV0dXJuIHJldDsKIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L21tL3NyYXRfNjQuYyBiL2FyY2gveDg2L21tL3NyYXRfNjQuYwppbmRleCAwMTc2NTk1Li4yZGZjYmY5IDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9tbS9zcmF0XzY0LmMKKysrIGIvYXJjaC94ODYvbW0vc3JhdF82NC5jCkBAIC0zMSwxNyArMzEsMTEgQEAKIHN0YXRpYyBub2RlbWFza190IGNwdV9ub2Rlc19wYXJzZWQgX19pbml0ZGF0YTsKIHN0YXRpYyBzdHJ1Y3QgYm9vdG5vZGUgbm9kZXNbTUFYX05VTU5PREVTXSBfX2luaXRkYXRhOwogc3RhdGljIHN0cnVjdCBib290bm9kZSBub2Rlc19hZGRbTUFYX05VTU5PREVTXTsKLXN0YXRpYyBpbnQgZm91bmRfYWRkX2FyZWEgX19pbml0ZGF0YTsKLWludCBob3RhZGRfcGVyY2VudCBfX2luaXRkYXRhID0gMDsKIAogc3RhdGljIGludCBudW1fbm9kZV9tZW1ibGtzIF9faW5pdGRhdGE7CiBzdGF0aWMgc3RydWN0IGJvb3Rub2RlIG5vZGVfbWVtYmxrX3JhbmdlW05SX05PREVfTUVNQkxLU10gX19pbml0ZGF0YTsKIHN0YXRpYyBpbnQgbWVtYmxrX25vZGVpZFtOUl9OT0RFX01FTUJMS1NdIF9faW5pdGRhdGE7CiAKLS8qIFRvbyBzbWFsbCBub2RlcyBjb25mdXNlIHRoZSBWTSBiYWRseS4gVXN1YWxseSB0aGV5IHJlc3VsdAotICAgZnJvbSBCSU9TIGJ1Z3MuICovCi0jZGVmaW5lIE5PREVfTUlOX1NJWkUgKDQqMTAyNCoxMDI0KQotCiBzdGF0aWMgX19pbml0IGludCBzZXR1cF9ub2RlKGludCBweG0pCiB7CiAJcmV0dXJuIGFjcGlfbWFwX3B4bV90b19ub2RlKHB4bSk7CkBAIC02Niw5ICs2MCw2IEBACiB7CiAJc3RydWN0IGJvb3Rub2RlICpuZCA9ICZub2Rlc1tpXTsKIAotCWlmIChmb3VuZF9hZGRfYXJlYSkKLQkJcmV0dXJuOwotCiAJaWYgKG5kLT5zdGFydCA8IHN0YXJ0KSB7CiAJCW5kLT5zdGFydCA9IHN0YXJ0OwogCQlpZiAobmQtPmVuZCA8IG5kLT5zdGFydCkKQEAgLTg2LDcgKzc3LDYgQEAKIAlpbnQgaTsKIAlwcmludGsoS0VSTl9FUlIgIlNSQVQ6IFNSQVQgbm90IHVzZWQuXG4iKTsKIAlhY3BpX251bWEgPSAtMTsKLQlmb3VuZF9hZGRfYXJlYSA9IDA7CiAJZm9yIChpID0gMDsgaSA8IE1BWF9MT0NBTF9BUElDOyBpKyspCiAJCWFwaWNpZF90b19ub2RlW2ldID0gTlVNQV9OT19OT0RFOwogCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykKQEAgLTE4MiwyNCArMTcyLDIxIEBACiAJICAgICAgIHB4bSwgYXBpY19pZCwgbm9kZSk7CiB9CiAKLXN0YXRpYyBpbnQgdXBkYXRlX2VuZF9vZl9tZW1vcnkodW5zaWduZWQgbG9uZyBlbmQpIHtyZXR1cm4gLTE7fQotc3RhdGljIGludCBob3RhZGRfZW5vdWdoX21lbW9yeShzdHJ1Y3QgYm9vdG5vZGUgKm5kKSB7cmV0dXJuIDE7fQogI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19TUEFSU0UKIHN0YXRpYyBpbmxpbmUgaW50IHNhdmVfYWRkX2luZm8odm9pZCkge3JldHVybiAxO30KICNlbHNlCiBzdGF0aWMgaW5saW5lIGludCBzYXZlX2FkZF9pbmZvKHZvaWQpIHtyZXR1cm4gMDt9CiAjZW5kaWYKIC8qCi0gKiBVcGRhdGUgbm9kZXNfYWRkIGFuZCBkZWNpZGUgaWYgdG8gaW5jbHVkZSBhZGQgYXJlIGluIHRoZSB6b25lLgotICogQm90aCBTUEFSU0UgYW5kIFJFU0VSVkUgbmVlZCBub2Rlc19hZGQgaW5mb3JtYXRpb24uCi0gKiBUaGlzIGNvZGUgc3VwcG9ydHMgb25lIGNvbnRpZ3VvdXMgaG90IGFkZCBhcmVhIHBlciBub2RlLgorICogVXBkYXRlIG5vZGVzX2FkZFtdCisgKiBUaGlzIGNvZGUgc3VwcG9ydHMgb25lIGNvbnRpZ3VvdXMgaG90IGFkZCBhcmVhIHBlciBub2RlCiAgKi8KLXN0YXRpYyBpbnQgX19pbml0Ci1yZXNlcnZlX2hvdGFkZChpbnQgbm9kZSwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQpCitzdGF0aWMgdm9pZCBfX2luaXQKK3VwZGF0ZV9ub2Rlc19hZGQoaW50IG5vZGUsIHVuc2lnbmVkIGxvbmcgc3RhcnQsIHVuc2lnbmVkIGxvbmcgZW5kKQogewogCXVuc2lnbmVkIGxvbmcgc19wZm4gPSBzdGFydCA+PiBQQUdFX1NISUZUOwogCXVuc2lnbmVkIGxvbmcgZV9wZm4gPSBlbmQgPj4gUEFHRV9TSElGVDsKLQlpbnQgcmV0ID0gMCwgY2hhbmdlZCA9IDA7CisJaW50IGNoYW5nZWQgPSAwOwogCXN0cnVjdCBib290bm9kZSAqbmQgPSAmbm9kZXNfYWRkW25vZGVdOwogCiAJLyogSSBoYWQgc29tZSB0cm91YmxlIHdpdGggc3RyYW5nZSBtZW1vcnkgaG90YWRkIHJlZ2lvbnMgYnJlYWtpbmcKQEAgLTIxMCw3ICsxOTcsNyBAQAogCSAgIG1pc3Rha2VzICovCiAJaWYgKChzaWduZWQgbG9uZykoZW5kIC0gc3RhcnQpIDwgTk9ERV9NSU5fU0laRSkgewogCQlwcmludGsoS0VSTl9FUlIgIlNSQVQ6IEhvdHBsdWcgYXJlYSB0b28gc21hbGxcbiIpOwotCQlyZXR1cm4gLTE7CisJCXJldHVybjsKIAl9CiAKIAkvKiBUaGlzIGNoZWNrIG1pZ2h0IGJlIGEgYml0IHRvbyBzdHJpY3QsIGJ1dCBJJ20ga2VlcGluZyBpdCBmb3Igbm93LiAqLwpAQCAtMjE4LDEyICsyMDUsNyBAQAogCQlwcmludGsoS0VSTl9FUlIKIAkJCSJTUkFUOiBIb3RwbHVnIGFyZWEgJWx1IC0+ICVsdSBoYXMgZXhpc3RpbmcgbWVtb3J5XG4iLAogCQkJc19wZm4sIGVfcGZuKTsKLQkJcmV0dXJuIC0xOwotCX0KLQotCWlmICghaG90YWRkX2Vub3VnaF9tZW1vcnkoJm5vZGVzX2FkZFtub2RlXSkpICB7Ci0JCXByaW50ayhLRVJOX0VSUiAiU1JBVDogSG90cGx1ZyBhcmVhIHRvbyBsYXJnZVxuIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0dXJuOwogCX0KIAogCS8qIExvb2tzIGdvb2QgKi8KQEAgLTI0NSwxMSArMjI3LDkgQEAKIAkJCXByaW50ayhLRVJOX0VSUiAiU1JBVDogSG90cGx1ZyB6b25lIG5vdCBjb250aW51b3VzLiBQYXJ0bHkgaWdub3JlZFxuIik7CiAJfQogCi0JcmV0ID0gdXBkYXRlX2VuZF9vZl9tZW1vcnkobmQtPmVuZCk7Ci0KIAlpZiAoY2hhbmdlZCkKLQkgCXByaW50ayhLRVJOX0lORk8gIlNSQVQ6IGhvdCBwbHVnIHpvbmUgZm91bmQgJUx4IC0gJUx4XG4iLCBuZC0+c3RhcnQsIG5kLT5lbmQpOwotCXJldHVybiByZXQ7CisJCXByaW50ayhLRVJOX0lORk8gIlNSQVQ6IGhvdCBwbHVnIHpvbmUgZm91bmQgJUx4IC0gJUx4XG4iLAorCQkJCSBuZC0+c3RhcnQsIG5kLT5lbmQpOwogfQogCiAvKiBDYWxsYmFjayBmb3IgcGFyc2luZyBvZiB0aGUgUHJveGltaXR5IERvbWFpbiA8LT4gTWVtb3J5IEFyZWEgbWFwcGluZ3MgKi8KQEAgLTMxMCwxMyArMjkwLDEwIEBACiAJICAgICAgIHN0YXJ0LCBlbmQpOwogCWU4MjBfcmVnaXN0ZXJfYWN0aXZlX3JlZ2lvbnMobm9kZSwgc3RhcnQgPj4gUEFHRV9TSElGVCwKIAkJCQkgICAgIGVuZCA+PiBQQUdFX1NISUZUKTsKLQlwdXNoX25vZGVfYm91bmRhcmllcyhub2RlLCBuZC0+c3RhcnQgPj4gUEFHRV9TSElGVCwKLQkJCQkJCW5kLT5lbmQgPj4gUEFHRV9TSElGVCk7CiAKLQlpZiAoKG1hLT5mbGFncyAmIEFDUElfU1JBVF9NRU1fSE9UX1BMVUdHQUJMRSkgJiYKLQkgICAgKHJlc2VydmVfaG90YWRkKG5vZGUsIHN0YXJ0LCBlbmQpIDwgMCkpIHsKLQkJLyogSWdub3JlIGhvdGFkZCByZWdpb24uIFVuZG8gZGFtYWdlICovCi0JCXByaW50ayhLRVJOX05PVElDRSAiU1JBVDogSG90cGx1ZyByZWdpb24gaWdub3JlZFxuIik7CisJaWYgKG1hLT5mbGFncyAmIEFDUElfU1JBVF9NRU1fSE9UX1BMVUdHQUJMRSkgeworCQl1cGRhdGVfbm9kZXNfYWRkKG5vZGUsIHN0YXJ0LCBlbmQpOworCQkvKiByZXN0b3JlIG5vZGVzW25vZGVdICovCiAJCSpuZCA9IG9sZG5vZGU7CiAJCWlmICgobmQtPnN0YXJ0IHwgbmQtPmVuZCkgPT0gMCkKIAkJCW5vZGVfY2xlYXIobm9kZSwgbm9kZXNfcGFyc2VkKTsKQEAgLTM0NSw5ICszMjIsOSBAQAogCQkJcHhtcmFtID0gMDsKIAl9CiAKLQllODIwcmFtID0gbWF4X3BmbiAtIGFic2VudF9wYWdlc19pbl9yYW5nZSgwLCBtYXhfcGZuKTsKLQkvKiBXZSBzZWVtIHRvIGxvc2UgMyBwYWdlcyBzb21ld2hlcmUuIEFsbG93IGEgYml0IG9mIHNsYWNrLiAqLwotCWlmICgobG9uZykoZTgyMHJhbSAtIHB4bXJhbSkgPj0gMSoxMDI0KjEwMjQpIHsKKwllODIwcmFtID0gbWF4X3BmbiAtIChlODIwX2hvbGVfc2l6ZSgwLCBtYXhfcGZuPDxQQUdFX1NISUZUKT4+UEFHRV9TSElGVCk7CisJLyogV2Ugc2VlbSB0byBsb3NlIDMgcGFnZXMgc29tZXdoZXJlLiBBbGxvdyAxTSBvZiBzbGFjay4gKi8KKwlpZiAoKGxvbmcpKGU4MjByYW0gLSBweG1yYW0pID49ICgxPDwoMjAgLSBQQUdFX1NISUZUKSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSCiAJIlNSQVQ6IFBYTXMgb25seSBjb3ZlciAlbHVNQiBvZiB5b3VyICVsdU1CIGU4MjAgUkFNLiBOb3QgdXNlZC5cbiIsCiAJCQkocHhtcmFtIDw8IFBBR0VfU0hJRlQpID4+IDIwLApAQCAtMzU3LDE3ICszMzQsNiBAQAogCXJldHVybiAxOwogfQogCi1zdGF0aWMgdm9pZCBfX2luaXQgdW5wYXJzZV9ub2RlKGludCBub2RlKQotewotCWludCBpOwotCW5vZGVfY2xlYXIobm9kZSwgbm9kZXNfcGFyc2VkKTsKLQlub2RlX2NsZWFyKG5vZGUsIGNwdV9ub2Rlc19wYXJzZWQpOwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTE9DQUxfQVBJQzsgaSsrKSB7Ci0JCWlmIChhcGljaWRfdG9fbm9kZVtpXSA9PSBub2RlKQotCQkJYXBpY2lkX3RvX25vZGVbaV0gPSBOVU1BX05PX05PREU7Ci0JfQotfQotCiB2b2lkIF9faW5pdCBhY3BpX251bWFfYXJjaF9maXh1cCh2b2lkKSB7fQogCiAvKiBVc2UgdGhlIGluZm9ybWF0aW9uIGRpc2NvdmVyZWQgYWJvdmUgdG8gYWN0dWFsbHkgc2V0IHVwIHRoZSBub2Rlcy4gKi8KQEAgLTM3OSwxOCArMzQ1LDggQEAKIAkJcmV0dXJuIC0xOwogCiAJLyogRmlyc3QgY2xlYW4gdXAgdGhlIG5vZGUgbGlzdCAqLwotCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykgeworCWZvciAoaSA9IDA7IGkgPCBNQVhfTlVNTk9ERVM7IGkrKykKIAkJY3V0b2ZmX25vZGUoaSwgc3RhcnQsIGVuZCk7Ci0JCS8qCi0JCSAqIGRvbid0IGNvbmZ1c2UgVk0gd2l0aCBhIG5vZGUgdGhhdCBkb2Vzbid0IGhhdmUgdGhlCi0JCSAqIG1pbmltdW0gbWVtb3J5LgotCQkgKi8KLQkJaWYgKG5vZGVzW2ldLmVuZCAmJgotCQkJKG5vZGVzW2ldLmVuZCAtIG5vZGVzW2ldLnN0YXJ0KSA8IE5PREVfTUlOX1NJWkUpIHsKLQkJCXVucGFyc2Vfbm9kZShpKTsKLQkJCW5vZGVfc2V0X29mZmxpbmUoaSk7Ci0JCX0KLQl9CiAKIAlpZiAoIW5vZGVzX2NvdmVyX21lbW9yeShub2RlcykpIHsKIAkJYmFkX3NyYXQoKTsKQEAgLTQyMyw3ICszNzksNyBAQAogCiAJCWlmIChub2RlID09IE5VTUFfTk9fTk9ERSkKIAkJCWNvbnRpbnVlOwotCQlpZiAoIW5vZGVfaXNzZXQobm9kZSwgbm9kZV9wb3NzaWJsZV9tYXApKQorCQlpZiAoIW5vZGVfb25saW5lKG5vZGUpKQogCQkJbnVtYV9jbGVhcl9ub2RlKGkpOwogCX0KIAludW1hX2luaXRfYXJyYXkoKTsKQEAgLTUxMCwyNiArNDY2LDYgQEAKIH0KICNlbmRpZiAvKiBDT05GSUdfTlVNQV9FTVUgKi8KIAotdm9pZCBfX2luaXQgc3JhdF9yZXNlcnZlX2FkZF9hcmVhKGludCBub2RlaWQpCi17Ci0JaWYgKGZvdW5kX2FkZF9hcmVhICYmIG5vZGVzX2FkZFtub2RlaWRdLmVuZCkgewotCQl1NjQgdG90YWxfbWI7Ci0KLQkJcHJpbnRrKEtFUk5fSU5GTyAiU1JBVDogUmVzZXJ2aW5nIGhvdC1hZGQgbWVtb3J5IHNwYWNlICIKLQkJCQkiZm9yIG5vZGUgJWQgYXQgJUx4LSVMeFxuIiwKLQkJCW5vZGVpZCwgbm9kZXNfYWRkW25vZGVpZF0uc3RhcnQsIG5vZGVzX2FkZFtub2RlaWRdLmVuZCk7Ci0JCXRvdGFsX21iID0gKG5vZGVzX2FkZFtub2RlaWRdLmVuZCAtIG5vZGVzX2FkZFtub2RlaWRdLnN0YXJ0KQotCQkJCQk+PiBQQUdFX1NISUZUOwotCQl0b3RhbF9tYiAqPSBzaXplb2Yoc3RydWN0IHBhZ2UpOwotCQl0b3RhbF9tYiA+Pj0gMjA7Ci0JCXByaW50ayhLRVJOX0lORk8gIlNSQVQ6IFRoaXMgd2lsbCBjb3N0IHlvdSAlTHUgTUIgb2YgIgotCQkJCSJwcmUtYWxsb2NhdGVkIG1lbW9yeS5cbiIsICh1bnNpZ25lZCBsb25nIGxvbmcpdG90YWxfbWIpOwotCQlyZXNlcnZlX2Jvb3RtZW1fbm9kZShOT0RFX0RBVEEobm9kZWlkKSwgbm9kZXNfYWRkW25vZGVpZF0uc3RhcnQsCi0JCQkgICAgICAgbm9kZXNfYWRkW25vZGVpZF0uZW5kIC0gbm9kZXNfYWRkW25vZGVpZF0uc3RhcnQsCi0JCQkgICAgICAgQk9PVE1FTV9ERUZBVUxUKTsKLQl9Ci19Ci0KIGludCBfX25vZGVfZGlzdGFuY2UoaW50IGEsIGludCBiKQogewogCWludCBpbmRleDsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYyBiL2FyY2gveDg2L29wcm9maWxlL25taV9pbnQuYwppbmRleCAzYjI4NWU2Li4yOGVlNDkwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9ubWlfaW50LmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvbm1pX2ludC5jCkBAIC0zMSw2ICszMSwyNiBAQAogLyogMCA9PSByZWdpc3RlcmVkIGJ1dCBvZmYsIDEgPT0gcmVnaXN0ZXJlZCBhbmQgb24gKi8KIHN0YXRpYyBpbnQgbm1pX2VuYWJsZWQgPSAwOwogCisvKiBjb21tb24gZnVuY3Rpb25zICovCisKK3U2NCBvcF94ODZfZ2V0X2N0cmwoc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0ICptb2RlbCwKKwkJICAgIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY291bnRlcl9jb25maWcpCit7CisJdTY0IHZhbCA9IDA7CisJdTE2IGV2ZW50ID0gKHUxNiljb3VudGVyX2NvbmZpZy0+ZXZlbnQ7CisKKwl2YWwgfD0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMX0lOVDsKKwl2YWwgfD0gY291bnRlcl9jb25maWctPnVzZXIgPyBBUkNIX1BFUkZNT05fRVZFTlRTRUxfVVNSIDogMDsKKwl2YWwgfD0gY291bnRlcl9jb25maWctPmtlcm5lbCA/IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTF9PUyA6IDA7CisJdmFsIHw9IChjb3VudGVyX2NvbmZpZy0+dW5pdF9tYXNrICYgMHhGRikgPDwgODsKKwlldmVudCAmPSBtb2RlbC0+ZXZlbnRfbWFzayA/IG1vZGVsLT5ldmVudF9tYXNrIDogMHhGRjsKKwl2YWwgfD0gZXZlbnQgJiAweEZGOworCXZhbCB8PSAoZXZlbnQgJiAweDBGMDApIDw8IDI0OworCisJcmV0dXJuIHZhbDsKK30KKworCiBzdGF0aWMgaW50IHByb2ZpbGVfZXhjZXB0aW9uc19ub3RpZnkoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpzZWxmLAogCQkJCSAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCiB7CkBAIC00MCw4ICs2MCw5IEBACiAKIAlzd2l0Y2ggKHZhbCkgewogCWNhc2UgRElFX05NSToKLQkJaWYgKG1vZGVsLT5jaGVja19jdHJzKGFyZ3MtPnJlZ3MsICZwZXJfY3B1KGNwdV9tc3JzLCBjcHUpKSkKLQkJCXJldCA9IE5PVElGWV9TVE9QOworCWNhc2UgRElFX05NSV9JUEk6CisJCW1vZGVsLT5jaGVja19jdHJzKGFyZ3MtPnJlZ3MsICZwZXJfY3B1KGNwdV9tc3JzLCBjcHUpKTsKKwkJcmV0ID0gTk9USUZZX1NUT1A7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCWJyZWFrOwpAQCAtNTEsMjYgKzcyLDE4IEBACiAKIHN0YXRpYyB2b2lkIG5taV9jcHVfc2F2ZV9yZWdpc3RlcnMoc3RydWN0IG9wX21zcnMgKm1zcnMpCiB7Ci0JdW5zaWduZWQgaW50IGNvbnN0IG5yX2N0cnMgPSBtb2RlbC0+bnVtX2NvdW50ZXJzOwotCXVuc2lnbmVkIGludCBjb25zdCBucl9jdHJscyA9IG1vZGVsLT5udW1fY29udHJvbHM7CiAJc3RydWN0IG9wX21zciAqY291bnRlcnMgPSBtc3JzLT5jb3VudGVyczsKIAlzdHJ1Y3Qgb3BfbXNyICpjb250cm9scyA9IG1zcnMtPmNvbnRyb2xzOwogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX2N0cnM7ICsraSkgewotCQlpZiAoY291bnRlcnNbaV0uYWRkcikgewotCQkJcmRtc3IoY291bnRlcnNbaV0uYWRkciwKLQkJCQljb3VudGVyc1tpXS5zYXZlZC5sb3csCi0JCQkJY291bnRlcnNbaV0uc2F2ZWQuaGlnaCk7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgbW9kZWwtPm51bV9jb3VudGVyczsgKytpKSB7CisJCWlmIChjb3VudGVyc1tpXS5hZGRyKQorCQkJcmRtc3JsKGNvdW50ZXJzW2ldLmFkZHIsIGNvdW50ZXJzW2ldLnNhdmVkKTsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgbnJfY3RybHM7ICsraSkgewotCQlpZiAoY29udHJvbHNbaV0uYWRkcikgewotCQkJcmRtc3IoY29udHJvbHNbaV0uYWRkciwKLQkJCQljb250cm9sc1tpXS5zYXZlZC5sb3csCi0JCQkJY29udHJvbHNbaV0uc2F2ZWQuaGlnaCk7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgbW9kZWwtPm51bV9jb250cm9sczsgKytpKSB7CisJCWlmIChjb250cm9sc1tpXS5hZGRyKQorCQkJcmRtc3JsKGNvbnRyb2xzW2ldLmFkZHIsIGNvbnRyb2xzW2ldLnNhdmVkKTsKIAl9CiB9CiAKQEAgLTEyNSw3ICsxMzgsNyBAQAogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CiAJc3RydWN0IG9wX21zcnMgKm1zcnMgPSAmcGVyX2NwdShjcHVfbXNycywgY3B1KTsKIAlzcGluX2xvY2soJm9wcm9maWxlZnNfbG9jayk7Ci0JbW9kZWwtPnNldHVwX2N0cnMobXNycyk7CisJbW9kZWwtPnNldHVwX2N0cnMobW9kZWwsIG1zcnMpOwogCXNwaW5fdW5sb2NrKCZvcHJvZmlsZWZzX2xvY2spOwogCXBlcl9jcHUoc2F2ZWRfbHZ0cGMsIGNwdSkgPSBhcGljX3JlYWQoQVBJQ19MVlRQQyk7CiAJYXBpY193cml0ZShBUElDX0xWVFBDLCBBUElDX0RNX05NSSk7CkBAIC0xMzQsNyArMTQ3LDcgQEAKIHN0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgcHJvZmlsZV9leGNlcHRpb25zX25iID0gewogCS5ub3RpZmllcl9jYWxsID0gcHJvZmlsZV9leGNlcHRpb25zX25vdGlmeSwKIAkubmV4dCA9IE5VTEwsCi0JLnByaW9yaXR5ID0gMAorCS5wcmlvcml0eSA9IDIKIH07CiAKIHN0YXRpYyBpbnQgbm1pX3NldHVwKHZvaWQpCkBAIC0xNzcsMjYgKzE5MCwxOCBAQAogCiBzdGF0aWMgdm9pZCBubWlfcmVzdG9yZV9yZWdpc3RlcnMoc3RydWN0IG9wX21zcnMgKm1zcnMpCiB7Ci0JdW5zaWduZWQgaW50IGNvbnN0IG5yX2N0cnMgPSBtb2RlbC0+bnVtX2NvdW50ZXJzOwotCXVuc2lnbmVkIGludCBjb25zdCBucl9jdHJscyA9IG1vZGVsLT5udW1fY29udHJvbHM7CiAJc3RydWN0IG9wX21zciAqY291bnRlcnMgPSBtc3JzLT5jb3VudGVyczsKIAlzdHJ1Y3Qgb3BfbXNyICpjb250cm9scyA9IG1zcnMtPmNvbnRyb2xzOwogCXVuc2lnbmVkIGludCBpOwogCi0JZm9yIChpID0gMDsgaSA8IG5yX2N0cmxzOyArK2kpIHsKLQkJaWYgKGNvbnRyb2xzW2ldLmFkZHIpIHsKLQkJCXdybXNyKGNvbnRyb2xzW2ldLmFkZHIsCi0JCQkJY29udHJvbHNbaV0uc2F2ZWQubG93LAotCQkJCWNvbnRyb2xzW2ldLnNhdmVkLmhpZ2gpOwotCQl9CisJZm9yIChpID0gMDsgaSA8IG1vZGVsLT5udW1fY29udHJvbHM7ICsraSkgeworCQlpZiAoY29udHJvbHNbaV0uYWRkcikKKwkJCXdybXNybChjb250cm9sc1tpXS5hZGRyLCBjb250cm9sc1tpXS5zYXZlZCk7CiAJfQogCi0JZm9yIChpID0gMDsgaSA8IG5yX2N0cnM7ICsraSkgewotCQlpZiAoY291bnRlcnNbaV0uYWRkcikgewotCQkJd3Jtc3IoY291bnRlcnNbaV0uYWRkciwKLQkJCQljb3VudGVyc1tpXS5zYXZlZC5sb3csCi0JCQkJY291bnRlcnNbaV0uc2F2ZWQuaGlnaCk7Ci0JCX0KKwlmb3IgKGkgPSAwOyBpIDwgbW9kZWwtPm51bV9jb3VudGVyczsgKytpKSB7CisJCWlmIChjb3VudGVyc1tpXS5hZGRyKQorCQkJd3Jtc3JsKGNvdW50ZXJzW2ldLmFkZHIsIGNvdW50ZXJzW2ldLnNhdmVkKTsKIAl9CiB9CiAKQEAgLTQwMSw2ICs0MDYsNyBAQAogc3RhdGljIGludCBfX2luaXQgcHByb19pbml0KGNoYXIgKipjcHVfdHlwZSkKIHsKIAlfX3U4IGNwdV9tb2RlbCA9IGJvb3RfY3B1X2RhdGEueDg2X21vZGVsOworCXN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCAqc3BlYyA9ICZvcF9wcHJvX3NwZWM7CS8qIGRlZmF1bHQgKi8KIAogCWlmIChmb3JjZV9hcmNoX3BlcmZtb24gJiYgY3B1X2hhc19hcmNoX3BlcmZtb24pCiAJCXJldHVybiAwOwpAQCAtNDI3LDcgKzQzMyw3IEBACiAJCSpjcHVfdHlwZSA9ICJpMzg2L2NvcmVfMiI7CiAJCWJyZWFrOwogCWNhc2UgMjY6Ci0JCWFyY2hfcGVyZm1vbl9zZXR1cF9jb3VudGVycygpOworCQlzcGVjID0gJm9wX2FyY2hfcGVyZm1vbl9zcGVjOwogCQkqY3B1X3R5cGUgPSAiaTM4Ni9jb3JlX2k3IjsKIAkJYnJlYWs7CiAJY2FzZSAyODoKQEAgLTQzOCwxNyArNDQ0LDcgQEAKIAkJcmV0dXJuIDA7CiAJfQogCi0JbW9kZWwgPSAmb3BfcHByb19zcGVjOwotCXJldHVybiAxOwotfQotCi1zdGF0aWMgaW50IF9faW5pdCBhcmNoX3BlcmZtb25faW5pdChjaGFyICoqY3B1X3R5cGUpCi17Ci0JaWYgKCFjcHVfaGFzX2FyY2hfcGVyZm1vbikKLQkJcmV0dXJuIDA7Ci0JKmNwdV90eXBlID0gImkzODYvYXJjaF9wZXJmbW9uIjsKLQltb2RlbCA9ICZvcF9hcmNoX3BlcmZtb25fc3BlYzsKLQlhcmNoX3BlcmZtb25fc2V0dXBfY291bnRlcnMoKTsKKwltb2RlbCA9IHNwZWM7CiAJcmV0dXJuIDE7CiB9CiAKQEAgLTQ3MCwyNyArNDY2LDI2IEBACiAJCS8qIE5lZWRzIHRvIGJlIGF0IGxlYXN0IGFuIEF0aGxvbiAob3IgaGFtbWVyIGluIDMyYml0IG1vZGUpICovCiAKIAkJc3dpdGNoIChmYW1pbHkpIHsKLQkJZGVmYXVsdDoKLQkJCXJldHVybiAtRU5PREVWOwogCQljYXNlIDY6Ci0JCQltb2RlbCA9ICZvcF9hbWRfc3BlYzsKIAkJCWNwdV90eXBlID0gImkzODYvYXRobG9uIjsKIAkJCWJyZWFrOwogCQljYXNlIDB4ZjoKLQkJCW1vZGVsID0gJm9wX2FtZF9zcGVjOwotCQkJLyogQWN0dWFsbHkgaXQgY291bGQgYmUgaTM4Ni9oYW1tZXIgdG9vLCBidXQgZ2l2ZQotCQkJIHVzZXIgc3BhY2UgYW4gY29uc2lzdGVudCBuYW1lLiAqLworCQkJLyoKKwkJCSAqIEFjdHVhbGx5IGl0IGNvdWxkIGJlIGkzODYvaGFtbWVyIHRvbywgYnV0CisJCQkgKiBnaXZlIHVzZXIgc3BhY2UgYW4gY29uc2lzdGVudCBuYW1lLgorCQkJICovCiAJCQljcHVfdHlwZSA9ICJ4ODYtNjQvaGFtbWVyIjsKIAkJCWJyZWFrOwogCQljYXNlIDB4MTA6Ci0JCQltb2RlbCA9ICZvcF9hbWRfc3BlYzsKIAkJCWNwdV90eXBlID0gIng4Ni02NC9mYW1pbHkxMCI7CiAJCQlicmVhazsKIAkJY2FzZSAweDExOgotCQkJbW9kZWwgPSAmb3BfYW1kX3NwZWM7CiAJCQljcHVfdHlwZSA9ICJ4ODYtNjQvZmFtaWx5MTFoIjsKIAkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJcmV0dXJuIC1FTk9ERVY7CiAJCX0KKwkJbW9kZWwgPSAmb3BfYW1kX3NwZWM7CiAJCWJyZWFrOwogCiAJY2FzZSBYODZfVkVORE9SX0lOVEVMOgpAQCAtNTA5LDggKzUwNCwxNSBAQAogCQkJYnJlYWs7CiAJCX0KIAotCQlpZiAoIWNwdV90eXBlICYmICFhcmNoX3BlcmZtb25faW5pdCgmY3B1X3R5cGUpKQorCQlpZiAoY3B1X3R5cGUpCisJCQlicmVhazsKKworCQlpZiAoIWNwdV9oYXNfYXJjaF9wZXJmbW9uKQogCQkJcmV0dXJuIC1FTk9ERVY7CisKKwkJLyogdXNlIGFyY2ggcGVyZm1vbiBhcyBmYWxsYmFjayAqLworCQljcHVfdHlwZSA9ICJpMzg2L2FyY2hfcGVyZm1vbiI7CisJCW1vZGVsID0gJm9wX2FyY2hfcGVyZm1vbl9zcGVjOwogCQlicmVhazsKIAogCWRlZmF1bHQ6CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9hbWQuYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCmluZGV4IDhmZGYwNmUuLmNjOTMwNDYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCisrKyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX2FtZC5jCkBAIC0yNSw0MyArMjUsMjggQEAKIAogI2RlZmluZSBOVU1fQ09VTlRFUlMgNAogI2RlZmluZSBOVU1fQ09OVFJPTFMgNAorI2RlZmluZSBPUF9FVkVOVF9NQVNLCQkJMHgwRkZGCisjZGVmaW5lIE9QX0NUUl9PVkVSRkxPVwkJCSgxVUxMPDwzMSkKIAotI2RlZmluZSBDVFJfSVNfUkVTRVJWRUQobXNycywgYykgKG1zcnMtPmNvdW50ZXJzWyhjKV0uYWRkciA/IDEgOiAwKQotI2RlZmluZSBDVFJfUkVBRChsLCBoLCBtc3JzLCBjKSBkbyB7cmRtc3IobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyLCAobCksIChoKSk7IH0gd2hpbGUgKDApCi0jZGVmaW5lIENUUl9XUklURShsLCBtc3JzLCBjKSBkbyB7d3Jtc3IobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyLCAtKHVuc2lnbmVkIGludCkobCksIC0xKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQ1RSX09WRVJGTE9XRUQobikgKCEoKG4pICYgKDFVPDwzMSkpKQotCi0jZGVmaW5lIENUUkxfSVNfUkVTRVJWRUQobXNycywgYykgKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciA/IDEgOiAwKQotI2RlZmluZSBDVFJMX1JFQUQobCwgaCwgbXNycywgYykgZG8ge3JkbXNyKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciwgKGwpLCAoaCkpOyB9IHdoaWxlICgwKQotI2RlZmluZSBDVFJMX1dSSVRFKGwsIGgsIG1zcnMsIGMpIGRvIHt3cm1zcihtc3JzLT5jb250cm9sc1soYyldLmFkZHIsIChsKSwgKGgpKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQ1RSTF9TRVRfQUNUSVZFKG4pIChuIHw9ICgxPDwyMikpCi0jZGVmaW5lIENUUkxfU0VUX0lOQUNUSVZFKG4pIChuICY9IH4oMTw8MjIpKQotI2RlZmluZSBDVFJMX0NMRUFSX0xPKHgpICh4ICY9ICgxPDwyMSkpCi0jZGVmaW5lIENUUkxfQ0xFQVJfSEkoeCkgKHggJj0gMHhmZmZmZmNmMCkKLSNkZWZpbmUgQ1RSTF9TRVRfRU5BQkxFKHZhbCkgKHZhbCB8PSAxPDwyMCkKLSNkZWZpbmUgQ1RSTF9TRVRfVVNSKHZhbCwgdSkgKHZhbCB8PSAoKHUgJiAxKSA8PCAxNikpCi0jZGVmaW5lIENUUkxfU0VUX0tFUk4odmFsLCBrKSAodmFsIHw9ICgoayAmIDEpIDw8IDE3KSkKLSNkZWZpbmUgQ1RSTF9TRVRfVU0odmFsLCBtKSAodmFsIHw9IChtIDw8IDgpKQotI2RlZmluZSBDVFJMX1NFVF9FVkVOVF9MT1codmFsLCBlKSAodmFsIHw9IChlICYgMHhmZikpCi0jZGVmaW5lIENUUkxfU0VUX0VWRU5UX0hJR0godmFsLCBlKSAodmFsIHw9ICgoZSA+PiA4KSAmIDB4ZikpCi0jZGVmaW5lIENUUkxfU0VUX0hPU1RfT05MWSh2YWwsIGgpICh2YWwgfD0gKChoICYgMSkgPDwgOSkpCi0jZGVmaW5lIENUUkxfU0VUX0dVRVNUX09OTFkodmFsLCBoKSAodmFsIHw9ICgoaCAmIDEpIDw8IDgpKQorI2RlZmluZSBNU1JfQU1EX0VWRU5UU0VMX1JFU0VSVkVECSgoMHhGRkZGRkNGMFVMTDw8MzIpfCgxVUxMPDwyMSkpCiAKIHN0YXRpYyB1bnNpZ25lZCBsb25nIHJlc2V0X3ZhbHVlW05VTV9DT1VOVEVSU107CiAKICNpZmRlZiBDT05GSUdfT1BST0ZJTEVfSUJTCiAKIC8qIElic0ZldGNoQ3RsIGJpdHMvbWFza3MgKi8KLSNkZWZpbmUgSUJTX0ZFVENIX0hJR0hfVkFMSURfQklUCSgxVUwgPDwgMTcpCS8qIGJpdCA0OSAqLwotI2RlZmluZSBJQlNfRkVUQ0hfSElHSF9FTkFCTEUJCSgxVUwgPDwgMTYpCS8qIGJpdCA0OCAqLwotI2RlZmluZSBJQlNfRkVUQ0hfTE9XX01BWF9DTlRfTUFTSwkweDAwMDBGRkZGVUwJLyogTWF4Q250IG1hc2sgKi8KKyNkZWZpbmUgSUJTX0ZFVENIX1JBTkRfRU4JCSgxVUxMPDw1NykKKyNkZWZpbmUgSUJTX0ZFVENIX1ZBTAkJCSgxVUxMPDw0OSkKKyNkZWZpbmUgSUJTX0ZFVENIX0VOQUJMRQkJKDFVTEw8PDQ4KQorI2RlZmluZSBJQlNfRkVUQ0hfQ05UX01BU0sJCTB4RkZGRjAwMDBVTEwKIAogLypJYnNPcEN0bCBiaXRzICovCi0jZGVmaW5lIElCU19PUF9MT1dfVkFMSURfQklUCQkoMVVMTDw8MTgpCS8qIGJpdCAxOCAqLwotI2RlZmluZSBJQlNfT1BfTE9XX0VOQUJMRQkJKDFVTEw8PDE3KQkvKiBiaXQgMTcgKi8KKyNkZWZpbmUgSUJTX09QX0NOVF9DVEwJCQkoMVVMTDw8MTkpCisjZGVmaW5lIElCU19PUF9WQUwJCQkoMVVMTDw8MTgpCisjZGVmaW5lIElCU19PUF9FTkFCTEUJCQkoMVVMTDw8MTcpCiAKLSNkZWZpbmUgSUJTX0ZFVENIX1NJWkUJNgotI2RlZmluZSBJQlNfT1BfU0laRQkxMgorI2RlZmluZSBJQlNfRkVUQ0hfU0laRQkJCTYKKyNkZWZpbmUgSUJTX09QX1NJWkUJCQkxMgogCiBzdGF0aWMgaW50IGhhc19pYnM7CS8qIEFNRCBGYW1pbHkxMGggYW5kIGxhdGVyICovCiAKQEAgLTk5LDQ5ICs4NCwzOCBAQAogCX0KIH0KIAotCi1zdGF0aWMgdm9pZCBvcF9hbWRfc2V0dXBfY3RycyhzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCitzdGF0aWMgdm9pZCBvcF9hbWRfc2V0dXBfY3RycyhzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3QgKm1vZGVsLAorCQkJICAgICAgc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQogewotCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CisJdTY0IHZhbDsKIAlpbnQgaTsKIAogCS8qIGNsZWFyIGFsbCBjb3VudGVycyAqLwogCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPTlRST0xTOyArK2kpIHsKLQkJaWYgKHVubGlrZWx5KCFDVFJMX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkKKwkJaWYgKHVubGlrZWx5KCFtc3JzLT5jb250cm9sc1tpXS5hZGRyKSkKIAkJCWNvbnRpbnVlOwotCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKLQkJQ1RSTF9DTEVBUl9MTyhsb3cpOwotCQlDVFJMX0NMRUFSX0hJKGhpZ2gpOwotCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJCXJkbXNybChtc3JzLT5jb250cm9sc1tpXS5hZGRyLCB2YWwpOworCQl2YWwgJj0gbW9kZWwtPnJlc2VydmVkOworCQl3cm1zcmwobXNycy0+Y29udHJvbHNbaV0uYWRkciwgdmFsKTsKIAl9CiAKIAkvKiBhdm9pZCBhIGZhbHNlIGRldGVjdGlvbiBvZiBjdHIgb3ZlcmZsb3dzIGluIE5NSSBoYW5kbGVyICovCiAJZm9yIChpID0gMDsgaSA8IE5VTV9DT1VOVEVSUzsgKytpKSB7Ci0JCWlmICh1bmxpa2VseSghQ1RSX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkKKwkJaWYgKHVubGlrZWx5KCFtc3JzLT5jb3VudGVyc1tpXS5hZGRyKSkKIAkJCWNvbnRpbnVlOwotCQlDVFJfV1JJVEUoMSwgbXNycywgaSk7CisJCXdybXNybChtc3JzLT5jb3VudGVyc1tpXS5hZGRyLCAtMUxMKTsKIAl9CiAKIAkvKiBlbmFibGUgYWN0aXZlIGNvdW50ZXJzICovCiAJZm9yIChpID0gMDsgaSA8IE5VTV9DT1VOVEVSUzsgKytpKSB7Ci0JCWlmICgoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCkgJiYgKENUUl9JU19SRVNFUlZFRChtc3JzLCBpKSkpIHsKKwkJaWYgKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQgJiYgbXNycy0+Y291bnRlcnNbaV0uYWRkcikgewogCQkJcmVzZXRfdmFsdWVbaV0gPSBjb3VudGVyX2NvbmZpZ1tpXS5jb3VudDsKLQotCQkJQ1RSX1dSSVRFKGNvdW50ZXJfY29uZmlnW2ldLmNvdW50LCBtc3JzLCBpKTsKLQotCQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCQlDVFJMX0NMRUFSX0xPKGxvdyk7Ci0JCQlDVFJMX0NMRUFSX0hJKGhpZ2gpOwotCQkJQ1RSTF9TRVRfRU5BQkxFKGxvdyk7Ci0JCQlDVFJMX1NFVF9VU1IobG93LCBjb3VudGVyX2NvbmZpZ1tpXS51c2VyKTsKLQkJCUNUUkxfU0VUX0tFUk4obG93LCBjb3VudGVyX2NvbmZpZ1tpXS5rZXJuZWwpOwotCQkJQ1RSTF9TRVRfVU0obG93LCBjb3VudGVyX2NvbmZpZ1tpXS51bml0X21hc2spOwotCQkJQ1RSTF9TRVRfRVZFTlRfTE9XKGxvdywgY291bnRlcl9jb25maWdbaV0uZXZlbnQpOwotCQkJQ1RSTF9TRVRfRVZFTlRfSElHSChoaWdoLCBjb3VudGVyX2NvbmZpZ1tpXS5ldmVudCk7Ci0JCQlDVFJMX1NFVF9IT1NUX09OTFkoaGlnaCwgMCk7Ci0JCQlDVFJMX1NFVF9HVUVTVF9PTkxZKGhpZ2gsIDApOwotCi0JCQlDVFJMX1dSSVRFKGxvdywgaGlnaCwgbXNycywgaSk7CisJCQl3cm1zcmwobXNycy0+Y291bnRlcnNbaV0uYWRkciwKKwkJCSAgICAgICAtKHM2NCljb3VudGVyX2NvbmZpZ1tpXS5jb3VudCk7CisJCQlyZG1zcmwobXNycy0+Y29udHJvbHNbaV0uYWRkciwgdmFsKTsKKwkJCXZhbCAmPSBtb2RlbC0+cmVzZXJ2ZWQ7CisJCQl2YWwgfD0gb3BfeDg2X2dldF9jdHJsKG1vZGVsLCAmY291bnRlcl9jb25maWdbaV0pOworCQkJd3Jtc3JsKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIsIHZhbCk7CiAJCX0gZWxzZSB7CiAJCQlyZXNldF92YWx1ZVtpXSA9IDA7CiAJCX0KQEAgLTE1NCw5MyArMTI4LDExNiBAQAogb3BfYW1kX2hhbmRsZV9pYnMoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAogCQkgIHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKIHsKLQl1MzIgbG93LCBoaWdoOwotCXU2NCBtc3I7CisJdTY0IHZhbCwgY3RsOwogCXN0cnVjdCBvcF9lbnRyeSBlbnRyeTsKIAogCWlmICghaGFzX2licykKIAkJcmV0dXJuIDE7CiAKIAlpZiAoaWJzX2NvbmZpZy5mZXRjaF9lbmFibGVkKSB7Ci0JCXJkbXNyKE1TUl9BTUQ2NF9JQlNGRVRDSENUTCwgbG93LCBoaWdoKTsKLQkJaWYgKGhpZ2ggJiBJQlNfRkVUQ0hfSElHSF9WQUxJRF9CSVQpIHsKLQkJCXJkbXNybChNU1JfQU1ENjRfSUJTRkVUQ0hMSU5BRCwgbXNyKTsKLQkJCW9wcm9maWxlX3dyaXRlX3Jlc2VydmUoJmVudHJ5LCByZWdzLCBtc3IsCisJCXJkbXNybChNU1JfQU1ENjRfSUJTRkVUQ0hDVEwsIGN0bCk7CisJCWlmIChjdGwgJiBJQlNfRkVUQ0hfVkFMKSB7CisJCQlyZG1zcmwoTVNSX0FNRDY0X0lCU0ZFVENITElOQUQsIHZhbCk7CisJCQlvcHJvZmlsZV93cml0ZV9yZXNlcnZlKCZlbnRyeSwgcmVncywgdmFsLAogCQkJCQkgICAgICAgSUJTX0ZFVENIX0NPREUsIElCU19GRVRDSF9TSVpFKTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMiltc3IpOwotCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKShtc3IgPj4gMzIpKTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgbG93KTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgaGlnaCk7Ci0JCQlyZG1zcmwoTVNSX0FNRDY0X0lCU0ZFVENIUEhZU0FELCBtc3IpOwotCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKW1zcik7Ci0JCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpKG1zciA+PiAzMikpOworCQkJb3Byb2ZpbGVfYWRkX2RhdGE2NCgmZW50cnksIHZhbCk7CisJCQlvcHJvZmlsZV9hZGRfZGF0YTY0KCZlbnRyeSwgY3RsKTsKKwkJCXJkbXNybChNU1JfQU1ENjRfSUJTRkVUQ0hQSFlTQUQsIHZhbCk7CisJCQlvcHJvZmlsZV9hZGRfZGF0YTY0KCZlbnRyeSwgdmFsKTsKIAkJCW9wcm9maWxlX3dyaXRlX2NvbW1pdCgmZW50cnkpOwogCiAJCQkvKiByZWVuYWJsZSB0aGUgSVJRICovCi0JCQloaWdoICY9IH5JQlNfRkVUQ0hfSElHSF9WQUxJRF9CSVQ7Ci0JCQloaWdoIHw9IElCU19GRVRDSF9ISUdIX0VOQUJMRTsKLQkJCWxvdyAmPSBJQlNfRkVUQ0hfTE9XX01BWF9DTlRfTUFTSzsKLQkJCXdybXNyKE1TUl9BTUQ2NF9JQlNGRVRDSENUTCwgbG93LCBoaWdoKTsKKwkJCWN0bCAmPSB+KElCU19GRVRDSF9WQUwgfCBJQlNfRkVUQ0hfQ05UX01BU0spOworCQkJY3RsIHw9IElCU19GRVRDSF9FTkFCTEU7CisJCQl3cm1zcmwoTVNSX0FNRDY0X0lCU0ZFVENIQ1RMLCBjdGwpOwogCQl9CiAJfQogCiAJaWYgKGlic19jb25maWcub3BfZW5hYmxlZCkgewotCQlyZG1zcihNU1JfQU1ENjRfSUJTT1BDVEwsIGxvdywgaGlnaCk7Ci0JCWlmIChsb3cgJiBJQlNfT1BfTE9XX1ZBTElEX0JJVCkgewotCQkJcmRtc3JsKE1TUl9BTUQ2NF9JQlNPUFJJUCwgbXNyKTsKLQkJCW9wcm9maWxlX3dyaXRlX3Jlc2VydmUoJmVudHJ5LCByZWdzLCBtc3IsCisJCXJkbXNybChNU1JfQU1ENjRfSUJTT1BDVEwsIGN0bCk7CisJCWlmIChjdGwgJiBJQlNfT1BfVkFMKSB7CisJCQlyZG1zcmwoTVNSX0FNRDY0X0lCU09QUklQLCB2YWwpOworCQkJb3Byb2ZpbGVfd3JpdGVfcmVzZXJ2ZSgmZW50cnksIHJlZ3MsIHZhbCwKIAkJCQkJICAgICAgIElCU19PUF9DT0RFLCBJQlNfT1BfU0laRSk7Ci0JCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpbXNyKTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMikobXNyID4+IDMyKSk7Ci0JCQlyZG1zcmwoTVNSX0FNRDY0X0lCU09QREFUQSwgbXNyKTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMiltc3IpOwotCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKShtc3IgPj4gMzIpKTsKLQkJCXJkbXNybChNU1JfQU1ENjRfSUJTT1BEQVRBMiwgbXNyKTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMiltc3IpOwotCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKShtc3IgPj4gMzIpKTsKLQkJCXJkbXNybChNU1JfQU1ENjRfSUJTT1BEQVRBMywgbXNyKTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMiltc3IpOwotCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKShtc3IgPj4gMzIpKTsKLQkJCXJkbXNybChNU1JfQU1ENjRfSUJTRENMSU5BRCwgbXNyKTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMiltc3IpOwotCQkJb3Byb2ZpbGVfYWRkX2RhdGEoJmVudHJ5LCAodTMyKShtc3IgPj4gMzIpKTsKLQkJCXJkbXNybChNU1JfQU1ENjRfSUJTRENQSFlTQUQsIG1zcik7Ci0JCQlvcHJvZmlsZV9hZGRfZGF0YSgmZW50cnksICh1MzIpbXNyKTsKLQkJCW9wcm9maWxlX2FkZF9kYXRhKCZlbnRyeSwgKHUzMikobXNyID4+IDMyKSk7CisJCQlvcHJvZmlsZV9hZGRfZGF0YTY0KCZlbnRyeSwgdmFsKTsKKwkJCXJkbXNybChNU1JfQU1ENjRfSUJTT1BEQVRBLCB2YWwpOworCQkJb3Byb2ZpbGVfYWRkX2RhdGE2NCgmZW50cnksIHZhbCk7CisJCQlyZG1zcmwoTVNSX0FNRDY0X0lCU09QREFUQTIsIHZhbCk7CisJCQlvcHJvZmlsZV9hZGRfZGF0YTY0KCZlbnRyeSwgdmFsKTsKKwkJCXJkbXNybChNU1JfQU1ENjRfSUJTT1BEQVRBMywgdmFsKTsKKwkJCW9wcm9maWxlX2FkZF9kYXRhNjQoJmVudHJ5LCB2YWwpOworCQkJcmRtc3JsKE1TUl9BTUQ2NF9JQlNEQ0xJTkFELCB2YWwpOworCQkJb3Byb2ZpbGVfYWRkX2RhdGE2NCgmZW50cnksIHZhbCk7CisJCQlyZG1zcmwoTVNSX0FNRDY0X0lCU0RDUEhZU0FELCB2YWwpOworCQkJb3Byb2ZpbGVfYWRkX2RhdGE2NCgmZW50cnksIHZhbCk7CiAJCQlvcHJvZmlsZV93cml0ZV9jb21taXQoJmVudHJ5KTsKIAogCQkJLyogcmVlbmFibGUgdGhlIElSUSAqLwotCQkJaGlnaCA9IDA7Ci0JCQlsb3cgJj0gfklCU19PUF9MT1dfVkFMSURfQklUOwotCQkJbG93IHw9IElCU19PUF9MT1dfRU5BQkxFOwotCQkJd3Jtc3IoTVNSX0FNRDY0X0lCU09QQ1RMLCBsb3csIGhpZ2gpOworCQkJY3RsICY9IH5JQlNfT1BfVkFMICYgMHhGRkZGRkZGRjsKKwkJCWN0bCB8PSBJQlNfT1BfRU5BQkxFOworCQkJd3Jtc3JsKE1TUl9BTUQ2NF9JQlNPUENUTCwgY3RsKTsKIAkJfQogCX0KIAogCXJldHVybiAxOwogfQogCitzdGF0aWMgaW5saW5lIHZvaWQgb3BfYW1kX3N0YXJ0X2licyh2b2lkKQoreworCXU2NCB2YWw7CisJaWYgKGhhc19pYnMgJiYgaWJzX2NvbmZpZy5mZXRjaF9lbmFibGVkKSB7CisJCXZhbCA9IChpYnNfY29uZmlnLm1heF9jbnRfZmV0Y2ggPj4gNCkgJiAweEZGRkY7CisJCXZhbCB8PSBpYnNfY29uZmlnLnJhbmRfZW4gPyBJQlNfRkVUQ0hfUkFORF9FTiA6IDA7CisJCXZhbCB8PSBJQlNfRkVUQ0hfRU5BQkxFOworCQl3cm1zcmwoTVNSX0FNRDY0X0lCU0ZFVENIQ1RMLCB2YWwpOworCX0KKworCWlmIChoYXNfaWJzICYmIGlic19jb25maWcub3BfZW5hYmxlZCkgeworCQl2YWwgPSAoaWJzX2NvbmZpZy5tYXhfY250X29wID4+IDQpICYgMHhGRkZGOworCQl2YWwgfD0gaWJzX2NvbmZpZy5kaXNwYXRjaGVkX29wcyA/IElCU19PUF9DTlRfQ1RMIDogMDsKKwkJdmFsIHw9IElCU19PUF9FTkFCTEU7CisJCXdybXNybChNU1JfQU1ENjRfSUJTT1BDVEwsIHZhbCk7CisJfQorfQorCitzdGF0aWMgdm9pZCBvcF9hbWRfc3RvcF9pYnModm9pZCkKK3sKKwlpZiAoaGFzX2licyAmJiBpYnNfY29uZmlnLmZldGNoX2VuYWJsZWQpCisJCS8qIGNsZWFyIG1heCBjb3VudCBhbmQgZW5hYmxlICovCisJCXdybXNybChNU1JfQU1ENjRfSUJTRkVUQ0hDVEwsIDApOworCisJaWYgKGhhc19pYnMgJiYgaWJzX2NvbmZpZy5vcF9lbmFibGVkKQorCQkvKiBjbGVhciBtYXggY291bnQgYW5kIGVuYWJsZSAqLworCQl3cm1zcmwoTVNSX0FNRDY0X0lCU09QQ1RMLCAwKTsKK30KKworI2Vsc2UKKworc3RhdGljIGlubGluZSBpbnQgb3BfYW1kX2hhbmRsZV9pYnMoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAorCQkJCSAgICBzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpIHsgfQorc3RhdGljIGlubGluZSB2b2lkIG9wX2FtZF9zdGFydF9pYnModm9pZCkgeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgb3BfYW1kX3N0b3BfaWJzKHZvaWQpIHsgfQorCiAjZW5kaWYKIAogc3RhdGljIGludCBvcF9hbWRfY2hlY2tfY3RycyhzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCiAJCQkgICAgIHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKIHsKLQl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCXU2NCB2YWw7CiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwIDsgaSA8IE5VTV9DT1VOVEVSUzsgKytpKSB7CiAJCWlmICghcmVzZXRfdmFsdWVbaV0pCiAJCQljb250aW51ZTsKLQkJQ1RSX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKLQkJaWYgKENUUl9PVkVSRkxPV0VEKGxvdykpIHsKLQkJCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgaSk7Ci0JCQlDVFJfV1JJVEUocmVzZXRfdmFsdWVbaV0sIG1zcnMsIGkpOwotCQl9CisJCXJkbXNybChtc3JzLT5jb3VudGVyc1tpXS5hZGRyLCB2YWwpOworCQkvKiBiaXQgaXMgY2xlYXIgaWYgb3ZlcmZsb3dlZDogKi8KKwkJaWYgKHZhbCAmIE9QX0NUUl9PVkVSRkxPVykKKwkJCWNvbnRpbnVlOworCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOworCQl3cm1zcmwobXNycy0+Y291bnRlcnNbaV0uYWRkciwgLShzNjQpcmVzZXRfdmFsdWVbaV0pOwogCX0KIAotI2lmZGVmIENPTkZJR19PUFJPRklMRV9JQlMKIAlvcF9hbWRfaGFuZGxlX2licyhyZWdzLCBtc3JzKTsKLSNlbmRpZgogCiAJLyogU2VlIG9wX21vZGVsX3Bwcm8uYyAqLwogCXJldHVybiAxOwpAQCAtMjQ4LDM4ICsyNDUsMjIgQEAKIAogc3RhdGljIHZvaWQgb3BfYW1kX3N0YXJ0KHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKIHsKLQl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCXU2NCB2YWw7CiAJaW50IGk7CiAJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlMgOyArK2kpIHsKIAkJaWYgKHJlc2V0X3ZhbHVlW2ldKSB7Ci0JCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKLQkJCUNUUkxfU0VUX0FDVElWRShsb3cpOwotCQkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOworCQkJcmRtc3JsKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIsIHZhbCk7CisJCQl2YWwgfD0gQVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEU7CisJCQl3cm1zcmwobXNycy0+Y29udHJvbHNbaV0uYWRkciwgdmFsKTsKIAkJfQogCX0KIAotI2lmZGVmIENPTkZJR19PUFJPRklMRV9JQlMKLQlpZiAoaGFzX2licyAmJiBpYnNfY29uZmlnLmZldGNoX2VuYWJsZWQpIHsKLQkJbG93ID0gKGlic19jb25maWcubWF4X2NudF9mZXRjaCA+PiA0KSAmIDB4RkZGRjsKLQkJaGlnaCA9ICgoaWJzX2NvbmZpZy5yYW5kX2VuICYgMHgxKSA8PCAyNSkgLyogYml0IDU3ICovCi0JCQkrIElCU19GRVRDSF9ISUdIX0VOQUJMRTsKLQkJd3Jtc3IoTVNSX0FNRDY0X0lCU0ZFVENIQ1RMLCBsb3csIGhpZ2gpOwotCX0KLQotCWlmIChoYXNfaWJzICYmIGlic19jb25maWcub3BfZW5hYmxlZCkgewotCQlsb3cgPSAoKGlic19jb25maWcubWF4X2NudF9vcCA+PiA0KSAmIDB4RkZGRikKLQkJCSsgKChpYnNfY29uZmlnLmRpc3BhdGNoZWRfb3BzICYgMHgxKSA8PCAxOSkgLyogYml0IDE5ICovCi0JCQkrIElCU19PUF9MT1dfRU5BQkxFOwotCQloaWdoID0gMDsKLQkJd3Jtc3IoTVNSX0FNRDY0X0lCU09QQ1RMLCBsb3csIGhpZ2gpOwotCX0KLSNlbmRpZgorCW9wX2FtZF9zdGFydF9pYnMoKTsKIH0KIAotCiBzdGF0aWMgdm9pZCBvcF9hbWRfc3RvcChzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCiB7Ci0JdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKwl1NjQgdmFsOwogCWludCBpOwogCiAJLyoKQEAgLTI4OSwyNiArMjcwLDEyIEBACiAJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09VTlRFUlMgOyArK2kpIHsKIAkJaWYgKCFyZXNldF92YWx1ZVtpXSkKIAkJCWNvbnRpbnVlOwotCQlDVFJMX1JFQUQobG93LCBoaWdoLCBtc3JzLCBpKTsKLQkJQ1RSTF9TRVRfSU5BQ1RJVkUobG93KTsKLQkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOworCQlyZG1zcmwobXNycy0+Y29udHJvbHNbaV0uYWRkciwgdmFsKTsKKwkJdmFsICY9IH5BUkNIX1BFUkZNT05fRVZFTlRTRUwwX0VOQUJMRTsKKwkJd3Jtc3JsKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIsIHZhbCk7CiAJfQogCi0jaWZkZWYgQ09ORklHX09QUk9GSUxFX0lCUwotCWlmIChoYXNfaWJzICYmIGlic19jb25maWcuZmV0Y2hfZW5hYmxlZCkgewotCQkvKiBjbGVhciBtYXggY291bnQgYW5kIGVuYWJsZSAqLwotCQlsb3cgPSAwOwotCQloaWdoID0gMDsKLQkJd3Jtc3IoTVNSX0FNRDY0X0lCU0ZFVENIQ1RMLCBsb3csIGhpZ2gpOwotCX0KLQotCWlmIChoYXNfaWJzICYmIGlic19jb25maWcub3BfZW5hYmxlZCkgewotCQkvKiBjbGVhciBtYXggY291bnQgYW5kIGVuYWJsZSAqLwotCQlsb3cgPSAwOwotCQloaWdoID0gMDsKLQkJd3Jtc3IoTVNSX0FNRDY0X0lCU09QQ1RMLCBsb3csIGhpZ2gpOwotCX0KLSNlbmRpZgorCW9wX2FtZF9zdG9wX2licygpOwogfQogCiBzdGF0aWMgdm9pZCBvcF9hbWRfc2h1dGRvd24oc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQpAQCAtMzE2LDExICsyODMsMTEgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDAgOyBpIDwgTlVNX0NPVU5URVJTIDsgKytpKSB7Ci0JCWlmIChDVFJfSVNfUkVTRVJWRUQobXNycywgaSkpCisJCWlmIChtc3JzLT5jb3VudGVyc1tpXS5hZGRyKQogCQkJcmVsZWFzZV9wZXJmY3RyX25taShNU1JfSzdfUEVSRkNUUjAgKyBpKTsKIAl9CiAJZm9yIChpID0gMCA7IGkgPCBOVU1fQ09OVFJPTFMgOyArK2kpIHsKLQkJaWYgKENUUkxfSVNfUkVTRVJWRUQobXNycywgaSkpCisJCWlmIChtc3JzLT5jb250cm9sc1tpXS5hZGRyKQogCQkJcmVsZWFzZV9ldm50c2VsX25taShNU1JfSzdfRVZOVFNFTDAgKyBpKTsKIAl9CiB9CkBAIC00OTEsMTQgKzQ1OCwxNiBAQAogI2VuZGlmIC8qIENPTkZJR19PUFJPRklMRV9JQlMgKi8KIAogc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX2FtZF9zcGVjID0gewotCS5pbml0CQkJPSBvcF9hbWRfaW5pdCwKLQkuZXhpdAkJCT0gb3BfYW1kX2V4aXQsCiAJLm51bV9jb3VudGVycwkJPSBOVU1fQ09VTlRFUlMsCiAJLm51bV9jb250cm9scwkJPSBOVU1fQ09OVFJPTFMsCisJLnJlc2VydmVkCQk9IE1TUl9BTURfRVZFTlRTRUxfUkVTRVJWRUQsCisJLmV2ZW50X21hc2sJCT0gT1BfRVZFTlRfTUFTSywKKwkuaW5pdAkJCT0gb3BfYW1kX2luaXQsCisJLmV4aXQJCQk9IG9wX2FtZF9leGl0LAogCS5maWxsX2luX2FkZHJlc3Nlcwk9ICZvcF9hbWRfZmlsbF9pbl9hZGRyZXNzZXMsCiAJLnNldHVwX2N0cnMJCT0gJm9wX2FtZF9zZXR1cF9jdHJzLAogCS5jaGVja19jdHJzCQk9ICZvcF9hbWRfY2hlY2tfY3RycywKIAkuc3RhcnQJCQk9ICZvcF9hbWRfc3RhcnQsCiAJLnN0b3AJCQk9ICZvcF9hbWRfc3RvcCwKLQkuc2h1dGRvd24JCT0gJm9wX2FtZF9zaHV0ZG93bgorCS5zaHV0ZG93bgkJPSAmb3BfYW1kX3NodXRkb3duLAogfTsKZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX3A0LmMgYi9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wNC5jCmluZGV4IDgxOWIxMzEuLmYwMWU1M2IgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX3A0LmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvb3BfbW9kZWxfcDQuYwpAQCAtMzIsNiArMzIsOCBAQAogI2RlZmluZSBOVU1fQ0NDUlNfSFQyIDkKICNkZWZpbmUgTlVNX0NPTlRST0xTX0hUMiAoTlVNX0VTQ1JTX0hUMiArIE5VTV9DQ0NSU19IVDIpCiAKKyNkZWZpbmUgT1BfQ1RSX09WRVJGTE9XCQkJKDFVTEw8PDMxKQorCiBzdGF0aWMgdW5zaWduZWQgaW50IG51bV9jb3VudGVycyA9IE5VTV9DT1VOVEVSU19OT05fSFQ7CiBzdGF0aWMgdW5zaWduZWQgaW50IG51bV9jb250cm9scyA9IE5VTV9DT05UUk9MU19OT05fSFQ7CiAKQEAgLTM1MCw4ICszNTIsNiBAQAogI2RlZmluZSBFU0NSX1NFVF9PU18xKGVzY3IsIG9zKSAoKGVzY3IpIHw9ICgoKG9zKSAmIDEpIDw8IDEpKQogI2RlZmluZSBFU0NSX1NFVF9FVkVOVF9TRUxFQ1QoZXNjciwgc2VsKSAoKGVzY3IpIHw9ICgoKHNlbCkgJiAweDNmKSA8PCAyNSkpCiAjZGVmaW5lIEVTQ1JfU0VUX0VWRU5UX01BU0soZXNjciwgbWFzaykgKChlc2NyKSB8PSAoKChtYXNrKSAmIDB4ZmZmZikgPDwgOSkpCi0jZGVmaW5lIEVTQ1JfUkVBRChlc2NyLCBoaWdoLCBldiwgaSkgZG8ge3JkbXNyKGV2LT5iaW5kaW5nc1soaSldLmVzY3JfYWRkcmVzcywgKGVzY3IpLCAoaGlnaCkpOyB9IHdoaWxlICgwKQotI2RlZmluZSBFU0NSX1dSSVRFKGVzY3IsIGhpZ2gsIGV2LCBpKSBkbyB7d3Jtc3IoZXYtPmJpbmRpbmdzWyhpKV0uZXNjcl9hZGRyZXNzLCAoZXNjciksIChoaWdoKSk7IH0gd2hpbGUgKDApCiAKICNkZWZpbmUgQ0NDUl9SRVNFUlZFRF9CSVRTIDB4MzgwMzBGRkYKICNkZWZpbmUgQ0NDUl9DTEVBUihjY2NyKSAoKGNjY3IpICY9IENDQ1JfUkVTRVJWRURfQklUUykKQEAgLTM2MSwxNyArMzYxLDkgQEAKICNkZWZpbmUgQ0NDUl9TRVRfUE1JX09WRl8xKGNjY3IpICgoY2NjcikgfD0gKDE8PDI3KSkKICNkZWZpbmUgQ0NDUl9TRVRfRU5BQkxFKGNjY3IpICgoY2NjcikgfD0gKDE8PDEyKSkKICNkZWZpbmUgQ0NDUl9TRVRfRElTQUJMRShjY2NyKSAoKGNjY3IpICY9IH4oMTw8MTIpKQotI2RlZmluZSBDQ0NSX1JFQUQobG93LCBoaWdoLCBpKSBkbyB7cmRtc3IocDRfY291bnRlcnNbKGkpXS5jY2NyX2FkZHJlc3MsIChsb3cpLCAoaGlnaCkpOyB9IHdoaWxlICgwKQotI2RlZmluZSBDQ0NSX1dSSVRFKGxvdywgaGlnaCwgaSkgZG8ge3dybXNyKHA0X2NvdW50ZXJzWyhpKV0uY2Njcl9hZGRyZXNzLCAobG93KSwgKGhpZ2gpKTsgfSB3aGlsZSAoMCkKICNkZWZpbmUgQ0NDUl9PVkZfUChjY2NyKSAoKGNjY3IpICYgKDFVPDwzMSkpCiAjZGVmaW5lIENDQ1JfQ0xFQVJfT1ZGKGNjY3IpICgoY2NjcikgJj0gKH4oMVU8PDMxKSkpCiAKLSNkZWZpbmUgQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyID8gMSA6IDApCi0jZGVmaW5lIENUUl9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y291bnRlcnNbKGMpXS5hZGRyID8gMSA6IDApCi0jZGVmaW5lIENUUl9SRUFEKGwsIGgsIGkpIGRvIHtyZG1zcihwNF9jb3VudGVyc1soaSldLmNvdW50ZXJfYWRkcmVzcywgKGwpLCAoaCkpOyB9IHdoaWxlICgwKQotI2RlZmluZSBDVFJfV1JJVEUobCwgaSkgZG8ge3dybXNyKHA0X2NvdW50ZXJzWyhpKV0uY291bnRlcl9hZGRyZXNzLCAtKHUzMikobCksIC0xKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQ1RSX09WRVJGTE9XX1AoY3RyKSAoISgoY3RyKSAmIDB4ODAwMDAwMDApKQotCiAKIC8qIHRoaXMgYXNzaWducyBhICJzdGFnZ2VyIiB0byB0aGUgY3VycmVudCBDUFUsIHdoaWNoIGlzIHVzZWQgdGhyb3VnaG91dAogICAgdGhlIGNvZGUgaW4gdGhpcyBtb2R1bGUgYXMgYW4gZXh0cmEgYXJyYXkgb2Zmc2V0LCB0byBzZWxlY3QgdGhlICJldmVuIgpAQCAtNTE1LDcgKzUwNyw3IEBACiAJCWlmIChldi0+YmluZGluZ3NbaV0udmlydF9jb3VudGVyICYgY291bnRlcl9iaXQpIHsKIAogCQkJLyogbW9kaWZ5IEVTQ1IgKi8KLQkJCUVTQ1JfUkVBRChlc2NyLCBoaWdoLCBldiwgaSk7CisJCQlyZG1zcihldi0+YmluZGluZ3NbaV0uZXNjcl9hZGRyZXNzLCBlc2NyLCBoaWdoKTsKIAkJCUVTQ1JfQ0xFQVIoZXNjcik7CiAJCQlpZiAoc3RhZyA9PSAwKSB7CiAJCQkJRVNDUl9TRVRfVVNSXzAoZXNjciwgY291bnRlcl9jb25maWdbY3RyXS51c2VyKTsKQEAgLTUyNiwxMCArNTE4LDExIEBACiAJCQl9CiAJCQlFU0NSX1NFVF9FVkVOVF9TRUxFQ1QoZXNjciwgZXYtPmV2ZW50X3NlbGVjdCk7CiAJCQlFU0NSX1NFVF9FVkVOVF9NQVNLKGVzY3IsIGNvdW50ZXJfY29uZmlnW2N0cl0udW5pdF9tYXNrKTsKLQkJCUVTQ1JfV1JJVEUoZXNjciwgaGlnaCwgZXYsIGkpOworCQkJd3Jtc3IoZXYtPmJpbmRpbmdzW2ldLmVzY3JfYWRkcmVzcywgZXNjciwgaGlnaCk7CiAKIAkJCS8qIG1vZGlmeSBDQ0NSICovCi0JCQlDQ0NSX1JFQUQoY2NjciwgaGlnaCwgVklSVF9DVFIoc3RhZywgY3RyKSk7CisJCQlyZG1zcihwNF9jb3VudGVyc1tWSVJUX0NUUihzdGFnLCBjdHIpXS5jY2NyX2FkZHJlc3MsCisJCQkgICAgICBjY2NyLCBoaWdoKTsKIAkJCUNDQ1JfQ0xFQVIoY2Njcik7CiAJCQlDQ0NSX1NFVF9SRVFVSVJFRF9CSVRTKGNjY3IpOwogCQkJQ0NDUl9TRVRfRVNDUl9TRUxFQ1QoY2NjciwgZXYtPmVzY3Jfc2VsZWN0KTsKQEAgLTUzNyw3ICs1MzAsOCBAQAogCQkJCUNDQ1JfU0VUX1BNSV9PVkZfMChjY2NyKTsKIAkJCWVsc2UKIAkJCQlDQ0NSX1NFVF9QTUlfT1ZGXzEoY2Njcik7Ci0JCQlDQ0NSX1dSSVRFKGNjY3IsIGhpZ2gsIFZJUlRfQ1RSKHN0YWcsIGN0cikpOworCQkJd3Jtc3IocDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgY3RyKV0uY2Njcl9hZGRyZXNzLAorCQkJICAgICAgY2NjciwgaGlnaCk7CiAJCQlyZXR1cm47CiAJCX0KIAl9CkBAIC01NDgsNyArNTQyLDggQEAKIH0KIAogCi1zdGF0aWMgdm9pZCBwNF9zZXR1cF9jdHJzKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKK3N0YXRpYyB2b2lkIHA0X3NldHVwX2N0cnMoc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0ICptb2RlbCwKKwkJCSAgc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKQogewogCXVuc2lnbmVkIGludCBpOwogCXVuc2lnbmVkIGludCBsb3csIGhpZ2g7CkBAIC01NjQsNyArNTU5LDcgQEAKIAogCS8qIGNsZWFyIHRoZSBjY2NycyB3ZSB3aWxsIHVzZSAqLwogCWZvciAoaSA9IDAgOyBpIDwgbnVtX2NvdW50ZXJzIDsgaSsrKSB7Ci0JCWlmICh1bmxpa2VseSghQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBpKSkpCisJCWlmICh1bmxpa2VseSghbXNycy0+Y29udHJvbHNbaV0uYWRkcikpCiAJCQljb250aW51ZTsKIAkJcmRtc3IocDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgaSldLmNjY3JfYWRkcmVzcywgbG93LCBoaWdoKTsKIAkJQ0NDUl9DTEVBUihsb3cpOwpAQCAtNTc0LDE3ICs1NjksMTggQEAKIAogCS8qIGNsZWFyIGFsbCBlc2NycyAoaW5jbHVkaW5nIHRob3NlIG91dHNpZGUgb3VyIGNvbmNlcm4pICovCiAJZm9yIChpID0gbnVtX2NvdW50ZXJzOyBpIDwgbnVtX2NvbnRyb2xzOyBpKyspIHsKLQkJaWYgKHVubGlrZWx5KCFDVFJMX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkKKwkJaWYgKHVubGlrZWx5KCFtc3JzLT5jb250cm9sc1tpXS5hZGRyKSkKIAkJCWNvbnRpbnVlOwogCQl3cm1zcihtc3JzLT5jb250cm9sc1tpXS5hZGRyLCAwLCAwKTsKIAl9CiAKIAkvKiBzZXR1cCBhbGwgY291bnRlcnMgKi8KIAlmb3IgKGkgPSAwIDsgaSA8IG51bV9jb3VudGVycyA7ICsraSkgewotCQlpZiAoKGNvdW50ZXJfY29uZmlnW2ldLmVuYWJsZWQpICYmIChDVFJMX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkgeworCQlpZiAoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCAmJiBtc3JzLT5jb250cm9sc1tpXS5hZGRyKSB7CiAJCQlyZXNldF92YWx1ZVtpXSA9IGNvdW50ZXJfY29uZmlnW2ldLmNvdW50OwogCQkJcG1jX3NldHVwX29uZV9wNF9jb3VudGVyKGkpOwotCQkJQ1RSX1dSSVRFKGNvdW50ZXJfY29uZmlnW2ldLmNvdW50LCBWSVJUX0NUUihzdGFnLCBpKSk7CisJCQl3cm1zcmwocDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgaSldLmNvdW50ZXJfYWRkcmVzcywKKwkJCSAgICAgICAtKHM2NCljb3VudGVyX2NvbmZpZ1tpXS5jb3VudCk7CiAJCX0gZWxzZSB7CiAJCQlyZXNldF92YWx1ZVtpXSA9IDA7CiAJCX0KQEAgLTYyNCwxNCArNjIwLDE2IEBACiAKIAkJcmVhbCA9IFZJUlRfQ1RSKHN0YWcsIGkpOwogCi0JCUNDQ1JfUkVBRChsb3csIGhpZ2gsIHJlYWwpOwotCQlDVFJfUkVBRChjdHIsIGhpZ2gsIHJlYWwpOwotCQlpZiAoQ0NDUl9PVkZfUChsb3cpIHx8IENUUl9PVkVSRkxPV19QKGN0cikpIHsKKwkJcmRtc3IocDRfY291bnRlcnNbcmVhbF0uY2Njcl9hZGRyZXNzLCBsb3csIGhpZ2gpOworCQlyZG1zcihwNF9jb3VudGVyc1tyZWFsXS5jb3VudGVyX2FkZHJlc3MsIGN0ciwgaGlnaCk7CisJCWlmIChDQ0NSX09WRl9QKGxvdykgfHwgIShjdHIgJiBPUF9DVFJfT1ZFUkZMT1cpKSB7CiAJCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOwotCQkJQ1RSX1dSSVRFKHJlc2V0X3ZhbHVlW2ldLCByZWFsKTsKKwkJCXdybXNybChwNF9jb3VudGVyc1tyZWFsXS5jb3VudGVyX2FkZHJlc3MsCisJCQkgICAgICAgLShzNjQpcmVzZXRfdmFsdWVbaV0pOwogCQkJQ0NDUl9DTEVBUl9PVkYobG93KTsKLQkJCUNDQ1JfV1JJVEUobG93LCBoaWdoLCByZWFsKTsKLQkJCUNUUl9XUklURShyZXNldF92YWx1ZVtpXSwgcmVhbCk7CisJCQl3cm1zcihwNF9jb3VudGVyc1tyZWFsXS5jY2NyX2FkZHJlc3MsIGxvdywgaGlnaCk7CisJCQl3cm1zcmwocDRfY291bnRlcnNbcmVhbF0uY291bnRlcl9hZGRyZXNzLAorCQkJICAgICAgIC0oczY0KXJlc2V0X3ZhbHVlW2ldKTsKIAkJfQogCX0KIApAQCAtNjUzLDkgKzY1MSw5IEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CiAJCWlmICghcmVzZXRfdmFsdWVbaV0pCiAJCQljb250aW51ZTsKLQkJQ0NDUl9SRUFEKGxvdywgaGlnaCwgVklSVF9DVFIoc3RhZywgaSkpOworCQlyZG1zcihwNF9jb3VudGVyc1tWSVJUX0NUUihzdGFnLCBpKV0uY2Njcl9hZGRyZXNzLCBsb3csIGhpZ2gpOwogCQlDQ0NSX1NFVF9FTkFCTEUobG93KTsKLQkJQ0NDUl9XUklURShsb3csIGhpZ2gsIFZJUlRfQ1RSKHN0YWcsIGkpKTsKKwkJd3Jtc3IocDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgaSldLmNjY3JfYWRkcmVzcywgbG93LCBoaWdoKTsKIAl9CiB9CiAKQEAgLTY3MCw5ICs2NjgsOSBAQAogCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgewogCQlpZiAoIXJlc2V0X3ZhbHVlW2ldKQogCQkJY29udGludWU7Ci0JCUNDQ1JfUkVBRChsb3csIGhpZ2gsIFZJUlRfQ1RSKHN0YWcsIGkpKTsKKwkJcmRtc3IocDRfY291bnRlcnNbVklSVF9DVFIoc3RhZywgaSldLmNjY3JfYWRkcmVzcywgbG93LCBoaWdoKTsKIAkJQ0NDUl9TRVRfRElTQUJMRShsb3cpOwotCQlDQ0NSX1dSSVRFKGxvdywgaGlnaCwgVklSVF9DVFIoc3RhZywgaSkpOworCQl3cm1zcihwNF9jb3VudGVyc1tWSVJUX0NUUihzdGFnLCBpKV0uY2Njcl9hZGRyZXNzLCBsb3csIGhpZ2gpOwogCX0KIH0KIApAQCAtNjgxLDcgKzY3OSw3IEBACiAJaW50IGk7CiAKIAlmb3IgKGkgPSAwIDsgaSA8IG51bV9jb3VudGVycyA7ICsraSkgewotCQlpZiAoQ1RSX0lTX1JFU0VSVkVEKG1zcnMsIGkpKQorCQlpZiAobXNycy0+Y291bnRlcnNbaV0uYWRkcikKIAkJCXJlbGVhc2VfcGVyZmN0cl9ubWkobXNycy0+Y291bnRlcnNbaV0uYWRkcik7CiAJfQogCS8qCkBAIC02OTAsNyArNjg4LDcgQEAKIAkgKiBUaGlzIHNhdmVzIGEgZmV3IGJpdHMuCiAJICovCiAJZm9yIChpID0gbnVtX2NvdW50ZXJzIDsgaSA8IG51bV9jb250cm9scyA7ICsraSkgewotCQlpZiAoQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBpKSkKKwkJaWYgKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIpCiAJCQlyZWxlYXNlX2V2bnRzZWxfbm1pKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIpOwogCX0KIH0KZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYyBiL2FyY2gveDg2L29wcm9maWxlL29wX21vZGVsX3Bwcm8uYwppbmRleCAxMDEzMWZiLi5jZDcyZDVjIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9vcHJvZmlsZS9vcF9tb2RlbF9wcHJvLmMKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvb3BfbW9kZWxfcHByby5jCkBAIC0xMCw2ICsxMCw3IEBACiAgKiBAYXV0aG9yIFBoaWxpcHBlIEVsaWUKICAqIEBhdXRob3IgR3JheWRvbiBIb2FyZQogICogQGF1dGhvciBBbmRpIEtsZWVuCisgKiBAYXV0aG9yIFJvYmVydCBSaWNodGVyIDxyb2JlcnQucmljaHRlckBhbWQuY29tPgogICovCiAKICNpbmNsdWRlIDxsaW51eC9vcHJvZmlsZS5oPgpAQCAtMTgsNyArMTksNiBAQAogI2luY2x1ZGUgPGFzbS9tc3IuaD4KICNpbmNsdWRlIDxhc20vYXBpYy5oPgogI2luY2x1ZGUgPGFzbS9ubWkuaD4KLSNpbmNsdWRlIDxhc20vaW50ZWxfYXJjaF9wZXJmbW9uLmg+CiAKICNpbmNsdWRlICJvcF94ODZfbW9kZWwuaCIKICNpbmNsdWRlICJvcF9jb3VudGVyLmgiCkBAIC0yNiwyMCArMjYsNyBAQAogc3RhdGljIGludCBudW1fY291bnRlcnMgPSAyOwogc3RhdGljIGludCBjb3VudGVyX3dpZHRoID0gMzI7CiAKLSNkZWZpbmUgQ1RSX0lTX1JFU0VSVkVEKG1zcnMsIGMpIChtc3JzLT5jb3VudGVyc1soYyldLmFkZHIgPyAxIDogMCkKLSNkZWZpbmUgQ1RSX09WRVJGTE9XRUQobikgKCEoKG4pICYgKDFVTEw8PChjb3VudGVyX3dpZHRoLTEpKSkpCi0KLSNkZWZpbmUgQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBjKSAobXNycy0+Y29udHJvbHNbKGMpXS5hZGRyID8gMSA6IDApCi0jZGVmaW5lIENUUkxfUkVBRChsLCBoLCBtc3JzLCBjKSBkbyB7cmRtc3IoKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciksIChsKSwgKGgpKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQ1RSTF9XUklURShsLCBoLCBtc3JzLCBjKSBkbyB7d3Jtc3IoKG1zcnMtPmNvbnRyb2xzWyhjKV0uYWRkciksIChsKSwgKGgpKTsgfSB3aGlsZSAoMCkKLSNkZWZpbmUgQ1RSTF9TRVRfQUNUSVZFKG4pIChuIHw9ICgxPDwyMikpCi0jZGVmaW5lIENUUkxfU0VUX0lOQUNUSVZFKG4pIChuICY9IH4oMTw8MjIpKQotI2RlZmluZSBDVFJMX0NMRUFSKHgpICh4ICY9ICgxPDwyMSkpCi0jZGVmaW5lIENUUkxfU0VUX0VOQUJMRSh2YWwpICh2YWwgfD0gMTw8MjApCi0jZGVmaW5lIENUUkxfU0VUX1VTUih2YWwsIHUpICh2YWwgfD0gKCh1ICYgMSkgPDwgMTYpKQotI2RlZmluZSBDVFJMX1NFVF9LRVJOKHZhbCwgaykgKHZhbCB8PSAoKGsgJiAxKSA8PCAxNykpCi0jZGVmaW5lIENUUkxfU0VUX1VNKHZhbCwgbSkgKHZhbCB8PSAobSA8PCA4KSkKLSNkZWZpbmUgQ1RSTF9TRVRfRVZFTlQodmFsLCBlKSAodmFsIHw9IGUpCisjZGVmaW5lIE1TUl9QUFJPX0VWRU5UU0VMX1JFU0VSVkVECSgoMHhGRkZGRkZGRlVMTDw8MzIpfCgxVUxMPDwyMSkpCiAKIHN0YXRpYyB1NjQgKnJlc2V0X3ZhbHVlOwogCkBAIC02Myw5ICs1MCwxMCBAQAogfQogCiAKLXN0YXRpYyB2b2lkIHBwcm9fc2V0dXBfY3RycyhzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCitzdGF0aWMgdm9pZCBwcHJvX3NldHVwX2N0cnMoc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0ICptb2RlbCwKKwkJCSAgICBzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpCiB7Ci0JdW5zaWduZWQgaW50IGxvdywgaGlnaDsKKwl1NjQgdmFsOwogCWludCBpOwogCiAJaWYgKCFyZXNldF92YWx1ZSkgewpAQCAtOTQsMzUgKzgyLDI5IEBACiAKIAkvKiBjbGVhciBhbGwgY291bnRlcnMgKi8KIAlmb3IgKGkgPSAwIDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7Ci0JCWlmICh1bmxpa2VseSghQ1RSTF9JU19SRVNFUlZFRChtc3JzLCBpKSkpCisJCWlmICh1bmxpa2VseSghbXNycy0+Y29udHJvbHNbaV0uYWRkcikpCiAJCQljb250aW51ZTsKLQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCUNUUkxfQ0xFQVIobG93KTsKLQkJQ1RSTF9XUklURShsb3csIGhpZ2gsIG1zcnMsIGkpOworCQlyZG1zcmwobXNycy0+Y29udHJvbHNbaV0uYWRkciwgdmFsKTsKKwkJdmFsICY9IG1vZGVsLT5yZXNlcnZlZDsKKwkJd3Jtc3JsKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIsIHZhbCk7CiAJfQogCiAJLyogYXZvaWQgYSBmYWxzZSBkZXRlY3Rpb24gb2YgY3RyIG92ZXJmbG93cyBpbiBOTUkgaGFuZGxlciAqLwogCWZvciAoaSA9IDA7IGkgPCBudW1fY291bnRlcnM7ICsraSkgewotCQlpZiAodW5saWtlbHkoIUNUUl9JU19SRVNFUlZFRChtc3JzLCBpKSkpCisJCWlmICh1bmxpa2VseSghbXNycy0+Y291bnRlcnNbaV0uYWRkcikpCiAJCQljb250aW51ZTsKIAkJd3Jtc3JsKG1zcnMtPmNvdW50ZXJzW2ldLmFkZHIsIC0xTEwpOwogCX0KIAogCS8qIGVuYWJsZSBhY3RpdmUgY291bnRlcnMgKi8KIAlmb3IgKGkgPSAwOyBpIDwgbnVtX2NvdW50ZXJzOyArK2kpIHsKLQkJaWYgKChjb3VudGVyX2NvbmZpZ1tpXS5lbmFibGVkKSAmJiAoQ1RSX0lTX1JFU0VSVkVEKG1zcnMsIGkpKSkgeworCQlpZiAoY291bnRlcl9jb25maWdbaV0uZW5hYmxlZCAmJiBtc3JzLT5jb3VudGVyc1tpXS5hZGRyKSB7CiAJCQlyZXNldF92YWx1ZVtpXSA9IGNvdW50ZXJfY29uZmlnW2ldLmNvdW50OwotCiAJCQl3cm1zcmwobXNycy0+Y291bnRlcnNbaV0uYWRkciwgLXJlc2V0X3ZhbHVlW2ldKTsKLQotCQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCQlDVFJMX0NMRUFSKGxvdyk7Ci0JCQlDVFJMX1NFVF9FTkFCTEUobG93KTsKLQkJCUNUUkxfU0VUX1VTUihsb3csIGNvdW50ZXJfY29uZmlnW2ldLnVzZXIpOwotCQkJQ1RSTF9TRVRfS0VSTihsb3csIGNvdW50ZXJfY29uZmlnW2ldLmtlcm5lbCk7Ci0JCQlDVFJMX1NFVF9VTShsb3csIGNvdW50ZXJfY29uZmlnW2ldLnVuaXRfbWFzayk7Ci0JCQlDVFJMX1NFVF9FVkVOVChsb3csIGNvdW50ZXJfY29uZmlnW2ldLmV2ZW50KTsKLQkJCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJCXJkbXNybChtc3JzLT5jb250cm9sc1tpXS5hZGRyLCB2YWwpOworCQkJdmFsICY9IG1vZGVsLT5yZXNlcnZlZDsKKwkJCXZhbCB8PSBvcF94ODZfZ2V0X2N0cmwobW9kZWwsICZjb3VudGVyX2NvbmZpZ1tpXSk7CisJCQl3cm1zcmwobXNycy0+Y29udHJvbHNbaV0uYWRkciwgdmFsKTsKIAkJfSBlbHNlIHsKIAkJCXJlc2V0X3ZhbHVlW2ldID0gMDsKIAkJfQpAQCAtMTM2LDE2ICsxMTgsMjQgQEAKIAl1NjQgdmFsOwogCWludCBpOwogCisJLyoKKwkgKiBUaGlzIGNhbiBoYXBwZW4gaWYgcGVyZiBjb3VudGVycyBhcmUgaW4gdXNlIHdoZW4KKwkgKiB3ZSBzdGVhbCB0aGUgZGllIG5vdGlmaWVyIE5NSS4KKwkgKi8KKwlpZiAodW5saWtlbHkoIXJlc2V0X3ZhbHVlKSkKKwkJZ290byBvdXQ7CisKIAlmb3IgKGkgPSAwIDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CiAJCWlmICghcmVzZXRfdmFsdWVbaV0pCiAJCQljb250aW51ZTsKIAkJcmRtc3JsKG1zcnMtPmNvdW50ZXJzW2ldLmFkZHIsIHZhbCk7Ci0JCWlmIChDVFJfT1ZFUkZMT1dFRCh2YWwpKSB7Ci0JCQlvcHJvZmlsZV9hZGRfc2FtcGxlKHJlZ3MsIGkpOwotCQkJd3Jtc3JsKG1zcnMtPmNvdW50ZXJzW2ldLmFkZHIsIC1yZXNldF92YWx1ZVtpXSk7Ci0JCX0KKwkJaWYgKHZhbCAmICgxVUxMIDw8IChjb3VudGVyX3dpZHRoIC0gMSkpKQorCQkJY29udGludWU7CisJCW9wcm9maWxlX2FkZF9zYW1wbGUocmVncywgaSk7CisJCXdybXNybChtc3JzLT5jb3VudGVyc1tpXS5hZGRyLCAtcmVzZXRfdmFsdWVbaV0pOwogCX0KIAorb3V0OgogCS8qIE9ubHkgUDYgYmFzZWQgUGVudGl1bSBNIG5lZWQgdG8gcmUtdW5tYXNrIHRoZSBhcGljIHZlY3RvciBidXQgaXQKIAkgKiBkb2Vzbid0IGh1cnQgb3RoZXIgUDYgdmFyaWFudCAqLwogCWFwaWNfd3JpdGUoQVBJQ19MVlRQQywgYXBpY19yZWFkKEFQSUNfTFZUUEMpICYgfkFQSUNfTFZUX01BU0tFRCk7CkBAIC0xNjMsMTYgKzE1MywxNiBAQAogCiBzdGF0aWMgdm9pZCBwcHJvX3N0YXJ0KHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKIHsKLQl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCXU2NCB2YWw7CiAJaW50IGk7CiAKIAlpZiAoIXJlc2V0X3ZhbHVlKQogCQlyZXR1cm47CiAJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CiAJCWlmIChyZXNldF92YWx1ZVtpXSkgewotCQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCQlDVFJMX1NFVF9BQ1RJVkUobG93KTsKLQkJCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJCXJkbXNybChtc3JzLT5jb250cm9sc1tpXS5hZGRyLCB2YWwpOworCQkJdmFsIHw9IEFSQ0hfUEVSRk1PTl9FVkVOVFNFTDBfRU5BQkxFOworCQkJd3Jtc3JsKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIsIHZhbCk7CiAJCX0KIAl9CiB9CkBAIC0xODAsNyArMTcwLDcgQEAKIAogc3RhdGljIHZvaWQgcHByb19zdG9wKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycykKIHsKLQl1bnNpZ25lZCBpbnQgbG93LCBoaWdoOworCXU2NCB2YWw7CiAJaW50IGk7CiAKIAlpZiAoIXJlc2V0X3ZhbHVlKQpAQCAtMTg4LDkgKzE3OCw5IEBACiAJZm9yIChpID0gMDsgaSA8IG51bV9jb3VudGVyczsgKytpKSB7CiAJCWlmICghcmVzZXRfdmFsdWVbaV0pCiAJCQljb250aW51ZTsKLQkJQ1RSTF9SRUFEKGxvdywgaGlnaCwgbXNycywgaSk7Ci0JCUNUUkxfU0VUX0lOQUNUSVZFKGxvdyk7Ci0JCUNUUkxfV1JJVEUobG93LCBoaWdoLCBtc3JzLCBpKTsKKwkJcmRtc3JsKG1zcnMtPmNvbnRyb2xzW2ldLmFkZHIsIHZhbCk7CisJCXZhbCAmPSB+QVJDSF9QRVJGTU9OX0VWRU5UU0VMMF9FTkFCTEU7CisJCXdybXNybChtc3JzLT5jb250cm9sc1tpXS5hZGRyLCB2YWwpOwogCX0KIH0KIApAQCAtMTk5LDExICsxODksMTEgQEAKIAlpbnQgaTsKIAogCWZvciAoaSA9IDAgOyBpIDwgbnVtX2NvdW50ZXJzIDsgKytpKSB7Ci0JCWlmIChDVFJfSVNfUkVTRVJWRUQobXNycywgaSkpCisJCWlmIChtc3JzLT5jb3VudGVyc1tpXS5hZGRyKQogCQkJcmVsZWFzZV9wZXJmY3RyX25taShNU1JfUDZfUEVSRkNUUjAgKyBpKTsKIAl9CiAJZm9yIChpID0gMCA7IGkgPCBudW1fY291bnRlcnMgOyArK2kpIHsKLQkJaWYgKENUUkxfSVNfUkVTRVJWRUQobXNycywgaSkpCisJCWlmIChtc3JzLT5jb250cm9sc1tpXS5hZGRyKQogCQkJcmVsZWFzZV9ldm50c2VsX25taShNU1JfUDZfRVZOVFNFTDAgKyBpKTsKIAl9CiAJaWYgKHJlc2V0X3ZhbHVlKSB7CkBAIC0yMTMsOSArMjAzLDEwIEBACiB9CiAKIAotc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIG9wX3Bwcm9fc3BlYyA9IHsKLQkubnVtX2NvdW50ZXJzCQk9IDIsCS8qIGNhbiBiZSBvdmVycmlkZW4gKi8KLQkubnVtX2NvbnRyb2xzCQk9IDIsCS8qIGRpdG8gKi8KK3N0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBjb25zdCBvcF9wcHJvX3NwZWMgPSB7CisJLm51bV9jb3VudGVycwkJPSAyLAorCS5udW1fY29udHJvbHMJCT0gMiwKKwkucmVzZXJ2ZWQJCT0gTVNSX1BQUk9fRVZFTlRTRUxfUkVTRVJWRUQsCiAJLmZpbGxfaW5fYWRkcmVzc2VzCT0gJnBwcm9fZmlsbF9pbl9hZGRyZXNzZXMsCiAJLnNldHVwX2N0cnMJCT0gJnBwcm9fc2V0dXBfY3RycywKIAkuY2hlY2tfY3RycwkJPSAmcHByb19jaGVja19jdHJzLApAQCAtMjMzLDcgKzIyNCw3IEBACiAgKiB0aGUgc3BlY2lmaWMgQ1BVLgogICovCiAKLXZvaWQgYXJjaF9wZXJmbW9uX3NldHVwX2NvdW50ZXJzKHZvaWQpCitzdGF0aWMgdm9pZCBhcmNoX3BlcmZtb25fc2V0dXBfY291bnRlcnModm9pZCkKIHsKIAl1bmlvbiBjcHVpZDEwX2VheCBlYXg7CiAKQEAgLTI1MSwxMSArMjQyLDE3IEBACiAKIAlvcF9hcmNoX3BlcmZtb25fc3BlYy5udW1fY291bnRlcnMgPSBudW1fY291bnRlcnM7CiAJb3BfYXJjaF9wZXJmbW9uX3NwZWMubnVtX2NvbnRyb2xzID0gbnVtX2NvdW50ZXJzOwotCW9wX3Bwcm9fc3BlYy5udW1fY291bnRlcnMgPSBudW1fY291bnRlcnM7Ci0Jb3BfcHByb19zcGVjLm51bV9jb250cm9scyA9IG51bV9jb3VudGVyczsKK30KKworc3RhdGljIGludCBhcmNoX3BlcmZtb25faW5pdChzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqaWdub3JlKQoreworCWFyY2hfcGVyZm1vbl9zZXR1cF9jb3VudGVycygpOworCXJldHVybiAwOwogfQogCiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgb3BfYXJjaF9wZXJmbW9uX3NwZWMgPSB7CisJLnJlc2VydmVkCQk9IE1TUl9QUFJPX0VWRU5UU0VMX1JFU0VSVkVELAorCS5pbml0CQkJPSAmYXJjaF9wZXJmbW9uX2luaXQsCiAJLyogbnVtX2NvdW50ZXJzL251bV9jb250cm9scyBmaWxsZWQgaW4gYXQgcnVudGltZSAqLwogCS5maWxsX2luX2FkZHJlc3Nlcwk9ICZwcHJvX2ZpbGxfaW5fYWRkcmVzc2VzLAogCS8qIHVzZXIgc3BhY2UgZG9lcyB0aGUgY3B1aWQgY2hlY2sgZm9yIGF2YWlsYWJsZSBldmVudHMgKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L29wcm9maWxlL29wX3g4Nl9tb2RlbC5oIGIvYXJjaC94ODYvb3Byb2ZpbGUvb3BfeDg2X21vZGVsLmgKaW5kZXggODI1ZTc5MC4uNTA1NDg5OCAxMDA2NDQKLS0tIGEvYXJjaC94ODYvb3Byb2ZpbGUvb3BfeDg2X21vZGVsLmgKKysrIGIvYXJjaC94ODYvb3Byb2ZpbGUvb3BfeDg2X21vZGVsLmgKQEAgLTYsMTkgKzYsMTggQEAKICAqIEByZW1hcmsgUmVhZCB0aGUgZmlsZSBDT1BZSU5HCiAgKgogICogQGF1dGhvciBHcmF5ZG9uIEhvYXJlCisgKiBAYXV0aG9yIFJvYmVydCBSaWNodGVyIDxyb2JlcnQucmljaHRlckBhbWQuY29tPgogICovCiAKICNpZm5kZWYgT1BfWDg2X01PREVMX0gKICNkZWZpbmUgT1BfWDg2X01PREVMX0gKIAotc3RydWN0IG9wX3NhdmVkX21zciB7Ci0JdW5zaWduZWQgaW50IGhpZ2g7Ci0JdW5zaWduZWQgaW50IGxvdzsKLX07CisjaW5jbHVkZSA8YXNtL3R5cGVzLmg+CisjaW5jbHVkZSA8YXNtL3BlcmZfY291bnRlci5oPgogCiBzdHJ1Y3Qgb3BfbXNyIHsKLQl1bnNpZ25lZCBsb25nIGFkZHI7Ci0Jc3RydWN0IG9wX3NhdmVkX21zciBzYXZlZDsKKwl1bnNpZ25lZCBsb25nCWFkZHI7CisJdTY0CQlzYXZlZDsKIH07CiAKIHN0cnVjdCBvcF9tc3JzIHsKQEAgLTI4LDI5ICsyNywzNyBAQAogCiBzdHJ1Y3QgcHRfcmVnczsKIAorc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnM7CisKIC8qIFRoZSBtb2RlbCB2dGFibGUgYWJzdHJhY3RzIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuCiAgKiB2YXJpb3VzIHg4NiBDUFUgbW9kZWxzJyBwZXJmY3RyIHN1cHBvcnQuCiAgKi8KIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyB7Ci0JaW50ICgqaW5pdCkoc3RydWN0IG9wcm9maWxlX29wZXJhdGlvbnMgKm9wcyk7Ci0Jdm9pZCAoKmV4aXQpKHZvaWQpOwotCXVuc2lnbmVkIGludCBudW1fY291bnRlcnM7Ci0JdW5zaWduZWQgaW50IG51bV9jb250cm9sczsKLQl2b2lkICgqZmlsbF9pbl9hZGRyZXNzZXMpKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycyk7Ci0Jdm9pZCAoKnNldHVwX2N0cnMpKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycyk7Ci0JaW50ICgqY2hlY2tfY3Rycykoc3RydWN0IHB0X3JlZ3MgKiBjb25zdCByZWdzLAotCQlzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpOwotCXZvaWQgKCpzdGFydCkoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKTsKLQl2b2lkICgqc3RvcCkoc3RydWN0IG9wX21zcnMgY29uc3QgKiBjb25zdCBtc3JzKTsKLQl2b2lkICgqc2h1dGRvd24pKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycyk7CisJdW5zaWduZWQgaW50CW51bV9jb3VudGVyczsKKwl1bnNpZ25lZCBpbnQJbnVtX2NvbnRyb2xzOworCXU2NAkJcmVzZXJ2ZWQ7CisJdTE2CQlldmVudF9tYXNrOworCWludAkJKCppbml0KShzdHJ1Y3Qgb3Byb2ZpbGVfb3BlcmF0aW9ucyAqb3BzKTsKKwl2b2lkCQkoKmV4aXQpKHZvaWQpOworCXZvaWQJCSgqZmlsbF9pbl9hZGRyZXNzZXMpKHN0cnVjdCBvcF9tc3JzICogY29uc3QgbXNycyk7CisJdm9pZAkJKCpzZXR1cF9jdHJzKShzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3QgKm1vZGVsLAorCQkJCSAgICAgIHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycyk7CisJaW50CQkoKmNoZWNrX2N0cnMpKHN0cnVjdCBwdF9yZWdzICogY29uc3QgcmVncywKKwkJCQkgICAgICBzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpOworCXZvaWQJCSgqc3RhcnQpKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycyk7CisJdm9pZAkJKCpzdG9wKShzdHJ1Y3Qgb3BfbXNycyBjb25zdCAqIGNvbnN0IG1zcnMpOworCXZvaWQJCSgqc2h1dGRvd24pKHN0cnVjdCBvcF9tc3JzIGNvbnN0ICogY29uc3QgbXNycyk7CiB9OwogCi1leHRlcm4gc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIG9wX3Bwcm9fc3BlYzsKK3N0cnVjdCBvcF9jb3VudGVyX2NvbmZpZzsKKworZXh0ZXJuIHU2NCBvcF94ODZfZ2V0X2N0cmwoc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0ICptb2RlbCwKKwkJCSAgIHN0cnVjdCBvcF9jb3VudGVyX2NvbmZpZyAqY291bnRlcl9jb25maWcpOworCitleHRlcm4gc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX3Bwcm9fc3BlYzsKIGV4dGVybiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcDRfc3BlYzsKIGV4dGVybiBzdHJ1Y3Qgb3BfeDg2X21vZGVsX3NwZWMgY29uc3Qgb3BfcDRfaHQyX3NwZWM7CiBleHRlcm4gc3RydWN0IG9wX3g4Nl9tb2RlbF9zcGVjIGNvbnN0IG9wX2FtZF9zcGVjOwogZXh0ZXJuIHN0cnVjdCBvcF94ODZfbW9kZWxfc3BlYyBvcF9hcmNoX3BlcmZtb25fc3BlYzsKIAotZXh0ZXJuIHZvaWQgYXJjaF9wZXJmbW9uX3NldHVwX2NvdW50ZXJzKHZvaWQpOwotCiAjZW5kaWYgLyogT1BfWDg2X01PREVMX0ggKi8KZGlmZiAtLWdpdCBhL2FyY2gveDg2L3BjaS9pcnEuYyBiL2FyY2gveDg2L3BjaS9pcnEuYwppbmRleCBmZWNiY2U2Li4wNjk2ZDUwIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni9wY2kvaXJxLmMKKysrIGIvYXJjaC94ODYvcGNpL2lycS5jCkBAIC04ODksNiArODg5LDkgQEAKIAkJcmV0dXJuIDA7CiAJfQogCisJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzKQorCQlyZXR1cm4gMDsKKwogCS8qIEZpbmQgSVJRIHJvdXRpbmcgZW50cnkgKi8KIAogCWlmICghcGlycV90YWJsZSkKQEAgLTEwMzksNTYgKzEwNDIsMTUgQEAKIAkJcGlycV9wZW5hbHR5W2Rldi0+aXJxXSsrOwogCX0KIAorCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcykKKwkJcmV0dXJuOworCiAJZGV2ID0gTlVMTDsKIAl3aGlsZSAoKGRldiA9IHBjaV9nZXRfZGV2aWNlKFBDSV9BTllfSUQsIFBDSV9BTllfSUQsIGRldikpICE9IE5VTEwpIHsKIAkJcGNpX3JlYWRfY29uZmlnX2J5dGUoZGV2LCBQQ0lfSU5URVJSVVBUX1BJTiwgJnBpbik7CiAJCWlmICghcGluKQogCQkJY29udGludWU7CiAKLSNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKLQkJLyoKLQkJICogUmVjYWxjdWxhdGUgSVJRIG51bWJlcnMgaWYgd2UgdXNlIHRoZSBJL08gQVBJQy4KLQkJICovCi0JCWlmIChpb19hcGljX2Fzc2lnbl9wY2lfaXJxcykgewotCQkJaW50IGlycTsKLQotCQkJLyoKLQkJCSAqIGludGVycnVwdCBwaW5zIGFyZSBudW1iZXJlZCBzdGFydGluZyBmcm9tIDEKLQkJCSAqLwotCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwKLQkJCQlQQ0lfU0xPVChkZXYtPmRldmZuKSwgcGluIC0gMSk7Ci0JCQkvKgotCQkJICogQnVzc2VzIGJlaGluZCBicmlkZ2VzIGFyZSB0eXBpY2FsbHkgbm90IGxpc3RlZCBpbiB0aGUKLQkJCSAqIE1QLXRhYmxlLiAgSW4gdGhpcyBjYXNlIHdlIGhhdmUgdG8gbG9vayB1cCB0aGUgSVJRCi0JCQkgKiBiYXNlZCBvbiB0aGUgcGFyZW50IGJ1cywgcGFyZW50IHNsb3QsIGFuZCBwaW4gbnVtYmVyLgotCQkJICogVGhlIFNNUCBjb2RlIGRldGVjdHMgc3VjaCBicmlkZ2VkIGJ1c3NlcyBpdHNlbGYgc28gd2UKLQkJCSAqIHNob3VsZCBnZXQgaW50byB0aGlzIGJyYW5jaCByZWxpYWJseS4KLQkJCSAqLwotCQkJaWYgKGlycSA8IDAgJiYgZGV2LT5idXMtPnBhcmVudCkgewotCQkJCS8qIGdvIGJhY2sgdG8gdGhlIGJyaWRnZSAqLwotCQkJCXN0cnVjdCBwY2lfZGV2ICpicmlkZ2UgPSBkZXYtPmJ1cy0+c2VsZjsKLQkJCQlpbnQgYnVzOwotCi0JCQkJcGluID0gcGNpX3N3aXp6bGVfaW50ZXJydXB0X3BpbihkZXYsIHBpbik7Ci0JCQkJYnVzID0gYnJpZGdlLT5idXMtPm51bWJlcjsKLQkJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihidXMsCi0JCQkJCQlQQ0lfU0xPVChicmlkZ2UtPmRldmZuKSwgcGluIC0gMSk7Ci0JCQkJaWYgKGlycSA+PSAwKQotCQkJCQlkZXZfd2FybigmZGV2LT5kZXYsCi0JCQkJCQkidXNpbmcgYnJpZGdlICVzIElOVCAlYyB0byAiCi0JCQkJCQkJImdldCBJUlEgJWRcbiIsCi0JCQkJCQkgcGNpX25hbWUoYnJpZGdlKSwKLQkJCQkJCSAnQScgKyBwaW4gLSAxLCBpcnEpOwotCQkJfQotCQkJaWYgKGlycSA+PSAwKSB7Ci0JCQkJZGV2X2luZm8oJmRldi0+ZGV2LAotCQkJCQkiUENJLT5BUElDIElSUSB0cmFuc2Zvcm06IElOVCAlYyAiCi0JCQkJCQkiLT4gSVJRICVkXG4iLAotCQkJCQknQScgKyBwaW4gLSAxLCBpcnEpOwotCQkJCWRldi0+aXJxID0gaXJxOwotCQkJfQotCQl9Ci0jZW5kaWYKIAkJLyoKIAkJICogU3RpbGwgbm8gSVJRPyBUcnkgdG8gbG9va3VwIG9uZS4uLgogCQkgKi8KQEAgLTExODMsNiArMTE0NSwxOSBAQAogCXBjaWJpb3NfZW5hYmxlX2lycSA9IHBpcnFfZW5hYmxlX2lycTsKIAogCXBjaWJpb3NfZml4dXBfaXJxcygpOworCisJaWYgKGlvX2FwaWNfYXNzaWduX3BjaV9pcnFzICYmIHBjaV9yb3V0ZWlycSkgeworCQlzdHJ1Y3QgcGNpX2RldiAqZGV2ID0gTlVMTDsKKwkJLyoKKwkJICogUENJIElSUSByb3V0aW5nIGlzIHNldCB1cCBieSBwY2lfZW5hYmxlX2RldmljZSgpLCBidXQgd2UKKwkJICogYWxzbyBkbyBpdCBoZXJlIGluIGNhc2UgdGhlcmUgYXJlIHN0aWxsIGJyb2tlbiBkcml2ZXJzIHRoYXQKKwkJICogZG9uJ3QgdXNlIHBjaV9lbmFibGVfZGV2aWNlKCkuCisJCSAqLworCQlwcmludGsoS0VSTl9JTkZPICJQQ0k6IFJvdXRpbmcgUENJIGludGVycnVwdHMgZm9yIGFsbCBkZXZpY2VzIGJlY2F1c2UgXCJwY2k9cm91dGVpcnFcIiBzcGVjaWZpZWRcbiIpOworCQlmb3JfZWFjaF9wY2lfZGV2KGRldikKKwkJCXBpcnFfZW5hYmxlX2lycShkZXYpOworCX0KKwogCXJldHVybiAwOwogfQogCkBAIC0xMjEzLDE2ICsxMTg4LDIzIEBACiBzdGF0aWMgaW50IHBpcnFfZW5hYmxlX2lycShzdHJ1Y3QgcGNpX2RldiAqZGV2KQogewogCXU4IHBpbjsKLQlzdHJ1Y3QgcGNpX2RldiAqdGVtcF9kZXY7CiAKIAlwY2lfcmVhZF9jb25maWdfYnl0ZShkZXYsIFBDSV9JTlRFUlJVUFRfUElOLCAmcGluKTsKLQlpZiAocGluICYmICFwY2liaW9zX2xvb2t1cF9pcnEoZGV2LCAxKSAmJiAhZGV2LT5pcnEpIHsKKwlpZiAocGluICYmICFwY2liaW9zX2xvb2t1cF9pcnEoZGV2LCAxKSkgewogCQljaGFyICptc2cgPSAiIjsKIAotCQlpZiAoaW9fYXBpY19hc3NpZ25fcGNpX2lycXMpIHsKLQkJCWludCBpcnE7CisJCWlmICghaW9fYXBpY19hc3NpZ25fcGNpX2lycXMgJiYgZGV2LT5pcnEpCisJCQlyZXR1cm4gMDsKIAotCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwgUENJX1NMT1QoZGV2LT5kZXZmbiksIHBpbiAtIDEpOworCQlpZiAoaW9fYXBpY19hc3NpZ25fcGNpX2lycXMpIHsKKyNpZmRlZiBDT05GSUdfWDg2X0lPX0FQSUMKKwkJCXN0cnVjdCBwY2lfZGV2ICp0ZW1wX2RldjsKKwkJCWludCBpcnE7CisJCQlzdHJ1Y3QgaW9fYXBpY19pcnFfYXR0ciBpcnFfYXR0cjsKKworCQkJaXJxID0gSU9fQVBJQ19nZXRfUENJX2lycV92ZWN0b3IoZGV2LT5idXMtPm51bWJlciwKKwkJCQkJCVBDSV9TTE9UKGRldi0+ZGV2Zm4pLAorCQkJCQkJcGluIC0gMSwgJmlycV9hdHRyKTsKIAkJCS8qCiAJCQkgKiBCdXNzZXMgYmVoaW5kIGJyaWRnZXMgYXJlIHR5cGljYWxseSBub3QgbGlzdGVkIGluIHRoZSBNUC10YWJsZS4KIAkJCSAqIEluIHRoaXMgY2FzZSB3ZSBoYXZlIHRvIGxvb2sgdXAgdGhlIElSUSBiYXNlZCBvbiB0aGUgcGFyZW50IGJ1cywKQEAgLTEyMzUsNyArMTIxNyw4IEBACiAKIAkJCQlwaW4gPSBwY2lfc3dpenpsZV9pbnRlcnJ1cHRfcGluKGRldiwgcGluKTsKIAkJCQlpcnEgPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcihicmlkZ2UtPmJ1cy0+bnVtYmVyLAotCQkJCQkJUENJX1NMT1QoYnJpZGdlLT5kZXZmbiksIHBpbiAtIDEpOworCQkJCQkJUENJX1NMT1QoYnJpZGdlLT5kZXZmbiksCisJCQkJCQlwaW4gLSAxLCAmaXJxX2F0dHIpOwogCQkJCWlmIChpcnEgPj0gMCkKIAkJCQkJZGV2X3dhcm4oJmRldi0+ZGV2LCAidXNpbmcgYnJpZGdlICVzICIKIAkJCQkJCSAiSU5UICVjIHRvIGdldCBJUlEgJWRcbiIsCkBAIC0xMjQ1LDEyICsxMjI4LDE1IEBACiAJCQl9CiAJCQlkZXYgPSB0ZW1wX2RldjsKIAkJCWlmIChpcnEgPj0gMCkgeworCQkJCWlvX2FwaWNfc2V0X3BjaV9yb3V0aW5nKCZkZXYtPmRldiwgaXJxLAorCQkJCQkJCSAmaXJxX2F0dHIpOworCQkJCWRldi0+aXJxID0gaXJxOwogCQkJCWRldl9pbmZvKCZkZXYtPmRldiwgIlBDSS0+QVBJQyBJUlEgdHJhbnNmb3JtOiAiCiAJCQkJCSAiSU5UICVjIC0+IElSUSAlZFxuIiwgJ0EnICsgcGluIC0gMSwgaXJxKTsKLQkJCQlkZXYtPmlycSA9IGlycTsKIAkJCQlyZXR1cm4gMDsKIAkJCX0gZWxzZQogCQkJCW1zZyA9ICI7IHByb2JhYmx5IGJ1Z2d5IE1QIHRhYmxlIjsKKyNlbmRpZgogCQl9IGVsc2UgaWYgKHBjaV9wcm9iZSAmIFBDSV9CSU9TX0lSUV9TQ0FOKQogCQkJbXNnID0gIiI7CiAJCWVsc2UKZGlmZiAtLWdpdCBhL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMgYi9hcmNoL3g4Ni92ZHNvL3Zkc28zMi1zZXR1cC5jCmluZGV4IDEyNDFmMTEuLjU4YmMwMGYgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3Zkc28vdmRzbzMyLXNldHVwLmMKKysrIGIvYXJjaC94ODYvdmRzby92ZHNvMzItc2V0dXAuYwpAQCAtMzM4LDYgKzMzOCw4IEBACiAJCX0KIAl9CiAKKwljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvID0gKHZvaWQgKilhZGRyOworCiAJaWYgKGNvbXBhdF91c2VzX3ZtYSB8fCAhY29tcGF0KSB7CiAJCS8qCiAJCSAqIE1BWVdSSVRFIHRvIGFsbG93IGdkYiB0byBDT1cgYW5kIHNldCBicmVha3BvaW50cwpAQCAtMzU4LDExICszNjAsMTMgQEAKIAkJCWdvdG8gdXBfZmFpbDsKIAl9CiAKLQljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvID0gKHZvaWQgKilhZGRyOwogCWN1cnJlbnRfdGhyZWFkX2luZm8oKS0+c3lzZW50ZXJfcmV0dXJuID0KIAkJVkRTTzMyX1NZTUJPTChhZGRyLCBTWVNFTlRFUl9SRVRVUk4pOwogCiAgIHVwX2ZhaWw6CisJaWYgKHJldCkKKwkJY3VycmVudC0+bW0tPmNvbnRleHQudmRzbyA9IE5VTEw7CisKIAl1cF93cml0ZSgmbW0tPm1tYXBfc2VtKTsKIAogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jIGIvYXJjaC94ODYvdmRzby92bWEuYwppbmRleCA3MTMzY2RmLi4yMWUxYWViIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni92ZHNvL3ZtYS5jCisrKyBiL2FyY2gveDg2L3Zkc28vdm1hLmMKQEAgLTgsNiArOCw3IEBACiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmFuZG9tLmg+CisjaW5jbHVkZSA8bGludXgvZWxmLmg+CiAjaW5jbHVkZSA8YXNtL3ZzeXNjYWxsLmg+CiAjaW5jbHVkZSA8YXNtL3ZndG9kLmg+CiAjaW5jbHVkZSA8YXNtL3Byb3RvLmg+CkBAIC0xMTUsMTUgKzExNiwxOCBAQAogCQlnb3RvIHVwX2ZhaWw7CiAJfQogCisJY3VycmVudC0+bW0tPmNvbnRleHQudmRzbyA9ICh2b2lkICopYWRkcjsKKwogCXJldCA9IGluc3RhbGxfc3BlY2lhbF9tYXBwaW5nKG1tLCBhZGRyLCB2ZHNvX3NpemUsCiAJCQkJICAgICAgVk1fUkVBRHxWTV9FWEVDfAogCQkJCSAgICAgIFZNX01BWVJFQUR8Vk1fTUFZV1JJVEV8Vk1fTUFZRVhFQ3wKIAkJCQkgICAgICBWTV9BTFdBWVNEVU1QLAogCQkJCSAgICAgIHZkc29fcGFnZXMpOwotCWlmIChyZXQpCisJaWYgKHJldCkgeworCQljdXJyZW50LT5tbS0+Y29udGV4dC52ZHNvID0gTlVMTDsKIAkJZ290byB1cF9mYWlsOworCX0KIAotCWN1cnJlbnQtPm1tLT5jb250ZXh0LnZkc28gPSAodm9pZCAqKWFkZHI7CiB1cF9mYWlsOgogCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCXJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMgYi9hcmNoL3g4Ni94ZW4vZW5saWdodGVuLmMKaW5kZXggZjA5ZThjMy4uMGExNzAwYSAxMDA2NDQKLS0tIGEvYXJjaC94ODYveGVuL2VubGlnaHRlbi5jCisrKyBiL2FyY2gveDg2L3hlbi9lbmxpZ2h0ZW4uYwpAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvc3RhcnRfa2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9rcHJvYmVzLmg+CiAjaW5jbHVkZSA8bGludXgvYm9vdG1lbS5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L21tLmg+CkBAIC00NCw2ICs0NSw3IEBACiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgogI2luY2x1ZGUgPGFzbS9wcm90by5oPgogI2luY2x1ZGUgPGFzbS9tc3ItaW5kZXguaD4KKyNpbmNsdWRlIDxhc20vdHJhcHMuaD4KICNpbmNsdWRlIDxhc20vc2V0dXAuaD4KICNpbmNsdWRlIDxhc20vZGVzYy5oPgogI2luY2x1ZGUgPGFzbS9wZ3RhYmxlLmg+CkBAIC0yNDAsMTAgKzI0MiwxMCBAQAogCXJldHVybiBIWVBFUlZJU09SX2dldF9kZWJ1Z3JlZyhyZWcpOwogfQogCi12b2lkIHhlbl9sZWF2ZV9sYXp5KHZvaWQpCitzdGF0aWMgdm9pZCB4ZW5fZW5kX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCkKIHsKLQlwYXJhdmlydF9sZWF2ZV9sYXp5KHBhcmF2aXJ0X2dldF9sYXp5X21vZGUoKSk7CiAJeGVuX21jX2ZsdXNoKCk7CisJcGFyYXZpcnRfZW5kX2NvbnRleHRfc3dpdGNoKG5leHQpOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fc3RvcmVfdHIodm9pZCkKQEAgLTQyOCwxMSArNDMwLDQ0IEBACiBzdGF0aWMgaW50IGN2dF9nYXRlX3RvX3RyYXAoaW50IHZlY3RvciwgY29uc3QgZ2F0ZV9kZXNjICp2YWwsCiAJCQkgICAgc3RydWN0IHRyYXBfaW5mbyAqaW5mbykKIHsKKwl1bnNpZ25lZCBsb25nIGFkZHI7CisKIAlpZiAodmFsLT50eXBlICE9IEdBVEVfVFJBUCAmJiB2YWwtPnR5cGUgIT0gR0FURV9JTlRFUlJVUFQpCiAJCXJldHVybiAwOwogCiAJaW5mby0+dmVjdG9yID0gdmVjdG9yOwotCWluZm8tPmFkZHJlc3MgPSBnYXRlX29mZnNldCgqdmFsKTsKKworCWFkZHIgPSBnYXRlX29mZnNldCgqdmFsKTsKKyNpZmRlZiBDT05GSUdfWDg2XzY0CisJLyoKKwkgKiBMb29rIGZvciBrbm93biB0cmFwcyB1c2luZyBJU1QsIGFuZCBzdWJzdGl0dXRlIHRoZW0KKwkgKiBhcHByb3ByaWF0ZWx5LiAgVGhlIGRlYnVnZ2VyIG9uZXMgYXJlIHRoZSBvbmx5IG9uZXMgd2UgY2FyZQorCSAqIGFib3V0LiAgWGVuIHdpbGwgaGFuZGxlIGZhdWx0cyBsaWtlIGRvdWJsZV9mYXVsdCBhbmQKKwkgKiBtYWNoaW5lX2NoZWNrLCBzbyB3ZSBzaG91bGQgbmV2ZXIgc2VlIHRoZW0uICBXYXJuIGlmCisJICogdGhlcmUncyBhbiB1bmV4cGVjdGVkIElTVC11c2luZyBmYXVsdCBoYW5kbGVyLgorCSAqLworCWlmIChhZGRyID09ICh1bnNpZ25lZCBsb25nKWRlYnVnKQorCQlhZGRyID0gKHVuc2lnbmVkIGxvbmcpeGVuX2RlYnVnOworCWVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpaW50MykKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKXhlbl9pbnQzOworCWVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpc3RhY2tfc2VnbWVudCkKKwkJYWRkciA9ICh1bnNpZ25lZCBsb25nKXhlbl9zdGFja19zZWdtZW50OworCWVsc2UgaWYgKGFkZHIgPT0gKHVuc2lnbmVkIGxvbmcpZG91YmxlX2ZhdWx0IHx8CisJCSBhZGRyID09ICh1bnNpZ25lZCBsb25nKW5taSkgeworCQkvKiBEb24ndCBuZWVkIHRvIGhhbmRsZSB0aGVzZSAqLworCQlyZXR1cm4gMDsKKyNpZmRlZiBDT05GSUdfWDg2X01DRQorCX0gZWxzZSBpZiAoYWRkciA9PSAodW5zaWduZWQgbG9uZyltYWNoaW5lX2NoZWNrKSB7CisJCXJldHVybiAwOworI2VuZGlmCisJfSBlbHNlIHsKKwkJLyogU29tZSBvdGhlciB0cmFwIHVzaW5nIElTVD8gKi8KKwkJaWYgKFdBUk5fT04odmFsLT5pc3QgIT0gMCkpCisJCQlyZXR1cm4gMDsKKwl9CisjZW5kaWYJLyogQ09ORklHX1g4Nl82NCAqLworCWluZm8tPmFkZHJlc3MgPSBhZGRyOworCiAJaW5mby0+Y3MgPSBnYXRlX3NlZ21lbnQoKnZhbCk7CiAJaW5mby0+ZmxhZ3MgPSB2YWwtPmRwbDsKIAkvKiBpbnRlcnJ1cHQgZ2F0ZXMgY2xlYXIgSUYgKi8KQEAgLTYyMywxMCArNjU4LDI2IEBACiAJeGVuX21jX2lzc3VlKFBBUkFWSVJUX0xBWllfQ1BVKTsKIH0KIAorc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGxvbmcsIHhlbl9jcjBfdmFsdWUpOworCitzdGF0aWMgdW5zaWduZWQgbG9uZyB4ZW5fcmVhZF9jcjAodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIGNyMCA9IHBlcmNwdV9yZWFkKHhlbl9jcjBfdmFsdWUpOworCisJaWYgKHVubGlrZWx5KGNyMCA9PSAwKSkgeworCQljcjAgPSBuYXRpdmVfcmVhZF9jcjAoKTsKKwkJcGVyY3B1X3dyaXRlKHhlbl9jcjBfdmFsdWUsIGNyMCk7CisJfQorCisJcmV0dXJuIGNyMDsKK30KKwogc3RhdGljIHZvaWQgeGVuX3dyaXRlX2NyMCh1bnNpZ25lZCBsb25nIGNyMCkKIHsKIAlzdHJ1Y3QgbXVsdGljYWxsX3NwYWNlIG1jczsKIAorCXBlcmNwdV93cml0ZSh4ZW5fY3IwX3ZhbHVlLCBjcjApOworCiAJLyogT25seSBwYXkgYXR0ZW50aW9uIHRvIGNyMC5UUzsgZXZlcnl0aGluZyBlbHNlIGlzCiAJICAgaWdub3JlZC4gKi8KIAltY3MgPSB4ZW5fbWNfZW50cnkoMCk7CkBAIC04MTIsNyArODYzLDcgQEAKIAogCS5jbHRzID0geGVuX2NsdHMsCiAKLQkucmVhZF9jcjAgPSBuYXRpdmVfcmVhZF9jcjAsCisJLnJlYWRfY3IwID0geGVuX3JlYWRfY3IwLAogCS53cml0ZV9jcjAgPSB4ZW5fd3JpdGVfY3IwLAogCiAJLnJlYWRfY3I0ID0gbmF0aXZlX3JlYWRfY3I0LApAQCAtODYwLDEwICs5MTEsOCBAQAogCS8qIFhlbiB0YWtlcyBjYXJlIG9mICVncyB3aGVuIHN3aXRjaGluZyB0byB1c2VybW9kZSBmb3IgdXMgKi8KIAkuc3dhcGdzID0gcGFyYXZpcnRfbm9wLAogCi0JLmxhenlfbW9kZSA9IHsKLQkJLmVudGVyID0gcGFyYXZpcnRfZW50ZXJfbGF6eV9jcHUsCi0JCS5sZWF2ZSA9IHhlbl9sZWF2ZV9sYXp5LAotCX0sCisJLnN0YXJ0X2NvbnRleHRfc3dpdGNoID0gcGFyYXZpcnRfc3RhcnRfY29udGV4dF9zd2l0Y2gsCisJLmVuZF9jb250ZXh0X3N3aXRjaCA9IHhlbl9lbmRfY29udGV4dF9zd2l0Y2gsCiB9OwogCiBzdGF0aWMgY29uc3Qgc3RydWN0IHB2X2FwaWNfb3BzIHhlbl9hcGljX29wcyBfX2luaXRkYXRhID0gewpkaWZmIC0tZ2l0IGEvYXJjaC94ODYveGVuL21tdS5jIGIvYXJjaC94ODYveGVuL21tdS5jCmluZGV4IGZiYTU1YjEuLjRjZWIyODUgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9tbXUuYworKysgYi9hcmNoL3g4Ni94ZW4vbW11LmMKQEAgLTQ1MiwxMCArNDUyLDYgQEAKIHZvaWQgeGVuX3NldF9wdGVfYXQoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHVuc2lnbmVkIGxvbmcgYWRkciwKIAkJICAgIHB0ZV90ICpwdGVwLCBwdGVfdCBwdGV2YWwpCiB7Ci0JLyogdXBkYXRlcyB0byBpbml0X21tIG1heSBiZSBkb25lIHdpdGhvdXQgbG9jayAqLwotCWlmIChtbSA9PSAmaW5pdF9tbSkKLQkJcHJlZW1wdF9kaXNhYmxlKCk7Ci0KIAlBRERfU1RBVFMoc2V0X3B0ZV9hdCwgMSk7CiAvLwlBRERfU1RBVFMoc2V0X3B0ZV9hdF9waW5uZWQsIHhlbl9wYWdlX3Bpbm5lZChwdGVwKSk7CiAJQUREX1NUQVRTKHNldF9wdGVfYXRfY3VycmVudCwgbW0gPT0gY3VycmVudC0+bW0pOwpAQCAtNDc2LDkgKzQ3Miw3IEBACiAJfQogCXhlbl9zZXRfcHRlKHB0ZXAsIHB0ZXZhbCk7CiAKLW91dDoKLQlpZiAobW0gPT0gJmluaXRfbW0pCi0JCXByZWVtcHRfZW5hYmxlKCk7CitvdXQ6CXJldHVybjsKIH0KIAogcHRlX3QgeGVuX3B0ZXBfbW9kaWZ5X3Byb3Rfc3RhcnQoc3RydWN0IG1tX3N0cnVjdCAqbW0sCkBAIC0xMTUyLDEwICsxMTQ2LDggQEAKIAogCS8qIElmIHRoaXMgY3B1IHN0aWxsIGhhcyBhIHN0YWxlIGNyMyByZWZlcmVuY2UsIHRoZW4gbWFrZSBzdXJlCiAJICAgaXQgaGFzIGJlZW4gZmx1c2hlZC4gKi8KLQlpZiAocGVyY3B1X3JlYWQoeGVuX2N1cnJlbnRfY3IzKSA9PSBfX3BhKG1tLT5wZ2QpKSB7CisJaWYgKHBlcmNwdV9yZWFkKHhlbl9jdXJyZW50X2NyMykgPT0gX19wYShtbS0+cGdkKSkKIAkJbG9hZF9jcjMoc3dhcHBlcl9wZ19kaXIpOwotCQlhcmNoX2ZsdXNoX2xhenlfY3B1X21vZGUoKTsKLQl9CiB9CiAKIHN0YXRpYyB2b2lkIHhlbl9kcm9wX21tX3JlZihzdHJ1Y3QgbW1fc3RydWN0ICptbSkKQEAgLTExNjgsNyArMTE2MCw2IEBACiAJCQlsb2FkX2NyMyhzd2FwcGVyX3BnX2Rpcik7CiAJCWVsc2UKIAkJCWxlYXZlX21tKHNtcF9wcm9jZXNzb3JfaWQoKSk7Ci0JCWFyY2hfZmx1c2hfbGF6eV9jcHVfbW9kZSgpOwogCX0KIAogCS8qIEdldCB0aGUgIm9mZmljaWFsIiBzZXQgb2YgY3B1cyByZWZlcnJpbmcgdG8gb3VyIHBhZ2V0YWJsZS4gKi8KQEAgLTE4NzYsNiArMTg2NywxNCBAQAogCXhlbl9tYXJrX2luaXRfbW1fcGlubmVkKCk7CiB9CiAKK3N0YXRpYyB2b2lkIHhlbl9sZWF2ZV9sYXp5X21tdSh2b2lkKQoreworCXByZWVtcHRfZGlzYWJsZSgpOworCXhlbl9tY19mbHVzaCgpOworCXBhcmF2aXJ0X2xlYXZlX2xhenlfbW11KCk7CisJcHJlZW1wdF9lbmFibGUoKTsKK30KKwogY29uc3Qgc3RydWN0IHB2X21tdV9vcHMgeGVuX21tdV9vcHMgX19pbml0ZGF0YSA9IHsKIAkucGFnZXRhYmxlX3NldHVwX3N0YXJ0ID0geGVuX3BhZ2V0YWJsZV9zZXR1cF9zdGFydCwKIAkucGFnZXRhYmxlX3NldHVwX2RvbmUgPSB4ZW5fcGFnZXRhYmxlX3NldHVwX2RvbmUsCkBAIC0xOTQ5LDcgKzE5NDgsNyBAQAogCiAJLmxhenlfbW9kZSA9IHsKIAkJLmVudGVyID0gcGFyYXZpcnRfZW50ZXJfbGF6eV9tbXUsCi0JCS5sZWF2ZSA9IHhlbl9sZWF2ZV9sYXp5LAorCQkubGVhdmUgPSB4ZW5fbGVhdmVfbGF6eV9tbXUsCiAJfSwKIAogCS5zZXRfZml4bWFwID0geGVuX3NldF9maXhtYXAsCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4vc2V0dXAuYyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCmluZGV4IDE1YzZjNjguLmFkMDA0N2YgMTAwNjQ0Ci0tLSBhL2FyY2gveDg2L3hlbi9zZXR1cC5jCisrKyBiL2FyY2gveDg2L3hlbi9zZXR1cC5jCkBAIC02MSw5ICs2MSw5IEBACiAJICogIC0geGVuX3N0YXJ0X2luZm8KIAkgKiBTZWUgY29tbWVudCBhYm92ZSAic3RydWN0IHN0YXJ0X2luZm8iIGluIDx4ZW4vaW50ZXJmYWNlL3hlbi5oPgogCSAqLwotCWU4MjBfYWRkX3JlZ2lvbihfX3BhKHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCksCi0JCQl4ZW5fc3RhcnRfaW5mby0+cHRfYmFzZSAtIHhlbl9zdGFydF9pbmZvLT5tZm5fbGlzdCwKLQkJCUU4MjBfUkVTRVJWRUQpOworCXJlc2VydmVfZWFybHkoX19wYSh4ZW5fc3RhcnRfaW5mby0+bWZuX2xpc3QpLAorCQkgICAgICBfX3BhKHhlbl9zdGFydF9pbmZvLT5wdF9iYXNlKSwKKwkJCSJYRU4gU1RBUlQgSU5GTyIpOwogCiAJc2FuaXRpemVfZTgyMF9tYXAoZTgyMC5tYXAsIEFSUkFZX1NJWkUoZTgyMC5tYXApLCAmZTgyMC5ucl9tYXApOwogCmRpZmYgLS1naXQgYS9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oIGIvYXJjaC94ODYveGVuL3hlbi1vcHMuaAppbmRleCBjYTY1OTZiLi4yMjQ5NGZkIDEwMDY0NAotLS0gYS9hcmNoL3g4Ni94ZW4veGVuLW9wcy5oCisrKyBiL2FyY2gveDg2L3hlbi94ZW4tb3BzLmgKQEAgLTMwLDcgKzMwLDYgQEAKIHZvaWQgeGVuX2lkZW50X21hcF9JU0Eodm9pZCk7CiB2b2lkIHhlbl9yZXNlcnZlX3RvcCh2b2lkKTsKIAotdm9pZCB4ZW5fbGVhdmVfbGF6eSh2b2lkKTsKIHZvaWQgeGVuX3Bvc3RfYWxsb2NhdG9yX2luaXQodm9pZCk7CiAKIGNoYXIgKiBfX2luaXQgeGVuX21lbW9yeV9zZXR1cCh2b2lkKTsKZGlmZiAtLWdpdCBhL2Jsb2NrL2Jsay1jb3JlLmMgYi9ibG9jay9ibGstY29yZS5jCmluZGV4IGM4OTg4M2IuLjk0NzViZjkgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1jb3JlLmMKKysrIGIvYmxvY2svYmxrLWNvcmUuYwpAQCAtMjgsMjIgKzI4LDE0IEBACiAjaW5jbHVkZSA8bGludXgvdGFza19pb19hY2NvdW50aW5nX29wcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Jsa3RyYWNlX2FwaS5oPgogI2luY2x1ZGUgPGxpbnV4L2ZhdWx0LWluamVjdC5oPgotI2luY2x1ZGUgPHRyYWNlL2Jsb2NrLmg+CisKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9ibG9jay5oPgogCiAjaW5jbHVkZSAiYmxrLmgiCiAKLURFRklORV9UUkFDRShibG9ja19wbHVnKTsKLURFRklORV9UUkFDRShibG9ja191bnBsdWdfaW8pOwotREVGSU5FX1RSQUNFKGJsb2NrX3VucGx1Z190aW1lcik7Ci1ERUZJTkVfVFJBQ0UoYmxvY2tfZ2V0cnEpOwotREVGSU5FX1RSQUNFKGJsb2NrX3NsZWVwcnEpOwotREVGSU5FX1RSQUNFKGJsb2NrX3JxX3JlcXVldWUpOwotREVGSU5FX1RSQUNFKGJsb2NrX2Jpb19iYWNrbWVyZ2UpOwotREVGSU5FX1RSQUNFKGJsb2NrX2Jpb19mcm9udG1lcmdlKTsKLURFRklORV9UUkFDRShibG9ja19iaW9fcXVldWUpOwotREVGSU5FX1RSQUNFKGJsb2NrX3JxX2NvbXBsZXRlKTsKLURFRklORV9UUkFDRShibG9ja19yZW1hcCk7CS8qIEFsc28gdXNlZCBpbiBkcml2ZXJzL21kL2RtLmMgKi8KIEVYUE9SVF9UUkFDRVBPSU5UX1NZTUJPTF9HUEwoYmxvY2tfcmVtYXApOworRVhQT1JUX1RSQUNFUE9JTlRfU1lNQk9MX0dQTChibG9ja19iaW9fY29tcGxldGUpOwogCiBzdGF0aWMgaW50IF9fbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOwogCkBAIC0xMjc3LDcgKzEyNjksNyBAQAogCQliaW8tPmJpX2JkZXYgPSBiZGV2LT5iZF9jb250YWluczsKIAogCQl0cmFjZV9ibG9ja19yZW1hcChiZGV2X2dldF9xdWV1ZShiaW8tPmJpX2JkZXYpLCBiaW8sCi0JCQkJICAgIGJkZXYtPmJkX2RldiwgYmlvLT5iaV9zZWN0b3IsCisJCQkJICAgIGJkZXYtPmJkX2RldiwKIAkJCQkgICAgYmlvLT5iaV9zZWN0b3IgLSBwLT5zdGFydF9zZWN0KTsKIAl9CiB9CkBAIC0xNDQ2LDggKzE0MzgsNyBAQAogCQkJZ290byBlbmRfaW87CiAKIAkJaWYgKG9sZF9zZWN0b3IgIT0gLTEpCi0JCQl0cmFjZV9ibG9ja19yZW1hcChxLCBiaW8sIG9sZF9kZXYsIGJpby0+Ymlfc2VjdG9yLAotCQkJCQkgICAgb2xkX3NlY3Rvcik7CisJCQl0cmFjZV9ibG9ja19yZW1hcChxLCBiaW8sIG9sZF9kZXYsIG9sZF9zZWN0b3IpOwogCiAJCXRyYWNlX2Jsb2NrX2Jpb19xdWV1ZShxLCBiaW8pOwogCmRpZmYgLS1naXQgYS9ibG9jay9ibGstc3lzZnMuYyBiL2Jsb2NrL2Jsay1zeXNmcy5jCmluZGV4IDNmZjliYmEuLjI2ZjllYzIgMTAwNjQ0Ci0tLSBhL2Jsb2NrL2Jsay1zeXNmcy5jCisrKyBiL2Jsb2NrL2Jsay1zeXNmcy5jCkBAIC0zODMsMTYgKzM4MywyMSBAQAogaW50IGJsa19yZWdpc3Rlcl9xdWV1ZShzdHJ1Y3QgZ2VuZGlzayAqZGlzaykKIHsKIAlpbnQgcmV0OworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRpc2tfdG9fZGV2KGRpc2spOwogCiAJc3RydWN0IHJlcXVlc3RfcXVldWUgKnEgPSBkaXNrLT5xdWV1ZTsKIAogCWlmIChXQVJOX09OKCFxKSkKIAkJcmV0dXJuIC1FTlhJTzsKIAorCXJldCA9IGJsa190cmFjZV9pbml0X3N5c2ZzKGRldik7CisJaWYgKHJldCkKKwkJcmV0dXJuIHJldDsKKwogCWlmICghcS0+cmVxdWVzdF9mbikKIAkJcmV0dXJuIDA7CiAKLQlyZXQgPSBrb2JqZWN0X2FkZCgmcS0+a29iaiwga29iamVjdF9nZXQoJmRpc2tfdG9fZGV2KGRpc2spLT5rb2JqKSwKKwlyZXQgPSBrb2JqZWN0X2FkZCgmcS0+a29iaiwga29iamVjdF9nZXQoJmRldi0+a29iaiksCiAJCQkgICIlcyIsICJxdWV1ZSIpOwogCWlmIChyZXQgPCAwKQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYmxvY2svY29tcGF0X2lvY3RsLmMgYi9ibG9jay9jb21wYXRfaW9jdGwuYwppbmRleCBmODc2MTVkLi5mOGMyMThjIDEwMDY0NAotLS0gYS9ibG9jay9jb21wYXRfaW9jdGwuYworKysgYi9ibG9jay9jb21wYXRfaW9jdGwuYwpAQCAtNTY4LDcgKzU2OCw3IEBACiAJbWVtY3B5KCZidXRzLm5hbWUsICZjYnV0cy5uYW1lLCAzMik7CiAKIAltdXRleF9sb2NrKCZiZGV2LT5iZF9tdXRleCk7Ci0JcmV0ID0gZG9fYmxrX3RyYWNlX3NldHVwKHEsIGIsIGJkZXYtPmJkX2RldiwgJmJ1dHMpOworCXJldCA9IGRvX2Jsa190cmFjZV9zZXR1cChxLCBiLCBiZGV2LT5iZF9kZXYsIGJkZXYsICZidXRzKTsKIAltdXRleF91bmxvY2soJmJkZXYtPmJkX211dGV4KTsKIAlpZiAocmV0KQogCQlyZXR1cm4gcmV0OwpkaWZmIC0tZ2l0IGEvYmxvY2svZWxldmF0b3IuYyBiL2Jsb2NrL2VsZXZhdG9yLmMKaW5kZXggNzA3M2E5MC4uZTIyMGYwYyAxMDA2NDQKLS0tIGEvYmxvY2svZWxldmF0b3IuYworKysgYi9ibG9jay9lbGV2YXRvci5jCkBAIC0zMywxNyArMzMsMTYgQEAKICNpbmNsdWRlIDxsaW51eC9jb21waWxlci5oPgogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+Ci0jaW5jbHVkZSA8dHJhY2UvYmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9oYXNoLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Jsb2NrLmg+CisKICNpbmNsdWRlICJibGsuaCIKIAogc3RhdGljIERFRklORV9TUElOTE9DSyhlbHZfbGlzdF9sb2NrKTsKIHN0YXRpYyBMSVNUX0hFQUQoZWx2X2xpc3QpOwogCi1ERUZJTkVfVFJBQ0UoYmxvY2tfcnFfYWJvcnQpOwotCiAvKgogICogTWVyZ2UgaGFzaCBzdHVmZi4KICAqLwpAQCAtNTUsOSArNTQsNiBAQAogI2RlZmluZSBycV9oYXNoX2tleShycSkJCSgocnEpLT5zZWN0b3IgKyAocnEpLT5ucl9zZWN0b3JzKQogI2RlZmluZSBFTFZfT05fSEFTSChycSkJCSghaGxpc3RfdW5oYXNoZWQoJihycSktPmhhc2gpKQogCi1ERUZJTkVfVFJBQ0UoYmxvY2tfcnFfaW5zZXJ0KTsKLURFRklORV9UUkFDRShibG9ja19ycV9pc3N1ZSk7Ci0KIC8qCiAgKiBRdWVyeSBpbyBzY2hlZHVsZXIgdG8gc2VlIGlmIHRoZSBjdXJyZW50IHByb2Nlc3MgaXNzdWluZyBiaW8gbWF5IGJlCiAgKiBtZXJnZWQgd2l0aCBycS4KZGlmZiAtLWdpdCBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMgYi9kcml2ZXJzL2FjcGkvcGNpX2lycS5jCmluZGV4IDUxYjlmODIuLjJmYWE5ZTIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYWNwaS9wY2lfaXJxLmMKKysrIGIvZHJpdmVycy9hY3BpL3BjaV9pcnEuYwpAQCAtNDAxLDcgKzQwMSw4IEBACiAJCS8qIEludGVycnVwdCBMaW5lIHZhbHVlcyBhYm92ZSAweEYgYXJlIGZvcmJpZGRlbiAqLwogCQlpZiAoZGV2LT5pcnEgPiAwICYmIChkZXYtPmlycSA8PSAweEYpKSB7CiAJCQlwcmludGsoIiAtIHVzaW5nIElSUSAlZFxuIiwgZGV2LT5pcnEpOwotCQkJYWNwaV9yZWdpc3Rlcl9nc2koZGV2LT5pcnEsIEFDUElfTEVWRUxfU0VOU0lUSVZFLAorCQkJYWNwaV9yZWdpc3Rlcl9nc2koJmRldi0+ZGV2LCBkZXYtPmlycSwKKwkJCQkJICBBQ1BJX0xFVkVMX1NFTlNJVElWRSwKIAkJCQkJICBBQ1BJX0FDVElWRV9MT1cpOwogCQkJcmV0dXJuIDA7CiAJCX0gZWxzZSB7CkBAIC00MTAsNyArNDExLDcgQEAKIAkJfQogCX0KIAotCXJjID0gYWNwaV9yZWdpc3Rlcl9nc2koZ3NpLCB0cmlnZ2VyaW5nLCBwb2xhcml0eSk7CisJcmMgPSBhY3BpX3JlZ2lzdGVyX2dzaSgmZGV2LT5kZXYsIGdzaSwgdHJpZ2dlcmluZywgcG9sYXJpdHkpOwogCWlmIChyYyA8IDApIHsKIAkJZGV2X3dhcm4oJmRldi0+ZGV2LCAiUENJIElOVCAlYzogZmFpbGVkIHRvIHJlZ2lzdGVyIEdTSVxuIiwKIAkJCSBwaW5fbmFtZShwaW4pKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvY2hhci9ocGV0LmMgYi9kcml2ZXJzL2NoYXIvaHBldC5jCmluZGV4IDM0MGJhNGYuLjRhOWYzNDkgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9ocGV0LmMKKysrIGIvZHJpdmVycy9jaGFyL2hwZXQuYwpAQCAtMjI0LDcgKzIyNCw3IEBACiAJCQlicmVhazsKIAkJfQogCi0JCWdzaSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKGlycSwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsCisJCWdzaSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKE5VTEwsIGlycSwgQUNQSV9MRVZFTF9TRU5TSVRJVkUsCiAJCQkJCUFDUElfQUNUSVZFX0xPVyk7CiAJCWlmIChnc2kgPiAwKQogCQkJYnJlYWs7CkBAIC05MzksNyArOTM5LDcgQEAKIAkJaXJxcCA9ICZyZXMtPmRhdGEuZXh0ZW5kZWRfaXJxOwogCiAJCWZvciAoaSA9IDA7IGkgPCBpcnFwLT5pbnRlcnJ1cHRfY291bnQ7IGkrKykgewotCQkJaXJxID0gYWNwaV9yZWdpc3Rlcl9nc2koaXJxcC0+aW50ZXJydXB0c1tpXSwKKwkJCWlycSA9IGFjcGlfcmVnaXN0ZXJfZ3NpKE5VTEwsIGlycXAtPmludGVycnVwdHNbaV0sCiAJCQkJICAgICAgaXJxcC0+dHJpZ2dlcmluZywgaXJxcC0+cG9sYXJpdHkpOwogCQkJaWYgKGlycSA8IDApCiAJCQkJcmV0dXJuIEFFX0VSUk9SOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL21lbS5jIGIvZHJpdmVycy9jaGFyL21lbS5jCmluZGV4IDY1ZTEyYmMuLmY5NmQwYmUgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvY2hhci9tZW0uYworKysgYi9kcml2ZXJzL2NoYXIvbWVtLmMKQEAgLTY5NCw5ICs2OTQsOCBAQAogCQl3cml0dGVuICs9IGNodW5rIC0gdW53cml0dGVuOwogCQlpZiAodW53cml0dGVuKQogCQkJYnJlYWs7Ci0JCS8qIENvbnNpZGVyIGNoYW5naW5nIHRoaXMgdG8ganVzdCAnc2lnbmFsX3BlbmRpbmcoKScgd2l0aCBsb3RzIG9mIHRlc3RpbmcgKi8KLQkJaWYgKGZhdGFsX3NpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKQotCQkJcmV0dXJuIHdyaXR0ZW4gPyB3cml0dGVuIDogLUVJTlRSOworCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQlyZXR1cm4gd3JpdHRlbiA/IHdyaXR0ZW4gOiAtRVJFU1RBUlRTWVM7CiAJCWJ1ZiArPSBjaHVuazsKIAkJY291bnQgLT0gY2h1bms7CiAJCWNvbmRfcmVzY2hlZCgpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9jaGFyL3N5c3JxLmMgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwppbmRleCBkNmE4MDdmLi4zOWEwNWI1IDEwMDY0NAotLS0gYS9kcml2ZXJzL2NoYXIvc3lzcnEuYworKysgYi9kcml2ZXJzL2NoYXIvc3lzcnEuYwpAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2tiZF9rZXJuLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3F1b3Rhb3BzLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvc3VzcGVuZC5oPgpAQCAtMjQzLDYgKzI0NCw3IEBACiAJc3RydWN0IHB0X3JlZ3MgKnJlZ3MgPSBnZXRfaXJxX3JlZ3MoKTsKIAlpZiAocmVncykKIAkJc2hvd19yZWdzKHJlZ3MpOworCXBlcmZfY291bnRlcl9wcmludF9kZWJ1ZygpOwogfQogc3RhdGljIHN0cnVjdCBzeXNycV9rZXlfb3Agc3lzcnFfc2hvd3JlZ3Nfb3AgPSB7CiAJLmhhbmRsZXIJPSBzeXNycV9oYW5kbGVfc2hvd3JlZ3MsCmRpZmYgLS1naXQgYS9kcml2ZXJzL21kL2RtLmMgYi9kcml2ZXJzL21kL2RtLmMKaW5kZXggNDI0ZjdiMC4uM2ZkOGIxZSAxMDA2NDQKLS0tIGEvZHJpdmVycy9tZC9kbS5jCisrKyBiL2RyaXZlcnMvbWQvZG0uYwpAQCAtMjAsNyArMjAsOCBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2hkcmVnLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+Ci0jaW5jbHVkZSA8dHJhY2UvYmxvY2suaD4KKworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9ibG9jay5oPgogCiAjZGVmaW5lIERNX01TR19QUkVGSVggImNvcmUiCiAKQEAgLTUzLDggKzU0LDYgQEAKIAl1bmlvbiBtYXBfaW5mbyBpbmZvOwogfTsKIAotREVGSU5FX1RSQUNFKGJsb2NrX2Jpb19jb21wbGV0ZSk7Ci0KIC8qCiAgKiBGb3IgcmVxdWVzdC1iYXNlZCBkbS4KICAqIE9uZSBvZiB0aGVzZSBpcyBhbGxvY2F0ZWQgcGVyIHJlcXVlc3QuCkBAIC02NTYsOCArNjU1LDcgQEAKIAkJLyogdGhlIGJpbyBoYXMgYmVlbiByZW1hcHBlZCBzbyBkaXNwYXRjaCBpdCAqLwogCiAJCXRyYWNlX2Jsb2NrX3JlbWFwKGJkZXZfZ2V0X3F1ZXVlKGNsb25lLT5iaV9iZGV2KSwgY2xvbmUsCi0JCQkJICAgIHRpby0+aW8tPmJpby0+YmlfYmRldi0+YmRfZGV2LAotCQkJCSAgICBjbG9uZS0+Ymlfc2VjdG9yLCBzZWN0b3IpOworCQkJCSAgICB0aW8tPmlvLT5iaW8tPmJpX2JkZXYtPmJkX2Rldiwgc2VjdG9yKTsKIAogCQlnZW5lcmljX21ha2VfcmVxdWVzdChjbG9uZSk7CiAJfSBlbHNlIGlmIChyIDwgMCB8fCByID09IERNX01BUElPX1JFUVVFVUUpIHsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvb3Byb2ZpbGUvY3B1X2J1ZmZlci5jIGIvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmMKaW5kZXggMjQyMjU3Yi4uYTdhYWUyNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmMKKysrIGIvZHJpdmVycy9vcHJvZmlsZS9jcHVfYnVmZmVyLmMKQEAgLTIxLDcgKzIxLDYgQEAKIAogI2luY2x1ZGUgPGxpbnV4L3NjaGVkLmg+CiAjaW5jbHVkZSA8bGludXgvb3Byb2ZpbGUuaD4KLSNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CiAjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KIAogI2luY2x1ZGUgImV2ZW50X2J1ZmZlci5oIgpAQCAtNDA3LDYgKzQwNiwyMSBAQAogCXJldHVybiBvcF9jcHVfYnVmZmVyX2FkZF9kYXRhKGVudHJ5LCB2YWwpOwogfQogCitpbnQgb3Byb2ZpbGVfYWRkX2RhdGE2NChzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5LCB1NjQgdmFsKQoreworCWlmICghZW50cnktPmV2ZW50KQorCQlyZXR1cm4gMDsKKwlpZiAob3BfY3B1X2J1ZmZlcl9nZXRfc2l6ZShlbnRyeSkgPCAyKQorCQkvKgorCQkgKiB0aGUgZnVuY3Rpb24gcmV0dXJucyAwIHRvIGluZGljYXRlIGEgdG9vIHNtYWxsCisJCSAqIGJ1ZmZlciwgZXZlbiBpZiB0aGVyZSBpcyBzb21lIHNwYWNlIGxlZnQKKwkJICovCisJCXJldHVybiAwOworCWlmICghb3BfY3B1X2J1ZmZlcl9hZGRfZGF0YShlbnRyeSwgKHUzMil2YWwpKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gb3BfY3B1X2J1ZmZlcl9hZGRfZGF0YShlbnRyeSwgKHUzMikodmFsID4+IDMyKSk7Cit9CisKIGludCBvcHJvZmlsZV93cml0ZV9jb21taXQoc3RydWN0IG9wX2VudHJ5ICplbnRyeSkKIHsKIAlpZiAoIWVudHJ5LT5ldmVudCkKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYyBiL2RyaXZlcnMvcGFyaXNjL2lvc2FwaWMuYwppbmRleCA3MzM0OGM0Li40YTljYzkyIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BhcmlzYy9pb3NhcGljLmMKKysrIGIvZHJpdmVycy9wYXJpc2MvaW9zYXBpYy5jCkBAIC03MDIsNyArNzAyLDcgQEAKIH0KIAogI2lmZGVmIENPTkZJR19TTVAKLXN0YXRpYyB2b2lkIGlvc2FwaWNfc2V0X2FmZmluaXR5X2lycSh1bnNpZ25lZCBpbnQgaXJxLAorc3RhdGljIGludCBpb3NhcGljX3NldF9hZmZpbml0eV9pcnEodW5zaWduZWQgaW50IGlycSwKIAkJCQkgICAgIGNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KQogewogCXN0cnVjdCB2ZWN0b3JfaW5mbyAqdmkgPSBpb3NhcGljX2dldF92ZWN0b3IoaXJxKTsKQEAgLTcxMiw3ICs3MTIsNyBAQAogCiAJZGVzdF9jcHUgPSBjcHVfY2hlY2tfYWZmaW5pdHkoaXJxLCBkZXN0KTsKIAlpZiAoZGVzdF9jcHUgPCAwKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCWNwdW1hc2tfY29weShpcnFfZGVzY1tpcnFdLmFmZmluaXR5LCBjcHVtYXNrX29mKGRlc3RfY3B1KSk7CiAJdmktPnR4bl9hZGRyID0gdHhuX2FmZmluaXR5X2FkZHIoaXJxLCBkZXN0X2NwdSk7CkBAIC03MjQsNiArNzI0LDggQEAKIAlpb3NhcGljX3NldF9pcnRfZGF0YSh2aSwgJmR1bW15X2QwLCAmZDEpOwogCWlvc2FwaWNfd3JfaXJ0X2VudHJ5KHZpLCBkMCwgZDEpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvc2FwaWNfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIDA7CiB9CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfY29yZS5jIGIvZHJpdmVycy9wY2kvaG90cGx1Zy9pYm1waHBfY29yZS5jCmluZGV4IGRkMThmODUuLjQyZTQyNjAgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2hvdHBsdWcvaWJtcGhwX2NvcmUuYworKysgYi9kcml2ZXJzL3BjaS9ob3RwbHVnL2libXBocF9jb3JlLmMKQEAgLTE1Myw0NSArMTUzLDQ3IEBACiAJCXJldHVybiAtMTsKIAl9CiAJZm9yIChsb29wID0gMDsgbG9vcCA8IGxlbjsgbG9vcCsrKSB7Ci0JCWlmICgoKmN1cl9zbG90KS0+bnVtYmVyID09IHJ0YWJsZS0+c2xvdHNbbG9vcF0uc2xvdCkgewotCQlpZiAoKCpjdXJfc2xvdCktPmJ1cyA9PSBydGFibGUtPnNsb3RzW2xvb3BdLmJ1cykgeworCQlpZiAoKCpjdXJfc2xvdCktPm51bWJlciA9PSBydGFibGUtPnNsb3RzW2xvb3BdLnNsb3QgJiYKKwkJICAgICgqY3VyX3Nsb3QpLT5idXMgPT0gcnRhYmxlLT5zbG90c1tsb29wXS5idXMpIHsKKwkJCXN0cnVjdCBpb19hcGljX2lycV9hdHRyIGlycV9hdHRyOworCiAJCQkoKmN1cl9zbG90KS0+ZGV2aWNlID0gUENJX1NMT1QocnRhYmxlLT5zbG90c1tsb29wXS5kZXZmbik7CiAJCQlmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQogCQkJCSgqY3VyX3Nsb3QpLT5pcnFbaV0gPSBJT19BUElDX2dldF9QQ0lfaXJxX3ZlY3RvcigoaW50KSAoKmN1cl9zbG90KS0+YnVzLAotCQkJCQkJKGludCkgKCpjdXJfc2xvdCktPmRldmljZSwgaSk7CisJCQkJCQkoaW50KSAoKmN1cl9zbG90KS0+ZGV2aWNlLCBpLAorCQkJCQkJJmlycV9hdHRyKTsKIAotCQkJCWRlYnVnKCIoKmN1cl9zbG90KS0+aXJxWzBdID0gJXhcbiIsCi0JCQkJCQkoKmN1cl9zbG90KS0+aXJxWzBdKTsKLQkJCQlkZWJ1ZygiKCpjdXJfc2xvdCktPmlycVsxXSA9ICV4XG4iLAotCQkJCQkJKCpjdXJfc2xvdCktPmlycVsxXSk7Ci0JCQkJZGVidWcoIigqY3VyX3Nsb3QpLT5pcnFbMl0gPSAleFxuIiwKLQkJCQkJCSgqY3VyX3Nsb3QpLT5pcnFbMl0pOwotCQkJCWRlYnVnKCIoKmN1cl9zbG90KS0+aXJxWzNdID0gJXhcbiIsCi0JCQkJCQkoKmN1cl9zbG90KS0+aXJxWzNdKTsKKwkJCWRlYnVnKCIoKmN1cl9zbG90KS0+aXJxWzBdID0gJXhcbiIsCisJCQkJCSgqY3VyX3Nsb3QpLT5pcnFbMF0pOworCQkJZGVidWcoIigqY3VyX3Nsb3QpLT5pcnFbMV0gPSAleFxuIiwKKwkJCQkJKCpjdXJfc2xvdCktPmlycVsxXSk7CisJCQlkZWJ1ZygiKCpjdXJfc2xvdCktPmlycVsyXSA9ICV4XG4iLAorCQkJCQkoKmN1cl9zbG90KS0+aXJxWzJdKTsKKwkJCWRlYnVnKCIoKmN1cl9zbG90KS0+aXJxWzNdID0gJXhcbiIsCisJCQkJCSgqY3VyX3Nsb3QpLT5pcnFbM10pOwogCi0JCQkJZGVidWcoInJ0YWJsZS0+ZXhsdXNpdmVfaXJxcyA9ICV4XG4iLAorCQkJZGVidWcoInJ0YWJsZS0+ZXhsdXNpdmVfaXJxcyA9ICV4XG4iLAogCQkJCQlydGFibGUtPmV4Y2x1c2l2ZV9pcnFzKTsKLQkJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMF0uYml0bWFwID0gJXhcbiIsCisJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMF0uYml0bWFwID0gJXhcbiIsCiAJCQkJCXJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzBdLmJpdG1hcCk7Ci0JCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzFdLmJpdG1hcCA9ICV4XG4iLAorCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzFdLmJpdG1hcCA9ICV4XG4iLAogCQkJCQlydGFibGUtPnNsb3RzW2xvb3BdLmlycVsxXS5iaXRtYXApOwotCQkJCWRlYnVnKCJydGFibGUtPnNsb3RzW2xvb3BdLmlycVsyXS5iaXRtYXAgPSAleFxuIiwKKwkJCWRlYnVnKCJydGFibGUtPnNsb3RzW2xvb3BdLmlycVsyXS5iaXRtYXAgPSAleFxuIiwKIAkJCQkJcnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMl0uYml0bWFwKTsKLQkJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbM10uYml0bWFwID0gJXhcbiIsCisJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbM10uYml0bWFwID0gJXhcbiIsCiAJCQkJCXJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzNdLmJpdG1hcCk7CiAKLQkJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMF0ubGluayA9ICV4XG4iLAorCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzBdLmxpbmsgPSAleFxuIiwKIAkJCQkJcnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMF0ubGluayk7Ci0JCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzFdLmxpbmsgPSAleFxuIiwKKwkJCWRlYnVnKCJydGFibGUtPnNsb3RzW2xvb3BdLmlycVsxXS5saW5rID0gJXhcbiIsCiAJCQkJCXJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzFdLmxpbmspOwotCQkJCWRlYnVnKCJydGFibGUtPnNsb3RzW2xvb3BdLmlycVsyXS5saW5rID0gJXhcbiIsCisJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbMl0ubGluayA9ICV4XG4iLAogCQkJCQlydGFibGUtPnNsb3RzW2xvb3BdLmlycVsyXS5saW5rKTsKLQkJCQlkZWJ1ZygicnRhYmxlLT5zbG90c1tsb29wXS5pcnFbM10ubGluayA9ICV4XG4iLAorCQkJZGVidWcoInJ0YWJsZS0+c2xvdHNbbG9vcF0uaXJxWzNdLmxpbmsgPSAleFxuIiwKIAkJCQkJcnRhYmxlLT5zbG90c1tsb29wXS5pcnFbM10ubGluayk7Ci0JCQkJZGVidWcoImVuZCBvZiBpbml0X2Rldm5vXG4iKTsKLQkJCQlrZnJlZShydGFibGUpOwotCQkJCXJldHVybiAwOwotCQkJfQorCQkJZGVidWcoImVuZCBvZiBpbml0X2Rldm5vXG4iKTsKKwkJCWtmcmVlKHJ0YWJsZSk7CisJCQlyZXR1cm4gMDsKIAkJfQogCX0KIApkaWZmIC0tZ2l0IGEvZHJpdmVycy9wY2kvaHRpcnEuYyBiL2RyaXZlcnMvcGNpL2h0aXJxLmMKaW5kZXggNjgwOGQ4My4uNzM3YTFjNCAxMDA2NDQKLS0tIGEvZHJpdmVycy9wY2kvaHRpcnEuYworKysgYi9kcml2ZXJzL3BjaS9odGlycS5jCkBAIC05OCw2ICs5OCw3IEBACiAJaW50IG1heF9pcnE7CiAJaW50IHBvczsKIAlpbnQgaXJxOworCWludCBub2RlOwogCiAJcG9zID0gcGNpX2ZpbmRfaHRfY2FwYWJpbGl0eShkZXYsIEhUX0NBUFRZUEVfSVJRKTsKIAlpZiAoIXBvcykKQEAgLTEyNSw3ICsxMjYsOCBAQAogCWNmZy0+bXNnLmFkZHJlc3NfbG8gPSAweGZmZmZmZmZmOwogCWNmZy0+bXNnLmFkZHJlc3NfaGkgPSAweGZmZmZmZmZmOwogCi0JaXJxID0gY3JlYXRlX2lycSgpOworCW5vZGUgPSBkZXZfdG9fbm9kZSgmZGV2LT5kZXYpOworCWlycSA9IGNyZWF0ZV9pcnFfbnIoMCwgbm9kZSk7CiAKIAlpZiAoaXJxIDw9IDApIHsKIAkJa2ZyZWUoY2ZnKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMgYi9kcml2ZXJzL3BjaS9pbnRlbC1pb21tdS5jCmluZGV4IGE1NjNmYmUuLmNkMzg5MTYgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvcGNpL2ludGVsLWlvbW11LmMKKysrIGIvZHJpdmVycy9wY2kvaW50ZWwtaW9tbXUuYwpAQCAtMTk3MiwxNSArMTk3Miw2IEBACiAJCX0KIAl9CiAKLSNpZmRlZiBDT05GSUdfSU5UUl9SRU1BUAotCWlmICghaW50cl9yZW1hcHBpbmdfZW5hYmxlZCkgewotCQlyZXQgPSBlbmFibGVfaW50cl9yZW1hcHBpbmcoMCk7Ci0JCWlmIChyZXQpCi0JCQlwcmludGsoS0VSTl9FUlIKLQkJCSAgICAgICAiSU9NTVU6IGVuYWJsZSBpbnRlcnJ1cHQgcmVtYXBwaW5nIGZhaWxlZFxuIik7Ci0JfQotI2VuZGlmCi0KIAkvKgogCSAqIEZvciBlYWNoIHJtcnIKIAkgKiAgIGZvciBlYWNoIGRldiBhdHRhY2hlZCB0byBybXJyCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jIGIvZHJpdmVycy9wY2kvaW50cl9yZW1hcHBpbmcuYwppbmRleCBmNWUwZWE3Li4zYTBjYjBiIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BjaS9pbnRyX3JlbWFwcGluZy5jCisrKyBiL2RyaXZlcnMvcGNpL2ludHJfcmVtYXBwaW5nLmMKQEAgLTE1LDYgKzE1LDE0IEBACiBzdGF0aWMgaW50IGlyX2lvYXBpY19udW07CiBpbnQgaW50cl9yZW1hcHBpbmdfZW5hYmxlZDsKIAorc3RhdGljIGludCBkaXNhYmxlX2ludHJlbWFwOworc3RhdGljIF9faW5pdCBpbnQgc2V0dXBfbm9pbnRyZW1hcChjaGFyICpzdHIpCit7CisJZGlzYWJsZV9pbnRyZW1hcCA9IDE7CisJcmV0dXJuIDA7Cit9CitlYXJseV9wYXJhbSgibm9pbnRyZW1hcCIsIHNldHVwX25vaW50cmVtYXApOworCiBzdHJ1Y3QgaXJxXzJfaW9tbXUgewogCXN0cnVjdCBpbnRlbF9pb21tdSAqaW9tbXU7CiAJdTE2IGlydGVfaW5kZXg7CkBAIC0yMywxNSArMzEsMTIgQEAKIH07CiAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19IQVJESVJRUwotc3RhdGljIHN0cnVjdCBpcnFfMl9pb21tdSAqZ2V0X29uZV9mcmVlX2lycV8yX2lvbW11KGludCBjcHUpCitzdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICpnZXRfb25lX2ZyZWVfaXJxXzJfaW9tbXUoaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV8yX2lvbW11ICppb21tdTsKLQlpbnQgbm9kZTsKLQotCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwogCiAJaW9tbXUgPSBremFsbG9jX25vZGUoc2l6ZW9mKCppb21tdSksIEdGUF9BVE9NSUMsIG5vZGUpOwotCXByaW50ayhLRVJOX0RFQlVHICJhbGxvYyBpcnFfMl9pb21tdSBvbiBjcHUgJWQgbm9kZSAlZFxuIiwgY3B1LCBub2RlKTsKKwlwcmludGsoS0VSTl9ERUJVRyAiYWxsb2MgaXJxXzJfaW9tbXUgb24gbm9kZSAlZFxuIiwgbm9kZSk7CiAKIAlyZXR1cm4gaW9tbXU7CiB9CkBAIC00OCw3ICs1Myw3IEBACiAJcmV0dXJuIGRlc2MtPmlycV8yX2lvbW11OwogfQogCi1zdGF0aWMgc3RydWN0IGlycV8yX2lvbW11ICppcnFfMl9pb21tdV9hbGxvY19jcHUodW5zaWduZWQgaW50IGlycSwgaW50IGNwdSkKK3N0YXRpYyBzdHJ1Y3QgaXJxXzJfaW9tbXUgKmlycV8yX2lvbW11X2FsbG9jX25vZGUodW5zaWduZWQgaW50IGlycSwgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXN0cnVjdCBpcnFfMl9pb21tdSAqaXJxX2lvbW11OwpAQCAtNTYsNyArNjEsNyBAQAogCS8qCiAJICogYWxsb2MgaXJxIGRlc2MgaWYgbm90IGFsbG9jYXRlZCBhbHJlYWR5LgogCSAqLwotCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19jcHUoaXJxLCBjcHUpOworCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKGlycSwgbm9kZSk7CiAJaWYgKCFkZXNjKSB7CiAJCXByaW50ayhLRVJOX0lORk8gImNhbiBub3QgZ2V0IGlycV9kZXNjIGZvciAlZFxuIiwgaXJxKTsKIAkJcmV0dXJuIE5VTEw7CkBAIC02NSwxNCArNzAsMTQgQEAKIAlpcnFfaW9tbXUgPSBkZXNjLT5pcnFfMl9pb21tdTsKIAogCWlmICghaXJxX2lvbW11KQotCQlkZXNjLT5pcnFfMl9pb21tdSA9IGdldF9vbmVfZnJlZV9pcnFfMl9pb21tdShjcHUpOworCQlkZXNjLT5pcnFfMl9pb21tdSA9IGdldF9vbmVfZnJlZV9pcnFfMl9pb21tdShub2RlKTsKIAogCXJldHVybiBkZXNjLT5pcnFfMl9pb21tdTsKIH0KIAogc3RhdGljIHN0cnVjdCBpcnFfMl9pb21tdSAqaXJxXzJfaW9tbXVfYWxsb2ModW5zaWduZWQgaW50IGlycSkKIHsKLQlyZXR1cm4gaXJxXzJfaW9tbXVfYWxsb2NfY3B1KGlycSwgYm9vdF9jcHVfaWQpOworCXJldHVybiBpcnFfMl9pb21tdV9hbGxvY19ub2RlKGlycSwgY3B1X3RvX25vZGUoYm9vdF9jcHVfaWQpKTsKIH0KIAogI2Vsc2UgLyogIUNPTkZJR19TUEFSU0VfSVJRICovCkBAIC00MjMsMjAgKzQyOCw2IEBACiAJCSAgICAgIHJlYWRsLCAoc3RzICYgRE1BX0dTVFNfSVJUUFMpLCBzdHMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CiAKLQlpZiAobW9kZSA9PSAwKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZpb21tdS0+cmVnaXN0ZXJfbG9jaywgZmxhZ3MpOwotCi0JCS8qIGVuYWJsZSBjb21hcHRpYmxpdHkgZm9ybWF0IGludGVycnVwdCBwYXNzIHRocm91Z2ggKi8KLQkJY21kID0gaW9tbXUtPmdjbWQgfCBETUFfR0NNRF9DRkk7Ci0JCWlvbW11LT5nY21kIHw9IERNQV9HQ01EX0NGSTsKLQkJd3JpdGVsKGNtZCwgaW9tbXUtPnJlZyArIERNQVJfR0NNRF9SRUcpOwotCi0JCUlPTU1VX1dBSVRfT1AoaW9tbXUsIERNQVJfR1NUU19SRUcsCi0JCQkgICAgICByZWFkbCwgKHN0cyAmIERNQV9HU1RTX0NGSVMpLCBzdHMpOwotCi0JCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7Ci0JfQotCiAJLyoKIAkgKiBnbG9iYWwgaW52YWxpZGF0aW9uIG9mIGludGVycnVwdCBlbnRyeSBjYWNoZSBiZWZvcmUgZW5hYmxpbmcKIAkgKiBpbnRlcnJ1cHQtcmVtYXBwaW5nLgpAQCAtNTE2LDYgKzUwNywyMyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmlvbW11LT5yZWdpc3Rlcl9sb2NrLCBmbGFncyk7CiB9CiAKK2ludCBfX2luaXQgaW50cl9yZW1hcHBpbmdfc3VwcG9ydGVkKHZvaWQpCit7CisJc3RydWN0IGRtYXJfZHJoZF91bml0ICpkcmhkOworCisJaWYgKGRpc2FibGVfaW50cmVtYXApCisJCXJldHVybiAwOworCisJZm9yX2VhY2hfZHJoZF91bml0KGRyaGQpIHsKKwkJc3RydWN0IGludGVsX2lvbW11ICppb21tdSA9IGRyaGQtPmlvbW11OworCisJCWlmICghZWNhcF9pcl9zdXBwb3J0KGlvbW11LT5lY2FwKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCiBpbnQgX19pbml0IGVuYWJsZV9pbnRyX3JlbWFwcGluZyhpbnQgZWltKQogewogCXN0cnVjdCBkbWFyX2RyaGRfdW5pdCAqZHJoZDsKZGlmZiAtLWdpdCBhL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYyBiL2RyaXZlcnMvcG5wL3BucGFjcGkvcnNwYXJzZXIuYwppbmRleCBhZGYxNzg1Li43ZjIwN2YzIDEwMDY0NAotLS0gYS9kcml2ZXJzL3BucC9wbnBhY3BpL3JzcGFyc2VyLmMKKysrIGIvZHJpdmVycy9wbnAvcG5wYWNwaS9yc3BhcnNlci5jCkBAIC0xMjMsNyArMTIzLDcgQEAKIAl9CiAKIAlmbGFncyA9IGlycV9mbGFncyh0cmlnZ2VyaW5nLCBwb2xhcml0eSwgc2hhcmVhYmxlKTsKLQlpcnEgPSBhY3BpX3JlZ2lzdGVyX2dzaShnc2ksIHRyaWdnZXJpbmcsIHBvbGFyaXR5KTsKKwlpcnEgPSBhY3BpX3JlZ2lzdGVyX2dzaSgmZGV2LT5kZXYsIGdzaSwgdHJpZ2dlcmluZywgcG9sYXJpdHkpOwogCWlmIChpcnEgPj0gMCkKIAkJcGNpYmlvc19wZW5hbGl6ZV9pc2FfaXJxKGlycSwgMSk7CiAJZWxzZQpkaWZmIC0tZ2l0IGEvZHJpdmVycy9zY3NpL3NnLmMgYi9kcml2ZXJzL3Njc2kvc2cuYwppbmRleCBlMTcxNmYxLi45MWUzMTZmIDEwMDY0NAotLS0gYS9kcml2ZXJzL3Njc2kvc2cuYworKysgYi9kcml2ZXJzL3Njc2kvc2cuYwpAQCAtMTA2NSw2ICsxMDY1LDcgQEAKIAkJcmV0dXJuIGJsa190cmFjZV9zZXR1cChzZHAtPmRldmljZS0+cmVxdWVzdF9xdWV1ZSwKIAkJCQkgICAgICAgc2RwLT5kaXNrLT5kaXNrX25hbWUsCiAJCQkJICAgICAgIE1LREVWKFNDU0lfR0VORVJJQ19NQUpPUiwgc2RwLT5pbmRleCksCisJCQkJICAgICAgIE5VTEwsCiAJCQkJICAgICAgIChjaGFyICopYXJnKTsKIAljYXNlIEJMS1RSQUNFU1RBUlQ6CiAJCXJldHVybiBibGtfdHJhY2Vfc3RhcnRzdG9wKHNkcC0+ZGV2aWNlLT5yZXF1ZXN0X3F1ZXVlLCAxKTsKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL0tjb25maWcgYi9kcml2ZXJzL3hlbi9LY29uZmlnCmluZGV4IDhhYzljZGQuLmNhYjEwMGEgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL0tjb25maWcKKysrIGIvZHJpdmVycy94ZW4vS2NvbmZpZwpAQCAtMTgsNiArMTgsMTYgQEAKIAkgIHNlY3VyZSwgYnV0IHNsaWdodGx5IGxlc3MgZWZmaWNpZW50LgogCSAgSWYgaW4gZG91YnQsIHNheSB5ZXMuCiAKK2NvbmZpZyBYRU5fREVWX0VWVENITgorCXRyaXN0YXRlICJYZW4gL2Rldi94ZW4vZXZ0Y2huIGRldmljZSIKKwlkZXBlbmRzIG9uIFhFTgorCWRlZmF1bHQgeQorCWhlbHAKKwkgIFRoZSBldnRjaG4gZHJpdmVyIGFsbG93cyBhIHVzZXJzcGFjZSBwcm9jZXNzIHRvIHRyaWdlciBldmVudAorCSAgY2hhbm5lbHMgYW5kIHRvIHJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIGFuIGV2ZW50IGNoYW5uZWwKKwkgIGZpcmluZy4KKwkgIElmIGluIGRvdWJ0LCBzYXkgeWVzLgorCiBjb25maWcgWEVORlMKIAl0cmlzdGF0ZSAiWGVuIGZpbGVzeXN0ZW0iCiAJZGVwZW5kcyBvbiBYRU4KQEAgLTQxLDMgKzUxLDEzIEBACiAgICAgICAgICBhIHhlbiBwbGF0Zm9ybS4KICAgICAgICAgIElmIGluIGRvdWJ0LCBzYXkgeWVzLgogCitjb25maWcgWEVOX1NZU19IWVBFUlZJU09SCisgICAgICAgYm9vbCAiQ3JlYXRlIHhlbiBlbnRyaWVzIHVuZGVyIC9zeXMvaHlwZXJ2aXNvciIKKyAgICAgICBkZXBlbmRzIG9uIFhFTiAmJiBTWVNGUworICAgICAgIHNlbGVjdCBTWVNfSFlQRVJWSVNPUgorICAgICAgIGRlZmF1bHQgeQorICAgICAgIGhlbHAKKyAgICAgICAgIENyZWF0ZSBlbnRyaWVzIHVuZGVyIC9zeXMvaHlwZXJ2aXNvciBkZXNjcmliaW5nIHRoZSBYZW4KKwkgaHlwZXJ2aXNvciBlbnZpcm9ubWVudC4gIFdoZW4gcnVubmluZyBuYXRpdmUgb3IgaW4gYW5vdGhlcgorCSB2aXJ0dWFsIGVudmlyb25tZW50LCAvc3lzL2h5cGVydmlzb3Igd2lsbCBzdGlsbCBiZSBwcmVzZW50LAorCSBidXQgd2lsbCBoYXZlIG5vIHhlbiBjb250ZW50cy4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9NYWtlZmlsZSBiL2RyaXZlcnMveGVuL01ha2VmaWxlCmluZGV4IGZmOGFjY2MuLmVjMmEzOWIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL01ha2VmaWxlCisrKyBiL2RyaXZlcnMveGVuL01ha2VmaWxlCkBAIC00LDQgKzQsNiBAQAogb2JqLSQoQ09ORklHX0hPVFBMVUdfQ1BVKQkrPSBjcHVfaG90cGx1Zy5vCiBvYmotJChDT05GSUdfWEVOX1hFTkNPTU0pCSs9IHhlbmNvbW0ubwogb2JqLSQoQ09ORklHX1hFTl9CQUxMT09OKQkrPSBiYWxsb29uLm8KLW9iai0kKENPTkZJR19YRU5GUykJCSs9IHhlbmZzLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK29iai0kKENPTkZJR19YRU5fREVWX0VWVENITikJKz0gZXZ0Y2huLm8KK29iai0kKENPTkZJR19YRU5GUykJCSs9IHhlbmZzLworb2JqLSQoQ09ORklHX1hFTl9TWVNfSFlQRVJWSVNPUikJKz0gc3lzLWh5cGVydmlzb3IubwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL2V2ZW50cy5jIGIvZHJpdmVycy94ZW4vZXZlbnRzLmMKaW5kZXggMzA5NjNhZi4uODkxZDJlOSAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4vZXZlbnRzLmMKKysrIGIvZHJpdmVycy94ZW4vZXZlbnRzLmMKQEAgLTE1MSw2ICsxNTEsMTIgQEAKIAlyZXR1cm4gaW5mb19mb3JfaXJxKGlycSktPmV2dGNobjsKIH0KIAordW5zaWduZWQgaXJxX2Zyb21fZXZ0Y2huKHVuc2lnbmVkIGludCBldnRjaG4pCit7CisJcmV0dXJuIGV2dGNobl90b19pcnFbZXZ0Y2huXTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGlycV9mcm9tX2V2dGNobik7CisKIHN0YXRpYyBlbnVtIGlwaV92ZWN0b3IgaXBpX2Zyb21faXJxKHVuc2lnbmVkIGlycSkKIHsKIAlzdHJ1Y3QgaXJxX2luZm8gKmluZm8gPSBpbmZvX2Zvcl9pcnEoaXJxKTsKQEAgLTMzNSw3ICszNDEsNyBAQAogCWlmIChpcnEgPT0gbnJfaXJxcykKIAkJcGFuaWMoIk5vIGF2YWlsYWJsZSBJUlEgdG8gYmluZCB0bzogaW5jcmVhc2UgbnJfaXJxcyFcbiIpOwogCi0JZGVzYyA9IGlycV90b19kZXNjX2FsbG9jX2NwdShpcnEsIDApOworCWRlc2MgPSBpcnFfdG9fZGVzY19hbGxvY19ub2RlKGlycSwgMCk7CiAJaWYgKFdBUk5fT04oZGVzYyA9PSBOVUxMKSkKIAkJcmV0dXJuIC0xOwogCkBAIC02ODgsMTMgKzY5NCwxMyBAQAogfQogCiAvKiBSZWJpbmQgYW4gZXZ0Y2huIHNvIHRoYXQgaXQgZ2V0cyBkZWxpdmVyZWQgdG8gYSBzcGVjaWZpYyBjcHUgKi8KLXN0YXRpYyB2b2lkIHJlYmluZF9pcnFfdG9fY3B1KHVuc2lnbmVkIGlycSwgdW5zaWduZWQgdGNwdSkKK3N0YXRpYyBpbnQgcmViaW5kX2lycV90b19jcHUodW5zaWduZWQgaXJxLCB1bnNpZ25lZCB0Y3B1KQogewogCXN0cnVjdCBldnRjaG5fYmluZF92Y3B1IGJpbmRfdmNwdTsKIAlpbnQgZXZ0Y2huID0gZXZ0Y2huX2Zyb21faXJxKGlycSk7CiAKIAlpZiAoIVZBTElEX0VWVENITihldnRjaG4pKQotCQlyZXR1cm47CisJCXJldHVybiAtMTsKIAogCS8qIFNlbmQgZnV0dXJlIGluc3RhbmNlcyBvZiB0aGlzIGludGVycnVwdCB0byBvdGhlciB2Y3B1LiAqLwogCWJpbmRfdmNwdS5wb3J0ID0gZXZ0Y2huOwpAQCAtNzA3LDEzICs3MTMsMTUgQEAKIAkgKi8KIAlpZiAoSFlQRVJWSVNPUl9ldmVudF9jaGFubmVsX29wKEVWVENITk9QX2JpbmRfdmNwdSwgJmJpbmRfdmNwdSkgPj0gMCkKIAkJYmluZF9ldnRjaG5fdG9fY3B1KGV2dGNobiwgdGNwdSk7CisKKwlyZXR1cm4gMDsKIH0KIAotCi1zdGF0aWMgdm9pZCBzZXRfYWZmaW5pdHlfaXJxKHVuc2lnbmVkIGlycSwgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmRlc3QpCitzdGF0aWMgaW50IHNldF9hZmZpbml0eV9pcnEodW5zaWduZWQgaXJxLCBjb25zdCBzdHJ1Y3QgY3B1bWFzayAqZGVzdCkKIHsKIAl1bnNpZ25lZCB0Y3B1ID0gY3B1bWFza19maXJzdChkZXN0KTsKLQlyZWJpbmRfaXJxX3RvX2NwdShpcnEsIHRjcHUpOworCisJcmV0dXJuIHJlYmluZF9pcnFfdG9fY3B1KGlycSwgdGNwdSk7CiB9CiAKIGludCByZXNlbmRfaXJxX29uX2V2dGNobih1bnNpZ25lZCBpbnQgaXJxKQpkaWZmIC0tZ2l0IGEvZHJpdmVycy94ZW4vZXZ0Y2huLmMgYi9kcml2ZXJzL3hlbi9ldnRjaG4uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjAzMTk1Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4vZXZ0Y2huLmMKQEAgLTAsMCArMSw1MDcgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGV2dGNobi5jCisgKgorICogRHJpdmVyIGZvciByZWNlaXZpbmcgYW5kIGRlbXV4aW5nIGV2ZW50LWNoYW5uZWwgc2lnbmFscy4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIDIwMDQtMjAwNSwgSyBBIEZyYXNlcgorICogTXVsdGktcHJvY2VzcyBleHRlbnNpb25zIENvcHlyaWdodCAoYykgMjAwNCwgU3RldmVuIFNtaXRoCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CisjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CisjaW5jbHVkZSA8bGludXgvbWlzY2RldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L21ham9yLmg+CisjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N0YXQuaD4KKyNpbmNsdWRlIDxsaW51eC9wb2xsLmg+CisjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2dmcC5oPgorI2luY2x1ZGUgPGxpbnV4L211dGV4Lmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8eGVuL2V2ZW50cy5oPgorI2luY2x1ZGUgPHhlbi9ldnRjaG4uaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKworc3RydWN0IHBlcl91c2VyX2RhdGEgeworCXN0cnVjdCBtdXRleCBiaW5kX211dGV4OyAvKiBzZXJpYWxpemUgYmluZC91bmJpbmQgb3BlcmF0aW9ucyAqLworCisJLyogTm90aWZpY2F0aW9uIHJpbmcsIGFjY2Vzc2VkIHZpYSAvZGV2L3hlbi9ldnRjaG4uICovCisjZGVmaW5lIEVWVENITl9SSU5HX1NJWkUgICAgIChQQUdFX1NJWkUgLyBzaXplb2YoZXZ0Y2huX3BvcnRfdCkpCisjZGVmaW5lIEVWVENITl9SSU5HX01BU0soX2kpICgoX2kpJihFVlRDSE5fUklOR19TSVpFLTEpKQorCWV2dGNobl9wb3J0X3QgKnJpbmc7CisJdW5zaWduZWQgaW50IHJpbmdfY29ucywgcmluZ19wcm9kLCByaW5nX292ZXJmbG93OworCXN0cnVjdCBtdXRleCByaW5nX2NvbnNfbXV0ZXg7IC8qIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IHJlYWRlcnMgKi8KKworCS8qIFByb2Nlc3NlcyB3YWl0IG9uIHRoaXMgcXVldWUgd2hlbiByaW5nIGlzIGVtcHR5LiAqLworCXdhaXRfcXVldWVfaGVhZF90IGV2dGNobl93YWl0OworCXN0cnVjdCBmYXN5bmNfc3RydWN0ICpldnRjaG5fYXN5bmNfcXVldWU7CisJY29uc3QgY2hhciAqbmFtZTsKK307CisKKy8qIFdobydzIGJvdW5kIHRvIGVhY2ggcG9ydD8gKi8KK3N0YXRpYyBzdHJ1Y3QgcGVyX3VzZXJfZGF0YSAqcG9ydF91c2VyW05SX0VWRU5UX0NIQU5ORUxTXTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socG9ydF91c2VyX2xvY2spOyAvKiBwcm90ZWN0cyBwb3J0X3VzZXJbXSBhbmQgcmluZ19wcm9kICovCisKK2lycXJldHVybl90IGV2dGNobl9pbnRlcnJ1cHQoaW50IGlycSwgdm9pZCAqZGF0YSkKK3sKKwl1bnNpZ25lZCBpbnQgcG9ydCA9ICh1bnNpZ25lZCBsb25nKWRhdGE7CisJc3RydWN0IHBlcl91c2VyX2RhdGEgKnU7CisKKwlzcGluX2xvY2soJnBvcnRfdXNlcl9sb2NrKTsKKworCXUgPSBwb3J0X3VzZXJbcG9ydF07CisKKwlkaXNhYmxlX2lycV9ub3N5bmMoaXJxKTsKKworCWlmICgodS0+cmluZ19wcm9kIC0gdS0+cmluZ19jb25zKSA8IEVWVENITl9SSU5HX1NJWkUpIHsKKwkJdS0+cmluZ1tFVlRDSE5fUklOR19NQVNLKHUtPnJpbmdfcHJvZCldID0gcG9ydDsKKwkJd21iKCk7IC8qIEVuc3VyZSByaW5nIGNvbnRlbnRzIHZpc2libGUgKi8KKwkJaWYgKHUtPnJpbmdfY29ucyA9PSB1LT5yaW5nX3Byb2QrKykgeworCQkJd2FrZV91cF9pbnRlcnJ1cHRpYmxlKCZ1LT5ldnRjaG5fd2FpdCk7CisJCQlraWxsX2Zhc3luYygmdS0+ZXZ0Y2huX2FzeW5jX3F1ZXVlLAorCQkJCSAgICBTSUdJTywgUE9MTF9JTik7CisJCX0KKwl9IGVsc2UgeworCQl1LT5yaW5nX292ZXJmbG93ID0gMTsKKwl9CisKKwlzcGluX3VubG9jaygmcG9ydF91c2VyX2xvY2spOworCisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCitzdGF0aWMgc3NpemVfdCBldnRjaG5fcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWludCByYzsKKwl1bnNpZ25lZCBpbnQgYywgcCwgYnl0ZXMxID0gMCwgYnl0ZXMyID0gMDsKKwlzdHJ1Y3QgcGVyX3VzZXJfZGF0YSAqdSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCS8qIFdob2xlIG51bWJlciBvZiBwb3J0cy4gKi8KKwljb3VudCAmPSB+KHNpemVvZihldnRjaG5fcG9ydF90KS0xKTsKKworCWlmIChjb3VudCA9PSAwKQorCQlyZXR1cm4gMDsKKworCWlmIChjb3VudCA+IFBBR0VfU0laRSkKKwkJY291bnQgPSBQQUdFX1NJWkU7CisKKwlmb3IgKDs7KSB7CisJCW11dGV4X2xvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisKKwkJcmMgPSAtRUZCSUc7CisJCWlmICh1LT5yaW5nX292ZXJmbG93KQorCQkJZ290byB1bmxvY2tfb3V0OworCisJCWMgPSB1LT5yaW5nX2NvbnM7CisJCXAgPSB1LT5yaW5nX3Byb2Q7CisJCWlmIChjICE9IHApCisJCQlicmVhazsKKworCQltdXRleF91bmxvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisKKwkJaWYgKGZpbGUtPmZfZmxhZ3MgJiBPX05PTkJMT0NLKQorCQkJcmV0dXJuIC1FQUdBSU47CisKKwkJcmMgPSB3YWl0X2V2ZW50X2ludGVycnVwdGlibGUodS0+ZXZ0Y2huX3dhaXQsCisJCQkJCSAgICAgIHUtPnJpbmdfY29ucyAhPSB1LT5yaW5nX3Byb2QpOworCQlpZiAocmMpCisJCQlyZXR1cm4gcmM7CisJfQorCisJLyogQnl0ZSBsZW5ndGhzIG9mIHR3byBjaHVua3MuIENodW5rIHNwbGl0IChpZiBhbnkpIGlzIGF0IHJpbmcgd3JhcC4gKi8KKwlpZiAoKChjIF4gcCkgJiBFVlRDSE5fUklOR19TSVpFKSAhPSAwKSB7CisJCWJ5dGVzMSA9IChFVlRDSE5fUklOR19TSVpFIC0gRVZUQ0hOX1JJTkdfTUFTSyhjKSkgKgorCQkJc2l6ZW9mKGV2dGNobl9wb3J0X3QpOworCQlieXRlczIgPSBFVlRDSE5fUklOR19NQVNLKHApICogc2l6ZW9mKGV2dGNobl9wb3J0X3QpOworCX0gZWxzZSB7CisJCWJ5dGVzMSA9IChwIC0gYykgKiBzaXplb2YoZXZ0Y2huX3BvcnRfdCk7CisJCWJ5dGVzMiA9IDA7CisJfQorCisJLyogVHJ1bmNhdGUgY2h1bmtzIGFjY29yZGluZyB0byBjYWxsZXIncyBtYXhpbXVtIGJ5dGUgY291bnQuICovCisJaWYgKGJ5dGVzMSA+IGNvdW50KSB7CisJCWJ5dGVzMSA9IGNvdW50OworCQlieXRlczIgPSAwOworCX0gZWxzZSBpZiAoKGJ5dGVzMSArIGJ5dGVzMikgPiBjb3VudCkgeworCQlieXRlczIgPSBjb3VudCAtIGJ5dGVzMTsKKwl9CisKKwlyYyA9IC1FRkFVTFQ7CisJcm1iKCk7IC8qIEVuc3VyZSB0aGF0IHdlIHNlZSB0aGUgcG9ydCBiZWZvcmUgd2UgY29weSBpdC4gKi8KKwlpZiAoY29weV90b191c2VyKGJ1ZiwgJnUtPnJpbmdbRVZUQ0hOX1JJTkdfTUFTSyhjKV0sIGJ5dGVzMSkgfHwKKwkgICAgKChieXRlczIgIT0gMCkgJiYKKwkgICAgIGNvcHlfdG9fdXNlcigmYnVmW2J5dGVzMV0sICZ1LT5yaW5nWzBdLCBieXRlczIpKSkKKwkJZ290byB1bmxvY2tfb3V0OworCisJdS0+cmluZ19jb25zICs9IChieXRlczEgKyBieXRlczIpIC8gc2l6ZW9mKGV2dGNobl9wb3J0X3QpOworCXJjID0gYnl0ZXMxICsgYnl0ZXMyOworCisgdW5sb2NrX291dDoKKwltdXRleF91bmxvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgc3NpemVfdCBldnRjaG5fd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICpidWYsCisJCQkgICAgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50IHJjLCBpOworCWV2dGNobl9wb3J0X3QgKmtidWYgPSAoZXZ0Y2huX3BvcnRfdCAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfS0VSTkVMKTsKKwlzdHJ1Y3QgcGVyX3VzZXJfZGF0YSAqdSA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCWlmIChrYnVmID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogV2hvbGUgbnVtYmVyIG9mIHBvcnRzLiAqLworCWNvdW50ICY9IH4oc2l6ZW9mKGV2dGNobl9wb3J0X3QpLTEpOworCisJcmMgPSAwOworCWlmIChjb3VudCA9PSAwKQorCQlnb3RvIG91dDsKKworCWlmIChjb3VudCA+IFBBR0VfU0laRSkKKwkJY291bnQgPSBQQUdFX1NJWkU7CisKKwlyYyA9IC1FRkFVTFQ7CisJaWYgKGNvcHlfZnJvbV91c2VyKGtidWYsIGJ1ZiwgY291bnQpICE9IDApCisJCWdvdG8gb3V0OworCisJc3Bpbl9sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCWZvciAoaSA9IDA7IGkgPCAoY291bnQvc2l6ZW9mKGV2dGNobl9wb3J0X3QpKTsgaSsrKQorCQlpZiAoKGtidWZbaV0gPCBOUl9FVkVOVF9DSEFOTkVMUykgJiYgKHBvcnRfdXNlcltrYnVmW2ldXSA9PSB1KSkKKwkJCWVuYWJsZV9pcnEoaXJxX2Zyb21fZXZ0Y2huKGtidWZbaV0pKTsKKwlzcGluX3VubG9ja19pcnEoJnBvcnRfdXNlcl9sb2NrKTsKKworCXJjID0gY291bnQ7CisKKyBvdXQ6CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWtidWYpOworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBldnRjaG5fYmluZF90b191c2VyKHN0cnVjdCBwZXJfdXNlcl9kYXRhICp1LCBpbnQgcG9ydCkKK3sKKwlpbnQgcmMgPSAwOworCisJLyoKKwkgKiBQb3J0cyBhcmUgbmV2ZXIgcmV1c2VkLCBzbyBldmVyeSBjYWxsZXIgc2hvdWxkIHBhc3MgaW4gYQorCSAqIHVuaXF1ZSBwb3J0LgorCSAqCisJICogKExvY2tpbmcgbm90IG5lY2Vzc2FyeSBiZWNhdXNlIHdlIGhhdmVuJ3QgcmVnaXN0ZXJlZCB0aGUKKwkgKiBpbnRlcnJ1cHQgaGFuZGxlciB5ZXQsIGFuZCBvdXIgY2FsbGVyIGhhcyBhbHJlYWR5CisJICogc2VyaWFsaXplZCBiaW5kIG9wZXJhdGlvbnMuKQorCSAqLworCUJVR19PTihwb3J0X3VzZXJbcG9ydF0gIT0gTlVMTCk7CisJcG9ydF91c2VyW3BvcnRdID0gdTsKKworCXJjID0gYmluZF9ldnRjaG5fdG9faXJxaGFuZGxlcihwb3J0LCBldnRjaG5faW50ZXJydXB0LCBJUlFGX0RJU0FCTEVELAorCQkJCSAgICAgICB1LT5uYW1lLCAodm9pZCAqKSh1bnNpZ25lZCBsb25nKXBvcnQpOworCWlmIChyYyA+PSAwKQorCQlyYyA9IDA7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyB2b2lkIGV2dGNobl91bmJpbmRfZnJvbV91c2VyKHN0cnVjdCBwZXJfdXNlcl9kYXRhICp1LCBpbnQgcG9ydCkKK3sKKwlpbnQgaXJxID0gaXJxX2Zyb21fZXZ0Y2huKHBvcnQpOworCisJdW5iaW5kX2Zyb21faXJxaGFuZGxlcihpcnEsICh2b2lkICopKHVuc2lnbmVkIGxvbmcpcG9ydCk7CisKKwkvKiBtYWtlIHN1cmUgd2UgdW5iaW5kIHRoZSBpcnEgaGFuZGxlciBiZWZvcmUgY2xlYXJpbmcgdGhlIHBvcnQgKi8KKwliYXJyaWVyKCk7CisKKwlwb3J0X3VzZXJbcG9ydF0gPSBOVUxMOworfQorCitzdGF0aWMgbG9uZyBldnRjaG5faW9jdGwoc3RydWN0IGZpbGUgKmZpbGUsCisJCQkgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcpCit7CisJaW50IHJjOworCXN0cnVjdCBwZXJfdXNlcl9kYXRhICp1ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgX191c2VyICp1YXJnID0gKHZvaWQgX191c2VyICopIGFyZzsKKworCS8qIFByZXZlbnQgYmluZCBmcm9tIHJhY2luZyB3aXRoIHVuYmluZCAqLworCW11dGV4X2xvY2soJnUtPmJpbmRfbXV0ZXgpOworCisJc3dpdGNoIChjbWQpIHsKKwljYXNlIElPQ1RMX0VWVENITl9CSU5EX1ZJUlE6IHsKKwkJc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX3ZpcnEgYmluZDsKKwkJc3RydWN0IGV2dGNobl9iaW5kX3ZpcnEgYmluZF92aXJxOworCisJCXJjID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZiaW5kLCB1YXJnLCBzaXplb2YoYmluZCkpKQorCQkJYnJlYWs7CisKKwkJYmluZF92aXJxLnZpcnEgPSBiaW5kLnZpcnE7CisJCWJpbmRfdmlycS52Y3B1ID0gMDsKKwkJcmMgPSBIWVBFUlZJU09SX2V2ZW50X2NoYW5uZWxfb3AoRVZUQ0hOT1BfYmluZF92aXJxLAorCQkJCQkJICZiaW5kX3ZpcnEpOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOworCisJCXJjID0gZXZ0Y2huX2JpbmRfdG9fdXNlcih1LCBiaW5kX3ZpcnEucG9ydCk7CisJCWlmIChyYyA9PSAwKQorCQkJcmMgPSBiaW5kX3ZpcnEucG9ydDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJT0NUTF9FVlRDSE5fQklORF9JTlRFUkRPTUFJTjogeworCQlzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfaW50ZXJkb21haW4gYmluZDsKKwkJc3RydWN0IGV2dGNobl9iaW5kX2ludGVyZG9tYWluIGJpbmRfaW50ZXJkb21haW47CisKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJpbmQsIHVhcmcsIHNpemVvZihiaW5kKSkpCisJCQlicmVhazsKKworCQliaW5kX2ludGVyZG9tYWluLnJlbW90ZV9kb20gID0gYmluZC5yZW1vdGVfZG9tYWluOworCQliaW5kX2ludGVyZG9tYWluLnJlbW90ZV9wb3J0ID0gYmluZC5yZW1vdGVfcG9ydDsKKwkJcmMgPSBIWVBFUlZJU09SX2V2ZW50X2NoYW5uZWxfb3AoRVZUQ0hOT1BfYmluZF9pbnRlcmRvbWFpbiwKKwkJCQkJCSAmYmluZF9pbnRlcmRvbWFpbik7CisJCWlmIChyYyAhPSAwKQorCQkJYnJlYWs7CisKKwkJcmMgPSBldnRjaG5fYmluZF90b191c2VyKHUsIGJpbmRfaW50ZXJkb21haW4ubG9jYWxfcG9ydCk7CisJCWlmIChyYyA9PSAwKQorCQkJcmMgPSBiaW5kX2ludGVyZG9tYWluLmxvY2FsX3BvcnQ7CisJCWJyZWFrOworCX0KKworCWNhc2UgSU9DVExfRVZUQ0hOX0JJTkRfVU5CT1VORF9QT1JUOiB7CisJCXN0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF91bmJvdW5kX3BvcnQgYmluZDsKKwkJc3RydWN0IGV2dGNobl9hbGxvY191bmJvdW5kIGFsbG9jX3VuYm91bmQ7CisKKwkJcmMgPSAtRUZBVUxUOworCQlpZiAoY29weV9mcm9tX3VzZXIoJmJpbmQsIHVhcmcsIHNpemVvZihiaW5kKSkpCisJCQlicmVhazsKKworCQlhbGxvY191bmJvdW5kLmRvbSAgICAgICAgPSBET01JRF9TRUxGOworCQlhbGxvY191bmJvdW5kLnJlbW90ZV9kb20gPSBiaW5kLnJlbW90ZV9kb21haW47CisJCXJjID0gSFlQRVJWSVNPUl9ldmVudF9jaGFubmVsX29wKEVWVENITk9QX2FsbG9jX3VuYm91bmQsCisJCQkJCQkgJmFsbG9jX3VuYm91bmQpOworCQlpZiAocmMgIT0gMCkKKwkJCWJyZWFrOworCisJCXJjID0gZXZ0Y2huX2JpbmRfdG9fdXNlcih1LCBhbGxvY191bmJvdW5kLnBvcnQpOworCQlpZiAocmMgPT0gMCkKKwkJCXJjID0gYWxsb2NfdW5ib3VuZC5wb3J0OworCQlicmVhazsKKwl9CisKKwljYXNlIElPQ1RMX0VWVENITl9VTkJJTkQ6IHsKKwkJc3RydWN0IGlvY3RsX2V2dGNobl91bmJpbmQgdW5iaW5kOworCisJCXJjID0gLUVGQVVMVDsKKwkJaWYgKGNvcHlfZnJvbV91c2VyKCZ1bmJpbmQsIHVhcmcsIHNpemVvZih1bmJpbmQpKSkKKwkJCWJyZWFrOworCisJCXJjID0gLUVJTlZBTDsKKwkJaWYgKHVuYmluZC5wb3J0ID49IE5SX0VWRU5UX0NIQU5ORUxTKQorCQkJYnJlYWs7CisKKwkJc3Bpbl9sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCisJCXJjID0gLUVOT1RDT05OOworCQlpZiAocG9ydF91c2VyW3VuYmluZC5wb3J0XSAhPSB1KSB7CisJCQlzcGluX3VubG9ja19pcnEoJnBvcnRfdXNlcl9sb2NrKTsKKwkJCWJyZWFrOworCQl9CisKKwkJZXZ0Y2huX3VuYmluZF9mcm9tX3VzZXIodSwgdW5iaW5kLnBvcnQpOworCisJCXNwaW5fdW5sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJY2FzZSBJT0NUTF9FVlRDSE5fTk9USUZZOiB7CisJCXN0cnVjdCBpb2N0bF9ldnRjaG5fbm90aWZ5IG5vdGlmeTsKKworCQlyYyA9IC1FRkFVTFQ7CisJCWlmIChjb3B5X2Zyb21fdXNlcigmbm90aWZ5LCB1YXJnLCBzaXplb2Yobm90aWZ5KSkpCisJCQlicmVhazsKKworCQlpZiAobm90aWZ5LnBvcnQgPj0gTlJfRVZFTlRfQ0hBTk5FTFMpIHsKKwkJCXJjID0gLUVJTlZBTDsKKwkJfSBlbHNlIGlmIChwb3J0X3VzZXJbbm90aWZ5LnBvcnRdICE9IHUpIHsKKwkJCXJjID0gLUVOT1RDT05OOworCQl9IGVsc2UgeworCQkJbm90aWZ5X3JlbW90ZV92aWFfZXZ0Y2huKG5vdGlmeS5wb3J0KTsKKwkJCXJjID0gMDsKKwkJfQorCQlicmVhazsKKwl9CisKKwljYXNlIElPQ1RMX0VWVENITl9SRVNFVDogeworCQkvKiBJbml0aWFsaXNlIHRoZSByaW5nIHRvIGVtcHR5LiBDbGVhciBlcnJvcnMuICovCisJCW11dGV4X2xvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisJCXNwaW5fbG9ja19pcnEoJnBvcnRfdXNlcl9sb2NrKTsKKwkJdS0+cmluZ19jb25zID0gdS0+cmluZ19wcm9kID0gdS0+cmluZ19vdmVyZmxvdyA9IDA7CisJCXNwaW5fdW5sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCQltdXRleF91bmxvY2soJnUtPnJpbmdfY29uc19tdXRleCk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJZGVmYXVsdDoKKwkJcmMgPSAtRU5PU1lTOworCQlicmVhazsKKwl9CisJbXV0ZXhfdW5sb2NrKCZ1LT5iaW5kX211dGV4KTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIHVuc2lnbmVkIGludCBldnRjaG5fcG9sbChzdHJ1Y3QgZmlsZSAqZmlsZSwgcG9sbF90YWJsZSAqd2FpdCkKK3sKKwl1bnNpZ25lZCBpbnQgbWFzayA9IFBPTExPVVQgfCBQT0xMV1JOT1JNOworCXN0cnVjdCBwZXJfdXNlcl9kYXRhICp1ID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCisJcG9sbF93YWl0KGZpbGUsICZ1LT5ldnRjaG5fd2FpdCwgd2FpdCk7CisJaWYgKHUtPnJpbmdfY29ucyAhPSB1LT5yaW5nX3Byb2QpCisJCW1hc2sgfD0gUE9MTElOIHwgUE9MTFJETk9STTsKKwlpZiAodS0+cmluZ19vdmVyZmxvdykKKwkJbWFzayA9IFBPTExFUlI7CisJcmV0dXJuIG1hc2s7Cit9CisKK3N0YXRpYyBpbnQgZXZ0Y2huX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCit7CisJc3RydWN0IHBlcl91c2VyX2RhdGEgKnUgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJcmV0dXJuIGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmdS0+ZXZ0Y2huX2FzeW5jX3F1ZXVlKTsKK30KKworc3RhdGljIGludCBldnRjaG5fb3BlbihzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgZmlsZSAqZmlscCkKK3sKKwlzdHJ1Y3QgcGVyX3VzZXJfZGF0YSAqdTsKKworCXUgPSBremFsbG9jKHNpemVvZigqdSksIEdGUF9LRVJORUwpOworCWlmICh1ID09IE5VTEwpCisJCXJldHVybiAtRU5PTUVNOworCisJdS0+bmFtZSA9IGthc3ByaW50ZihHRlBfS0VSTkVMLCAiZXZ0Y2huOiVzIiwgY3VycmVudC0+Y29tbSk7CisJaWYgKHUtPm5hbWUgPT0gTlVMTCkgeworCQlrZnJlZSh1KTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCisJaW5pdF93YWl0cXVldWVfaGVhZCgmdS0+ZXZ0Y2huX3dhaXQpOworCisJdS0+cmluZyA9IChldnRjaG5fcG9ydF90ICopX19nZXRfZnJlZV9wYWdlKEdGUF9LRVJORUwpOworCWlmICh1LT5yaW5nID09IE5VTEwpIHsKKwkJa2ZyZWUodS0+bmFtZSk7CisJCWtmcmVlKHUpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwltdXRleF9pbml0KCZ1LT5iaW5kX211dGV4KTsKKwltdXRleF9pbml0KCZ1LT5yaW5nX2NvbnNfbXV0ZXgpOworCisJZmlscC0+cHJpdmF0ZV9kYXRhID0gdTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGV2dGNobl9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKQoreworCWludCBpOworCXN0cnVjdCBwZXJfdXNlcl9kYXRhICp1ID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCisJc3Bpbl9sb2NrX2lycSgmcG9ydF91c2VyX2xvY2spOworCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKXUtPnJpbmcpOworCisJZm9yIChpID0gMDsgaSA8IE5SX0VWRU5UX0NIQU5ORUxTOyBpKyspIHsKKwkJaWYgKHBvcnRfdXNlcltpXSAhPSB1KQorCQkJY29udGludWU7CisKKwkJZXZ0Y2huX3VuYmluZF9mcm9tX3VzZXIocG9ydF91c2VyW2ldLCBpKTsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJnBvcnRfdXNlcl9sb2NrKTsKKworCWtmcmVlKHUtPm5hbWUpOworCWtmcmVlKHUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGV2dGNobl9mb3BzID0geworCS5vd25lciAgID0gVEhJU19NT0RVTEUsCisJLnJlYWQgICAgPSBldnRjaG5fcmVhZCwKKwkud3JpdGUgICA9IGV2dGNobl93cml0ZSwKKwkudW5sb2NrZWRfaW9jdGwgPSBldnRjaG5faW9jdGwsCisJLnBvbGwgICAgPSBldnRjaG5fcG9sbCwKKwkuZmFzeW5jICA9IGV2dGNobl9mYXN5bmMsCisJLm9wZW4gICAgPSBldnRjaG5fb3BlbiwKKwkucmVsZWFzZSA9IGV2dGNobl9yZWxlYXNlLAorfTsKKworc3RhdGljIHN0cnVjdCBtaXNjZGV2aWNlIGV2dGNobl9taXNjZGV2ID0geworCS5taW5vciAgICAgICAgPSBNSVNDX0RZTkFNSUNfTUlOT1IsCisJLm5hbWUgICAgICAgICA9ICJldnRjaG4iLAorCS5mb3BzICAgICAgICAgPSAmZXZ0Y2huX2ZvcHMsCit9Oworc3RhdGljIGludCBfX2luaXQgZXZ0Y2huX2luaXQodm9pZCkKK3sKKwlpbnQgZXJyOworCisJaWYgKCF4ZW5fZG9tYWluKCkpCisJCXJldHVybiAtRU5PREVWOworCisJc3Bpbl9sb2NrX2luaXQoJnBvcnRfdXNlcl9sb2NrKTsKKwltZW1zZXQocG9ydF91c2VyLCAwLCBzaXplb2YocG9ydF91c2VyKSk7CisKKwkvKiBDcmVhdGUgJy9kZXYvbWlzYy9ldnRjaG4nLiAqLworCWVyciA9IG1pc2NfcmVnaXN0ZXIoJmV2dGNobl9taXNjZGV2KTsKKwlpZiAoZXJyICE9IDApIHsKKwkJcHJpbnRrKEtFUk5fQUxFUlQgIkNvdWxkIG5vdCByZWdpc3RlciAvZGV2L21pc2MvZXZ0Y2huXG4iKTsKKwkJcmV0dXJuIGVycjsKKwl9CisKKwlwcmludGsoS0VSTl9JTkZPICJFdmVudC1jaGFubmVsIGRldmljZSBpbnN0YWxsZWQuXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBfX2V4aXQgZXZ0Y2huX2NsZWFudXAodm9pZCkKK3sKKwltaXNjX2RlcmVnaXN0ZXIoJmV2dGNobl9taXNjZGV2KTsKK30KKworbW9kdWxlX2luaXQoZXZ0Y2huX2luaXQpOworbW9kdWxlX2V4aXQoZXZ0Y2huX2NsZWFudXApOworCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9tYW5hZ2UuYyBiL2RyaXZlcnMveGVuL21hbmFnZS5jCmluZGV4IDRiNWI4NDguLmZkZGMyMDIgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMveGVuL21hbmFnZS5jCisrKyBiL2RyaXZlcnMveGVuL21hbmFnZS5jCkBAIC05OCw5ICs5OCw4IEBACiAJCWdvdG8gb3V0OwogCX0KIAotCXByaW50aygic3VzcGVuZGluZyB4ZW5idXMuLi5cbiIpOwotCS8qIFhYWCB1c2Ugbm9ybWFsIGRldmljZSB0cmVlPyAqLwotCXhlbmJ1c19zdXNwZW5kKCk7CisJcHJpbnRrKEtFUk5fREVCVUcgInN1c3BlbmRpbmcgeGVuc3RvcmUuLi5cbiIpOworCXhzX3N1c3BlbmQoKTsKIAogCWVyciA9IGRldmljZV9wb3dlcl9kb3duKFBNU0dfU1VTUEVORCk7CiAJaWYgKGVycikgewpAQCAtMTE2LDkgKzExNSw5IEBACiAKIAlpZiAoIWNhbmNlbGxlZCkgewogCQl4ZW5fYXJjaF9yZXN1bWUoKTsKLQkJeGVuYnVzX3Jlc3VtZSgpOworCQl4c19yZXN1bWUoKTsKIAl9IGVsc2UKLQkJeGVuYnVzX3N1c3BlbmRfY2FuY2VsKCk7CisJCXhzX3N1c3BlbmRfY2FuY2VsKCk7CiAKIAlkZXZpY2VfcG93ZXJfdXAoUE1TR19SRVNVTUUpOwogCmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi9zeXMtaHlwZXJ2aXNvci5jIGIvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGE2MGUwCi0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy94ZW4vc3lzLWh5cGVydmlzb3IuYwpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqICBjb3B5cmlnaHQgKGMpIDIwMDYgSUJNIENvcnBvcmF0aW9uCisgKiAgQXV0aG9yZWQgYnk6IE1pa2UgRC4gRGF5IDxuY21pa2VAdXMuaWJtLmNvbT4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIHZlcnNpb24gMiBhcworICogIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICovCisKKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KKyNpbmNsdWRlIDxsaW51eC9rb2JqZWN0Lmg+CisKKyNpbmNsdWRlIDxhc20veGVuL2h5cGVydmlzb3IuaD4KKyNpbmNsdWRlIDxhc20veGVuL2h5cGVyY2FsbC5oPgorCisjaW5jbHVkZSA8eGVuL3hlbmJ1cy5oPgorI2luY2x1ZGUgPHhlbi9pbnRlcmZhY2UveGVuLmg+CisjaW5jbHVkZSA8eGVuL2ludGVyZmFjZS92ZXJzaW9uLmg+CisKKyNkZWZpbmUgSFlQRVJWSVNPUl9BVFRSX1JPKF9uYW1lKSBcCitzdGF0aWMgc3RydWN0IGh5cF9zeXNmc19hdHRyICBfbmFtZSMjX2F0dHIgPSBfX0FUVFJfUk8oX25hbWUpCisKKyNkZWZpbmUgSFlQRVJWSVNPUl9BVFRSX1JXKF9uYW1lKSBcCitzdGF0aWMgc3RydWN0IGh5cF9zeXNmc19hdHRyIF9uYW1lIyNfYXR0ciA9IFwKKwlfX0FUVFIoX25hbWUsIDA2NDQsIF9uYW1lIyNfc2hvdywgX25hbWUjI19zdG9yZSkKKworc3RydWN0IGh5cF9zeXNmc19hdHRyIHsKKwlzdHJ1Y3QgYXR0cmlidXRlIGF0dHI7CisJc3NpemVfdCAoKnNob3cpKHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqLCBjaGFyICopOworCXNzaXplX3QgKCpzdG9yZSkoc3RydWN0IGh5cF9zeXNmc19hdHRyICosIGNvbnN0IGNoYXIgKiwgc2l6ZV90KTsKKwl2b2lkICpoeXBfYXR0cl9kYXRhOworfTsKKworc3RhdGljIHNzaXplX3QgdHlwZV9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgInhlblxuIik7Cit9CisKK0hZUEVSVklTT1JfQVRUUl9STyh0eXBlKTsKKworc3RhdGljIGludCBfX2luaXQgeGVuX3N5c2ZzX3R5cGVfaW5pdCh2b2lkKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZmlsZShoeXBlcnZpc29yX2tvYmosICZ0eXBlX2F0dHIuYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9zeXNmc190eXBlX2Rlc3Ryb3kodm9pZCkKK3sKKwlzeXNmc19yZW1vdmVfZmlsZShoeXBlcnZpc29yX2tvYmosICZ0eXBlX2F0dHIuYXR0cik7Cit9CisKKy8qIHhlbiB2ZXJzaW9uIGF0dHJpYnV0ZXMgKi8KK3N0YXRpYyBzc2l6ZV90IG1ham9yX3Nob3coc3RydWN0IGh5cF9zeXNmc19hdHRyICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJaW50IHZlcnNpb24gPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl92ZXJzaW9uLCBOVUxMKTsKKwlpZiAodmVyc2lvbikKKwkJcmV0dXJuIHNwcmludGYoYnVmZmVyLCAiJWRcbiIsIHZlcnNpb24gPj4gMTYpOworCXJldHVybiAtRU5PREVWOworfQorCitIWVBFUlZJU09SX0FUVFJfUk8obWFqb3IpOworCitzdGF0aWMgc3NpemVfdCBtaW5vcl9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCB2ZXJzaW9uID0gSFlQRVJWSVNPUl94ZW5fdmVyc2lvbihYRU5WRVJfdmVyc2lvbiwgTlVMTCk7CisJaWYgKHZlcnNpb24pCisJCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwgIiVkXG4iLCB2ZXJzaW9uICYgMHhmZik7CisJcmV0dXJuIC1FTk9ERVY7Cit9CisKK0hZUEVSVklTT1JfQVRUUl9STyhtaW5vcik7CisKK3N0YXRpYyBzc2l6ZV90IGV4dHJhX3Nob3coc3RydWN0IGh5cF9zeXNmc19hdHRyICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisJY2hhciAqZXh0cmE7CisKKwlleHRyYSA9IGttYWxsb2MoWEVOX0VYVFJBVkVSU0lPTl9MRU4sIEdGUF9LRVJORUwpOworCWlmIChleHRyYSkgeworCQlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9leHRyYXZlcnNpb24sIGV4dHJhKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBleHRyYSk7CisJCWtmcmVlKGV4dHJhKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitIWVBFUlZJU09SX0FUVFJfUk8oZXh0cmEpOworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZSAqdmVyc2lvbl9hdHRyc1tdID0geworCSZtYWpvcl9hdHRyLmF0dHIsCisJJm1pbm9yX2F0dHIuYXR0ciwKKwkmZXh0cmFfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHZlcnNpb25fZ3JvdXAgPSB7CisJLm5hbWUgPSAidmVyc2lvbiIsCisJLmF0dHJzID0gdmVyc2lvbl9hdHRycywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9zeXNmc192ZXJzaW9uX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKGh5cGVydmlzb3Jfa29iaiwgJnZlcnNpb25fZ3JvdXApOworfQorCitzdGF0aWMgdm9pZCB4ZW5fc3lzZnNfdmVyc2lvbl9kZXN0cm95KHZvaWQpCit7CisJc3lzZnNfcmVtb3ZlX2dyb3VwKGh5cGVydmlzb3Jfa29iaiwgJnZlcnNpb25fZ3JvdXApOworfQorCisvKiBVVUlEICovCisKK3N0YXRpYyBzc2l6ZV90IHV1aWRfc2hvdyhzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwljaGFyICp2bSwgKnZhbDsKKwlpbnQgcmV0OworCWV4dGVybiBpbnQgeGVuc3RvcmVkX3JlYWR5OworCisJaWYgKCF4ZW5zdG9yZWRfcmVhZHkpCisJCXJldHVybiAtRUJVU1k7CisKKwl2bSA9IHhlbmJ1c19yZWFkKFhCVF9OSUwsICJ2bSIsICIiLCBOVUxMKTsKKwlpZiAoSVNfRVJSKHZtKSkKKwkJcmV0dXJuIFBUUl9FUlIodm0pOworCXZhbCA9IHhlbmJ1c19yZWFkKFhCVF9OSUwsIHZtLCAidXVpZCIsIE5VTEwpOworCWtmcmVlKHZtKTsKKwlpZiAoSVNfRVJSKHZhbCkpCisJCXJldHVybiBQVFJfRVJSKHZhbCk7CisJcmV0ID0gc3ByaW50ZihidWZmZXIsICIlc1xuIiwgdmFsKTsKKwlrZnJlZSh2YWwpOworCXJldHVybiByZXQ7Cit9CisKK0hZUEVSVklTT1JfQVRUUl9STyh1dWlkKTsKKworc3RhdGljIGludCBfX2luaXQgeGVuX3N5c2ZzX3V1aWRfaW5pdCh2b2lkKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZmlsZShoeXBlcnZpc29yX2tvYmosICZ1dWlkX2F0dHIuYXR0cik7Cit9CisKK3N0YXRpYyB2b2lkIHhlbl9zeXNmc191dWlkX2Rlc3Ryb3kodm9pZCkKK3sKKwlzeXNmc19yZW1vdmVfZmlsZShoeXBlcnZpc29yX2tvYmosICZ1dWlkX2F0dHIuYXR0cik7Cit9CisKKy8qIHhlbiBjb21waWxhdGlvbiBhdHRyaWJ1dGVzICovCisKK3N0YXRpYyBzc2l6ZV90IGNvbXBpbGVyX3Nob3coc3RydWN0IGh5cF9zeXNmc19hdHRyICphdHRyLCBjaGFyICpidWZmZXIpCit7CisJaW50IHJldCA9IC1FTk9NRU07CisJc3RydWN0IHhlbl9jb21waWxlX2luZm8gKmluZm87CisKKwlpbmZvID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHhlbl9jb21waWxlX2luZm8pLCBHRlBfS0VSTkVMKTsKKwlpZiAoaW5mbykgeworCQlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9jb21waWxlX2luZm8sIGluZm8pOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHNwcmludGYoYnVmZmVyLCAiJXNcbiIsIGluZm8tPmNvbXBpbGVyKTsKKwkJa2ZyZWUoaW5mbyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworSFlQRVJWSVNPUl9BVFRSX1JPKGNvbXBpbGVyKTsKKworc3RhdGljIHNzaXplX3QgY29tcGlsZWRfYnlfc2hvdyhzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwlzdHJ1Y3QgeGVuX2NvbXBpbGVfaW5mbyAqaW5mbzsKKworCWluZm8gPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgeGVuX2NvbXBpbGVfaW5mbyksIEdGUF9LRVJORUwpOworCWlmIChpbmZvKSB7CisJCXJldCA9IEhZUEVSVklTT1JfeGVuX3ZlcnNpb24oWEVOVkVSX2NvbXBpbGVfaW5mbywgaW5mbyk7CisJCWlmICghcmV0KQorCQkJcmV0ID0gc3ByaW50ZihidWZmZXIsICIlc1xuIiwgaW5mby0+Y29tcGlsZV9ieSk7CisJCWtmcmVlKGluZm8pOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK0hZUEVSVklTT1JfQVRUUl9STyhjb21waWxlZF9ieSk7CisKK3N0YXRpYyBzc2l6ZV90IGNvbXBpbGVfZGF0ZV9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCB4ZW5fY29tcGlsZV9pbmZvICppbmZvOworCisJaW5mbyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4ZW5fY29tcGlsZV9pbmZvKSwgR0ZQX0tFUk5FTCk7CisJaWYgKGluZm8pIHsKKwkJcmV0ID0gSFlQRVJWSVNPUl94ZW5fdmVyc2lvbihYRU5WRVJfY29tcGlsZV9pbmZvLCBpbmZvKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBpbmZvLT5jb21waWxlX2RhdGUpOworCQlrZnJlZShpbmZvKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitIWVBFUlZJU09SX0FUVFJfUk8oY29tcGlsZV9kYXRlKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnhlbl9jb21waWxlX2F0dHJzW10gPSB7CisJJmNvbXBpbGVyX2F0dHIuYXR0ciwKKwkmY29tcGlsZWRfYnlfYXR0ci5hdHRyLAorCSZjb21waWxlX2RhdGVfYXR0ci5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHhlbl9jb21waWxhdGlvbl9ncm91cCA9IHsKKwkubmFtZSA9ICJjb21waWxhdGlvbiIsCisJLmF0dHJzID0geGVuX2NvbXBpbGVfYXR0cnMsCit9OworCitpbnQgX19pbml0IHN0YXRpYyB4ZW5fY29tcGlsYXRpb25faW5pdCh2b2lkKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoaHlwZXJ2aXNvcl9rb2JqLCAmeGVuX2NvbXBpbGF0aW9uX2dyb3VwKTsKK30KKworc3RhdGljIHZvaWQgeGVuX2NvbXBpbGF0aW9uX2Rlc3Ryb3kodm9pZCkKK3sKKwlzeXNmc19yZW1vdmVfZ3JvdXAoaHlwZXJ2aXNvcl9rb2JqLCAmeGVuX2NvbXBpbGF0aW9uX2dyb3VwKTsKK30KKworLyogeGVuIHByb3BlcnRpZXMgaW5mbyAqLworCitzdGF0aWMgc3NpemVfdCBjYXBhYmlsaXRpZXNfc2hvdyhzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlpbnQgcmV0ID0gLUVOT01FTTsKKwljaGFyICpjYXBzOworCisJY2FwcyA9IGttYWxsb2MoWEVOX0NBUEFCSUxJVElFU19JTkZPX0xFTiwgR0ZQX0tFUk5FTCk7CisJaWYgKGNhcHMpIHsKKwkJcmV0ID0gSFlQRVJWSVNPUl94ZW5fdmVyc2lvbihYRU5WRVJfY2FwYWJpbGl0aWVzLCBjYXBzKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZmZlciwgIiVzXG4iLCBjYXBzKTsKKwkJa2ZyZWUoY2Fwcyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworSFlQRVJWSVNPUl9BVFRSX1JPKGNhcGFiaWxpdGllcyk7CisKK3N0YXRpYyBzc2l6ZV90IGNoYW5nZXNldF9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCByZXQgPSAtRU5PTUVNOworCWNoYXIgKmNzZXQ7CisKKwljc2V0ID0ga21hbGxvYyhYRU5fQ0hBTkdFU0VUX0lORk9fTEVOLCBHRlBfS0VSTkVMKTsKKwlpZiAoY3NldCkgeworCQlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9jaGFuZ2VzZXQsIGNzZXQpOworCQlpZiAoIXJldCkKKwkJCXJldCA9IHNwcmludGYoYnVmZmVyLCAiJXNcbiIsIGNzZXQpOworCQlrZnJlZShjc2V0KTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitIWVBFUlZJU09SX0FUVFJfUk8oY2hhbmdlc2V0KTsKKworc3RhdGljIHNzaXplX3QgdmlydHVhbF9zdGFydF9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCByZXQgPSAtRU5PTUVNOworCXN0cnVjdCB4ZW5fcGxhdGZvcm1fcGFyYW1ldGVycyAqcGFybXM7CisKKwlwYXJtcyA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB4ZW5fcGxhdGZvcm1fcGFyYW1ldGVycyksIEdGUF9LRVJORUwpOworCWlmIChwYXJtcykgeworCQlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9wbGF0Zm9ybV9wYXJhbWV0ZXJzLAorCQkJCQkgICAgIHBhcm1zKTsKKwkJaWYgKCFyZXQpCisJCQlyZXQgPSBzcHJpbnRmKGJ1ZmZlciwgIiVseFxuIiwgcGFybXMtPnZpcnRfc3RhcnQpOworCQlrZnJlZShwYXJtcyk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworSFlQRVJWSVNPUl9BVFRSX1JPKHZpcnR1YWxfc3RhcnQpOworCitzdGF0aWMgc3NpemVfdCBwYWdlc2l6ZV9zaG93KHN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqYXR0ciwgY2hhciAqYnVmZmVyKQoreworCWludCByZXQ7CisKKwlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9wYWdlc2l6ZSwgTlVMTCk7CisJaWYgKHJldCA+IDApCisJCXJldCA9IHNwcmludGYoYnVmZmVyLCAiJXhcbiIsIHJldCk7CisKKwlyZXR1cm4gcmV0OworfQorCitIWVBFUlZJU09SX0FUVFJfUk8ocGFnZXNpemUpOworCitzdGF0aWMgc3NpemVfdCB4ZW5fZmVhdHVyZV9zaG93KGludCBpbmRleCwgY2hhciAqYnVmZmVyKQoreworCXNzaXplX3QgcmV0OworCXN0cnVjdCB4ZW5fZmVhdHVyZV9pbmZvIGluZm87CisKKwlpbmZvLnN1Ym1hcF9pZHggPSBpbmRleDsKKwlyZXQgPSBIWVBFUlZJU09SX3hlbl92ZXJzaW9uKFhFTlZFUl9nZXRfZmVhdHVyZXMsICZpbmZvKTsKKwlpZiAoIXJldCkKKwkJcmV0ID0gc3ByaW50ZihidWZmZXIsICIlMDh4IiwgaW5mby5zdWJtYXApOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHNzaXplX3QgZmVhdHVyZXNfc2hvdyhzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmF0dHIsIGNoYXIgKmJ1ZmZlcikKK3sKKwlzc2l6ZV90IGxlbjsKKwlpbnQgaTsKKworCWxlbiA9IDA7CisJZm9yIChpID0gWEVORkVBVF9OUl9TVUJNQVBTLTE7IGkgPj0gMDsgaS0tKSB7CisJCWludCByZXQgPSB4ZW5fZmVhdHVyZV9zaG93KGksIGJ1ZmZlciArIGxlbik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAobGVuID09IDApCisJCQkJbGVuID0gcmV0OworCQkJYnJlYWs7CisJCX0KKwkJbGVuICs9IHJldDsKKwl9CisJaWYgKGxlbiA+IDApCisJCWJ1ZmZlcltsZW4rK10gPSAnXG4nOworCisJcmV0dXJuIGxlbjsKK30KKworSFlQRVJWSVNPUl9BVFRSX1JPKGZlYXR1cmVzKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnhlbl9wcm9wZXJ0aWVzX2F0dHJzW10gPSB7CisJJmNhcGFiaWxpdGllc19hdHRyLmF0dHIsCisJJmNoYW5nZXNldF9hdHRyLmF0dHIsCisJJnZpcnR1YWxfc3RhcnRfYXR0ci5hdHRyLAorCSZwYWdlc2l6ZV9hdHRyLmF0dHIsCisJJmZlYXR1cmVzX2F0dHIuYXR0ciwKKwlOVUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCB4ZW5fcHJvcGVydGllc19ncm91cCA9IHsKKwkubmFtZSA9ICJwcm9wZXJ0aWVzIiwKKwkuYXR0cnMgPSB4ZW5fcHJvcGVydGllc19hdHRycywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHhlbl9wcm9wZXJ0aWVzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gc3lzZnNfY3JlYXRlX2dyb3VwKGh5cGVydmlzb3Jfa29iaiwgJnhlbl9wcm9wZXJ0aWVzX2dyb3VwKTsKK30KKworc3RhdGljIHZvaWQgeGVuX3Byb3BlcnRpZXNfZGVzdHJveSh2b2lkKQoreworCXN5c2ZzX3JlbW92ZV9ncm91cChoeXBlcnZpc29yX2tvYmosICZ4ZW5fcHJvcGVydGllc19ncm91cCk7Cit9CisKK3N0YXRpYyBpbnQgX19pbml0IGh5cGVyX3N5c2ZzX2luaXQodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaWYgKCF4ZW5fZG9tYWluKCkpCisJCXJldHVybiAtRU5PREVWOworCisJcmV0ID0geGVuX3N5c2ZzX3R5cGVfaW5pdCgpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCXJldCA9IHhlbl9zeXNmc192ZXJzaW9uX2luaXQoKTsKKwlpZiAocmV0KQorCQlnb3RvIHZlcnNpb25fb3V0OworCXJldCA9IHhlbl9jb21waWxhdGlvbl9pbml0KCk7CisJaWYgKHJldCkKKwkJZ290byBjb21wX291dDsKKwlyZXQgPSB4ZW5fc3lzZnNfdXVpZF9pbml0KCk7CisJaWYgKHJldCkKKwkJZ290byB1dWlkX291dDsKKwlyZXQgPSB4ZW5fcHJvcGVydGllc19pbml0KCk7CisJaWYgKHJldCkKKwkJZ290byBwcm9wX291dDsKKworCWdvdG8gb3V0OworCitwcm9wX291dDoKKwl4ZW5fc3lzZnNfdXVpZF9kZXN0cm95KCk7Cit1dWlkX291dDoKKwl4ZW5fY29tcGlsYXRpb25fZGVzdHJveSgpOworY29tcF9vdXQ6CisJeGVuX3N5c2ZzX3ZlcnNpb25fZGVzdHJveSgpOwordmVyc2lvbl9vdXQ6CisJeGVuX3N5c2ZzX3R5cGVfZGVzdHJveSgpOworb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIF9fZXhpdCBoeXBlcl9zeXNmc19leGl0KHZvaWQpCit7CisJeGVuX3Byb3BlcnRpZXNfZGVzdHJveSgpOworCXhlbl9jb21waWxhdGlvbl9kZXN0cm95KCk7CisJeGVuX3N5c2ZzX3V1aWRfZGVzdHJveSgpOworCXhlbl9zeXNmc192ZXJzaW9uX2Rlc3Ryb3koKTsKKwl4ZW5fc3lzZnNfdHlwZV9kZXN0cm95KCk7CisKK30KK21vZHVsZV9pbml0KGh5cGVyX3N5c2ZzX2luaXQpOworbW9kdWxlX2V4aXQoaHlwZXJfc3lzZnNfZXhpdCk7CisKK3N0YXRpYyBzc2l6ZV90IGh5cF9zeXNmc19zaG93KHN0cnVjdCBrb2JqZWN0ICprb2JqLAorCQkJICAgICAgc3RydWN0IGF0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgIGNoYXIgKmJ1ZmZlcikKK3sKKwlzdHJ1Y3QgaHlwX3N5c2ZzX2F0dHIgKmh5cF9hdHRyOworCWh5cF9hdHRyID0gY29udGFpbmVyX29mKGF0dHIsIHN0cnVjdCBoeXBfc3lzZnNfYXR0ciwgYXR0cik7CisJaWYgKGh5cF9hdHRyLT5zaG93KQorCQlyZXR1cm4gaHlwX2F0dHItPnNob3coaHlwX2F0dHIsIGJ1ZmZlcik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzc2l6ZV90IGh5cF9zeXNmc19zdG9yZShzdHJ1Y3Qga29iamVjdCAqa29iaiwKKwkJCSAgICAgICBzdHJ1Y3QgYXR0cmlidXRlICphdHRyLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKmJ1ZmZlciwKKwkJCSAgICAgICBzaXplX3QgbGVuKQoreworCXN0cnVjdCBoeXBfc3lzZnNfYXR0ciAqaHlwX2F0dHI7CisJaHlwX2F0dHIgPSBjb250YWluZXJfb2YoYXR0ciwgc3RydWN0IGh5cF9zeXNmc19hdHRyLCBhdHRyKTsKKwlpZiAoaHlwX2F0dHItPnN0b3JlKQorCQlyZXR1cm4gaHlwX2F0dHItPnN0b3JlKGh5cF9hdHRyLCBidWZmZXIsIGxlbik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc3lzZnNfb3BzIGh5cF9zeXNmc19vcHMgPSB7CisJLnNob3cgPSBoeXBfc3lzZnNfc2hvdywKKwkuc3RvcmUgPSBoeXBfc3lzZnNfc3RvcmUsCit9OworCitzdGF0aWMgc3RydWN0IGtvYmpfdHlwZSBoeXBfc3lzZnNfa29ial90eXBlID0geworCS5zeXNmc19vcHMgPSAmaHlwX3N5c2ZzX29wcywKK307CisKK3N0YXRpYyBpbnQgX19pbml0IGh5cGVydmlzb3Jfc3Vic3lzX2luaXQodm9pZCkKK3sKKwlpZiAoIXhlbl9kb21haW4oKSkKKwkJcmV0dXJuIC1FTk9ERVY7CisKKwloeXBlcnZpc29yX2tvYmotPmt0eXBlID0gJmh5cF9zeXNmc19rb2JqX3R5cGU7CisJcmV0dXJuIDA7Cit9CitkZXZpY2VfaW5pdGNhbGwoaHlwZXJ2aXNvcl9zdWJzeXNfaW5pdCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3Byb2JlLmMKaW5kZXggNzczZDFjZi4uZDQyZTI1ZCAxMDA2NDQKLS0tIGEvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c19wcm9iZS5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfcHJvYmUuYwpAQCAtNzEsNiArNzEsOSBAQAogCiBzdGF0aWMgdm9pZCB4ZW5idXNfZGV2X3NodXRkb3duKHN0cnVjdCBkZXZpY2UgKl9kZXYpOwogCitzdGF0aWMgaW50IHhlbmJ1c19kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CitzdGF0aWMgaW50IHhlbmJ1c19kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldik7CisKIC8qIElmIHNvbWV0aGluZyBpbiBhcnJheSBvZiBpZHMgbWF0Y2hlcyB0aGlzIGRldmljZSwgcmV0dXJuIGl0LiAqLwogc3RhdGljIGNvbnN0IHN0cnVjdCB4ZW5idXNfZGV2aWNlX2lkICoKIG1hdGNoX2RldmljZShjb25zdCBzdHJ1Y3QgeGVuYnVzX2RldmljZV9pZCAqYXJyLCBzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KQpAQCAtMTg4LDYgKzE5MSw5IEBACiAJCS5yZW1vdmUgICAgPSB4ZW5idXNfZGV2X3JlbW92ZSwKIAkJLnNodXRkb3duICA9IHhlbmJ1c19kZXZfc2h1dGRvd24sCiAJCS5kZXZfYXR0cnMgPSB4ZW5idXNfZGV2X2F0dHJzLAorCisJCS5zdXNwZW5kICAgPSB4ZW5idXNfZGV2X3N1c3BlbmQsCisJCS5yZXN1bWUgICAgPSB4ZW5idXNfZGV2X3Jlc3VtZSwKIAl9LAogfTsKIApAQCAtNjU0LDYgKzY2MCw3IEBACiAKIAlrZnJlZShyb290KTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHhlbmJ1c19kZXZfY2hhbmdlZCk7CiAKIHN0YXRpYyB2b2lkIGZyb250ZW5kX2NoYW5nZWQoc3RydWN0IHhlbmJ1c193YXRjaCAqd2F0Y2gsCiAJCQkgICAgIGNvbnN0IGNoYXIgKip2ZWMsIHVuc2lnbmVkIGludCBsZW4pCkBAIC02NjksNyArNjc2LDcgQEAKIAkuY2FsbGJhY2sgPSBmcm9udGVuZF9jaGFuZ2VkLAogfTsKIAotc3RhdGljIGludCBzdXNwZW5kX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHhlbmJ1c19kZXZfc3VzcGVuZChzdHJ1Y3QgZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSkKIHsKIAlpbnQgZXJyID0gMDsKIAlzdHJ1Y3QgeGVuYnVzX2RyaXZlciAqZHJ2OwpAQCAtNjgyLDM1ICs2ODksMTQgQEAKIAlkcnYgPSB0b194ZW5idXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKIAl4ZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHhlbmJ1c19kZXZpY2UsIGRldik7CiAJaWYgKGRydi0+c3VzcGVuZCkKLQkJZXJyID0gZHJ2LT5zdXNwZW5kKHhkZXYpOworCQllcnIgPSBkcnYtPnN1c3BlbmQoeGRldiwgc3RhdGUpOwogCWlmIChlcnIpCiAJCXByaW50ayhLRVJOX1dBUk5JTkcKIAkJICAgICAgICJ4ZW5idXM6IHN1c3BlbmQgJXMgZmFpbGVkOiAlaVxuIiwgZGV2X25hbWUoZGV2KSwgZXJyKTsKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIGludCBzdXNwZW5kX2NhbmNlbF9kZXYoc3RydWN0IGRldmljZSAqZGV2LCB2b2lkICpkYXRhKQotewotCWludCBlcnIgPSAwOwotCXN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnY7Ci0Jc3RydWN0IHhlbmJ1c19kZXZpY2UgKnhkZXY7Ci0KLQlEUFJJTlRLKCIiKTsKLQotCWlmIChkZXYtPmRyaXZlciA9PSBOVUxMKQotCQlyZXR1cm4gMDsKLQlkcnYgPSB0b194ZW5idXNfZHJpdmVyKGRldi0+ZHJpdmVyKTsKLQl4ZGV2ID0gY29udGFpbmVyX29mKGRldiwgc3RydWN0IHhlbmJ1c19kZXZpY2UsIGRldik7Ci0JaWYgKGRydi0+c3VzcGVuZF9jYW5jZWwpCi0JCWVyciA9IGRydi0+c3VzcGVuZF9jYW5jZWwoeGRldik7Ci0JaWYgKGVycikKLQkJcHJpbnRrKEtFUk5fV0FSTklORwotCQkgICAgICAgInhlbmJ1czogc3VzcGVuZF9jYW5jZWwgJXMgZmFpbGVkOiAlaVxuIiwKLQkJICAgICAgIGRldl9uYW1lKGRldiksIGVycik7Ci0JcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcmVzdW1lX2RldihzdHJ1Y3QgZGV2aWNlICpkZXYsIHZvaWQgKmRhdGEpCitzdGF0aWMgaW50IHhlbmJ1c19kZXZfcmVzdW1lKHN0cnVjdCBkZXZpY2UgKmRldikKIHsKIAlpbnQgZXJyOwogCXN0cnVjdCB4ZW5idXNfZHJpdmVyICpkcnY7CkBAIC03NTUsMzMgKzc0MSw2IEBACiAJcmV0dXJuIDA7CiB9CiAKLXZvaWQgeGVuYnVzX3N1c3BlbmQodm9pZCkKLXsKLQlEUFJJTlRLKCIiKTsKLQotCWJ1c19mb3JfZWFjaF9kZXYoJnhlbmJ1c19mcm9udGVuZC5idXMsIE5VTEwsIE5VTEwsIHN1c3BlbmRfZGV2KTsKLQl4ZW5idXNfYmFja2VuZF9zdXNwZW5kKHN1c3BlbmRfZGV2KTsKLQl4c19zdXNwZW5kKCk7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfc3VzcGVuZCk7Ci0KLXZvaWQgeGVuYnVzX3Jlc3VtZSh2b2lkKQotewotCXhiX2luaXRfY29tbXMoKTsKLQl4c19yZXN1bWUoKTsKLQlidXNfZm9yX2VhY2hfZGV2KCZ4ZW5idXNfZnJvbnRlbmQuYnVzLCBOVUxMLCBOVUxMLCByZXN1bWVfZGV2KTsKLQl4ZW5idXNfYmFja2VuZF9yZXN1bWUocmVzdW1lX2Rldik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfcmVzdW1lKTsKLQotdm9pZCB4ZW5idXNfc3VzcGVuZF9jYW5jZWwodm9pZCkKLXsKLQl4c19zdXNwZW5kX2NhbmNlbCgpOwotCWJ1c19mb3JfZWFjaF9kZXYoJnhlbmJ1c19mcm9udGVuZC5idXMsIE5VTEwsIE5VTEwsIHN1c3BlbmRfY2FuY2VsX2Rldik7Ci0JeGVuYnVzX2JhY2tlbmRfcmVzdW1lKHN1c3BlbmRfY2FuY2VsX2Rldik7Ci19Ci1FWFBPUlRfU1lNQk9MX0dQTCh4ZW5idXNfc3VzcGVuZF9jYW5jZWwpOwotCiAvKiBBIGZsYWcgdG8gZGV0ZXJtaW5lIGlmIHhlbnN0b3JlZCBpcyAncmVhZHknIChpLmUuIGhhcyBzdGFydGVkKSAqLwogaW50IHhlbnN0b3JlZF9yZWFkeSA9IDA7CiAKZGlmZiAtLWdpdCBhL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfeHMuYwppbmRleCBlMzI1ZWFiLi5lYWIzM2YxIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX3hzLmMKKysrIGIvZHJpdmVycy94ZW4veGVuYnVzL3hlbmJ1c194cy5jCkBAIC02NzMsNiArNjczLDggQEAKIAlzdHJ1Y3QgeGVuYnVzX3dhdGNoICp3YXRjaDsKIAljaGFyIHRva2VuW3NpemVvZih3YXRjaCkgKiAyICsgMV07CiAKKwl4Yl9pbml0X2NvbW1zKCk7CisKIAltdXRleF91bmxvY2soJnhzX3N0YXRlLnJlc3BvbnNlX211dGV4KTsKIAltdXRleF91bmxvY2soJnhzX3N0YXRlLnJlcXVlc3RfbXV0ZXgpOwogCXVwX3dyaXRlKCZ4c19zdGF0ZS50cmFuc2FjdGlvbl9tdXRleCk7CmRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jIGIvZHJpdmVycy94ZW4veGVuZnMvc3VwZXIuYwppbmRleCA1MTU3NDFhLi42NTU5ZTBjIDEwMDY0NAotLS0gYS9kcml2ZXJzL3hlbi94ZW5mcy9zdXBlci5jCisrKyBiL2RyaXZlcnMveGVuL3hlbmZzL3N1cGVyLmMKQEAgLTIwLDEwICsyMCwyNyBAQAogTU9EVUxFX0RFU0NSSVBUSU9OKCJYZW4gZmlsZXN5c3RlbSIpOwogTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwogCitzdGF0aWMgc3NpemVfdCBjYXBhYmlsaXRpZXNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1ZiwKKwkJCQkgc2l6ZV90IHNpemUsIGxvZmZfdCAqb2ZmKQoreworCWNoYXIgKnRtcCA9ICIiOworCisJaWYgKHhlbl9pbml0aWFsX2RvbWFpbigpKQorCQl0bXAgPSAiY29udHJvbF9kXG4iOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKGJ1Ziwgc2l6ZSwgb2ZmLCB0bXAsIHN0cmxlbih0bXApKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgY2FwYWJpbGl0aWVzX2ZpbGVfb3BzID0geworCS5yZWFkID0gY2FwYWJpbGl0aWVzX3JlYWQsCit9OworCiBzdGF0aWMgaW50IHhlbmZzX2ZpbGxfc3VwZXIoc3RydWN0IHN1cGVyX2Jsb2NrICpzYiwgdm9pZCAqZGF0YSwgaW50IHNpbGVudCkKIHsKIAlzdGF0aWMgc3RydWN0IHRyZWVfZGVzY3IgeGVuZnNfZmlsZXNbXSA9IHsKLQkJWzJdID0geyJ4ZW5idXMiLCAmeGVuYnVzX2ZpbGVfb3BzLCBTX0lSVVNSfFNfSVdVU1J9LAorCQlbMV0gPSB7fSwKKwkJeyAieGVuYnVzIiwgJnhlbmJ1c19maWxlX29wcywgU19JUlVTUnxTX0lXVVNSIH0sCisJCXsgImNhcGFiaWxpdGllcyIsICZjYXBhYmlsaXRpZXNfZmlsZV9vcHMsIFNfSVJVR08gfSwKIAkJeyIifSwKIAl9OwogCmRpZmYgLS1naXQgYS9mcy9iaW8uYyBiL2ZzL2Jpby5jCmluZGV4IDk4NzExNjQuLjc0MDY5OWMgMTAwNjQ0Ci0tLSBhL2ZzL2Jpby5jCisrKyBiL2ZzL2Jpby5jCkBAIC0yNiwxMCArMjYsOSBAQAogI2luY2x1ZGUgPGxpbnV4L21lbXBvb2wuaD4KICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9ibGt0cmFjZV9hcGkuaD4KLSNpbmNsdWRlIDx0cmFjZS9ibG9jay5oPgogI2luY2x1ZGUgPHNjc2kvc2cuaD4JCS8qIGZvciBzdHJ1Y3Qgc2dfaW92ZWMgKi8KIAotREVGSU5FX1RSQUNFKGJsb2NrX3NwbGl0KTsKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvYmxvY2suaD4KIAogLyoKICAqIFRlc3QgcGF0Y2ggdG8gaW5saW5lIGEgY2VydGFpbiBudW1iZXIgb2YgYmlfaW9fdmVjJ3MgaW5zaWRlIHRoZSBiaW8KZGlmZiAtLWdpdCBhL2ZzL2V4ZWMuYyBiL2ZzL2V4ZWMuYwppbmRleCA4OTU4MjNkLi5hZDRmMjhjIDEwMDY0NAotLS0gYS9mcy9leGVjLmMKKysrIGIvZnMvZXhlYy5jCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSA8bGludXgvc3RyaW5nLmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BhZ2VtYXAuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9rZXkuaD4KQEAgLTkyMiw2ICs5MjMsNyBAQAogCXRhc2tfbG9jayh0c2spOwogCXN0cmxjcHkodHNrLT5jb21tLCBidWYsIHNpemVvZih0c2stPmNvbW0pKTsKIAl0YXNrX3VubG9jayh0c2spOworCXBlcmZfY291bnRlcl9jb21tKHRzayk7CiB9CiAKIGludCBmbHVzaF9vbGRfZXhlYyhzdHJ1Y3QgbGludXhfYmlucHJtICogYnBybSkKQEAgLTk5MCw2ICs5OTIsMTMgQEAKIAogCWN1cnJlbnQtPnBlcnNvbmFsaXR5ICY9IH5icHJtLT5wZXJfY2xlYXI7CiAKKwkvKgorCSAqIEZsdXNoIHBlcmZvcm1hbmNlIGNvdW50ZXJzIHdoZW4gY3Jvc3NpbmcgYQorCSAqIHNlY3VyaXR5IGRvbWFpbjoKKwkgKi8KKwlpZiAoIWdldF9kdW1wYWJsZShjdXJyZW50LT5tbSkpCisJCXBlcmZfY291bnRlcl9leGl0X3Rhc2soY3VycmVudCk7CisKIAkvKiBBbiBleGVjIGNoYW5nZXMgb3VyIGRvbWFpbi4gV2UgYXJlIG5vIGxvbmdlciBwYXJ0IG9mIHRoZSB0aHJlYWQKIAkgICBncm91cCAqLwogCmRpZmYgLS1naXQgYS9mcy9wcm9jL2xvYWRhdmcuYyBiL2ZzL3Byb2MvbG9hZGF2Zy5jCmluZGV4IDliY2EzOWMuLjFhZmE0ZGQgMTAwNjQ0Ci0tLSBhL2ZzL3Byb2MvbG9hZGF2Zy5jCisrKyBiL2ZzL3Byb2MvbG9hZGF2Zy5jCkBAIC0xMiwyMCArMTIsMTQgQEAKIAogc3RhdGljIGludCBsb2FkYXZnX3Byb2Nfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpCiB7Ci0JaW50IGEsIGIsIGM7Ci0JdW5zaWduZWQgbG9uZyBzZXE7CisJdW5zaWduZWQgbG9uZyBhdm5ydW5bM107CiAKLQlkbyB7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOwotCQlhID0gYXZlbnJ1blswXSArIChGSVhFRF8xLzIwMCk7Ci0JCWIgPSBhdmVucnVuWzFdICsgKEZJWEVEXzEvMjAwKTsKLQkJYyA9IGF2ZW5ydW5bMl0gKyAoRklYRURfMS8yMDApOwotCX0gd2hpbGUgKHJlYWRfc2VxcmV0cnkoJnh0aW1lX2xvY2ssIHNlcSkpOworCWdldF9hdmVucnVuKGF2bnJ1biwgRklYRURfMS8yMDAsIDApOwogCi0Jc2VxX3ByaW50ZihtLCAiJWQuJTAyZCAlZC4lMDJkICVkLiUwMmQgJWxkLyVkICVkXG4iLAotCQlMT0FEX0lOVChhKSwgTE9BRF9GUkFDKGEpLAotCQlMT0FEX0lOVChiKSwgTE9BRF9GUkFDKGIpLAotCQlMT0FEX0lOVChjKSwgTE9BRF9GUkFDKGMpLAorCXNlcV9wcmludGYobSwgIiVsdS4lMDJsdSAlbHUuJTAybHUgJWx1LiUwMmx1ICVsZC8lZCAlZFxuIiwKKwkJTE9BRF9JTlQoYXZucnVuWzBdKSwgTE9BRF9GUkFDKGF2bnJ1blswXSksCisJCUxPQURfSU5UKGF2bnJ1blsxXSksIExPQURfRlJBQyhhdm5ydW5bMV0pLAorCQlMT0FEX0lOVChhdm5ydW5bMl0pLCBMT0FEX0ZSQUMoYXZucnVuWzJdKSwKIAkJbnJfcnVubmluZygpLCBucl90aHJlYWRzLAogCQl0YXNrX2FjdGl2ZV9waWRfbnMoY3VycmVudCktPmxhc3RfcGlkKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvS2J1aWxkIGIvaW5jbHVkZS9LYnVpbGQKaW5kZXggZDhjM2UzYy4uZmUzNmFjYyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9LYnVpbGQKKysrIGIvaW5jbHVkZS9LYnVpbGQKQEAgLTgsMyArOCw0IEBACiBoZWFkZXIteSArPSByZG1hLwogaGVhZGVyLXkgKz0gdmlkZW8vCiBoZWFkZXIteSArPSBkcm0vCitoZWFkZXIteSArPSB4ZW4vCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL2F0b21pYy5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9hdG9taWMuaAppbmRleCAzNjczYTEzLi44MWQzYmU0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2FzbS1nZW5lcmljL2F0b21pYy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvYXRvbWljLmgKQEAgLTEzNCw3ICsxMzQsNyBAQAogI2RlZmluZSBhdG9taWNfbG9uZ19jbXB4Y2hnKGwsIG9sZCwgbmV3KSBcCiAJKGF0b21pYzY0X2NtcHhjaGcoKGF0b21pYzY0X3QgKikobCksIChvbGQpLCAobmV3KSkpCiAjZGVmaW5lIGF0b21pY19sb25nX3hjaGcodiwgbmV3KSBcCi0JKGF0b21pYzY0X3hjaGcoKGF0b21pYzY0X3QgKikobCksIChuZXcpKSkKKwkoYXRvbWljNjRfeGNoZygoYXRvbWljNjRfdCAqKSh2KSwgKG5ldykpKQogCiAjZWxzZSAgLyogIEJJVFNfUEVSX0xPTkcgPT0gNjQgICovCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvYXNtLWdlbmVyaWMvcGd0YWJsZS5oIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKaW5kZXggOGU2ZDBjYS4uZTQxMGY2MCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKKysrIGIvaW5jbHVkZS9hc20tZ2VuZXJpYy9wZ3RhYmxlLmgKQEAgLTI4MCwxNyArMjgwLDE4IEBACiAjZW5kaWYKIAogLyoKLSAqIEEgZmFjaWxpdHkgdG8gcHJvdmlkZSBiYXRjaGluZyBvZiB0aGUgcmVsb2FkIG9mIHBhZ2UgdGFibGVzIHdpdGggdGhlCi0gKiBhY3R1YWwgY29udGV4dCBzd2l0Y2ggY29kZSBmb3IgcGFyYXZpcnR1YWxpemVkIGd1ZXN0cy4gIEJ5IGNvbnZlbnRpb24sCi0gKiBvbmx5IG9uZSBvZiB0aGUgbGF6eSBtb2RlcyAoQ1BVLCBNTVUpIHNob3VsZCBiZSBhY3RpdmUgYXQgYW55IGdpdmVuCi0gKiB0aW1lLCBlbnRyeSBzaG91bGQgbmV2ZXIgYmUgbmVzdGVkLCBhbmQgZW50cnkgYW5kIGV4aXRzIHNob3VsZCBhbHdheXMKLSAqIGJlIHBhaXJlZC4gIFRoaXMgaXMgZm9yIHNhbml0eSBvZiBtYWludGFpbmluZyBhbmQgcmVhc29uaW5nIGFib3V0IHRoZQotICoga2VybmVsIGNvZGUuCisgKiBBIGZhY2lsaXR5IHRvIHByb3ZpZGUgYmF0Y2hpbmcgb2YgdGhlIHJlbG9hZCBvZiBwYWdlIHRhYmxlcyBhbmQKKyAqIG90aGVyIHByb2Nlc3Mgc3RhdGUgd2l0aCB0aGUgYWN0dWFsIGNvbnRleHQgc3dpdGNoIGNvZGUgZm9yCisgKiBwYXJhdmlydHVhbGl6ZWQgZ3Vlc3RzLiAgQnkgY29udmVudGlvbiwgb25seSBvbmUgb2YgdGhlIGJhdGNoZWQKKyAqIHVwZGF0ZSAobGF6eSkgbW9kZXMgKENQVSwgTU1VKSBzaG91bGQgYmUgYWN0aXZlIGF0IGFueSBnaXZlbiB0aW1lLAorICogZW50cnkgc2hvdWxkIG5ldmVyIGJlIG5lc3RlZCwgYW5kIGVudHJ5IGFuZCBleGl0cyBzaG91bGQgYWx3YXlzIGJlCisgKiBwYWlyZWQuICBUaGlzIGlzIGZvciBzYW5pdHkgb2YgbWFpbnRhaW5pbmcgYW5kIHJlYXNvbmluZyBhYm91dCB0aGUKKyAqIGtlcm5lbCBjb2RlLiAgSW4gdGhpcyBjYXNlLCB0aGUgZXhpdCAoZW5kIG9mIHRoZSBjb250ZXh0IHN3aXRjaCkgaXMKKyAqIGluIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjb2RlLCBhbmQgc28gZG9lc24ndCBuZWVkIGEgZ2VuZXJpYworICogZGVmaW5pdGlvbi4KICAqLwotI2lmbmRlZiBfX0hBVkVfQVJDSF9FTlRFUl9MQVpZX0NQVV9NT0RFCi0jZGVmaW5lIGFyY2hfZW50ZXJfbGF6eV9jcHVfbW9kZSgpCWRvIHt9IHdoaWxlICgwKQotI2RlZmluZSBhcmNoX2xlYXZlX2xhenlfY3B1X21vZGUoKQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgYXJjaF9mbHVzaF9sYXp5X2NwdV9tb2RlKCkJZG8ge30gd2hpbGUgKDApCisjaWZuZGVmIF9fSEFWRV9BUkNIX1NUQVJUX0NPTlRFWFRfU1dJVENICisjZGVmaW5lIGFyY2hfc3RhcnRfY29udGV4dF9zd2l0Y2gocHJldikJZG8ge30gd2hpbGUgKDApCiAjZW5kaWYKIAogI2lmbmRlZiBfX0hBVkVfUEZOTUFQX1RSQUNLSU5HCmRpZmYgLS1naXQgYS9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmggYi9pbmNsdWRlL2FzbS1nZW5lcmljL3ZtbGludXgubGRzLmgKaW5kZXggODk4NTNiYy4uZjE3MzZjYSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9hc20tZ2VuZXJpYy92bWxpbnV4Lmxkcy5oCisrKyBiL2luY2x1ZGUvYXNtLWdlbmVyaWMvdm1saW51eC5sZHMuaApAQCAtNjMsNyArNjMsNyBAQAogI2RlZmluZSBCUkFOQ0hfUFJPRklMRSgpCiAjZW5kaWYKIAotI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDRVIKKyNpZmRlZiBDT05GSUdfRVZFTlRfVFJBQ0lORwogI2RlZmluZSBGVFJBQ0VfRVZFTlRTKCkJVk1MSU5VWF9TWU1CT0woX19zdGFydF9mdHJhY2VfZXZlbnRzKSA9IC47CVwKIAkJCSooX2Z0cmFjZV9ldmVudHMpCQkJCVwKIAkJCVZNTElOVVhfU1lNQk9MKF9fc3RvcF9mdHJhY2VfZXZlbnRzKSA9IC47CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2FjcGkuaCBiL2luY2x1ZGUvbGludXgvYWNwaS5oCmluZGV4IDg4YmU4OTAuLjUxYjRiMGEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvYWNwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYWNwaS5oCkBAIC0xMTksNyArMTE5LDcgQEAKIGV4dGVybiBpbnQgc2JmX3BvcnQ7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBhY3BpX3JlYWxtb2RlX2ZsYWdzOwogCi1pbnQgYWNwaV9yZWdpc3Rlcl9nc2kgKHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpOworaW50IGFjcGlfcmVnaXN0ZXJfZ3NpIChzdHJ1Y3QgZGV2aWNlICpkZXYsIHUzMiBnc2ksIGludCB0cmlnZ2VyaW5nLCBpbnQgcG9sYXJpdHkpOwogaW50IGFjcGlfZ3NpX3RvX2lycSAodTMyIGdzaSwgdW5zaWduZWQgaW50ICppcnEpOwogCiAjaWZkZWYgQ09ORklHX1g4Nl9JT19BUElDCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oIGIvaW5jbHVkZS9saW51eC9ibGt0cmFjZV9hcGkuaAppbmRleCBkOTYwODg5Li43ZTQzNTBlIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Jsa3RyYWNlX2FwaS5oCisrKyBiL2luY2x1ZGUvbGludXgvYmxrdHJhY2VfYXBpLmgKQEAgLTExNiw5ICsxMTYsOSBAQAogICogVGhlIHJlbWFwIGV2ZW50CiAgKi8KIHN0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgewotCV9fYmUzMiBkZXZpY2U7CiAJX19iZTMyIGRldmljZV9mcm9tOwotCV9fYmU2NCBzZWN0b3I7CisJX19iZTMyIGRldmljZV90bzsKKwlfX2JlNjQgc2VjdG9yX2Zyb207CiB9OwogCiBlbnVtIHsKQEAgLTE2NSw4ICsxNjUsOSBAQAogCiBleHRlcm4gaW50IGJsa190cmFjZV9pb2N0bChzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHVuc2lnbmVkLCBjaGFyIF9fdXNlciAqKTsKIGV4dGVybiB2b2lkIGJsa190cmFjZV9zaHV0ZG93bihzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqKTsKLWV4dGVybiBpbnQgZG9fYmxrX3RyYWNlX3NldHVwKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLAotCWNoYXIgKm5hbWUsIGRldl90IGRldiwgc3RydWN0IGJsa191c2VyX3RyYWNlX3NldHVwICpidXRzKTsKK2V4dGVybiBpbnQgZG9fYmxrX3RyYWNlX3NldHVwKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBjaGFyICpuYW1lLAorCQkJICAgICAgZGV2X3QgZGV2LCBzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LAorCQkJICAgICAgc3RydWN0IGJsa191c2VyX3RyYWNlX3NldHVwICpidXRzKTsKIGV4dGVybiB2b2lkIF9fdHJhY2Vfbm90ZV9tZXNzYWdlKHN0cnVjdCBibGtfdHJhY2UgKiwgY29uc3QgY2hhciAqZm10LCAuLi4pOwogCiAvKioKQEAgLTE5MywyMiArMTk0LDQyIEBACiBleHRlcm4gdm9pZCBibGtfYWRkX2RyaXZlcl9kYXRhKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEsCiAJCQkJdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CiBleHRlcm4gaW50IGJsa190cmFjZV9zZXR1cChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqbmFtZSwgZGV2X3QgZGV2LAorCQkJICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKIAkJCSAgIGNoYXIgX191c2VyICphcmcpOwogZXh0ZXJuIGludCBibGtfdHJhY2Vfc3RhcnRzdG9wKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBpbnQgc3RhcnQpOwogZXh0ZXJuIGludCBibGtfdHJhY2VfcmVtb3ZlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKTsKK2V4dGVybiBpbnQgYmxrX3RyYWNlX2luaXRfc3lzZnMoc3RydWN0IGRldmljZSAqZGV2KTsKIAogZXh0ZXJuIHN0cnVjdCBhdHRyaWJ1dGVfZ3JvdXAgYmxrX3RyYWNlX2F0dHJfZ3JvdXA7CiAKICNlbHNlIC8qICFDT05GSUdfQkxLX0RFVl9JT19UUkFDRSAqLwotI2RlZmluZSBibGtfdHJhY2VfaW9jdGwoYmRldiwgY21kLCBhcmcpCQkoLUVOT1RUWSkKLSNkZWZpbmUgYmxrX3RyYWNlX3NodXRkb3duKHEpCQkJZG8geyB9IHdoaWxlICgwKQotI2RlZmluZSBkb19ibGtfdHJhY2Vfc2V0dXAocSwgbmFtZSwgZGV2LCBidXRzKQkoLUVOT1RUWSkKLSNkZWZpbmUgYmxrX2FkZF9kcml2ZXJfZGF0YShxLCBycSwgZGF0YSwgbGVuKQlkbyB7fSB3aGlsZSAoMCkKLSNkZWZpbmUgYmxrX3RyYWNlX3NldHVwKHEsIG5hbWUsIGRldiwgYXJnKQkoLUVOT1RUWSkKLSNkZWZpbmUgYmxrX3RyYWNlX3N0YXJ0c3RvcChxLCBzdGFydCkJCSgtRU5PVFRZKQotI2RlZmluZSBibGtfdHJhY2VfcmVtb3ZlKHEpCQkJKC1FTk9UVFkpCi0jZGVmaW5lIGJsa19hZGRfdHJhY2VfbXNnKHEsIGZtdCwgLi4uKQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgYmxrX3RyYWNlX2lvY3RsKGJkZXYsIGNtZCwgYXJnKQkJKC1FTk9UVFkpCisjIGRlZmluZSBibGtfdHJhY2Vfc2h1dGRvd24ocSkJCQkJZG8geyB9IHdoaWxlICgwKQorIyBkZWZpbmUgZG9fYmxrX3RyYWNlX3NldHVwKHEsIG5hbWUsIGRldiwgYmRldiwgYnV0cykJKC1FTk9UVFkpCisjIGRlZmluZSBibGtfYWRkX2RyaXZlcl9kYXRhKHEsIHJxLCBkYXRhLCBsZW4pCQlkbyB7fSB3aGlsZSAoMCkKKyMgZGVmaW5lIGJsa190cmFjZV9zZXR1cChxLCBuYW1lLCBkZXYsIGJkZXYsIGFyZykJKC1FTk9UVFkpCisjIGRlZmluZSBibGtfdHJhY2Vfc3RhcnRzdG9wKHEsIHN0YXJ0KQkJCSgtRU5PVFRZKQorIyBkZWZpbmUgYmxrX3RyYWNlX3JlbW92ZShxKQkJCQkoLUVOT1RUWSkKKyMgZGVmaW5lIGJsa19hZGRfdHJhY2VfbXNnKHEsIGZtdCwgLi4uKQkJCWRvIHsgfSB3aGlsZSAoMCkKK3N0YXRpYyBpbmxpbmUgaW50IGJsa190cmFjZV9pbml0X3N5c2ZzKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlyZXR1cm4gMDsKK30KIAogI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lPX1RSQUNFICovCisKKyNpZiBkZWZpbmVkKENPTkZJR19FVkVOVF9UUkFDSU5HKSAmJiBkZWZpbmVkKENPTkZJR19CTE9DSykKKworc3RhdGljIGlubGluZSBpbnQgYmxrX2NtZF9idWZfbGVuKHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlyZXR1cm4gYmxrX3BjX3JlcXVlc3QocnEpID8gcnEtPmNtZF9sZW4gKiAzIDogMTsKK30KKworZXh0ZXJuIHZvaWQgYmxrX2R1bXBfY21kKGNoYXIgKmJ1Ziwgc3RydWN0IHJlcXVlc3QgKnJxKTsKK2V4dGVybiB2b2lkIGJsa19maWxsX3J3YnMoY2hhciAqcndicywgdTMyIHJ3LCBpbnQgYnl0ZXMpOworZXh0ZXJuIHZvaWQgYmxrX2ZpbGxfcndic19ycShjaGFyICpyd2JzLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpOworCisjZW5kaWYgLyogQ09ORklHX0VWRU5UX1RSQUNJTkcgJiYgQ09ORklHX0JMT0NLICovCisKICNlbmRpZiAvKiBfX0tFUk5FTF9fICovCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvY29tcGF0LmggYi9pbmNsdWRlL2xpbnV4L2NvbXBhdC5oCmluZGV4IGYyZGVkMjEuLmFmOTMxZWUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY29tcGF0LmgKKysrIGIvaW5jbHVkZS9saW51eC9jb21wYXQuaApAQCAtMjIyLDYgKzIyMiw4IEBACiBpbnQgY29weV9zaWdpbmZvX3RvX3VzZXIzMihzdHJ1Y3QgY29tcGF0X3NpZ2luZm8gX191c2VyICp0bywgc2lnaW5mb190ICpmcm9tKTsKIGludCBnZXRfY29tcGF0X3NpZ2V2ZW50KHN0cnVjdCBzaWdldmVudCAqZXZlbnQsCiAJCWNvbnN0IHN0cnVjdCBjb21wYXRfc2lnZXZlbnQgX191c2VyICp1X2V2ZW50KTsKK2xvbmcgY29tcGF0X3N5c19ydF90Z3NpZ3F1ZXVlaW5mbyhjb21wYXRfcGlkX3QgdGdpZCwgY29tcGF0X3BpZF90IHBpZCwgaW50IHNpZywKKwkJCQkgIHN0cnVjdCBjb21wYXRfc2lnaW5mbyBfX3VzZXIgKnVpbmZvKTsKIAogc3RhdGljIGlubGluZSBpbnQgY29tcGF0X3RpbWV2YWxfY29tcGFyZShzdHJ1Y3QgY29tcGF0X3RpbWV2YWwgKmxocywKIAkJCQkJc3RydWN0IGNvbXBhdF90aW1ldmFsICpyaHMpCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L2RtYS1kZWJ1Zy5oIGIvaW5jbHVkZS9saW51eC9kbWEtZGVidWcuaAppbmRleCAyOGQ1M2NiLi4xNzFhZDhhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYS1kZWJ1Zy5oCisrKyBiL2luY2x1ZGUvbGludXgvZG1hLWRlYnVnLmgKQEAgLTMyLDYgKzMyLDggQEAKIAogZXh0ZXJuIHZvaWQgZG1hX2RlYnVnX2luaXQodTMyIG51bV9lbnRyaWVzKTsKIAorZXh0ZXJuIGludCBkbWFfZGVidWdfcmVzaXplX2VudHJpZXModTMyIG51bV9lbnRyaWVzKTsKKwogZXh0ZXJuIHZvaWQgZGVidWdfZG1hX21hcF9wYWdlKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHBhZ2UgKnBhZ2UsCiAJCQkgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsCiAJCQkgICAgICAgaW50IGRpcmVjdGlvbiwgZG1hX2FkZHJfdCBkbWFfYWRkciwKQEAgLTkxLDYgKzkzLDExIEBACiB7CiB9CiAKK3N0YXRpYyBpbmxpbmUgaW50IGRtYV9kZWJ1Z19yZXNpemVfZW50cmllcyh1MzIgbnVtX2VudHJpZXMpCit7CisJcmV0dXJuIDA7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWJ1Z19kbWFfbWFwX3BhZ2Uoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3QgcGFnZSAqcGFnZSwKIAkJCQkgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKIAkJCQkgICAgICBpbnQgZGlyZWN0aW9uLCBkbWFfYWRkcl90IGRtYV9hZGRyLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9kbWFyLmggYi9pbmNsdWRlL2xpbnV4L2RtYXIuaAppbmRleCBlMzk3ZGMzLi4xMGZmNWM0IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2RtYXIuaAorKysgYi9pbmNsdWRlL2xpbnV4L2RtYXIuaApAQCAtMTA4LDYgKzEwOCw3IEBACiB9OwogI2lmZGVmIENPTkZJR19JTlRSX1JFTUFQCiBleHRlcm4gaW50IGludHJfcmVtYXBwaW5nX2VuYWJsZWQ7CitleHRlcm4gaW50IGludHJfcmVtYXBwaW5nX3N1cHBvcnRlZCh2b2lkKTsKIGV4dGVybiBpbnQgZW5hYmxlX2ludHJfcmVtYXBwaW5nKGludCk7CiBleHRlcm4gdm9pZCBkaXNhYmxlX2ludHJfcmVtYXBwaW5nKHZvaWQpOwogZXh0ZXJuIGludCByZWVuYWJsZV9pbnRyX3JlbWFwcGluZyhpbnQpOwpAQCAtMTU3LDYgKzE1OCw4IEBACiB9CiAjZGVmaW5lIGlycV9yZW1hcHBlZChpcnEpCQkoMCkKICNkZWZpbmUgZW5hYmxlX2ludHJfcmVtYXBwaW5nKG1vZGUpCSgtMSkKKyNkZWZpbmUgZGlzYWJsZV9pbnRyX3JlbWFwcGluZygpCSgwKQorI2RlZmluZSByZWVuYWJsZV9pbnRyX3JlbWFwcGluZyhtb2RlKQkoMCkKICNkZWZpbmUgaW50cl9yZW1hcHBpbmdfZW5hYmxlZAkJKDApCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9mdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvZnRyYWNlLmgKaW5kZXggOGEwYzJmMi4uMzliOTVjNSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9mdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZS5oCkBAIC0yMzMsOCArMjMzLDYgQEAKIAogZXh0ZXJuIGludCBza2lwX3RyYWNlKHVuc2lnbmVkIGxvbmcgaXApOwogCi1leHRlcm4gdm9pZCBmdHJhY2VfcmVsZWFzZSh2b2lkICpzdGFydCwgdW5zaWduZWQgbG9uZyBzaXplKTsKLQogZXh0ZXJuIHZvaWQgZnRyYWNlX2Rpc2FibGVfZGFlbW9uKHZvaWQpOwogZXh0ZXJuIHZvaWQgZnRyYWNlX2VuYWJsZV9kYWVtb24odm9pZCk7CiAjZWxzZQpAQCAtMzI1LDEzICszMjMsOCBAQAogCiAjaWZkZWYgQ09ORklHX0ZUUkFDRV9NQ09VTlRfUkVDT1JECiBleHRlcm4gdm9pZCBmdHJhY2VfaW5pdCh2b2lkKTsKLWV4dGVybiB2b2lkIGZ0cmFjZV9pbml0X21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsCi0JCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKmVuZCk7CiAjZWxzZQogc3RhdGljIGlubGluZSB2b2lkIGZ0cmFjZV9pbml0KHZvaWQpIHsgfQotc3RhdGljIGlubGluZSB2b2lkCi1mdHJhY2VfaW5pdF9tb2R1bGUoc3RydWN0IG1vZHVsZSAqbW9kLAotCQkgICB1bnNpZ25lZCBsb25nICpzdGFydCwgdW5zaWduZWQgbG9uZyAqZW5kKSB7IH0KICNlbmRpZgogCiAvKgpAQCAtMzY4LDYgKzM2MSw3IEBACiAJdW5zaWduZWQgbG9uZyByZXQ7CiAJdW5zaWduZWQgbG9uZyBmdW5jOwogCXVuc2lnbmVkIGxvbmcgbG9uZyBjYWxsdGltZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgc3VidGltZTsKIH07CiAKIC8qCkBAIC0zNzksOCArMzczLDYgQEAKIAogZXh0ZXJuIGludAogZnRyYWNlX3B1c2hfcmV0dXJuX3RyYWNlKHVuc2lnbmVkIGxvbmcgcmV0LCB1bnNpZ25lZCBsb25nIGZ1bmMsIGludCAqZGVwdGgpOwotZXh0ZXJuIHZvaWQKLWZ0cmFjZV9wb3BfcmV0dXJuX3RyYWNlKHN0cnVjdCBmdHJhY2VfZ3JhcGhfcmV0ICp0cmFjZSwgdW5zaWduZWQgbG9uZyAqcmV0KTsKIAogLyoKICAqIFNvbWV0aW1lcyB3ZSBkb24ndCB3YW50IHRvIHRyYWNlIGEgZnVuY3Rpb24gd2l0aCB0aGUgZnVuY3Rpb24KQEAgLTQ5Niw4ICs0ODgsMTUgQEAKIAogZXh0ZXJuIGludCBmdHJhY2VfZHVtcF9vbl9vb3BzOwogCisjaWZkZWYgQ09ORklHX1BSRUVNUFQKKyNkZWZpbmUgSU5JVF9UUkFDRV9SRUNVUlNJT04JCS50cmFjZV9yZWN1cnNpb24gPSAwLAorI2VuZGlmCisKICNlbmRpZiAvKiBDT05GSUdfVFJBQ0lORyAqLwogCisjaWZuZGVmIElOSVRfVFJBQ0VfUkVDVVJTSU9OCisjZGVmaW5lIElOSVRfVFJBQ0VfUkVDVVJTSU9OCisjZW5kaWYKIAogI2lmZGVmIENPTkZJR19IV19CUkFOQ0hfVFJBQ0VSCiAKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnRyYWNlX2V2ZW50LmggYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjMDkzZmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2Z0cmFjZV9ldmVudC5oCkBAIC0wLDAgKzEsMTcyIEBACisjaWZuZGVmIF9MSU5VWF9GVFJBQ0VfRVZFTlRfSAorI2RlZmluZSBfTElOVVhfRlRSQUNFX0VWRU5UX0gKKworI2luY2x1ZGUgPGxpbnV4L3RyYWNlX3NlcS5oPgorI2luY2x1ZGUgPGxpbnV4L3JpbmdfYnVmZmVyLmg+CisjaW5jbHVkZSA8bGludXgvcGVyY3B1Lmg+CisKK3N0cnVjdCB0cmFjZV9hcnJheTsKK3N0cnVjdCB0cmFjZXI7CitzdHJ1Y3QgZGVudHJ5OworCitERUNMQVJFX1BFUl9DUFUoc3RydWN0IHRyYWNlX3NlcSwgZnRyYWNlX2V2ZW50X3NlcSk7CisKK3N0cnVjdCB0cmFjZV9wcmludF9mbGFncyB7CisJdW5zaWduZWQgbG9uZwkJbWFzazsKKwljb25zdCBjaGFyCQkqbmFtZTsKK307CisKK2NvbnN0IGNoYXIgKmZ0cmFjZV9wcmludF9mbGFnc19zZXEoc3RydWN0IHRyYWNlX3NlcSAqcCwgY29uc3QgY2hhciAqZGVsaW0sCisJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncywKKwkJCQkgICBjb25zdCBzdHJ1Y3QgdHJhY2VfcHJpbnRfZmxhZ3MgKmZsYWdfYXJyYXkpOworCitjb25zdCBjaGFyICpmdHJhY2VfcHJpbnRfc3ltYm9sc19zZXEoc3RydWN0IHRyYWNlX3NlcSAqcCwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkJICAgICBjb25zdCBzdHJ1Y3QgdHJhY2VfcHJpbnRfZmxhZ3MgKnN5bWJvbF9hcnJheSk7CisKKy8qCisgKiBUaGUgdHJhY2UgZW50cnkgLSB0aGUgbW9zdCBiYXNpYyB1bml0IG9mIHRyYWNpbmcuIFRoaXMgaXMgd2hhdAorICogaXMgcHJpbnRlZCBpbiB0aGUgZW5kIGFzIGEgc2luZ2xlIGxpbmUgaW4gdGhlIHRyYWNlIG91dHB1dCwgc3VjaCBhczoKKyAqCisgKiAgICAgYmFzaC0xNTgxNiBbMDFdICAgMjM1LjE5NzU4NTogaWRsZV9jcHUgPC0gaXJxX2VudGVyCisgKi8KK3N0cnVjdCB0cmFjZV9lbnRyeSB7CisJdW5zaWduZWQgc2hvcnQJCXR5cGU7CisJdW5zaWduZWQgY2hhcgkJZmxhZ3M7CisJdW5zaWduZWQgY2hhcgkJcHJlZW1wdF9jb3VudDsKKwlpbnQJCQlwaWQ7CisJaW50CQkJdGdpZDsKK307CisKKyNkZWZpbmUgRlRSQUNFX01BWF9FVkVOVAkJCQkJCVwKKwkoKDEgPDwgKHNpemVvZigoKHN0cnVjdCB0cmFjZV9lbnRyeSAqKTApLT50eXBlKSAqIDgpKSAtIDEpCisKKy8qCisgKiBUcmFjZSBpdGVyYXRvciAtIHVzZWQgYnkgcHJpbnRvdXQgcm91dGluZXMgd2hvIHByZXNlbnQgdHJhY2UKKyAqIHJlc3VsdHMgdG8gdXNlcnMgYW5kIHdoaWNoIHJvdXRpbmVzIG1pZ2h0IHNsZWVwLCBldGM6CisgKi8KK3N0cnVjdCB0cmFjZV9pdGVyYXRvciB7CisJc3RydWN0IHRyYWNlX2FycmF5CSp0cjsKKwlzdHJ1Y3QgdHJhY2VyCQkqdHJhY2U7CisJdm9pZAkJCSpwcml2YXRlOworCWludAkJCWNwdV9maWxlOworCXN0cnVjdCBtdXRleAkJbXV0ZXg7CisJc3RydWN0IHJpbmdfYnVmZmVyX2l0ZXIJKmJ1ZmZlcl9pdGVyW05SX0NQVVNdOworCXVuc2lnbmVkIGxvbmcJCWl0ZXJfZmxhZ3M7CisKKwkvKiBUaGUgYmVsb3cgaXMgemVyb2VkIG91dCBpbiBwaXBlX3JlYWQgKi8KKwlzdHJ1Y3QgdHJhY2Vfc2VxCXNlcTsKKwlzdHJ1Y3QgdHJhY2VfZW50cnkJKmVudDsKKwlpbnQJCQljcHU7CisJdTY0CQkJdHM7CisKKwlsb2ZmX3QJCQlwb3M7CisJbG9uZwkJCWlkeDsKKworCWNwdW1hc2tfdmFyX3QJCXN0YXJ0ZWQ7Cit9OworCisKK3R5cGVkZWYgZW51bSBwcmludF9saW5lX3QgKCp0cmFjZV9wcmludF9mdW5jKShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsCisJCQkJCSAgICAgIGludCBmbGFncyk7CitzdHJ1Y3QgdHJhY2VfZXZlbnQgeworCXN0cnVjdCBobGlzdF9ub2RlCW5vZGU7CisJc3RydWN0IGxpc3RfaGVhZAlsaXN0OworCWludAkJCXR5cGU7CisJdHJhY2VfcHJpbnRfZnVuYwl0cmFjZTsKKwl0cmFjZV9wcmludF9mdW5jCXJhdzsKKwl0cmFjZV9wcmludF9mdW5jCWhleDsKKwl0cmFjZV9wcmludF9mdW5jCWJpbmFyeTsKK307CisKK2V4dGVybiBpbnQgcmVnaXN0ZXJfZnRyYWNlX2V2ZW50KHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpOworZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2Z0cmFjZV9ldmVudChzdHJ1Y3QgdHJhY2VfZXZlbnQgKmV2ZW50KTsKKworLyogUmV0dXJuIHZhbHVlcyBmb3IgcHJpbnRfbGluZSBjYWxsYmFjayAqLworZW51bSBwcmludF9saW5lX3QgeworCVRSQUNFX1RZUEVfUEFSVElBTF9MSU5FCT0gMCwJLyogUmV0cnkgYWZ0ZXIgZmx1c2hpbmcgdGhlIHNlcSAqLworCVRSQUNFX1RZUEVfSEFORExFRAk9IDEsCisJVFJBQ0VfVFlQRV9VTkhBTkRMRUQJPSAyLAkvKiBSZWxheSB0byBvdGhlciBvdXRwdXQgZnVuY3Rpb25zICovCisJVFJBQ0VfVFlQRV9OT19DT05TVU1FCT0gMwkvKiBIYW5kbGVkIGJ1dCBhc2sgdG8gbm90IGNvbnN1bWUgKi8KK307CisKKworc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKK3RyYWNlX2N1cnJlbnRfYnVmZmVyX2xvY2tfcmVzZXJ2ZShpbnQgdHlwZSwgdW5zaWduZWQgbG9uZyBsZW4sCisJCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwordm9pZCB0cmFjZV9jdXJyZW50X2J1ZmZlcl91bmxvY2tfY29tbWl0KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQsCisJCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYyk7Cit2b2lkIHRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50LAorCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwordm9pZCB0cmFjZV9jdXJyZW50X2J1ZmZlcl9kaXNjYXJkX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KTsKKwordm9pZCB0cmFjaW5nX3JlY29yZF9jbWRsaW5lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKKworc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CisJY2hhcgkJCSpuYW1lOworCWNoYXIJCQkqc3lzdGVtOworCXN0cnVjdCBkZW50cnkJCSpkaXI7CisJc3RydWN0IHRyYWNlX2V2ZW50CSpldmVudDsKKwlpbnQJCQllbmFibGVkOworCWludAkJCSgqcmVnZnVuYykodm9pZCk7CisJdm9pZAkJCSgqdW5yZWdmdW5jKSh2b2lkKTsKKwlpbnQJCQlpZDsKKwlpbnQJCQkoKnJhd19pbml0KSh2b2lkKTsKKwlpbnQJCQkoKnNob3dfZm9ybWF0KShzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKKwlpbnQJCQkoKmRlZmluZV9maWVsZHMpKHZvaWQpOworCXN0cnVjdCBsaXN0X2hlYWQJZmllbGRzOworCWludAkJCWZpbHRlcl9hY3RpdmU7CisJdm9pZAkJCSpmaWx0ZXI7CisJdm9pZAkJCSptb2Q7CisKKyNpZmRlZiBDT05GSUdfRVZFTlRfUFJPRklMRQorCWF0b21pY190CXByb2ZpbGVfY291bnQ7CisJaW50CQkoKnByb2ZpbGVfZW5hYmxlKShzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKik7CisJdm9pZAkJKCpwcm9maWxlX2Rpc2FibGUpKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqKTsKKyNlbmRpZgorfTsKKworI2RlZmluZSBNQVhfRklMVEVSX1BSRUQJCTMyCisjZGVmaW5lIE1BWF9GSUxURVJfU1RSX1ZBTAkxMjgKKworZXh0ZXJuIGludCBpbml0X3ByZWRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCk7CitleHRlcm4gdm9pZCBkZXN0cm95X3ByZWRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCk7CitleHRlcm4gaW50IGZpbHRlcl9tYXRjaF9wcmVkcyhzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIHZvaWQgKnJlYyk7CitleHRlcm4gaW50IGZpbHRlcl9jdXJyZW50X2NoZWNrX2Rpc2NhcmQoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLAorCQkJCQl2b2lkICpyZWMsCisJCQkJCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpOworCitleHRlcm4gaW50IHRyYWNlX2RlZmluZV9maWVsZChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsIGNoYXIgKnR5cGUsCisJCQkgICAgICBjaGFyICpuYW1lLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgaW50IGlzX3NpZ25lZCk7CisKKyNkZWZpbmUgaXNfc2lnbmVkX3R5cGUodHlwZSkJKCgodHlwZSkoLTEpKSA8IDApCisKK2ludCB0cmFjZV9zZXRfY2xyX2V2ZW50KGNvbnN0IGNoYXIgKnN5c3RlbSwgY29uc3QgY2hhciAqZXZlbnQsIGludCBzZXQpOworCisvKgorICogVGhlIGRvdWJsZSBfX2J1aWx0aW5fY29uc3RhbnRfcCBpcyBiZWNhdXNlIGdjYyB3aWxsIGdpdmUgdXMgYW4gZXJyb3IKKyAqIGlmIHdlIHRyeSB0byBhbGxvY2F0ZSB0aGUgc3RhdGljIHZhcmlhYmxlIHRvIGZtdCBpZiBpdCBpcyBub3QgYQorICogY29uc3RhbnQuIEV2ZW4gd2l0aCB0aGUgb3V0ZXIgaWYgc3RhdGVtZW50IG9wdGltaXppbmcgb3V0LgorICovCisjZGVmaW5lIGV2ZW50X3RyYWNlX3ByaW50ayhpcCwgZm10LCBhcmdzLi4uKQkJCQlcCitkbyB7CQkJCQkJCQkJXAorCV9fdHJhY2VfcHJpbnRrX2NoZWNrX2Zvcm1hdChmbXQsICMjYXJncyk7CQkJXAorCXRyYWNpbmdfcmVjb3JkX2NtZGxpbmUoY3VycmVudCk7CQkJCVwKKwlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoZm10KSkgewkJCQlcCisJCXN0YXRpYyBjb25zdCBjaGFyICp0cmFjZV9wcmludGtfZm10CQkJXAorCQkgIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fdHJhY2VfcHJpbnRrX2ZtdCIpKSkgPQlcCisJCQlfX2J1aWx0aW5fY29uc3RhbnRfcChmbXQpID8gZm10IDogTlVMTDsJCVwKKwkJCQkJCQkJCVwKKwkJX190cmFjZV9icHJpbnRrKGlwLCB0cmFjZV9wcmludGtfZm10LCAjI2FyZ3MpOwkJXAorCX0gZWxzZQkJCQkJCQkJXAorCQlfX3RyYWNlX3ByaW50ayhpcCwgZm10LCAjI2FyZ3MpOwkJCVwKK30gd2hpbGUgKDApCisKKyNkZWZpbmUgX19jb21tb25fZmllbGQodHlwZSwgaXRlbSwgaXNfc2lnbmVkKQkJCQlcCisJcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsICN0eXBlLCAiY29tbW9uXyIgI2l0ZW0sCVwKKwkJCQkgb2Zmc2V0b2YodHlwZW9mKGZpZWxkLmVudCksIGl0ZW0pLAlcCisJCQkJIHNpemVvZihmaWVsZC5lbnQuaXRlbSksIGlzX3NpZ25lZCk7CVwKKwlpZiAocmV0KQkJCQkJCQlcCisJCXJldHVybiByZXQ7CisKKyNlbmRpZiAvKiBfTElOVVhfRlRSQUNFX0VWRU5UX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvZnV0ZXguaCBiL2luY2x1ZGUvbGludXgvZnV0ZXguaAppbmRleCAzYmY1YmI1Li4zNDk1NmM4IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L2Z1dGV4LmgKKysrIGIvaW5jbHVkZS9saW51eC9mdXRleC5oCkBAIC0yMyw2ICsyMyw4IEBACiAjZGVmaW5lIEZVVEVYX1RSWUxPQ0tfUEkJOAogI2RlZmluZSBGVVRFWF9XQUlUX0JJVFNFVAk5CiAjZGVmaW5lIEZVVEVYX1dBS0VfQklUU0VUCTEwCisjZGVmaW5lIEZVVEVYX1dBSVRfUkVRVUVVRV9QSQkxMQorI2RlZmluZSBGVVRFWF9DTVBfUkVRVUVVRV9QSQkxMgogCiAjZGVmaW5lIEZVVEVYX1BSSVZBVEVfRkxBRwkxMjgKICNkZWZpbmUgRlVURVhfQ0xPQ0tfUkVBTFRJTUUJMjU2CkBAIC0zOCw2ICs0MCwxMCBAQAogI2RlZmluZSBGVVRFWF9UUllMT0NLX1BJX1BSSVZBVEUgKEZVVEVYX1RSWUxPQ0tfUEkgfCBGVVRFWF9QUklWQVRFX0ZMQUcpCiAjZGVmaW5lIEZVVEVYX1dBSVRfQklUU0VUX1BSSVZBVEUJKEZVVEVYX1dBSVRfQklUUyB8IEZVVEVYX1BSSVZBVEVfRkxBRykKICNkZWZpbmUgRlVURVhfV0FLRV9CSVRTRVRfUFJJVkFURQkoRlVURVhfV0FLRV9CSVRTIHwgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9XQUlUX1JFUVVFVUVfUElfUFJJVkFURQkoRlVURVhfV0FJVF9SRVFVRVVFX1BJIHwgXAorCQkJCQkgRlVURVhfUFJJVkFURV9GTEFHKQorI2RlZmluZSBGVVRFWF9DTVBfUkVRVUVVRV9QSV9QUklWQVRFCShGVVRFWF9DTVBfUkVRVUVVRV9QSSB8IFwKKwkJCQkJIEZVVEVYX1BSSVZBVEVfRkxBRykKIAogLyoKICAqIFN1cHBvcnQgZm9yIHJvYnVzdCBmdXRleGVzOiB0aGUga2VybmVsIGNsZWFucyB1cCBoZWxkIGZ1dGV4ZXMgYXQKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmggYi9pbmNsdWRlL2xpbnV4L2luaXRfdGFzay5oCmluZGV4IGQ4NzI0N2QuLmI2YjdjZjIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaW5pdF90YXNrLmgKKysrIGIvaW5jbHVkZS9saW51eC9pbml0X3Rhc2suaApAQCAtMTA4LDYgKzEwOCwxNSBAQAogCiBleHRlcm4gc3RydWN0IGNyZWQgaW5pdF9jcmVkOwogCisjaWZkZWYgQ09ORklHX1BFUkZfQ09VTlRFUlMKKyMgZGVmaW5lIElOSVRfUEVSRl9DT1VOVEVSUyh0c2spCQkJCQlcCisJLnBlcmZfY291bnRlcl9tdXRleCA9IAkJCQkJCVwKKwkJIF9fTVVURVhfSU5JVElBTElaRVIodHNrLnBlcmZfY291bnRlcl9tdXRleCksCQlcCisJLnBlcmZfY291bnRlcl9saXN0ID0gTElTVF9IRUFEX0lOSVQodHNrLnBlcmZfY291bnRlcl9saXN0KSwKKyNlbHNlCisjIGRlZmluZSBJTklUX1BFUkZfQ09VTlRFUlModHNrKQorI2VuZGlmCisKIC8qCiAgKiAgSU5JVF9UQVNLIGlzIHVzZWQgdG8gc2V0IHVwIHRoZSBmaXJzdCB0YXNrIHRhYmxlLCB0b3VjaCBhdAogICogeW91ciBvd24gcmlzayEuIEJhc2U9MCwgbGltaXQ9MHgxZmZmZmYgKD0yTUIpCkBAIC0xNzEsOSArMTgwLDExIEBACiAJfSwJCQkJCQkJCVwKIAkuZGlydGllcyA9IElOSVRfUFJPUF9MT0NBTF9TSU5HTEUoZGlydGllcyksCQkJXAogCUlOSVRfSURTCQkJCQkJCVwKKwlJTklUX1BFUkZfQ09VTlRFUlModHNrKQkJCQkJCVwKIAlJTklUX1RSQUNFX0lSUUZMQUdTCQkJCQkJXAogCUlOSVRfTE9DS0RFUAkJCQkJCQlcCiAJSU5JVF9GVFJBQ0VfR1JBUEgJCQkJCQlcCisJSU5JVF9UUkFDRV9SRUNVUlNJT04JCQkJCQlcCiB9CiAKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaCBiL2luY2x1ZGUvbGludXgvaW50ZXJydXB0LmgKaW5kZXggOTFiYjc2Zi4uZmYzNzRjZSAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2ludGVycnVwdC5oCkBAIC01NjYsNiArNTY2LDYgQEAKIGV4dGVybiBpbnQgZWFybHlfaXJxX2luaXQodm9pZCk7CiBleHRlcm4gaW50IGFyY2hfcHJvYmVfbnJfaXJxcyh2b2lkKTsKIGV4dGVybiBpbnQgYXJjaF9lYXJseV9pcnFfaW5pdCh2b2lkKTsKLWV4dGVybiBpbnQgYXJjaF9pbml0X2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUpOworZXh0ZXJuIGludCBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUpOwogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvaXJxLmggYi9pbmNsdWRlL2xpbnV4L2lycS5oCmluZGV4IGI3Y2JlZWQuLmVlZGJiOGUgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvaXJxLmgKKysrIGIvaW5jbHVkZS9saW51eC9pcnEuaApAQCAtMTE3LDcgKzExNyw3IEBACiAJdm9pZAkJKCplb2kpKHVuc2lnbmVkIGludCBpcnEpOwogCiAJdm9pZAkJKCplbmQpKHVuc2lnbmVkIGludCBpcnEpOwotCXZvaWQJCSgqc2V0X2FmZmluaXR5KSh1bnNpZ25lZCBpbnQgaXJxLAorCWludAkJKCpzZXRfYWZmaW5pdHkpKHVuc2lnbmVkIGludCBpcnEsCiAJCQkJCWNvbnN0IHN0cnVjdCBjcHVtYXNrICpkZXN0KTsKIAlpbnQJCSgqcmV0cmlnZ2VyKSh1bnNpZ25lZCBpbnQgaXJxKTsKIAlpbnQJCSgqc2V0X3R5cGUpKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGludCBmbG93X3R5cGUpOwpAQCAtMTg3LDcgKzE4Nyw3IEBACiAJc3BpbmxvY2tfdAkJbG9jazsKICNpZmRlZiBDT05GSUdfU01QCiAJY3B1bWFza192YXJfdAkJYWZmaW5pdHk7Ci0JdW5zaWduZWQgaW50CQljcHU7CisJdW5zaWduZWQgaW50CQlub2RlOwogI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCiAJY3B1bWFza192YXJfdAkJcGVuZGluZ19tYXNrOwogI2VuZGlmCkBAIC0yMDEsMjYgKzIwMSwyMyBAQAogfSBfX19fY2FjaGVsaW5lX2ludGVybm9kZWFsaWduZWRfaW5fc21wOwogCiBleHRlcm4gdm9pZCBhcmNoX2luaXRfY29weV9jaGlwX2RhdGEoc3RydWN0IGlycV9kZXNjICpvbGRfZGVzYywKLQkJCQkJc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1KTsKKwkJCQkJc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSk7CiBleHRlcm4gdm9pZCBhcmNoX2ZyZWVfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqb2xkX2Rlc2MsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CiAKICNpZm5kZWYgQ09ORklHX1NQQVJTRV9JUlEKIGV4dGVybiBzdHJ1Y3QgaXJxX2Rlc2MgaXJxX2Rlc2NbTlJfSVJRU107Ci0jZWxzZSAvKiBDT05GSUdfU1BBUlNFX0lSUSAqLwotZXh0ZXJuIHN0cnVjdCBpcnFfZGVzYyAqbW92ZV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLCBpbnQgY3B1KTsKLSNlbmRpZiAvKiBDT05GSUdfU1BBUlNFX0lSUSAqLwotCi1leHRlcm4gc3RydWN0IGlycV9kZXNjICppcnFfdG9fZGVzY19hbGxvY19jcHUodW5zaWduZWQgaW50IGlycSwgaW50IGNwdSk7Ci0KLXN0YXRpYyBpbmxpbmUgc3RydWN0IGlycV9kZXNjICoKLWlycV9yZW1hcF90b19kZXNjKHVuc2lnbmVkIGludCBpcnEsIHN0cnVjdCBpcnFfZGVzYyAqZGVzYykKLXsKLSNpZmRlZiBDT05GSUdfTlVNQV9NSUdSQVRFX0lSUV9ERVNDCi0JcmV0dXJuIGlycV90b19kZXNjKGlycSk7Ci0jZWxzZQotCXJldHVybiBkZXNjOwogI2VuZGlmCisKKyNpZmRlZiBDT05GSUdfTlVNQV9JUlFfREVTQworZXh0ZXJuIHN0cnVjdCBpcnFfZGVzYyAqbW92ZV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLCBpbnQgbm9kZSk7CisjZWxzZQorc3RhdGljIGlubGluZSBzdHJ1Y3QgaXJxX2Rlc2MgKm1vdmVfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSkKK3sKKwlyZXR1cm4gZGVzYzsKIH0KKyNlbmRpZgorCitleHRlcm4gc3RydWN0IGlycV9kZXNjICppcnFfdG9fZGVzY19hbGxvY19ub2RlKHVuc2lnbmVkIGludCBpcnEsIGludCBub2RlKTsKIAogLyoKICAqIE1pZ3JhdGlvbiBoZWxwZXJzIGZvciBvYnNvbGV0ZSBuYW1lcywgdGhleSB3aWxsIGdvIGF3YXk6CkBAIC0zODYsNyArMzgzLDcgQEAKIGV4dGVybiB2b2lkIHNldF9pcnFfcHJvYmUodW5zaWduZWQgaW50IGlycSk7CiAKIC8qIEhhbmRsZSBkeW5hbWljIGlycSBjcmVhdGlvbiBhbmQgZGVzdHJ1Y3Rpb24gKi8KLWV4dGVybiB1bnNpZ25lZCBpbnQgY3JlYXRlX2lycV9ucih1bnNpZ25lZCBpbnQgaXJxX3dhbnQpOworZXh0ZXJuIHVuc2lnbmVkIGludCBjcmVhdGVfaXJxX25yKHVuc2lnbmVkIGludCBpcnFfd2FudCwgaW50IG5vZGUpOwogZXh0ZXJuIGludCBjcmVhdGVfaXJxKHZvaWQpOwogZXh0ZXJuIHZvaWQgZGVzdHJveV9pcnEodW5zaWduZWQgaW50IGlycSk7CiAKQEAgLTQyNCw0NyArNDIxLDQ4IEBACiAKICNpZmRlZiBDT05GSUdfU01QCiAvKioKLSAqIGluaXRfYWxsb2NfZGVzY19tYXNrcyAtIGFsbG9jYXRlIGNwdW1hc2tzIGZvciBpcnFfZGVzYworICogYWxsb2NfZGVzY19tYXNrcyAtIGFsbG9jYXRlIGNwdW1hc2tzIGZvciBpcnFfZGVzYwogICogQGRlc2M6CXBvaW50ZXIgdG8gaXJxX2Rlc2Mgc3RydWN0CiAgKiBAY3B1OgljcHUgd2hpY2ggd2lsbCBiZSBoYW5kbGluZyB0aGUgY3B1bWFza3MKICAqIEBib290Ogl0cnVlIGlmIG5lZWQgYm9vdG1lbQogICoKICAqIEFsbG9jYXRlcyBhZmZpbml0eSBhbmQgcGVuZGluZ19tYXNrIGNwdW1hc2sgaWYgcmVxdWlyZWQuCiAgKiBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCAob3Igbm90IHJlcXVpcmVkKS4KLSAqIFNpZGUgZWZmZWN0OiBhZmZpbml0eSBoYXMgYWxsIGJpdHMgc2V0LCBwZW5kaW5nX21hc2sgaGFzIGFsbCBiaXRzIGNsZWFyLgogICovCi1zdGF0aWMgaW5saW5lIGJvb2wgaW5pdF9hbGxvY19kZXNjX21hc2tzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSwKK3N0YXRpYyBpbmxpbmUgYm9vbCBhbGxvY19kZXNjX21hc2tzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUsCiAJCQkJCQkJCWJvb2wgYm9vdCkKIHsKLQlpbnQgbm9kZTsKLQorI2lmZGVmIENPTkZJR19DUFVNQVNLX09GRlNUQUNLCiAJaWYgKGJvb3QpIHsKIAkJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmZGVzYy0+YWZmaW5pdHkpOwotCQljcHVtYXNrX3NldGFsbChkZXNjLT5hZmZpbml0eSk7CiAKICNpZmRlZiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUQogCQlhbGxvY19ib290bWVtX2NwdW1hc2tfdmFyKCZkZXNjLT5wZW5kaW5nX21hc2spOwotCQljcHVtYXNrX2NsZWFyKGRlc2MtPnBlbmRpbmdfbWFzayk7CiAjZW5kaWYKIAkJcmV0dXJuIHRydWU7CiAJfQogCi0Jbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7Ci0KIAlpZiAoIWFsbG9jX2NwdW1hc2tfdmFyX25vZGUoJmRlc2MtPmFmZmluaXR5LCBHRlBfQVRPTUlDLCBub2RlKSkKIAkJcmV0dXJuIGZhbHNlOwotCWNwdW1hc2tfc2V0YWxsKGRlc2MtPmFmZmluaXR5KTsKIAogI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCiAJaWYgKCFhbGxvY19jcHVtYXNrX3Zhcl9ub2RlKCZkZXNjLT5wZW5kaW5nX21hc2ssIEdGUF9BVE9NSUMsIG5vZGUpKSB7CiAJCWZyZWVfY3B1bWFza192YXIoZGVzYy0+YWZmaW5pdHkpOwogCQlyZXR1cm4gZmFsc2U7CiAJfQotCWNwdW1hc2tfY2xlYXIoZGVzYy0+cGVuZGluZ19tYXNrKTsKKyNlbmRpZgogI2VuZGlmCiAJcmV0dXJuIHRydWU7CiB9CiAKK3N0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2Rlc2NfbWFza3Moc3RydWN0IGlycV9kZXNjICpkZXNjKQoreworCWNwdW1hc2tfc2V0YWxsKGRlc2MtPmFmZmluaXR5KTsKKyNpZmRlZiBDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUQorCWNwdW1hc2tfY2xlYXIoZGVzYy0+cGVuZGluZ19tYXNrKTsKKyNlbmRpZgorfQorCiAvKioKICAqIGluaXRfY29weV9kZXNjX21hc2tzIC0gY29weSBjcHVtYXNrcyBmb3IgaXJxX2Rlc2MKICAqIEBvbGRfZGVzYzoJcG9pbnRlciB0byBvbGQgaXJxX2Rlc2Mgc3RydWN0CkBAIC00NzgsNyArNDc2LDcgQEAKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2NvcHlfZGVzY19tYXNrcyhzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAogCQkJCQlzdHJ1Y3QgaXJxX2Rlc2MgKm5ld19kZXNjKQogewotI2lmZGVmIENPTkZJR19DUFVNQVNLU19PRkZTVEFDSworI2lmZGVmIENPTkZJR19DUFVNQVNLX09GRlNUQUNLCiAJY3B1bWFza19jb3B5KG5ld19kZXNjLT5hZmZpbml0eSwgb2xkX2Rlc2MtPmFmZmluaXR5KTsKIAogI2lmZGVmIENPTkZJR19HRU5FUklDX1BFTkRJTkdfSVJRCkBAIC00OTksMTIgKzQ5NywxNiBAQAogCiAjZWxzZSAvKiAhQ09ORklHX1NNUCAqLwogCi1zdGF0aWMgaW5saW5lIGJvb2wgaW5pdF9hbGxvY19kZXNjX21hc2tzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSwKK3N0YXRpYyBpbmxpbmUgYm9vbCBhbGxvY19kZXNjX21hc2tzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUsCiAJCQkJCQkJCWJvb2wgYm9vdCkKIHsKIAlyZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGlubGluZSB2b2lkIGluaXRfZGVzY19tYXNrcyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MpCit7Cit9CisKIHN0YXRpYyBpbmxpbmUgdm9pZCBpbml0X2NvcHlfZGVzY19tYXNrcyhzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAogCQkJCQlzdHJ1Y3QgaXJxX2Rlc2MgKm5ld19kZXNjKQogewpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oIGIvaW5jbHVkZS9saW51eC9rZXJuZWxfc3RhdC5oCmluZGV4IDBjOGI4OWYuLmE3N2M2MDAgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgva2VybmVsX3N0YXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L2tlcm5lbF9zdGF0LmgKQEAgLTgxLDcgKzgxLDEyIEBACiAJcmV0dXJuIHN1bTsKIH0KIAorCisvKgorICogTG9jay91bmxvY2sgdGhlIGN1cnJlbnQgcnVucXVldWUgLSB0byBleHRyYWN0IHRhc2sgc3RhdGlzdGljczoKKyAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgbG9uZyB0YXNrX2RlbHRhX2V4ZWMoc3RydWN0IHRhc2tfc3RydWN0ICopOworCiBleHRlcm4gdm9pZCBhY2NvdW50X3VzZXJfdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgY3B1dGltZV90LCBjcHV0aW1lX3QpOwogZXh0ZXJuIHZvaWQgYWNjb3VudF9zeXN0ZW1fdGltZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiwgaW50LCBjcHV0aW1lX3QsIGNwdXRpbWVfdCk7CiBleHRlcm4gdm9pZCBhY2NvdW50X3N0ZWFsX3RpbWUoY3B1dGltZV90KTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgva21lbXRyYWNlLmggYi9pbmNsdWRlL2xpbnV4L2ttZW10cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MTZkMzkKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL2xpbnV4L2ttZW10cmFjZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDggRWR1YXJkIC0gR2FicmllbCBNdW50ZWFudQorICoKKyAqIFRoaXMgZmlsZSBpcyByZWxlYXNlZCB1bmRlciBHUEwgdmVyc2lvbiAyLgorICovCisKKyNpZm5kZWYgX0xJTlVYX0tNRU1UUkFDRV9ICisjZGVmaW5lIF9MSU5VWF9LTUVNVFJBQ0VfSAorCisjaWZkZWYgX19LRVJORUxfXworCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ttZW0uaD4KKworI2lmZGVmIENPTkZJR19LTUVNVFJBQ0UKK2V4dGVybiB2b2lkIGttZW10cmFjZV9pbml0KHZvaWQpOworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZCBrbWVtdHJhY2VfaW5pdCh2b2lkKQoreworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0tFUk5FTF9fICovCisKKyNlbmRpZiAvKiBfTElOVVhfS01FTVRSQUNFX0ggKi8KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbS5oIGIvaW5jbHVkZS9saW51eC9tbS5oCmluZGV4IGJmZjFmMGQuLjk3NzJkNmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbW0uaAorKysgYi9pbmNsdWRlL2xpbnV4L21tLmgKQEAgLTE5LDYgKzE5LDcgQEAKIHN0cnVjdCBmaWxlX3JhX3N0YXRlOwogc3RydWN0IHVzZXJfc3RydWN0Owogc3RydWN0IHdyaXRlYmFja19jb250cm9sOworc3RydWN0IHJsaW1pdDsKIAogI2lmbmRlZiBDT05GSUdfRElTQ09OVElHTUVNICAgICAgICAgIC8qIERvbid0IHVzZSBtYXBucnMsIGRvIGl0IHByb3Blcmx5ICovCiBleHRlcm4gdW5zaWduZWQgbG9uZyBtYXhfbWFwbnI7CkBAIC0xMDMxLDggKzEwMzIsNiBAQAogCQkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4pOwogZXh0ZXJuIHZvaWQgcmVtb3ZlX2FjdGl2ZV9yYW5nZSh1bnNpZ25lZCBpbnQgbmlkLCB1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwKIAkJCQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuKTsKLWV4dGVybiB2b2lkIHB1c2hfbm9kZV9ib3VuZGFyaWVzKHVuc2lnbmVkIGludCBuaWQsIHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAotCQkJCQl1bnNpZ25lZCBsb25nIGVuZF9wZm4pOwogZXh0ZXJuIHZvaWQgcmVtb3ZlX2FsbF9hY3RpdmVfcmFuZ2VzKHZvaWQpOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYWJzZW50X3BhZ2VzX2luX3JhbmdlKHVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLAogCQkJCQkJdW5zaWduZWQgbG9uZyBlbmRfcGZuKTsKQEAgLTEzMTksOCArMTMxOCw4IEBACiBpbnQgdm1lbW1hcF9wb3B1bGF0ZShzdHJ1Y3QgcGFnZSAqc3RhcnRfcGFnZSwgdW5zaWduZWQgbG9uZyBwYWdlcywgaW50IG5vZGUpOwogdm9pZCB2bWVtbWFwX3BvcHVsYXRlX3ByaW50X2xhc3Qodm9pZCk7CiAKLWV4dGVybiB2b2lkICphbGxvY19sb2NrZWRfYnVmZmVyKHNpemVfdCBzaXplKTsKLWV4dGVybiB2b2lkIGZyZWVfbG9ja2VkX2J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKLWV4dGVybiB2b2lkIHJlbGVhc2VfbG9ja2VkX2J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKTsKK2V4dGVybiBpbnQgYWNjb3VudF9sb2NrZWRfbWVtb3J5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcmxpbWl0ICpybGltLAorCQkJCSBzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCByZWZ1bmRfbG9ja2VkX21lbW9yeShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc2l6ZV90IHNpemUpOwogI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KICNlbmRpZiAvKiBfTElOVVhfTU1fSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbWlvdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvbW1pb3RyYWNlLmgKaW5kZXggM2QxYjdiZC4uOTc0OTFmNyAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbWlvdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L21taW90cmFjZS5oCkBAIC0zMCw2ICszMCw4IEBACiAKIGV4dGVybiBpbnQgcmVnaXN0ZXJfa21taW9fcHJvYmUoc3RydWN0IGttbWlvX3Byb2JlICpwKTsKIGV4dGVybiB2b2lkIHVucmVnaXN0ZXJfa21taW9fcHJvYmUoc3RydWN0IGttbWlvX3Byb2JlICpwKTsKK2V4dGVybiBpbnQga21taW9faW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGttbWlvX2NsZWFudXAodm9pZCk7CiAKICNpZmRlZiBDT05GSUdfTU1JT1RSQUNFCiAvKiBrbW1pbyBpcyBhY3RpdmUgYnkgc29tZSBrbW1pb19wcm9iZXM/ICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oIGIvaW5jbHVkZS9saW51eC9tb2R1bGUuaAppbmRleCA2MjdhYzA4Li5hOGYyYzBhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L21vZHVsZS5oCisrKyBiL2luY2x1ZGUvbGludXgvbW9kdWxlLmgKQEAgLTMzNyw2ICszMzcsMTQgQEAKIAljb25zdCBjaGFyICoqdHJhY2VfYnByaW50a19mbXRfc3RhcnQ7CiAJdW5zaWduZWQgaW50IG51bV90cmFjZV9icHJpbnRrX2ZtdDsKICNlbmRpZgorI2lmZGVmIENPTkZJR19FVkVOVF9UUkFDSU5HCisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICp0cmFjZV9ldmVudHM7CisJdW5zaWduZWQgaW50IG51bV90cmFjZV9ldmVudHM7CisjZW5kaWYKKyNpZmRlZiBDT05GSUdfRlRSQUNFX01DT1VOVF9SRUNPUkQKKwl1bnNpZ25lZCBsb25nICpmdHJhY2VfY2FsbHNpdGVzOworCXVuc2lnbmVkIGludCBudW1fZnRyYWNlX2NhbGxzaXRlczsKKyNlbmRpZgogCiAjaWZkZWYgQ09ORklHX01PRFVMRV9VTkxPQUQKIAkvKiBXaGF0IG1vZHVsZXMgZGVwZW5kIG9uIG1lPyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tdXRleC5oIGIvaW5jbHVkZS9saW51eC9tdXRleC5oCmluZGV4IDMwNjllYzcuLjg3OGNhYjQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvbXV0ZXguaAorKysgYi9pbmNsdWRlL2xpbnV4L211dGV4LmgKQEAgLTE1MCw1ICsxNTAsNiBAQAogICovCiBleHRlcm4gaW50IG11dGV4X3RyeWxvY2soc3RydWN0IG11dGV4ICpsb2NrKTsKIGV4dGVybiB2b2lkIG11dGV4X3VubG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spOworZXh0ZXJuIGludCBhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKGF0b21pY190ICpjbnQsIHN0cnVjdCBtdXRleCAqbG9jayk7CiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9vcHJvZmlsZS5oIGIvaW5jbHVkZS9saW51eC9vcHJvZmlsZS5oCmluZGV4IDFkOTUxOGIuLmQ2OGQyZWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvb3Byb2ZpbGUuaAorKysgYi9pbmNsdWRlL2xpbnV4L29wcm9maWxlLmgKQEAgLTE3MSw3ICsxNzEsNiBAQAogc3RydWN0IG9wX2VudHJ5IHsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBvcF9zYW1wbGUgKnNhbXBsZTsKLQl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKIAl1bnNpZ25lZCBsb25nIHNpemU7CiAJdW5zaWduZWQgbG9uZyAqZGF0YTsKIH07CkBAIC0xODAsNiArMTc5LDcgQEAKIAkJCSAgICBzdHJ1Y3QgcHRfcmVncyAqIGNvbnN0IHJlZ3MsCiAJCQkgICAgdW5zaWduZWQgbG9uZyBwYywgaW50IGNvZGUsIGludCBzaXplKTsKIGludCBvcHJvZmlsZV9hZGRfZGF0YShzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5LCB1bnNpZ25lZCBsb25nIHZhbCk7CitpbnQgb3Byb2ZpbGVfYWRkX2RhdGE2NChzdHJ1Y3Qgb3BfZW50cnkgKmVudHJ5LCB1NjQgdmFsKTsKIGludCBvcHJvZmlsZV93cml0ZV9jb21taXQoc3RydWN0IG9wX2VudHJ5ICplbnRyeSk7CiAKICNlbmRpZiAvKiBPUFJPRklMRV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3BlcmZfY291bnRlci5oIGIvaW5jbHVkZS9saW51eC9wZXJmX2NvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTEzMzk1Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC9wZXJmX2NvdW50ZXIuaApAQCAtMCwwICsxLDY5NyBAQAorLyoKKyAqICBQZXJmb3JtYW5jZSBjb3VudGVyczoKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgVGhvbWFzIEdsZWl4bmVyIDx0Z2x4QGxpbnV0cm9uaXguZGU+CisgKiAgICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSwgUmVkIEhhdCwgSW5jLiwgSW5nbyBNb2xuYXIKKyAqICAgIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBSZWQgSGF0LCBJbmMuLCBQZXRlciBaaWpsc3RyYQorICoKKyAqICBEYXRhIHR5cGUgZGVmaW5pdGlvbnMsIGRlY2xhcmF0aW9ucywgcHJvdG90eXBlcy4KKyAqCisgKiAgICBTdGFydGVkIGJ5OiBUaG9tYXMgR2xlaXhuZXIgYW5kIEluZ28gTW9sbmFyCisgKgorICogIEZvciBsaWNlbmNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisjaWZuZGVmIF9MSU5VWF9QRVJGX0NPVU5URVJfSAorI2RlZmluZSBfTElOVVhfUEVSRl9DT1VOVEVSX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvaW9jdGwuaD4KKyNpbmNsdWRlIDxhc20vYnl0ZW9yZGVyLmg+CisKKy8qCisgKiBVc2VyLXNwYWNlIEFCSSBiaXRzOgorICovCisKKy8qCisgKiBhdHRyLnR5cGUKKyAqLworZW51bSBwZXJmX3R5cGVfaWQgeworCVBFUkZfVFlQRV9IQVJEV0FSRQkJCT0gMCwKKwlQRVJGX1RZUEVfU09GVFdBUkUJCQk9IDEsCisJUEVSRl9UWVBFX1RSQUNFUE9JTlQJCQk9IDIsCisJUEVSRl9UWVBFX0hXX0NBQ0hFCQkJPSAzLAorCVBFUkZfVFlQRV9SQVcJCQkJPSA0LAorCisJUEVSRl9UWVBFX01BWCwJCQkJLyogbm9uLUFCSSAqLworfTsKKworLyoKKyAqIEdlbmVyYWxpemVkIHBlcmZvcm1hbmNlIGNvdW50ZXIgZXZlbnQgdHlwZXMsIHVzZWQgYnkgdGhlCisgKiBhdHRyLmV2ZW50X2lkIHBhcmFtZXRlciBvZiB0aGUgc3lzX3BlcmZfY291bnRlcl9vcGVuKCkKKyAqIHN5c2NhbGw6CisgKi8KK2VudW0gcGVyZl9od19pZCB7CisJLyoKKwkgKiBDb21tb24gaGFyZHdhcmUgZXZlbnRzLCBnZW5lcmFsaXplZCBieSB0aGUga2VybmVsOgorCSAqLworCVBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUwkJPSAwLAorCVBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9SRUZFUkVOQ0VTCQk9IDIsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVMJCT0gMywKKwlQRVJGX0NPVU5UX0hXX0JSQU5DSF9JTlNUUlVDVElPTlMJPSA0LAorCVBFUkZfQ09VTlRfSFdfQlJBTkNIX01JU1NFUwkJPSA1LAorCVBFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFUwkJPSA2LAorCisJUEVSRl9DT1VOVF9IV19NQVgsCQkJLyogbm9uLUFCSSAqLworfTsKKworLyoKKyAqIEdlbmVyYWxpemVkIGhhcmR3YXJlIGNhY2hlIGNvdW50ZXJzOgorICoKKyAqICAgICAgIHsgTDEtRCwgTDEtSSwgTExDLCBJVExCLCBEVExCLCBCUFUgfSB4CisgKiAgICAgICB7IHJlYWQsIHdyaXRlLCBwcmVmZXRjaCB9IHgKKyAqICAgICAgIHsgYWNjZXNzZXMsIG1pc3NlcyB9CisgKi8KK2VudW0gcGVyZl9od19jYWNoZV9pZCB7CisJUEVSRl9DT1VOVF9IV19DQUNIRV9MMUQJCQk9IDAsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9MMUkJCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9MTAkJCT0gMiwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0RUTEIJCT0gMywKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0lUTEIJCT0gNCwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX0JQVQkJCT0gNSwKKworCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYLAkJLyogbm9uLUFCSSAqLworfTsKKworZW51bSBwZXJmX2h3X2NhY2hlX29wX2lkIHsKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1JFQUQJCT0gMCwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX1dSSVRFCQk9IDEsCisJUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9QUkVGRVRDSAkJPSAyLAorCisJUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVgsCQkvKiBub24tQUJJICovCit9OworCitlbnVtIHBlcmZfaHdfY2FjaGVfb3BfcmVzdWx0X2lkIHsKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9BQ0NFU1MJPSAwLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01JU1MJCT0gMSwKKworCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCwJCS8qIG5vbi1BQkkgKi8KK307CisKKy8qCisgKiBTcGVjaWFsICJzb2Z0d2FyZSIgY291bnRlcnMgcHJvdmlkZWQgYnkgdGhlIGtlcm5lbCwgZXZlbiBpZiB0aGUgaGFyZHdhcmUKKyAqIGRvZXMgbm90IHN1cHBvcnQgcGVyZm9ybWFuY2UgY291bnRlcnMuIFRoZXNlIGNvdW50ZXJzIG1lYXN1cmUgdmFyaW91cworICogcGh5c2ljYWwgYW5kIHN3IGV2ZW50cyBvZiB0aGUga2VybmVsIChhbmQgYWxsb3cgdGhlIHByb2ZpbGluZyBvZiB0aGVtIGFzCisgKiB3ZWxsKToKKyAqLworZW51bSBwZXJmX3N3X2lkcyB7CisJUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0sJCQk9IDAsCisJUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLCQk9IDEsCisJUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUwkJPSAyLAorCVBFUkZfQ09VTlRfU1dfQ09OVEVYVF9TV0lUQ0hFUwkJPSAzLAorCVBFUkZfQ09VTlRfU1dfQ1BVX01JR1JBVElPTlMJCT0gNCwKKwlQRVJGX0NPVU5UX1NXX1BBR0VfRkFVTFRTX01JTgkJPSA1LAorCVBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKCQk9IDYsCisKKwlQRVJGX0NPVU5UX1NXX01BWCwJCQkvKiBub24tQUJJICovCit9OworCisvKgorICogQml0cyB0aGF0IGNhbiBiZSBzZXQgaW4gYXR0ci5zYW1wbGVfdHlwZSB0byByZXF1ZXN0IGluZm9ybWF0aW9uCisgKiBpbiB0aGUgb3ZlcmZsb3cgcGFja2V0cy4KKyAqLworZW51bSBwZXJmX2NvdW50ZXJfc2FtcGxlX2Zvcm1hdCB7CisJUEVSRl9TQU1QTEVfSVAJCQkJPSAxVSA8PCAwLAorCVBFUkZfU0FNUExFX1RJRAkJCQk9IDFVIDw8IDEsCisJUEVSRl9TQU1QTEVfVElNRQkJCT0gMVUgPDwgMiwKKwlQRVJGX1NBTVBMRV9BRERSCQkJPSAxVSA8PCAzLAorCVBFUkZfU0FNUExFX0dST1VQCQkJPSAxVSA8PCA0LAorCVBFUkZfU0FNUExFX0NBTExDSEFJTgkJCT0gMVUgPDwgNSwKKwlQRVJGX1NBTVBMRV9JRAkJCQk9IDFVIDw8IDYsCisJUEVSRl9TQU1QTEVfQ1BVCQkJCT0gMVUgPDwgNywKKwlQRVJGX1NBTVBMRV9QRVJJT0QJCQk9IDFVIDw8IDgsCit9OworCisvKgorICogQml0cyB0aGF0IGNhbiBiZSBzZXQgaW4gYXR0ci5yZWFkX2Zvcm1hdCB0byByZXF1ZXN0IHRoYXQKKyAqIHJlYWRzIG9uIHRoZSBjb3VudGVyIHNob3VsZCByZXR1cm4gdGhlIGluZGljYXRlZCBxdWFudGl0aWVzLAorICogaW4gaW5jcmVhc2luZyBvcmRlciBvZiBiaXQgdmFsdWUsIGFmdGVyIHRoZSBjb3VudGVyIHZhbHVlLgorICovCitlbnVtIHBlcmZfY291bnRlcl9yZWFkX2Zvcm1hdCB7CisJUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVECQk9IDFVIDw8IDAsCisJUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HCQk9IDFVIDw8IDEsCisJUEVSRl9GT1JNQVRfSUQJCQkJPSAxVSA8PCAyLAorfTsKKworLyoKKyAqIEhhcmR3YXJlIGV2ZW50IHRvIG1vbml0b3IgdmlhIGEgcGVyZm9ybWFuY2UgbW9uaXRvcmluZyBjb3VudGVyOgorICovCitzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgeworCS8qCisJICogTWFqb3IgdHlwZTogaGFyZHdhcmUvc29mdHdhcmUvdHJhY2Vwb2ludC9ldGMuCisJICovCisJX191MzIJCQl0eXBlOworCV9fdTMyCQkJX19yZXNlcnZlZF8xOworCisJLyoKKwkgKiBUeXBlIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24uCisJICovCisJX191NjQJCQljb25maWc7CisKKwl1bmlvbiB7CisJCV9fdTY0CQlzYW1wbGVfcGVyaW9kOworCQlfX3U2NAkJc2FtcGxlX2ZyZXE7CisJfTsKKworCV9fdTY0CQkJc2FtcGxlX3R5cGU7CisJX191NjQJCQlyZWFkX2Zvcm1hdDsKKworCV9fdTY0CQkJZGlzYWJsZWQgICAgICAgOiAgMSwgLyogb2ZmIGJ5IGRlZmF1bHQgICAgICAgICovCisJCQkJaW5oZXJpdAkgICAgICAgOiAgMSwgLyogY2hpbGRyZW4gaW5oZXJpdCBpdCAgICovCisJCQkJcGlubmVkCSAgICAgICA6ICAxLCAvKiBtdXN0IGFsd2F5cyBiZSBvbiBQTVUgKi8KKwkJCQlleGNsdXNpdmUgICAgICA6ICAxLCAvKiBvbmx5IGdyb3VwIG9uIFBNVSAgICAgKi8KKwkJCQlleGNsdWRlX3VzZXIgICA6ICAxLCAvKiBkb24ndCBjb3VudCB1c2VyICAgICAgKi8KKwkJCQlleGNsdWRlX2tlcm5lbCA6ICAxLCAvKiBkaXR0byBrZXJuZWwgICAgICAgICAgKi8KKwkJCQlleGNsdWRlX2h2ICAgICA6ICAxLCAvKiBkaXR0byBoeXBlcnZpc29yICAgICAgKi8KKwkJCQlleGNsdWRlX2lkbGUgICA6ICAxLCAvKiBkb24ndCBjb3VudCB3aGVuIGlkbGUgKi8KKwkJCQltbWFwICAgICAgICAgICA6ICAxLCAvKiBpbmNsdWRlIG1tYXAgZGF0YSAgICAgKi8KKwkJCQljb21tCSAgICAgICA6ICAxLCAvKiBpbmNsdWRlIGNvbW0gZGF0YSAgICAgKi8KKwkJCQlmcmVxICAgICAgICAgICA6ICAxLCAvKiB1c2UgZnJlcSwgbm90IHBlcmlvZCAgKi8KKworCQkJCV9fcmVzZXJ2ZWRfMiAgIDogNTM7CisKKwlfX3UzMgkJCXdha2V1cF9ldmVudHM7CS8qIHdha2V1cCBldmVyeSBuIGV2ZW50cyAqLworCV9fdTMyCQkJX19yZXNlcnZlZF8zOworCisJX191NjQJCQlfX3Jlc2VydmVkXzQ7Cit9OworCisvKgorICogSW9jdGxzIHRoYXQgY2FuIGJlIGRvbmUgb24gYSBwZXJmIGNvdW50ZXIgZmQ6CisgKi8KKyNkZWZpbmUgUEVSRl9DT1VOVEVSX0lPQ19FTkFCTEUJCV9JTyAoJyQnLCAwKQorI2RlZmluZSBQRVJGX0NPVU5URVJfSU9DX0RJU0FCTEUJX0lPICgnJCcsIDEpCisjZGVmaW5lIFBFUkZfQ09VTlRFUl9JT0NfUkVGUkVTSAlfSU8gKCckJywgMikKKyNkZWZpbmUgUEVSRl9DT1VOVEVSX0lPQ19SRVNFVAkJX0lPICgnJCcsIDMpCisjZGVmaW5lIFBFUkZfQ09VTlRFUl9JT0NfUEVSSU9ECQlfSU9XKCckJywgNCwgdTY0KQorCitlbnVtIHBlcmZfY291bnRlcl9pb2NfZmxhZ3MgeworCVBFUkZfSU9DX0ZMQUdfR1JPVVAJCT0gMVUgPDwgMCwKK307CisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgbWFwcGVkIHZpYSBtbWFwCisgKi8KK3N0cnVjdCBwZXJmX2NvdW50ZXJfbW1hcF9wYWdlIHsKKwlfX3UzMgl2ZXJzaW9uOwkJLyogdmVyc2lvbiBudW1iZXIgb2YgdGhpcyBzdHJ1Y3R1cmUgKi8KKwlfX3UzMgljb21wYXRfdmVyc2lvbjsJCS8qIGxvd2VzdCB2ZXJzaW9uIHRoaXMgaXMgY29tcGF0IHdpdGggKi8KKworCS8qCisJICogQml0cyBuZWVkZWQgdG8gcmVhZCB0aGUgaHcgY291bnRlcnMgaW4gdXNlci1zcGFjZS4KKwkgKgorCSAqICAgdTMyIHNlcTsKKwkgKiAgIHM2NCBjb3VudDsKKwkgKgorCSAqICAgZG8geworCSAqICAgICBzZXEgPSBwYy0+bG9jazsKKwkgKgorCSAqICAgICBiYXJyaWVyKCkKKwkgKiAgICAgaWYgKHBjLT5pbmRleCkgeworCSAqICAgICAgIGNvdW50ID0gcG1jX3JlYWQocGMtPmluZGV4IC0gMSk7CisJICogICAgICAgY291bnQgKz0gcGMtPm9mZnNldDsKKwkgKiAgICAgfSBlbHNlCisJICogICAgICAgZ290byByZWd1bGFyX3JlYWQ7CisJICoKKwkgKiAgICAgYmFycmllcigpOworCSAqICAgfSB3aGlsZSAocGMtPmxvY2sgIT0gc2VxKTsKKwkgKgorCSAqIE5PVEU6IGZvciBvYnZpb3VzIHJlYXNvbiB0aGlzIG9ubHkgd29ya3Mgb24gc2VsZi1tb25pdG9yaW5nCisJICogICAgICAgcHJvY2Vzc2VzLgorCSAqLworCV9fdTMyCWxvY2s7CQkJLyogc2VxbG9jayBmb3Igc3luY2hyb25pemF0aW9uICovCisJX191MzIJaW5kZXg7CQkJLyogaGFyZHdhcmUgY291bnRlciBpZGVudGlmaWVyICovCisJX19zNjQJb2Zmc2V0OwkJCS8qIGFkZCB0byBoYXJkd2FyZSBjb3VudGVyIHZhbHVlICovCisKKwkvKgorCSAqIENvbnRyb2wgZGF0YSBmb3IgdGhlIG1tYXAoKSBkYXRhIGJ1ZmZlci4KKwkgKgorCSAqIFVzZXItc3BhY2UgcmVhZGluZyB0aGlzIHZhbHVlIHNob3VsZCBpc3N1ZSBhbiBybWIoKSwgb24gU01QIGNhcGFibGUKKwkgKiBwbGF0Zm9ybXMsIGFmdGVyIHJlYWRpbmcgdGhpcyB2YWx1ZSAtLSBzZWUgcGVyZl9jb3VudGVyX3dha2V1cCgpLgorCSAqLworCV9fdTY0ICAgZGF0YV9oZWFkOwkJLyogaGVhZCBpbiB0aGUgZGF0YSBzZWN0aW9uICovCit9OworCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19DUFVNT0RFX01BU0sJCSgzIDw8IDApCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19DUFVNT0RFX1VOS05PV04JCSgwIDw8IDApCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19LRVJORUwJCQkoMSA8PCAwKQorI2RlZmluZSBQRVJGX0VWRU5UX01JU0NfVVNFUgkJCSgyIDw8IDApCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19IWVBFUlZJU09SCQkoMyA8PCAwKQorI2RlZmluZSBQRVJGX0VWRU5UX01JU0NfT1ZFUkZMT1cJCSgxIDw8IDIpCisKK3N0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciB7CisJX191MzIJdHlwZTsKKwlfX3UxNgltaXNjOworCV9fdTE2CXNpemU7Cit9OworCitlbnVtIHBlcmZfZXZlbnRfdHlwZSB7CisKKwkvKgorCSAqIFRoZSBNTUFQIGV2ZW50cyByZWNvcmQgdGhlIFBST1RfRVhFQyBtYXBwaW5ncyBzbyB0aGF0IHdlIGNhbgorCSAqIGNvcnJlbGF0ZSB1c2Vyc3BhY2UgSVBzIHRvIGNvZGUuIFRoZXkgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKwkgKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgorCSAqCXUzMgkJCQlwaWQsIHRpZDsKKwkgKgl1NjQJCQkJYWRkcjsKKwkgKgl1NjQJCQkJbGVuOworCSAqCXU2NAkJCQlwZ29mZjsKKwkgKgljaGFyCQkJCWZpbGVuYW1lW107CisJICogfTsKKwkgKi8KKwlQRVJGX0VWRU5UX01NQVAJCQk9IDEsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgorCSAqCXUzMgkJCQlwaWQsIHRpZDsKKwkgKgljaGFyCQkJCWNvbW1bXTsKKwkgKiB9OworCSAqLworCVBFUkZfRVZFTlRfQ09NTQkJCT0gMywKKworCS8qCisJICogc3RydWN0IHsKKwkgKglzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCSAqCXU2NAkJCQl0aW1lOworCSAqCXU2NAkJCQlpZDsKKwkgKgl1NjQJCQkJc2FtcGxlX3BlcmlvZDsKKwkgKiB9OworCSAqLworCVBFUkZfRVZFTlRfUEVSSU9ECQk9IDQsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgl1NjQJCQkJdGltZTsKKwkgKgl1NjQJCQkJaWQ7CisJICogfTsKKwkgKi8KKwlQRVJGX0VWRU5UX1RIUk9UVExFCQk9IDUsCisJUEVSRl9FVkVOVF9VTlRIUk9UVExFCQk9IDYsCisKKwkvKgorCSAqIHN0cnVjdCB7CisJICoJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwkgKgl1MzIJCQkJcGlkLCBwcGlkOworCSAqIH07CisJICovCisJUEVSRl9FVkVOVF9GT1JLCQkJPSA3LAorCisJLyoKKwkgKiBXaGVuIGhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XIHRoZSBldmVudF90eXBlIGZpZWxkCisJICogd2lsbCBiZSBQRVJGX1JFQ09SRF8qCisJICoKKwkgKiBzdHJ1Y3QgeworCSAqCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJICoKKwkgKgl7IHU2NAkJCWlwOwkgIH0gJiYgUEVSRl9SRUNPUkRfSVAKKwkgKgl7IHUzMgkJCXBpZCwgdGlkOyB9ICYmIFBFUkZfUkVDT1JEX1RJRAorCSAqCXsgdTY0CQkJdGltZTsgICAgIH0gJiYgUEVSRl9SRUNPUkRfVElNRQorCSAqCXsgdTY0CQkJYWRkcjsgICAgIH0gJiYgUEVSRl9SRUNPUkRfQUREUgorCSAqCXsgdTY0CQkJY29uZmlnOyAgIH0gJiYgUEVSRl9SRUNPUkRfQ09ORklHCisJICoJeyB1MzIJCQljcHUsIHJlczsgfSAmJiBQRVJGX1JFQ09SRF9DUFUKKwkgKgorCSAqCXsgdTY0CQkJbnI7CisJICoJICB7IHU2NCBpZCwgdmFsOyB9CWNudFtucl07ICB9ICYmIFBFUkZfUkVDT1JEX0dST1VQCisJICoKKwkgKgl7IHUxNgkJCW5yLAorCSAqCQkJCWh2LAorCSAqCQkJCWtlcm5lbCwKKwkgKgkJCQl1c2VyOworCSAqCSAgdTY0CQkJaXBzW25yXTsgIH0gJiYgUEVSRl9SRUNPUkRfQ0FMTENIQUlOCisJICogfTsKKwkgKi8KK307CisKKyNpZmRlZiBfX0tFUk5FTF9fCisvKgorICogS2VybmVsLWludGVybmFsIGRhdGEgdHlwZXMgYW5kIGRlZmluaXRpb25zOgorICovCisKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworIyBpbmNsdWRlIDxhc20vcGVyZl9jb3VudGVyLmg+CisjZW5kaWYKKworI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgorI2luY2x1ZGUgPGxpbnV4L3JjdWxpc3QuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VwZGF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CisjaW5jbHVkZSA8bGludXgvaHJ0aW1lci5oPgorI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisjaW5jbHVkZSA8bGludXgvcGlkX25hbWVzcGFjZS5oPgorI2luY2x1ZGUgPGFzbS9hdG9taWMuaD4KKworc3RydWN0IHRhc2tfc3RydWN0OworCisvKioKKyAqIHN0cnVjdCBod19wZXJmX2NvdW50ZXIgLSBwZXJmb3JtYW5jZSBjb3VudGVyIGhhcmR3YXJlIGRldGFpbHM6CisgKi8KK3N0cnVjdCBod19wZXJmX2NvdW50ZXIgeworI2lmZGVmIENPTkZJR19QRVJGX0NPVU5URVJTCisJdW5pb24geworCQlzdHJ1Y3QgeyAvKiBoYXJkd2FyZSAqLworCQkJdTY0CQljb25maWc7CisJCQl1bnNpZ25lZCBsb25nCWNvbmZpZ19iYXNlOworCQkJdW5zaWduZWQgbG9uZwljb3VudGVyX2Jhc2U7CisJCQlpbnQJCWlkeDsKKwkJfTsKKwkJdW5pb24geyAvKiBzb2Z0d2FyZSAqLworCQkJYXRvbWljNjRfdAljb3VudDsKKwkJCXN0cnVjdCBocnRpbWVyCWhydGltZXI7CisJCX07CisJfTsKKwlhdG9taWM2NF90CQkJcHJldl9jb3VudDsKKwl1NjQJCQkJc2FtcGxlX3BlcmlvZDsKKwl1NjQJCQkJbGFzdF9wZXJpb2Q7CisJYXRvbWljNjRfdAkJCXBlcmlvZF9sZWZ0OworCXU2NAkJCQlpbnRlcnJ1cHRzOworCisJdTY0CQkJCWZyZXFfY291bnQ7CisJdTY0CQkJCWZyZXFfaW50ZXJydXB0czsKKwl1NjQJCQkJZnJlcV9zdGFtcDsKKyNlbmRpZgorfTsKKworc3RydWN0IHBlcmZfY291bnRlcjsKKworLyoqCisgKiBzdHJ1Y3QgcG11IC0gZ2VuZXJpYyBwZXJmb3JtYW5jZSBtb25pdG9yaW5nIHVuaXQKKyAqLworc3RydWN0IHBtdSB7CisJaW50ICgqZW5hYmxlKQkJCShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKTsKKwl2b2lkICgqZGlzYWJsZSkJCQkoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcik7CisJdm9pZCAoKnJlYWQpCQkJKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpOworCXZvaWQgKCp1bnRocm90dGxlKQkJKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpOworfTsKKworLyoqCisgKiBlbnVtIHBlcmZfY291bnRlcl9hY3RpdmVfc3RhdGUgLSB0aGUgc3RhdGVzIG9mIGEgY291bnRlcgorICovCitlbnVtIHBlcmZfY291bnRlcl9hY3RpdmVfc3RhdGUgeworCVBFUkZfQ09VTlRFUl9TVEFURV9FUlJPUgk9IC0yLAorCVBFUkZfQ09VTlRFUl9TVEFURV9PRkYJCT0gLTEsCisJUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFCT0gIDAsCisJUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRQk9ICAxLAorfTsKKworc3RydWN0IGZpbGU7CisKK3N0cnVjdCBwZXJmX21tYXBfZGF0YSB7CisJc3RydWN0IHJjdV9oZWFkCQkJcmN1X2hlYWQ7CisJaW50CQkJCW5yX3BhZ2VzOwkvKiBuciBvZiBkYXRhIHBhZ2VzICAqLworCWludAkJCQlucl9sb2NrZWQ7CS8qIG5yIHBhZ2VzIG1sb2NrZWQgICovCisKKwlhdG9taWNfdAkJCXBvbGw7CQkvKiBQT0xMXyBmb3Igd2FrZXVwcyAqLworCWF0b21pY190CQkJZXZlbnRzOwkJLyogZXZlbnQgbGltaXQgICAgICAgKi8KKworCWF0b21pY19sb25nX3QJCQloZWFkOwkJLyogd3JpdGUgcG9zaXRpb24gICAgKi8KKwlhdG9taWNfbG9uZ190CQkJZG9uZV9oZWFkOwkvKiBjb21wbGV0ZWQgaGVhZCAgICAqLworCisJYXRvbWljX3QJCQlsb2NrOwkJLyogY29uY3VycmVudCB3cml0ZXMgKi8KKworCWF0b21pY190CQkJd2FrZXVwOwkJLyogbmVlZHMgYSB3YWtldXAgICAgKi8KKworCXN0cnVjdCBwZXJmX2NvdW50ZXJfbW1hcF9wYWdlICAgKnVzZXJfcGFnZTsKKwl2b2lkCQkJCSpkYXRhX3BhZ2VzWzBdOworfTsKKworc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSB7CisJc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqbmV4dDsKKwl2b2lkICgqZnVuYykoc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqKTsKK307CisKKy8qKgorICogc3RydWN0IHBlcmZfY291bnRlciAtIHBlcmZvcm1hbmNlIGNvdW50ZXIga2VybmVsIHJlcHJlc2VudGF0aW9uOgorICovCitzdHJ1Y3QgcGVyZl9jb3VudGVyIHsKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3RfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZAkJZXZlbnRfZW50cnk7CisJc3RydWN0IGxpc3RfaGVhZAkJc2libGluZ19saXN0OworCWludAkJCQlucl9zaWJsaW5nczsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyCQkqZ3JvdXBfbGVhZGVyOworCWNvbnN0IHN0cnVjdCBwbXUJCSpwbXU7CisKKwllbnVtIHBlcmZfY291bnRlcl9hY3RpdmVfc3RhdGUJc3RhdGU7CisJYXRvbWljNjRfdAkJCWNvdW50OworCisJLyoKKwkgKiBUaGVzZSBhcmUgdGhlIHRvdGFsIHRpbWUgaW4gbmFub3NlY29uZHMgdGhhdCB0aGUgY291bnRlcgorCSAqIGhhcyBiZWVuIGVuYWJsZWQgKGkuZS4gZWxpZ2libGUgdG8gcnVuLCBhbmQgdGhlIHRhc2sgaGFzCisJICogYmVlbiBzY2hlZHVsZWQgaW4sIGlmIHRoaXMgaXMgYSBwZXItdGFzayBjb3VudGVyKQorCSAqIGFuZCBydW5uaW5nIChzY2hlZHVsZWQgb250byB0aGUgQ1BVKSwgcmVzcGVjdGl2ZWx5LgorCSAqCisJICogVGhleSBhcmUgY29tcHV0ZWQgZnJvbSB0c3RhbXBfZW5hYmxlZCwgdHN0YW1wX3J1bm5pbmcgYW5kCisJICogdHN0YW1wX3N0b3BwZWQgd2hlbiB0aGUgY291bnRlciBpcyBpbiBJTkFDVElWRSBvciBBQ1RJVkUgc3RhdGUuCisJICovCisJdTY0CQkJCXRvdGFsX3RpbWVfZW5hYmxlZDsKKwl1NjQJCQkJdG90YWxfdGltZV9ydW5uaW5nOworCisJLyoKKwkgKiBUaGVzZSBhcmUgdGltZXN0YW1wcyB1c2VkIGZvciBjb21wdXRpbmcgdG90YWxfdGltZV9lbmFibGVkCisJICogYW5kIHRvdGFsX3RpbWVfcnVubmluZyB3aGVuIHRoZSBjb3VudGVyIGlzIGluIElOQUNUSVZFIG9yCisJICogQUNUSVZFIHN0YXRlLCBtZWFzdXJlZCBpbiBuYW5vc2Vjb25kcyBmcm9tIGFuIGFyYml0cmFyeSBwb2ludAorCSAqIGluIHRpbWUuCisJICogdHN0YW1wX2VuYWJsZWQ6IHRoZSBub3Rpb25hbCB0aW1lIHdoZW4gdGhlIGNvdW50ZXIgd2FzIGVuYWJsZWQKKwkgKiB0c3RhbXBfcnVubmluZzogdGhlIG5vdGlvbmFsIHRpbWUgd2hlbiB0aGUgY291bnRlciB3YXMgc2NoZWR1bGVkIG9uCisJICogdHN0YW1wX3N0b3BwZWQ6IGluIElOQUNUSVZFIHN0YXRlLCB0aGUgbm90aW9uYWwgdGltZSB3aGVuIHRoZQorCSAqCWNvdW50ZXIgd2FzIHNjaGVkdWxlZCBvZmYuCisJICovCisJdTY0CQkJCXRzdGFtcF9lbmFibGVkOworCXU2NAkJCQl0c3RhbXBfcnVubmluZzsKKwl1NjQJCQkJdHN0YW1wX3N0b3BwZWQ7CisKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIJYXR0cjsKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyCQlodzsKKworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dAkqY3R4OworCXN0cnVjdCBmaWxlCQkJKmZpbHA7CisKKwkvKgorCSAqIFRoZXNlIGFjY3VtdWxhdGUgdG90YWwgdGltZSAoaW4gbmFub3NlY29uZHMpIHRoYXQgY2hpbGRyZW4KKwkgKiBjb3VudGVycyBoYXZlIGJlZW4gZW5hYmxlZCBhbmQgcnVubmluZywgcmVzcGVjdGl2ZWx5LgorCSAqLworCWF0b21pYzY0X3QJCQljaGlsZF90b3RhbF90aW1lX2VuYWJsZWQ7CisJYXRvbWljNjRfdAkJCWNoaWxkX3RvdGFsX3RpbWVfcnVubmluZzsKKworCS8qCisJICogUHJvdGVjdCBhdHRhY2gvZGV0YWNoIGFuZCBjaGlsZF9saXN0OgorCSAqLworCXN0cnVjdCBtdXRleAkJCWNoaWxkX211dGV4OworCXN0cnVjdCBsaXN0X2hlYWQJCWNoaWxkX2xpc3Q7CisJc3RydWN0IHBlcmZfY291bnRlcgkJKnBhcmVudDsKKworCWludAkJCQlvbmNwdTsKKwlpbnQJCQkJY3B1OworCisJc3RydWN0IGxpc3RfaGVhZAkJb3duZXJfZW50cnk7CisJc3RydWN0IHRhc2tfc3RydWN0CQkqb3duZXI7CisKKwkvKiBtbWFwIGJpdHMgKi8KKwlzdHJ1Y3QgbXV0ZXgJCQltbWFwX211dGV4OworCWF0b21pY190CQkJbW1hcF9jb3VudDsKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEJCSpkYXRhOworCisJLyogcG9sbCByZWxhdGVkICovCisJd2FpdF9xdWV1ZV9oZWFkX3QJCXdhaXRxOworCXN0cnVjdCBmYXN5bmNfc3RydWN0CQkqZmFzeW5jOworCisJLyogZGVsYXllZCB3b3JrIGZvciBOTUlzIGFuZCBzdWNoICovCisJaW50CQkJCXBlbmRpbmdfd2FrZXVwOworCWludAkJCQlwZW5kaW5nX2tpbGw7CisJaW50CQkJCXBlbmRpbmdfZGlzYWJsZTsKKwlzdHJ1Y3QgcGVyZl9wZW5kaW5nX2VudHJ5CXBlbmRpbmc7CisKKwlhdG9taWNfdAkJCWV2ZW50X2xpbWl0OworCisJdm9pZCAoKmRlc3Ryb3kpKHN0cnVjdCBwZXJmX2NvdW50ZXIgKik7CisJc3RydWN0IHJjdV9oZWFkCQkJcmN1X2hlYWQ7CisKKwlzdHJ1Y3QgcGlkX25hbWVzcGFjZQkJKm5zOworCXU2NAkJCQlpZDsKKyNlbmRpZgorfTsKKworLyoqCisgKiBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgLSBjb3VudGVyIGNvbnRleHQgc3RydWN0dXJlCisgKgorICogVXNlZCBhcyBhIGNvbnRhaW5lciBmb3IgdGFzayBjb3VudGVycyBhbmQgQ1BVIGNvdW50ZXJzIGFzIHdlbGw6CisgKi8KK3N0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCB7CisJLyoKKwkgKiBQcm90ZWN0IHRoZSBzdGF0ZXMgb2YgdGhlIGNvdW50ZXJzIGluIHRoZSBsaXN0LAorCSAqIG5yX2FjdGl2ZSwgYW5kIHRoZSBsaXN0OgorCSAqLworCXNwaW5sb2NrX3QJCQlsb2NrOworCS8qCisJICogUHJvdGVjdCB0aGUgbGlzdCBvZiBjb3VudGVycy4gIExvY2tpbmcgZWl0aGVyIG11dGV4IG9yIGxvY2sKKwkgKiBpcyBzdWZmaWNpZW50IHRvIGVuc3VyZSB0aGUgbGlzdCBkb2Vzbid0IGNoYW5nZTsgdG8gY2hhbmdlCisJICogdGhlIGxpc3QgeW91IG5lZWQgdG8gbG9jayBib3RoIHRoZSBtdXRleCBhbmQgdGhlIHNwaW5sb2NrLgorCSAqLworCXN0cnVjdCBtdXRleAkJCW11dGV4OworCisJc3RydWN0IGxpc3RfaGVhZAkJY291bnRlcl9saXN0OworCXN0cnVjdCBsaXN0X2hlYWQJCWV2ZW50X2xpc3Q7CisJaW50CQkJCW5yX2NvdW50ZXJzOworCWludAkJCQlucl9hY3RpdmU7CisJaW50CQkJCWlzX2FjdGl2ZTsKKwlhdG9taWNfdAkJCXJlZmNvdW50OworCXN0cnVjdCB0YXNrX3N0cnVjdAkJKnRhc2s7CisKKwkvKgorCSAqIENvbnRleHQgY2xvY2ssIHJ1bnMgd2hlbiBjb250ZXh0IGVuYWJsZWQuCisJICovCisJdTY0CQkJCXRpbWU7CisJdTY0CQkJCXRpbWVzdGFtcDsKKworCS8qCisJICogVGhlc2UgZmllbGRzIGxldCB1cyBkZXRlY3Qgd2hlbiB0d28gY29udGV4dHMgaGF2ZSBib3RoCisJICogYmVlbiBjbG9uZWQgKGluaGVyaXRlZCkgZnJvbSBhIGNvbW1vbiBhbmNlc3Rvci4KKwkgKi8KKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQJKnBhcmVudF9jdHg7CisJdTY0CQkJCXBhcmVudF9nZW47CisJdTY0CQkJCWdlbmVyYXRpb247CisJaW50CQkJCXBpbl9jb3VudDsKKwlzdHJ1Y3QgcmN1X2hlYWQJCQlyY3VfaGVhZDsKK307CisKKy8qKgorICogc3RydWN0IHBlcmZfY291bnRlcl9jcHVfY29udGV4dCAtIHBlciBjcHUgY291bnRlciBjb250ZXh0IHN0cnVjdHVyZQorICovCitzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCB7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0CWN0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQJKnRhc2tfY3R4OworCWludAkJCQlhY3RpdmVfb25jcHU7CisJaW50CQkJCW1heF9wZXJ0YXNrOworCWludAkJCQlleGNsdXNpdmU7CisKKwkvKgorCSAqIFJlY3Vyc2lvbiBhdm9pZGFuY2U6CisJICoKKwkgKiB0YXNrLCBzb2Z0aXJxLCBpcnEsIG5taSBjb250ZXh0CisJICovCisJaW50CQkJCXJlY3Vyc2lvbls0XTsKK307CisKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworCisvKgorICogU2V0IGJ5IGFyY2hpdGVjdHVyZSBjb2RlOgorICovCitleHRlcm4gaW50IHBlcmZfbWF4X2NvdW50ZXJzOworCitleHRlcm4gY29uc3Qgc3RydWN0IHBtdSAqaHdfcGVyZl9jb3VudGVyX2luaXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcik7CisKK2V4dGVybiB2b2lkIHBlcmZfY291bnRlcl90YXNrX3NjaGVkX2luKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGNwdSk7CitleHRlcm4gdm9pZCBwZXJmX2NvdW50ZXJfdGFza19zY2hlZF9vdXQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAorCQkJCQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHQsIGludCBjcHUpOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX3Rhc2tfdGljayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIGludCBjcHUpOworZXh0ZXJuIGludCBwZXJmX2NvdW50ZXJfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2V4aXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNoaWxkKTsKK2V4dGVybiB2b2lkIHBlcmZfY291bnRlcl9mcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKTsKK2V4dGVybiB2b2lkIHBlcmZfY291bnRlcl9kb19wZW5kaW5nKHZvaWQpOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX3ByaW50X2RlYnVnKHZvaWQpOworZXh0ZXJuIHZvaWQgX19wZXJmX2Rpc2FibGUodm9pZCk7CitleHRlcm4gYm9vbCBfX3BlcmZfZW5hYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgcGVyZl9kaXNhYmxlKHZvaWQpOworZXh0ZXJuIHZvaWQgcGVyZl9lbmFibGUodm9pZCk7CitleHRlcm4gaW50IHBlcmZfY291bnRlcl90YXNrX2Rpc2FibGUodm9pZCk7CitleHRlcm4gaW50IHBlcmZfY291bnRlcl90YXNrX2VuYWJsZSh2b2lkKTsKK2V4dGVybiBpbnQgaHdfcGVyZl9ncm91cF9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jb3VudGVyICpncm91cF9sZWFkZXIsCisJICAgICAgIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJICAgICAgIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LCBpbnQgY3B1KTsKK2V4dGVybiB2b2lkIHBlcmZfY291bnRlcl91cGRhdGVfdXNlcnBhZ2Uoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcik7CisKK3N0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIHsKKwlzdHJ1Y3QgcHRfcmVncwkJCSpyZWdzOworCXU2NAkJCQlhZGRyOworCXU2NAkJCQlwZXJpb2Q7Cit9OworCitleHRlcm4gaW50IHBlcmZfY291bnRlcl9vdmVyZmxvdyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBpbnQgbm1pLAorCQkJCSBzdHJ1Y3QgcGVyZl9zYW1wbGVfZGF0YSAqZGF0YSk7CisKKy8qCisgKiBSZXR1cm4gMSBmb3IgYSBzb2Z0d2FyZSBjb3VudGVyLCAwIGZvciBhIGhhcmR3YXJlIGNvdW50ZXIKKyAqLworc3RhdGljIGlubGluZSBpbnQgaXNfc29mdHdhcmVfY291bnRlcihzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXJldHVybiAoY291bnRlci0+YXR0ci50eXBlICE9IFBFUkZfVFlQRV9SQVcpICYmCisJCShjb3VudGVyLT5hdHRyLnR5cGUgIT0gUEVSRl9UWVBFX0hBUkRXQVJFKTsKK30KKworZXh0ZXJuIHZvaWQgcGVyZl9zd2NvdW50ZXJfZXZlbnQodTMyLCB1NjQsIGludCwgc3RydWN0IHB0X3JlZ3MgKiwgdTY0KTsKKworZXh0ZXJuIHZvaWQgX19wZXJmX2NvdW50ZXJfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2NvdW50ZXJfbW1hcChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlpZiAodm1hLT52bV9mbGFncyAmIFZNX0VYRUMpCisJCV9fcGVyZl9jb3VudGVyX21tYXAodm1hKTsKK30KKworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2NvbW0oc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2Zvcmsoc3RydWN0IHRhc2tfc3RydWN0ICp0c2spOworCitleHRlcm4gdm9pZCBwZXJmX2NvdW50ZXJfdGFza19taWdyYXRpb24oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KTsKKworI2RlZmluZSBNQVhfU1RBQ0tfREVQVEgJCQkyNTUKKworc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5IHsKKwl1MTYJCQkJbnI7CisJdTE2CQkJCWh2OworCXUxNgkJCQlrZXJuZWw7CisJdTE2CQkJCXVzZXI7CisJdTY0CQkJCWlwW01BWF9TVEFDS19ERVBUSF07Cit9OworCitleHRlcm4gc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICpwZXJmX2NhbGxjaGFpbihzdHJ1Y3QgcHRfcmVncyAqcmVncyk7CisKK2V4dGVybiBpbnQgc3lzY3RsX3BlcmZfY291bnRlcl9wYXJhbm9pZDsKK2V4dGVybiBpbnQgc3lzY3RsX3BlcmZfY291bnRlcl9tbG9jazsKK2V4dGVybiBpbnQgc3lzY3RsX3BlcmZfY291bnRlcl9zYW1wbGVfcmF0ZTsKKworZXh0ZXJuIHZvaWQgcGVyZl9jb3VudGVyX2luaXQodm9pZCk7CisKKyNpZm5kZWYgcGVyZl9taXNjX2ZsYWdzCisjZGVmaW5lIHBlcmZfbWlzY19mbGFncyhyZWdzKQkodXNlcl9tb2RlKHJlZ3MpID8gUEVSRl9FVkVOVF9NSVNDX1VTRVIgOiBcCisJCQkJIFBFUkZfRVZFTlRfTUlTQ19LRVJORUwpCisjZGVmaW5lIHBlcmZfaW5zdHJ1Y3Rpb25fcG9pbnRlcihyZWdzKQlpbnN0cnVjdGlvbl9wb2ludGVyKHJlZ3MpCisjZW5kaWYKKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAorcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfaW4oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQKK3BlcmZfY291bnRlcl90YXNrX3NjaGVkX291dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssCisJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0LCBpbnQgY3B1KQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQKK3BlcmZfY291bnRlcl90YXNrX3RpY2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgY3B1KQkJeyB9CitzdGF0aWMgaW5saW5lIGludCBwZXJmX2NvdW50ZXJfaW5pdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCXsgcmV0dXJuIDA7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2NvdW50ZXJfZXhpdF90YXNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQpCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9mcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQl7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2NvdW50ZXJfZG9fcGVuZGluZyh2b2lkKQkJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9wcmludF9kZWJ1Zyh2b2lkKQkJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfZGlzYWJsZSh2b2lkKQkJCQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9lbmFibGUodm9pZCkJCQkJCXsgfQorc3RhdGljIGlubGluZSBpbnQgcGVyZl9jb3VudGVyX3Rhc2tfZGlzYWJsZSh2b2lkKQl7IHJldHVybiAtRUlOVkFMOyB9CitzdGF0aWMgaW5saW5lIGludCBwZXJmX2NvdW50ZXJfdGFza19lbmFibGUodm9pZCkJeyByZXR1cm4gLUVJTlZBTDsgfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK3BlcmZfc3djb3VudGVyX2V2ZW50KHUzMiBldmVudCwgdTY0IG5yLCBpbnQgbm1pLAorCQkgICAgIHN0cnVjdCBwdF9yZWdzICpyZWdzLCB1NjQgYWRkcikJCQl7IH0KKworc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQl7IH0KK3N0YXRpYyBpbmxpbmUgdm9pZCBwZXJmX2NvdW50ZXJfY29tbShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzaykJCXsgfQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9jb3VudGVyX2luaXQodm9pZCkJCQkJeyB9CitzdGF0aWMgaW5saW5lIHZvaWQgcGVyZl9jb3VudGVyX3Rhc2tfbWlncmF0aW9uKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkJICAgICAgIGludCBjcHUpCQkJeyB9CisjZW5kaWYKKworI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KKyNlbmRpZiAvKiBfTElOVVhfUEVSRl9DT1VOVEVSX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcHJjdGwuaCBiL2luY2x1ZGUvbGludXgvcHJjdGwuaAppbmRleCA0OGQ4ODdlLi5iMDBkZjRjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3ByY3RsLmgKKysrIGIvaW5jbHVkZS9saW51eC9wcmN0bC5oCkBAIC04NSw0ICs4NSw3IEBACiAjZGVmaW5lIFBSX1NFVF9USU1FUlNMQUNLIDI5CiAjZGVmaW5lIFBSX0dFVF9USU1FUlNMQUNLIDMwCiAKKyNkZWZpbmUgUFJfVEFTS19QRVJGX0NPVU5URVJTX0RJU0FCTEUJCTMxCisjZGVmaW5lIFBSX1RBU0tfUEVSRl9DT1VOVEVSU19FTkFCTEUJCTMyCisKICNlbmRpZiAvKiBfTElOVVhfUFJDVExfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaCBiL2luY2x1ZGUvbGludXgvcHRyYWNlLmgKaW5kZXggNjdjMTU2NS4uNTllMTMzZCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9wdHJhY2UuaAorKysgYi9pbmNsdWRlL2xpbnV4L3B0cmFjZS5oCkBAIC05NSw3ICs5NSw2IEBACiAJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV3X3BhcmVudCk7CiBleHRlcm4gdm9pZCBfX3B0cmFjZV91bmxpbmsoc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCk7CiBleHRlcm4gdm9pZCBleGl0X3B0cmFjZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRyYWNlcik7Ci1leHRlcm4gdm9pZCBwdHJhY2VfZm9yayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MpOwogI2RlZmluZSBQVFJBQ0VfTU9ERV9SRUFEICAgMQogI2RlZmluZSBQVFJBQ0VfTU9ERV9BVFRBQ0ggMgogLyogUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC1lcnJubyBvbiBkZW5pYWwuICovCkBAIC0zMjcsMTUgKzMyNiw2IEBACiAjZGVmaW5lIGFyY2hfcHRyYWNlX3VudHJhY2UodGFzaykJCWRvIHsgfSB3aGlsZSAoMCkKICNlbmRpZgogCi0jaWZuZGVmIGFyY2hfcHRyYWNlX2ZvcmsKLS8qCi0gKiBEbyBtYWNoaW5lLXNwZWNpZmljIHdvcmsgdG8gaW5pdGlhbGl6ZSBhIG5ldyB0YXNrLgotICoKLSAqIFRoaXMgaXMgY2FsbGVkIGZyb20gY29weV9wcm9jZXNzKCkuCi0gKi8KLSNkZWZpbmUgYXJjaF9wdHJhY2VfZm9yayhjaGlsZCwgY2xvbmVfZmxhZ3MpCWRvIHsgfSB3aGlsZSAoMCkKLSNlbmRpZgotCiBleHRlcm4gaW50IHRhc2tfY3VycmVudF9zeXNjYWxsKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFyZ2V0LCBsb25nICpjYWxsbm8sCiAJCQkJdW5zaWduZWQgbG9uZyBhcmdzWzZdLCB1bnNpZ25lZCBpbnQgbWF4YXJncywKIAkJCQl1bnNpZ25lZCBsb25nICpzcCwgdW5zaWduZWQgbG9uZyAqcGMpOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9yY3VsaXN0LmggYi9pbmNsdWRlL2xpbnV4L3JjdWxpc3QuaAppbmRleCBlNjQ5YmQzLi41NzEwZjQzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JjdWxpc3QuaAorKysgYi9pbmNsdWRlL2xpbnV4L3JjdWxpc3QuaApAQCAtMTk4LDYgKzE5OCwzMiBAQAogCWF0LT5wcmV2ID0gbGFzdDsKIH0KIAorLyoqCisgKiBsaXN0X2VudHJ5X3JjdSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5CisgKiBAcHRyOiAgICAgICAgdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHBvaW50ZXIuCisgKiBAdHlwZTogICAgICAgdGhlIHR5cGUgb2YgdGhlIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjogICAgIHRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBUaGlzIHByaW1pdGl2ZSBtYXkgc2FmZWx5IHJ1biBjb25jdXJyZW50bHkgd2l0aCB0aGUgX3JjdSBsaXN0LW11dGF0aW9uCisgKiBwcmltaXRpdmVzIHN1Y2ggYXMgbGlzdF9hZGRfcmN1KCkgYXMgbG9uZyBhcyBpdCdzIGd1YXJkZWQgYnkgcmN1X3JlYWRfbG9jaygpLgorICovCisjZGVmaW5lIGxpc3RfZW50cnlfcmN1KHB0ciwgdHlwZSwgbWVtYmVyKSBcCisJY29udGFpbmVyX29mKHJjdV9kZXJlZmVyZW5jZShwdHIpLCB0eXBlLCBtZW1iZXIpCisKKy8qKgorICogbGlzdF9maXJzdF9lbnRyeV9yY3UgLSBnZXQgdGhlIGZpcnN0IGVsZW1lbnQgZnJvbSBhIGxpc3QKKyAqIEBwdHI6ICAgICAgICB0aGUgbGlzdCBoZWFkIHRvIHRha2UgdGhlIGVsZW1lbnQgZnJvbS4KKyAqIEB0eXBlOiAgICAgICB0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOiAgICAgdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIE5vdGUsIHRoYXQgbGlzdCBpcyBleHBlY3RlZCB0byBiZSBub3QgZW1wdHkuCisgKgorICogVGhpcyBwcmltaXRpdmUgbWF5IHNhZmVseSBydW4gY29uY3VycmVudGx5IHdpdGggdGhlIF9yY3UgbGlzdC1tdXRhdGlvbgorICogcHJpbWl0aXZlcyBzdWNoIGFzIGxpc3RfYWRkX3JjdSgpIGFzIGxvbmcgYXMgaXQncyBndWFyZGVkIGJ5IHJjdV9yZWFkX2xvY2soKS4KKyAqLworI2RlZmluZSBsaXN0X2ZpcnN0X2VudHJ5X3JjdShwdHIsIHR5cGUsIG1lbWJlcikgXAorCWxpc3RfZW50cnlfcmN1KChwdHIpLT5uZXh0LCB0eXBlLCBtZW1iZXIpCisKICNkZWZpbmUgX19saXN0X2Zvcl9lYWNoX3JjdShwb3MsIGhlYWQpIFwKIAlmb3IgKHBvcyA9IHJjdV9kZXJlZmVyZW5jZSgoaGVhZCktPm5leHQpOyBcCiAJCXBvcyAhPSAoaGVhZCk7IFwKQEAgLTIxNCw5ICsyNDAsOSBAQAogICogYXMgbG9uZyBhcyB0aGUgdHJhdmVyc2FsIGlzIGd1YXJkZWQgYnkgcmN1X3JlYWRfbG9jaygpLgogICovCiAjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KHBvcywgaGVhZCwgbWVtYmVyKSBcCi0JZm9yIChwb3MgPSBsaXN0X2VudHJ5KHJjdV9kZXJlZmVyZW5jZSgoaGVhZCktPm5leHQpLCB0eXBlb2YoKnBvcyksIG1lbWJlcik7IFwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnlfcmN1KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOyBcCiAJCXByZWZldGNoKHBvcy0+bWVtYmVyLm5leHQpLCAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOyBcCi0JCXBvcyA9IGxpc3RfZW50cnkocmN1X2RlcmVmZXJlbmNlKHBvcy0+bWVtYmVyLm5leHQpLCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCisJCXBvcyA9IGxpc3RfZW50cnlfcmN1KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKIAogCiAvKioKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmN1dHJlZS5oIGIvaW5jbHVkZS9saW51eC9yY3V0cmVlLmgKaW5kZXggNThiMmFhNS4uNWE1MTUzOCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9yY3V0cmVlLmgKKysrIGIvaW5jbHVkZS9saW51eC9yY3V0cmVlLmgKQEAgLTE2MSw4ICsxNjEsMTUgQEAKIAl1bnNpZ25lZCBsb25nIG9mZmxpbmVfZnFzOwkvKiBLaWNrZWQgZHVlIHRvIGJlaW5nIG9mZmxpbmUuICovCiAJdW5zaWduZWQgbG9uZyByZXNjaGVkX2lwaTsJLyogU2VudCBhIHJlc2NoZWQgSVBJLiAqLwogCi0JLyogNSkgRm9yIGZ1dHVyZSBfX3JjdV9wZW5kaW5nIHN0YXRpc3RpY3MuICovCisJLyogNSkgX19yY3VfcGVuZGluZygpIHN0YXRpc3RpY3MuICovCiAJbG9uZyBuX3JjdV9wZW5kaW5nOwkJLyogcmN1X3BlbmRpbmcoKSBjYWxscyBzaW5jZSBib290LiAqLworCWxvbmcgbl9ycF9xc19wZW5kaW5nOworCWxvbmcgbl9ycF9jYl9yZWFkeTsKKwlsb25nIG5fcnBfY3B1X25lZWRzX2dwOworCWxvbmcgbl9ycF9ncF9jb21wbGV0ZWQ7CisJbG9uZyBuX3JwX2dwX3N0YXJ0ZWQ7CisJbG9uZyBuX3JwX25lZWRfZnFzOworCWxvbmcgbl9ycF9uZWVkX25vdGhpbmc7CiAKIAlpbnQgY3B1OwogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvcmluZ19idWZmZXIuaCBiL2luY2x1ZGUvbGludXgvcmluZ19idWZmZXIuaAppbmRleCBlMWI3YjIxLi44NjcwZjE1IDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3JpbmdfYnVmZmVyLmgKKysrIGIvaW5jbHVkZS9saW51eC9yaW5nX2J1ZmZlci5oCkBAIC0xMSw3ICsxMSw3IEBACiAgKiBEb24ndCByZWZlciB0byB0aGlzIHN0cnVjdCBkaXJlY3RseSwgdXNlIGZ1bmN0aW9ucyBiZWxvdy4KICAqLwogc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50IHsKLQl1MzIJCXR5cGU6MiwgbGVuOjMsIHRpbWVfZGVsdGE6Mjc7CisJdTMyCQl0eXBlX2xlbjo1LCB0aW1lX2RlbHRhOjI3OwogCXUzMgkJYXJyYXlbXTsKIH07CiAKQEAgLTI0LDcgKzI0LDggQEAKICAqCQkJCSAgc2l6ZSBpcyB2YXJpYWJsZSBkZXBlbmRpbmcgb24gaG93IG11Y2gKICAqCQkJCSAgcGFkZGluZyBpcyBuZWVkZWQKICAqCQkJCSBJZiB0aW1lX2RlbHRhIGlzIG5vbiB6ZXJvOgotICoJCQkJICBldmVyeXRoaW5nIGVsc2Ugc2FtZSBhcyBSSU5HQlVGX1RZUEVfREFUQQorICoJCQkJICBhcnJheVswXSBob2xkcyB0aGUgYWN0dWFsIGxlbmd0aAorICoJCQkJICBzaXplID0gNCArIGxlbmd0aCAoYnl0ZXMpCiAgKgogICogQFJJTkdCVUZfVFlQRV9USU1FX0VYVEVORDoJRXh0ZW5kIHRoZSB0aW1lIGRlbHRhCiAgKgkJCQkgYXJyYXlbMF0gPSB0aW1lIGRlbHRhICgyOCAuLiA1OSkKQEAgLTM1LDIyICszNiwyMyBAQAogICoJCQkJIGFycmF5WzEuLjJdID0gdHZfc2VjCiAgKgkJCQkgc2l6ZSA9IDE2IGJ5dGVzCiAgKgotICogQFJJTkdCVUZfVFlQRV9EQVRBOgkJRGF0YSByZWNvcmQKLSAqCQkJCSBJZiBsZW4gaXMgemVybzoKKyAqIDw9IEBSSU5HQlVGX1RZUEVfREFUQV9UWVBFX0xFTl9NQVg6CisgKgkJCQlEYXRhIHJlY29yZAorICoJCQkJIElmIHR5cGVfbGVuIGlzIHplcm86CiAgKgkJCQkgIGFycmF5WzBdIGhvbGRzIHRoZSBhY3R1YWwgbGVuZ3RoCiAgKgkJCQkgIGFycmF5WzEuLihsZW5ndGgrMykvNF0gaG9sZHMgZGF0YQotICoJCQkJICBzaXplID0gNCArIDQgKyBsZW5ndGggKGJ5dGVzKQorICoJCQkJICBzaXplID0gNCArIGxlbmd0aCAoYnl0ZXMpCiAgKgkJCQkgZWxzZQotICoJCQkJICBsZW5ndGggPSBsZW4gPDwgMgorICoJCQkJICBsZW5ndGggPSB0eXBlX2xlbiA8PCAyCiAgKgkJCQkgIGFycmF5WzAuLihsZW5ndGgrMykvNC0xXSBob2xkcyBkYXRhCiAgKgkJCQkgIHNpemUgPSA0ICsgbGVuZ3RoIChieXRlcykKICAqLwogZW51bSByaW5nX2J1ZmZlcl90eXBlIHsKKwlSSU5HQlVGX1RZUEVfREFUQV9UWVBFX0xFTl9NQVggPSAyOCwKIAlSSU5HQlVGX1RZUEVfUEFERElORywKIAlSSU5HQlVGX1RZUEVfVElNRV9FWFRFTkQsCiAJLyogRklYTUU6IFJJTkdCVUZfVFlQRV9USU1FX1NUQU1QIG5vdCBpbXBsZW1lbnRlZCAqLwogCVJJTkdCVUZfVFlQRV9USU1FX1NUQU1QLAotCVJJTkdCVUZfVFlQRV9EQVRBLAogfTsKIAogdW5zaWduZWQgcmluZ19idWZmZXJfZXZlbnRfbGVuZ3RoKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpOwpAQCAtNjgsMTMgKzcwLDU0IEBACiAJcmV0dXJuIGV2ZW50LT50aW1lX2RlbHRhOwogfQogCisvKgorICogcmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZCBjYW4gZGlzY2FyZCBhbnkgZXZlbnQgaW4gdGhlIHJpbmcgYnVmZmVyLgorICogICBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIHByb3RlY3QgYWdhaW5zdCBhIHJlYWRlciBmcm9tCisgKiAgIGNvbnN1bWluZyBpdCBvciBhIHdyaXRlciBmcm9tIHdyYXBwaW5nIGFuZCByZXBsYWNpbmcgaXQuCisgKgorICogTm8gZXh0ZXJuYWwgcHJvdGVjdGlvbiBpcyBuZWVkZWQgaWYgdGhpcyBpcyBjYWxsZWQgYmVmb3JlCisgKiB0aGUgZXZlbnQgaXMgY29tbWl0ZWQuIEJ1dCBpbiB0aGF0IGNhc2UgaXQgd291bGQgYmUgYmV0dGVyIHRvCisgKiB1c2UgcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQuCisgKgorICogTm90ZSwgaWYgYW4gZXZlbnQgdGhhdCBoYXMgbm90IGJlZW4gY29tbWl0dGVkIGlzIGRpc2NhcmRlZAorICogd2l0aCByaW5nX2J1ZmZlcl9ldmVudF9kaXNjYXJkLCBpdCBtdXN0IHN0aWxsIGJlIGNvbW1pdHRlZC4KKyAqLwogdm9pZCByaW5nX2J1ZmZlcl9ldmVudF9kaXNjYXJkKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpOwogCiAvKgorICogcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQgd2lsbCByZW1vdmUgYW4gZXZlbnQgdGhhdCBoYXMgbm90CisgKiAgIGJlbiBjb21taXR0ZWQgeWV0LiBJZiB0aGlzIGlzIHVzZWQsIHRoZW4gcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdAorICogICBtdXN0IG5vdCBiZSBjYWxsZWQgb24gdGhlIGRpc2NhcmRlZCBldmVudC4gVGhpcyBmdW5jdGlvbgorICogICB3aWxsIHRyeSB0byByZW1vdmUgdGhlIGV2ZW50IGZyb20gdGhlIHJpbmcgYnVmZmVyIGNvbXBsZXRlbHkKKyAqICAgaWYgYW5vdGhlciBldmVudCBoYXMgbm90IGJlZW4gd3JpdHRlbiBhZnRlciBpdC4KKyAqCisgKiBFeGFtcGxlIHVzZToKKyAqCisgKiAgaWYgKHNvbWVfY29uZGl0aW9uKQorICogICAgcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQoYnVmZmVyLCBldmVudCk7CisgKiAgZWxzZQorICogICAgcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdChidWZmZXIsIGV2ZW50KTsKKyAqLwordm9pZCByaW5nX2J1ZmZlcl9kaXNjYXJkX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwKKwkJCQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KTsKKworLyoKICAqIHNpemUgaXMgaW4gYnl0ZXMgZm9yIGVhY2ggcGVyIENQVSBidWZmZXIuCiAgKi8KIHN0cnVjdCByaW5nX2J1ZmZlciAqCi1yaW5nX2J1ZmZlcl9hbGxvYyh1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGZsYWdzKTsKK19fcmluZ19idWZmZXJfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBmbGFncywgc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpOworCisvKgorICogQmVjYXVzZSB0aGUgcmluZyBidWZmZXIgaXMgZ2VuZXJpYywgaWYgb3RoZXIgdXNlcnMgb2YgdGhlIHJpbmcgYnVmZmVyIGdldAorICogdHJhY2VkIGJ5IGZ0cmFjZSwgaXQgY2FuIHByb2R1Y2UgbG9ja2RlcCB3YXJuaW5ncy4gV2UgbmVlZCB0byBrZWVwIGVhY2gKKyAqIHJpbmcgYnVmZmVyJ3MgbG9jayBjbGFzcyBzZXBhcmF0ZS4KKyAqLworI2RlZmluZSByaW5nX2J1ZmZlcl9hbGxvYyhzaXplLCBmbGFncykJCQlcCisoewkJCQkJCQlcCisJc3RhdGljIHN0cnVjdCBsb2NrX2NsYXNzX2tleSBfX2tleTsJCVwKKwlfX3JpbmdfYnVmZmVyX2FsbG9jKChzaXplKSwgKGZsYWdzKSwgJl9fa2V5KTsJXAorfSkKKwogdm9pZCByaW5nX2J1ZmZlcl9mcmVlKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyKTsKIAogaW50IHJpbmdfYnVmZmVyX3Jlc2l6ZShzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgdW5zaWduZWQgbG9uZyBzaXplKTsKQEAgLTEyMiw2ICsxNjUsOCBAQAogdW5zaWduZWQgbG9uZyByaW5nX2J1ZmZlcl9vdmVycnVucyhzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlcik7CiB1bnNpZ25lZCBsb25nIHJpbmdfYnVmZmVyX2VudHJpZXNfY3B1KHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCBpbnQgY3B1KTsKIHVuc2lnbmVkIGxvbmcgcmluZ19idWZmZXJfb3ZlcnJ1bl9jcHUoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpOwordW5zaWduZWQgbG9uZyByaW5nX2J1ZmZlcl9jb21taXRfb3ZlcnJ1bl9jcHUoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpOwordW5zaWduZWQgbG9uZyByaW5nX2J1ZmZlcl9ubWlfZHJvcHBlZF9jcHUoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpOwogCiB1NjQgcmluZ19idWZmZXJfdGltZV9zdGFtcChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSk7CiB2b2lkIHJpbmdfYnVmZmVyX25vcm1hbGl6ZV90aW1lX3N0YW1wKHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLApAQCAtMTM3LDYgKzE4MiwxMSBAQAogaW50IHJpbmdfYnVmZmVyX3JlYWRfcGFnZShzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgdm9pZCAqKmRhdGFfcGFnZSwKIAkJCSAgc2l6ZV90IGxlbiwgaW50IGNwdSwgaW50IGZ1bGwpOwogCitzdHJ1Y3QgdHJhY2Vfc2VxOworCitpbnQgcmluZ19idWZmZXJfcHJpbnRfZW50cnlfaGVhZGVyKHN0cnVjdCB0cmFjZV9zZXEgKnMpOworaW50IHJpbmdfYnVmZmVyX3ByaW50X3BhZ2VfaGVhZGVyKHN0cnVjdCB0cmFjZV9zZXEgKnMpOworCiBlbnVtIHJpbmdfYnVmZmVyX2ZsYWdzIHsKIAlSQl9GTF9PVkVSV1JJVEUJCT0gMSA8PCAwLAogfTsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2NoZWQuaCBiL2luY2x1ZGUvbGludXgvc2NoZWQuaAppbmRleCBiNGMzOGJjLi4yOGM3NzRmIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NjaGVkLmgKKysrIGIvaW5jbHVkZS9saW51eC9zY2hlZC5oCkBAIC03Nyw2ICs3Nyw3IEBACiAjaW5jbHVkZSA8bGludXgvcHJvcG9ydGlvbnMuaD4KICNpbmNsdWRlIDxsaW51eC9zZWNjb21wLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvcnRtdXRleC5oPgogCiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgpAQCAtOTYsOCArOTcsOSBAQAogc3RydWN0IGZ1dGV4X3BpX3N0YXRlOwogc3RydWN0IHJvYnVzdF9saXN0X2hlYWQ7CiBzdHJ1Y3QgYmlvOwotc3RydWN0IGJ0c190cmFjZXI7CiBzdHJ1Y3QgZnNfc3RydWN0Oworc3RydWN0IGJ0c19jb250ZXh0Oworc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0OwogCiAvKgogICogTGlzdCBvZiBmbGFncyB3ZSB3YW50IHRvIHNoYXJlIGZvciBrZXJuZWwgdGhyZWFkcywKQEAgLTExNiw2ICsxMTgsNyBAQAogICogICAgMTEgYml0IGZyYWN0aW9ucy4KICAqLwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgYXZlbnJ1bltdOwkJLyogTG9hZCBhdmVyYWdlcyAqLworZXh0ZXJuIHZvaWQgZ2V0X2F2ZW5ydW4odW5zaWduZWQgbG9uZyAqbG9hZHMsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBpbnQgc2hpZnQpOwogCiAjZGVmaW5lIEZTSElGVAkJMTEJCS8qIG5yIG9mIGJpdHMgb2YgcHJlY2lzaW9uICovCiAjZGVmaW5lIEZJWEVEXzEJCSgxPDxGU0hJRlQpCS8qIDEuMCBhcyBmaXhlZC1wb2ludCAqLwpAQCAtMTM1LDggKzEzOCw5IEBACiBleHRlcm4gaW50IG5yX3Byb2Nlc3Nlcyh2b2lkKTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIG5yX3J1bm5pbmcodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBucl91bmludGVycnVwdGlibGUodm9pZCk7Ci1leHRlcm4gdW5zaWduZWQgbG9uZyBucl9hY3RpdmUodm9pZCk7CiBleHRlcm4gdW5zaWduZWQgbG9uZyBucl9pb3dhaXQodm9pZCk7CitleHRlcm4gdm9pZCBjYWxjX2dsb2JhbF9sb2FkKHZvaWQpOworZXh0ZXJuIHU2NCBjcHVfbnJfbWlncmF0aW9ucyhpbnQgY3B1KTsKIAogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgZ2V0X3BhcmVudF9pcCh1bnNpZ25lZCBsb25nIGFkZHIpOwogCkBAIC02NzIsNiArNjc2LDEwIEBACiAJc3RydWN0IHdvcmtfc3RydWN0IHdvcms7CiAjZW5kaWYKICNlbmRpZgorCisjaWZkZWYgQ09ORklHX1BFUkZfQ09VTlRFUlMKKwlhdG9taWNfbG9uZ190IGxvY2tlZF92bTsKKyNlbmRpZgogfTsKIAogZXh0ZXJuIGludCB1aWRzX3N5c2ZzX2luaXQodm9pZCk7CkBAIC04MzgsNyArODQ2LDE3IEBACiAJICovCiAJdTMyIHJlY2lwcm9jYWxfY3B1X3Bvd2VyOwogCi0JdW5zaWduZWQgbG9uZyBjcHVtYXNrW107CisJLyoKKwkgKiBUaGUgQ1BVcyB0aGlzIGdyb3VwIGNvdmVycy4KKwkgKgorCSAqIE5PVEU6IHRoaXMgZmllbGQgaXMgdmFyaWFibGUgbGVuZ3RoLiAoQWxsb2NhdGVkIGR5bmFtaWNhbGx5CisJICogYnkgYXR0YWNoaW5nIGV4dHJhIHNwYWNlIHRvIHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSwKKwkgKiBkZXBlbmRpbmcgb24gaG93IG1hbnkgQ1BVcyB0aGUga2VybmVsIGhhcyBib290ZWQgdXAgd2l0aCkKKwkgKgorCSAqIEl0IGlzIGFsc28gYmUgZW1iZWRkZWQgaW50byBzdGF0aWMgZGF0YSBzdHJ1Y3R1cmVzIGF0IGJ1aWxkCisJICogdGltZS4gKFNlZSAnc3RydWN0IHN0YXRpY19zY2hlZF9ncm91cCcgaW4ga2VybmVsL3NjaGVkLmMpCisJICovCisJdW5zaWduZWQgbG9uZyBjcHVtYXNrWzBdOwogfTsKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgY3B1bWFzayAqc2NoZWRfZ3JvdXBfY3B1cyhzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKnNnKQpAQCAtOTI0LDggKzk0MiwxNyBAQAogCWNoYXIgKm5hbWU7CiAjZW5kaWYKIAotCS8qIHNwYW4gb2YgYWxsIENQVXMgaW4gdGhpcyBkb21haW4gKi8KLQl1bnNpZ25lZCBsb25nIHNwYW5bXTsKKwkvKgorCSAqIFNwYW4gb2YgYWxsIENQVXMgaW4gdGhpcyBkb21haW4uCisJICoKKwkgKiBOT1RFOiB0aGlzIGZpZWxkIGlzIHZhcmlhYmxlIGxlbmd0aC4gKEFsbG9jYXRlZCBkeW5hbWljYWxseQorCSAqIGJ5IGF0dGFjaGluZyBleHRyYSBzcGFjZSB0byB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUsCisJICogZGVwZW5kaW5nIG9uIGhvdyBtYW55IENQVXMgdGhlIGtlcm5lbCBoYXMgYm9vdGVkIHVwIHdpdGgpCisJICoKKwkgKiBJdCBpcyBhbHNvIGJlIGVtYmVkZGVkIGludG8gc3RhdGljIGRhdGEgc3RydWN0dXJlcyBhdCBidWlsZAorCSAqIHRpbWUuIChTZWUgJ3N0cnVjdCBzdGF0aWNfc2NoZWRfZG9tYWluJyBpbiBrZXJuZWwvc2NoZWQuYykKKwkgKi8KKwl1bnNpZ25lZCBsb25nIHNwYW5bMF07CiB9OwogCiBzdGF0aWMgaW5saW5lIHN0cnVjdCBjcHVtYXNrICpzY2hlZF9kb21haW5fc3BhbihzdHJ1Y3Qgc2NoZWRfZG9tYWluICpzZCkKQEAgLTEwNTIsOSArMTA3OSwxMCBAQAogCXU2NAkJCWxhc3Rfd2FrZXVwOwogCXU2NAkJCWF2Z19vdmVybGFwOwogCisJdTY0CQkJbnJfbWlncmF0aW9uczsKKwogCXU2NAkJCXN0YXJ0X3J1bnRpbWU7CiAJdTY0CQkJYXZnX3dha2V1cDsKLQl1NjQJCQlucl9taWdyYXRpb25zOwogCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAl1NjQJCQl3YWl0X3N0YXJ0OwpAQCAtMTIwOSwxOCArMTIzNywxMSBAQAogCXN0cnVjdCBsaXN0X2hlYWQgcHRyYWNlZDsKIAlzdHJ1Y3QgbGlzdF9oZWFkIHB0cmFjZV9lbnRyeTsKIAotI2lmZGVmIENPTkZJR19YODZfUFRSQUNFX0JUUwogCS8qCiAJICogVGhpcyBpcyB0aGUgdHJhY2VyIGhhbmRsZSBmb3IgdGhlIHB0cmFjZSBCVFMgZXh0ZW5zaW9uLgogCSAqIFRoaXMgZmllbGQgYWN0dWFsbHkgYmVsb25ncyB0byB0aGUgcHRyYWNlciB0YXNrLgogCSAqLwotCXN0cnVjdCBidHNfdHJhY2VyICpidHM7Ci0JLyoKLQkgKiBUaGUgYnVmZmVyIHRvIGhvbGQgdGhlIEJUUyBkYXRhLgotCSAqLwotCXZvaWQgKmJ0c19idWZmZXI7Ci0Jc2l6ZV90IGJ0c19zaXplOwotI2VuZGlmIC8qIENPTkZJR19YODZfUFRSQUNFX0JUUyAqLworCXN0cnVjdCBidHNfY29udGV4dCAqYnRzOwogCiAJLyogUElEL1BJRCBoYXNoIHRhYmxlIGxpbmthZ2UuICovCiAJc3RydWN0IHBpZF9saW5rIHBpZHNbUElEVFlQRV9NQVhdOwpAQCAtMTM4MCw2ICsxNDAxLDExIEBACiAJc3RydWN0IGxpc3RfaGVhZCBwaV9zdGF0ZV9saXN0OwogCXN0cnVjdCBmdXRleF9waV9zdGF0ZSAqcGlfc3RhdGVfY2FjaGU7CiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqcGVyZl9jb3VudGVyX2N0eHA7CisJc3RydWN0IG11dGV4IHBlcmZfY291bnRlcl9tdXRleDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIHBlcmZfY291bnRlcl9saXN0OworI2VuZGlmCiAjaWZkZWYgQ09ORklHX05VTUEKIAlzdHJ1Y3QgbWVtcG9saWN5ICptZW1wb2xpY3k7CiAJc2hvcnQgaWxfbmV4dDsKQEAgLTE0MjgsNyArMTQ1NCw5IEBACiAjaWZkZWYgQ09ORklHX1RSQUNJTkcKIAkvKiBzdGF0ZSBmbGFncyBmb3IgdXNlIGJ5IHRyYWNlcnMgKi8KIAl1bnNpZ25lZCBsb25nIHRyYWNlOwotI2VuZGlmCisJLyogYml0bWFzayBvZiB0cmFjZSByZWN1cnNpb24gKi8KKwl1bnNpZ25lZCBsb25nIHRyYWNlX3JlY3Vyc2lvbjsKKyNlbmRpZiAvKiBDT05GSUdfVFJBQ0lORyAqLwogfTsKIAogLyogRnV0dXJlLXNhZmUgYWNjZXNzb3IgZm9yIHN0cnVjdCB0YXNrX3N0cnVjdCdzIGNwdXNfYWxsb3dlZC4gKi8KQEAgLTIwMDEsOCArMjAyOSwxMCBAQAogZXh0ZXJuIGNoYXIgKmdldF90YXNrX2NvbW0oY2hhciAqdG8sIHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIAogI2lmZGVmIENPTkZJR19TTVAKK2V4dGVybiB2b2lkIHdhaXRfdGFza19jb250ZXh0X3N3aXRjaChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogZXh0ZXJuIHVuc2lnbmVkIGxvbmcgd2FpdF90YXNrX2luYWN0aXZlKHN0cnVjdCB0YXNrX3N0cnVjdCAqLCBsb25nIG1hdGNoX3N0YXRlKTsKICNlbHNlCitzdGF0aWMgaW5saW5lIHZvaWQgd2FpdF90YXNrX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkge30KIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB3YWl0X3Rhc2tfaW5hY3RpdmUoc3RydWN0IHRhc2tfc3RydWN0ICpwLAogCQkJCQkgICAgICAgbG9uZyBtYXRjaF9zdGF0ZSkKIHsKQEAgLTIwMTAsNyArMjA0MCw4IEBACiB9CiAjZW5kaWYKIAotI2RlZmluZSBuZXh0X3Rhc2socCkJbGlzdF9lbnRyeShyY3VfZGVyZWZlcmVuY2UoKHApLT50YXNrcy5uZXh0KSwgc3RydWN0IHRhc2tfc3RydWN0LCB0YXNrcykKKyNkZWZpbmUgbmV4dF90YXNrKHApIFwKKwlsaXN0X2VudHJ5X3JjdSgocCktPnRhc2tzLm5leHQsIHN0cnVjdCB0YXNrX3N0cnVjdCwgdGFza3MpCiAKICNkZWZpbmUgZm9yX2VhY2hfcHJvY2VzcyhwKSBcCiAJZm9yIChwID0gJmluaXRfdGFzayA7IChwID0gbmV4dF90YXNrKHApKSAhPSAmaW5pdF90YXNrIDsgKQpAQCAtMjA0OSw4ICsyMDgwLDggQEAKIAogc3RhdGljIGlubGluZSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKm5leHRfdGhyZWFkKGNvbnN0IHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKIHsKLQlyZXR1cm4gbGlzdF9lbnRyeShyY3VfZGVyZWZlcmVuY2UocC0+dGhyZWFkX2dyb3VwLm5leHQpLAotCQkJICBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHRocmVhZF9ncm91cCk7CisJcmV0dXJuIGxpc3RfZW50cnlfcmN1KHAtPnRocmVhZF9ncm91cC5uZXh0LAorCQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0LCB0aHJlYWRfZ3JvdXApOwogfQogCiBzdGF0aWMgaW5saW5lIGludCB0aHJlYWRfZ3JvdXBfZW1wdHkoc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtMjM4OCw2ICsyNDE5LDEzIEBACiAjZGVmaW5lIFRBU0tfU0laRV9PRih0c2spCVRBU0tfU0laRQogI2VuZGlmCiAKKy8qCisgKiBDYWxsIHRoZSBmdW5jdGlvbiBpZiB0aGUgdGFyZ2V0IHRhc2sgaXMgZXhlY3V0aW5nIG9uIGEgQ1BVIHJpZ2h0IG5vdzoKKyAqLworZXh0ZXJuIHZvaWQgdGFza19vbmNwdV9mdW5jdGlvbl9jYWxsKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwKKwkJCQkgICAgIHZvaWQgKCpmdW5jKSAodm9pZCAqaW5mbyksIHZvaWQgKmluZm8pOworCisKICNpZmRlZiBDT05GSUdfTU1fT1dORVIKIGV4dGVybiB2b2lkIG1tX3VwZGF0ZV9uZXh0X293bmVyKHN0cnVjdCBtbV9zdHJ1Y3QgKm1tKTsKIGV4dGVybiB2b2lkIG1tX2luaXRfb3duZXIoc3RydWN0IG1tX3N0cnVjdCAqbW0sIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCk7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oIGIvaW5jbHVkZS9saW51eC9zaWduYWwuaAppbmRleCA4NGY5OTdmLi5jNzU1MjgzIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NpZ25hbC5oCisrKyBiL2luY2x1ZGUvbGludXgvc2lnbmFsLmgKQEAgLTIzNSw2ICsyMzUsOCBAQAogZXh0ZXJuIGludCBuZXh0X3NpZ25hbChzdHJ1Y3Qgc2lncGVuZGluZyAqcGVuZGluZywgc2lnc2V0X3QgKm1hc2spOwogZXh0ZXJuIGludCBncm91cF9zZW5kX3NpZ19pbmZvKGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApOwogZXh0ZXJuIGludCBfX2dyb3VwX3NlbmRfc2lnX2luZm8oaW50LCBzdHJ1Y3Qgc2lnaW5mbyAqLCBzdHJ1Y3QgdGFza19zdHJ1Y3QgKik7CitleHRlcm4gbG9uZyBkb19ydF90Z3NpZ3F1ZXVlaW5mbyhwaWRfdCB0Z2lkLCBwaWRfdCBwaWQsIGludCBzaWcsCisJCQkJIHNpZ2luZm9fdCAqaW5mbyk7CiBleHRlcm4gbG9uZyBkb19zaWdwZW5kaW5nKHZvaWQgX191c2VyICosIHVuc2lnbmVkIGxvbmcpOwogZXh0ZXJuIGludCBzaWdwcm9jbWFzayhpbnQsIHNpZ3NldF90ICosIHNpZ3NldF90ICopOwogZXh0ZXJuIGludCBzaG93X3VuaGFuZGxlZF9zaWduYWxzOwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oIGIvaW5jbHVkZS9saW51eC9zbGFiX2RlZi5oCmluZGV4IDVhYzliMGIuLjcxM2Y4NDEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc2xhYl9kZWYuaAorKysgYi9pbmNsdWRlL2xpbnV4L3NsYWJfZGVmLmgKQEAgLTE0LDcgKzE0LDcgQEAKICNpbmNsdWRlIDxhc20vcGFnZS5oPgkJLyoga21hbGxvY19zaXplcy5oIG5lZWRzIFBBR0VfU0laRSAqLwogI2luY2x1ZGUgPGFzbS9jYWNoZS5oPgkJLyoga21hbGxvY19zaXplcy5oIG5lZWRzIEwxX0NBQ0hFX0JZVEVTICovCiAjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDx0cmFjZS9rbWVtdHJhY2UuaD4KKyNpbmNsdWRlIDxsaW51eC9rbWVtdHJhY2UuaD4KIAogLyogU2l6ZSBkZXNjcmlwdGlvbiBzdHJ1Y3QgZm9yIGdlbmVyYWwgY2FjaGVzLiAqLwogc3RydWN0IGNhY2hlX3NpemVzIHsKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaCBiL2luY2x1ZGUvbGludXgvc2x1Yl9kZWYuaAppbmRleCA1MDQ2ZjkwLi5iZTVkNDBjIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NsdWJfZGVmLmgKKysrIGIvaW5jbHVkZS9saW51eC9zbHViX2RlZi5oCkBAIC0xMCw3ICsxMCw3IEBACiAjaW5jbHVkZSA8bGludXgvZ2ZwLmg+CiAjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgva29iamVjdC5oPgotI2luY2x1ZGUgPHRyYWNlL2ttZW10cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW10cmFjZS5oPgogCiBlbnVtIHN0YXRfaXRlbSB7CiAJQUxMT0NfRkFTVFBBVEgsCQkvKiBBbGxvY2F0aW9uIGZyb20gY3B1IHNsYWIgKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdXAuaCBiL2luY2x1ZGUvbGludXgvc3BpbmxvY2tfdXAuaAppbmRleCA5MzgyMzRjLi5kNDg0MWVkIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3NwaW5sb2NrX3VwLmgKKysrIGIvaW5jbHVkZS9saW51eC9zcGlubG9ja191cC5oCkBAIC02MCw2ICs2MCw3IEBACiAjZGVmaW5lIF9fcmF3X3NwaW5faXNfbG9ja2VkKGxvY2spCSgodm9pZCkobG9jayksIDApCiAvKiBmb3Igc2NoZWQuYyBhbmQga2VybmVsX2xvY2suYzogKi8KICMgZGVmaW5lIF9fcmF3X3NwaW5fbG9jayhsb2NrKQkJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCisjIGRlZmluZSBfX3Jhd19zcGluX2xvY2tfZmxhZ3MobG9jaywgZmxhZ3MpCWRvIHsgKHZvaWQpKGxvY2spOyB9IHdoaWxlICgwKQogIyBkZWZpbmUgX19yYXdfc3Bpbl91bmxvY2sobG9jaykJZG8geyAodm9pZCkobG9jayk7IH0gd2hpbGUgKDApCiAjIGRlZmluZSBfX3Jhd19zcGluX3RyeWxvY2sobG9jaykJKHsgKHZvaWQpKGxvY2spOyAxOyB9KQogI2VuZGlmIC8qIERFQlVHX1NQSU5MT0NLICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3N3aW90bGIuaCBiL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCmluZGV4IGFjOWZmNTQuLmNiMWE2NjMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCisrKyBiL2luY2x1ZGUvbGludXgvc3dpb3RsYi5oCkBAIC0yOSw3ICsyOSw4IEBACiAKIGV4dGVybiBkbWFfYWRkcl90IHN3aW90bGJfcGh5c190b19idXMoc3RydWN0IGRldmljZSAqaHdkZXYsCiAJCQkJICAgICAgcGh5c19hZGRyX3QgYWRkcmVzcyk7Ci1leHRlcm4gcGh5c19hZGRyX3Qgc3dpb3RsYl9idXNfdG9fcGh5cyhkbWFfYWRkcl90IGFkZHJlc3MpOworZXh0ZXJuIHBoeXNfYWRkcl90IHN3aW90bGJfYnVzX3RvX3BoeXMoc3RydWN0IGRldmljZSAqaHdkZXYsCisJCQkJICAgICAgIGRtYV9hZGRyX3QgYWRkcmVzcyk7CiAKIGV4dGVybiBpbnQgc3dpb3RsYl9hcmNoX3JhbmdlX25lZWRzX21hcHBpbmcocGh5c19hZGRyX3QgcGFkZHIsIHNpemVfdCBzaXplKTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oIGIvaW5jbHVkZS9saW51eC9zeXNjYWxscy5oCmluZGV4IDMwNTIwODQuLmM2Yzg0YWQgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvc3lzY2FsbHMuaAorKysgYi9pbmNsdWRlL2xpbnV4L3N5c2NhbGxzLmgKQEAgLTU1LDYgKzU1LDcgQEAKIHN0cnVjdCByb2J1c3RfbGlzdF9oZWFkOwogc3RydWN0IGdldGNwdV9jYWNoZTsKIHN0cnVjdCBvbGRfbGludXhfZGlyZW50Oworc3RydWN0IHBlcmZfY291bnRlcl9hdHRyOwogCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW51eC9haW9fYWJpLmg+CkBAIC03NTUsNCArNzU2LDggQEAKIAogaW50IGtlcm5lbF9leGVjdmUoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNoYXIgKmNvbnN0IGFyZ3ZbXSwgY2hhciAqY29uc3QgZW52cFtdKTsKIAorCithc21saW5rYWdlIGxvbmcgc3lzX3BlcmZfY291bnRlcl9vcGVuKAorCQljb25zdCBzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgX191c2VyICphdHRyX3VwdHIsCisJCXBpZF90IHBpZCwgaW50IGNwdSwgaW50IGdyb3VwX2ZkLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC90aHJlYWRfaW5mby5oIGIvaW5jbHVkZS9saW51eC90aHJlYWRfaW5mby5oCmluZGV4IGU2YjgyMGYuLmE4Y2M0ZTEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdGhyZWFkX2luZm8uaAorKysgYi9pbmNsdWRlL2xpbnV4L3RocmVhZF9pbmZvLmgKQEAgLTIxLDEzICsyMSwxNCBAQAogCQlzdHJ1Y3QgewogCQkJdW5zaWduZWQgbG9uZyBhcmcwLCBhcmcxLCBhcmcyLCBhcmczOwogCQl9OwotCQkvKiBGb3IgZnV0ZXhfd2FpdCAqLworCQkvKiBGb3IgZnV0ZXhfd2FpdCBhbmQgZnV0ZXhfd2FpdF9yZXF1ZXVlX3BpICovCiAJCXN0cnVjdCB7CiAJCQl1MzIgKnVhZGRyOwogCQkJdTMyIHZhbDsKIAkJCXUzMiBmbGFnczsKIAkJCXUzMiBiaXRzZXQ7CiAJCQl1NjQgdGltZTsKKwkJCXUzMiAqdWFkZHIyOwogCQl9IGZ1dGV4OwogCQkvKiBGb3IgbmFub3NsZWVwICovCiAJCXN0cnVjdCB7CmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RyYWNlX3NlcS5oIGIvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjhiY2NiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9saW51eC90cmFjZV9zZXEuaApAQCAtMCwwICsxLDkyIEBACisjaWZuZGVmIF9MSU5VWF9UUkFDRV9TRVFfSAorI2RlZmluZSBfTElOVVhfVFJBQ0VfU0VRX0gKKworI2luY2x1ZGUgPGxpbnV4L2ZzLmg+CisKKy8qCisgKiBUcmFjZSBzZXF1ZW5jZXMgYXJlIHVzZWQgdG8gYWxsb3cgYSBmdW5jdGlvbiB0byBjYWxsIHNldmVyYWwgb3RoZXIgZnVuY3Rpb25zCisgKiB0byBjcmVhdGUgYSBzdHJpbmcgb2YgZGF0YSB0byB1c2UgKHVwIHRvIGEgbWF4IG9mIFBBR0VfU0laRS4KKyAqLworCitzdHJ1Y3QgdHJhY2Vfc2VxIHsKKwl1bnNpZ25lZCBjaGFyCQlidWZmZXJbUEFHRV9TSVpFXTsKKwl1bnNpZ25lZCBpbnQJCWxlbjsKKwl1bnNpZ25lZCBpbnQJCXJlYWRwb3M7Cit9OworCitzdGF0aWMgaW5saW5lIHZvaWQKK3RyYWNlX3NlcV9pbml0KHN0cnVjdCB0cmFjZV9zZXEgKnMpCit7CisJcy0+bGVuID0gMDsKKwlzLT5yZWFkcG9zID0gMDsKK30KKworLyoKKyAqIEN1cnJlbnRseSBvbmx5IGRlZmluZWQgd2hlbiB0cmFjaW5nIGlzIGVuYWJsZWQuCisgKi8KKyNpZmRlZiBDT05GSUdfVFJBQ0lORworZXh0ZXJuIGludCB0cmFjZV9zZXFfcHJpbnRmKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorCV9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VxX3ZwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpCisJX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAwKSkpOworZXh0ZXJuIGludAordHJhY2Vfc2VxX2JwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCBjb25zdCB1MzIgKmJpbmFyeSk7CitleHRlcm4gdm9pZCB0cmFjZV9wcmludF9zZXEoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKK2V4dGVybiBzc2l6ZV90IHRyYWNlX3NlcV90b191c2VyKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNoYXIgX191c2VyICp1YnVmLAorCQkJCSBzaXplX3QgY250KTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dHMoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqc3RyKTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dGMoc3RydWN0IHRyYWNlX3NlcSAqcywgdW5zaWduZWQgY2hhciBjKTsKK2V4dGVybiBpbnQgdHJhY2Vfc2VxX3B1dG1lbShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW4pOworZXh0ZXJuIGludCB0cmFjZV9zZXFfcHV0bWVtX2hleChzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sCisJCQkJc2l6ZV90IGxlbik7CitleHRlcm4gdm9pZCAqdHJhY2Vfc2VxX3Jlc2VydmUoc3RydWN0IHRyYWNlX3NlcSAqcywgc2l6ZV90IGxlbik7CitleHRlcm4gaW50IHRyYWNlX3NlcV9wYXRoKHN0cnVjdCB0cmFjZV9zZXEgKnMsIHN0cnVjdCBwYXRoICpwYXRoKTsKKworI2Vsc2UgLyogQ09ORklHX1RSQUNJTkcgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHRyYWNlX3NlcV9wcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludAordHJhY2Vfc2VxX2JwcmludGYoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3QgY2hhciAqZm10LCBjb25zdCB1MzIgKmJpbmFyeSkKK3sKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHRyYWNlX3ByaW50X3NlcShzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCB0cmFjZV9zZXEgKnMpCit7Cit9CitzdGF0aWMgaW5saW5lIHNzaXplX3QgdHJhY2Vfc2VxX3RvX3VzZXIoc3RydWN0IHRyYWNlX3NlcSAqcywgY2hhciBfX3VzZXIgKnVidWYsCisJCQkJIHNpemVfdCBjbnQpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9zZXFfcHV0cyhzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9zZXFfcHV0YyhzdHJ1Y3QgdHJhY2Vfc2VxICpzLCB1bnNpZ25lZCBjaGFyIGMpCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludAordHJhY2Vfc2VxX3B1dG1lbShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9zZXFfcHV0bWVtX2hleChzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCB2b2lkICptZW0sCisJCQkJICAgICAgIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIDA7Cit9CitzdGF0aWMgaW5saW5lIHZvaWQgKnRyYWNlX3NlcV9yZXNlcnZlKHN0cnVjdCB0cmFjZV9zZXEgKnMsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuIE5VTEw7Cit9CitzdGF0aWMgaW5saW5lIGludCB0cmFjZV9zZXFfcGF0aChzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBzdHJ1Y3QgcGF0aCAqcGF0aCkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfVFJBQ0lORyAqLworCisjZW5kaWYgLyogX0xJTlVYX1RSQUNFX1NFUV9IICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3RyYWNlcG9pbnQuaCBiL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCmluZGV4IGQzNWE3ZWUuLjE0ZGY3ZTYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCisrKyBiL2luY2x1ZGUvbGludXgvdHJhY2Vwb2ludC5oCkBAIC0zMSw2ICszMSw4IEBACiAJCQkJCSAqIEtlZXAgaW4gc3luYyB3aXRoIHZtbGludXgubGRzLmguCiAJCQkJCSAqLwogCisjaWZuZGVmIERFQ0xBUkVfVFJBQ0UKKwogI2RlZmluZSBUUF9QUk9UTyhhcmdzLi4uKQlhcmdzCiAjZGVmaW5lIFRQX0FSR1MoYXJncy4uLikJCWFyZ3MKIApAQCAtMTE0LDYgKzExNiw3IEBACiAJc3RydWN0IHRyYWNlcG9pbnQgKmVuZCkKIHsgfQogI2VuZGlmIC8qIENPTkZJR19UUkFDRVBPSU5UUyAqLworI2VuZGlmIC8qIERFQ0xBUkVfVFJBQ0UgKi8KIAogLyoKICAqIENvbm5lY3QgYSBwcm9iZSB0byBhIHRyYWNlcG9pbnQuCkBAIC0xNTQsMTAgKzE1Nyw4IEBACiB9CiAKICNkZWZpbmUgUEFSQU1TKGFyZ3MuLi4pIGFyZ3MKLSNkZWZpbmUgVFJBQ0VfRk9STUFUKG5hbWUsIHByb3RvLCBhcmdzLCBmbXQpCQlcCi0JREVDTEFSRV9UUkFDRShuYW1lLCBQQVJBTVMocHJvdG8pLCBQQVJBTVMoYXJncykpCiAKLQorI2lmbmRlZiBUUkFDRV9FVkVOVAogLyoKICAqIEZvciB1c2Ugd2l0aCB0aGUgVFJBQ0VfRVZFTlQgbWFjcm86CiAgKgpAQCAtMjYyLDUgKzI2Myw2IEBACiAKICNkZWZpbmUgVFJBQ0VfRVZFTlQobmFtZSwgcHJvdG8sIGFyZ3MsIHN0cnVjdCwgYXNzaWduLCBwcmludCkJXAogCURFQ0xBUkVfVFJBQ0UobmFtZSwgUEFSQU1TKHByb3RvKSwgUEFSQU1TKGFyZ3MpKQorI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC93YWl0LmggYi9pbmNsdWRlL2xpbnV4L3dhaXQuaAppbmRleCBiYzAyNDYzLi42Nzg4ZTFhIDEwMDY0NAotLS0gYS9pbmNsdWRlL2xpbnV4L3dhaXQuaAorKysgYi9pbmNsdWRlL2xpbnV4L3dhaXQuaApAQCAtMTMyLDggKzEzMiw2IEBACiAJbGlzdF9kZWwoJm9sZC0+dGFza19saXN0KTsKIH0KIAotdm9pZCBfX3dha2VfdXBfY29tbW9uKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwKLQkJCWludCBucl9leGNsdXNpdmUsIGludCBzeW5jLCB2b2lkICprZXkpOwogdm9pZCBfX3dha2VfdXAod2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLCBpbnQgbnIsIHZvaWQgKmtleSk7CiB2b2lkIF9fd2FrZV91cF9sb2NrZWRfa2V5KHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwgdm9pZCAqa2V5KTsKIHZvaWQgX193YWtlX3VwX3N5bmNfa2V5KHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwgaW50IG5yLApkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ibG9jay5oIGIvaW5jbHVkZS90cmFjZS9ibG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWI3MDY4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvYmxvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSNpZm5kZWYgX1RSQUNFX0JMT0NLX0gKLSNkZWZpbmUgX1RSQUNFX0JMT0NLX0gKLQotI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgotI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KLQotREVDTEFSRV9UUkFDRShibG9ja19ycV9hYm9ydCwKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKSwKLQkgICAgICBUUF9BUkdTKHEsIHJxKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfcnFfaW5zZXJ0LAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpLAotCSAgICAgIFRQX0FSR1MocSwgcnEpKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19ycV9pc3N1ZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKSwKLQkgICAgICBUUF9BUkdTKHEsIHJxKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfcnFfcmVxdWV1ZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKSwKLQkgICAgICBUUF9BUkdTKHEsIHJxKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfcnFfY29tcGxldGUsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSksCi0JICAgICAgVFBfQVJHUyhxLCBycSkpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX2Jpb19ib3VuY2UsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyksCi0JICAgICAgVFBfQVJHUyhxLCBiaW8pKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19iaW9fY29tcGxldGUsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyksCi0JICAgICAgVFBfQVJHUyhxLCBiaW8pKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19iaW9fYmFja21lcmdlLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAotCSAgICAgIFRQX0FSR1MocSwgYmlvKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfYmlvX2Zyb250bWVyZ2UsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyksCi0JICAgICAgVFBfQVJHUyhxLCBiaW8pKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19iaW9fcXVldWUsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyksCi0JICAgICAgVFBfQVJHUyhxLCBiaW8pKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19nZXRycSwKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLCBpbnQgcncpLAotCSAgICAgIFRQX0FSR1MocSwgYmlvLCBydykpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX3NsZWVwcnEsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgaW50IHJ3KSwKLQkgICAgICBUUF9BUkdTKHEsIGJpbywgcncpKTsKLQotREVDTEFSRV9UUkFDRShibG9ja19wbHVnLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSwKLQkgICAgICBUUF9BUkdTKHEpKTsKLQotREVDTEFSRV9UUkFDRShibG9ja191bnBsdWdfdGltZXIsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpLAotCSAgICAgIFRQX0FSR1MocSkpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX3VucGx1Z19pbywKLQlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSksCi0JICAgICAgVFBfQVJHUyhxKSk7Ci0KLURFQ0xBUkVfVFJBQ0UoYmxvY2tfc3BsaXQsCi0JVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgdW5zaWduZWQgaW50IHBkdSksCi0JICAgICAgVFBfQVJHUyhxLCBiaW8sIHBkdSkpOwotCi1ERUNMQVJFX1RSQUNFKGJsb2NrX3JlbWFwLAotCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8sIGRldl90IGRldiwKLQkJIHNlY3Rvcl90IGZyb20sIHNlY3Rvcl90IHRvKSwKLQkgICAgICBUUF9BUkdTKHEsIGJpbywgZGV2LCBmcm9tLCB0bykpOwotCi0jZW5kaWYKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvZGVmaW5lX3RyYWNlLmggYi9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3YTdhZTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2RlZmluZV90cmFjZS5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBUcmFjZSBmaWxlcyB0aGF0IHdhbnQgdG8gYXV0b21hdGUgY3JlYXRpb25nIG9mIGFsbCB0cmFjZXBvaW50cyBkZWZpbmVkCisgKiBpbiB0aGVpciBmaWxlIHNob3VsZCBpbmNsdWRlIHRoaXMgZmlsZS4gVGhlIGZvbGxvd2luZyBhcmUgbWFjcm9zIHRoYXQgdGhlCisgKiB0cmFjZSBmaWxlIG1heSBkZWZpbmU6CisgKgorICogVFJBQ0VfU1lTVEVNIGRlZmluZXMgdGhlIHN5c3RlbSB0aGUgdHJhY2Vwb2ludCBpcyBmb3IKKyAqCisgKiBUUkFDRV9JTkNMVURFX0ZJTEUgaWYgdGhlIGZpbGUgbmFtZSBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiBUUkFDRV9TWVNURU0uaAorICogICAgIFRoaXMgbWFjcm8gbWF5IGJlIGRlZmluZWQgdG8gdGVsbCBkZWZpbmVfdHJhY2UuaCB3aGF0IGZpbGUgdG8gaW5jbHVkZS4KKyAqICAgICBOb3RlLCBsZWF2ZSBvZmYgdGhlICIuaCIuCisgKgorICogVFJBQ0VfSU5DTFVERV9QQVRIIGlmIHRoZSBwYXRoIGlzIHNvbWV0aGluZyBvdGhlciB0aGFuIGNvcmUga2VybmVsIGluY2x1ZGUvdHJhY2UKKyAqICAgICB0aGVuIHRoaXMgbWFjcm8gY2FuIGRlZmluZSB0aGUgcGF0aCB0byB1c2UuIE5vdGUsIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvCisgKiAgICAgZGVmaW5lX3RyYWNlLmgsIG5vdCB0aGUgZmlsZSBpbmNsdWRpbmcgaXQuIEZ1bGwgcGF0aCBuYW1lcyBmb3Igb3V0IG9mIHRyZWUKKyAqICAgICBtb2R1bGVzIG11c3QgYmUgdXNlZC4KKyAqLworCisjaWZkZWYgQ1JFQVRFX1RSQUNFX1BPSU5UUworCisvKiBQcmV2ZW50IHJlY3Vyc2lvbiAqLworI3VuZGVmIENSRUFURV9UUkFDRV9QT0lOVFMKKworI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgorCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQobmFtZSwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCVwKKwlERUZJTkVfVFJBQ0UobmFtZSkKKworI3VuZGVmIERFQ0xBUkVfVFJBQ0UKKyNkZWZpbmUgREVDTEFSRV9UUkFDRShuYW1lLCBwcm90bywgYXJncykJXAorCURFRklORV9UUkFDRShuYW1lKQorCisjdW5kZWYgVFJBQ0VfSU5DTFVERQorI3VuZGVmIF9fVFJBQ0VfSU5DTFVERQorCisjaWZuZGVmIFRSQUNFX0lOQ0xVREVfRklMRQorIyBkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIFRSQUNFX1NZU1RFTQorIyBkZWZpbmUgVU5ERUZfVFJBQ0VfSU5DTFVERV9GSUxFCisjZW5kaWYKKworI2lmbmRlZiBUUkFDRV9JTkNMVURFX1BBVEgKKyMgZGVmaW5lIF9fVFJBQ0VfSU5DTFVERShzeXN0ZW0pIDx0cmFjZS9ldmVudHMvc3lzdGVtLmg+CisjIGRlZmluZSBVTkRFRl9UUkFDRV9JTkNMVURFX1BBVEgKKyNlbHNlCisjIGRlZmluZSBfX1RSQUNFX0lOQ0xVREUoc3lzdGVtKSBfX3N0cmluZ2lmeShUUkFDRV9JTkNMVURFX1BBVEgvc3lzdGVtLmgpCisjZW5kaWYKKworIyBkZWZpbmUgVFJBQ0VfSU5DTFVERShzeXN0ZW0pIF9fVFJBQ0VfSU5DTFVERShzeXN0ZW0pCisKKy8qIExldCB0aGUgdHJhY2UgaGVhZGVycyBiZSByZXJlYWQgKi8KKyNkZWZpbmUgVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQKKworI2luY2x1ZGUgVFJBQ0VfSU5DTFVERShUUkFDRV9JTkNMVURFX0ZJTEUpCisKKyNpZmRlZiBDT05GSUdfRVZFTlRfVFJBQ0lORworI2luY2x1ZGUgPHRyYWNlL2Z0cmFjZS5oPgorI2VuZGlmCisKKyN1bmRlZiBUUkFDRV9IRUFERVJfTVVMVElfUkVBRAorCisvKiBPbmx5IHVuZGVmIHdoYXQgd2UgZGVmaW5lZCBpbiB0aGlzIGZpbGUgKi8KKyNpZmRlZiBVTkRFRl9UUkFDRV9JTkNMVURFX0ZJTEUKKyMgdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCisjIHVuZGVmIFVOREVGX1RSQUNFX0lOQ0xVREVfRklMRQorI2VuZGlmCisKKyNpZmRlZiBVTkRFRl9UUkFDRV9JTkNMVURFX1BBVEgKKyMgdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjIHVuZGVmIFVOREVGX1RSQUNFX0lOQ0xVREVfUEFUSAorI2VuZGlmCisKKy8qIFdlIG1heSBiZSBwcm9jZXNzaW5nIG1vcmUgZmlsZXMgKi8KKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworCisjZW5kaWYgLyogQ1JFQVRFX1RSQUNFX1BPSU5UUyAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvYmxvY2suaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNlZmZkNAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2Jsb2NrLmgKQEAgLTAsMCArMSw0OTggQEAKKyNpZiAhZGVmaW5lZChfVFJBQ0VfQkxPQ0tfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0JMT0NLX0gKKworI2luY2x1ZGUgPGxpbnV4L2Jsa3RyYWNlX2FwaS5oPgorI2luY2x1ZGUgPGxpbnV4L2Jsa2Rldi5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gYmxvY2sKKworVFJBQ0VfRVZFTlQoYmxvY2tfcnFfYWJvcnQsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IHJlcXVlc3QgKnJxKSwKKworCVRQX0FSR1MocSwgcnEpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggIGRldl90LAlkZXYJCQkpCisJCV9fZmllbGQoICBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCAgdW5zaWduZWQgaW50LAlucl9zZWN0b3IJCSkKKwkJX19maWVsZCggIGludCwJCWVycm9ycwkJCSkKKwkJX19hcnJheSggIGNoYXIsCQlyd2JzLAk2CQkpCisJCV9fZHluYW1pY19hcnJheSggY2hhciwJY21kLAlibGtfY21kX2J1Zl9sZW4ocnEpCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkgICA9IHJxLT5ycV9kaXNrID8gZGlza19kZXZ0KHJxLT5ycV9kaXNrKSA6IDA7CisJCV9fZW50cnktPnNlY3RvciAgICA9IGJsa19wY19yZXF1ZXN0KHJxKSA/IDAgOiBycS0+aGFyZF9zZWN0b3I7CisJCV9fZW50cnktPm5yX3NlY3RvciA9IGJsa19wY19yZXF1ZXN0KHJxKSA/CisJCQkJCQkwIDogcnEtPmhhcmRfbnJfc2VjdG9yczsKKwkJX19lbnRyeS0+ZXJyb3JzICAgID0gcnEtPmVycm9yczsKKworCQlibGtfZmlsbF9yd2JzX3JxKF9fZW50cnktPnJ3YnMsIHJxKTsKKwkJYmxrX2R1bXBfY21kKF9fZ2V0X3N0cihjbWQpLCBycSk7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgKCVzKSAlbGx1ICsgJXUgWyVkXSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwKKwkJICBfX2VudHJ5LT5yd2JzLCBfX2dldF9zdHIoY21kKSwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsIF9fZW50cnktPmVycm9ycykKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3JxX2luc2VydCwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpLAorCisJVFBfQVJHUyhxLCBycSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCAgZGV2X3QsCWRldgkJCSkKKwkJX19maWVsZCggIHNlY3Rvcl90LAlzZWN0b3IJCQkpCisJCV9fZmllbGQoICB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2ZpZWxkKCAgdW5zaWduZWQgaW50LAlieXRlcwkJCSkKKwkJX19hcnJheSggIGNoYXIsCQlyd2JzLAk2CQkpCisJCV9fYXJyYXkoICBjaGFyLCAgICAgICAgIGNvbW0sICAgVEFTS19DT01NX0xFTiAgICkKKwkJX19keW5hbWljX2FycmF5KCBjaGFyLAljbWQsCWJsa19jbWRfYnVmX2xlbihycSkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CSAgID0gcnEtPnJxX2Rpc2sgPyBkaXNrX2RldnQocnEtPnJxX2Rpc2spIDogMDsKKwkJX19lbnRyeS0+c2VjdG9yICAgID0gYmxrX3BjX3JlcXVlc3QocnEpID8gMCA6IHJxLT5oYXJkX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yID0gYmxrX3BjX3JlcXVlc3QocnEpID8KKwkJCQkJCTAgOiBycS0+aGFyZF9ucl9zZWN0b3JzOworCQlfX2VudHJ5LT5ieXRlcyAgICAgPSBibGtfcGNfcmVxdWVzdChycSkgPyBycS0+ZGF0YV9sZW4gOiAwOworCisJCWJsa19maWxsX3J3YnNfcnEoX19lbnRyeS0+cndicywgcnEpOworCQlibGtfZHVtcF9jbWQoX19nZXRfc3RyKGNtZCksIHJxKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICV1ICglcykgJWxsdSArICV1IFslc10iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+cndicywgX19lbnRyeS0+Ynl0ZXMsIF9fZ2V0X3N0cihjbWQpLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3JxX2lzc3VlLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSksCisKKwlUUF9BUkdTKHEsIHJxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoICBkZXZfdCwJZGV2CQkJKQorCQlfX2ZpZWxkKCAgc2VjdG9yX3QsCXNlY3RvcgkJCSkKKwkJX19maWVsZCggIHVuc2lnbmVkIGludCwJbnJfc2VjdG9yCQkpCisJCV9fZmllbGQoICB1bnNpZ25lZCBpbnQsCWJ5dGVzCQkJKQorCQlfX2FycmF5KCAgY2hhciwJCXJ3YnMsCTYJCSkKKwkJX19hcnJheSggIGNoYXIsCQljb21tLCAgIFRBU0tfQ09NTV9MRU4gICApCisJCV9fZHluYW1pY19hcnJheSggY2hhciwJY21kLAlibGtfY21kX2J1Zl9sZW4ocnEpCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkgICA9IHJxLT5ycV9kaXNrID8gZGlza19kZXZ0KHJxLT5ycV9kaXNrKSA6IDA7CisJCV9fZW50cnktPnNlY3RvciAgICA9IGJsa19wY19yZXF1ZXN0KHJxKSA/IDAgOiBycS0+aGFyZF9zZWN0b3I7CisJCV9fZW50cnktPm5yX3NlY3RvciA9IGJsa19wY19yZXF1ZXN0KHJxKSA/CisJCQkJCQkwIDogcnEtPmhhcmRfbnJfc2VjdG9yczsKKwkJX19lbnRyeS0+Ynl0ZXMgICAgID0gYmxrX3BjX3JlcXVlc3QocnEpID8gcnEtPmRhdGFfbGVuIDogMDsKKworCQlibGtfZmlsbF9yd2JzX3JxKF9fZW50cnktPnJ3YnMsIHJxKTsKKwkJYmxrX2R1bXBfY21kKF9fZ2V0X3N0cihjbWQpLCBycSk7CisJCW1lbWNweShfX2VudHJ5LT5jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAldSAoJXMpICVsbHUgKyAldSBbJXNdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPnJ3YnMsIF9fZW50cnktPmJ5dGVzLCBfX2dldF9zdHIoY21kKSwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsIF9fZW50cnktPmNvbW0pCispOworCitUUkFDRV9FVkVOVChibG9ja19ycV9yZXF1ZXVlLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCByZXF1ZXN0ICpycSksCisKKwlUUF9BUkdTKHEsIHJxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoICBkZXZfdCwJZGV2CQkJKQorCQlfX2ZpZWxkKCAgc2VjdG9yX3QsCXNlY3RvcgkJCSkKKwkJX19maWVsZCggIHVuc2lnbmVkIGludCwJbnJfc2VjdG9yCQkpCisJCV9fZmllbGQoICBpbnQsCQllcnJvcnMJCQkpCisJCV9fYXJyYXkoICBjaGFyLAkJcndicywJNgkJKQorCQlfX2R5bmFtaWNfYXJyYXkoIGNoYXIsCWNtZCwJYmxrX2NtZF9idWZfbGVuKHJxKQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJICAgPSBycS0+cnFfZGlzayA/IGRpc2tfZGV2dChycS0+cnFfZGlzaykgOiAwOworCQlfX2VudHJ5LT5zZWN0b3IgICAgPSBibGtfcGNfcmVxdWVzdChycSkgPyAwIDogcnEtPmhhcmRfc2VjdG9yOworCQlfX2VudHJ5LT5ucl9zZWN0b3IgPSBibGtfcGNfcmVxdWVzdChycSkgPworCQkJCQkJMCA6IHJxLT5oYXJkX25yX3NlY3RvcnM7CisJCV9fZW50cnktPmVycm9ycwkgICA9IHJxLT5lcnJvcnM7CisKKwkJYmxrX2ZpbGxfcndic19ycShfX2VudHJ5LT5yd2JzLCBycSk7CisJCWJsa19kdW1wX2NtZChfX2dldF9zdHIoY21kKSwgcnEpOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICglcykgJWxsdSArICV1IFslZF0iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksCisJCSAgX19lbnRyeS0+cndicywgX19nZXRfc3RyKGNtZCksCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5lcnJvcnMpCispOworCitUUkFDRV9FVkVOVChibG9ja19ycV9jb21wbGV0ZSwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgcmVxdWVzdCAqcnEpLAorCisJVFBfQVJHUyhxLCBycSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCAgZGV2X3QsCWRldgkJCSkKKwkJX19maWVsZCggIHNlY3Rvcl90LAlzZWN0b3IJCQkpCisJCV9fZmllbGQoICB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2ZpZWxkKCAgaW50LAkJZXJyb3JzCQkJKQorCQlfX2FycmF5KCAgY2hhciwJCXJ3YnMsCTYJCSkKKwkJX19keW5hbWljX2FycmF5KCBjaGFyLAljbWQsCWJsa19jbWRfYnVmX2xlbihycSkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CSAgID0gcnEtPnJxX2Rpc2sgPyBkaXNrX2RldnQocnEtPnJxX2Rpc2spIDogMDsKKwkJX19lbnRyeS0+c2VjdG9yICAgID0gYmxrX3BjX3JlcXVlc3QocnEpID8gMCA6IHJxLT5oYXJkX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yID0gYmxrX3BjX3JlcXVlc3QocnEpID8KKwkJCQkJCTAgOiBycS0+aGFyZF9ucl9zZWN0b3JzOworCQlfX2VudHJ5LT5lcnJvcnMgICAgPSBycS0+ZXJyb3JzOworCisJCWJsa19maWxsX3J3YnNfcnEoX19lbnRyeS0+cndicywgcnEpOworCQlibGtfZHVtcF9jbWQoX19nZXRfc3RyKGNtZCksIHJxKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAoJXMpICVsbHUgKyAldSBbJWRdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLAorCQkgIF9fZW50cnktPnJ3YnMsIF9fZ2V0X3N0cihjbWQpLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+ZXJyb3JzKQorKTsKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19ib3VuY2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKSwKKworCVRQX0FSR1MocSwgYmlvKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKCBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCBjaGFyLAkJY29tbSwJVEFTS19DT01NX0xFTgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9zaXplKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICVsbHUgKyAldSBbJXNdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yd2JzLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19jb21wbGV0ZSwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAorCisJVFBfQVJHUyhxLCBiaW8pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggZGV2X3QsCQlkZXYJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCXNlY3RvcgkJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCwJbnJfc2VjdG9yCSkKKwkJX19maWVsZCggaW50LAkJZXJyb3IJCSkKKwkJX19hcnJheSggY2hhciwJCXJ3YnMsCTYJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGJpby0+YmlfYmRldi0+YmRfZGV2OworCQlfX2VudHJ5LT5zZWN0b3IJCT0gYmlvLT5iaV9zZWN0b3I7CisJCV9fZW50cnktPm5yX3NlY3Rvcgk9IGJpby0+Ymlfc2l6ZSA+PiA5OworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSArICV1IFslZF0iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksIF9fZW50cnktPnJ3YnMsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5lcnJvcikKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19iYWNrbWVyZ2UsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvKSwKKworCVRQX0FSR1MocSwgYmlvKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKCBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCBjaGFyLAkJY29tbSwJVEFTS19DT01NX0xFTgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9zaXplKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICVsbHUgKyAldSBbJXNdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yd2JzLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19mcm9udG1lcmdlLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbyksCisKKwlUUF9BUkdTKHEsIGJpbyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCBkZXZfdCwJCWRldgkJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCXNlY3RvcgkJCSkKKwkJX19maWVsZCggdW5zaWduZWQsCW5yX3NlY3RvcgkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCBjaGFyLAkJY29tbSwJVEFTS19DT01NX0xFTgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCWJsa19maWxsX3J3YnMoX19lbnRyeS0+cndicywgYmlvLT5iaV9ydywgYmlvLT5iaV9zaXplKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIiVkLCVkICVzICVsbHUgKyAldSBbJXNdIiwKKwkJICBNQUpPUihfX2VudHJ5LT5kZXYpLCBNSU5PUihfX2VudHJ5LT5kZXYpLCBfX2VudHJ5LT5yd2JzLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+c2VjdG9yLAorCQkgIF9fZW50cnktPm5yX3NlY3RvciwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX2Jpb19xdWV1ZSwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pLAorCisJVFBfQVJHUyhxLCBiaW8pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCggZGV2X3QsCQlkZXYJCQkpCisJCV9fZmllbGQoIHNlY3Rvcl90LAlzZWN0b3IJCQkpCisJCV9fZmllbGQoIHVuc2lnbmVkIGludCwJbnJfc2VjdG9yCQkpCisJCV9fYXJyYXkoIGNoYXIsCQlyd2JzLAk2CQkpCisJCV9fYXJyYXkoIGNoYXIsCQljb21tLAlUQVNLX0NPTU1fTEVOCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkJPSBiaW8tPmJpX2JkZXYtPmJkX2RldjsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOworCQlfX2VudHJ5LT5ucl9zZWN0b3IJPSBiaW8tPmJpX3NpemUgPj4gOTsKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQltZW1jcHkoX19lbnRyeS0+Y29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSArICV1IFslc10iLAorCQkgIE1BSk9SKF9fZW50cnktPmRldiksIE1JTk9SKF9fZW50cnktPmRldiksIF9fZW50cnktPnJ3YnMsCisJCSAgKHVuc2lnbmVkIGxvbmcgbG9uZylfX2VudHJ5LT5zZWN0b3IsCisJCSAgX19lbnRyeS0+bnJfc2VjdG9yLCBfX2VudHJ5LT5jb21tKQorKTsKKworVFJBQ0VfRVZFTlQoYmxvY2tfZ2V0cnEsCisKKwlUUF9QUk9UTyhzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLCBpbnQgcncpLAorCisJVFBfQVJHUyhxLCBiaW8sIHJ3KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkJKQorCQlfX2ZpZWxkKCBzZWN0b3JfdCwJc2VjdG9yCQkJKQorCQlfX2ZpZWxkKCB1bnNpZ25lZCBpbnQsCW5yX3NlY3RvcgkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkJKQorCQlfX2FycmF5KCBjaGFyLAkJY29tbSwJVEFTS19DT01NX0xFTgkpCisgICAgICAgICksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGJpbyA/IGJpby0+YmlfYmRldi0+YmRfZGV2IDogMDsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpbyA/IGJpby0+Ymlfc2VjdG9yIDogMDsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvID8gYmlvLT5iaV9zaXplID4+IDkgOiAwOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsCisJCQkgICAgICBiaW8gPyBiaW8tPmJpX3J3IDogMCwgX19lbnRyeS0+bnJfc2VjdG9yKTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworICAgICAgICApLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAlbGx1ICsgJXUgWyVzXSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cndicywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsIF9fZW50cnktPmNvbW0pCispOworCitUUkFDRV9FVkVOVChibG9ja19zbGVlcHJxLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgaW50IHJ3KSwKKworCVRQX0FSR1MocSwgYmlvLCBydyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCBkZXZfdCwJCWRldgkJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCXNlY3RvcgkJCSkKKwkJX19maWVsZCggdW5zaWduZWQgaW50LAlucl9zZWN0b3IJCSkKKwkJX19hcnJheSggY2hhciwJCXJ3YnMsCTYJCSkKKwkJX19hcnJheSggY2hhciwJCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+ZGV2CQk9IGJpbyA/IGJpby0+YmlfYmRldi0+YmRfZGV2IDogMDsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpbyA/IGJpby0+Ymlfc2VjdG9yIDogMDsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvID8gYmlvLT5iaV9zaXplID4+IDkgOiAwOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsCisJCQkgICAgYmlvID8gYmlvLT5iaV9ydyA6IDAsIF9fZW50cnktPm5yX3NlY3Rvcik7CisJCW1lbWNweShfX2VudHJ5LT5jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlZCwlZCAlcyAlbGx1ICsgJXUgWyVzXSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cndicywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsIF9fZW50cnktPmNvbW0pCispOworCitUUkFDRV9FVkVOVChibG9ja19wbHVnLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEpLAorCisJVFBfQVJHUyhxKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoIGNoYXIsCQljb21tLAlUQVNLX0NPTU1fTEVOCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCW1lbWNweShfX2VudHJ5LT5jb21tLCBjdXJyZW50LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwkpLAorCisJVFBfcHJpbnRrKCJbJXNdIiwgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3VucGx1Z190aW1lciwKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSwKKworCVRQX0FSR1MocSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCBpbnQsCQlucl9ycQkJCSkKKwkJX19hcnJheSggY2hhciwJCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+bnJfcnEJPSBxLT5ycS5jb3VudFtSRUFEXSArIHEtPnJxLmNvdW50W1dSSVRFXTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIlslc10gJWQiLCBfX2VudHJ5LT5jb21tLCBfX2VudHJ5LT5ucl9ycSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3VucGx1Z19pbywKKworCVRQX1BST1RPKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxKSwKKworCVRQX0FSR1MocSksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKCBpbnQsCQlucl9ycQkJCSkKKwkJX19hcnJheSggY2hhciwJCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+bnJfcnEJPSBxLT5ycS5jb3VudFtSRUFEXSArIHEtPnJxLmNvdW50W1dSSVRFXTsKKwkJbWVtY3B5KF9fZW50cnktPmNvbW0sIGN1cnJlbnQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOworCSksCisKKwlUUF9wcmludGsoIlslc10gJWQiLCBfX2VudHJ5LT5jb21tLCBfX2VudHJ5LT5ucl9ycSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3NwbGl0LAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywKKwkJIHVuc2lnbmVkIGludCBuZXdfc2VjdG9yKSwKKworCVRQX0FSR1MocSwgYmlvLCBuZXdfc2VjdG9yKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCXNlY3RvcgkJCQkpCisJCV9fZmllbGQoIHNlY3Rvcl90LAluZXdfc2VjdG9yCQkJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJCTYJCSkKKwkJX19hcnJheSggY2hhciwJCWNvbW0sCQlUQVNLX0NPTU1fTEVOCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmRldgkJPSBiaW8tPmJpX2JkZXYtPmJkX2RldjsKKwkJX19lbnRyeS0+c2VjdG9yCQk9IGJpby0+Ymlfc2VjdG9yOworCQlfX2VudHJ5LT5uZXdfc2VjdG9yCT0gbmV3X3NlY3RvcjsKKwkJYmxrX2ZpbGxfcndicyhfX2VudHJ5LT5yd2JzLCBiaW8tPmJpX3J3LCBiaW8tPmJpX3NpemUpOworCQltZW1jcHkoX19lbnRyeS0+Y29tbSwgY3VycmVudC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSAvICVsbHUgWyVzXSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cndicywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPm5ld19zZWN0b3IsCisJCSAgX19lbnRyeS0+Y29tbSkKKyk7CisKK1RSQUNFX0VWRU5UKGJsb2NrX3JlbWFwLAorCisJVFBfUFJPVE8oc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIHN0cnVjdCBiaW8gKmJpbywgZGV2X3QgZGV2LAorCQkgc2VjdG9yX3QgZnJvbSksCisKKwlUUF9BUkdTKHEsIGJpbywgZGV2LCBmcm9tKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoIGRldl90LAkJZGV2CQkpCisJCV9fZmllbGQoIHNlY3Rvcl90LAlzZWN0b3IJCSkKKwkJX19maWVsZCggdW5zaWduZWQgaW50LAlucl9zZWN0b3IJKQorCQlfX2ZpZWxkKCBkZXZfdCwJCW9sZF9kZXYJCSkKKwkJX19maWVsZCggc2VjdG9yX3QsCW9sZF9zZWN0b3IJKQorCQlfX2FycmF5KCBjaGFyLAkJcndicywJNgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5kZXYJCT0gYmlvLT5iaV9iZGV2LT5iZF9kZXY7CisJCV9fZW50cnktPnNlY3RvcgkJPSBiaW8tPmJpX3NlY3RvcjsKKwkJX19lbnRyeS0+bnJfc2VjdG9yCT0gYmlvLT5iaV9zaXplID4+IDk7CisJCV9fZW50cnktPm9sZF9kZXYJPSBkZXY7CisJCV9fZW50cnktPm9sZF9zZWN0b3IJPSBmcm9tOworCQlibGtfZmlsbF9yd2JzKF9fZW50cnktPnJ3YnMsIGJpby0+YmlfcncsIGJpby0+Ymlfc2l6ZSk7CisJKSwKKworCVRQX3ByaW50aygiJWQsJWQgJXMgJWxsdSArICV1IDwtICglZCwlZCkgJWxsdSIsCisJCSAgTUFKT1IoX19lbnRyeS0+ZGV2KSwgTUlOT1IoX19lbnRyeS0+ZGV2KSwgX19lbnRyeS0+cndicywKKwkJICAodW5zaWduZWQgbG9uZyBsb25nKV9fZW50cnktPnNlY3RvciwKKwkJICBfX2VudHJ5LT5ucl9zZWN0b3IsCisJCSAgTUFKT1IoX19lbnRyeS0+b2xkX2RldiksIE1JTk9SKF9fZW50cnktPm9sZF9kZXYpLAorCQkgICh1bnNpZ25lZCBsb25nIGxvbmcpX19lbnRyeS0+b2xkX3NlY3RvcikKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfQkxPQ0tfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9pcnEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGM3ZWRlCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvaXJxLmgKQEAgLTAsMCArMSwxNDUgQEAKKyNpZiAhZGVmaW5lZChfVFJBQ0VfSVJRX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9JUlFfSAorCisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBpcnEKKworI2RlZmluZSBzb2Z0aXJxX25hbWUoc2lycSkgeyBzaXJxIyNfU09GVElSUSwgI3NpcnEgfQorI2RlZmluZSBzaG93X3NvZnRpcnFfbmFtZSh2YWwpCQkJXAorCV9fcHJpbnRfc3ltYm9saWModmFsLAkJCVwKKwkJCSBzb2Z0aXJxX25hbWUoSEkpLAlcCisJCQkgc29mdGlycV9uYW1lKFRJTUVSKSwJXAorCQkJIHNvZnRpcnFfbmFtZShORVRfVFgpLAlcCisJCQkgc29mdGlycV9uYW1lKE5FVF9SWCksCVwKKwkJCSBzb2Z0aXJxX25hbWUoQkxPQ0spLAlcCisJCQkgc29mdGlycV9uYW1lKFRBU0tMRVQpLAlcCisJCQkgc29mdGlycV9uYW1lKFNDSEVEKSwJXAorCQkJIHNvZnRpcnFfbmFtZShIUlRJTUVSKSwJXAorCQkJIHNvZnRpcnFfbmFtZShSQ1UpKQorCisvKioKKyAqIGlycV9oYW5kbGVyX2VudHJ5IC0gY2FsbGVkIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgaXJxIGFjdGlvbiBoYW5kbGVyCisgKiBAaXJxOiBpcnEgbnVtYmVyCisgKiBAYWN0aW9uOiBwb2ludGVyIHRvIHN0cnVjdCBpcnFhY3Rpb24KKyAqCisgKiBUaGUgc3RydWN0IGlycWFjdGlvbiBwb2ludGVkIHRvIGJ5IEBhY3Rpb24gY29udGFpbnMgdmFyaW91cworICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIGhhbmRsZXIsIGluY2x1ZGluZyB0aGUgZGV2aWNlIG5hbWUsCisgKiBAYWN0aW9uLT5uYW1lLCBhbmQgdGhlIGRldmljZSBpZCwgQGFjdGlvbi0+ZGV2X2lkLiBXaGVuIHVzZWQgaW4KKyAqIGNvbmp1bmN0aW9uIHdpdGggdGhlIGlycV9oYW5kbGVyX2V4aXQgdHJhY2Vwb2ludCwgd2UgY2FuIGZpZ3VyZQorICogb3V0IGlycSBoYW5kbGVyIGxhdGVuY2llcy4KKyAqLworVFJBQ0VfRVZFTlQoaXJxX2hhbmRsZXJfZW50cnksCisKKwlUUF9QUk9UTyhpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pLAorCisJVFBfQVJHUyhpcnEsIGFjdGlvbiksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAlpbnQsCWlycQkJKQorCQlfX3N0cmluZygJbmFtZSwJYWN0aW9uLT5uYW1lCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmlycSA9IGlycTsKKwkJX19hc3NpZ25fc3RyKG5hbWUsIGFjdGlvbi0+bmFtZSk7CisJKSwKKworCVRQX3ByaW50aygiaXJxPSVkIGhhbmRsZXI9JXMiLCBfX2VudHJ5LT5pcnEsIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKKy8qKgorICogaXJxX2hhbmRsZXJfZXhpdCAtIGNhbGxlZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgaXJxIGFjdGlvbiBoYW5kbGVyIHJldHVybnMKKyAqIEBpcnE6IGlycSBudW1iZXIKKyAqIEBhY3Rpb246IHBvaW50ZXIgdG8gc3RydWN0IGlycWFjdGlvbgorICogQHJldDogcmV0dXJuIHZhbHVlCisgKgorICogSWYgdGhlIEByZXQgdmFsdWUgaXMgc2V0IHRvIElSUV9IQU5ETEVELCB0aGVuIHdlIGtub3cgdGhhdCB0aGUgY29ycmVzcG9uZGluZworICogQGFjdGlvbi0+aGFuZGxlciBzY3VjY2Vzc3VsbHkgaGFuZGxlZCB0aGlzIGlycS4gT3RoZXJ3aXNlLCB0aGUgaXJxIG1pZ2h0IGJlCisgKiBhIHNoYXJlZCBpcnEgbGluZSwgb3IgdGhlIGlycSB3YXMgbm90IGhhbmRsZWQgc3VjY2Vzc2Z1bGx5LiBDYW4gYmUgdXNlZCBpbgorICogY29uanVuY3Rpb24gd2l0aCB0aGUgaXJxX2hhbmRsZXJfZW50cnkgdG8gdW5kZXJzdGFuZCBpcnEgaGFuZGxlciBsYXRlbmNpZXMuCisgKi8KK1RSQUNFX0VWRU5UKGlycV9oYW5kbGVyX2V4aXQsCisKKwlUUF9QUk9UTyhpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24sIGludCByZXQpLAorCisJVFBfQVJHUyhpcnEsIGFjdGlvbiwgcmV0KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCWludCwJaXJxCSkKKwkJX19maWVsZCgJaW50LAlyZXQJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+aXJxCT0gaXJxOworCQlfX2VudHJ5LT5yZXQJPSByZXQ7CisJKSwKKworCVRQX3ByaW50aygiaXJxPSVkIHJldHVybj0lcyIsCisJCSAgX19lbnRyeS0+aXJxLCBfX2VudHJ5LT5yZXQgPyAiaGFuZGxlZCIgOiAidW5oYW5kbGVkIikKKyk7CisKKy8qKgorICogc29mdGlycV9lbnRyeSAtIGNhbGxlZCBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIHNvZnRpcnEgaGFuZGxlcgorICogQGg6IHBvaW50ZXIgdG8gc3RydWN0IHNvZnRpcnFfYWN0aW9uCisgKiBAdmVjOiBwb2ludGVyIHRvIGZpcnN0IHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiBpbiBzb2Z0aXJxX3ZlYyBhcnJheQorICoKKyAqIFRoZSBAaCBwYXJhbWV0ZXIsIGNvbnRhaW5zIGEgcG9pbnRlciB0byB0aGUgc3RydWN0IHNvZnRpcnFfYWN0aW9uCisgKiB3aGljaCBoYXMgYSBwb2ludGVyIHRvIHRoZSBhY3Rpb24gaGFuZGxlciB0aGF0IGlzIGNhbGxlZC4gQnkgc3VidHJhY3RpbmcKKyAqIHRoZSBAdmVjIHBvaW50ZXIgZnJvbSB0aGUgQGggcG9pbnRlciwgd2UgY2FuIGRldGVybWluZSB0aGUgc29mdGlycQorICogbnVtYmVyLiBBbHNvLCB3aGVuIHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCB0aGUgc29mdGlycV9leGl0IHRyYWNlcG9pbnQKKyAqIHdlIGNhbiBkZXRlcm1pbmUgdGhlIHNvZnRpcnEgbGF0ZW5jeS4KKyAqLworVFJBQ0VfRVZFTlQoc29mdGlycV9lbnRyeSwKKworCVRQX1BST1RPKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCwgc3RydWN0IHNvZnRpcnFfYWN0aW9uICp2ZWMpLAorCisJVFBfQVJHUyhoLCB2ZWMpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAl2ZWMJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT52ZWMgPSAoaW50KShoIC0gdmVjKTsKKwkpLAorCisJVFBfcHJpbnRrKCJzb2Z0aXJxPSVkIGFjdGlvbj0lcyIsIF9fZW50cnktPnZlYywKKwkJICBzaG93X3NvZnRpcnFfbmFtZShfX2VudHJ5LT52ZWMpKQorKTsKKworLyoqCisgKiBzb2Z0aXJxX2V4aXQgLSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHNvZnRpcnEgaGFuZGxlciByZXR1cm5zCisgKiBAaDogcG9pbnRlciB0byBzdHJ1Y3Qgc29mdGlycV9hY3Rpb24KKyAqIEB2ZWM6IHBvaW50ZXIgdG8gZmlyc3Qgc3RydWN0IHNvZnRpcnFfYWN0aW9uIGluIHNvZnRpcnFfdmVjIGFycmF5CisgKgorICogVGhlIEBoIHBhcmFtZXRlciBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHN0cnVjdCBzb2Z0aXJxX2FjdGlvbgorICogdGhhdCBoYXMgaGFuZGxlZCB0aGUgc29mdGlycS4gQnkgc3VidHJhY3RpbmcgdGhlIEB2ZWMgcG9pbnRlciBmcm9tCisgKiB0aGUgQGggcG9pbnRlciwgd2UgY2FuIGRldGVybWluZSB0aGUgc29mdGlycSBudW1iZXIuIEFsc28sIHdoZW4gdXNlZCBpbgorICogY29tYmluYXRpb24gd2l0aCB0aGUgc29mdGlycV9lbnRyeSB0cmFjZXBvaW50IHdlIGNhbiBkZXRlcm1pbmUgdGhlIHNvZnRpcnEKKyAqIGxhdGVuY3kuCisgKi8KK1RSQUNFX0VWRU5UKHNvZnRpcnFfZXhpdCwKKworCVRQX1BST1RPKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqaCwgc3RydWN0IHNvZnRpcnFfYWN0aW9uICp2ZWMpLAorCisJVFBfQVJHUyhoLCB2ZWMpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJaW50LAl2ZWMJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT52ZWMgPSAoaW50KShoIC0gdmVjKTsKKwkpLAorCisJVFBfcHJpbnRrKCJzb2Z0aXJxPSVkIGFjdGlvbj0lcyIsIF9fZW50cnktPnZlYywKKwkJICBzaG93X3NvZnRpcnFfbmFtZShfX2VudHJ5LT52ZWMpKQorKTsKKworI2VuZGlmIC8qICBfVFJBQ0VfSVJRX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9rbWVtLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9rbWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhYmE1MAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2ttZW0uaApAQCAtMCwwICsxLDIzMSBAQAorI2lmICFkZWZpbmVkKF9UUkFDRV9LTUVNX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9LTUVNX0gKKworI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CisjaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgorCisjdW5kZWYgVFJBQ0VfU1lTVEVNCisjZGVmaW5lIFRSQUNFX1NZU1RFTSBrbWVtCisKKy8qCisgKiBUaGUgb3JkZXIgb2YgdGhlc2UgbWFza3MgaXMgaW1wb3J0YW50LiBNYXRjaGluZyBtYXNrcyB3aWxsIGJlIHNlZW4KKyAqIGZpcnN0IGFuZCB0aGUgbGVmdCBvdmVyIGZsYWdzIHdpbGwgZW5kIHVwIHNob3dpbmcgYnkgdGhlbXNlbHZlcy4KKyAqCisgKiBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZSBHRlBfS0VSTkVMIGJlZm9yZSBHRlBfVVNFUiB3ZSB3aWwgZ2V0OgorICoKKyAqICBHRlBfS0VSTkVMfEdGUF9IQVJEV0FMTAorICoKKyAqIFRodXMgbW9zdCBiaXRzIHNldCBnbyBmaXJzdC4KKyAqLworI2RlZmluZSBzaG93X2dmcF9mbGFncyhmbGFncykJCQkJCQlcCisJKGZsYWdzKSA/IF9fcHJpbnRfZmxhZ3MoZmxhZ3MsICJ8IiwJCQkJXAorCXsodW5zaWduZWQgbG9uZylHRlBfSElHSFVTRVJfTU9WQUJMRSwJIkdGUF9ISUdIVVNFUl9NT1ZBQkxFIn0sIFwKKwl7KHVuc2lnbmVkIGxvbmcpR0ZQX0hJR0hVU0VSLAkJIkdGUF9ISUdIVVNFUiJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKUdGUF9VU0VSLAkJIkdGUF9VU0VSIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKUdGUF9URU1QT1JBUlksCQkiR0ZQX1RFTVBPUkFSWSJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKUdGUF9LRVJORUwsCQkiR0ZQX0tFUk5FTCJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylHRlBfTk9GUywJCSJHRlBfTk9GUyJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylHRlBfQVRPTUlDLAkJIkdGUF9BVE9NSUMifSwJCVwKKwl7KHVuc2lnbmVkIGxvbmcpR0ZQX05PSU8sCQkiR0ZQX05PSU8ifSwJCVwKKwl7KHVuc2lnbmVkIGxvbmcpX19HRlBfSElHSCwJCSJHRlBfSElHSCJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylfX0dGUF9XQUlULAkJIkdGUF9XQUlUIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX0lPLAkJIkdGUF9JTyJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylfX0dGUF9DT0xELAkJIkdGUF9DT0xEIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX05PV0FSTiwJCSJHRlBfTk9XQVJOIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX1JFUEVBVCwJCSJHRlBfUkVQRUFUIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX05PRkFJTCwJCSJHRlBfTk9GQUlMIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX05PUkVUUlksCQkiR0ZQX05PUkVUUlkifSwJCVwKKwl7KHVuc2lnbmVkIGxvbmcpX19HRlBfQ09NUCwJCSJHRlBfQ09NUCJ9LAkJXAorCXsodW5zaWduZWQgbG9uZylfX0dGUF9aRVJPLAkJIkdGUF9aRVJPIn0sCQlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX05PTUVNQUxMT0MsCSJHRlBfTk9NRU1BTExPQyJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX0hBUkRXQUxMLAkJIkdGUF9IQVJEV0FMTCJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX1RISVNOT0RFLAkJIkdGUF9USElTTk9ERSJ9LAlcCisJeyh1bnNpZ25lZCBsb25nKV9fR0ZQX1JFQ0xBSU1BQkxFLAkiR0ZQX1JFQ0xBSU1BQkxFIn0sCVwKKwl7KHVuc2lnbmVkIGxvbmcpX19HRlBfTU9WQUJMRSwJCSJHRlBfTU9WQUJMRSJ9CQlcCisJKSA6ICJHRlBfTk9XQUlUIgorCitUUkFDRV9FVkVOVChrbWFsbG9jLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCisJCSBjb25zdCB2b2lkICpwdHIsCisJCSBzaXplX3QgYnl0ZXNfcmVxLAorCQkgc2l6ZV90IGJ5dGVzX2FsbG9jLAorCQkgZ2ZwX3QgZ2ZwX2ZsYWdzKSwKKworCVRQX0FSR1MoY2FsbF9zaXRlLCBwdHIsIGJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAljYWxsX3NpdGUJKQorCQlfX2ZpZWxkKAljb25zdCB2b2lkICosCXB0cgkJKQorCQlfX2ZpZWxkKAlzaXplX3QsCQlieXRlc19yZXEJKQorCQlfX2ZpZWxkKAlzaXplX3QsCQlieXRlc19hbGxvYwkpCisJCV9fZmllbGQoCWdmcF90LAkJZ2ZwX2ZsYWdzCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNhbGxfc2l0ZQk9IGNhbGxfc2l0ZTsKKwkJX19lbnRyeS0+cHRyCQk9IHB0cjsKKwkJX19lbnRyeS0+Ynl0ZXNfcmVxCT0gYnl0ZXNfcmVxOworCQlfX2VudHJ5LT5ieXRlc19hbGxvYwk9IGJ5dGVzX2FsbG9jOworCQlfX2VudHJ5LT5nZnBfZmxhZ3MJPSBnZnBfZmxhZ3M7CisJKSwKKworCVRQX3ByaW50aygiY2FsbF9zaXRlPSVseCBwdHI9JXAgYnl0ZXNfcmVxPSV6dSBieXRlc19hbGxvYz0lenUgZ2ZwX2ZsYWdzPSVzIiwKKwkJX19lbnRyeS0+Y2FsbF9zaXRlLAorCQlfX2VudHJ5LT5wdHIsCisJCV9fZW50cnktPmJ5dGVzX3JlcSwKKwkJX19lbnRyeS0+Ynl0ZXNfYWxsb2MsCisJCXNob3dfZ2ZwX2ZsYWdzKF9fZW50cnktPmdmcF9mbGFncykpCispOworCitUUkFDRV9FVkVOVChrbWVtX2NhY2hlX2FsbG9jLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCisJCSBjb25zdCB2b2lkICpwdHIsCisJCSBzaXplX3QgYnl0ZXNfcmVxLAorCQkgc2l6ZV90IGJ5dGVzX2FsbG9jLAorCQkgZ2ZwX3QgZ2ZwX2ZsYWdzKSwKKworCVRQX0FSR1MoY2FsbF9zaXRlLCBwdHIsIGJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncyksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAljYWxsX3NpdGUJKQorCQlfX2ZpZWxkKAljb25zdCB2b2lkICosCXB0cgkJKQorCQlfX2ZpZWxkKAlzaXplX3QsCQlieXRlc19yZXEJKQorCQlfX2ZpZWxkKAlzaXplX3QsCQlieXRlc19hbGxvYwkpCisJCV9fZmllbGQoCWdmcF90LAkJZ2ZwX2ZsYWdzCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNhbGxfc2l0ZQk9IGNhbGxfc2l0ZTsKKwkJX19lbnRyeS0+cHRyCQk9IHB0cjsKKwkJX19lbnRyeS0+Ynl0ZXNfcmVxCT0gYnl0ZXNfcmVxOworCQlfX2VudHJ5LT5ieXRlc19hbGxvYwk9IGJ5dGVzX2FsbG9jOworCQlfX2VudHJ5LT5nZnBfZmxhZ3MJPSBnZnBfZmxhZ3M7CisJKSwKKworCVRQX3ByaW50aygiY2FsbF9zaXRlPSVseCBwdHI9JXAgYnl0ZXNfcmVxPSV6dSBieXRlc19hbGxvYz0lenUgZ2ZwX2ZsYWdzPSVzIiwKKwkJX19lbnRyeS0+Y2FsbF9zaXRlLAorCQlfX2VudHJ5LT5wdHIsCisJCV9fZW50cnktPmJ5dGVzX3JlcSwKKwkJX19lbnRyeS0+Ynl0ZXNfYWxsb2MsCisJCXNob3dfZ2ZwX2ZsYWdzKF9fZW50cnktPmdmcF9mbGFncykpCispOworCitUUkFDRV9FVkVOVChrbWFsbG9jX25vZGUsCisKKwlUUF9QUk9UTyh1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwKKwkJIGNvbnN0IHZvaWQgKnB0ciwKKwkJIHNpemVfdCBieXRlc19yZXEsCisJCSBzaXplX3QgYnl0ZXNfYWxsb2MsCisJCSBnZnBfdCBnZnBfZmxhZ3MsCisJCSBpbnQgbm9kZSksCisKKwlUUF9BUkdTKGNhbGxfc2l0ZSwgcHRyLCBieXRlc19yZXEsIGJ5dGVzX2FsbG9jLCBnZnBfZmxhZ3MsIG5vZGUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdW5zaWduZWQgbG9uZywJY2FsbF9zaXRlCSkKKwkJX19maWVsZCgJY29uc3Qgdm9pZCAqLAlwdHIJCSkKKwkJX19maWVsZCgJc2l6ZV90LAkJYnl0ZXNfcmVxCSkKKwkJX19maWVsZCgJc2l6ZV90LAkJYnl0ZXNfYWxsb2MJKQorCQlfX2ZpZWxkKAlnZnBfdCwJCWdmcF9mbGFncwkpCisJCV9fZmllbGQoCWludCwJCW5vZGUJCSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fZW50cnktPmNhbGxfc2l0ZQk9IGNhbGxfc2l0ZTsKKwkJX19lbnRyeS0+cHRyCQk9IHB0cjsKKwkJX19lbnRyeS0+Ynl0ZXNfcmVxCT0gYnl0ZXNfcmVxOworCQlfX2VudHJ5LT5ieXRlc19hbGxvYwk9IGJ5dGVzX2FsbG9jOworCQlfX2VudHJ5LT5nZnBfZmxhZ3MJPSBnZnBfZmxhZ3M7CisJCV9fZW50cnktPm5vZGUJCT0gbm9kZTsKKwkpLAorCisJVFBfcHJpbnRrKCJjYWxsX3NpdGU9JWx4IHB0cj0lcCBieXRlc19yZXE9JXp1IGJ5dGVzX2FsbG9jPSV6dSBnZnBfZmxhZ3M9JXMgbm9kZT0lZCIsCisJCV9fZW50cnktPmNhbGxfc2l0ZSwKKwkJX19lbnRyeS0+cHRyLAorCQlfX2VudHJ5LT5ieXRlc19yZXEsCisJCV9fZW50cnktPmJ5dGVzX2FsbG9jLAorCQlzaG93X2dmcF9mbGFncyhfX2VudHJ5LT5nZnBfZmxhZ3MpLAorCQlfX2VudHJ5LT5ub2RlKQorKTsKKworVFJBQ0VfRVZFTlQoa21lbV9jYWNoZV9hbGxvY19ub2RlLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCisJCSBjb25zdCB2b2lkICpwdHIsCisJCSBzaXplX3QgYnl0ZXNfcmVxLAorCQkgc2l6ZV90IGJ5dGVzX2FsbG9jLAorCQkgZ2ZwX3QgZ2ZwX2ZsYWdzLAorCQkgaW50IG5vZGUpLAorCisJVFBfQVJHUyhjYWxsX3NpdGUsIHB0ciwgYnl0ZXNfcmVxLCBieXRlc19hbGxvYywgZ2ZwX2ZsYWdzLCBub2RlKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVuc2lnbmVkIGxvbmcsCWNhbGxfc2l0ZQkpCisJCV9fZmllbGQoCWNvbnN0IHZvaWQgKiwJcHRyCQkpCisJCV9fZmllbGQoCXNpemVfdCwJCWJ5dGVzX3JlcQkpCisJCV9fZmllbGQoCXNpemVfdCwJCWJ5dGVzX2FsbG9jCSkKKwkJX19maWVsZCgJZ2ZwX3QsCQlnZnBfZmxhZ3MJKQorCQlfX2ZpZWxkKAlpbnQsCQlub2RlCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jYWxsX3NpdGUJPSBjYWxsX3NpdGU7CisJCV9fZW50cnktPnB0cgkJPSBwdHI7CisJCV9fZW50cnktPmJ5dGVzX3JlcQk9IGJ5dGVzX3JlcTsKKwkJX19lbnRyeS0+Ynl0ZXNfYWxsb2MJPSBieXRlc19hbGxvYzsKKwkJX19lbnRyeS0+Z2ZwX2ZsYWdzCT0gZ2ZwX2ZsYWdzOworCQlfX2VudHJ5LT5ub2RlCQk9IG5vZGU7CisJKSwKKworCVRQX3ByaW50aygiY2FsbF9zaXRlPSVseCBwdHI9JXAgYnl0ZXNfcmVxPSV6dSBieXRlc19hbGxvYz0lenUgZ2ZwX2ZsYWdzPSVzIG5vZGU9JWQiLAorCQlfX2VudHJ5LT5jYWxsX3NpdGUsCisJCV9fZW50cnktPnB0ciwKKwkJX19lbnRyeS0+Ynl0ZXNfcmVxLAorCQlfX2VudHJ5LT5ieXRlc19hbGxvYywKKwkJc2hvd19nZnBfZmxhZ3MoX19lbnRyeS0+Z2ZwX2ZsYWdzKSwKKwkJX19lbnRyeS0+bm9kZSkKKyk7CisKK1RSQUNFX0VWRU5UKGtmcmVlLAorCisJVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsIGNvbnN0IHZvaWQgKnB0ciksCisKKwlUUF9BUkdTKGNhbGxfc2l0ZSwgcHRyKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fZmllbGQoCXVuc2lnbmVkIGxvbmcsCWNhbGxfc2l0ZQkpCisJCV9fZmllbGQoCWNvbnN0IHZvaWQgKiwJcHRyCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5jYWxsX3NpdGUJPSBjYWxsX3NpdGU7CisJCV9fZW50cnktPnB0cgkJPSBwdHI7CisJKSwKKworCVRQX3ByaW50aygiY2FsbF9zaXRlPSVseCBwdHI9JXAiLCBfX2VudHJ5LT5jYWxsX3NpdGUsIF9fZW50cnktPnB0cikKKyk7CisKK1RSQUNFX0VWRU5UKGttZW1fY2FjaGVfZnJlZSwKKworCVRQX1BST1RPKHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLCBjb25zdCB2b2lkICpwdHIpLAorCisJVFBfQVJHUyhjYWxsX3NpdGUsIHB0ciksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKAl1bnNpZ25lZCBsb25nLAljYWxsX3NpdGUJKQorCQlfX2ZpZWxkKAljb25zdCB2b2lkICosCXB0cgkJKQorCSksCisKKwlUUF9mYXN0X2Fzc2lnbigKKwkJX19lbnRyeS0+Y2FsbF9zaXRlCT0gY2FsbF9zaXRlOworCQlfX2VudHJ5LT5wdHIJCT0gcHRyOworCSksCisKKwlUUF9wcmludGsoImNhbGxfc2l0ZT0lbHggcHRyPSVwIiwgX19lbnRyeS0+Y2FsbF9zaXRlLCBfX2VudHJ5LT5wdHIpCispOworI2VuZGlmIC8qIF9UUkFDRV9LTUVNX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy9sb2NrZGVwLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9sb2NrZGVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU5NTZjOQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL2xvY2tkZXAuaApAQCAtMCwwICsxLDk2IEBACisjaWYgIWRlZmluZWQoX1RSQUNFX0xPQ0tERVBfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX0xPQ0tERVBfSAorCisjaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gbG9ja2RlcAorCisjaWZkZWYgQ09ORklHX0xPQ0tERVAKKworVFJBQ0VfRVZFTlQobG9ja19hY3F1aXJlLAorCisJVFBfUFJPVE8oc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBpbnQgc3ViY2xhc3MsCisJCWludCB0cnlsb2NrLCBpbnQgcmVhZCwgaW50IGNoZWNrLAorCQlzdHJ1Y3QgbG9ja2RlcF9tYXAgKm5leHRfbG9jaywgdW5zaWduZWQgbG9uZyBpcCksCisKKwlUUF9BUkdTKGxvY2ssIHN1YmNsYXNzLCB0cnlsb2NrLCByZWFkLCBjaGVjaywgbmV4dF9sb2NrLCBpcCksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2ZpZWxkKHVuc2lnbmVkIGludCwgZmxhZ3MpCisJCV9fc3RyaW5nKG5hbWUsIGxvY2stPm5hbWUpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5mbGFncyA9ICh0cnlsb2NrID8gMSA6IDApIHwgKHJlYWQgPyAyIDogMCk7CisJCV9fYXNzaWduX3N0cihuYW1lLCBsb2NrLT5uYW1lKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyVzJXMiLCAoX19lbnRyeS0+ZmxhZ3MgJiAxKSA/ICJ0cnkgIiA6ICIiLAorCQkgIChfX2VudHJ5LT5mbGFncyAmIDIpID8gInJlYWQgIiA6ICIiLAorCQkgIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKK1RSQUNFX0VWRU5UKGxvY2tfcmVsZWFzZSwKKworCVRQX1BST1RPKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgaW50IG5lc3RlZCwgdW5zaWduZWQgbG9uZyBpcCksCisKKwlUUF9BUkdTKGxvY2ssIG5lc3RlZCwgaXApLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcobmFtZSwgbG9jay0+bmFtZSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCBsb2NrLT5uYW1lKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKKyNpZmRlZiBDT05GSUdfTE9DS19TVEFUCisKK1RSQUNFX0VWRU5UKGxvY2tfY29udGVuZGVkLAorCisJVFBfUFJPVE8oc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwKSwKKworCVRQX0FSR1MobG9jaywgaXApLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcobmFtZSwgbG9jay0+bmFtZSkKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCV9fYXNzaWduX3N0cihuYW1lLCBsb2NrLT5uYW1lKTsKKwkpLAorCisJVFBfcHJpbnRrKCIlcyIsIF9fZ2V0X3N0cihuYW1lKSkKKyk7CisKK1RSQUNFX0VWRU5UKGxvY2tfYWNxdWlyZWQsCisJVFBfUFJPVE8oc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwLCBzNjQgd2FpdHRpbWUpLAorCisJVFBfQVJHUyhsb2NrLCBpcCwgd2FpdHRpbWUpLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19zdHJpbmcobmFtZSwgbG9jay0+bmFtZSkKKwkJX19maWVsZCh1bnNpZ25lZCBsb25nLCB3YWl0X3VzZWMpCisJCV9fZmllbGQodW5zaWduZWQgbG9uZywgd2FpdF9uc2VjX3JlbSkKKwkpLAorCVRQX2Zhc3RfYXNzaWduKAorCQlfX2Fzc2lnbl9zdHIobmFtZSwgbG9jay0+bmFtZSk7CisJCV9fZW50cnktPndhaXRfbnNlY19yZW0gPSBkb19kaXYod2FpdHRpbWUsIE5TRUNfUEVSX1VTRUMpOworCQlfX2VudHJ5LT53YWl0X3VzZWMgPSAodW5zaWduZWQgbG9uZykgd2FpdHRpbWU7CisJKSwKKwlUUF9wcmludGsoIiVzICglbHUuJTAzbHUgdXMpIiwgX19nZXRfc3RyKG5hbWUpLCBfX2VudHJ5LT53YWl0X3VzZWMsCisJCQkJICAgICAgIF9fZW50cnktPndhaXRfbnNlY19yZW0pCispOworCisjZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogX1RSQUNFX0xPQ0tERVBfSCAqLworCisvKiBUaGlzIHBhcnQgbXVzdCBiZSBvdXRzaWRlIHByb3RlY3Rpb24gKi8KKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2Uvc2NoZWRfZXZlbnRfdHlwZXMuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3NjaGVkLmgKc2ltaWxhcml0eSBpbmRleCA5MCUKcmVuYW1lIGZyb20gaW5jbHVkZS90cmFjZS9zY2hlZF9ldmVudF90eXBlcy5oCnJlbmFtZSB0byBpbmNsdWRlL3RyYWNlL2V2ZW50cy9zY2hlZC5oCmluZGV4IDYzNTQ3ZGMuLjI0YWI1YmMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvdHJhY2Uvc2NoZWRfZXZlbnRfdHlwZXMuaAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9zY2hlZC5oCkBAIC0xLDkgKzEsOCBAQAorI2lmICFkZWZpbmVkKF9UUkFDRV9TQ0hFRF9IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorI2RlZmluZSBfVFJBQ0VfU0NIRURfSAogCi0vKiB1c2UgPHRyYWNlL3NjaGVkLmg+IGluc3RlYWQgKi8KLSNpZm5kZWYgVFJBQ0VfRVZFTlQKLSMgZXJyb3IgRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LgotIyBlcnJvciBVbmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgotI2VuZGlmCisjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CiAKICN1bmRlZiBUUkFDRV9TWVNURU0KICNkZWZpbmUgVFJBQ0VfU1lTVEVNIHNjaGVkCkBAIC0xNTcsNiArMTU2LDcgQEAKIAkJX19hcnJheSgJY2hhciwJcHJldl9jb21tLAlUQVNLX0NPTU1fTEVOCSkKIAkJX19maWVsZCgJcGlkX3QsCXByZXZfcGlkCQkJKQogCQlfX2ZpZWxkKAlpbnQsCXByZXZfcHJpbwkJCSkKKwkJX19maWVsZCgJbG9uZywJcHJldl9zdGF0ZQkJCSkKIAkJX19hcnJheSgJY2hhciwJbmV4dF9jb21tLAlUQVNLX0NPTU1fTEVOCSkKIAkJX19maWVsZCgJcGlkX3QsCW5leHRfcGlkCQkJKQogCQlfX2ZpZWxkKAlpbnQsCW5leHRfcHJpbwkJCSkKQEAgLTE2NiwxMyArMTY2LDE5IEBACiAJCW1lbWNweShfX2VudHJ5LT5uZXh0X2NvbW0sIG5leHQtPmNvbW0sIFRBU0tfQ09NTV9MRU4pOwogCQlfX2VudHJ5LT5wcmV2X3BpZAk9IHByZXYtPnBpZDsKIAkJX19lbnRyeS0+cHJldl9wcmlvCT0gcHJldi0+cHJpbzsKKwkJX19lbnRyeS0+cHJldl9zdGF0ZQk9IHByZXYtPnN0YXRlOwogCQltZW1jcHkoX19lbnRyeS0+cHJldl9jb21tLCBwcmV2LT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKIAkJX19lbnRyeS0+bmV4dF9waWQJPSBuZXh0LT5waWQ7CiAJCV9fZW50cnktPm5leHRfcHJpbwk9IG5leHQtPnByaW87CiAJKSwKIAotCVRQX3ByaW50aygidGFzayAlczolZCBbJWRdID09PiAlczolZCBbJWRdIiwKKwlUUF9wcmludGsoInRhc2sgJXM6JWQgWyVkXSAoJXMpID09PiAlczolZCBbJWRdIiwKIAkJX19lbnRyeS0+cHJldl9jb21tLCBfX2VudHJ5LT5wcmV2X3BpZCwgX19lbnRyeS0+cHJldl9wcmlvLAorCQlfX2VudHJ5LT5wcmV2X3N0YXRlID8KKwkJICBfX3ByaW50X2ZsYWdzKF9fZW50cnktPnByZXZfc3RhdGUsICJ8IiwKKwkJCQl7IDEsICJTIn0gLCB7IDIsICJEIiB9LCB7IDQsICJUIiB9LCB7IDgsICJ0IiB9LAorCQkJCXsgMTYsICJaIiB9LCB7IDMyLCAiWCIgfSwgeyA2NCwgIngiIH0sCisJCQkJeyAxMjgsICJXIiB9KSA6ICJSIiwKIAkJX19lbnRyeS0+bmV4dF9jb21tLCBfX2VudHJ5LT5uZXh0X3BpZCwgX19lbnRyeS0+bmV4dF9wcmlvKQogKTsKIApAQCAtMTgxLDkgKzE4Nyw5IEBACiAgKi8KIFRSQUNFX0VWRU5UKHNjaGVkX21pZ3JhdGVfdGFzaywKIAotCVRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IG9yaWdfY3B1LCBpbnQgZGVzdF9jcHUpLAorCVRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCwgaW50IGRlc3RfY3B1KSwKIAotCVRQX0FSR1MocCwgb3JpZ19jcHUsIGRlc3RfY3B1KSwKKwlUUF9BUkdTKHAsIGRlc3RfY3B1KSwKIAogCVRQX1NUUlVDVF9fZW50cnkoCiAJCV9fYXJyYXkoCWNoYXIsCWNvbW0sCVRBU0tfQ09NTV9MRU4JKQpAQCAtMTk3LDcgKzIwMyw3IEBACiAJCW1lbWNweShfX2VudHJ5LT5jb21tLCBwLT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKIAkJX19lbnRyeS0+cGlkCQk9IHAtPnBpZDsKIAkJX19lbnRyeS0+cHJpbwkJPSBwLT5wcmlvOwotCQlfX2VudHJ5LT5vcmlnX2NwdQk9IG9yaWdfY3B1OworCQlfX2VudHJ5LT5vcmlnX2NwdQk9IHRhc2tfY3B1KHApOwogCQlfX2VudHJ5LT5kZXN0X2NwdQk9IGRlc3RfY3B1OwogCSksCiAKQEAgLTMzNCw0ICszNDAsNyBAQAogCQkgIF9fZW50cnktPnNpZywgX19lbnRyeS0+Y29tbSwgX19lbnRyeS0+cGlkKQogKTsKIAotI3VuZGVmIFRSQUNFX1NZU1RFTQorI2VuZGlmIC8qIF9UUkFDRV9TQ0hFRF9IICovCisKKy8qIFRoaXMgcGFydCBtdXN0IGJlIG91dHNpZGUgcHJvdGVjdGlvbiAqLworI2luY2x1ZGUgPHRyYWNlL2RlZmluZV90cmFjZS5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9ldmVudHMvc2tiLmggYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy9za2IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZThmYWJiCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9ldmVudHMvc2tiLmgKQEAgLTAsMCArMSw0MCBAQAorI2lmICFkZWZpbmVkKF9UUkFDRV9TS0JfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1NLQl9ICisKKyNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKKyN1bmRlZiBUUkFDRV9TWVNURU0KKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIHNrYgorCisvKgorICogVHJhY2Vwb2ludCBmb3IgZnJlZSBhbiBza19idWZmOgorICovCitUUkFDRV9FVkVOVChrZnJlZV9za2IsCisKKwlUUF9QUk9UTyhzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCB2b2lkICpsb2NhdGlvbiksCisKKwlUUF9BUkdTKHNrYiwgbG9jYXRpb24pLAorCisJVFBfU1RSVUNUX19lbnRyeSgKKwkJX19maWVsZCgJdm9pZCAqLAkJc2tiYWRkcgkJKQorCQlfX2ZpZWxkKAl1bnNpZ25lZCBzaG9ydCwJcHJvdG9jb2wJKQorCQlfX2ZpZWxkKAl2b2lkICosCQlsb2NhdGlvbgkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlfX2VudHJ5LT5za2JhZGRyID0gc2tiOworCQlpZiAoc2tiKSB7CisJCQlfX2VudHJ5LT5wcm90b2NvbCA9IG50b2hzKHNrYi0+cHJvdG9jb2wpOworCQl9CisJCV9fZW50cnktPmxvY2F0aW9uID0gbG9jYXRpb247CisJKSwKKworCVRQX3ByaW50aygic2tiYWRkcj0lcCBwcm90b2NvbD0ldSBsb2NhdGlvbj0lcCIsCisJCV9fZW50cnktPnNrYmFkZHIsIF9fZW50cnktPnByb3RvY29sLCBfX2VudHJ5LT5sb2NhdGlvbikKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfU0tCX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2V2ZW50cy93b3JrcXVldWUuaCBiL2luY2x1ZGUvdHJhY2UvZXZlbnRzL3dvcmtxdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzNWYxYmYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3RyYWNlL2V2ZW50cy93b3JrcXVldWUuaApAQCAtMCwwICsxLDEwMCBAQAorI2lmICFkZWZpbmVkKF9UUkFDRV9XT1JLUVVFVUVfSCkgfHwgZGVmaW5lZChUUkFDRV9IRUFERVJfTVVMVElfUkVBRCkKKyNkZWZpbmUgX1RSQUNFX1dPUktRVUVVRV9ICisKKyNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KKworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gd29ya3F1ZXVlCisKK1RSQUNFX0VWRU5UKHdvcmtxdWV1ZV9pbnNlcnRpb24sCisKKwlUUF9QUk9UTyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKndxX3RocmVhZCwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSwKKworCVRQX0FSR1Mod3FfdGhyZWFkLCB3b3JrKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoY2hhciwJCXRocmVhZF9jb21tLAlUQVNLX0NPTU1fTEVOKQorCQlfX2ZpZWxkKHBpZF90LAkJdGhyZWFkX3BpZCkKKwkJX19maWVsZCh3b3JrX2Z1bmNfdCwJZnVuYykKKwkpLAorCisJVFBfZmFzdF9hc3NpZ24oCisJCW1lbWNweShfX2VudHJ5LT50aHJlYWRfY29tbSwgd3FfdGhyZWFkLT5jb21tLCBUQVNLX0NPTU1fTEVOKTsKKwkJX19lbnRyeS0+dGhyZWFkX3BpZAk9IHdxX3RocmVhZC0+cGlkOworCQlfX2VudHJ5LT5mdW5jCQk9IHdvcmstPmZ1bmM7CisJKSwKKworCVRQX3ByaW50aygidGhyZWFkPSVzOiVkIGZ1bmM9JXBGIiwgX19lbnRyeS0+dGhyZWFkX2NvbW0sCisJCV9fZW50cnktPnRocmVhZF9waWQsIF9fZW50cnktPmZ1bmMpCispOworCitUUkFDRV9FVkVOVCh3b3JrcXVldWVfZXhlY3V0aW9uLAorCisJVFBfUFJPVE8oc3RydWN0IHRhc2tfc3RydWN0ICp3cV90aHJlYWQsIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yayksCisKKwlUUF9BUkdTKHdxX3RocmVhZCwgd29yayksCisKKwlUUF9TVFJVQ1RfX2VudHJ5KAorCQlfX2FycmF5KGNoYXIsCQl0aHJlYWRfY29tbSwJVEFTS19DT01NX0xFTikKKwkJX19maWVsZChwaWRfdCwJCXRocmVhZF9waWQpCisJCV9fZmllbGQod29ya19mdW5jX3QsCWZ1bmMpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQltZW1jcHkoX19lbnRyeS0+dGhyZWFkX2NvbW0sIHdxX3RocmVhZC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJCV9fZW50cnktPnRocmVhZF9waWQJPSB3cV90aHJlYWQtPnBpZDsKKwkJX19lbnRyeS0+ZnVuYwkJPSB3b3JrLT5mdW5jOworCSksCisKKwlUUF9wcmludGsoInRocmVhZD0lczolZCBmdW5jPSVwRiIsIF9fZW50cnktPnRocmVhZF9jb21tLAorCQlfX2VudHJ5LT50aHJlYWRfcGlkLCBfX2VudHJ5LT5mdW5jKQorKTsKKworLyogVHJhY2UgdGhlIGNyZWF0aW9uIG9mIG9uZSB3b3JrcXVldWUgdGhyZWFkIG9uIGEgY3B1ICovCitUUkFDRV9FVkVOVCh3b3JrcXVldWVfY3JlYXRpb24sCisKKwlUUF9QUk9UTyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKndxX3RocmVhZCwgaW50IGNwdSksCisKKwlUUF9BUkdTKHdxX3RocmVhZCwgY3B1KSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoY2hhciwJdGhyZWFkX2NvbW0sCVRBU0tfQ09NTV9MRU4pCisJCV9fZmllbGQocGlkX3QsCXRocmVhZF9waWQpCisJCV9fZmllbGQoaW50LAljcHUpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQltZW1jcHkoX19lbnRyeS0+dGhyZWFkX2NvbW0sIHdxX3RocmVhZC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJCV9fZW50cnktPnRocmVhZF9waWQJPSB3cV90aHJlYWQtPnBpZDsKKwkJX19lbnRyeS0+Y3B1CQk9IGNwdTsKKwkpLAorCisJVFBfcHJpbnRrKCJ0aHJlYWQ9JXM6JWQgY3B1PSVkIiwgX19lbnRyeS0+dGhyZWFkX2NvbW0sCisJCV9fZW50cnktPnRocmVhZF9waWQsIF9fZW50cnktPmNwdSkKKyk7CisKK1RSQUNFX0VWRU5UKHdvcmtxdWV1ZV9kZXN0cnVjdGlvbiwKKworCVRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqd3FfdGhyZWFkKSwKKworCVRQX0FSR1Mod3FfdGhyZWFkKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoY2hhciwJdGhyZWFkX2NvbW0sCVRBU0tfQ09NTV9MRU4pCisJCV9fZmllbGQocGlkX3QsCXRocmVhZF9waWQpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQltZW1jcHkoX19lbnRyeS0+dGhyZWFkX2NvbW0sIHdxX3RocmVhZC0+Y29tbSwgVEFTS19DT01NX0xFTik7CisJCV9fZW50cnktPnRocmVhZF9waWQJPSB3cV90aHJlYWQtPnBpZDsKKwkpLAorCisJVFBfcHJpbnRrKCJ0aHJlYWQ9JXM6JWQiLCBfX2VudHJ5LT50aHJlYWRfY29tbSwgX19lbnRyeS0+dGhyZWFkX3BpZCkKKyk7CisKKyNlbmRpZiAvKiBfVFJBQ0VfV09SS1FVRVVFX0ggKi8KKworLyogVGhpcyBwYXJ0IG11c3QgYmUgb3V0c2lkZSBwcm90ZWN0aW9uICovCisjaW5jbHVkZSA8dHJhY2UvZGVmaW5lX3RyYWNlLmg+CmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2Z0cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9mdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODY3NTUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS90cmFjZS9mdHJhY2UuaApAQCAtMCwwICsxLDU5MSBAQAorLyoKKyAqIFN0YWdlIDEgb2YgdGhlIHRyYWNlIGV2ZW50cy4KKyAqCisgKiBPdmVycmlkZSB0aGUgbWFjcm9zIGluIDx0cmFjZS90cmFjZV9ldmVudHMuaD4gdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nOgorICoKKyAqIHN0cnVjdCBmdHJhY2VfcmF3XzxjYWxsPiB7CisgKglzdHJ1Y3QgdHJhY2VfZW50cnkJCWVudDsKKyAqCTx0eXBlPgkJCQk8aXRlbT47CisgKgk8dHlwZTI+CQkJCTxpdGVtMj5bPGxlbj5dOworICoJWy4uLl0KKyAqIH07CisgKgorICogVGhlIDx0eXBlPiA8aXRlbT4gaXMgY3JlYXRlZCBieSB0aGUgX19maWVsZCh0eXBlLCBpdGVtKSBtYWNybyBvcgorICogdGhlIF9fYXJyYXkodHlwZTIsIGl0ZW0yLCBsZW4pIG1hY3JvLgorICogV2Ugc2ltcGx5IGRvICJ0eXBlIGl0ZW07IiwgYW5kIHRoYXQgd2lsbCBjcmVhdGUgdGhlIGZpZWxkcworICogaW4gdGhlIHN0cnVjdHVyZS4KKyAqLworCisjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CisKKyN1bmRlZiBfX2ZpZWxkCisjZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkJCXR5cGUJaXRlbTsKKworI3VuZGVmIF9fYXJyYXkKKyNkZWZpbmUgX19hcnJheSh0eXBlLCBpdGVtLCBsZW4pCXR5cGUJaXRlbVtsZW5dOworCisjdW5kZWYgX19keW5hbWljX2FycmF5CisjZGVmaW5lIF9fZHluYW1pY19hcnJheSh0eXBlLCBpdGVtLCBsZW4pIHVuc2lnbmVkIHNob3J0IF9fZGF0YV9sb2NfIyNpdGVtOworCisjdW5kZWYgX19zdHJpbmcKKyNkZWZpbmUgX19zdHJpbmcoaXRlbSwgc3JjKSBfX2R5bmFtaWNfYXJyYXkoY2hhciwgaXRlbSwgLTEpCisKKyN1bmRlZiBUUF9TVFJVQ1RfX2VudHJ5CisjZGVmaW5lIFRQX1NUUlVDVF9fZW50cnkoYXJncy4uLikgYXJncworCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQobmFtZSwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCVwKKwlzdHJ1Y3QgZnRyYWNlX3Jhd18jI25hbWUgewkJCQlcCisJCXN0cnVjdCB0cmFjZV9lbnRyeQllbnQ7CQkJXAorCQl0c3RydWN0CQkJCQkJXAorCQljaGFyCQkJX19kYXRhWzBdOwkJXAorCX07CQkJCQkJCVwKKwlzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIGV2ZW50XyMjbmFtZQorCisjaW5jbHVkZSBUUkFDRV9JTkNMVURFKFRSQUNFX0lOQ0xVREVfRklMRSkKKworCisvKgorICogU3RhZ2UgMiBvZiB0aGUgdHJhY2UgZXZlbnRzLgorICoKKyAqIEluY2x1ZGUgdGhlIGZvbGxvd2luZzoKKyAqCisgKiBzdHJ1Y3QgZnRyYWNlX2RhdGFfb2Zmc2V0c188Y2FsbD4geworICoJaW50CQkJCTxpdGVtMT47CisgKglpbnQJCQkJPGl0ZW0yPjsKKyAqCVsuLi5dCisgKiB9OworICoKKyAqIFRoZSBfX2R5bmFtaWNfYXJyYXkoKSBtYWNybyB3aWxsIGNyZWF0ZSBlYWNoIGludCA8aXRlbT4sIHRoaXMgaXMKKyAqIHRvIGtlZXAgdGhlIG9mZnNldCBvZiBlYWNoIGFycmF5IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZXZlbnQuCisgKi8KKworI3VuZGVmIF9fZmllbGQKKyNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKTsKKworI3VuZGVmIF9fYXJyYXkKKyNkZWZpbmUgX19hcnJheSh0eXBlLCBpdGVtLCBsZW4pCisKKyN1bmRlZiBfX2R5bmFtaWNfYXJyYXkKKyNkZWZpbmUgX19keW5hbWljX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikJaW50IGl0ZW07CisKKyN1bmRlZiBfX3N0cmluZworI2RlZmluZSBfX3N0cmluZyhpdGVtLCBzcmMpIF9fZHluYW1pY19hcnJheShjaGFyLCBpdGVtLCAtMSkKKworI3VuZGVmIFRSQUNFX0VWRU5UCisjZGVmaW5lIFRSQUNFX0VWRU5UKGNhbGwsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBhc3NpZ24sIHByaW50KQkJXAorCXN0cnVjdCBmdHJhY2VfZGF0YV9vZmZzZXRzXyMjY2FsbCB7CQkJCVwKKwkJdHN0cnVjdDsJCQkJCQlcCisJfTsKKworI2luY2x1ZGUgVFJBQ0VfSU5DTFVERShUUkFDRV9JTkNMVURFX0ZJTEUpCisKKy8qCisgKiBTZXR1cCB0aGUgc2hvd2luZyBmb3JtYXQgb2YgdHJhY2UgcG9pbnQuCisgKgorICogaW50CisgKiBmdHJhY2VfZm9ybWF0XyMjY2FsbChzdHJ1Y3QgdHJhY2Vfc2VxICpzKQorICogeworICoJc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsIGZpZWxkOworICoJaW50IHJldDsKKyAqCisgKglyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICN0eXBlICIgIiAjaXRlbSAiOyIKKyAqCQkJICAgICAgICIgb2Zmc2V0OiV1OyBzaXplOiV1O1xuIiwKKyAqCQkJICAgICAgIG9mZnNldG9mKHN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCwgaXRlbSksCisgKgkJCSAgICAgICBzaXplb2YoZmllbGQudHlwZSkpOworICoKKyAqIH0KKyAqLworCisjdW5kZWYgVFBfU1RSVUNUX19lbnRyeQorI2RlZmluZSBUUF9TVFJVQ1RfX2VudHJ5KGFyZ3MuLi4pIGFyZ3MKKworI3VuZGVmIF9fZmllbGQKKyNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKQkJCQkJXAorCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6IiAjdHlwZSAiICIgI2l0ZW0gIjtcdCIJXAorCQkJICAgICAgICJvZmZzZXQ6JXU7XHRzaXplOiV1O1xuIiwJCVwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KW9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLCBcCisJCQkgICAgICAgKHVuc2lnbmVkIGludClzaXplb2YoZmllbGQuaXRlbSkpOwlcCisJaWYgKCFyZXQpCQkJCQkJCVwKKwkJcmV0dXJuIDA7CisKKyN1bmRlZiBfX2FycmF5CisjZGVmaW5lIF9fYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkJCVwKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdGZpZWxkOiIgI3R5cGUgIiAiICNpdGVtICJbIiAjbGVuICJdO1x0IglcCisJCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAkJXAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksIFwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KXNpemVvZihmaWVsZC5pdGVtKSk7CVwKKwlpZiAoIXJldCkJCQkJCQkJXAorCQlyZXR1cm4gMDsKKworI3VuZGVmIF9fZHluYW1pY19hcnJheQorI2RlZmluZSBfX2R5bmFtaWNfYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkgICAgICAgXAorCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6X19kYXRhX2xvYyAiICNpdGVtICI7XHQiCSAgICAgICBcCisJCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAkJICAgICAgIFwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KW9mZnNldG9mKHR5cGVvZihmaWVsZCksCSAgICAgICBcCisJCQkJCV9fZGF0YV9sb2NfIyNpdGVtKSwJCSAgICAgICBcCisJCQkgICAgICAgKHVuc2lnbmVkIGludClzaXplb2YoZmllbGQuX19kYXRhX2xvY18jI2l0ZW0pKTsgXAorCWlmICghcmV0KQkJCQkJCQkgICAgICAgXAorCQlyZXR1cm4gMDsKKworI3VuZGVmIF9fc3RyaW5nCisjZGVmaW5lIF9fc3RyaW5nKGl0ZW0sIHNyYykgX19keW5hbWljX2FycmF5KGNoYXIsIGl0ZW0sIC0xKQorCisjdW5kZWYgX19lbnRyeQorI2RlZmluZSBfX2VudHJ5IFJFQworCisjdW5kZWYgX19wcmludF9zeW1ib2xpYworI3VuZGVmIF9fZ2V0X2R5bmFtaWNfYXJyYXkKKyN1bmRlZiBfX2dldF9zdHIKKworI3VuZGVmIFRQX3ByaW50aworI2RlZmluZSBUUF9wcmludGsoZm10LCBhcmdzLi4uKSAiJXMsICVzXG4iLCAjZm10LCBfX3N0cmluZ2lmeShhcmdzKQorCisjdW5kZWYgVFBfZmFzdF9hc3NpZ24KKyNkZWZpbmUgVFBfZmFzdF9hc3NpZ24oYXJncy4uLikgYXJncworCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGZ1bmMsIHByaW50KQkJXAorc3RhdGljIGludAkJCQkJCQkJXAorZnRyYWNlX2Zvcm1hdF8jI2NhbGwoc3RydWN0IHRyYWNlX3NlcSAqcykJCQkJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgZmllbGQgX19hdHRyaWJ1dGVfXygodW51c2VkKSk7CQlcCisJaW50IHJldCA9IDA7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0c3RydWN0OwkJCQkJCQlcCisJCQkJCQkJCQlcCisJdHJhY2Vfc2VxX3ByaW50ZihzLCAiXG5wcmludCBmbXQ6ICIgcHJpbnQpOwkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CisKKyNpbmNsdWRlIFRSQUNFX0lOQ0xVREUoVFJBQ0VfSU5DTFVERV9GSUxFKQorCisvKgorICogU3RhZ2UgMyBvZiB0aGUgdHJhY2UgZXZlbnRzLgorICoKKyAqIE92ZXJyaWRlIHRoZSBtYWNyb3MgaW4gPHRyYWNlL3RyYWNlX2V2ZW50cy5oPiB0byBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CisgKgorICogZW51bSBwcmludF9saW5lX3QKKyAqIGZ0cmFjZV9yYXdfb3V0cHV0XzxjYWxsPihzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncykKKyAqIHsKKyAqCXN0cnVjdCB0cmFjZV9zZXEgKnMgPSAmaXRlci0+c2VxOworICoJc3RydWN0IGZ0cmFjZV9yYXdfPGNhbGw+ICpmaWVsZDsgPC0tIGRlZmluZWQgaW4gc3RhZ2UgMQorICoJc3RydWN0IHRyYWNlX2VudHJ5ICplbnRyeTsKKyAqCXN0cnVjdCB0cmFjZV9zZXEgKnA7CisgKglpbnQgcmV0OworICoKKyAqCWVudHJ5ID0gaXRlci0+ZW50OworICoKKyAqCWlmIChlbnRyeS0+dHlwZSAhPSBldmVudF88Y2FsbD4uaWQpIHsKKyAqCQlXQVJOX09OX09OQ0UoMSk7CisgKgkJcmV0dXJuIFRSQUNFX1RZUEVfVU5IQU5ETEVEOworICoJfQorICoKKyAqCWZpZWxkID0gKHR5cGVvZihmaWVsZCkpZW50cnk7CisgKgorICoJcCA9IGdldF9jcHVfdmFyKGZ0cmFjZV9ldmVudF9zZXEpOworICoJdHJhY2Vfc2VxX2luaXQocCk7CisgKglyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsIDxUUF9wcmludGs+ICJcbiIpOworICoJcHV0X2NwdSgpOworICoJaWYgKCFyZXQpCisgKgkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOworICoKKyAqCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7CisgKiB9CisgKgorICogVGhpcyBpcyB0aGUgbWV0aG9kIHVzZWQgdG8gcHJpbnQgdGhlIHJhdyBldmVudCB0byB0aGUgdHJhY2UKKyAqIG91dHB1dCBmb3JtYXQuIE5vdGUsIHRoaXMgaXMgbm90IG5lZWRlZCBpZiB0aGUgZGF0YSBpcyByZWFkCisgKiBpbiBiaW5hcnkuCisgKi8KKworI3VuZGVmIF9fZW50cnkKKyNkZWZpbmUgX19lbnRyeSBmaWVsZAorCisjdW5kZWYgVFBfcHJpbnRrCisjZGVmaW5lIFRQX3ByaW50ayhmbXQsIGFyZ3MuLi4pIGZtdCAiXG4iLCBhcmdzCisKKyN1bmRlZiBfX2dldF9keW5hbWljX2FycmF5CisjZGVmaW5lIF9fZ2V0X2R5bmFtaWNfYXJyYXkoZmllbGQpCVwKKwkJKCh2b2lkICopX19lbnRyeSArIF9fZW50cnktPl9fZGF0YV9sb2NfIyNmaWVsZCkKKworI3VuZGVmIF9fZ2V0X3N0cgorI2RlZmluZSBfX2dldF9zdHIoZmllbGQpIChjaGFyICopX19nZXRfZHluYW1pY19hcnJheShmaWVsZCkKKworI3VuZGVmIF9fcHJpbnRfZmxhZ3MKKyNkZWZpbmUgX19wcmludF9mbGFncyhmbGFnLCBkZWxpbSwgZmxhZ19hcnJheS4uLikJCQlcCisJKHsJCQkJCQkJCVwKKwkJc3RhdGljIGNvbnN0IHN0cnVjdCB0cmFjZV9wcmludF9mbGFncyBmbGFnc1tdID0JCVwKKwkJCXsgZmxhZ19hcnJheSwgeyAtMSwgTlVMTCB9fTsJCQlcCisJCWZ0cmFjZV9wcmludF9mbGFnc19zZXEocCwgZGVsaW0sIGZsYWcsIGZsYWdzKTsJCVwKKwl9KQorCisjdW5kZWYgX19wcmludF9zeW1ib2xpYworI2RlZmluZSBfX3ByaW50X3N5bWJvbGljKHZhbHVlLCBzeW1ib2xfYXJyYXkuLi4pCQkJXAorCSh7CQkJCQkJCQlcCisJCXN0YXRpYyBjb25zdCBzdHJ1Y3QgdHJhY2VfcHJpbnRfZmxhZ3Mgc3ltYm9sc1tdID0JXAorCQkJeyBzeW1ib2xfYXJyYXksIHsgLTEsIE5VTEwgfX07CQkJXAorCQlmdHJhY2VfcHJpbnRfc3ltYm9sc19zZXEocCwgdmFsdWUsIHN5bWJvbHMpOwkJXAorCX0pCisKKyN1bmRlZiBUUkFDRV9FVkVOVAorI2RlZmluZSBUUkFDRV9FVkVOVChjYWxsLCBwcm90bywgYXJncywgdHN0cnVjdCwgYXNzaWduLCBwcmludCkJCVwKK2VudW0gcHJpbnRfbGluZV90CQkJCQkJCVwKK2Z0cmFjZV9yYXdfb3V0cHV0XyMjY2FsbChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsIGludCBmbGFncykJXAorewkJCQkJCQkJCVwKKwlzdHJ1Y3QgdHJhY2Vfc2VxICpzID0gJml0ZXItPnNlcTsJCQkJXAorCXN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCAqZmllbGQ7CQkJCVwKKwlzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudHJ5OwkJCQkJXAorCXN0cnVjdCB0cmFjZV9zZXEgKnA7CQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwllbnRyeSA9IGl0ZXItPmVudDsJCQkJCQlcCisJCQkJCQkJCQlcCisJaWYgKGVudHJ5LT50eXBlICE9IGV2ZW50XyMjY2FsbC5pZCkgewkJCQlcCisJCVdBUk5fT05fT05DRSgxKTsJCQkJCVwKKwkJcmV0dXJuIFRSQUNFX1RZUEVfVU5IQU5ETEVEOwkJCQlcCisJfQkJCQkJCQkJXAorCQkJCQkJCQkJXAorCWZpZWxkID0gKHR5cGVvZihmaWVsZCkpZW50cnk7CQkJCQlcCisJCQkJCQkJCQlcCisJcCA9ICZnZXRfY3B1X3ZhcihmdHJhY2VfZXZlbnRfc2VxKTsJCQkJXAorCXRyYWNlX3NlcV9pbml0KHApOwkJCQkJCVwKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICNjYWxsICI6ICIgcHJpbnQpOwkJCVwKKwlwdXRfY3B1KCk7CQkJCQkJCVwKKwlpZiAoIXJldCkJCQkJCQkJXAorCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwkJCQkJXAorfQorCQorI2luY2x1ZGUgVFJBQ0VfSU5DTFVERShUUkFDRV9JTkNMVURFX0ZJTEUpCisKKyN1bmRlZiBfX2ZpZWxkCisjZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkJCQkJCQlcCisJcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsICN0eXBlLCAjaXRlbSwJCVwKKwkJCQkgb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksCQlcCisJCQkJIHNpemVvZihmaWVsZC5pdGVtKSwgaXNfc2lnbmVkX3R5cGUodHlwZSkpOwlcCisJaWYgKHJldCkJCQkJCQkJXAorCQlyZXR1cm4gcmV0OworCisjdW5kZWYgX19hcnJheQorI2RlZmluZSBfX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikJCQkJCVwKKwlCVUlMRF9CVUdfT04obGVuID4gTUFYX0ZJTFRFUl9TVFJfVkFMKTsJCQkJXAorCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCAjdHlwZSAiWyIgI2xlbiAiXSIsICNpdGVtLAlcCisJCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLAkJXAorCQkJCSBzaXplb2YoZmllbGQuaXRlbSksIDApOwkJXAorCWlmIChyZXQpCQkJCQkJCVwKKwkJcmV0dXJuIHJldDsKKworI3VuZGVmIF9fZHluYW1pY19hcnJheQorI2RlZmluZSBfX2R5bmFtaWNfYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQkgICAgICAgXAorCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCAiX19kYXRhX2xvYyIgIlsiICN0eXBlICJdIiwgI2l0ZW0sXAorCQkJCW9mZnNldG9mKHR5cGVvZihmaWVsZCksIF9fZGF0YV9sb2NfIyNpdGVtKSwgICAgXAorCQkJCSBzaXplb2YoZmllbGQuX19kYXRhX2xvY18jI2l0ZW0pLCAwKTsKKworI3VuZGVmIF9fc3RyaW5nCisjZGVmaW5lIF9fc3RyaW5nKGl0ZW0sIHNyYykgX19keW5hbWljX2FycmF5KGNoYXIsIGl0ZW0sIC0xKQorCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGZ1bmMsIHByaW50KQkJXAoraW50CQkJCQkJCQkJXAorZnRyYWNlX2RlZmluZV9maWVsZHNfIyNjYWxsKHZvaWQpCQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCBmaWVsZDsJCQkJCVwKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV2ZW50X2NhbGwgPSAmZXZlbnRfIyNjYWxsOwkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2NvbW1vbl9maWVsZChpbnQsIHR5cGUsIDEpOwkJCQkJXAorCV9fY29tbW9uX2ZpZWxkKHVuc2lnbmVkIGNoYXIsIGZsYWdzLCAwKTsJCQlcCisJX19jb21tb25fZmllbGQodW5zaWduZWQgY2hhciwgcHJlZW1wdF9jb3VudCwgMCk7CQlcCisJX19jb21tb25fZmllbGQoaW50LCBwaWQsIDEpOwkJCQkJXAorCV9fY29tbW9uX2ZpZWxkKGludCwgdGdpZCwgMSk7CQkJCQlcCisJCQkJCQkJCQlcCisJdHN0cnVjdDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30KKworI2luY2x1ZGUgVFJBQ0VfSU5DTFVERShUUkFDRV9JTkNMVURFX0ZJTEUpCisKKy8qCisgKiByZW1lbWJlciB0aGUgb2Zmc2V0IG9mIGVhY2ggYXJyYXkgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBldmVudC4KKyAqLworCisjdW5kZWYgX19lbnRyeQorI2RlZmluZSBfX2VudHJ5IGVudHJ5CisKKyN1bmRlZiBfX2ZpZWxkCisjZGVmaW5lIF9fZmllbGQodHlwZSwgaXRlbSkKKworI3VuZGVmIF9fYXJyYXkKKyNkZWZpbmUgX19hcnJheSh0eXBlLCBpdGVtLCBsZW4pCisKKyN1bmRlZiBfX2R5bmFtaWNfYXJyYXkKKyNkZWZpbmUgX19keW5hbWljX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikJCQkJXAorCV9fZGF0YV9vZmZzZXRzLT5pdGVtID0gX19kYXRhX3NpemUgKwkJCQlcCisJCQkgICAgICAgb2Zmc2V0b2YodHlwZW9mKCplbnRyeSksIF9fZGF0YSk7CVwKKwlfX2RhdGFfc2l6ZSArPSAobGVuKSAqIHNpemVvZih0eXBlKTsKKworI3VuZGVmIF9fc3RyaW5nCisjZGVmaW5lIF9fc3RyaW5nKGl0ZW0sIHNyYykgX19keW5hbWljX2FycmF5KGNoYXIsIGl0ZW0sIHN0cmxlbihzcmMpICsgMSkgICAgICAgXAorCisjdW5kZWYgVFJBQ0VfRVZFTlQKKyNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCQlcCitzdGF0aWMgaW5saW5lIGludCBmdHJhY2VfZ2V0X29mZnNldHNfIyNjYWxsKAkJCQlcCisJc3RydWN0IGZ0cmFjZV9kYXRhX29mZnNldHNfIyNjYWxsICpfX2RhdGFfb2Zmc2V0cywgcHJvdG8pICAgICAgIFwKK3sJCQkJCQkJCQlcCisJaW50IF9fZGF0YV9zaXplID0gMDsJCQkJCQlcCisJc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsIF9fbWF5YmVfdW51c2VkICplbnRyeTsJCQlcCisJCQkJCQkJCQlcCisJdHN0cnVjdDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXJldHVybiBfX2RhdGFfc2l6ZTsJCQkJCQlcCit9CisKKyNpbmNsdWRlIFRSQUNFX0lOQ0xVREUoVFJBQ0VfSU5DTFVERV9GSUxFKQorCisvKgorICogU3RhZ2UgNCBvZiB0aGUgdHJhY2UgZXZlbnRzLgorICoKKyAqIE92ZXJyaWRlIHRoZSBtYWNyb3MgaW4gPHRyYWNlL3RyYWNlX2V2ZW50cy5oPiB0byBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6CisgKgorICogc3RhdGljIHZvaWQgZnRyYWNlX2V2ZW50XzxjYWxsPihwcm90bykKKyAqIHsKKyAqCWV2ZW50X3RyYWNlX3ByaW50ayhfUkVUX0lQXywgIjxjYWxsPjogIiA8Zm10Pik7CisgKiB9CisgKgorICogc3RhdGljIGludCBmdHJhY2VfcmVnX2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJaW50IHJldDsKKyAqCisgKglyZXQgPSByZWdpc3Rlcl90cmFjZV88Y2FsbD4oZnRyYWNlX2V2ZW50XzxjYWxsPik7CisgKglpZiAoIXJldCkKKyAqCQlwcl9pbmZvKCJldmVudCB0cmFjZTogQ291bGQgbm90IGFjdGl2YXRlIHRyYWNlIHBvaW50ICIKKyAqCQkJInByb2JlIHRvICA8Y2FsbD4iKTsKKyAqCXJldHVybiByZXQ7CisgKiB9CisgKgorICogc3RhdGljIHZvaWQgZnRyYWNlX3VucmVnX2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJdW5yZWdpc3Rlcl90cmFjZV88Y2FsbD4oZnRyYWNlX2V2ZW50XzxjYWxsPik7CisgKiB9CisgKgorICoKKyAqIEZvciB0aG9zZSBtYWNyb3MgZGVmaW5lZCB3aXRoIFRSQUNFX0VWRU5UOgorICoKKyAqIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgZXZlbnRfPGNhbGw+OworICoKKyAqIHN0YXRpYyB2b2lkIGZ0cmFjZV9yYXdfZXZlbnRfPGNhbGw+KHByb3RvKQorICogeworICoJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKKyAqCXN0cnVjdCBmdHJhY2VfcmF3XzxjYWxsPiAqZW50cnk7IDwtLSBkZWZpbmVkIGluIHN0YWdlIDEKKyAqCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworICoJaW50IHBjOworICoKKyAqCWxvY2FsX3NhdmVfZmxhZ3MoaXJxX2ZsYWdzKTsKKyAqCXBjID0gcHJlZW1wdF9jb3VudCgpOworICoKKyAqCWV2ZW50ID0gdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKGV2ZW50XzxjYWxsPi5pZCwKKyAqCQkJCSAgc2l6ZW9mKHN0cnVjdCBmdHJhY2VfcmF3XzxjYWxsPiksCisgKgkJCQkgIGlycV9mbGFncywgcGMpOworICoJaWYgKCFldmVudCkKKyAqCQlyZXR1cm47CisgKgllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOworICoKKyAqCTxhc3NpZ24+OyAgPC0tIEhlcmUgd2UgYXNzaWduIHRoZSBlbnRyaWVzIGJ5IHRoZSBfX2ZpZWxkIGFuZAorICoJCQlfX2FycmF5IG1hY3Jvcy4KKyAqCisgKgl0cmFjZV9jdXJyZW50X2J1ZmZlcl91bmxvY2tfY29tbWl0KGV2ZW50LCBpcnFfZmxhZ3MsIHBjKTsKKyAqIH0KKyAqCisgKiBzdGF0aWMgaW50IGZ0cmFjZV9yYXdfcmVnX2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJaW50IHJldDsKKyAqCisgKglyZXQgPSByZWdpc3Rlcl90cmFjZV88Y2FsbD4oZnRyYWNlX3Jhd19ldmVudF88Y2FsbD4pOworICoJaWYgKCFyZXQpCisgKgkJcHJfaW5mbygiZXZlbnQgdHJhY2U6IENvdWxkIG5vdCBhY3RpdmF0ZSB0cmFjZSBwb2ludCAiCisgKgkJCSJwcm9iZSB0byA8Y2FsbD4iKTsKKyAqCXJldHVybiByZXQ7CisgKiB9CisgKgorICogc3RhdGljIHZvaWQgZnRyYWNlX3VucmVnX2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJdW5yZWdpc3Rlcl90cmFjZV88Y2FsbD4oZnRyYWNlX3Jhd19ldmVudF88Y2FsbD4pOworICogfQorICoKKyAqIHN0YXRpYyBzdHJ1Y3QgdHJhY2VfZXZlbnQgZnRyYWNlX2V2ZW50X3R5cGVfPGNhbGw+ID0geworICoJLnRyYWNlCQkJPSBmdHJhY2VfcmF3X291dHB1dF88Y2FsbD4sIDwtLSBzdGFnZSAyCisgKiB9OworICoKKyAqIHN0YXRpYyBpbnQgZnRyYWNlX3Jhd19pbml0X2V2ZW50XzxjYWxsPih2b2lkKQorICogeworICoJaW50IGlkOworICoKKyAqCWlkID0gcmVnaXN0ZXJfZnRyYWNlX2V2ZW50KCZmdHJhY2VfZXZlbnRfdHlwZV88Y2FsbD4pOworICoJaWYgKCFpZCkKKyAqCQlyZXR1cm4gLUVOT0RFVjsKKyAqCWV2ZW50XzxjYWxsPi5pZCA9IGlkOworICoJcmV0dXJuIDA7CisgKiB9CisgKgorICogc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3VzZWQKKyAqIF9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDQpKSkKKyAqIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9mdHJhY2VfZXZlbnRzIikpKSBldmVudF88Y2FsbD4gPSB7CisgKgkubmFtZQkJCT0gIjxjYWxsPiIsCisgKgkuc3lzdGVtCQkJPSAiPHN5c3RlbT4iLAorICoJLnJhd19pbml0CQk9IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF88Y2FsbD4sCisgKgkucmVnZnVuYwkJPSBmdHJhY2VfcmVnX2V2ZW50XzxjYWxsPiwKKyAqCS51bnJlZ2Z1bmMJCT0gZnRyYWNlX3VucmVnX2V2ZW50XzxjYWxsPiwKKyAqCS5zaG93X2Zvcm1hdAkJPSBmdHJhY2VfZm9ybWF0XzxjYWxsPiwKKyAqIH0KKyAqCisgKi8KKworI3VuZGVmIFRQX0ZNVAorI2RlZmluZSBUUF9GTVQoZm10LCBhcmdzLi4uKQlmbXQgIlxuIiwgIyNhcmdzCisKKyNpZmRlZiBDT05GSUdfRVZFTlRfUFJPRklMRQorI2RlZmluZSBfVFJBQ0VfUFJPRklMRShjYWxsLCBwcm90bywgYXJncykJCQkJXAorc3RhdGljIHZvaWQgZnRyYWNlX3Byb2ZpbGVfIyNjYWxsKHByb3RvKQkJCQlcCit7CQkJCQkJCQkJXAorCWV4dGVybiB2b2lkIHBlcmZfdHBjb3VudGVyX2V2ZW50KGludCk7CQkJCVwKKwlwZXJmX3RwY291bnRlcl9ldmVudChldmVudF8jI2NhbGwuaWQpOwkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIGludCBmdHJhY2VfcHJvZmlsZV9lbmFibGVfIyNjYWxsKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqZXZlbnRfY2FsbCkgXAorewkJCQkJCQkJCVwKKwlpbnQgcmV0ID0gMDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghYXRvbWljX2luY19yZXR1cm4oJmV2ZW50X2NhbGwtPnByb2ZpbGVfY291bnQpKQkJXAorCQlyZXQgPSByZWdpc3Rlcl90cmFjZV8jI2NhbGwoZnRyYWNlX3Byb2ZpbGVfIyNjYWxsKTsJXAorCQkJCQkJCQkJXAorCXJldHVybiByZXQ7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgdm9pZCBmdHJhY2VfcHJvZmlsZV9kaXNhYmxlXyMjY2FsbChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV2ZW50X2NhbGwpXAorewkJCQkJCQkJCVwKKwlpZiAoYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSwgJmV2ZW50X2NhbGwtPnByb2ZpbGVfY291bnQpKQlcCisJCXVucmVnaXN0ZXJfdHJhY2VfIyNjYWxsKGZ0cmFjZV9wcm9maWxlXyMjY2FsbCk7CQlcCit9CisKKyNkZWZpbmUgX1RSQUNFX1BST0ZJTEVfSU5JVChjYWxsKQkJCQkJXAorCS5wcm9maWxlX2NvdW50ID0gQVRPTUlDX0lOSVQoLTEpLAkJCQlcCisJLnByb2ZpbGVfZW5hYmxlID0gZnRyYWNlX3Byb2ZpbGVfZW5hYmxlXyMjY2FsbCwJCQlcCisJLnByb2ZpbGVfZGlzYWJsZSA9IGZ0cmFjZV9wcm9maWxlX2Rpc2FibGVfIyNjYWxsLAorCisjZWxzZQorI2RlZmluZSBfVFJBQ0VfUFJPRklMRShjYWxsLCBwcm90bywgYXJncykKKyNkZWZpbmUgX1RSQUNFX1BST0ZJTEVfSU5JVChjYWxsKQorI2VuZGlmCisKKyN1bmRlZiBfX2VudHJ5CisjZGVmaW5lIF9fZW50cnkgZW50cnkKKworI3VuZGVmIF9fZmllbGQKKyNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKQorCisjdW5kZWYgX19hcnJheQorI2RlZmluZSBfX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikKKworI3VuZGVmIF9fZHluYW1pY19hcnJheQorI2RlZmluZSBfX2R5bmFtaWNfYXJyYXkodHlwZSwgaXRlbSwgbGVuKQkJCQlcCisJX19lbnRyeS0+X19kYXRhX2xvY18jI2l0ZW0gPSBfX2RhdGFfb2Zmc2V0cy5pdGVtOworCisjdW5kZWYgX19zdHJpbmcKKyNkZWZpbmUgX19zdHJpbmcoaXRlbSwgc3JjKSBfX2R5bmFtaWNfYXJyYXkoY2hhciwgaXRlbSwgLTEpICAgICAgIAlcCisKKyN1bmRlZiBfX2Fzc2lnbl9zdHIKKyNkZWZpbmUgX19hc3NpZ25fc3RyKGRzdCwgc3JjKQkJCQkJCVwKKwlzdHJjcHkoX19nZXRfc3RyKGRzdCksIHNyYyk7CisKKyN1bmRlZiBUUkFDRV9FVkVOVAorI2RlZmluZSBUUkFDRV9FVkVOVChjYWxsLCBwcm90bywgYXJncywgdHN0cnVjdCwgYXNzaWduLCBwcmludCkJCVwKK19UUkFDRV9QUk9GSUxFKGNhbGwsIFBBUkFNUyhwcm90byksIFBBUkFNUyhhcmdzKSkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIGV2ZW50XyMjY2FsbDsJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHZvaWQgZnRyYWNlX3Jhd19ldmVudF8jI2NhbGwocHJvdG8pCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGZ0cmFjZV9kYXRhX29mZnNldHNfIyNjYWxsIF9fbWF5YmVfdW51c2VkIF9fZGF0YV9vZmZzZXRzO1wKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV2ZW50X2NhbGwgPSAmZXZlbnRfIyNjYWxsOwkJXAorCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CQkJCVwKKwlzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgKmVudHJ5OwkJCQlcCisJdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CQkJCQlcCisJaW50IF9fZGF0YV9zaXplOwkJCQkJCVwKKwlpbnQgcGM7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJbG9jYWxfc2F2ZV9mbGFncyhpcnFfZmxhZ3MpOwkJCQkJXAorCXBjID0gcHJlZW1wdF9jb3VudCgpOwkJCQkJCVwKKwkJCQkJCQkJCVwKKwlfX2RhdGFfc2l6ZSA9IGZ0cmFjZV9nZXRfb2Zmc2V0c18jI2NhbGwoJl9fZGF0YV9vZmZzZXRzLCBhcmdzKTsgXAorCQkJCQkJCQkJXAorCWV2ZW50ID0gdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKGV2ZW50XyMjY2FsbC5pZCwJXAorCQkJCSBzaXplb2YoKmVudHJ5KSArIF9fZGF0YV9zaXplLAkJXAorCQkJCSBpcnFfZmxhZ3MsIHBjKTsJCQlcCisJaWYgKCFldmVudCkJCQkJCQkJXAorCQlyZXR1cm47CQkJCQkJCVwKKwllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwkJCVwKKwkJCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwl0c3RydWN0CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJeyBhc3NpZ247IH0JCQkJCQkJXAorCQkJCQkJCQkJXAorCWlmICghZmlsdGVyX2N1cnJlbnRfY2hlY2tfZGlzY2FyZChldmVudF9jYWxsLCBlbnRyeSwgZXZlbnQpKQlcCisJCXRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdChldmVudCwgaXJxX2ZsYWdzLCBwYyk7IFwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW50IGZ0cmFjZV9yYXdfcmVnX2V2ZW50XyMjY2FsbCh2b2lkKQkJCQlcCit7CQkJCQkJCQkJXAorCWludCByZXQ7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXQgPSByZWdpc3Rlcl90cmFjZV8jI2NhbGwoZnRyYWNlX3Jhd19ldmVudF8jI2NhbGwpOwkJXAorCWlmIChyZXQpCQkJCQkJCVwKKwkJcHJfaW5mbygiZXZlbnQgdHJhY2U6IENvdWxkIG5vdCBhY3RpdmF0ZSB0cmFjZSBwb2ludCAiCVwKKwkJCSJwcm9iZSB0byAiICNjYWxsICJcbiIpOwkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHZvaWQgZnRyYWNlX3Jhd191bnJlZ19ldmVudF8jI2NhbGwodm9pZCkJCQkJXAorewkJCQkJCQkJCVwKKwl1bnJlZ2lzdGVyX3RyYWNlXyMjY2FsbChmdHJhY2VfcmF3X2V2ZW50XyMjY2FsbCk7CQlcCit9CQkJCQkJCQkJXAorCQkJCQkJCQkJXAorc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudCBmdHJhY2VfZXZlbnRfdHlwZV8jI2NhbGwgPSB7CQkJXAorCS50cmFjZQkJCT0gZnRyYWNlX3Jhd19vdXRwdXRfIyNjYWxsLAkJXAorfTsJCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgaW50IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwodm9pZCkJCQkJXAorewkJCQkJCQkJCVwKKwlpbnQgaWQ7CQkJCQkJCQlcCisJCQkJCQkJCQlcCisJaWQgPSByZWdpc3Rlcl9mdHJhY2VfZXZlbnQoJmZ0cmFjZV9ldmVudF90eXBlXyMjY2FsbCk7CQlcCisJaWYgKCFpZCkJCQkJCQkJXAorCQlyZXR1cm4gLUVOT0RFVjsJCQkJCQlcCisJZXZlbnRfIyNjYWxsLmlkID0gaWQ7CQkJCQkJXAorCUlOSVRfTElTVF9IRUFEKCZldmVudF8jI2NhbGwuZmllbGRzKTsJCQkJXAorCWluaXRfcHJlZHMoJmV2ZW50XyMjY2FsbCk7CQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisJCQkJCQkJCQlcCitzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZAkJCQkJXAorX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oNCkpKQkJCQkJCVwKK19fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9mdHJhY2VfZXZlbnRzIikpKSBldmVudF8jI2NhbGwgPSB7CQlcCisJLm5hbWUJCQk9ICNjYWxsLAkJCQlcCisJLnN5c3RlbQkJCT0gX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKSwJCVwKKwkuZXZlbnQJCQk9ICZmdHJhY2VfZXZlbnRfdHlwZV8jI2NhbGwsCQlcCisJLnJhd19pbml0CQk9IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwsCQlcCisJLnJlZ2Z1bmMJCT0gZnRyYWNlX3Jhd19yZWdfZXZlbnRfIyNjYWxsLAkJXAorCS51bnJlZ2Z1bmMJCT0gZnRyYWNlX3Jhd191bnJlZ19ldmVudF8jI2NhbGwsCVwKKwkuc2hvd19mb3JtYXQJCT0gZnRyYWNlX2Zvcm1hdF8jI2NhbGwsCQkJXAorCS5kZWZpbmVfZmllbGRzCQk9IGZ0cmFjZV9kZWZpbmVfZmllbGRzXyMjY2FsbCwJCVwKKwlfVFJBQ0VfUFJPRklMRV9JTklUKGNhbGwpCQkJCQlcCit9CisKKyNpbmNsdWRlIFRSQUNFX0lOQ0xVREUoVFJBQ0VfSU5DTFVERV9GSUxFKQorCisjdW5kZWYgX1RSQUNFX1BST0ZJTEUKKyN1bmRlZiBfVFJBQ0VfUFJPRklMRV9JTklUCisKZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvaXJxLmggYi9pbmNsdWRlL3RyYWNlL2lycS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjVkNDQ5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvaXJxLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLSNpZm5kZWYgX1RSQUNFX0lSUV9ICi0jZGVmaW5lIF9UUkFDRV9JUlFfSAotCi0jaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHJhY2Vwb2ludC5oPgotCi0jaW5jbHVkZSA8dHJhY2UvaXJxX2V2ZW50X3R5cGVzLmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9pcnFfZXZlbnRfdHlwZXMuaCBiL2luY2x1ZGUvdHJhY2UvaXJxX2V2ZW50X3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1OTY0ZWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS9pcnFfZXZlbnRfdHlwZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLQotLyogdXNlIDx0cmFjZS9pcnEuaD4gaW5zdGVhZCAqLwotI2lmbmRlZiBUUkFDRV9GT1JNQVQKLSMgZXJyb3IgRG8gbm90IGluY2x1ZGUgdGhpcyBmaWxlIGRpcmVjdGx5LgotIyBlcnJvciBVbmxlc3MgeW91IGtub3cgd2hhdCB5b3UgYXJlIGRvaW5nLgotI2VuZGlmCi0KLSN1bmRlZiBUUkFDRV9TWVNURU0KLSNkZWZpbmUgVFJBQ0VfU1lTVEVNIGlycQotCi0vKgotICogVHJhY2Vwb2ludCBmb3IgZW50cnkgb2YgaW50ZXJydXB0IGhhbmRsZXI6Ci0gKi8KLVRSQUNFX0ZPUk1BVChpcnFfaGFuZGxlcl9lbnRyeSwKLQlUUF9QUk9UTyhpbnQgaXJxLCBzdHJ1Y3QgaXJxYWN0aW9uICphY3Rpb24pLAotCVRQX0FSR1MoaXJxLCBhY3Rpb24pLAotCVRQX0ZNVCgiaXJxPSVkIGhhbmRsZXI9JXMiLCBpcnEsIGFjdGlvbi0+bmFtZSkKLQkpOwotCi0vKgotICogVHJhY2Vwb2ludCBmb3IgcmV0dXJuIG9mIGFuIGludGVycnVwdCBoYW5kbGVyOgotICovCi1UUkFDRV9FVkVOVChpcnFfaGFuZGxlcl9leGl0LAotCi0JVFBfUFJPVE8oaW50IGlycSwgc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uLCBpbnQgcmV0KSwKLQotCVRQX0FSR1MoaXJxLCBhY3Rpb24sIHJldCksCi0KLQlUUF9TVFJVQ1RfX2VudHJ5KAotCQlfX2ZpZWxkKAlpbnQsCWlycQkpCi0JCV9fZmllbGQoCWludCwJcmV0CSkKLQkpLAotCi0JVFBfZmFzdF9hc3NpZ24oCi0JCV9fZW50cnktPmlycQk9IGlycTsKLQkJX19lbnRyeS0+cmV0CT0gcmV0OwotCSksCi0KLQlUUF9wcmludGsoImlycT0lZCByZXR1cm49JXMiLAotCQkgIF9fZW50cnktPmlycSwgX19lbnRyeS0+cmV0ID8gImhhbmRsZWQiIDogInVuaGFuZGxlZCIpCi0pOwotCi1UUkFDRV9GT1JNQVQoc29mdGlycV9lbnRyeSwKLQlUUF9QUk9UTyhzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmgsIHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqdmVjKSwKLQlUUF9BUkdTKGgsIHZlYyksCi0JVFBfRk1UKCJzb2Z0aXJxPSVkIGFjdGlvbj0lcyIsIChpbnQpKGggLSB2ZWMpLCBzb2Z0aXJxX3RvX25hbWVbaC12ZWNdKQotCSk7Ci0KLVRSQUNFX0ZPUk1BVChzb2Z0aXJxX2V4aXQsCi0JVFBfUFJPVE8oc3RydWN0IHNvZnRpcnFfYWN0aW9uICpoLCBzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKnZlYyksCi0JVFBfQVJHUyhoLCB2ZWMpLAotCVRQX0ZNVCgic29mdGlycT0lZCBhY3Rpb249JXMiLCAoaW50KShoIC0gdmVjKSwgc29mdGlycV90b19uYW1lW2gtdmVjXSkKLQkpOwotCi0jdW5kZWYgVFJBQ0VfU1lTVEVNCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2ttZW10cmFjZS5oIGIvaW5jbHVkZS90cmFjZS9rbWVtdHJhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhlZTY5Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL3RyYWNlL2ttZW10cmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBFZHVhcmQgLSBHYWJyaWVsIE11bnRlYW51Ci0gKgotICogVGhpcyBmaWxlIGlzIHJlbGVhc2VkIHVuZGVyIEdQTCB2ZXJzaW9uIDIuCi0gKi8KLQotI2lmbmRlZiBfTElOVVhfS01FTVRSQUNFX0gKLSNkZWZpbmUgX0xJTlVYX0tNRU1UUkFDRV9ICi0KLSNpZmRlZiBfX0tFUk5FTF9fCi0KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KLQotI2lmZGVmIENPTkZJR19LTUVNVFJBQ0UKLWV4dGVybiB2b2lkIGttZW10cmFjZV9pbml0KHZvaWQpOwotI2Vsc2UKLXN0YXRpYyBpbmxpbmUgdm9pZCBrbWVtdHJhY2VfaW5pdCh2b2lkKQotewotfQotI2VuZGlmCi0KLURFQ0xBUkVfVFJBQ0Uoa21hbGxvYywKLQkgICAgICBUUF9QUk9UTyh1bnNpZ25lZCBsb25nIGNhbGxfc2l0ZSwKLQkJICAgICAgY29uc3Qgdm9pZCAqcHRyLAotCQkgICAgICBzaXplX3QgYnl0ZXNfcmVxLAotCQkgICAgICBzaXplX3QgYnl0ZXNfYWxsb2MsCi0JCSAgICAgIGdmcF90IGdmcF9mbGFncyksCi0JICAgICAgVFBfQVJHUyhjYWxsX3NpdGUsIHB0ciwgYnl0ZXNfcmVxLCBieXRlc19hbGxvYywgZ2ZwX2ZsYWdzKSk7Ci1ERUNMQVJFX1RSQUNFKGttZW1fY2FjaGVfYWxsb2MsCi0JICAgICAgVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCi0JCSAgICAgIGNvbnN0IHZvaWQgKnB0ciwKLQkJICAgICAgc2l6ZV90IGJ5dGVzX3JlcSwKLQkJICAgICAgc2l6ZV90IGJ5dGVzX2FsbG9jLAotCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MpLAotCSAgICAgIFRQX0FSR1MoY2FsbF9zaXRlLCBwdHIsIGJ5dGVzX3JlcSwgYnl0ZXNfYWxsb2MsIGdmcF9mbGFncykpOwotREVDTEFSRV9UUkFDRShrbWFsbG9jX25vZGUsCi0JICAgICAgVFBfUFJPVE8odW5zaWduZWQgbG9uZyBjYWxsX3NpdGUsCi0JCSAgICAgIGNvbnN0IHZvaWQgKnB0ciwKLQkJICAgICAgc2l6ZV90IGJ5dGVzX3JlcSwKLQkJICAgICAgc2l6ZV90IGJ5dGVzX2FsbG9jLAotCQkgICAgICBnZnBfdCBnZnBfZmxhZ3MsCi0JCSAgICAgIGludCBub2RlKSwKLQkgICAgICBUUF9BUkdTKGNhbGxfc2l0ZSwgcHRyLCBieXRlc19yZXEsIGJ5dGVzX2FsbG9jLCBnZnBfZmxhZ3MsIG5vZGUpKTsKLURFQ0xBUkVfVFJBQ0Uoa21lbV9jYWNoZV9hbGxvY19ub2RlLAotCSAgICAgIFRQX1BST1RPKHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLAotCQkgICAgICBjb25zdCB2b2lkICpwdHIsCi0JCSAgICAgIHNpemVfdCBieXRlc19yZXEsCi0JCSAgICAgIHNpemVfdCBieXRlc19hbGxvYywKLQkJICAgICAgZ2ZwX3QgZ2ZwX2ZsYWdzLAotCQkgICAgICBpbnQgbm9kZSksCi0JICAgICAgVFBfQVJHUyhjYWxsX3NpdGUsIHB0ciwgYnl0ZXNfcmVxLCBieXRlc19hbGxvYywgZ2ZwX2ZsYWdzLCBub2RlKSk7Ci1ERUNMQVJFX1RSQUNFKGtmcmVlLAotCSAgICAgIFRQX1BST1RPKHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLCBjb25zdCB2b2lkICpwdHIpLAotCSAgICAgIFRQX0FSR1MoY2FsbF9zaXRlLCBwdHIpKTsKLURFQ0xBUkVfVFJBQ0Uoa21lbV9jYWNoZV9mcmVlLAotCSAgICAgIFRQX1BST1RPKHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLCBjb25zdCB2b2lkICpwdHIpLAotCSAgICAgIFRQX0FSR1MoY2FsbF9zaXRlLCBwdHIpKTsKLQotI2VuZGlmIC8qIF9fS0VSTkVMX18gKi8KLQotI2VuZGlmIC8qIF9MSU5VWF9LTUVNVFJBQ0VfSCAqLwotCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2xvY2tkZXAuaCBiL2luY2x1ZGUvdHJhY2UvbG9ja2RlcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2E2N2RmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvbG9ja2RlcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9UUkFDRV9MT0NLREVQX0gKLSNkZWZpbmUgX1RSQUNFX0xPQ0tERVBfSAotCi0jaW5jbHVkZSA8bGludXgvbG9ja2RlcC5oPgotI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KLQotI2luY2x1ZGUgPHRyYWNlL2xvY2tkZXBfZXZlbnRfdHlwZXMuaD4KLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL2xvY2tkZXBfZXZlbnRfdHlwZXMuaCBiL2luY2x1ZGUvdHJhY2UvbG9ja2RlcF9ldmVudF90eXBlcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGNjZmNkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvbG9ja2RlcF9ldmVudF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotCi0jaWZuZGVmIFRSQUNFX0ZPUk1BVAotIyBlcnJvciBEbyBub3QgaW5jbHVkZSB0aGlzIGZpbGUgZGlyZWN0bHkuCi0jIGVycm9yIFVubGVzcyB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCi0jZW5kaWYKLQotI3VuZGVmIFRSQUNFX1NZU1RFTQotI2RlZmluZSBUUkFDRV9TWVNURU0gbG9jawotCi0jaWZkZWYgQ09ORklHX0xPQ0tERVAKLQotVFJBQ0VfRk9STUFUKGxvY2tfYWNxdWlyZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIHVuc2lnbmVkIGludCBzdWJjbGFzcywKLQkJaW50IHRyeWxvY2ssIGludCByZWFkLCBpbnQgY2hlY2ssCi0JCXN0cnVjdCBsb2NrZGVwX21hcCAqbmV4dF9sb2NrLCB1bnNpZ25lZCBsb25nIGlwKSwKLQlUUF9BUkdTKGxvY2ssIHN1YmNsYXNzLCB0cnlsb2NrLCByZWFkLCBjaGVjaywgbmV4dF9sb2NrLCBpcCksCi0JVFBfRk1UKCIlcyVzJXMiLCB0cnlsb2NrID8gInRyeSAiIDogIiIsCi0JCXJlYWQgPyAicmVhZCAiIDogIiIsIGxvY2stPm5hbWUpCi0JKTsKLQotVFJBQ0VfRk9STUFUKGxvY2tfcmVsZWFzZSwKLQlUUF9QUk9UTyhzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGludCBuZXN0ZWQsIHVuc2lnbmVkIGxvbmcgaXApLAotCVRQX0FSR1MobG9jaywgbmVzdGVkLCBpcCksCi0JVFBfRk1UKCIlcyIsIGxvY2stPm5hbWUpCi0JKTsKLQotI2lmZGVmIENPTkZJR19MT0NLX1NUQVQKLQotVFJBQ0VfRk9STUFUKGxvY2tfY29udGVuZGVkLAotCVRQX1BST1RPKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgdW5zaWduZWQgbG9uZyBpcCksCi0JVFBfQVJHUyhsb2NrLCBpcCksCi0JVFBfRk1UKCIlcyIsIGxvY2stPm5hbWUpCi0JKTsKLQotVFJBQ0VfRk9STUFUKGxvY2tfYWNxdWlyZWQsCi0JVFBfUFJPVE8oc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwKSwKLQlUUF9BUkdTKGxvY2ssIGlwKSwKLQlUUF9GTVQoIiVzIiwgbG9jay0+bmFtZSkKLQkpOwotCi0jZW5kaWYKLSNlbmRpZgotCi0jdW5kZWYgVFJBQ0VfU1lTVEVNCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL3NjaGVkLmggYi9pbmNsdWRlL3RyYWNlL3NjaGVkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzcyYTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS9zY2hlZC5oCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi0jaWZuZGVmIF9UUkFDRV9TQ0hFRF9ICi0jZGVmaW5lIF9UUkFDRV9TQ0hFRF9ICi0KLSNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgotI2luY2x1ZGUgPGxpbnV4L3RyYWNlcG9pbnQuaD4KLQotI2luY2x1ZGUgPHRyYWNlL3NjaGVkX2V2ZW50X3R5cGVzLmg+Ci0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS9za2IuaCBiL2luY2x1ZGUvdHJhY2Uvc2tiLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2NjIwNmQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS9za2IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExICswLDAgQEAKLSNpZm5kZWYgX1RSQUNFX1NLQl9IXwotI2RlZmluZSBfVFJBQ0VfU0tCX0hfCi0KLSNpbmNsdWRlIDxsaW51eC9za2J1ZmYuaD4KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+Ci0KLURFQ0xBUkVfVFJBQ0Uoa2ZyZWVfc2tiLAotCVRQX1BST1RPKHN0cnVjdCBza19idWZmICpza2IsIHZvaWQgKmxvY2F0aW9uKSwKLQlUUF9BUkdTKHNrYiwgbG9jYXRpb24pKTsKLQotI2VuZGlmCmRpZmYgLS1naXQgYS9pbmNsdWRlL3RyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmggYi9pbmNsdWRlL3RyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNTZmNTYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS90cmFjZV9ldmVudF90eXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi0vKiB0cmFjZS88dHlwZT5fZXZlbnRfdHlwZXMuaCBoZXJlICovCi0KLSNpbmNsdWRlIDx0cmFjZS9zY2hlZF9ldmVudF90eXBlcy5oPgotI2luY2x1ZGUgPHRyYWNlL2lycV9ldmVudF90eXBlcy5oPgotI2luY2x1ZGUgPHRyYWNlL2xvY2tkZXBfZXZlbnRfdHlwZXMuaD4KZGlmZiAtLWdpdCBhL2luY2x1ZGUvdHJhY2UvdHJhY2VfZXZlbnRzLmggYi9pbmNsdWRlL3RyYWNlL3RyYWNlX2V2ZW50cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDEzNzUwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvdHJhY2UvdHJhY2VfZXZlbnRzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1ICswLDAgQEAKLS8qIHRyYWNlLzx0eXBlPi5oIGhlcmUgKi8KLQotI2luY2x1ZGUgPHRyYWNlL3NjaGVkLmg+Ci0jaW5jbHVkZSA8dHJhY2UvaXJxLmg+Ci0jaW5jbHVkZSA8dHJhY2UvbG9ja2RlcC5oPgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS90cmFjZS93b3JrcXVldWUuaCBiL2luY2x1ZGUvdHJhY2Uvd29ya3F1ZXVlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MjY1MjMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS90cmFjZS93b3JrcXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLSNpZm5kZWYgX19UUkFDRV9XT1JLUVVFVUVfSAotI2RlZmluZSBfX1RSQUNFX1dPUktRVUVVRV9ICi0KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+Ci0jaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+Ci0jaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLQotREVDTEFSRV9UUkFDRSh3b3JrcXVldWVfaW5zZXJ0aW9uLAotCSAgIFRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqd3FfdGhyZWFkLCBzdHJ1Y3Qgd29ya19zdHJ1Y3QgKndvcmspLAotCSAgIFRQX0FSR1Mod3FfdGhyZWFkLCB3b3JrKSk7Ci0KLURFQ0xBUkVfVFJBQ0Uod29ya3F1ZXVlX2V4ZWN1dGlvbiwKLQkgICBUUF9QUk9UTyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKndxX3RocmVhZCwgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKSwKLQkgICBUUF9BUkdTKHdxX3RocmVhZCwgd29yaykpOwotCi0vKiBUcmFjZSB0aGUgY3JlYXRpb24gb2Ygb25lIHdvcmtxdWV1ZSB0aHJlYWQgb24gYSBjcHUgKi8KLURFQ0xBUkVfVFJBQ0Uod29ya3F1ZXVlX2NyZWF0aW9uLAotCSAgIFRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqd3FfdGhyZWFkLCBpbnQgY3B1KSwKLQkgICBUUF9BUkdTKHdxX3RocmVhZCwgY3B1KSk7Ci0KLURFQ0xBUkVfVFJBQ0Uod29ya3F1ZXVlX2Rlc3RydWN0aW9uLAotCSAgIFRQX1BST1RPKHN0cnVjdCB0YXNrX3N0cnVjdCAqd3FfdGhyZWFkKSwKLQkgICBUUF9BUkdTKHdxX3RocmVhZCkpOwotCi0jZW5kaWYgLyogX19UUkFDRV9XT1JLUVVFVUVfSCAqLwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS94ZW4vS2J1aWxkIGIvaW5jbHVkZS94ZW4vS2J1aWxkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNjVjMTYKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL3hlbi9LYnVpbGQKQEAgLTAsMCArMSBAQAoraGVhZGVyLXkgKz0gZXZ0Y2huLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2V2ZW50cy5oIGIvaW5jbHVkZS94ZW4vZXZlbnRzLmgKaW5kZXggMGQ1ZjFhZC4uZTY4ZDU5YSAxMDA2NDQKLS0tIGEvaW5jbHVkZS94ZW4vZXZlbnRzLmgKKysrIGIvaW5jbHVkZS94ZW4vZXZlbnRzLmgKQEAgLTUzLDQgKzUzLDcgQEAKICAgIGlycSB3aWxsIGJlIGRpc2FibGVkIHNvIGl0IHdvbid0IGRlbGl2ZXIgYW4gaW50ZXJydXB0LiAqLwogdm9pZCB4ZW5fcG9sbF9pcnEoaW50IGlycSk7CiAKKy8qIERldGVybWluZSB0aGUgSVJRIHdoaWNoIGlzIGJvdW5kIHRvIGFuIGV2ZW50IGNoYW5uZWwgKi8KK3Vuc2lnbmVkIGlycV9mcm9tX2V2dGNobih1bnNpZ25lZCBpbnQgZXZ0Y2huKTsKKwogI2VuZGlmCS8qIF9YRU5fRVZFTlRTX0ggKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2V2dGNobi5oIGIvaW5jbHVkZS94ZW4vZXZ0Y2huLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRlODMzZWU0Ci0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS94ZW4vZXZ0Y2huLmgKQEAgLTAsMCArMSw4OCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXZ0Y2huLmgKKyAqCisgKiBJbnRlcmZhY2UgdG8gL2Rldi94ZW4vZXZ0Y2huLgorICoKKyAqIENvcHlyaWdodCAoYykgMjAwMy0yMDA1LCBLIEEgRnJhc2VyCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgdmVyc2lvbiAyCisgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgb3IsIHdoZW4gZGlzdHJpYnV0ZWQKKyAqIHNlcGFyYXRlbHkgZnJvbSB0aGUgTGludXgga2VybmVsIG9yIGluY29ycG9yYXRlZCBpbnRvIG90aGVyCisgKiBzb2Z0d2FyZSBwYWNrYWdlcywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGxpY2Vuc2U6CisgKgorICogUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQorICogb2YgdGhpcyBzb3VyY2UgZmlsZSAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0CisgKiByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LAorICogbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsCisgKiBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvCisgKiB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisgKgorICogVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW4KKyAqIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgorICoKKyAqIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCisgKiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorICogQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorICogTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcKKyAqIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MKKyAqIElOIFRIRSBTT0ZUV0FSRS4KKyAqLworCisjaWZuZGVmIF9fTElOVVhfUFVCTElDX0VWVENITl9IX18KKyNkZWZpbmUgX19MSU5VWF9QVUJMSUNfRVZUQ0hOX0hfXworCisvKgorICogQmluZCBhIGZyZXNoIHBvcnQgdG8gVklSUSBAdmlycS4KKyAqIFJldHVybiBhbGxvY2F0ZWQgcG9ydC4KKyAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fQklORF9WSVJRCQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCAwLCBzaXplb2Yoc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX3ZpcnEpKQorc3RydWN0IGlvY3RsX2V2dGNobl9iaW5kX3ZpcnEgeworCXVuc2lnbmVkIGludCB2aXJxOworfTsKKworLyoKKyAqIEJpbmQgYSBmcmVzaCBwb3J0IHRvIHJlbW90ZSA8QHJlbW90ZV9kb21haW4sIEByZW1vdGVfcG9ydD4uCisgKiBSZXR1cm4gYWxsb2NhdGVkIHBvcnQuCisgKi8KKyNkZWZpbmUgSU9DVExfRVZUQ0hOX0JJTkRfSU5URVJET01BSU4JCQlcCisJX0lPQyhfSU9DX05PTkUsICdFJywgMSwgc2l6ZW9mKHN0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF9pbnRlcmRvbWFpbikpCitzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfaW50ZXJkb21haW4geworCXVuc2lnbmVkIGludCByZW1vdGVfZG9tYWluLCByZW1vdGVfcG9ydDsKK307CisKKy8qCisgKiBBbGxvY2F0ZSBhIGZyZXNoIHBvcnQgZm9yIGJpbmRpbmcgdG8gQHJlbW90ZV9kb21haW4uCisgKiBSZXR1cm4gYWxsb2NhdGVkIHBvcnQuCisgKi8KKyNkZWZpbmUgSU9DVExfRVZUQ0hOX0JJTkRfVU5CT1VORF9QT1JUCQkJXAorCV9JT0MoX0lPQ19OT05FLCAnRScsIDIsIHNpemVvZihzdHJ1Y3QgaW9jdGxfZXZ0Y2huX2JpbmRfdW5ib3VuZF9wb3J0KSkKK3N0cnVjdCBpb2N0bF9ldnRjaG5fYmluZF91bmJvdW5kX3BvcnQgeworCXVuc2lnbmVkIGludCByZW1vdGVfZG9tYWluOworfTsKKworLyoKKyAqIFVuYmluZCBwcmV2aW91c2x5IGFsbG9jYXRlZCBAcG9ydC4KKyAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fVU5CSU5ECQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCAzLCBzaXplb2Yoc3RydWN0IGlvY3RsX2V2dGNobl91bmJpbmQpKQorc3RydWN0IGlvY3RsX2V2dGNobl91bmJpbmQgeworCXVuc2lnbmVkIGludCBwb3J0OworfTsKKworLyoKKyAqIFVuYmluZCBwcmV2aW91c2x5IGFsbG9jYXRlZCBAcG9ydC4KKyAqLworI2RlZmluZSBJT0NUTF9FVlRDSE5fTk9USUZZCQkJCVwKKwlfSU9DKF9JT0NfTk9ORSwgJ0UnLCA0LCBzaXplb2Yoc3RydWN0IGlvY3RsX2V2dGNobl9ub3RpZnkpKQorc3RydWN0IGlvY3RsX2V2dGNobl9ub3RpZnkgeworCXVuc2lnbmVkIGludCBwb3J0OworfTsKKworLyogQ2xlYXIgYW5kIHJlaW5pdGlhbGlzZSB0aGUgZXZlbnQgYnVmZmVyLiBDbGVhciBlcnJvciBjb25kaXRpb24uICovCisjZGVmaW5lIElPQ1RMX0VWVENITl9SRVNFVAkJCQlcCisJX0lPQyhfSU9DX05PTkUsICdFJywgNSwgMCkKKworI2VuZGlmIC8qIF9fTElOVVhfUFVCTElDX0VWVENITl9IX18gKi8KZGlmZiAtLWdpdCBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS92ZXJzaW9uLmggYi9pbmNsdWRlL3hlbi9pbnRlcmZhY2UvdmVyc2lvbi5oCmluZGV4IDQ1MzIzNWUuLmU4YjY1MTkgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL2ludGVyZmFjZS92ZXJzaW9uLmgKKysrIGIvaW5jbHVkZS94ZW4vaW50ZXJmYWNlL3ZlcnNpb24uaApAQCAtNTcsNCArNTcsNyBAQAogLyogRGVjbGFyZXMgdGhlIGZlYXR1cmVzIHJlcG9ydGVkIGJ5IFhFTlZFUl9nZXRfZmVhdHVyZXMuICovCiAjaW5jbHVkZSAiZmVhdHVyZXMuaCIKIAorLyogYXJnID09IE5VTEw7IHJldHVybnMgaG9zdCBtZW1vcnkgcGFnZSBzaXplLiAqLworI2RlZmluZSBYRU5WRVJfcGFnZXNpemUgNworCiAjZW5kaWYgLyogX19YRU5fUFVCTElDX1ZFUlNJT05fSF9fICovCmRpZmYgLS1naXQgYS9pbmNsdWRlL3hlbi94ZW5idXMuaCBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCmluZGV4IGY4N2Y5NjEuLmI5NzYzYmEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUveGVuL3hlbmJ1cy5oCisrKyBiL2luY2x1ZGUveGVuL3hlbmJ1cy5oCkBAIC05MSw4ICs5MSw3IEBACiAJdm9pZCAoKm90aGVyZW5kX2NoYW5nZWQpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYsCiAJCQkJIGVudW0geGVuYnVzX3N0YXRlIGJhY2tlbmRfc3RhdGUpOwogCWludCAoKnJlbW92ZSkoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldik7Ci0JaW50ICgqc3VzcGVuZCkoc3RydWN0IHhlbmJ1c19kZXZpY2UgKmRldik7Ci0JaW50ICgqc3VzcGVuZF9jYW5jZWwpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYpOworCWludCAoKnN1c3BlbmQpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICpkZXYsIHBtX21lc3NhZ2VfdCBzdGF0ZSk7CiAJaW50ICgqcmVzdW1lKShzdHJ1Y3QgeGVuYnVzX2RldmljZSAqZGV2KTsKIAlpbnQgKCp1ZXZlbnQpKHN0cnVjdCB4ZW5idXNfZGV2aWNlICosIGNoYXIgKiosIGludCwgY2hhciAqLCBpbnQpOwogCXN0cnVjdCBkZXZpY2VfZHJpdmVyIGRyaXZlcjsKZGlmZiAtLWdpdCBhL2luaXQvS2NvbmZpZyBiL2luaXQvS2NvbmZpZwppbmRleCA3YmU0ZDM4Li45YjY4ZmVlIDEwMDY0NAotLS0gYS9pbml0L0tjb25maWcKKysrIGIvaW5pdC9LY29uZmlnCkBAIC0zMDgsNyArMzA4LDcgQEAKIAogY2hvaWNlCiAJcHJvbXB0ICJSQ1UgSW1wbGVtZW50YXRpb24iCi0JZGVmYXVsdCBDTEFTU0lDX1JDVQorCWRlZmF1bHQgVFJFRV9SQ1UKIAogY29uZmlnIENMQVNTSUNfUkNVCiAJYm9vbCAiQ2xhc3NpYyBSQ1UiCkBAIC05MzMsNiArOTMzLDQwIEBACiAgICAgICAgICAgYnkgc29tZSBoaWdoIHBlcmZvcm1hbmNlIHRocmVhZGVkIGFwcGxpY2F0aW9ucy4gRGlzYWJsaW5nCiAgICAgICAgICAgdGhpcyBvcHRpb24gc2F2ZXMgYWJvdXQgN2suCiAKK2NvbmZpZyBIQVZFX1BFUkZfQ09VTlRFUlMKKwlib29sCisKK21lbnUgIlBlcmZvcm1hbmNlIENvdW50ZXJzIgorCitjb25maWcgUEVSRl9DT1VOVEVSUworCWJvb2wgIktlcm5lbCBQZXJmb3JtYW5jZSBDb3VudGVycyIKKwlkZXBlbmRzIG9uIEhBVkVfUEVSRl9DT1VOVEVSUworCXNlbGVjdCBBTk9OX0lOT0RFUworCWhlbHAKKwkgIEVuYWJsZSBrZXJuZWwgc3VwcG9ydCBmb3IgcGVyZm9ybWFuY2UgY291bnRlciBoYXJkd2FyZS4KKworCSAgUGVyZm9ybWFuY2UgY291bnRlcnMgYXJlIHNwZWNpYWwgaGFyZHdhcmUgcmVnaXN0ZXJzIGF2YWlsYWJsZQorCSAgb24gbW9zdCBtb2Rlcm4gQ1BVcy4gVGhlc2UgcmVnaXN0ZXJzIGNvdW50IHRoZSBudW1iZXIgb2YgY2VydGFpbgorCSAgdHlwZXMgb2YgaHcgZXZlbnRzOiBzdWNoIGFzIGluc3RydWN0aW9ucyBleGVjdXRlZCwgY2FjaGVtaXNzZXMKKwkgIHN1ZmZlcmVkLCBvciBicmFuY2hlcyBtaXMtcHJlZGljdGVkIC0gd2l0aG91dCBzbG93aW5nIGRvd24gdGhlCisJICBrZXJuZWwgb3IgYXBwbGljYXRpb25zLiBUaGVzZSByZWdpc3RlcnMgY2FuIGFsc28gdHJpZ2dlciBpbnRlcnJ1cHRzCisJICB3aGVuIGEgdGhyZXNob2xkIG51bWJlciBvZiBldmVudHMgaGF2ZSBwYXNzZWQgLSBhbmQgY2FuIHRodXMgYmUKKwkgIHVzZWQgdG8gcHJvZmlsZSB0aGUgY29kZSB0aGF0IHJ1bnMgb24gdGhhdCBDUFUuCisKKwkgIFRoZSBMaW51eCBQZXJmb3JtYW5jZSBDb3VudGVyIHN1YnN5c3RlbSBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBvZgorCSAgdGhlc2UgaGFyZHdhcmUgY2FwYWJpbGl0aWVzLCBhdmFpbGFibGUgdmlhIGEgc3lzdGVtIGNhbGwuIEl0CisJICBwcm92aWRlcyBwZXIgdGFzayBhbmQgcGVyIENQVSBjb3VudGVycywgYW5kIGl0IHByb3ZpZGVzIGV2ZW50CisJICBjYXBhYmlsaXRpZXMgb24gdG9wIG9mIHRob3NlLgorCisJICBTYXkgWSBpZiB1bnN1cmUuCisKK2NvbmZpZyBFVkVOVF9QUk9GSUxFCisJYm9vbCAiVHJhY2Vwb2ludCBwcm9maWxlIHNvdXJjZXMiCisJZGVwZW5kcyBvbiBQRVJGX0NPVU5URVJTICYmIEVWRU5UX1RSQUNFUgorCWRlZmF1bHQgeQorCitlbmRtZW51CisKIGNvbmZpZyBWTV9FVkVOVF9DT1VOVEVSUwogCWRlZmF1bHQgeQogCWJvb2wgIkVuYWJsZSBWTSBldmVudCBjb3VudGVycyBmb3IgL3Byb2Mvdm1zdGF0IiBpZiBFTUJFRERFRApkaWZmIC0tZ2l0IGEvaW5pdC9tYWluLmMgYi9pbml0L21haW4uYwppbmRleCBkNzIxZGFkLi5iYjdkYzU3IDEwMDY0NAotLS0gYS9pbml0L21haW4uYworKysgYi9pbml0L21haW4uYwpAQCAtNjQsNiArNjQsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2lkci5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L2FzeW5jLmg+CisjaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8dHJhY2UvYm9vdC5oPgogCiAjaW5jbHVkZSA8YXNtL2lvLmg+CkBAIC03MSw3ICs3Miw2IEBACiAjaW5jbHVkZSA8YXNtL3NldHVwLmg+CiAjaW5jbHVkZSA8YXNtL3NlY3Rpb25zLmg+CiAjaW5jbHVkZSA8YXNtL2NhY2hlZmx1c2guaD4KLSNpbmNsdWRlIDx0cmFjZS9rbWVtdHJhY2UuaD4KIAogI2lmZGVmIENPTkZJR19YODZfTE9DQUxfQVBJQwogI2luY2x1ZGUgPGFzbS9zbXAuaD4KZGlmZiAtLWdpdCBhL2lwYy9zZW0uYyBiL2lwYy9zZW0uYwppbmRleCAxNmEyMTg5Li44N2MyYjY0IDEwMDY0NAotLS0gYS9pcGMvc2VtLmMKKysrIGIvaXBjL3NlbS5jCkBAIC0xMjkwLDggKzEyOTAsOCBAQAogCQlpbnQgaTsKIAogCQlyY3VfcmVhZF9sb2NrKCk7Ci0JCXVuID0gbGlzdF9lbnRyeShyY3VfZGVyZWZlcmVuY2UodWxwLT5saXN0X3Byb2MubmV4dCksCi0JCQkJCXN0cnVjdCBzZW1fdW5kbywgbGlzdF9wcm9jKTsKKwkJdW4gPSBsaXN0X2VudHJ5X3JjdSh1bHAtPmxpc3RfcHJvYy5uZXh0LAorCQkJCSAgICBzdHJ1Y3Qgc2VtX3VuZG8sIGxpc3RfcHJvYyk7CiAJCWlmICgmdW4tPmxpc3RfcHJvYyA9PSAmdWxwLT5saXN0X3Byb2MpCiAJCQlzZW1pZCA9IC0xOwogCQkgZWxzZQpkaWZmIC0tZ2l0IGEva2VybmVsL01ha2VmaWxlIGIva2VybmVsL01ha2VmaWxlCmluZGV4IDQyNDIzNjYuLjkwYjUzZjYgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9NYWtlZmlsZQorKysgYi9rZXJuZWwvTWFrZWZpbGUKQEAgLTkzLDggKzkzLDEwIEBACiBvYmotJChDT05GSUdfSEFWRV9HRU5FUklDX0RNQV9DT0hFUkVOVCkgKz0gZG1hLWNvaGVyZW50Lm8KIG9iai0kKENPTkZJR19GVU5DVElPTl9UUkFDRVIpICs9IHRyYWNlLwogb2JqLSQoQ09ORklHX1RSQUNJTkcpICs9IHRyYWNlLworb2JqLSQoQ09ORklHX1g4Nl9EUykgKz0gdHJhY2UvCiBvYmotJChDT05GSUdfU01QKSArPSBzY2hlZF9jcHVwcmkubwogb2JqLSQoQ09ORklHX1NMT1dfV09SSykgKz0gc2xvdy13b3JrLm8KK29iai0kKENPTkZJR19QRVJGX0NPVU5URVJTKSArPSBwZXJmX2NvdW50ZXIubwogCiBpZm5lcSAoJChDT05GSUdfU0NIRURfT01JVF9GUkFNRV9QT0lOVEVSKSx5KQogIyBBY2NvcmRpbmcgdG8gQWxhbiBNb2RyYSA8YWxhbkBsaW51eGNhcmUuY29tLmF1PiwgdGhlIC1mbm8tb21pdC1mcmFtZS1wb2ludGVyIGlzCmRpZmYgLS1naXQgYS9rZXJuZWwvY29tcGF0LmMgYi9rZXJuZWwvY29tcGF0LmMKaW5kZXggNDJkNTY1NC4uZjZjMjA0ZjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9jb21wYXQuYworKysgYi9rZXJuZWwvY29tcGF0LmMKQEAgLTg4Miw2ICs4ODIsMTcgQEAKIAogfQogCithc21saW5rYWdlIGxvbmcKK2NvbXBhdF9zeXNfcnRfdGdzaWdxdWV1ZWluZm8oY29tcGF0X3BpZF90IHRnaWQsIGNvbXBhdF9waWRfdCBwaWQsIGludCBzaWcsCisJCQkgICAgIHN0cnVjdCBjb21wYXRfc2lnaW5mbyBfX3VzZXIgKnVpbmZvKQoreworCXNpZ2luZm9fdCBpbmZvOworCisJaWYgKGNvcHlfc2lnaW5mb19mcm9tX3VzZXIzMigmaW5mbywgdWluZm8pKQorCQlyZXR1cm4gLUVGQVVMVDsKKwlyZXR1cm4gZG9fcnRfdGdzaWdxdWV1ZWluZm8odGdpZCwgcGlkLCBzaWcsICZpbmZvKTsKK30KKwogI2lmZGVmIF9fQVJDSF9XQU5UX0NPTVBBVF9TWVNfVElNRQogCiAvKiBjb21wYXRfdGltZV90IGlzIGEgMzIgYml0ICJsb25nIiBhbmQgbmVlZHMgdG8gZ2V0IGNvbnZlcnRlZC4gKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9leGl0LmMgYi9rZXJuZWwvZXhpdC5jCmluZGV4IGFiZjljZjMuLjQ5Y2RmNjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9leGl0LmMKKysrIGIva2VybmVsL2V4aXQuYwpAQCAtNDgsNyArNDgsOCBAQAogI2luY2x1ZGUgPGxpbnV4L3RyYWNlaG9vay5oPgogI2luY2x1ZGUgPGxpbnV4L2ZzX3N0cnVjdC5oPgogI2luY2x1ZGUgPGxpbnV4L2luaXRfdGFzay5oPgotI2luY2x1ZGUgPHRyYWNlL3NjaGVkLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KQEAgLTU2LDEwICs1Nyw2IEBACiAjaW5jbHVkZSA8YXNtL21tdV9jb250ZXh0Lmg+CiAjaW5jbHVkZSAiY3JlZC1pbnRlcm5hbHMuaCIKIAotREVGSU5FX1RSQUNFKHNjaGVkX3Byb2Nlc3NfZnJlZSk7Ci1ERUZJTkVfVFJBQ0Uoc2NoZWRfcHJvY2Vzc19leGl0KTsKLURFRklORV9UUkFDRShzY2hlZF9wcm9jZXNzX3dhaXQpOwotCiBzdGF0aWMgdm9pZCBleGl0X21tKHN0cnVjdCB0YXNrX3N0cnVjdCAqIHRzayk7CiAKIHN0YXRpYyB2b2lkIF9fdW5oYXNoX3Byb2Nlc3Moc3RydWN0IHRhc2tfc3RydWN0ICpwKQpAQCAtMTU4LDYgKzE1NSw5IEBACiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0c2sgPSBjb250YWluZXJfb2YocmhwLCBzdHJ1Y3QgdGFza19zdHJ1Y3QsIHJjdSk7CiAKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworCVdBUk5fT05fT05DRSh0c2stPnBlcmZfY291bnRlcl9jdHhwKTsKKyNlbmRpZgogCXRyYWNlX3NjaGVkX3Byb2Nlc3NfZnJlZSh0c2spOwogCXB1dF90YXNrX3N0cnVjdCh0c2spOwogfQpAQCAtMTc0LDYgKzE3NCw3IEBACiAJYXRvbWljX2RlYygmX190YXNrX2NyZWQocCktPnVzZXItPnByb2Nlc3Nlcyk7CiAKIAlwcm9jX2ZsdXNoX3Rhc2socCk7CisKIAl3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jayk7CiAJdHJhY2Vob29rX2ZpbmlzaF9yZWxlYXNlX3Rhc2socCk7CiAJX19leGl0X3NpZ25hbChwKTsKQEAgLTk3NSwxNiArOTc2LDE5IEBACiAJCW1vZHVsZV9wdXQodHNrLT5iaW5mbXQtPm1vZHVsZSk7CiAKIAlwcm9jX2V4aXRfY29ubmVjdG9yKHRzayk7CisKKwkvKgorCSAqIEZsdXNoIGluaGVyaXRlZCBjb3VudGVycyB0byB0aGUgcGFyZW50IC0gYmVmb3JlIHRoZSBwYXJlbnQKKwkgKiBnZXRzIHdva2VuIHVwIGJ5IGNoaWxkLWV4aXQgbm90aWZpY2F0aW9ucy4KKwkgKi8KKwlwZXJmX2NvdW50ZXJfZXhpdF90YXNrKHRzayk7CisKIAlleGl0X25vdGlmeSh0c2ssIGdyb3VwX2RlYWQpOwogI2lmZGVmIENPTkZJR19OVU1BCiAJbXBvbF9wdXQodHNrLT5tZW1wb2xpY3kpOwogCXRzay0+bWVtcG9saWN5ID0gTlVMTDsKICNlbmRpZgogI2lmZGVmIENPTkZJR19GVVRFWAotCS8qCi0JICogVGhpcyBtdXN0IGhhcHBlbiBsYXRlLCBhZnRlciB0aGUgUElEIGlzIG5vdAotCSAqIGhhc2hlZCBhbnltb3JlOgotCSAqLwogCWlmICh1bmxpa2VseSghbGlzdF9lbXB0eSgmdHNrLT5waV9zdGF0ZV9saXN0KSkpCiAJCWV4aXRfcGlfc3RhdGVfbGlzdCh0c2spOwogCWlmICh1bmxpa2VseShjdXJyZW50LT5waV9zdGF0ZV9jYWNoZSkpCmRpZmYgLS1naXQgYS9rZXJuZWwvZm9yay5jIGIva2VybmVsL2ZvcmsuYwppbmRleCA4NzVmZmJkLi40NDMwZWIxIDEwMDY0NAotLS0gYS9rZXJuZWwvZm9yay5jCisrKyBiL2tlcm5lbC9mb3JrLmMKQEAgLTYxLDggKzYxLDggQEAKICNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrZGV2Lmg+CiAjaW5jbHVkZSA8bGludXgvZnNfc3RydWN0Lmg+Ci0jaW5jbHVkZSA8dHJhY2Uvc2NoZWQuaD4KICNpbmNsdWRlIDxsaW51eC9tYWdpYy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogCiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vcGdhbGxvYy5oPgpAQCAtNzEsNiArNzEsOCBAQAogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CiAjaW5jbHVkZSA8YXNtL3RsYmZsdXNoLmg+CiAKKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2NoZWQuaD4KKwogLyoKICAqIFByb3RlY3RlZCBjb3VudGVycyBieSB3cml0ZV9sb2NrX2lycSgmdGFza2xpc3RfbG9jaykKICAqLwpAQCAtODMsOCArODUsNiBAQAogCiBfX2NhY2hlbGluZV9hbGlnbmVkIERFRklORV9SV0xPQ0sodGFza2xpc3RfbG9jayk7ICAvKiBvdXRlciAqLwogCi1ERUZJTkVfVFJBQ0Uoc2NoZWRfcHJvY2Vzc19mb3JrKTsKLQogaW50IG5yX3Byb2Nlc3Nlcyh2b2lkKQogewogCWludCBjcHU7CkBAIC05ODIsNiArOTgyLDggQEAKIAlpZiAoIXApCiAJCWdvdG8gZm9ya19vdXQ7CiAKKwlmdHJhY2VfZ3JhcGhfaW5pdF90YXNrKHApOworCiAJcnRfbXV0ZXhfaW5pdF90YXNrKHApOwogCiAjaWZkZWYgQ09ORklHX1BST1ZFX0xPQ0tJTkcKQEAgLTEwODksMTIgKzEwOTEsMTYgQEAKICNpZmRlZiBDT05GSUdfREVCVUdfTVVURVhFUwogCXAtPmJsb2NrZWRfb24gPSBOVUxMOyAvKiBub3QgYmxvY2tlZCB5ZXQgKi8KICNlbmRpZgotCWlmICh1bmxpa2VseShjdXJyZW50LT5wdHJhY2UpKQotCQlwdHJhY2VfZm9yayhwLCBjbG9uZV9mbGFncyk7CisKKwlwLT5idHMgPSBOVUxMOwogCiAJLyogUGVyZm9ybSBzY2hlZHVsZXIgcmVsYXRlZCBzZXR1cC4gQXNzaWduIHRoaXMgdGFzayB0byBhIENQVS4gKi8KIAlzY2hlZF9mb3JrKHAsIGNsb25lX2ZsYWdzKTsKIAorCXJldHZhbCA9IHBlcmZfY291bnRlcl9pbml0X3Rhc2socCk7CisJaWYgKHJldHZhbCkKKwkJZ290byBiYWRfZm9ya19jbGVhbnVwX3BvbGljeTsKKwogCWlmICgocmV0dmFsID0gYXVkaXRfYWxsb2MocCkpKQogCQlnb3RvIGJhZF9mb3JrX2NsZWFudXBfcG9saWN5OwogCS8qIGNvcHkgYWxsIHRoZSBwcm9jZXNzIGluZm9ybWF0aW9uICovCkBAIC0xMTMxLDggKzExMzcsNiBAQAogCQl9CiAJfQogCi0JZnRyYWNlX2dyYXBoX2luaXRfdGFzayhwKTsKLQogCXAtPnBpZCA9IHBpZF9ucihwaWQpOwogCXAtPnRnaWQgPSBwLT5waWQ7CiAJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfVEhSRUFEKQpAQCAtMTE0MSw3ICsxMTQ1LDcgQEAKIAlpZiAoY3VycmVudC0+bnNwcm94eSAhPSBwLT5uc3Byb3h5KSB7CiAJCXJldHZhbCA9IG5zX2Nncm91cF9jbG9uZShwLCBwaWQpOwogCQlpZiAocmV0dmFsKQotCQkJZ290byBiYWRfZm9ya19mcmVlX2dyYXBoOworCQkJZ290byBiYWRfZm9ya19mcmVlX3BpZDsKIAl9CiAKIAlwLT5zZXRfY2hpbGRfdGlkID0gKGNsb25lX2ZsYWdzICYgQ0xPTkVfQ0hJTERfU0VUVElEKSA/IGNoaWxkX3RpZHB0ciA6IE5VTEw7CkBAIC0xMjMzLDcgKzEyMzcsNyBAQAogCQlzcGluX3VubG9jaygmY3VycmVudC0+c2lnaGFuZC0+c2lnbG9jayk7CiAJCXdyaXRlX3VubG9ja19pcnEoJnRhc2tsaXN0X2xvY2spOwogCQlyZXR2YWwgPSAtRVJFU1RBUlROT0lOVFI7Ci0JCWdvdG8gYmFkX2ZvcmtfZnJlZV9ncmFwaDsKKwkJZ290byBiYWRfZm9ya19mcmVlX3BpZDsKIAl9CiAKIAlpZiAoY2xvbmVfZmxhZ3MgJiBDTE9ORV9USFJFQUQpIHsKQEAgLTEyNjgsOCArMTI3Miw2IEBACiAJY2dyb3VwX3Bvc3RfZm9yayhwKTsKIAlyZXR1cm4gcDsKIAotYmFkX2ZvcmtfZnJlZV9ncmFwaDoKLQlmdHJhY2VfZ3JhcGhfZXhpdF90YXNrKHApOwogYmFkX2ZvcmtfZnJlZV9waWQ6CiAJaWYgKHBpZCAhPSAmaW5pdF9zdHJ1Y3RfcGlkKQogCQlmcmVlX3BpZChwaWQpOwpAQCAtMTI5Myw2ICsxMjk1LDcgQEAKIGJhZF9mb3JrX2NsZWFudXBfYXVkaXQ6CiAJYXVkaXRfZnJlZShwKTsKIGJhZF9mb3JrX2NsZWFudXBfcG9saWN5OgorCXBlcmZfY291bnRlcl9mcmVlX3Rhc2socCk7CiAjaWZkZWYgQ09ORklHX05VTUEKIAltcG9sX3B1dChwLT5tZW1wb2xpY3kpOwogYmFkX2ZvcmtfY2xlYW51cF9jZ3JvdXA6CkBAIC0xNDA2LDYgKzE0MDksMTIgQEAKIAkJaWYgKGNsb25lX2ZsYWdzICYgQ0xPTkVfVkZPUkspIHsKIAkJCXAtPnZmb3JrX2RvbmUgPSAmdmZvcms7CiAJCQlpbml0X2NvbXBsZXRpb24oJnZmb3JrKTsKKwkJfSBlbHNlIGlmICghKGNsb25lX2ZsYWdzICYgQ0xPTkVfVk0pKSB7CisJCQkvKgorCQkJICogdmZvcmsgd2lsbCBkbyBhbiBleGVjIHdoaWNoIHdpbGwgY2FsbAorCQkJICogc2V0X3Rhc2tfY29tbSgpCisJCQkgKi8KKwkJCXBlcmZfY291bnRlcl9mb3JrKHApOwogCQl9CiAKIAkJYXVkaXRfZmluaXNoX2ZvcmsocCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvZnV0ZXguYyBiL2tlcm5lbC9mdXRleC5jCmluZGV4IGQ1NDZiMmQuLjgwYjVjZTcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9mdXRleC5jCisrKyBiL2tlcm5lbC9mdXRleC5jCkBAIC0xOSw2ICsxOSwxMCBAQAogICogIFBSSVZBVEUgZnV0ZXhlcyBieSBFcmljIER1bWF6ZXQKICAqICBDb3B5cmlnaHQgKEMpIDIwMDcgRXJpYyBEdW1hemV0IDxkYWRhMUBjb3Ntb3NiYXkuY29tPgogICoKKyAqICBSZXF1ZXVlLVBJIHN1cHBvcnQgYnkgRGFycmVuIEhhcnQgPGR2aGx0Y0B1cy5pYm0uY29tPgorICogIENvcHlyaWdodCAoQykgSUJNIENvcnBvcmF0aW9uLCAyMDA5CisgKiAgVGhhbmtzIHRvIFRob21hcyBHbGVpeG5lciBmb3IgY29uY2VwdHVhbCBkZXNpZ24gYW5kIGNhcmVmdWwgcmV2aWV3cy4KKyAqCiAgKiAgVGhhbmtzIHRvIEJlbiBMYUhhaXNlIGZvciB5ZWxsaW5nICJoYXNoZWQgd2FpdHF1ZXVlcyIgbG91ZGx5CiAgKiAgZW5vdWdoIGF0IG1lLCBMaW51cyBmb3IgdGhlIG9yaWdpbmFsIChmbGF3ZWQpIGlkZWEsIE1hdHRoZXcKICAqICBLaXJrd29vZCBmb3IgcHJvb2Ytb2YtY29uY2VwdCBpbXBsZW1lbnRhdGlvbi4KQEAgLTk2LDggKzEwMCw4IEBACiAgKi8KIHN0cnVjdCBmdXRleF9xIHsKIAlzdHJ1Y3QgcGxpc3Rfbm9kZSBsaXN0OwotCS8qIFRoZXJlIGNhbiBvbmx5IGJlIGEgc2luZ2xlIHdhaXRlciAqLwotCXdhaXRfcXVldWVfaGVhZF90IHdhaXRlcjsKKwkvKiBXYWl0ZXIgcmVmZXJlbmNlICovCisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCiAJLyogV2hpY2ggaGFzaCBsaXN0IGxvY2sgdG8gdXNlOiAqLwogCXNwaW5sb2NrX3QgKmxvY2tfcHRyOwpAQCAtMTA3LDcgKzExMSw5IEBACiAKIAkvKiBPcHRpb25hbCBwcmlvcml0eSBpbmhlcml0YW5jZSBzdGF0ZTogKi8KIAlzdHJ1Y3QgZnV0ZXhfcGlfc3RhdGUgKnBpX3N0YXRlOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzazsKKworCS8qIHJ0X3dhaXRlciBzdG9yYWdlIGZvciByZXF1ZXVlX3BpOiAqLworCXN0cnVjdCBydF9tdXRleF93YWl0ZXIgKnJ0X3dhaXRlcjsKIAogCS8qIEJpdHNldCBmb3IgdGhlIG9wdGlvbmFsIGJpdG1hc2tlZCB3YWtldXAgKi8KIAl1MzIgYml0c2V0OwpAQCAtMjc4LDYgKzI4NCwyNSBAQAogCWRyb3BfZnV0ZXhfa2V5X3JlZnMoa2V5KTsKIH0KIAorLyoqCisgKiBmdXRleF90b3Bfd2FpdGVyKCkgLSBSZXR1cm4gdGhlIGhpZ2hlc3QgcHJpb3JpdHkgd2FpdGVyIG9uIGEgZnV0ZXgKKyAqIEBoYjogICAgIHRoZSBoYXNoIGJ1Y2tldCB0aGUgZnV0ZXhfcSdzIHJlc2lkZSBpbgorICogQGtleTogICAgdGhlIGZ1dGV4IGtleSAodG8gZGlzdGluZ3Vpc2ggaXQgZnJvbSBvdGhlciBmdXRleCBmdXRleF9xJ3MpCisgKgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgaGIgbG9jayBoZWxkLgorICovCitzdGF0aWMgc3RydWN0IGZ1dGV4X3EgKmZ1dGV4X3RvcF93YWl0ZXIoc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYiwKKwkJCQkJdW5pb24gZnV0ZXhfa2V5ICprZXkpCit7CisJc3RydWN0IGZ1dGV4X3EgKnRoaXM7CisKKwlwbGlzdF9mb3JfZWFjaF9lbnRyeSh0aGlzLCAmaGItPmNoYWluLCBsaXN0KSB7CisJCWlmIChtYXRjaF9mdXRleCgmdGhpcy0+a2V5LCBrZXkpKQorCQkJcmV0dXJuIHRoaXM7CisJfQorCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgdTMyIGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHUzMiBfX3VzZXIgKnVhZGRyLCB1MzIgdXZhbCwgdTMyIG5ld3ZhbCkKIHsKIAl1MzIgY3VydmFsOwpAQCAtNTM5LDI4ICs1NjQsMTYwIEBACiAJcmV0dXJuIDA7CiB9CiAKKy8qKgorICogZnV0ZXhfbG9ja19waV9hdG9taWMoKSAtIGF0b21pYyB3b3JrIHJlcXVpcmVkIHRvIGFjcXVpcmUgYSBwaSBhd2FyZSBmdXRleAorICogQHVhZGRyOgkJdGhlIHBpIGZ1dGV4IHVzZXIgYWRkcmVzcworICogQGhiOgkJCXRoZSBwaSBmdXRleCBoYXNoIGJ1Y2tldAorICogQGtleToJCXRoZSBmdXRleCBrZXkgYXNzb2NpYXRlZCB3aXRoIHVhZGRyIGFuZCBoYgorICogQHBzOgkJCXRoZSBwaV9zdGF0ZSBwb2ludGVyIHdoZXJlIHdlIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlCisgKgkJCWxvb2t1cAorICogQHRhc2s6CQl0aGUgdGFzayB0byBwZXJmb3JtIHRoZSBhdG9taWMgbG9jayB3b3JrIGZvci4gIFRoaXMgd2lsbAorICoJCQliZSAiY3VycmVudCIgZXhjZXB0IGluIHRoZSBjYXNlIG9mIHJlcXVldWUgcGkuCisgKiBAc2V0X3dhaXRlcnM6CWZvcmNlIHNldHRpbmcgdGhlIEZVVEVYX1dBSVRFUlMgYml0ICgxKSBvciBub3QgKDApCisgKgorICogUmV0dXJuczoKKyAqICAwIC0gcmVhZHkgdG8gd2FpdAorICogIDEgLSBhY3F1aXJlZCB0aGUgbG9jaworICogPDAgLSBlcnJvcgorICoKKyAqIFRoZSBoYi0+bG9jayBhbmQgZnV0ZXhfa2V5IHJlZnMgc2hhbGwgYmUgaGVsZCBieSB0aGUgY2FsbGVyLgorICovCitzdGF0aWMgaW50IGZ1dGV4X2xvY2tfcGlfYXRvbWljKHUzMiBfX3VzZXIgKnVhZGRyLCBzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiLAorCQkJCXVuaW9uIGZ1dGV4X2tleSAqa2V5LAorCQkJCXN0cnVjdCBmdXRleF9waV9zdGF0ZSAqKnBzLAorCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IHNldF93YWl0ZXJzKQoreworCWludCBsb2NrX3Rha2VuLCByZXQsIG93bmVyZGllZCA9IDA7CisJdTMyIHV2YWwsIG5ld3ZhbCwgY3VydmFsOworCityZXRyeToKKwlyZXQgPSBsb2NrX3Rha2VuID0gMDsKKworCS8qCisJICogVG8gYXZvaWQgcmFjZXMsIHdlIGF0dGVtcHQgdG8gdGFrZSB0aGUgbG9jayBoZXJlIGFnYWluCisJICogKGJ5IGRvaW5nIGEgMCAtPiBUSUQgYXRvbWljIGNtcHhjaGcpLCB3aGlsZSBob2xkaW5nIGFsbAorCSAqIHRoZSBsb2Nrcy4gSXQgd2lsbCBtb3N0IGxpa2VseSBub3Qgc3VjY2VlZC4KKwkgKi8KKwluZXd2YWwgPSB0YXNrX3BpZF92bnIodGFzayk7CisJaWYgKHNldF93YWl0ZXJzKQorCQluZXd2YWwgfD0gRlVURVhfV0FJVEVSUzsKKworCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCAwLCBuZXd2YWwpOworCisJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwkvKgorCSAqIERldGVjdCBkZWFkbG9ja3MuCisJICovCisJaWYgKCh1bmxpa2VseSgoY3VydmFsICYgRlVURVhfVElEX01BU0spID09IHRhc2tfcGlkX3Zucih0YXNrKSkpKQorCQlyZXR1cm4gLUVERUFETEs7CisKKwkvKgorCSAqIFN1cnByaXNlIC0gd2UgZ290IHRoZSBsb2NrLiBKdXN0IHJldHVybiB0byB1c2Vyc3BhY2U6CisJICovCisJaWYgKHVubGlrZWx5KCFjdXJ2YWwpKQorCQlyZXR1cm4gMTsKKworCXV2YWwgPSBjdXJ2YWw7CisKKwkvKgorCSAqIFNldCB0aGUgRlVURVhfV0FJVEVSUyBmbGFnLCBzbyB0aGUgb3duZXIgd2lsbCBrbm93IGl0IGhhcyBzb21lb25lCisJICogdG8gd2FrZSBhdCB0aGUgbmV4dCB1bmxvY2suCisJICovCisJbmV3dmFsID0gY3VydmFsIHwgRlVURVhfV0FJVEVSUzsKKworCS8qCisJICogVGhlcmUgYXJlIHR3byBjYXNlcywgd2hlcmUgYSBmdXRleCBtaWdodCBoYXZlIG5vIG93bmVyICh0aGUKKwkgKiBvd25lciBUSUQgaXMgMCk6IE9XTkVSX0RJRUQuIFdlIHRha2Ugb3ZlciB0aGUgZnV0ZXggaW4gdGhpcworCSAqIGNhc2UuIFdlIGFsc28gZG8gYW4gdW5jb25kaXRpb25hbCB0YWtlIG92ZXIsIHdoZW4gdGhlIG93bmVyCisJICogb2YgdGhlIGZ1dGV4IGRpZWQuCisJICoKKwkgKiBUaGlzIGlzIHNhZmUgYXMgd2UgYXJlIHByb3RlY3RlZCBieSB0aGUgaGFzaCBidWNrZXQgbG9jayAhCisJICovCisJaWYgKHVubGlrZWx5KG93bmVyZGllZCB8fCAhKGN1cnZhbCAmIEZVVEVYX1RJRF9NQVNLKSkpIHsKKwkJLyogS2VlcCB0aGUgT1dORVJfRElFRCBiaXQgKi8KKwkJbmV3dmFsID0gKGN1cnZhbCAmIH5GVVRFWF9USURfTUFTSykgfCB0YXNrX3BpZF92bnIodGFzayk7CisJCW93bmVyZGllZCA9IDA7CisJCWxvY2tfdGFrZW4gPSAxOworCX0KKworCWN1cnZhbCA9IGNtcHhjaGdfZnV0ZXhfdmFsdWVfbG9ja2VkKHVhZGRyLCB1dmFsLCBuZXd2YWwpOworCisJaWYgKHVubGlrZWx5KGN1cnZhbCA9PSAtRUZBVUxUKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisJaWYgKHVubGlrZWx5KGN1cnZhbCAhPSB1dmFsKSkKKwkJZ290byByZXRyeTsKKworCS8qCisJICogV2UgdG9vayB0aGUgbG9jayBkdWUgdG8gb3duZXIgZGllZCB0YWtlIG92ZXIuCisJICovCisJaWYgKHVubGlrZWx5KGxvY2tfdGFrZW4pKQorCQlyZXR1cm4gMTsKKworCS8qCisJICogV2UgZG9udCBoYXZlIHRoZSBsb2NrLiBMb29rIHVwIHRoZSBQSSBzdGF0ZSAob3IgY3JlYXRlIGl0IGlmCisJICogd2UgYXJlIHRoZSBmaXJzdCB3YWl0ZXIpOgorCSAqLworCXJldCA9IGxvb2t1cF9waV9zdGF0ZSh1dmFsLCBoYiwga2V5LCBwcyk7CisKKwlpZiAodW5saWtlbHkocmV0KSkgeworCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIC1FU1JDSDoKKwkJCS8qCisJCQkgKiBObyBvd25lciBmb3VuZCBmb3IgdGhpcyBmdXRleC4gQ2hlY2sgaWYgdGhlCisJCQkgKiBPV05FUl9ESUVEIGJpdCBpcyBzZXQgdG8gZmlndXJlIG91dCB3aGV0aGVyCisJCQkgKiB0aGlzIGlzIGEgcm9idXN0IGZ1dGV4IG9yIG5vdC4KKwkJCSAqLworCQkJaWYgKGdldF9mdXRleF92YWx1ZV9sb2NrZWQoJmN1cnZhbCwgdWFkZHIpKQorCQkJCXJldHVybiAtRUZBVUxUOworCisJCQkvKgorCQkJICogV2Ugc2ltcGx5IHN0YXJ0IG92ZXIgaW4gY2FzZSBvZiBhIHJvYnVzdAorCQkJICogZnV0ZXguIFRoZSBjb2RlIGFib3ZlIHdpbGwgdGFrZSB0aGUgZnV0ZXgKKwkJCSAqIGFuZCByZXR1cm4gaGFwcHkuCisJCQkgKi8KKwkJCWlmIChjdXJ2YWwgJiBGVVRFWF9PV05FUl9ESUVEKSB7CisJCQkJb3duZXJkaWVkID0gMTsKKwkJCQlnb3RvIHJldHJ5OworCQkJfQorCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogVGhlIGhhc2ggYnVja2V0IGxvY2sgbXVzdCBiZSBoZWxkIHdoZW4gdGhpcyBpcyBjYWxsZWQuCiAgKiBBZnRlcndhcmRzLCB0aGUgZnV0ZXhfcSBtdXN0IG5vdCBiZSBhY2Nlc3NlZC4KICAqLwogc3RhdGljIHZvaWQgd2FrZV9mdXRleChzdHJ1Y3QgZnV0ZXhfcSAqcSkKIHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAgPSBxLT50YXNrOworCisJLyoKKwkgKiBXZSBzZXQgcS0+bG9ja19wdHIgPSBOVUxMIF9iZWZvcmVfIHdlIHdha2UgdXAgdGhlIHRhc2suIElmCisJICogYSBub24gZnV0ZXggd2FrZSB1cCBoYXBwZW5zIG9uIGFub3RoZXIgQ1BVIHRoZW4gdGhlIHRhc2sKKwkgKiBtaWdodCBleGl0IGFuZCBwIHdvdWxkIGRlcmVmZXJlbmNlIGEgbm9uIGV4aXN0aW5nIHRhc2sKKwkgKiBzdHJ1Y3QuIFByZXZlbnQgdGhpcyBieSBob2xkaW5nIGEgcmVmZXJlbmNlIG9uIHAgYWNyb3NzIHRoZQorCSAqIHdha2UgdXAuCisJICovCisJZ2V0X3Rhc2tfc3RydWN0KHApOworCiAJcGxpc3RfZGVsKCZxLT5saXN0LCAmcS0+bGlzdC5wbGlzdCk7CiAJLyoKLQkgKiBUaGUgbG9jayBpbiB3YWtlX3VwX2FsbCgpIGlzIGEgY3J1Y2lhbCBtZW1vcnkgYmFycmllciBhZnRlciB0aGUKLQkgKiBwbGlzdF9kZWwoKSBhbmQgYWxzbyBiZWZvcmUgYXNzaWduaW5nIHRvIHEtPmxvY2tfcHRyLgotCSAqLwotCXdha2VfdXAoJnEtPndhaXRlcik7Ci0JLyoKLQkgKiBUaGUgd2FpdGluZyB0YXNrIGNhbiBmcmVlIHRoZSBmdXRleF9xIGFzIHNvb24gYXMgdGhpcyBpcyB3cml0dGVuLAotCSAqIHdpdGhvdXQgdGFraW5nIGFueSBsb2Nrcy4gIFRoaXMgbXVzdCBjb21lIGxhc3QuCi0JICoKLQkgKiBBIG1lbW9yeSBiYXJyaWVyIGlzIHJlcXVpcmVkIGhlcmUgdG8gcHJldmVudCB0aGUgZm9sbG93aW5nIHN0b3JlIHRvCi0JICogbG9ja19wdHIgZnJvbSBnZXR0aW5nIGFoZWFkIG9mIHRoZSB3YWtldXAuIENsZWFyaW5nIHRoZSBsb2NrIGF0IHRoZQotCSAqIGVuZCBvZiB3YWtlX3VwKCkgZG9lcyBub3QgcHJldmVudCB0aGlzIHN0b3JlIGZyb20gbW92aW5nLgorCSAqIFRoZSB3YWl0aW5nIHRhc2sgY2FuIGZyZWUgdGhlIGZ1dGV4X3EgYXMgc29vbiBhcworCSAqIHEtPmxvY2tfcHRyID0gTlVMTCBpcyB3cml0dGVuLCB3aXRob3V0IHRha2luZyBhbnkgbG9ja3MuIEEKKwkgKiBtZW1vcnkgYmFycmllciBpcyByZXF1aXJlZCBoZXJlIHRvIHByZXZlbnQgdGhlIGZvbGxvd2luZworCSAqIHN0b3JlIHRvIGxvY2tfcHRyIGZyb20gZ2V0dGluZyBhaGVhZCBvZiB0aGUgcGxpc3RfZGVsLgogCSAqLwogCXNtcF93bWIoKTsKIAlxLT5sb2NrX3B0ciA9IE5VTEw7CisKKwl3YWtlX3VwX3N0YXRlKHAsIFRBU0tfTk9STUFMKTsKKwlwdXRfdGFza19zdHJ1Y3QocCk7CiB9CiAKIHN0YXRpYyBpbnQgd2FrZV9mdXRleF9waSh1MzIgX191c2VyICp1YWRkciwgdTMyIHV2YWwsIHN0cnVjdCBmdXRleF9xICp0aGlzKQpAQCAtNjg5LDcgKzg0Niw3IEBACiAKIAlwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRoaXMsIG5leHQsIGhlYWQsIGxpc3QpIHsKIAkJaWYgKG1hdGNoX2Z1dGV4ICgmdGhpcy0+a2V5LCAma2V5KSkgewotCQkJaWYgKHRoaXMtPnBpX3N0YXRlKSB7CisJCQlpZiAodGhpcy0+cGlfc3RhdGUgfHwgdGhpcy0+cnRfd2FpdGVyKSB7CiAJCQkJcmV0ID0gLUVJTlZBTDsKIAkJCQlicmVhazsKIAkJCX0KQEAgLTgwMiwyNCArOTU5LDE4NSBAQAogCXJldHVybiByZXQ7CiB9CiAKLS8qCi0gKiBSZXF1ZXVlIGFsbCB3YWl0ZXJzIGhhc2hlZCBvbiBvbmUgcGh5c2ljYWwgcGFnZSB0byBhbm90aGVyCi0gKiBwaHlzaWNhbCBwYWdlLgorLyoqCisgKiByZXF1ZXVlX2Z1dGV4KCkgLSBSZXF1ZXVlIGEgZnV0ZXhfcSBmcm9tIG9uZSBoYiB0byBhbm90aGVyCisgKiBAcToJCXRoZSBmdXRleF9xIHRvIHJlcXVldWUKKyAqIEBoYjE6CXRoZSBzb3VyY2UgaGFzaF9idWNrZXQKKyAqIEBoYjI6CXRoZSB0YXJnZXQgaGFzaF9idWNrZXQKKyAqIEBrZXkyOgl0aGUgbmV3IGtleSBmb3IgdGhlIHJlcXVldWVkIGZ1dGV4X3EKKyAqLworc3RhdGljIGlubGluZQordm9pZCByZXF1ZXVlX2Z1dGV4KHN0cnVjdCBmdXRleF9xICpxLCBzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiMSwKKwkJICAgc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjIsIHVuaW9uIGZ1dGV4X2tleSAqa2V5MikKK3sKKworCS8qCisJICogSWYga2V5MSBhbmQga2V5MiBoYXNoIHRvIHRoZSBzYW1lIGJ1Y2tldCwgbm8gbmVlZCB0bworCSAqIHJlcXVldWUuCisJICovCisJaWYgKGxpa2VseSgmaGIxLT5jaGFpbiAhPSAmaGIyLT5jaGFpbikpIHsKKwkJcGxpc3RfZGVsKCZxLT5saXN0LCAmaGIxLT5jaGFpbik7CisJCXBsaXN0X2FkZCgmcS0+bGlzdCwgJmhiMi0+Y2hhaW4pOworCQlxLT5sb2NrX3B0ciA9ICZoYjItPmxvY2s7CisjaWZkZWYgQ09ORklHX0RFQlVHX1BJX0xJU1QKKwkJcS0+bGlzdC5wbGlzdC5sb2NrID0gJmhiMi0+bG9jazsKKyNlbmRpZgorCX0KKwlnZXRfZnV0ZXhfa2V5X3JlZnMoa2V5Mik7CisJcS0+a2V5ID0gKmtleTI7Cit9CisKKy8qKgorICogcmVxdWV1ZV9waV93YWtlX2Z1dGV4KCkgLSBXYWtlIGEgdGFzayB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrIGR1cmluZyByZXF1ZXVlCisgKiBxOgl0aGUgZnV0ZXhfcQorICoga2V5Ogl0aGUga2V5IG9mIHRoZSByZXF1ZXVlIHRhcmdldCBmdXRleAorICoKKyAqIER1cmluZyBmdXRleF9yZXF1ZXVlLCB3aXRoIHJlcXVldWVfcGk9MSwgaXQgaXMgcG9zc2libGUgdG8gYWNxdWlyZSB0aGUKKyAqIHRhcmdldCBmdXRleCBpZiBpdCBpcyB1bmNvbnRlbmRlZCBvciB2aWEgYSBsb2NrIHN0ZWFsLiAgU2V0IHRoZSBmdXRleF9xIGtleQorICogdG8gdGhlIHJlcXVldWUgdGFyZ2V0IGZ1dGV4IHNvIHRoZSB3YWl0ZXIgY2FuIGRldGVjdCB0aGUgd2FrZXVwIG9uIHRoZSByaWdodAorICogZnV0ZXgsIGJ1dCByZW1vdmUgaXQgZnJvbSB0aGUgaGIgYW5kIE5VTEwgdGhlIHJ0X3dhaXRlciBzbyBpdCBjYW4gZGV0ZWN0CisgKiBhdG9taWMgbG9jayBhY3F1aXNpdGlvbi4gIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHEtPmxvY2tfcHRyIGhlbGQuCisgKi8KK3N0YXRpYyBpbmxpbmUKK3ZvaWQgcmVxdWV1ZV9waV93YWtlX2Z1dGV4KHN0cnVjdCBmdXRleF9xICpxLCB1bmlvbiBmdXRleF9rZXkgKmtleSkKK3sKKwlkcm9wX2Z1dGV4X2tleV9yZWZzKCZxLT5rZXkpOworCWdldF9mdXRleF9rZXlfcmVmcyhrZXkpOworCXEtPmtleSA9ICprZXk7CisKKwlXQVJOX09OKHBsaXN0X25vZGVfZW1wdHkoJnEtPmxpc3QpKTsKKwlwbGlzdF9kZWwoJnEtPmxpc3QsICZxLT5saXN0LnBsaXN0KTsKKworCVdBUk5fT04oIXEtPnJ0X3dhaXRlcik7CisJcS0+cnRfd2FpdGVyID0gTlVMTDsKKworCXdha2VfdXBfc3RhdGUocS0+dGFzaywgVEFTS19OT1JNQUwpOworfQorCisvKioKKyAqIGZ1dGV4X3Byb3h5X3RyeWxvY2tfYXRvbWljKCkgLSBBdHRlbXB0IGFuIGF0b21pYyBsb2NrIGZvciB0aGUgdG9wIHdhaXRlcgorICogQHBpZnV0ZXg6CQl0aGUgdXNlciBhZGRyZXNzIG9mIHRoZSB0byBmdXRleAorICogQGhiMToJCXRoZSBmcm9tIGZ1dGV4IGhhc2ggYnVja2V0LCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyCisgKiBAaGIyOgkJdGhlIHRvIGZ1dGV4IGhhc2ggYnVja2V0LCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyCisgKiBAa2V5MToJCXRoZSBmcm9tIGZ1dGV4IGtleQorICogQGtleTI6CQl0aGUgdG8gZnV0ZXgga2V5CisgKiBAcHM6CQkJYWRkcmVzcyB0byBzdG9yZSB0aGUgcGlfc3RhdGUgcG9pbnRlcgorICogQHNldF93YWl0ZXJzOglmb3JjZSBzZXR0aW5nIHRoZSBGVVRFWF9XQUlURVJTIGJpdCAoMSkgb3Igbm90ICgwKQorICoKKyAqIFRyeSBhbmQgZ2V0IHRoZSBsb2NrIG9uIGJlaGFsZiBvZiB0aGUgdG9wIHdhaXRlciBpZiB3ZSBjYW4gZG8gaXQgYXRvbWljYWxseS4KKyAqIFdha2UgdGhlIHRvcCB3YWl0ZXIgaWYgd2Ugc3VjY2VlZC4gIElmIHRoZSBjYWxsZXIgc3BlY2lmaWVkIHNldF93YWl0ZXJzLAorICogdGhlbiBkaXJlY3QgZnV0ZXhfbG9ja19waV9hdG9taWMoKSB0byBmb3JjZSBzZXR0aW5nIHRoZSBGVVRFWF9XQUlURVJTIGJpdC4KKyAqIGhiMSBhbmQgaGIyIG11c3QgYmUgaGVsZCBieSB0aGUgY2FsbGVyLgorICoKKyAqIFJldHVybnM6CisgKiAgMCAtIGZhaWxlZCB0byBhY3F1aXJlIHRoZSBsb2NrIGF0b21pY2x5CisgKiAgMSAtIGFjcXVpcmVkIHRoZSBsb2NrCisgKiA8MCAtIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZnV0ZXhfcHJveHlfdHJ5bG9ja19hdG9taWModTMyIF9fdXNlciAqcGlmdXRleCwKKwkJCQkgc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjEsCisJCQkJIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIyLAorCQkJCSB1bmlvbiBmdXRleF9rZXkgKmtleTEsIHVuaW9uIGZ1dGV4X2tleSAqa2V5MiwKKwkJCQkgc3RydWN0IGZ1dGV4X3BpX3N0YXRlICoqcHMsIGludCBzZXRfd2FpdGVycykKK3sKKwlzdHJ1Y3QgZnV0ZXhfcSAqdG9wX3dhaXRlciA9IE5VTEw7CisJdTMyIGN1cnZhbDsKKwlpbnQgcmV0OworCisJaWYgKGdldF9mdXRleF92YWx1ZV9sb2NrZWQoJmN1cnZhbCwgcGlmdXRleCkpCisJCXJldHVybiAtRUZBVUxUOworCisJLyoKKwkgKiBGaW5kIHRoZSB0b3Bfd2FpdGVyIGFuZCBkZXRlcm1pbmUgaWYgdGhlcmUgYXJlIGFkZGl0aW9uYWwgd2FpdGVycy4KKwkgKiBJZiB0aGUgY2FsbGVyIGludGVuZHMgdG8gcmVxdWV1ZSBtb3JlIHRoYW4gMSB3YWl0ZXIgdG8gcGlmdXRleCwKKwkgKiBmb3JjZSBmdXRleF9sb2NrX3BpX2F0b21pYygpIHRvIHNldCB0aGUgRlVURVhfV0FJVEVSUyBiaXQgbm93LAorCSAqIGFzIHdlIGhhdmUgbWVhbnMgdG8gaGFuZGxlIHRoZSBwb3NzaWJsZSBmYXVsdC4gIElmIG5vdCwgZG9uJ3Qgc2V0CisJICogdGhlIGJpdCB1bmVjZXNzYXJpbHkgYXMgaXQgd2lsbCBmb3JjZSB0aGUgc3Vic2VxdWVudCB1bmxvY2sgdG8gZW50ZXIKKwkgKiB0aGUga2VybmVsLgorCSAqLworCXRvcF93YWl0ZXIgPSBmdXRleF90b3Bfd2FpdGVyKGhiMSwga2V5MSk7CisKKwkvKiBUaGVyZSBhcmUgbm8gd2FpdGVycywgbm90aGluZyBmb3IgdXMgdG8gZG8uICovCisJaWYgKCF0b3Bfd2FpdGVyKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVHJ5IHRvIHRha2UgdGhlIGxvY2sgZm9yIHRvcF93YWl0ZXIuICBTZXQgdGhlIEZVVEVYX1dBSVRFUlMgYml0IGluCisJICogdGhlIGNvbnRlbmRlZCBjYXNlIG9yIGlmIHNldF93YWl0ZXJzIGlzIDEuICBUaGUgcGlfc3RhdGUgaXMgcmV0dXJuZWQKKwkgKiBpbiBwcyBpbiBjb250ZW5kZWQgY2FzZXMuCisJICovCisJcmV0ID0gZnV0ZXhfbG9ja19waV9hdG9taWMocGlmdXRleCwgaGIyLCBrZXkyLCBwcywgdG9wX3dhaXRlci0+dGFzaywKKwkJCQkgICBzZXRfd2FpdGVycyk7CisJaWYgKHJldCA9PSAxKQorCQlyZXF1ZXVlX3BpX3dha2VfZnV0ZXgodG9wX3dhaXRlciwga2V5Mik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKKyAqIGZ1dGV4X3JlcXVldWUoKSAtIFJlcXVldWUgd2FpdGVycyBmcm9tIHVhZGRyMSB0byB1YWRkcjIKKyAqIHVhZGRyMToJc291cmNlIGZ1dGV4IHVzZXIgYWRkcmVzcworICogdWFkZHIyOgl0YXJnZXQgZnV0ZXggdXNlciBhZGRyZXNzCisgKiBucl93YWtlOgludW1iZXIgb2Ygd2FpdGVycyB0byB3YWtlIChtdXN0IGJlIDEgZm9yIHJlcXVldWVfcGkpCisgKiBucl9yZXF1ZXVlOgludW1iZXIgb2Ygd2FpdGVycyB0byByZXF1ZXVlICgwLUlOVF9NQVgpCisgKiByZXF1ZXVlX3BpOglpZiB3ZSBhcmUgYXR0ZW1wdGluZyB0byByZXF1ZXVlIGZyb20gYSBub24tcGkgZnV0ZXggdG8gYQorICogCQlwaSBmdXRleCAocGkgdG8gcGkgcmVxdWV1ZSBpcyBub3Qgc3VwcG9ydGVkKQorICoKKyAqIFJlcXVldWUgd2FpdGVycyBvbiB1YWRkcjEgdG8gdWFkZHIyLiBJbiB0aGUgcmVxdWV1ZV9waSBjYXNlLCB0cnkgdG8gYWNxdWlyZQorICogdWFkZHIyIGF0b21pY2FsbHkgb24gYmVoYWxmIG9mIHRoZSB0b3Agd2FpdGVyLgorICoKKyAqIFJldHVybnM6CisgKiA+PTAgLSBvbiBzdWNjZXNzLCB0aGUgbnVtYmVyIG9mIHRhc2tzIHJlcXVldWVkIG9yIHdva2VuCisgKiAgPDAgLSBvbiBlcnJvcgogICovCiBzdGF0aWMgaW50IGZ1dGV4X3JlcXVldWUodTMyIF9fdXNlciAqdWFkZHIxLCBpbnQgZnNoYXJlZCwgdTMyIF9fdXNlciAqdWFkZHIyLAotCQkJIGludCBucl93YWtlLCBpbnQgbnJfcmVxdWV1ZSwgdTMyICpjbXB2YWwpCisJCQkgaW50IG5yX3dha2UsIGludCBucl9yZXF1ZXVlLCB1MzIgKmNtcHZhbCwKKwkJCSBpbnQgcmVxdWV1ZV9waSkKIHsKIAl1bmlvbiBmdXRleF9rZXkga2V5MSA9IEZVVEVYX0tFWV9JTklULCBrZXkyID0gRlVURVhfS0VZX0lOSVQ7CisJaW50IGRyb3BfY291bnQgPSAwLCB0YXNrX2NvdW50ID0gMCwgcmV0OworCXN0cnVjdCBmdXRleF9waV9zdGF0ZSAqcGlfc3RhdGUgPSBOVUxMOwogCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIxLCAqaGIyOwogCXN0cnVjdCBwbGlzdF9oZWFkICpoZWFkMTsKIAlzdHJ1Y3QgZnV0ZXhfcSAqdGhpcywgKm5leHQ7Ci0JaW50IHJldCwgZHJvcF9jb3VudCA9IDA7CisJdTMyIGN1cnZhbDI7CisKKwlpZiAocmVxdWV1ZV9waSkgeworCQkvKgorCQkgKiByZXF1ZXVlX3BpIHJlcXVpcmVzIGEgcGlfc3RhdGUsIHRyeSB0byBhbGxvY2F0ZSBpdCBub3cKKwkJICogd2l0aG91dCBhbnkgbG9ja3MgaW4gY2FzZSBpdCBmYWlscy4KKwkJICovCisJCWlmIChyZWZpbGxfcGlfc3RhdGVfY2FjaGUoKSkKKwkJCXJldHVybiAtRU5PTUVNOworCQkvKgorCQkgKiByZXF1ZXVlX3BpIG11c3Qgd2FrZSBhcyBtYW55IHRhc2tzIGFzIGl0IGNhbiwgdXAgdG8gbnJfd2FrZQorCQkgKiArIG5yX3JlcXVldWUsIHNpbmNlIGl0IGFjcXVpcmVzIHRoZSBydF9tdXRleCBwcmlvciB0bworCQkgKiByZXR1cm5pbmcgdG8gdXNlcnNwYWNlLCBzbyBhcyB0byBub3QgbGVhdmUgdGhlIHJ0X211dGV4IHdpdGgKKwkJICogd2FpdGVycyBhbmQgbm8gb3duZXIuICBIb3dldmVyLCBzZWNvbmQgYW5kIHRoaXJkIHdha2UtdXBzCisJCSAqIGNhbm5vdCBiZSBwcmVkaWN0ZWQgYXMgdGhleSBpbnZvbHZlIHJhY2UgY29uZGl0aW9ucyB3aXRoIHRoZQorCQkgKiBmaXJzdCB3YWtlIGFuZCBhIGZhdWx0IHdoaWxlIGxvb2tpbmcgdXAgdGhlIHBpX3N0YXRlLiAgQm90aAorCQkgKiBwdGhyZWFkX2NvbmRfc2lnbmFsKCkgYW5kIHB0aHJlYWRfY29uZF9icm9hZGNhc3QoKSBzaG91bGQKKwkJICogdXNlIG5yX3dha2U9MS4KKwkJICovCisJCWlmIChucl93YWtlICE9IDEpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CiAKIHJldHJ5OgorCWlmIChwaV9zdGF0ZSAhPSBOVUxMKSB7CisJCS8qCisJCSAqIFdlIHdpbGwgaGF2ZSB0byBsb29rdXAgdGhlIHBpX3N0YXRlIGFnYWluLCBzbyBmcmVlIHRoaXMgb25lCisJCSAqIHRvIGtlZXAgdGhlIGFjY291bnRpbmcgY29ycmVjdC4KKwkJICovCisJCWZyZWVfcGlfc3RhdGUocGlfc3RhdGUpOworCQlwaV9zdGF0ZSA9IE5VTEw7CisJfQorCiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjEsIGZzaGFyZWQsICZrZXkxLCBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXQ7Ci0JcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZzaGFyZWQsICZrZXkyLCBWRVJJRllfUkVBRCk7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZzaGFyZWQsICZrZXkyLAorCQkJICAgIHJlcXVldWVfcGkgPyBWRVJJRllfV1JJVEUgOiBWRVJJRllfUkVBRCk7CiAJaWYgKHVubGlrZWx5KHJldCAhPSAwKSkKIAkJZ290byBvdXRfcHV0X2tleTE7CiAKQEAgLTg1NCwzMiArMTE3Miw5OSBAQAogCQl9CiAJfQogCisJaWYgKHJlcXVldWVfcGkgJiYgKHRhc2tfY291bnQgLSBucl93YWtlIDwgbnJfcmVxdWV1ZSkpIHsKKwkJLyoKKwkJICogQXR0ZW1wdCB0byBhY3F1aXJlIHVhZGRyMiBhbmQgd2FrZSB0aGUgdG9wIHdhaXRlci4gSWYgd2UKKwkJICogaW50ZW5kIHRvIHJlcXVldWUgd2FpdGVycywgZm9yY2Ugc2V0dGluZyB0aGUgRlVURVhfV0FJVEVSUworCQkgKiBiaXQuICBXZSBmb3JjZSB0aGlzIGhlcmUgd2hlcmUgd2UgYXJlIGFibGUgdG8gZWFzaWx5IGhhbmRsZQorCQkgKiBmYXVsdHMgcmF0aGVyIGluIHRoZSByZXF1ZXVlIGxvb3AgYmVsb3cuCisJCSAqLworCQlyZXQgPSBmdXRleF9wcm94eV90cnlsb2NrX2F0b21pYyh1YWRkcjIsIGhiMSwgaGIyLCAma2V5MSwKKwkJCQkJCSAma2V5MiwgJnBpX3N0YXRlLCBucl9yZXF1ZXVlKTsKKworCQkvKgorCQkgKiBBdCB0aGlzIHBvaW50IHRoZSB0b3Bfd2FpdGVyIGhhcyBlaXRoZXIgdGFrZW4gdWFkZHIyIG9yIGlzCisJCSAqIHdhaXRpbmcgb24gaXQuICBJZiB0aGUgZm9ybWVyLCB0aGVuIHRoZSBwaV9zdGF0ZSB3aWxsIG5vdAorCQkgKiBleGlzdCB5ZXQsIGxvb2sgaXQgdXAgb25lIG1vcmUgdGltZSB0byBlbnN1cmUgd2UgaGF2ZSBhCisJCSAqIHJlZmVyZW5jZSB0byBpdC4KKwkJICovCisJCWlmIChyZXQgPT0gMSkgeworCQkJV0FSTl9PTihwaV9zdGF0ZSk7CisJCQl0YXNrX2NvdW50Kys7CisJCQlyZXQgPSBnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKCZjdXJ2YWwyLCB1YWRkcjIpOworCQkJaWYgKCFyZXQpCisJCQkJcmV0ID0gbG9va3VwX3BpX3N0YXRlKGN1cnZhbDIsIGhiMiwgJmtleTIsCisJCQkJCQkgICAgICAmcGlfc3RhdGUpOworCQl9CisKKwkJc3dpdGNoIChyZXQpIHsKKwkJY2FzZSAwOgorCQkJYnJlYWs7CisJCWNhc2UgLUVGQVVMVDoKKwkJCWRvdWJsZV91bmxvY2tfaGIoaGIxLCBoYjIpOworCQkJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAma2V5Mik7CisJCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkxKTsKKwkJCXJldCA9IGdldF91c2VyKGN1cnZhbDIsIHVhZGRyMik7CisJCQlpZiAoIXJldCkKKwkJCQlnb3RvIHJldHJ5OworCQkJZ290byBvdXQ7CisJCWNhc2UgLUVBR0FJTjoKKwkJCS8qIFRoZSBvd25lciB3YXMgZXhpdGluZywgdHJ5IGFnYWluLiAqLworCQkJZG91YmxlX3VubG9ja19oYihoYjEsIGhiMik7CisJCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkyKTsKKwkJCXB1dF9mdXRleF9rZXkoZnNoYXJlZCwgJmtleTEpOworCQkJY29uZF9yZXNjaGVkKCk7CisJCQlnb3RvIHJldHJ5OworCQlkZWZhdWx0OgorCQkJZ290byBvdXRfdW5sb2NrOworCQl9CisJfQorCiAJaGVhZDEgPSAmaGIxLT5jaGFpbjsKIAlwbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRoaXMsIG5leHQsIGhlYWQxLCBsaXN0KSB7Ci0JCWlmICghbWF0Y2hfZnV0ZXggKCZ0aGlzLT5rZXksICZrZXkxKSkKLQkJCWNvbnRpbnVlOwotCQlpZiAoKytyZXQgPD0gbnJfd2FrZSkgewotCQkJd2FrZV9mdXRleCh0aGlzKTsKLQkJfSBlbHNlIHsKLQkJCS8qCi0JCQkgKiBJZiBrZXkxIGFuZCBrZXkyIGhhc2ggdG8gdGhlIHNhbWUgYnVja2V0LCBubyBuZWVkIHRvCi0JCQkgKiByZXF1ZXVlLgotCQkJICovCi0JCQlpZiAobGlrZWx5KGhlYWQxICE9ICZoYjItPmNoYWluKSkgewotCQkJCXBsaXN0X2RlbCgmdGhpcy0+bGlzdCwgJmhiMS0+Y2hhaW4pOwotCQkJCXBsaXN0X2FkZCgmdGhpcy0+bGlzdCwgJmhiMi0+Y2hhaW4pOwotCQkJCXRoaXMtPmxvY2tfcHRyID0gJmhiMi0+bG9jazsKLSNpZmRlZiBDT05GSUdfREVCVUdfUElfTElTVAotCQkJCXRoaXMtPmxpc3QucGxpc3QubG9jayA9ICZoYjItPmxvY2s7Ci0jZW5kaWYKLQkJCX0KLQkJCXRoaXMtPmtleSA9IGtleTI7Ci0JCQlnZXRfZnV0ZXhfa2V5X3JlZnMoJmtleTIpOwotCQkJZHJvcF9jb3VudCsrOworCQlpZiAodGFza19jb3VudCAtIG5yX3dha2UgPj0gbnJfcmVxdWV1ZSkKKwkJCWJyZWFrOwogCi0JCQlpZiAocmV0IC0gbnJfd2FrZSA+PSBucl9yZXF1ZXVlKQotCQkJCWJyZWFrOworCQlpZiAoIW1hdGNoX2Z1dGV4KCZ0aGlzLT5rZXksICZrZXkxKSkKKwkJCWNvbnRpbnVlOworCisJCVdBUk5fT04oIXJlcXVldWVfcGkgJiYgdGhpcy0+cnRfd2FpdGVyKTsKKwkJV0FSTl9PTihyZXF1ZXVlX3BpICYmICF0aGlzLT5ydF93YWl0ZXIpOworCisJCS8qCisJCSAqIFdha2UgbnJfd2FrZSB3YWl0ZXJzLiAgRm9yIHJlcXVldWVfcGksIGlmIHdlIGFjcXVpcmVkIHRoZQorCQkgKiBsb2NrLCB3ZSBhbHJlYWR5IHdva2UgdGhlIHRvcF93YWl0ZXIuICBJZiBub3QsIGl0IHdpbGwgYmUKKwkJICogd29rZW4gYnkgZnV0ZXhfdW5sb2NrX3BpKCkuCisJCSAqLworCQlpZiAoKyt0YXNrX2NvdW50IDw9IG5yX3dha2UgJiYgIXJlcXVldWVfcGkpIHsKKwkJCXdha2VfZnV0ZXgodGhpcyk7CisJCQljb250aW51ZTsKIAkJfQorCisJCS8qCisJCSAqIFJlcXVldWUgbnJfcmVxdWV1ZSB3YWl0ZXJzIGFuZCBwb3NzaWJseSBvbmUgbW9yZSBpbiB0aGUgY2FzZQorCQkgKiBvZiByZXF1ZXVlX3BpIGlmIHdlIGNvdWxkbid0IGFjcXVpcmUgdGhlIGxvY2sgYXRvbWljYWxseS4KKwkJICovCisJCWlmIChyZXF1ZXVlX3BpKSB7CisJCQkvKiBQcmVwYXJlIHRoZSB3YWl0ZXIgdG8gdGFrZSB0aGUgcnRfbXV0ZXguICovCisJCQlhdG9taWNfaW5jKCZwaV9zdGF0ZS0+cmVmY291bnQpOworCQkJdGhpcy0+cGlfc3RhdGUgPSBwaV9zdGF0ZTsKKwkJCXJldCA9IHJ0X211dGV4X3N0YXJ0X3Byb3h5X2xvY2soJnBpX3N0YXRlLT5waV9tdXRleCwKKwkJCQkJCQl0aGlzLT5ydF93YWl0ZXIsCisJCQkJCQkJdGhpcy0+dGFzaywgMSk7CisJCQlpZiAocmV0ID09IDEpIHsKKwkJCQkvKiBXZSBnb3QgdGhlIGxvY2suICovCisJCQkJcmVxdWV1ZV9waV93YWtlX2Z1dGV4KHRoaXMsICZrZXkyKTsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSBpZiAocmV0KSB7CisJCQkJLyogLUVERUFETEsgKi8KKwkJCQl0aGlzLT5waV9zdGF0ZSA9IE5VTEw7CisJCQkJZnJlZV9waV9zdGF0ZShwaV9zdGF0ZSk7CisJCQkJZ290byBvdXRfdW5sb2NrOworCQkJfQorCQl9CisJCXJlcXVldWVfZnV0ZXgodGhpcywgaGIxLCBoYjIsICZrZXkyKTsKKwkJZHJvcF9jb3VudCsrOwogCX0KIAogb3V0X3VubG9jazoKQEAgLTg5OSw3ICsxMjg0LDkgQEAKIG91dF9wdXRfa2V5MToKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkxKTsKIG91dDoKLQlyZXR1cm4gcmV0OworCWlmIChwaV9zdGF0ZSAhPSBOVUxMKQorCQlmcmVlX3BpX3N0YXRlKHBpX3N0YXRlKTsKKwlyZXR1cm4gcmV0ID8gcmV0IDogdGFza19jb3VudDsKIH0KIAogLyogVGhlIGtleSBtdXN0IGJlIGFscmVhZHkgc3RvcmVkIGluIHEtPmtleS4gKi8KQEAgLTkwNyw4ICsxMjk0LDYgQEAKIHsKIAlzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiOwogCi0JaW5pdF93YWl0cXVldWVfaGVhZCgmcS0+d2FpdGVyKTsKLQogCWdldF9mdXRleF9rZXlfcmVmcygmcS0+a2V5KTsKIAloYiA9IGhhc2hfZnV0ZXgoJnEtPmtleSk7CiAJcS0+bG9ja19wdHIgPSAmaGItPmxvY2s7CkBAIC0xMTE5LDM1ICsxNTA0LDE0OSBAQAogICovCiAjZGVmaW5lIEZMQUdTX1NIQVJFRAkJMHgwMQogI2RlZmluZSBGTEFHU19DTE9DS1JUCQkweDAyCisjZGVmaW5lIEZMQUdTX0hBU19USU1FT1VUCTB4MDQKIAogc3RhdGljIGxvbmcgZnV0ZXhfd2FpdF9yZXN0YXJ0KHN0cnVjdCByZXN0YXJ0X2Jsb2NrICpyZXN0YXJ0KTsKIAotc3RhdGljIGludCBmdXRleF93YWl0KHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwKLQkJICAgICAgdTMyIHZhbCwga3RpbWVfdCAqYWJzX3RpbWUsIHUzMiBiaXRzZXQsIGludCBjbG9ja3J0KQorLyoqCisgKiBmaXh1cF9vd25lcigpIC0gUG9zdCBsb2NrIHBpX3N0YXRlIGFuZCBjb3JuZXIgY2FzZSBtYW5hZ2VtZW50CisgKiBAdWFkZHI6CXVzZXIgYWRkcmVzcyBvZiB0aGUgZnV0ZXgKKyAqIEBmc2hhcmVkOgl3aGV0aGVyIHRoZSBmdXRleCBpcyBzaGFyZWQgKDEpIG9yIG5vdCAoMCkKKyAqIEBxOgkJZnV0ZXhfcSAoY29udGFpbnMgcGlfc3RhdGUgYW5kIGFjY2VzcyB0byB0aGUgcnRfbXV0ZXgpCisgKiBAbG9ja2VkOglpZiB0aGUgYXR0ZW1wdCB0byB0YWtlIHRoZSBydF9tdXRleCBzdWNjZWVkZWQgKDEpIG9yIG5vdCAoMCkKKyAqCisgKiBBZnRlciBhdHRlbXB0aW5nIHRvIGxvY2sgYW4gcnRfbXV0ZXgsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHRvIGNsZWFudXAKKyAqIHRoZSBwaV9zdGF0ZSBvd25lciBhcyB3ZWxsIGFzIGhhbmRsZSByYWNlIGNvbmRpdGlvbnMgdGhhdCBtYXkgYWxsb3cgdXMgdG8KKyAqIGFjcXVpcmUgdGhlIGxvY2suIE11c3QgYmUgY2FsbGVkIHdpdGggdGhlIGhiIGxvY2sgaGVsZC4KKyAqCisgKiBSZXR1cm5zOgorICogIDEgLSBzdWNjZXNzLCBsb2NrIHRha2VuCisgKiAgMCAtIHN1Y2Nlc3MsIGxvY2sgbm90IHRha2VuCisgKiA8MCAtIG9uIGVycm9yICgtRUZBVUxUKQorICovCitzdGF0aWMgaW50IGZpeHVwX293bmVyKHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwgc3RydWN0IGZ1dGV4X3EgKnEsCisJCSAgICAgICBpbnQgbG9ja2VkKQogewotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7Ci0Jc3RydWN0IHJlc3RhcnRfYmxvY2sgKnJlc3RhcnQ7Ci0JREVDTEFSRV9XQUlUUVVFVUUod2FpdCwgY3Vycik7Ci0Jc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjsKLQlzdHJ1Y3QgZnV0ZXhfcSBxOworCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7CisJaW50IHJldCA9IDA7CisKKwlpZiAobG9ja2VkKSB7CisJCS8qCisJCSAqIEdvdCB0aGUgbG9jay4gV2UgbWlnaHQgbm90IGJlIHRoZSBhbnRpY2lwYXRlZCBvd25lciBpZiB3ZQorCQkgKiBkaWQgYSBsb2NrLXN0ZWFsIC0gZml4IHVwIHRoZSBQSS1zdGF0ZSBpbiB0aGF0IGNhc2U6CisJCSAqLworCQlpZiAocS0+cGlfc3RhdGUtPm93bmVyICE9IGN1cnJlbnQpCisJCQlyZXQgPSBmaXh1cF9waV9zdGF0ZV9vd25lcih1YWRkciwgcSwgY3VycmVudCwgZnNoYXJlZCk7CisJCWdvdG8gb3V0OworCX0KKworCS8qCisJICogQ2F0Y2ggdGhlIHJhcmUgY2FzZSwgd2hlcmUgdGhlIGxvY2sgd2FzIHJlbGVhc2VkIHdoZW4gd2Ugd2VyZSBvbiB0aGUKKwkgKiB3YXkgYmFjayBiZWZvcmUgd2UgbG9ja2VkIHRoZSBoYXNoIGJ1Y2tldC4KKwkgKi8KKwlpZiAocS0+cGlfc3RhdGUtPm93bmVyID09IGN1cnJlbnQpIHsKKwkJLyoKKwkJICogVHJ5IHRvIGdldCB0aGUgcnRfbXV0ZXggbm93LiBUaGlzIG1pZ2h0IGZhaWwgYXMgc29tZSBvdGhlcgorCQkgKiB0YXNrIGFjcXVpcmVkIHRoZSBydF9tdXRleCBhZnRlciB3ZSByZW1vdmVkIG91cnNlbGYgZnJvbSB0aGUKKwkJICogcnRfbXV0ZXggd2FpdGVycyBsaXN0LgorCQkgKi8KKwkJaWYgKHJ0X211dGV4X3RyeWxvY2soJnEtPnBpX3N0YXRlLT5waV9tdXRleCkpIHsKKwkJCWxvY2tlZCA9IDE7CisJCQlnb3RvIG91dDsKKwkJfQorCisJCS8qCisJCSAqIHBpX3N0YXRlIGlzIGluY29ycmVjdCwgc29tZSBvdGhlciB0YXNrIGRpZCBhIGxvY2sgc3RlYWwgYW5kCisJCSAqIHdlIHJldHVybmVkIGR1ZSB0byB0aW1lb3V0IG9yIHNpZ25hbCB3aXRob3V0IHRha2luZyB0aGUKKwkJICogcnRfbXV0ZXguIFRvbyBsYXRlLiBXZSBjYW4gYWNjZXNzIHRoZSBydF9tdXRleF9vd25lciB3aXRob3V0CisJCSAqIGxvY2tpbmcsIGFzIHRoZSBvdGhlciB0YXNrIGlzIG5vdyBibG9ja2VkIG9uIHRoZSBoYXNoIGJ1Y2tldAorCQkgKiBsb2NrLiBGaXggdGhlIHN0YXRlIHVwLgorCQkgKi8KKwkJb3duZXIgPSBydF9tdXRleF9vd25lcigmcS0+cGlfc3RhdGUtPnBpX211dGV4KTsKKwkJcmV0ID0gZml4dXBfcGlfc3RhdGVfb3duZXIodWFkZHIsIHEsIG93bmVyLCBmc2hhcmVkKTsKKwkJZ290byBvdXQ7CisJfQorCisJLyoKKwkgKiBQYXJhbm9pYSBjaGVjay4gSWYgd2UgZGlkIG5vdCB0YWtlIHRoZSBsb2NrLCB0aGVuIHdlIHNob3VsZCBub3QgYmUKKwkgKiB0aGUgb3duZXIsIG5vciB0aGUgcGVuZGluZyBvd25lciwgb2YgdGhlIHJ0X211dGV4LgorCSAqLworCWlmIChydF9tdXRleF9vd25lcigmcS0+cGlfc3RhdGUtPnBpX211dGV4KSA9PSBjdXJyZW50KQorCQlwcmludGsoS0VSTl9FUlIgImZpeHVwX293bmVyOiByZXQgPSAlZCBwaS1tdXRleDogJXAgIgorCQkJCSJwaS1zdGF0ZSAlcFxuIiwgcmV0LAorCQkJCXEtPnBpX3N0YXRlLT5waV9tdXRleC5vd25lciwKKwkJCQlxLT5waV9zdGF0ZS0+b3duZXIpOworCitvdXQ6CisJcmV0dXJuIHJldCA/IHJldCA6IGxvY2tlZDsKK30KKworLyoqCisgKiBmdXRleF93YWl0X3F1ZXVlX21lKCkgLSBxdWV1ZV9tZSgpIGFuZCB3YWl0IGZvciB3YWtldXAsIHRpbWVvdXQsIG9yIHNpZ25hbAorICogQGhiOgkJdGhlIGZ1dGV4IGhhc2ggYnVja2V0LCBtdXN0IGJlIGxvY2tlZCBieSB0aGUgY2FsbGVyCisgKiBAcToJCXRoZSBmdXRleF9xIHRvIHF1ZXVlIHVwIG9uCisgKiBAdGltZW91dDoJdGhlIHByZXBhcmVkIGhydGltZXJfc2xlZXBlciwgb3IgbnVsbCBmb3Igbm8gdGltZW91dAorICovCitzdGF0aWMgdm9pZCBmdXRleF93YWl0X3F1ZXVlX21lKHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGIsIHN0cnVjdCBmdXRleF9xICpxLAorCQkJCXN0cnVjdCBocnRpbWVyX3NsZWVwZXIgKnRpbWVvdXQpCit7CisJcXVldWVfbWUocSwgaGIpOworCisJLyoKKwkgKiBUaGVyZSBtaWdodCBoYXZlIGJlZW4gc2NoZWR1bGluZyBzaW5jZSB0aGUgcXVldWVfbWUoKSwgYXMgd2UKKwkgKiBjYW5ub3QgaG9sZCBhIHNwaW5sb2NrIGFjcm9zcyB0aGUgZ2V0X3VzZXIoKSBpbiBjYXNlIGl0CisJICogZmF1bHRzLCBhbmQgd2UgY2Fubm90IGp1c3Qgc2V0IFRBU0tfSU5URVJSVVBUSUJMRSBzdGF0ZSB3aGVuCisJICogcXVldWVpbmcgb3Vyc2VsdmVzIGludG8gdGhlIGZ1dGV4IGhhc2guIFRoaXMgY29kZSB0aHVzIGhhcyB0bworCSAqIHJlbHkgb24gdGhlIGZ1dGV4X3dha2UoKSBjb2RlIHJlbW92aW5nIHVzIGZyb20gaGFzaCB3aGVuIGl0CisJICogd2FrZXMgdXMgdXAuCisJICovCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCS8qIEFybSB0aGUgdGltZXIgKi8KKwlpZiAodGltZW91dCkgeworCQlocnRpbWVyX3N0YXJ0X2V4cGlyZXMoJnRpbWVvdXQtPnRpbWVyLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJaWYgKCFocnRpbWVyX2FjdGl2ZSgmdGltZW91dC0+dGltZXIpKQorCQkJdGltZW91dC0+dGFzayA9IE5VTEw7CisJfQorCisJLyoKKwkgKiAhcGxpc3Rfbm9kZV9lbXB0eSgpIGlzIHNhZmUgaGVyZSB3aXRob3V0IGFueSBsb2NrLgorCSAqIHEubG9ja19wdHIgIT0gMCBpcyBub3Qgc2FmZSwgYmVjYXVzZSBvZiBvcmRlcmluZyBhZ2FpbnN0IHdha2V1cC4KKwkgKi8KKwlpZiAobGlrZWx5KCFwbGlzdF9ub2RlX2VtcHR5KCZxLT5saXN0KSkpIHsKKwkJLyoKKwkJICogSWYgdGhlIHRpbWVyIGhhcyBhbHJlYWR5IGV4cGlyZWQsIGN1cnJlbnQgd2lsbCBhbHJlYWR5IGJlCisJCSAqIGZsYWdnZWQgZm9yIHJlc2NoZWR1bGluZy4gT25seSBjYWxsIHNjaGVkdWxlIGlmIHRoZXJlCisJCSAqIGlzIG5vIHRpbWVvdXQsIG9yIGlmIGl0IGhhcyB5ZXQgdG8gZXhwaXJlLgorCQkgKi8KKwkJaWYgKCF0aW1lb3V0IHx8IHRpbWVvdXQtPnRhc2spCisJCQlzY2hlZHVsZSgpOworCX0KKwlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7Cit9CisKKy8qKgorICogZnV0ZXhfd2FpdF9zZXR1cCgpIC0gUHJlcGFyZSB0byB3YWl0IG9uIGEgZnV0ZXgKKyAqIEB1YWRkcjoJdGhlIGZ1dGV4IHVzZXJzcGFjZSBhZGRyZXNzCisgKiBAdmFsOgl0aGUgZXhwZWN0ZWQgdmFsdWUKKyAqIEBmc2hhcmVkOgl3aGV0aGVyIHRoZSBmdXRleCBpcyBzaGFyZWQgKDEpIG9yIG5vdCAoMCkKKyAqIEBxOgkJdGhlIGFzc29jaWF0ZWQgZnV0ZXhfcQorICogQGhiOgkJc3RvcmFnZSBmb3IgaGFzaF9idWNrZXQgcG9pbnRlciB0byBiZSByZXR1cm5lZCB0byBjYWxsZXIKKyAqCisgKiBTZXR1cCB0aGUgZnV0ZXhfcSBhbmQgbG9jYXRlIHRoZSBoYXNoX2J1Y2tldC4gIEdldCB0aGUgZnV0ZXggdmFsdWUgYW5kCisgKiBjb21wYXJlIGl0IHdpdGggdGhlIGV4cGVjdGVkIHZhbHVlLiAgSGFuZGxlIGF0b21pYyBmYXVsdHMgaW50ZXJuYWxseS4KKyAqIFJldHVybiB3aXRoIHRoZSBoYiBsb2NrIGhlbGQgYW5kIGEgcS5rZXkgcmVmZXJlbmNlIG9uIHN1Y2Nlc3MsIGFuZCB1bmxvY2tlZAorICogd2l0aCBubyBxLmtleSByZWZlcmVuY2Ugb24gZmFpbHVyZS4KKyAqCisgKiBSZXR1cm5zOgorICogIDAgLSB1YWRkciBjb250YWlucyB2YWwgYW5kIGhiIGhhcyBiZWVuIGxvY2tlZAorICogPDEgLSAtRUZBVUxUIG9yIC1FV09VTERCTE9DSyAodWFkZHIgZG9lcyBub3QgY29udGFpbiB2YWwpIGFuZCBoYiBpcyB1bmxjb2tlZAorICovCitzdGF0aWMgaW50IGZ1dGV4X3dhaXRfc2V0dXAodTMyIF9fdXNlciAqdWFkZHIsIHUzMiB2YWwsIGludCBmc2hhcmVkLAorCQkJICAgc3RydWN0IGZ1dGV4X3EgKnEsIHN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqKmhiKQorewogCXUzMiB1dmFsOwogCWludCByZXQ7Ci0Jc3RydWN0IGhydGltZXJfc2xlZXBlciB0OwotCWludCByZW0gPSAwOwotCi0JaWYgKCFiaXRzZXQpCi0JCXJldHVybiAtRUlOVkFMOwotCi0JcS5waV9zdGF0ZSA9IE5VTEw7Ci0JcS5iaXRzZXQgPSBiaXRzZXQ7Ci1yZXRyeToKLQlxLmtleSA9IEZVVEVYX0tFWV9JTklUOwotCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLmtleSwgVkVSSUZZX1JFQUQpOwotCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCi0JCWdvdG8gb3V0OwotCi1yZXRyeV9wcml2YXRlOgotCWhiID0gcXVldWVfbG9jaygmcSk7CiAKIAkvKgogCSAqIEFjY2VzcyB0aGUgcGFnZSBBRlRFUiB0aGUgaGFzaC1idWNrZXQgaXMgbG9ja2VkLgpAQCAtMTE2NSw5NSArMTY2NCw4MyBAQAogCSAqIEEgY29uc2VxdWVuY2UgaXMgdGhhdCBmdXRleF93YWl0KCkgY2FuIHJldHVybiB6ZXJvIGFuZCBhYnNvcmIKIAkgKiBhIHdha2V1cCB3aGVuICp1YWRkciAhPSB2YWwgb24gZW50cnkgdG8gdGhlIHN5c2NhbGwuICBUaGlzIGlzCiAJICogcmFyZSwgYnV0IG5vcm1hbC4KLQkgKgotCSAqIEZvciBzaGFyZWQgZnV0ZXhlcywgd2UgaG9sZCB0aGUgbW1hcCBzZW1hcGhvcmUsIHNvIHRoZSBtYXBwaW5nCi0JICogY2Fubm90IGhhdmUgY2hhbmdlZCBzaW5jZSB3ZSBsb29rZWQgaXQgdXAgaW4gZ2V0X2Z1dGV4X2tleS4KIAkgKi8KK3JldHJ5OgorCXEtPmtleSA9IEZVVEVYX0tFWV9JTklUOworCXJldCA9IGdldF9mdXRleF9rZXkodWFkZHIsIGZzaGFyZWQsICZxLT5rZXksIFZFUklGWV9SRUFEKTsKKwlpZiAodW5saWtlbHkocmV0ICE9IDApKQorCQlyZXR1cm4gcmV0OworCityZXRyeV9wcml2YXRlOgorCSpoYiA9IHF1ZXVlX2xvY2socSk7CisKIAlyZXQgPSBnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKCZ1dmFsLCB1YWRkcik7CiAKLQlpZiAodW5saWtlbHkocmV0KSkgewotCQlxdWV1ZV91bmxvY2soJnEsIGhiKTsKKwlpZiAocmV0KSB7CisJCXF1ZXVlX3VubG9jayhxLCAqaGIpOwogCiAJCXJldCA9IGdldF91c2VyKHV2YWwsIHVhZGRyKTsKIAkJaWYgKHJldCkKLQkJCWdvdG8gb3V0X3B1dF9rZXk7CisJCQlnb3RvIG91dDsKIAogCQlpZiAoIWZzaGFyZWQpCiAJCQlnb3RvIHJldHJ5X3ByaXZhdGU7CiAKLQkJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAmcS5rZXkpOworCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLT5rZXkpOwogCQlnb3RvIHJldHJ5OwogCX0KLQlyZXQgPSAtRVdPVUxEQkxPQ0s7Ci0JaWYgKHVubGlrZWx5KHV2YWwgIT0gdmFsKSkgewotCQlxdWV1ZV91bmxvY2soJnEsIGhiKTsKLQkJZ290byBvdXRfcHV0X2tleTsKKworCWlmICh1dmFsICE9IHZhbCkgeworCQlxdWV1ZV91bmxvY2socSwgKmhiKTsKKwkJcmV0ID0gLUVXT1VMREJMT0NLOwogCX0KIAotCS8qIE9ubHkgYWN0dWFsbHkgcXVldWUgaWYgKnVhZGRyIGNvbnRhaW5lZCB2YWwuICAqLwotCXF1ZXVlX21lKCZxLCBoYik7CitvdXQ6CisJaWYgKHJldCkKKwkJcHV0X2Z1dGV4X2tleShmc2hhcmVkLCAmcS0+a2V5KTsKKwlyZXR1cm4gcmV0OworfQogCi0JLyoKLQkgKiBUaGVyZSBtaWdodCBoYXZlIGJlZW4gc2NoZWR1bGluZyBzaW5jZSB0aGUgcXVldWVfbWUoKSwgYXMgd2UKLQkgKiBjYW5ub3QgaG9sZCBhIHNwaW5sb2NrIGFjcm9zcyB0aGUgZ2V0X3VzZXIoKSBpbiBjYXNlIGl0Ci0JICogZmF1bHRzLCBhbmQgd2UgY2Fubm90IGp1c3Qgc2V0IFRBU0tfSU5URVJSVVBUSUJMRSBzdGF0ZSB3aGVuCi0JICogcXVldWVpbmcgb3Vyc2VsdmVzIGludG8gdGhlIGZ1dGV4IGhhc2guICBUaGlzIGNvZGUgdGh1cyBoYXMgdG8KLQkgKiByZWx5IG9uIHRoZSBmdXRleF93YWtlKCkgY29kZSByZW1vdmluZyB1cyBmcm9tIGhhc2ggd2hlbiBpdAotCSAqIHdha2VzIHVzIHVwLgotCSAqLworc3RhdGljIGludCBmdXRleF93YWl0KHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwKKwkJICAgICAgdTMyIHZhbCwga3RpbWVfdCAqYWJzX3RpbWUsIHUzMiBiaXRzZXQsIGludCBjbG9ja3J0KQoreworCXN0cnVjdCBocnRpbWVyX3NsZWVwZXIgdGltZW91dCwgKnRvID0gTlVMTDsKKwlzdHJ1Y3QgcmVzdGFydF9ibG9jayAqcmVzdGFydDsKKwlzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiOworCXN0cnVjdCBmdXRleF9xIHE7CisJaW50IHJldDsKIAotCS8qIGFkZF93YWl0X3F1ZXVlIGlzIHRoZSBiYXJyaWVyIGFmdGVyIF9fc2V0X2N1cnJlbnRfc3RhdGUuICovCi0JX19zZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOwotCWFkZF93YWl0X3F1ZXVlKCZxLndhaXRlciwgJndhaXQpOwotCS8qCi0JICogIXBsaXN0X25vZGVfZW1wdHkoKSBpcyBzYWZlIGhlcmUgd2l0aG91dCBhbnkgbG9jay4KLQkgKiBxLmxvY2tfcHRyICE9IDAgaXMgbm90IHNhZmUsIGJlY2F1c2Ugb2Ygb3JkZXJpbmcgYWdhaW5zdCB3YWtldXAuCi0JICovCi0JaWYgKGxpa2VseSghcGxpc3Rfbm9kZV9lbXB0eSgmcS5saXN0KSkpIHsKLQkJaWYgKCFhYnNfdGltZSkKLQkJCXNjaGVkdWxlKCk7Ci0JCWVsc2UgewotCQkJaHJ0aW1lcl9pbml0X29uX3N0YWNrKCZ0LnRpbWVyLAotCQkJCQkgICAgICBjbG9ja3J0ID8gQ0xPQ0tfUkVBTFRJTUUgOgotCQkJCQkgICAgICBDTE9DS19NT05PVE9OSUMsCi0JCQkJCSAgICAgIEhSVElNRVJfTU9ERV9BQlMpOwotCQkJaHJ0aW1lcl9pbml0X3NsZWVwZXIoJnQsIGN1cnJlbnQpOwotCQkJaHJ0aW1lcl9zZXRfZXhwaXJlc19yYW5nZV9ucygmdC50aW1lciwgKmFic190aW1lLAotCQkJCQkJICAgICBjdXJyZW50LT50aW1lcl9zbGFja19ucyk7CisJaWYgKCFiaXRzZXQpCisJCXJldHVybiAtRUlOVkFMOwogCi0JCQlocnRpbWVyX3N0YXJ0X2V4cGlyZXMoJnQudGltZXIsIEhSVElNRVJfTU9ERV9BQlMpOwotCQkJaWYgKCFocnRpbWVyX2FjdGl2ZSgmdC50aW1lcikpCi0JCQkJdC50YXNrID0gTlVMTDsKKwlxLnBpX3N0YXRlID0gTlVMTDsKKwlxLmJpdHNldCA9IGJpdHNldDsKKwlxLnJ0X3dhaXRlciA9IE5VTEw7CiAKLQkJCS8qCi0JCQkgKiB0aGUgdGltZXIgY291bGQgaGF2ZSBhbHJlYWR5IGV4cGlyZWQsIGluIHdoaWNoCi0JCQkgKiBjYXNlIGN1cnJlbnQgd291bGQgYmUgZmxhZ2dlZCBmb3IgcmVzY2hlZHVsaW5nLgotCQkJICogRG9uJ3QgYm90aGVyIGNhbGxpbmcgc2NoZWR1bGUuCi0JCQkgKi8KLQkJCWlmIChsaWtlbHkodC50YXNrKSkKLQkJCQlzY2hlZHVsZSgpOworCWlmIChhYnNfdGltZSkgeworCQl0byA9ICZ0aW1lb3V0OwogCi0JCQlocnRpbWVyX2NhbmNlbCgmdC50aW1lcik7Ci0KLQkJCS8qIEZsYWcgaWYgYSB0aW1lb3V0IG9jY3VyZWQgKi8KLQkJCXJlbSA9ICh0LnRhc2sgPT0gTlVMTCk7Ci0KLQkJCWRlc3Ryb3lfaHJ0aW1lcl9vbl9zdGFjaygmdC50aW1lcik7Ci0JCX0KKwkJaHJ0aW1lcl9pbml0X29uX3N0YWNrKCZ0by0+dGltZXIsIGNsb2NrcnQgPyBDTE9DS19SRUFMVElNRSA6CisJCQkJICAgICAgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJaHJ0aW1lcl9pbml0X3NsZWVwZXIodG8sIGN1cnJlbnQpOworCQlocnRpbWVyX3NldF9leHBpcmVzX3JhbmdlX25zKCZ0by0+dGltZXIsICphYnNfdGltZSwKKwkJCQkJICAgICBjdXJyZW50LT50aW1lcl9zbGFja19ucyk7CiAJfQotCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKIAotCS8qCi0JICogTk9URTogd2UgZG9uJ3QgcmVtb3ZlIG91cnNlbHZlcyBmcm9tIHRoZSB3YWl0cXVldWUgYmVjYXVzZQotCSAqIHdlIGFyZSB0aGUgb25seSB1c2VyIG9mIGl0LgotCSAqLworCS8qIFByZXBhcmUgdG8gd2FpdCBvbiB1YWRkci4gKi8KKwlyZXQgPSBmdXRleF93YWl0X3NldHVwKHVhZGRyLCB2YWwsIGZzaGFyZWQsICZxLCAmaGIpOworCWlmIChyZXQpCisJCWdvdG8gb3V0OworCisJLyogcXVldWVfbWUgYW5kIHdhaXQgZm9yIHdha2V1cCwgdGltZW91dCwgb3IgYSBzaWduYWwuICovCisJZnV0ZXhfd2FpdF9xdWV1ZV9tZShoYiwgJnEsIHRvKTsKIAogCS8qIElmIHdlIHdlcmUgd29rZW4gKGFuZCB1bnF1ZXVlZCksIHdlIHN1Y2NlZWRlZCwgd2hhdGV2ZXIuICovCiAJcmV0ID0gMDsKIAlpZiAoIXVucXVldWVfbWUoJnEpKQogCQlnb3RvIG91dF9wdXRfa2V5OwogCXJldCA9IC1FVElNRURPVVQ7Ci0JaWYgKHJlbSkKKwlpZiAodG8gJiYgIXRvLT50YXNrKQogCQlnb3RvIG91dF9wdXRfa2V5OwogCiAJLyoKQEAgLTEyNzAsNyArMTc1Nyw3IEBACiAJcmVzdGFydC0+ZnV0ZXgudmFsID0gdmFsOwogCXJlc3RhcnQtPmZ1dGV4LnRpbWUgPSBhYnNfdGltZS0+dHY2NDsKIAlyZXN0YXJ0LT5mdXRleC5iaXRzZXQgPSBiaXRzZXQ7Ci0JcmVzdGFydC0+ZnV0ZXguZmxhZ3MgPSAwOworCXJlc3RhcnQtPmZ1dGV4LmZsYWdzID0gRkxBR1NfSEFTX1RJTUVPVVQ7CiAKIAlpZiAoZnNoYXJlZCkKIAkJcmVzdGFydC0+ZnV0ZXguZmxhZ3MgfD0gRkxBR1NfU0hBUkVEOwpAQCAtMTI4Miw2ICsxNzY5LDEwIEBACiBvdXRfcHV0X2tleToKIAlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CiBvdXQ6CisJaWYgKHRvKSB7CisJCWhydGltZXJfY2FuY2VsKCZ0by0+dGltZXIpOworCQlkZXN0cm95X2hydGltZXJfb25fc3RhY2soJnRvLT50aW1lcik7CisJfQogCXJldHVybiByZXQ7CiB9CiAKQEAgLTEyOTAsMTMgKzE3ODEsMTYgQEAKIHsKIAl1MzIgX191c2VyICp1YWRkciA9ICh1MzIgX191c2VyICopcmVzdGFydC0+ZnV0ZXgudWFkZHI7CiAJaW50IGZzaGFyZWQgPSAwOwotCWt0aW1lX3QgdDsKKwlrdGltZV90IHQsICp0cCA9IE5VTEw7CiAKLQl0LnR2NjQgPSByZXN0YXJ0LT5mdXRleC50aW1lOworCWlmIChyZXN0YXJ0LT5mdXRleC5mbGFncyAmIEZMQUdTX0hBU19USU1FT1VUKSB7CisJCXQudHY2NCA9IHJlc3RhcnQtPmZ1dGV4LnRpbWU7CisJCXRwID0gJnQ7CisJfQogCXJlc3RhcnQtPmZuID0gZG9fbm9fcmVzdGFydF9zeXNjYWxsOwogCWlmIChyZXN0YXJ0LT5mdXRleC5mbGFncyAmIEZMQUdTX1NIQVJFRCkKIAkJZnNoYXJlZCA9IDE7Ci0JcmV0dXJuIChsb25nKWZ1dGV4X3dhaXQodWFkZHIsIGZzaGFyZWQsIHJlc3RhcnQtPmZ1dGV4LnZhbCwgJnQsCisJcmV0dXJuIChsb25nKWZ1dGV4X3dhaXQodWFkZHIsIGZzaGFyZWQsIHJlc3RhcnQtPmZ1dGV4LnZhbCwgdHAsCiAJCQkJcmVzdGFydC0+ZnV0ZXguYml0c2V0LAogCQkJCXJlc3RhcnQtPmZ1dGV4LmZsYWdzICYgRkxBR1NfQ0xPQ0tSVCk7CiB9CkBAIC0xMzEyLDExICsxODA2LDEwIEBACiAJCQkgaW50IGRldGVjdCwga3RpbWVfdCAqdGltZSwgaW50IHRyeWxvY2spCiB7CiAJc3RydWN0IGhydGltZXJfc2xlZXBlciB0aW1lb3V0LCAqdG8gPSBOVUxMOwotCXN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciA9IGN1cnJlbnQ7CiAJc3RydWN0IGZ1dGV4X2hhc2hfYnVja2V0ICpoYjsKLQl1MzIgdXZhbCwgbmV3dmFsLCBjdXJ2YWw7CisJdTMyIHV2YWw7CiAJc3RydWN0IGZ1dGV4X3EgcTsKLQlpbnQgcmV0LCBsb2NrX3Rha2VuLCBvd25lcmRpZWQgPSAwOworCWludCByZXMsIHJldDsKIAogCWlmIChyZWZpbGxfcGlfc3RhdGVfY2FjaGUoKSkKIAkJcmV0dXJuIC1FTk9NRU07CkBAIC0xMzMwLDYgKzE4MjMsNyBAQAogCX0KIAogCXEucGlfc3RhdGUgPSBOVUxMOworCXEucnRfd2FpdGVyID0gTlVMTDsKIHJldHJ5OgogCXEua2V5ID0gRlVURVhfS0VZX0lOSVQ7CiAJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkciwgZnNoYXJlZCwgJnEua2V5LCBWRVJJRllfV1JJVEUpOwpAQCAtMTMzOSw4MSArMTgzMywxNSBAQAogcmV0cnlfcHJpdmF0ZToKIAloYiA9IHF1ZXVlX2xvY2soJnEpOwogCi1yZXRyeV9sb2NrZWQ6Ci0JcmV0ID0gbG9ja190YWtlbiA9IDA7Ci0KLQkvKgotCSAqIFRvIGF2b2lkIHJhY2VzLCB3ZSBhdHRlbXB0IHRvIHRha2UgdGhlIGxvY2sgaGVyZSBhZ2FpbgotCSAqIChieSBkb2luZyBhIDAgLT4gVElEIGF0b21pYyBjbXB4Y2hnKSwgd2hpbGUgaG9sZGluZyBhbGwKLQkgKiB0aGUgbG9ja3MuIEl0IHdpbGwgbW9zdCBsaWtlbHkgbm90IHN1Y2NlZWQuCi0JICovCi0JbmV3dmFsID0gdGFza19waWRfdm5yKGN1cnJlbnQpOwotCi0JY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIDAsIG5ld3ZhbCk7Ci0KLQlpZiAodW5saWtlbHkoY3VydmFsID09IC1FRkFVTFQpKQotCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7Ci0KLQkvKgotCSAqIERldGVjdCBkZWFkbG9ja3MuIEluIGNhc2Ugb2YgUkVRVUVVRV9QSSB0aGlzIGlzIGEgdmFsaWQKLQkgKiBzaXR1YXRpb24gYW5kIHdlIHJldHVybiBzdWNjZXNzIHRvIHVzZXIgc3BhY2UuCi0JICovCi0JaWYgKHVubGlrZWx5KChjdXJ2YWwgJiBGVVRFWF9USURfTUFTSykgPT0gdGFza19waWRfdm5yKGN1cnJlbnQpKSkgewotCQlyZXQgPSAtRURFQURMSzsKLQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7Ci0JfQotCi0JLyoKLQkgKiBTdXJwcmlzZSAtIHdlIGdvdCB0aGUgbG9jay4gSnVzdCByZXR1cm4gdG8gdXNlcnNwYWNlOgotCSAqLwotCWlmICh1bmxpa2VseSghY3VydmFsKSkKLQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7Ci0KLQl1dmFsID0gY3VydmFsOwotCi0JLyoKLQkgKiBTZXQgdGhlIFdBSVRFUlMgZmxhZywgc28gdGhlIG93bmVyIHdpbGwga25vdyBpdCBoYXMgc29tZW9uZQotCSAqIHRvIHdha2UgYXQgbmV4dCB1bmxvY2sKLQkgKi8KLQluZXd2YWwgPSBjdXJ2YWwgfCBGVVRFWF9XQUlURVJTOwotCi0JLyoKLQkgKiBUaGVyZSBhcmUgdHdvIGNhc2VzLCB3aGVyZSBhIGZ1dGV4IG1pZ2h0IGhhdmUgbm8gb3duZXIgKHRoZQotCSAqIG93bmVyIFRJRCBpcyAwKTogT1dORVJfRElFRC4gV2UgdGFrZSBvdmVyIHRoZSBmdXRleCBpbiB0aGlzCi0JICogY2FzZS4gV2UgYWxzbyBkbyBhbiB1bmNvbmRpdGlvbmFsIHRha2Ugb3Zlciwgd2hlbiB0aGUgb3duZXIKLQkgKiBvZiB0aGUgZnV0ZXggZGllZC4KLQkgKgotCSAqIFRoaXMgaXMgc2FmZSBhcyB3ZSBhcmUgcHJvdGVjdGVkIGJ5IHRoZSBoYXNoIGJ1Y2tldCBsb2NrICEKLQkgKi8KLQlpZiAodW5saWtlbHkob3duZXJkaWVkIHx8ICEoY3VydmFsICYgRlVURVhfVElEX01BU0spKSkgewotCQkvKiBLZWVwIHRoZSBPV05FUl9ESUVEIGJpdCAqLwotCQluZXd2YWwgPSAoY3VydmFsICYgfkZVVEVYX1RJRF9NQVNLKSB8IHRhc2tfcGlkX3ZucihjdXJyZW50KTsKLQkJb3duZXJkaWVkID0gMDsKLQkJbG9ja190YWtlbiA9IDE7Ci0JfQotCi0JY3VydmFsID0gY21weGNoZ19mdXRleF92YWx1ZV9sb2NrZWQodWFkZHIsIHV2YWwsIG5ld3ZhbCk7Ci0KLQlpZiAodW5saWtlbHkoY3VydmFsID09IC1FRkFVTFQpKQotCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7Ci0JaWYgKHVubGlrZWx5KGN1cnZhbCAhPSB1dmFsKSkKLQkJZ290byByZXRyeV9sb2NrZWQ7Ci0KLQkvKgotCSAqIFdlIHRvb2sgdGhlIGxvY2sgZHVlIHRvIG93bmVyIGRpZWQgdGFrZSBvdmVyLgotCSAqLwotCWlmICh1bmxpa2VseShsb2NrX3Rha2VuKSkKLQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7Ci0KLQkvKgotCSAqIFdlIGRvbnQgaGF2ZSB0aGUgbG9jay4gTG9vayB1cCB0aGUgUEkgc3RhdGUgKG9yIGNyZWF0ZSBpdCBpZgotCSAqIHdlIGFyZSB0aGUgZmlyc3Qgd2FpdGVyKToKLQkgKi8KLQlyZXQgPSBsb29rdXBfcGlfc3RhdGUodXZhbCwgaGIsICZxLmtleSwgJnEucGlfc3RhdGUpOwotCisJcmV0ID0gZnV0ZXhfbG9ja19waV9hdG9taWModWFkZHIsIGhiLCAmcS5rZXksICZxLnBpX3N0YXRlLCBjdXJyZW50LCAwKTsKIAlpZiAodW5saWtlbHkocmV0KSkgewogCQlzd2l0Y2ggKHJldCkgewotCisJCWNhc2UgMToKKwkJCS8qIFdlIGdvdCB0aGUgbG9jay4gKi8KKwkJCXJldCA9IDA7CisJCQlnb3RvIG91dF91bmxvY2tfcHV0X2tleTsKKwkJY2FzZSAtRUZBVUxUOgorCQkJZ290byB1YWRkcl9mYXVsdGVkOwogCQljYXNlIC1FQUdBSU46CiAJCQkvKgogCQkJICogVGFzayBpcyBleGl0aW5nIGFuZCB3ZSBqdXN0IHdhaXQgZm9yIHRoZQpAQCAtMTQyMywyNSArMTg1MSw2IEBACiAJCQlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CiAJCQljb25kX3Jlc2NoZWQoKTsKIAkJCWdvdG8gcmV0cnk7Ci0KLQkJY2FzZSAtRVNSQ0g6Ci0JCQkvKgotCQkJICogTm8gb3duZXIgZm91bmQgZm9yIHRoaXMgZnV0ZXguIENoZWNrIGlmIHRoZQotCQkJICogT1dORVJfRElFRCBiaXQgaXMgc2V0IHRvIGZpZ3VyZSBvdXQgd2hldGhlcgotCQkJICogdGhpcyBpcyBhIHJvYnVzdCBmdXRleCBvciBub3QuCi0JCQkgKi8KLQkJCWlmIChnZXRfZnV0ZXhfdmFsdWVfbG9ja2VkKCZjdXJ2YWwsIHVhZGRyKSkKLQkJCQlnb3RvIHVhZGRyX2ZhdWx0ZWQ7Ci0KLQkJCS8qCi0JCQkgKiBXZSBzaW1wbHkgc3RhcnQgb3ZlciBpbiBjYXNlIG9mIGEgcm9idXN0Ci0JCQkgKiBmdXRleC4gVGhlIGNvZGUgYWJvdmUgd2lsbCB0YWtlIHRoZSBmdXRleAotCQkJICogYW5kIHJldHVybiBoYXBweS4KLQkJCSAqLwotCQkJaWYgKGN1cnZhbCAmIEZVVEVYX09XTkVSX0RJRUQpIHsKLQkJCQlvd25lcmRpZWQgPSAxOwotCQkJCWdvdG8gcmV0cnlfbG9ja2VkOwotCQkJfQogCQlkZWZhdWx0OgogCQkJZ290byBvdXRfdW5sb2NrX3B1dF9rZXk7CiAJCX0KQEAgLTE0NjUsNzEgKzE4NzQsMjEgQEAKIAl9CiAKIAlzcGluX2xvY2socS5sb2NrX3B0cik7Ci0KLQlpZiAoIXJldCkgewotCQkvKgotCQkgKiBHb3QgdGhlIGxvY2suIFdlIG1pZ2h0IG5vdCBiZSB0aGUgYW50aWNpcGF0ZWQgb3duZXIKLQkJICogaWYgd2UgZGlkIGEgbG9jay1zdGVhbCAtIGZpeCB1cCB0aGUgUEktc3RhdGUgaW4KLQkJICogdGhhdCBjYXNlOgotCQkgKi8KLQkJaWYgKHEucGlfc3RhdGUtPm93bmVyICE9IGN1cnIpCi0JCQlyZXQgPSBmaXh1cF9waV9zdGF0ZV9vd25lcih1YWRkciwgJnEsIGN1cnIsIGZzaGFyZWQpOwotCX0gZWxzZSB7Ci0JCS8qCi0JCSAqIENhdGNoIHRoZSByYXJlIGNhc2UsIHdoZXJlIHRoZSBsb2NrIHdhcyByZWxlYXNlZAotCQkgKiB3aGVuIHdlIHdlcmUgb24gdGhlIHdheSBiYWNrIGJlZm9yZSB3ZSBsb2NrZWQgdGhlCi0JCSAqIGhhc2ggYnVja2V0LgotCQkgKi8KLQkJaWYgKHEucGlfc3RhdGUtPm93bmVyID09IGN1cnIpIHsKLQkJCS8qCi0JCQkgKiBUcnkgdG8gZ2V0IHRoZSBydF9tdXRleCBub3cuIFRoaXMgbWlnaHQKLQkJCSAqIGZhaWwgYXMgc29tZSBvdGhlciB0YXNrIGFjcXVpcmVkIHRoZQotCQkJICogcnRfbXV0ZXggYWZ0ZXIgd2UgcmVtb3ZlZCBvdXJzZWxmIGZyb20gdGhlCi0JCQkgKiBydF9tdXRleCB3YWl0ZXJzIGxpc3QuCi0JCQkgKi8KLQkJCWlmIChydF9tdXRleF90cnlsb2NrKCZxLnBpX3N0YXRlLT5waV9tdXRleCkpCi0JCQkJcmV0ID0gMDsKLQkJCWVsc2UgewotCQkJCS8qCi0JCQkJICogcGlfc3RhdGUgaXMgaW5jb3JyZWN0LCBzb21lIG90aGVyCi0JCQkJICogdGFzayBkaWQgYSBsb2NrIHN0ZWFsIGFuZCB3ZQotCQkJCSAqIHJldHVybmVkIGR1ZSB0byB0aW1lb3V0IG9yIHNpZ25hbAotCQkJCSAqIHdpdGhvdXQgdGFraW5nIHRoZSBydF9tdXRleC4gVG9vCi0JCQkJICogbGF0ZS4gV2UgY2FuIGFjY2VzcyB0aGUKLQkJCQkgKiBydF9tdXRleF9vd25lciB3aXRob3V0IGxvY2tpbmcsIGFzCi0JCQkJICogdGhlIG90aGVyIHRhc2sgaXMgbm93IGJsb2NrZWQgb24KLQkJCQkgKiB0aGUgaGFzaCBidWNrZXQgbG9jay4gRml4IHRoZSBzdGF0ZQotCQkJCSAqIHVwLgotCQkJCSAqLwotCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqb3duZXI7Ci0JCQkJaW50IHJlczsKLQotCQkJCW93bmVyID0gcnRfbXV0ZXhfb3duZXIoJnEucGlfc3RhdGUtPnBpX211dGV4KTsKLQkJCQlyZXMgPSBmaXh1cF9waV9zdGF0ZV9vd25lcih1YWRkciwgJnEsIG93bmVyLAotCQkJCQkJCSAgIGZzaGFyZWQpOwotCi0JCQkJLyogcHJvcGFnYXRlIC1FRkFVTFQsIGlmIHRoZSBmaXh1cCBmYWlsZWQgKi8KLQkJCQlpZiAocmVzKQotCQkJCQlyZXQgPSByZXM7Ci0JCQl9Ci0JCX0gZWxzZSB7Ci0JCQkvKgotCQkJICogUGFyYW5vaWEgY2hlY2suIElmIHdlIGRpZCBub3QgdGFrZSB0aGUgbG9jawotCQkJICogaW4gdGhlIHRyeWxvY2sgYWJvdmUsIHRoZW4gd2Ugc2hvdWxkIG5vdCBiZQotCQkJICogdGhlIG93bmVyIG9mIHRoZSBydG11dGV4LCBuZWl0aGVyIHRoZSByZWFsCi0JCQkgKiBub3IgdGhlIHBlbmRpbmcgb25lOgotCQkJICovCi0JCQlpZiAocnRfbXV0ZXhfb3duZXIoJnEucGlfc3RhdGUtPnBpX211dGV4KSA9PSBjdXJyKQotCQkJCXByaW50ayhLRVJOX0VSUiAiZnV0ZXhfbG9ja19waTogcmV0ID0gJWQgIgotCQkJCSAgICAgICAicGktbXV0ZXg6ICVwIHBpLXN0YXRlICVwXG4iLCByZXQsCi0JCQkJICAgICAgIHEucGlfc3RhdGUtPnBpX211dGV4Lm93bmVyLAotCQkJCSAgICAgICBxLnBpX3N0YXRlLT5vd25lcik7Ci0JCX0KLQl9CisJLyoKKwkgKiBGaXh1cCB0aGUgcGlfc3RhdGUgb3duZXIgYW5kIHBvc3NpYmx5IGFjcXVpcmUgdGhlIGxvY2sgaWYgd2UKKwkgKiBoYXZlbid0IGFscmVhZHkuCisJICovCisJcmVzID0gZml4dXBfb3duZXIodWFkZHIsIGZzaGFyZWQsICZxLCAhcmV0KTsKKwkvKgorCSAqIElmIGZpeHVwX293bmVyKCkgcmV0dXJuZWQgYW4gZXJyb3IsIHByb3Byb2dhdGUgdGhhdC4gIElmIGl0IGFjcXVpcmVkCisJICogdGhlIGxvY2ssIGNsZWFyIG91ciAtRVRJTUVET1VUIG9yIC1FSU5UUi4KKwkgKi8KKwlpZiAocmVzKQorCQlyZXQgPSAocmVzIDwgMCkgPyByZXMgOiAwOwogCiAJLyoKLQkgKiBJZiBmaXh1cF9waV9zdGF0ZV9vd25lcigpIGZhdWx0ZWQgYW5kIHdhcyB1bmFibGUgdG8gaGFuZGxlIHRoZQotCSAqIGZhdWx0LCB1bmxvY2sgaXQgYW5kIHJldHVybiB0aGUgZmF1bHQgdG8gdXNlcnNwYWNlLgorCSAqIElmIGZpeHVwX293bmVyKCkgZmF1bHRlZCBhbmQgd2FzIHVuYWJsZSB0byBoYW5kbGUgdGhlIGZhdWx0LCB1bmxvY2sKKwkgKiBpdCBhbmQgcmV0dXJuIHRoZSBmYXVsdCB0byB1c2Vyc3BhY2UuCiAJICovCiAJaWYgKHJldCAmJiAocnRfbXV0ZXhfb3duZXIoJnEucGlfc3RhdGUtPnBpX211dGV4KSA9PSBjdXJyZW50KSkKIAkJcnRfbXV0ZXhfdW5sb2NrKCZxLnBpX3N0YXRlLT5waV9tdXRleCk7CkBAIC0xNTM3LDkgKzE4OTYsNyBAQAogCS8qIFVucXVldWUgYW5kIGRyb3AgdGhlIGxvY2sgKi8KIAl1bnF1ZXVlX21lX3BpKCZxKTsKIAotCWlmICh0bykKLQkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOwotCXJldHVybiByZXQgIT0gLUVJTlRSID8gcmV0IDogLUVSRVNUQVJUTk9JTlRSOworCWdvdG8gb3V0OwogCiBvdXRfdW5sb2NrX3B1dF9rZXk6CiAJcXVldWVfdW5sb2NrKCZxLCBoYik7CkBAIC0xNTQ5LDcgKzE5MDYsNyBAQAogb3V0OgogCWlmICh0bykKIAkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOwotCXJldHVybiByZXQ7CisJcmV0dXJuIHJldCAhPSAtRUlOVFIgPyByZXQgOiAtRVJFU1RBUlROT0lOVFI7CiAKIHVhZGRyX2ZhdWx0ZWQ6CiAJLyoKQEAgLTE1NzIsNyArMTkyOSw2IEBACiAJZ290byByZXRyeTsKIH0KIAotCiAvKgogICogVXNlcnNwYWNlIGF0dGVtcHRlZCBhIFRJRCAtPiAwIGF0b21pYyB0cmFuc2l0aW9uLCBhbmQgZmFpbGVkLgogICogVGhpcyBpcyB0aGUgaW4ta2VybmVsIHNsb3dwYXRoOiB3ZSBsb29rIHVwIHRoZSBQSSBzdGF0ZSAoaWYgYW55KSwKQEAgLTE2NzQsNiArMjAzMCwyMjkgQEAKIAlyZXR1cm4gcmV0OwogfQogCisvKioKKyAqIGhhbmRsZV9lYXJseV9yZXF1ZXVlX3BpX3dha2V1cCgpIC0gRGV0ZWN0IGVhcmx5IHdha2V1cCBvbiB0aGUgaW5pdGlhbCBmdXRleAorICogQGhiOgkJdGhlIGhhc2hfYnVja2V0IGZ1dGV4X3Egd2FzIG9yaWdpbmFsIGVucXVldWVkIG9uCisgKiBAcToJCXRoZSBmdXRleF9xIHdva2VuIHdoaWxlIHdhaXRpbmcgdG8gYmUgcmVxdWV1ZWQKKyAqIEBrZXkyOgl0aGUgZnV0ZXhfa2V5IG9mIHRoZSByZXF1ZXVlIHRhcmdldCBmdXRleAorICogQHRpbWVvdXQ6CXRoZSB0aW1lb3V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgd2FpdCAoTlVMTCBpZiBub25lKQorICoKKyAqIERldGVjdCBpZiB0aGUgdGFzayB3YXMgd29rZW4gb24gdGhlIGluaXRpYWwgZnV0ZXggYXMgb3Bwb3NlZCB0byB0aGUgcmVxdWV1ZQorICogdGFyZ2V0IGZ1dGV4LiAgSWYgc28sIGRldGVybWluZSBpZiBpdCB3YXMgYSB0aW1lb3V0IG9yIGEgc2lnbmFsIHRoYXQgY2F1c2VkCisgKiB0aGUgd2FrZXVwIGFuZCByZXR1cm4gdGhlIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUgdG8gdGhlIGNhbGxlci4gIE11c3QgYmUKKyAqIGNhbGxlZCB3aXRoIHRoZSBoYiBsb2NrIGhlbGQuCisgKgorICogUmV0dXJucworICogIDAgLSBubyBlYXJseSB3YWtldXAgZGV0ZWN0ZWQKKyAqIDwwIC0gLUVUSU1FRE9VVCBvciAtRVJFU1RBUlROT0lOVFIKKyAqLworc3RhdGljIGlubGluZQoraW50IGhhbmRsZV9lYXJseV9yZXF1ZXVlX3BpX3dha2V1cChzdHJ1Y3QgZnV0ZXhfaGFzaF9idWNrZXQgKmhiLAorCQkJCSAgIHN0cnVjdCBmdXRleF9xICpxLCB1bmlvbiBmdXRleF9rZXkgKmtleTIsCisJCQkJICAgc3RydWN0IGhydGltZXJfc2xlZXBlciAqdGltZW91dCkKK3sKKwlpbnQgcmV0ID0gMDsKKworCS8qCisJICogV2l0aCB0aGUgaGIgbG9jayBoZWxkLCB3ZSBhdm9pZCByYWNlcyB3aGlsZSB3ZSBwcm9jZXNzIHRoZSB3YWtldXAuCisJICogV2Ugb25seSBuZWVkIHRvIGhvbGQgaGIgKGFuZCBub3QgaGIyKSB0byBlbnN1cmUgYXRvbWljaXR5IGFzIHRoZQorCSAqIHdha2V1cCBjb2RlIGNhbid0IGNoYW5nZSBxLmtleSBmcm9tIHVhZGRyIHRvIHVhZGRyMiBpZiB3ZSBob2xkIGhiLgorCSAqIEl0IGNhbid0IGJlIHJlcXVldWVkIGZyb20gdWFkZHIyIHRvIHNvbWV0aGluZyBlbHNlIHNpbmNlIHdlIGRvbid0CisJICogc3VwcG9ydCBhIFBJIGF3YXJlIHNvdXJjZSBmdXRleCBmb3IgcmVxdWV1ZS4KKwkgKi8KKwlpZiAoIW1hdGNoX2Z1dGV4KCZxLT5rZXksIGtleTIpKSB7CisJCVdBUk5fT04ocS0+bG9ja19wdHIgJiYgKCZoYi0+bG9jayAhPSBxLT5sb2NrX3B0cikpOworCQkvKgorCQkgKiBXZSB3ZXJlIHdva2VuIHByaW9yIHRvIHJlcXVldWUgYnkgYSB0aW1lb3V0IG9yIGEgc2lnbmFsLgorCQkgKiBVbnF1ZXVlIHRoZSBmdXRleF9xIGFuZCBkZXRlcm1pbmUgd2hpY2ggaXQgd2FzLgorCQkgKi8KKwkJcGxpc3RfZGVsKCZxLT5saXN0LCAmcS0+bGlzdC5wbGlzdCk7CisJCWRyb3BfZnV0ZXhfa2V5X3JlZnMoJnEtPmtleSk7CisKKwkJaWYgKHRpbWVvdXQgJiYgIXRpbWVvdXQtPnRhc2spCisJCQlyZXQgPSAtRVRJTUVET1VUOworCQllbHNlCisJCQlyZXQgPSAtRVJFU1RBUlROT0lOVFI7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qKgorICogZnV0ZXhfd2FpdF9yZXF1ZXVlX3BpKCkgLSBXYWl0IG9uIHVhZGRyIGFuZCB0YWtlIHVhZGRyMgorICogQHVhZGRyOgl0aGUgZnV0ZXggd2UgaW5pdGlhbHlsIHdhaXQgb24gKG5vbi1waSkKKyAqIEBmc2hhcmVkOgl3aGV0aGVyIHRoZSBmdXRleGVzIGFyZSBzaGFyZWQgKDEpIG9yIG5vdCAoMCkuICBUaGV5IG11c3QgYmUKKyAqIAkJdGhlIHNhbWUgdHlwZSwgbm8gcmVxdWV1ZWluZyBmcm9tIHByaXZhdGUgdG8gc2hhcmVkLCBldGMuCisgKiBAdmFsOgl0aGUgZXhwZWN0ZWQgdmFsdWUgb2YgdWFkZHIKKyAqIEBhYnNfdGltZToJYWJzb2x1dGUgdGltZW91dAorICogQGJpdHNldDoJMzIgYml0IHdha2V1cCBiaXRzZXQgc2V0IGJ5IHVzZXJzcGFjZSwgZGVmYXVsdHMgdG8gYWxsLgorICogQGNsb2NrcnQ6CXdoZXRoZXIgdG8gdXNlIENMT0NLX1JFQUxUSU1FICgxKSBvciBDTE9DS19NT05PVE9OSUMgKDApCisgKiBAdWFkZHIyOgl0aGUgcGkgZnV0ZXggd2Ugd2lsbCB0YWtlIHByaW9yIHRvIHJldHVybmluZyB0byB1c2VyLXNwYWNlCisgKgorICogVGhlIGNhbGxlciB3aWxsIHdhaXQgb24gdWFkZHIgYW5kIHdpbGwgYmUgcmVxdWV1ZWQgYnkgZnV0ZXhfcmVxdWV1ZSgpIHRvCisgKiB1YWRkcjIgd2hpY2ggbXVzdCBiZSBQSSBhd2FyZS4gIE5vcm1hbCB3YWtldXAgd2lsbCB3YWtlIG9uIHVhZGRyMiBhbmQKKyAqIGNvbXBsZXRlIHRoZSBhY3F1aXNpdGlvbiBvZiB0aGUgcnRfbXV0ZXggcHJpb3IgdG8gcmV0dXJuaW5nIHRvIHVzZXJzcGFjZS4KKyAqIFRoaXMgZW5zdXJlcyB0aGUgcnRfbXV0ZXggbWFpbnRhaW5zIGFuIG93bmVyIHdoZW4gaXQgaGFzIHdhaXRlcnM7IHdpdGhvdXQKKyAqIG9uZSwgdGhlIHBpIGxvZ2ljIHdvdWxkbid0IGtub3cgd2hpY2ggdGFzayB0byBib29zdC9kZWJvb3N0LCBpZiB0aGVyZSB3YXMgYQorICogbmVlZCB0by4KKyAqCisgKiBXZSBjYWxsIHNjaGVkdWxlIGluIGZ1dGV4X3dhaXRfcXVldWVfbWUoKSB3aGVuIHdlIGVucXVldWUgYW5kIHJldHVybiB0aGVyZQorICogdmlhIHRoZSBmb2xsb3dpbmc6CisgKiAxKSB3YWtldXAgb24gdWFkZHIyIGFmdGVyIGFuIGF0b21pYyBsb2NrIGFjcXVpc2l0aW9uIGJ5IGZ1dGV4X3JlcXVldWUoKQorICogMikgd2FrZXVwIG9uIHVhZGRyMiBhZnRlciBhIHJlcXVldWUgYW5kIHN1YnNlcXVlbnQgdW5sb2NrCisgKiAzKSBzaWduYWwgKGJlZm9yZSBvciBhZnRlciByZXF1ZXVlKQorICogNCkgdGltZW91dCAoYmVmb3JlIG9yIGFmdGVyIHJlcXVldWUpCisgKgorICogSWYgMywgd2Ugc2V0dXAgYSByZXN0YXJ0X2Jsb2NrIHdpdGggZnV0ZXhfd2FpdF9yZXF1ZXVlX3BpKCkgYXMgdGhlIGZ1bmN0aW9uLgorICoKKyAqIElmIDIsIHdlIG1heSB0aGVuIGJsb2NrIG9uIHRyeWluZyB0byB0YWtlIHRoZSBydF9tdXRleCBhbmQgcmV0dXJuIHZpYToKKyAqIDUpIHN1Y2Nlc3NmdWwgbG9jaworICogNikgc2lnbmFsCisgKiA3KSB0aW1lb3V0CisgKiA4KSBvdGhlciBsb2NrIGFjcXVpc2l0aW9uIGZhaWx1cmUKKyAqCisgKiBJZiA2LCB3ZSBzZXR1cCBhIHJlc3RhcnRfYmxvY2sgd2l0aCBmdXRleF9sb2NrX3BpKCkgYXMgdGhlIGZ1bmN0aW9uLgorICoKKyAqIElmIDQgb3IgNywgd2UgY2xlYW51cCBhbmQgcmV0dXJuIHdpdGggLUVUSU1FRE9VVC4KKyAqCisgKiBSZXR1cm5zOgorICogIDAgLSBPbiBzdWNjZXNzCisgKiA8MCAtIE9uIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgZnV0ZXhfd2FpdF9yZXF1ZXVlX3BpKHUzMiBfX3VzZXIgKnVhZGRyLCBpbnQgZnNoYXJlZCwKKwkJCQkgdTMyIHZhbCwga3RpbWVfdCAqYWJzX3RpbWUsIHUzMiBiaXRzZXQsCisJCQkJIGludCBjbG9ja3J0LCB1MzIgX191c2VyICp1YWRkcjIpCit7CisJc3RydWN0IGhydGltZXJfc2xlZXBlciB0aW1lb3V0LCAqdG8gPSBOVUxMOworCXN0cnVjdCBydF9tdXRleF93YWl0ZXIgcnRfd2FpdGVyOworCXN0cnVjdCBydF9tdXRleCAqcGlfbXV0ZXggPSBOVUxMOworCXN0cnVjdCBmdXRleF9oYXNoX2J1Y2tldCAqaGI7CisJdW5pb24gZnV0ZXhfa2V5IGtleTI7CisJc3RydWN0IGZ1dGV4X3EgcTsKKwlpbnQgcmVzLCByZXQ7CisKKwlpZiAoIWJpdHNldCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoYWJzX3RpbWUpIHsKKwkJdG8gPSAmdGltZW91dDsKKwkJaHJ0aW1lcl9pbml0X29uX3N0YWNrKCZ0by0+dGltZXIsIGNsb2NrcnQgPyBDTE9DS19SRUFMVElNRSA6CisJCQkJICAgICAgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfQUJTKTsKKwkJaHJ0aW1lcl9pbml0X3NsZWVwZXIodG8sIGN1cnJlbnQpOworCQlocnRpbWVyX3NldF9leHBpcmVzX3JhbmdlX25zKCZ0by0+dGltZXIsICphYnNfdGltZSwKKwkJCQkJICAgICBjdXJyZW50LT50aW1lcl9zbGFja19ucyk7CisJfQorCisJLyoKKwkgKiBUaGUgd2FpdGVyIGlzIGFsbG9jYXRlZCBvbiBvdXIgc3RhY2ssIG1hbmlwdWxhdGVkIGJ5IHRoZSByZXF1ZXVlCisJICogY29kZSB3aGlsZSB3ZSBzbGVlcCBvbiB1YWRkci4KKwkgKi8KKwlkZWJ1Z19ydF9tdXRleF9pbml0X3dhaXRlcigmcnRfd2FpdGVyKTsKKwlydF93YWl0ZXIudGFzayA9IE5VTEw7CisKKwlxLnBpX3N0YXRlID0gTlVMTDsKKwlxLmJpdHNldCA9IGJpdHNldDsKKwlxLnJ0X3dhaXRlciA9ICZydF93YWl0ZXI7CisKKwlrZXkyID0gRlVURVhfS0VZX0lOSVQ7CisJcmV0ID0gZ2V0X2Z1dGV4X2tleSh1YWRkcjIsIGZzaGFyZWQsICZrZXkyLCBWRVJJRllfV1JJVEUpOworCWlmICh1bmxpa2VseShyZXQgIT0gMCkpCisJCWdvdG8gb3V0OworCisJLyogUHJlcGFyZSB0byB3YWl0IG9uIHVhZGRyLiAqLworCXJldCA9IGZ1dGV4X3dhaXRfc2V0dXAodWFkZHIsIHZhbCwgZnNoYXJlZCwgJnEsICZoYik7CisJaWYgKHJldCkKKwkJZ290byBvdXRfa2V5MjsKKworCS8qIFF1ZXVlIHRoZSBmdXRleF9xLCBkcm9wIHRoZSBoYiBsb2NrLCB3YWl0IGZvciB3YWtldXAuICovCisJZnV0ZXhfd2FpdF9xdWV1ZV9tZShoYiwgJnEsIHRvKTsKKworCXNwaW5fbG9jaygmaGItPmxvY2spOworCXJldCA9IGhhbmRsZV9lYXJseV9yZXF1ZXVlX3BpX3dha2V1cChoYiwgJnEsICZrZXkyLCB0byk7CisJc3Bpbl91bmxvY2soJmhiLT5sb2NrKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dF9wdXRfa2V5czsKKworCS8qCisJICogSW4gb3JkZXIgZm9yIHVzIHRvIGJlIGhlcmUsIHdlIGtub3cgb3VyIHEua2V5ID09IGtleTIsIGFuZCBzaW5jZQorCSAqIHdlIHRvb2sgdGhlIGhiLT5sb2NrIGFib3ZlLCB3ZSBhbHNvIGtub3cgdGhhdCBmdXRleF9yZXF1ZXVlKCkgaGFzCisJICogY29tcGxldGVkIGFuZCB3ZSBubyBsb25nZXIgaGF2ZSB0byBjb25jZXJuIG91cnNlbHZlcyB3aXRoIGEgd2FrZXVwCisJICogcmFjZSB3aXRoIHRoZSBhdG9taWMgcHJveHkgbG9jayBhY3F1aXRpb24gYnkgdGhlIHJlcXVldWUgY29kZS4KKwkgKi8KKworCS8qIENoZWNrIGlmIHRoZSByZXF1ZXVlIGNvZGUgYWNxdWlyZWQgdGhlIHNlY29uZCBmdXRleCBmb3IgdXMuICovCisJaWYgKCFxLnJ0X3dhaXRlcikgeworCQkvKgorCQkgKiBHb3QgdGhlIGxvY2suIFdlIG1pZ2h0IG5vdCBiZSB0aGUgYW50aWNpcGF0ZWQgb3duZXIgaWYgd2UKKwkJICogZGlkIGEgbG9jay1zdGVhbCAtIGZpeCB1cCB0aGUgUEktc3RhdGUgaW4gdGhhdCBjYXNlLgorCQkgKi8KKwkJaWYgKHEucGlfc3RhdGUgJiYgKHEucGlfc3RhdGUtPm93bmVyICE9IGN1cnJlbnQpKSB7CisJCQlzcGluX2xvY2socS5sb2NrX3B0cik7CisJCQlyZXQgPSBmaXh1cF9waV9zdGF0ZV9vd25lcih1YWRkcjIsICZxLCBjdXJyZW50LAorCQkJCQkJICAgZnNoYXJlZCk7CisJCQlzcGluX3VubG9jayhxLmxvY2tfcHRyKTsKKwkJfQorCX0gZWxzZSB7CisJCS8qCisJCSAqIFdlIGhhdmUgYmVlbiB3b2tlbiB1cCBieSBmdXRleF91bmxvY2tfcGkoKSwgYSB0aW1lb3V0LCBvciBhCisJCSAqIHNpZ25hbC4gIGZ1dGV4X3VubG9ja19waSgpIHdpbGwgbm90IGRlc3Ryb3kgdGhlIGxvY2tfcHRyIG5vcgorCQkgKiB0aGUgcGlfc3RhdGUuCisJCSAqLworCQlXQVJOX09OKCEmcS5waV9zdGF0ZSk7CisJCXBpX211dGV4ID0gJnEucGlfc3RhdGUtPnBpX211dGV4OworCQlyZXQgPSBydF9tdXRleF9maW5pc2hfcHJveHlfbG9jayhwaV9tdXRleCwgdG8sICZydF93YWl0ZXIsIDEpOworCQlkZWJ1Z19ydF9tdXRleF9mcmVlX3dhaXRlcigmcnRfd2FpdGVyKTsKKworCQlzcGluX2xvY2socS5sb2NrX3B0cik7CisJCS8qCisJCSAqIEZpeHVwIHRoZSBwaV9zdGF0ZSBvd25lciBhbmQgcG9zc2libHkgYWNxdWlyZSB0aGUgbG9jayBpZiB3ZQorCQkgKiBoYXZlbid0IGFscmVhZHkuCisJCSAqLworCQlyZXMgPSBmaXh1cF9vd25lcih1YWRkcjIsIGZzaGFyZWQsICZxLCAhcmV0KTsKKwkJLyoKKwkJICogSWYgZml4dXBfb3duZXIoKSByZXR1cm5lZCBhbiBlcnJvciwgcHJvcHJvZ2F0ZSB0aGF0LiAgSWYgaXQKKwkJICogYWNxdWlyZWQgdGhlIGxvY2ssIGNsZWFyIG91ciAtRVRJTUVET1VUIG9yIC1FSU5UUi4KKwkJICovCisJCWlmIChyZXMpCisJCQlyZXQgPSAocmVzIDwgMCkgPyByZXMgOiAwOworCisJCS8qIFVucXVldWUgYW5kIGRyb3AgdGhlIGxvY2suICovCisJCXVucXVldWVfbWVfcGkoJnEpOworCX0KKworCS8qCisJICogSWYgZml4dXBfcGlfc3RhdGVfb3duZXIoKSBmYXVsdGVkIGFuZCB3YXMgdW5hYmxlIHRvIGhhbmRsZSB0aGUKKwkgKiBmYXVsdCwgdW5sb2NrIHRoZSBydF9tdXRleCBhbmQgcmV0dXJuIHRoZSBmYXVsdCB0byB1c2Vyc3BhY2UuCisJICovCisJaWYgKHJldCA9PSAtRUZBVUxUKSB7CisJCWlmIChydF9tdXRleF9vd25lcihwaV9tdXRleCkgPT0gY3VycmVudCkKKwkJCXJ0X211dGV4X3VubG9jayhwaV9tdXRleCk7CisJfSBlbHNlIGlmIChyZXQgPT0gLUVJTlRSKSB7CisJCS8qCisJCSAqIFdlJ3ZlIGFscmVhZHkgYmVlbiByZXF1ZXVlZCwgYnV0IHdlIGhhdmUgbm8gd2F5IHRvCisJCSAqIHJlc3RhcnQgYnkgY2FsbGluZyBmdXRleF9sb2NrX3BpKCkgZGlyZWN0bHkuIFdlCisJCSAqIGNvdWxkIHJlc3RhcnQgdGhlIHN5c2NhbGwsIGJ1dCB0aGF0IHdpbGwgbG9vayBhdAorCQkgKiB0aGUgdXNlciBzcGFjZSB2YWx1ZSBhbmQgcmV0dXJuIHJpZ2h0IGF3YXkuIFNvIHdlCisJCSAqIGRyb3AgYmFjayB3aXRoIEVXT1VMREJMT0NLIHRvIHRlbGwgdXNlciBzcGFjZSB0aGF0CisJCSAqICJ2YWwiIGhhcyBiZWVuIGNoYW5nZWQuIFRoYXQncyB0aGUgc2FtZSB3aGF0IHRoZQorCQkgKiByZXN0YXJ0IG9mIHRoZSBzeXNjYWxsIHdvdWxkIGRvIGluCisJCSAqIGZ1dGV4X3dhaXRfc2V0dXAoKS4KKwkJICovCisJCXJldCA9IC1FV09VTERCTE9DSzsKKwl9CisKK291dF9wdXRfa2V5czoKKwlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZxLmtleSk7CitvdXRfa2V5MjoKKwlwdXRfZnV0ZXhfa2V5KGZzaGFyZWQsICZrZXkyKTsKKworb3V0OgorCWlmICh0bykgeworCQlocnRpbWVyX2NhbmNlbCgmdG8tPnRpbWVyKTsKKwkJZGVzdHJveV9ocnRpbWVyX29uX3N0YWNrKCZ0by0+dGltZXIpOworCX0KKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogU3VwcG9ydCBmb3Igcm9idXN0IGZ1dGV4ZXM6IHRoZSBrZXJuZWwgY2xlYW5zIHVwIGhlbGQgZnV0ZXhlcyBhdAogICogdGhyZWFkIGV4aXQgdGltZS4KQEAgLTE4OTYsNyArMjQ3NSw3IEBACiAJCWZzaGFyZWQgPSAxOwogCiAJY2xvY2tydCA9IG9wICYgRlVURVhfQ0xPQ0tfUkVBTFRJTUU7Ci0JaWYgKGNsb2NrcnQgJiYgY21kICE9IEZVVEVYX1dBSVRfQklUU0VUKQorCWlmIChjbG9ja3J0ICYmIGNtZCAhPSBGVVRFWF9XQUlUX0JJVFNFVCAmJiBjbWQgIT0gRlVURVhfV0FJVF9SRVFVRVVFX1BJKQogCQlyZXR1cm4gLUVOT1NZUzsKIAogCXN3aXRjaCAoY21kKSB7CkBAIC0xOTExLDEwICsyNDkwLDExIEBACiAJCXJldCA9IGZ1dGV4X3dha2UodWFkZHIsIGZzaGFyZWQsIHZhbCwgdmFsMyk7CiAJCWJyZWFrOwogCWNhc2UgRlVURVhfUkVRVUVVRToKLQkJcmV0ID0gZnV0ZXhfcmVxdWV1ZSh1YWRkciwgZnNoYXJlZCwgdWFkZHIyLCB2YWwsIHZhbDIsIE5VTEwpOworCQlyZXQgPSBmdXRleF9yZXF1ZXVlKHVhZGRyLCBmc2hhcmVkLCB1YWRkcjIsIHZhbCwgdmFsMiwgTlVMTCwgMCk7CiAJCWJyZWFrOwogCWNhc2UgRlVURVhfQ01QX1JFUVVFVUU6Ci0JCXJldCA9IGZ1dGV4X3JlcXVldWUodWFkZHIsIGZzaGFyZWQsIHVhZGRyMiwgdmFsLCB2YWwyLCAmdmFsMyk7CisJCXJldCA9IGZ1dGV4X3JlcXVldWUodWFkZHIsIGZzaGFyZWQsIHVhZGRyMiwgdmFsLCB2YWwyLCAmdmFsMywKKwkJCQkgICAgMCk7CiAJCWJyZWFrOwogCWNhc2UgRlVURVhfV0FLRV9PUDoKIAkJcmV0ID0gZnV0ZXhfd2FrZV9vcCh1YWRkciwgZnNoYXJlZCwgdWFkZHIyLCB2YWwsIHZhbDIsIHZhbDMpOwpAQCAtMTkzMSw2ICsyNTExLDE1IEBACiAJCWlmIChmdXRleF9jbXB4Y2hnX2VuYWJsZWQpCiAJCQlyZXQgPSBmdXRleF9sb2NrX3BpKHVhZGRyLCBmc2hhcmVkLCAwLCB0aW1lb3V0LCAxKTsKIAkJYnJlYWs7CisJY2FzZSBGVVRFWF9XQUlUX1JFUVVFVUVfUEk6CisJCXZhbDMgPSBGVVRFWF9CSVRTRVRfTUFUQ0hfQU5ZOworCQlyZXQgPSBmdXRleF93YWl0X3JlcXVldWVfcGkodWFkZHIsIGZzaGFyZWQsIHZhbCwgdGltZW91dCwgdmFsMywKKwkJCQkJICAgIGNsb2NrcnQsIHVhZGRyMik7CisJCWJyZWFrOworCWNhc2UgRlVURVhfQ01QX1JFUVVFVUVfUEk6CisJCXJldCA9IGZ1dGV4X3JlcXVldWUodWFkZHIsIGZzaGFyZWQsIHVhZGRyMiwgdmFsLCB2YWwyLCAmdmFsMywKKwkJCQkgICAgMSk7CisJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCXJldCA9IC1FTk9TWVM7CiAJfQpAQCAtMTk0OCw3ICsyNTM3LDggQEAKIAlpbnQgY21kID0gb3AgJiBGVVRFWF9DTURfTUFTSzsKIAogCWlmICh1dGltZSAmJiAoY21kID09IEZVVEVYX1dBSVQgfHwgY21kID09IEZVVEVYX0xPQ0tfUEkgfHwKLQkJICAgICAgY21kID09IEZVVEVYX1dBSVRfQklUU0VUKSkgeworCQkgICAgICBjbWQgPT0gRlVURVhfV0FJVF9CSVRTRVQgfHwKKwkJICAgICAgY21kID09IEZVVEVYX1dBSVRfUkVRVUVVRV9QSSkpIHsKIAkJaWYgKGNvcHlfZnJvbV91c2VyKCZ0cywgdXRpbWUsIHNpemVvZih0cykpICE9IDApCiAJCQlyZXR1cm4gLUVGQVVMVDsKIAkJaWYgKCF0aW1lc3BlY192YWxpZCgmdHMpKQpAQCAtMTk2MCwxMSArMjU1MCwxMSBAQAogCQl0cCA9ICZ0OwogCX0KIAkvKgotCSAqIHJlcXVldWUgcGFyYW1ldGVyIGluICd1dGltZScgaWYgY21kID09IEZVVEVYX1JFUVVFVUUuCisJICogcmVxdWV1ZSBwYXJhbWV0ZXIgaW4gJ3V0aW1lJyBpZiBjbWQgPT0gRlVURVhfKl9SRVFVRVVFXyouCiAJICogbnVtYmVyIG9mIHdhaXRlcnMgdG8gd2FrZSBpbiAndXRpbWUnIGlmIGNtZCA9PSBGVVRFWF9XQUtFX09QLgogCSAqLwogCWlmIChjbWQgPT0gRlVURVhfUkVRVUVVRSB8fCBjbWQgPT0gRlVURVhfQ01QX1JFUVVFVUUgfHwKLQkgICAgY21kID09IEZVVEVYX1dBS0VfT1ApCisJICAgIGNtZCA9PSBGVVRFWF9DTVBfUkVRVUVVRV9QSSB8fCBjbWQgPT0gRlVURVhfV0FLRV9PUCkKIAkJdmFsMiA9ICh1MzIpICh1bnNpZ25lZCBsb25nKSB1dGltZTsKIAogCXJldHVybiBkb19mdXRleCh1YWRkciwgb3AsIHZhbCwgdHAsIHVhZGRyMiwgdmFsMiwgdmFsMyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL01ha2VmaWxlIGIva2VybmVsL2lycS9NYWtlZmlsZQppbmRleCAzMzk0ZjhmLi43ZDA0NzgwIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL01ha2VmaWxlCisrKyBiL2tlcm5lbC9pcnEvTWFrZWZpbGUKQEAgLTMsNSArMyw1IEBACiBvYmotJChDT05GSUdfR0VORVJJQ19JUlFfUFJPQkUpICs9IGF1dG9wcm9iZS5vCiBvYmotJChDT05GSUdfUFJPQ19GUykgKz0gcHJvYy5vCiBvYmotJChDT05GSUdfR0VORVJJQ19QRU5ESU5HX0lSUSkgKz0gbWlncmF0aW9uLm8KLW9iai0kKENPTkZJR19OVU1BX01JR1JBVEVfSVJRX0RFU0MpICs9IG51bWFfbWlncmF0ZS5vCitvYmotJChDT05GSUdfTlVNQV9JUlFfREVTQykgKz0gbnVtYV9taWdyYXRlLm8KIG9iai0kKENPTkZJR19QTV9TTEVFUCkgKz0gcG0ubwpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9jaGlwLmMgYi9rZXJuZWwvaXJxL2NoaXAuYwppbmRleCBjNjg3YmE0Li4xM2M2OGU3IDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL2NoaXAuYworKysgYi9rZXJuZWwvaXJxL2NoaXAuYwpAQCAtMzU5LDcgKzM1OSw2IEBACiAKIAlzcGluX2xvY2soJmRlc2MtPmxvY2spOwogCW1hc2tfYWNrX2lycShkZXNjLCBpcnEpOwotCWRlc2MgPSBpcnFfcmVtYXBfdG9fZGVzYyhpcnEsIGRlc2MpOwogCiAJaWYgKHVubGlrZWx5KGRlc2MtPnN0YXR1cyAmIElSUV9JTlBST0dSRVNTKSkKIAkJZ290byBvdXRfdW5sb2NrOwpAQCAtNDM4LDcgKzQzNyw2IEBACiAJZGVzYy0+c3RhdHVzICY9IH5JUlFfSU5QUk9HUkVTUzsKIG91dDoKIAlkZXNjLT5jaGlwLT5lb2koaXJxKTsKLQlkZXNjID0gaXJxX3JlbWFwX3RvX2Rlc2MoaXJxLCBkZXNjKTsKIAogCXNwaW5fdW5sb2NrKCZkZXNjLT5sb2NrKTsKIH0KQEAgLTQ3NSw3ICs0NzMsNiBAQAogCQkgICAgIWRlc2MtPmFjdGlvbikpIHsKIAkJZGVzYy0+c3RhdHVzIHw9IChJUlFfUEVORElORyB8IElSUV9NQVNLRUQpOwogCQltYXNrX2Fja19pcnEoZGVzYywgaXJxKTsKLQkJZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7CiAJCWdvdG8gb3V0X3VubG9jazsKIAl9CiAJa3N0YXRfaW5jcl9pcnFzX3RoaXNfY3B1KGlycSwgZGVzYyk7CkBAIC00ODMsNyArNDgwLDYgQEAKIAkvKiBTdGFydCBoYW5kbGluZyB0aGUgaXJxICovCiAJaWYgKGRlc2MtPmNoaXAtPmFjaykKIAkJZGVzYy0+Y2hpcC0+YWNrKGlycSk7Ci0JZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7CiAKIAkvKiBNYXJrIHRoZSBJUlEgY3VycmVudGx5IGluIHByb2dyZXNzLiovCiAJZGVzYy0+c3RhdHVzIHw9IElSUV9JTlBST0dSRVNTOwpAQCAtNTQ0LDEwICs1NDAsOCBAQAogCWlmICghbm9pcnFkZWJ1ZykKIAkJbm90ZV9pbnRlcnJ1cHQoaXJxLCBkZXNjLCBhY3Rpb25fcmV0KTsKIAotCWlmIChkZXNjLT5jaGlwLT5lb2kpIHsKKwlpZiAoZGVzYy0+Y2hpcC0+ZW9pKQogCQlkZXNjLT5jaGlwLT5lb2koaXJxKTsKLQkJZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7Ci0JfQogfQogCiB2b2lkCkBAIC01ODIsMTAgKzU3Niw4IEBACiAKIAkvKiBVbmluc3RhbGw/ICovCiAJaWYgKGhhbmRsZSA9PSBoYW5kbGVfYmFkX2lycSkgewotCQlpZiAoZGVzYy0+Y2hpcCAhPSAmbm9faXJxX2NoaXApIHsKKwkJaWYgKGRlc2MtPmNoaXAgIT0gJm5vX2lycV9jaGlwKQogCQkJbWFza19hY2tfaXJxKGRlc2MsIGlycSk7Ci0JCQlkZXNjID0gaXJxX3JlbWFwX3RvX2Rlc2MoaXJxLCBkZXNjKTsKLQkJfQogCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0RJU0FCTEVEOwogCQlkZXNjLT5kZXB0aCA9IDE7CiAJfQpkaWZmIC0tZ2l0IGEva2VybmVsL2lycS9oYW5kbGUuYyBiL2tlcm5lbC9pcnEvaGFuZGxlLmMKaW5kZXggMjZlMDg3NS4uYTYwMDE4NCAxMDA2NDQKLS0tIGEva2VybmVsL2lycS9oYW5kbGUuYworKysgYi9rZXJuZWwvaXJxL2hhbmRsZS5jCkBAIC0xMSwxNCArMTEsMTUgQEAKICAqLwogCiAjaW5jbHVkZSA8bGludXgvaXJxLmg+CisjaW5jbHVkZSA8bGludXgvc2xhYi5oPgogI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgogI2luY2x1ZGUgPGxpbnV4L3JhbmRvbS5oPgogI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgogI2luY2x1ZGUgPGxpbnV4L2tlcm5lbF9zdGF0Lmg+CiAjaW5jbHVkZSA8bGludXgvcmN1bGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KLSNpbmNsdWRlIDx0cmFjZS9pcnEuaD4KICNpbmNsdWRlIDxsaW51eC9ib290bWVtLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2lycS5oPgogCiAjaW5jbHVkZSAiaW50ZXJuYWxzLmgiCiAKQEAgLTgxLDQ1ICs4Miw0OCBAQAogCS5sb2NrICAgICAgID0gX19TUElOX0xPQ0tfVU5MT0NLRUQoaXJxX2Rlc2NfaW5pdC5sb2NrKSwKIH07CiAKLXZvaWQgaW5pdF9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSwgaW50IG5yKQordm9pZCBfX3JlZiBpbml0X2tzdGF0X2lycXMoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSwgaW50IG5yKQogewotCWludCBub2RlOwogCXZvaWQgKnB0cjsKIAotCW5vZGUgPSBjcHVfdG9fbm9kZShjcHUpOwotCXB0ciA9IGt6YWxsb2Nfbm9kZShuciAqIHNpemVvZigqZGVzYy0+a3N0YXRfaXJxcyksIEdGUF9BVE9NSUMsIG5vZGUpOworCWlmIChzbGFiX2lzX2F2YWlsYWJsZSgpKQorCQlwdHIgPSBremFsbG9jX25vZGUobnIgKiBzaXplb2YoKmRlc2MtPmtzdGF0X2lycXMpLAorCQkJCSAgIEdGUF9BVE9NSUMsIG5vZGUpOworCWVsc2UKKwkJcHRyID0gYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwKKwkJCQluciAqIHNpemVvZigqZGVzYy0+a3N0YXRfaXJxcykpOwogCiAJLyoKIAkgKiBkb24ndCBvdmVyd2l0ZSBpZiBjYW4gbm90IGdldCBuZXcgb25lCiAJICogaW5pdF9jb3B5X2tzdGF0X2lycXMoKSBjb3VsZCBzdGlsbCB1c2Ugb2xkIG9uZQogCSAqLwogCWlmIChwdHIpIHsKLQkJcHJpbnRrKEtFUk5fREVCVUcgIiAgYWxsb2Mga3N0YXRfaXJxcyBvbiBjcHUgJWQgbm9kZSAlZFxuIiwKLQkJCSBjcHUsIG5vZGUpOworCQlwcmludGsoS0VSTl9ERUJVRyAiICBhbGxvYyBrc3RhdF9pcnFzIG9uIG5vZGUgJWRcbiIsIG5vZGUpOwogCQlkZXNjLT5rc3RhdF9pcnFzID0gcHRyOwogCX0KIH0KIAotc3RhdGljIHZvaWQgaW5pdF9vbmVfaXJxX2Rlc2MoaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1KQorc3RhdGljIHZvaWQgaW5pdF9vbmVfaXJxX2Rlc2MoaW50IGlycSwgc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSkKIHsKIAltZW1jcHkoZGVzYywgJmlycV9kZXNjX2luaXQsIHNpemVvZihzdHJ1Y3QgaXJxX2Rlc2MpKTsKIAogCXNwaW5fbG9ja19pbml0KCZkZXNjLT5sb2NrKTsKIAlkZXNjLT5pcnEgPSBpcnE7CiAjaWZkZWYgQ09ORklHX1NNUAotCWRlc2MtPmNwdSA9IGNwdTsKKwlkZXNjLT5ub2RlID0gbm9kZTsKICNlbmRpZgogCWxvY2tkZXBfc2V0X2NsYXNzKCZkZXNjLT5sb2NrLCAmaXJxX2Rlc2NfbG9ja19jbGFzcyk7Ci0JaW5pdF9rc3RhdF9pcnFzKGRlc2MsIGNwdSwgbnJfY3B1X2lkcyk7CisJaW5pdF9rc3RhdF9pcnFzKGRlc2MsIG5vZGUsIG5yX2NwdV9pZHMpOwogCWlmICghZGVzYy0+a3N0YXRfaXJxcykgewogCQlwcmludGsoS0VSTl9FUlIgImNhbiBub3QgYWxsb2Mga3N0YXRfaXJxc1xuIik7CiAJCUJVR19PTigxKTsKIAl9Ci0JaWYgKCFpbml0X2FsbG9jX2Rlc2NfbWFza3MoZGVzYywgY3B1LCBmYWxzZSkpIHsKKwlpZiAoIWFsbG9jX2Rlc2NfbWFza3MoZGVzYywgbm9kZSwgZmFsc2UpKSB7CiAJCXByaW50ayhLRVJOX0VSUiAiY2FuIG5vdCBhbGxvYyBpcnFfZGVzYyBjcHVtYXNrc1xuIik7CiAJCUJVR19PTigxKTsKIAl9Ci0JYXJjaF9pbml0X2NoaXBfZGF0YShkZXNjLCBjcHUpOworCWluaXRfZGVzY19tYXNrcyhkZXNjKTsKKwlhcmNoX2luaXRfY2hpcF9kYXRhKGRlc2MsIG5vZGUpOwogfQogCiAvKgpAQCAtMTY5LDcgKzE3Myw4IEBACiAJCWRlc2NbaV0uaXJxID0gaTsKIAkJZGVzY1tpXS5rc3RhdF9pcnFzID0ga3N0YXRfaXJxc19sZWdhY3kgKyBpICogbnJfY3B1X2lkczsKIAkJbG9ja2RlcF9zZXRfY2xhc3MoJmRlc2NbaV0ubG9jaywgJmlycV9kZXNjX2xvY2tfY2xhc3MpOwotCQlpbml0X2FsbG9jX2Rlc2NfbWFza3MoJmRlc2NbaV0sIDAsIHRydWUpOworCQlhbGxvY19kZXNjX21hc2tzKCZkZXNjW2ldLCAwLCB0cnVlKTsKKwkJaW5pdF9kZXNjX21hc2tzKCZkZXNjW2ldKTsKIAkJaXJxX2Rlc2NfcHRyc1tpXSA9IGRlc2MgKyBpOwogCX0KIApAQCAtMTg3LDExICsxOTIsMTAgQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotc3RydWN0IGlycV9kZXNjICppcnFfdG9fZGVzY19hbGxvY19jcHUodW5zaWduZWQgaW50IGlycSwgaW50IGNwdSkKK3N0cnVjdCBpcnFfZGVzYyAqIF9fcmVmIGlycV90b19kZXNjX2FsbG9jX25vZGUodW5zaWduZWQgaW50IGlycSwgaW50IG5vZGUpCiB7CiAJc3RydWN0IGlycV9kZXNjICpkZXNjOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG5vZGU7CiAKIAlpZiAoaXJxID49IG5yX2lycXMpIHsKIAkJV0FSTigxLCAiaXJxICglZCkgPj0gbnJfaXJxcyAoJWQpIGluIGlycV90b19kZXNjX2FsbG9jXG4iLApAQCAtMjEwLDE1ICsyMTQsMTcgQEAKIAlpZiAoZGVzYykKIAkJZ290byBvdXRfdW5sb2NrOwogCi0Jbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7Ci0JZGVzYyA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmRlc2MpLCBHRlBfQVRPTUlDLCBub2RlKTsKLQlwcmludGsoS0VSTl9ERUJVRyAiICBhbGxvYyBpcnFfZGVzYyBmb3IgJWQgb24gY3B1ICVkIG5vZGUgJWRcbiIsCi0JCSBpcnEsIGNwdSwgbm9kZSk7CisJaWYgKHNsYWJfaXNfYXZhaWxhYmxlKCkpCisJCWRlc2MgPSBremFsbG9jX25vZGUoc2l6ZW9mKCpkZXNjKSwgR0ZQX0FUT01JQywgbm9kZSk7CisJZWxzZQorCQlkZXNjID0gYWxsb2NfYm9vdG1lbV9ub2RlKE5PREVfREFUQShub2RlKSwgc2l6ZW9mKCpkZXNjKSk7CisKKwlwcmludGsoS0VSTl9ERUJVRyAiICBhbGxvYyBpcnFfZGVzYyBmb3IgJWQgb24gbm9kZSAlZFxuIiwgaXJxLCBub2RlKTsKIAlpZiAoIWRlc2MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJjYW4gbm90IGFsbG9jIGlycV9kZXNjXG4iKTsKIAkJQlVHX09OKDEpOwogCX0KLQlpbml0X29uZV9pcnFfZGVzYyhpcnEsIGRlc2MsIGNwdSk7CisJaW5pdF9vbmVfaXJxX2Rlc2MoaXJxLCBkZXNjLCBub2RlKTsKIAogCWlycV9kZXNjX3B0cnNbaXJxXSA9IGRlc2M7CiAKQEAgLTI1Niw3ICsyNjIsOCBAQAogCiAJZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKIAkJZGVzY1tpXS5pcnEgPSBpOwotCQlpbml0X2FsbG9jX2Rlc2NfbWFza3MoJmRlc2NbaV0sIDAsIHRydWUpOworCQlhbGxvY19kZXNjX21hc2tzKCZkZXNjW2ldLCAwLCB0cnVlKTsKKwkJaW5pdF9kZXNjX21hc2tzKCZkZXNjW2ldKTsKIAkJZGVzY1tpXS5rc3RhdF9pcnFzID0ga3N0YXRfaXJxc19hbGxbaV07CiAJfQogCXJldHVybiBhcmNoX2Vhcmx5X2lycV9pbml0KCk7CkBAIC0yNjcsNyArMjc0LDcgQEAKIAlyZXR1cm4gKGlycSA8IE5SX0lSUVMpID8gaXJxX2Rlc2MgKyBpcnEgOiBOVUxMOwogfQogCi1zdHJ1Y3QgaXJxX2Rlc2MgKmlycV90b19kZXNjX2FsbG9jX2NwdSh1bnNpZ25lZCBpbnQgaXJxLCBpbnQgY3B1KQorc3RydWN0IGlycV9kZXNjICppcnFfdG9fZGVzY19hbGxvY19ub2RlKHVuc2lnbmVkIGludCBpcnEsIGludCBub2RlKQogewogCXJldHVybiBpcnFfdG9fZGVzYyhpcnEpOwogfQpAQCAtMzQ4LDkgKzM1NSw2IEBACiAJICAgICAgICJidXQgbm8gdGhyZWFkIGZ1bmN0aW9uIGF2YWlsYWJsZS4iLCBpcnEsIGFjdGlvbi0+bmFtZSk7CiB9CiAKLURFRklORV9UUkFDRShpcnFfaGFuZGxlcl9lbnRyeSk7Ci1ERUZJTkVfVFJBQ0UoaXJxX2hhbmRsZXJfZXhpdCk7Ci0KIC8qKgogICogaGFuZGxlX0lSUV9ldmVudCAtIGlycSBhY3Rpb24gY2hhaW4gaGFuZGxlcgogICogQGlycToJdGhlIGludGVycnVwdCBudW1iZXIKQEAgLTQ1MywxMSArNDU3LDggQEAKIAkJLyoKIAkJICogTm8gbG9ja2luZyByZXF1aXJlZCBmb3IgQ1BVLWxvY2FsIGludGVycnVwdHM6CiAJCSAqLwotCQlpZiAoZGVzYy0+Y2hpcC0+YWNrKSB7CisJCWlmIChkZXNjLT5jaGlwLT5hY2spCiAJCQlkZXNjLT5jaGlwLT5hY2soaXJxKTsKLQkJCS8qIGdldCBuZXcgb25lICovCi0JCQlkZXNjID0gaXJxX3JlbWFwX3RvX2Rlc2MoaXJxLCBkZXNjKTsKLQkJfQogCQlpZiAobGlrZWx5KCEoZGVzYy0+c3RhdHVzICYgSVJRX0RJU0FCTEVEKSkpIHsKIAkJCWFjdGlvbl9yZXQgPSBoYW5kbGVfSVJRX2V2ZW50KGlycSwgZGVzYy0+YWN0aW9uKTsKIAkJCWlmICghbm9pcnFkZWJ1ZykKQEAgLTQ2OCwxMCArNDY5LDggQEAKIAl9CiAKIAlzcGluX2xvY2soJmRlc2MtPmxvY2spOwotCWlmIChkZXNjLT5jaGlwLT5hY2spIHsKKwlpZiAoZGVzYy0+Y2hpcC0+YWNrKQogCQlkZXNjLT5jaGlwLT5hY2soaXJxKTsKLQkJZGVzYyA9IGlycV9yZW1hcF90b19kZXNjKGlycSwgZGVzYyk7Ci0JfQogCS8qCiAJICogUkVQTEFZIGlzIHdoZW4gTGludXggcmVzZW5kcyBhbiBJUlEgdGhhdCB3YXMgZHJvcHBlZCBlYXJsaWVyCiAJICogV0FJVElORyBpcyB1c2VkIGJ5IHByb2JlIHRvIG1hcmsgaXJxcyB0aGF0IGFyZSBiZWluZyB0ZXN0ZWQKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmggYi9rZXJuZWwvaXJxL2ludGVybmFscy5oCmluZGV4IDAxY2UyMGUuLjczNDY4MjUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvaW50ZXJuYWxzLmgKKysrIGIva2VybmVsL2lycS9pbnRlcm5hbHMuaApAQCAtMTYsNyArMTYsNyBAQAogZXh0ZXJuIHZvaWQgX19lbmFibGVfaXJxKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgdW5zaWduZWQgaW50IGlycSwgYm9vbCByZXN1bWUpOwogCiBleHRlcm4gc3RydWN0IGxvY2tfY2xhc3Nfa2V5IGlycV9kZXNjX2xvY2tfY2xhc3M7Ci1leHRlcm4gdm9pZCBpbml0X2tzdGF0X2lycXMoc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1LCBpbnQgbnIpOworZXh0ZXJuIHZvaWQgaW5pdF9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IG5vZGUsIGludCBucik7CiBleHRlcm4gdm9pZCBjbGVhcl9rc3RhdF9pcnFzKHN0cnVjdCBpcnFfZGVzYyAqZGVzYyk7CiBleHRlcm4gc3BpbmxvY2tfdCBzcGFyc2VfaXJxX2xvY2s7CiAKQEAgLTQyLDYgKzQyLDkgQEAKIAogZXh0ZXJuIGludCBpcnFfc2VsZWN0X2FmZmluaXR5X3Vzcih1bnNpZ25lZCBpbnQgaXJxKTsKIAorZXh0ZXJuIHZvaWQKK2lycV9zZXRfdGhyZWFkX2FmZmluaXR5KHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2spOworCiAvKgogICogRGVidWdnaW5nIHByaW50b3V0OgogICovCmRpZmYgLS1naXQgYS9rZXJuZWwvaXJxL21hbmFnZS5jIGIva2VybmVsL2lycS9tYW5hZ2UuYwppbmRleCAyNzM0ZWNhLi5hYWY1YzlkIDEwMDY0NAotLS0gYS9rZXJuZWwvaXJxL21hbmFnZS5jCisrKyBiL2tlcm5lbC9pcnEvbWFuYWdlLmMKQEAgLTgwLDcgKzgwLDcgQEAKIAlyZXR1cm4gMTsKIH0KIAotc3RhdGljIHZvaWQKK3ZvaWQKIGlycV9zZXRfdGhyZWFkX2FmZmluaXR5KHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgY29uc3Qgc3RydWN0IGNwdW1hc2sgKmNwdW1hc2spCiB7CiAJc3RydWN0IGlycWFjdGlvbiAqYWN0aW9uID0gZGVzYy0+YWN0aW9uOwpAQCAtMTA5LDE3ICsxMDksMjIgQEAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOwogCiAjaWZkZWYgQ09ORklHX0dFTkVSSUNfUEVORElOR19JUlEKLQlpZiAoZGVzYy0+c3RhdHVzICYgSVJRX01PVkVfUENOVFhUKQotCQlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKwlpZiAoZGVzYy0+c3RhdHVzICYgSVJRX01PVkVfUENOVFhUKSB7CisJCWlmICghZGVzYy0+Y2hpcC0+c2V0X2FmZmluaXR5KGlycSwgY3B1bWFzaykpIHsKKwkJCWNwdW1hc2tfY29weShkZXNjLT5hZmZpbml0eSwgY3B1bWFzayk7CisJCQlpcnFfc2V0X3RocmVhZF9hZmZpbml0eShkZXNjLCBjcHVtYXNrKTsKKwkJfQorCX0KIAllbHNlIHsKIAkJZGVzYy0+c3RhdHVzIHw9IElSUV9NT1ZFX1BFTkRJTkc7CiAJCWNwdW1hc2tfY29weShkZXNjLT5wZW5kaW5nX21hc2ssIGNwdW1hc2spOwogCX0KICNlbHNlCi0JY3B1bWFza19jb3B5KGRlc2MtPmFmZmluaXR5LCBjcHVtYXNrKTsKLQlkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBjcHVtYXNrKTsKKwlpZiAoIWRlc2MtPmNoaXAtPnNldF9hZmZpbml0eShpcnEsIGNwdW1hc2spKSB7CisJCWNwdW1hc2tfY29weShkZXNjLT5hZmZpbml0eSwgY3B1bWFzayk7CisJCWlycV9zZXRfdGhyZWFkX2FmZmluaXR5KGRlc2MsIGNwdW1hc2spOworCX0KICNlbmRpZgotCWlycV9zZXRfdGhyZWFkX2FmZmluaXR5KGRlc2MsIGNwdW1hc2spOwogCWRlc2MtPnN0YXR1cyB8PSBJUlFfQUZGSU5JVFlfU0VUOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsKIAlyZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbWlncmF0aW9uLmMgYi9rZXJuZWwvaXJxL21pZ3JhdGlvbi5jCmluZGV4IGUwNWFkOWIuLmNmZTc2N2MgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbWlncmF0aW9uLmMKKysrIGIva2VybmVsL2lycS9taWdyYXRpb24uYwpAQCAtMSw1ICsxLDggQEAKIAogI2luY2x1ZGUgPGxpbnV4L2lycS5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorCisjaW5jbHVkZSAiaW50ZXJuYWxzLmgiCiAKIHZvaWQgbW92ZV9tYXNrZWRfaXJxKGludCBpcnEpCiB7CkBAIC0zOSwxMSArNDIsMTIgQEAKIAkgKiBtYXNraW5nIHRoZSBpcnFzLgogCSAqLwogCWlmIChsaWtlbHkoY3B1bWFza19hbnlfYW5kKGRlc2MtPnBlbmRpbmdfbWFzaywgY3B1X29ubGluZV9tYXNrKQotCQkgICA8IG5yX2NwdV9pZHMpKSB7Ci0JCWNwdW1hc2tfYW5kKGRlc2MtPmFmZmluaXR5LAotCQkJICAgIGRlc2MtPnBlbmRpbmdfbWFzaywgY3B1X29ubGluZV9tYXNrKTsKLQkJZGVzYy0+Y2hpcC0+c2V0X2FmZmluaXR5KGlycSwgZGVzYy0+YWZmaW5pdHkpOwotCX0KKwkJICAgPCBucl9jcHVfaWRzKSkKKwkJaWYgKCFkZXNjLT5jaGlwLT5zZXRfYWZmaW5pdHkoaXJxLCBkZXNjLT5wZW5kaW5nX21hc2spKSB7CisJCQljcHVtYXNrX2NvcHkoZGVzYy0+YWZmaW5pdHksIGRlc2MtPnBlbmRpbmdfbWFzayk7CisJCQlpcnFfc2V0X3RocmVhZF9hZmZpbml0eShkZXNjLCBkZXNjLT5wZW5kaW5nX21hc2spOworCQl9CisKIAljcHVtYXNrX2NsZWFyKGRlc2MtPnBlbmRpbmdfbWFzayk7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9pcnEvbnVtYV9taWdyYXRlLmMgYi9rZXJuZWwvaXJxL251bWFfbWlncmF0ZS5jCmluZGV4IDQ0YmJkY2IuLjJmNjliZWUgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9pcnEvbnVtYV9taWdyYXRlLmMKKysrIGIva2VybmVsL2lycS9udW1hX21pZ3JhdGUuYwpAQCAtMTUsOSArMTUsOSBAQAogCiBzdGF0aWMgdm9pZCBpbml0X2NvcHlfa3N0YXRfaXJxcyhzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAogCQkJCSBzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsCi0JCQkJIGludCBjcHUsIGludCBucikKKwkJCQkgaW50IG5vZGUsIGludCBucikKIHsKLQlpbml0X2tzdGF0X2lycXMoZGVzYywgY3B1LCBucik7CisJaW5pdF9rc3RhdF9pcnFzKGRlc2MsIG5vZGUsIG5yKTsKIAogCWlmIChkZXNjLT5rc3RhdF9pcnFzICE9IG9sZF9kZXNjLT5rc3RhdF9pcnFzKQogCQltZW1jcHkoZGVzYy0+a3N0YXRfaXJxcywgb2xkX2Rlc2MtPmtzdGF0X2lycXMsCkBAIC0zNCwyMCArMzQsMjAgQEAKIH0KIAogc3RhdGljIGJvb2wgaW5pdF9jb3B5X29uZV9pcnFfZGVzYyhpbnQgaXJxLCBzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAotCQkgc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgY3B1KQorCQkgc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSkKIHsKIAltZW1jcHkoZGVzYywgb2xkX2Rlc2MsIHNpemVvZihzdHJ1Y3QgaXJxX2Rlc2MpKTsKLQlpZiAoIWluaXRfYWxsb2NfZGVzY19tYXNrcyhkZXNjLCBjcHUsIGZhbHNlKSkgeworCWlmICghYWxsb2NfZGVzY19tYXNrcyhkZXNjLCBub2RlLCBmYWxzZSkpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcnEgJWQ6IGNhbiBub3QgZ2V0IG5ldyBpcnFfZGVzYyBjcHVtYXNrICIKIAkJCQkiZm9yIG1pZ3JhdGlvbi5cbiIsIGlycSk7CiAJCXJldHVybiBmYWxzZTsKIAl9CiAJc3Bpbl9sb2NrX2luaXQoJmRlc2MtPmxvY2spOwotCWRlc2MtPmNwdSA9IGNwdTsKKwlkZXNjLT5ub2RlID0gbm9kZTsKIAlsb2NrZGVwX3NldF9jbGFzcygmZGVzYy0+bG9jaywgJmlycV9kZXNjX2xvY2tfY2xhc3MpOwotCWluaXRfY29weV9rc3RhdF9pcnFzKG9sZF9kZXNjLCBkZXNjLCBjcHUsIG5yX2NwdV9pZHMpOworCWluaXRfY29weV9rc3RhdF9pcnFzKG9sZF9kZXNjLCBkZXNjLCBub2RlLCBucl9jcHVfaWRzKTsKIAlpbml0X2NvcHlfZGVzY19tYXNrcyhvbGRfZGVzYywgZGVzYyk7Ci0JYXJjaF9pbml0X2NvcHlfY2hpcF9kYXRhKG9sZF9kZXNjLCBkZXNjLCBjcHUpOworCWFyY2hfaW5pdF9jb3B5X2NoaXBfZGF0YShvbGRfZGVzYywgZGVzYywgbm9kZSk7CiAJcmV0dXJuIHRydWU7CiB9CiAKQEAgLTU5LDEyICs1OSwxMSBAQAogfQogCiBzdGF0aWMgc3RydWN0IGlycV9kZXNjICpfX3JlYWxfbW92ZV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKm9sZF9kZXNjLAotCQkJCQkJaW50IGNwdSkKKwkJCQkJCWludCBub2RlKQogewogCXN0cnVjdCBpcnFfZGVzYyAqZGVzYzsKIAl1bnNpZ25lZCBpbnQgaXJxOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7Ci0JaW50IG5vZGU7CiAKIAlpcnEgPSBvbGRfZGVzYy0+aXJxOwogCkBAIC03Niw3ICs3NSw2IEBACiAJaWYgKGRlc2MgJiYgb2xkX2Rlc2MgIT0gZGVzYykKIAkJZ290byBvdXRfdW5sb2NrOwogCi0Jbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7CiAJZGVzYyA9IGt6YWxsb2Nfbm9kZShzaXplb2YoKmRlc2MpLCBHRlBfQVRPTUlDLCBub2RlKTsKIAlpZiAoIWRlc2MpIHsKIAkJcHJpbnRrKEtFUk5fRVJSICJpcnEgJWQ6IGNhbiBub3QgZ2V0IG5ldyBpcnFfZGVzYyAiCkBAIC04NSw3ICs4Myw3IEBACiAJCWRlc2MgPSBvbGRfZGVzYzsKIAkJZ290byBvdXRfdW5sb2NrOwogCX0KLQlpZiAoIWluaXRfY29weV9vbmVfaXJxX2Rlc2MoaXJxLCBvbGRfZGVzYywgZGVzYywgY3B1KSkgeworCWlmICghaW5pdF9jb3B5X29uZV9pcnFfZGVzYyhpcnEsIG9sZF9kZXNjLCBkZXNjLCBub2RlKSkgewogCQkvKiBzdGlsbCB1c2Ugb2xkIG9uZSAqLwogCQlrZnJlZShkZXNjKTsKIAkJZGVzYyA9IG9sZF9kZXNjOwpAQCAtOTcsOSArOTUsNyBAQAogCiAJLyogZnJlZSB0aGUgb2xkIG9uZSAqLwogCWZyZWVfb25lX2lycV9kZXNjKG9sZF9kZXNjLCBkZXNjKTsKLQlzcGluX3VubG9jaygmb2xkX2Rlc2MtPmxvY2spOwogCWtmcmVlKG9sZF9kZXNjKTsKLQlzcGluX2xvY2soJmRlc2MtPmxvY2spOwogCiAJcmV0dXJuIGRlc2M7CiAKQEAgLTEwOSwyNCArMTA1LDE0IEBACiAJcmV0dXJuIGRlc2M7CiB9CiAKLXN0cnVjdCBpcnFfZGVzYyAqbW92ZV9pcnFfZGVzYyhzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBjcHUpCitzdHJ1Y3QgaXJxX2Rlc2MgKm1vdmVfaXJxX2Rlc2Moc3RydWN0IGlycV9kZXNjICpkZXNjLCBpbnQgbm9kZSkKIHsKLQlpbnQgb2xkX2NwdTsKLQlpbnQgbm9kZSwgb2xkX25vZGU7Ci0KIAkvKiB0aG9zZSBhbGwgc3RhdGljLCBkbyBtb3ZlIHRoZW0gKi8KIAlpZiAoZGVzYy0+aXJxIDwgTlJfSVJRU19MRUdBQ1kpCiAJCXJldHVybiBkZXNjOwogCi0Jb2xkX2NwdSA9IGRlc2MtPmNwdTsKLQlpZiAob2xkX2NwdSAhPSBjcHUpIHsKLQkJbm9kZSA9IGNwdV90b19ub2RlKGNwdSk7Ci0JCW9sZF9ub2RlID0gY3B1X3RvX25vZGUob2xkX2NwdSk7Ci0JCWlmIChvbGRfbm9kZSAhPSBub2RlKQotCQkJZGVzYyA9IF9fcmVhbF9tb3ZlX2lycV9kZXNjKGRlc2MsIGNwdSk7Ci0JCWVsc2UKLQkJCWRlc2MtPmNwdSA9IGNwdTsKLQl9CisJaWYgKGRlc2MtPm5vZGUgIT0gbm9kZSkKKwkJZGVzYyA9IF9fcmVhbF9tb3ZlX2lycV9kZXNjKGRlc2MsIG5vZGUpOwogCiAJcmV0dXJuIGRlc2M7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwva3RocmVhZC5jIGIva2VybmVsL2t0aHJlYWQuYwppbmRleCA0ZWJhZjg1Li40MWM4OGZlIDEwMDY0NAotLS0gYS9rZXJuZWwva3RocmVhZC5jCisrKyBiL2tlcm5lbC9rdGhyZWFkLmMKQEAgLTEzLDcgKzEzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9maWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KLSNpbmNsdWRlIDx0cmFjZS9zY2hlZC5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zY2hlZC5oPgogCiAjZGVmaW5lIEtUSFJFQURfTklDRV9MRVZFTCAoLTUpCiAKQEAgLTIxLDkgKzIxLDYgQEAKIHN0YXRpYyBMSVNUX0hFQUQoa3RocmVhZF9jcmVhdGVfbGlzdCk7CiBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmt0aHJlYWRkX3Rhc2s7CiAKLURFRklORV9UUkFDRShzY2hlZF9rdGhyZWFkX3N0b3ApOwotREVGSU5FX1RSQUNFKHNjaGVkX2t0aHJlYWRfc3RvcF9yZXQpOwotCiBzdHJ1Y3Qga3RocmVhZF9jcmVhdGVfaW5mbwogewogCS8qIEluZm9ybWF0aW9uIHBhc3NlZCB0byBrdGhyZWFkKCkgZnJvbSBrdGhyZWFkZC4gKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC9sb2NrZGVwLmMgYi9rZXJuZWwvbG9ja2RlcC5jCmluZGV4IGFjY2I0MGMuLjhiYmVlZjkgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9sb2NrZGVwLmMKKysrIGIva2VybmVsL2xvY2tkZXAuYwpAQCAtNDIsMTIgKzQyLDE0IEBACiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3N0cmluZ2lmeS5oPgotI2luY2x1ZGUgPHRyYWNlL2xvY2tkZXAuaD4KIAogI2luY2x1ZGUgPGFzbS9zZWN0aW9ucy5oPgogCiAjaW5jbHVkZSAibG9ja2RlcF9pbnRlcm5hbHMuaCIKIAorI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2xvY2tkZXAuaD4KKwogI2lmZGVmIENPTkZJR19QUk9WRV9MT0NLSU5HCiBpbnQgcHJvdmVfbG9ja2luZyA9IDE7CiBtb2R1bGVfcGFyYW0ocHJvdmVfbG9ja2luZywgaW50LCAwNjQ0KTsKQEAgLTI5MzUsOCArMjkzNyw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsb2NrX3NldF9jbGFzcyk7CiAKLURFRklORV9UUkFDRShsb2NrX2FjcXVpcmUpOwotCiAvKgogICogV2UgYXJlIG5vdCBhbHdheXMgY2FsbGVkIHdpdGggaXJxcyBkaXNhYmxlZCAtIGRvIHRoYXQgaGVyZSwKICAqIGFuZCBhbHNvIGF2b2lkIGxvY2tkZXAgcmVjdXJzaW9uOgpAQCAtMjk2Myw4ICsyOTYzLDYgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKGxvY2tfYWNxdWlyZSk7CiAKLURFRklORV9UUkFDRShsb2NrX3JlbGVhc2UpOwotCiB2b2lkIGxvY2tfcmVsZWFzZShzdHJ1Y3QgbG9ja2RlcF9tYXAgKmxvY2ssIGludCBuZXN0ZWQsCiAJCQkgIHVuc2lnbmVkIGxvbmcgaXApCiB7CkBAIC0zMTA1LDYgKzMxMDMsOCBAQAogCQlobG9jay0+aG9sZHRpbWVfc3RhbXAgPSBub3c7CiAJfQogCisJdHJhY2VfbG9ja19hY3F1aXJlZChsb2NrLCBpcCwgd2FpdHRpbWUpOworCiAJc3RhdHMgPSBnZXRfbG9ja19zdGF0cyhobG9ja19jbGFzcyhobG9jaykpOwogCWlmICh3YWl0dGltZSkgewogCQlpZiAoaGxvY2stPnJlYWQpCkBAIC0zMTIwLDggKzMxMjAsNiBAQAogCWxvY2stPmlwID0gaXA7CiB9CiAKLURFRklORV9UUkFDRShsb2NrX2NvbnRlbmRlZCk7Ci0KIHZvaWQgbG9ja19jb250ZW5kZWQoc3RydWN0IGxvY2tkZXBfbWFwICpsb2NrLCB1bnNpZ25lZCBsb25nIGlwKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CkBAIC0zMTQzLDE0ICszMTQxLDEwIEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChsb2NrX2NvbnRlbmRlZCk7CiAKLURFRklORV9UUkFDRShsb2NrX2FjcXVpcmVkKTsKLQogdm9pZCBsb2NrX2FjcXVpcmVkKHN0cnVjdCBsb2NrZGVwX21hcCAqbG9jaywgdW5zaWduZWQgbG9uZyBpcCkKIHsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCi0JdHJhY2VfbG9ja19hY3F1aXJlZChsb2NrLCBpcCk7Ci0KIAlpZiAodW5saWtlbHkoIWxvY2tfc3RhdCkpCiAJCXJldHVybjsKIApkaWZmIC0tZ2l0IGEva2VybmVsL21vZHVsZS5jIGIva2VybmVsL21vZHVsZS5jCmluZGV4IGU3OTc4MTIuLjIzODNlNjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9tb2R1bGUuYworKysgYi9rZXJuZWwvbW9kdWxlLmMKQEAgLTE4LDYgKzE4LDcgQEAKICovCiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlbG9hZGVyLmg+CisjaW5jbHVkZSA8bGludXgvZnRyYWNlX2V2ZW50Lmg+CiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvZnMuaD4KQEAgLTE0ODksOSArMTQ5MCw2IEBACiAJLyogRnJlZSBhbnkgYWxsb2NhdGVkIHBhcmFtZXRlcnMuICovCiAJZGVzdHJveV9wYXJhbXMobW9kLT5rcCwgbW9kLT5udW1fa3ApOwogCi0JLyogcmVsZWFzZSBhbnkgcG9pbnRlcnMgdG8gbWNvdW50IGluIHRoaXMgbW9kdWxlICovCi0JZnRyYWNlX3JlbGVhc2UobW9kLT5tb2R1bGVfY29yZSwgbW9kLT5jb3JlX3NpemUpOwotCiAJLyogVGhpcyBtYXkgYmUgTlVMTCwgYnV0IHRoYXQncyBPSyAqLwogCW1vZHVsZV9mcmVlKG1vZCwgbW9kLT5tb2R1bGVfaW5pdCk7CiAJa2ZyZWUobW9kLT5hcmdzKTsKQEAgLTE4OTIsMTEgKzE4OTAsOSBAQAogCXVuc2lnbmVkIGludCBzeW1pbmRleCA9IDA7CiAJdW5zaWduZWQgaW50IHN0cmluZGV4ID0gMDsKIAl1bnNpZ25lZCBpbnQgbW9kaW5kZXgsIHZlcnNpbmRleCwgaW5mb2luZGV4LCBwY3B1aW5kZXg7Ci0JdW5zaWduZWQgaW50IG51bV9tY291bnQ7CiAJc3RydWN0IG1vZHVsZSAqbW9kOwogCWxvbmcgZXJyID0gMDsKIAl2b2lkICpwZXJjcHUgPSBOVUxMLCAqcHRyID0gTlVMTDsgLyogU3RvcHMgc3B1cmlvdXMgZ2NjIHdhcm5pbmcgKi8KLQl1bnNpZ25lZCBsb25nICptc2VnOwogCW1tX3NlZ21lbnRfdCBvbGRfZnM7CiAKIAlERUJVR1AoImxvYWRfbW9kdWxlOiB1bW9kPSVwLCBsZW49JWx1LCB1YXJncz0lcFxuIiwKQEAgLTIxNzIsNyArMjE2OCwxOSBAQAogCQkJCQlzaXplb2YoKm1vZC0+dHJhY2Vwb2ludHMpLAogCQkJCQkmbW9kLT5udW1fdHJhY2Vwb2ludHMpOwogI2VuZGlmCi0KKyNpZmRlZiBDT05GSUdfRVZFTlRfVFJBQ0lORworCW1vZC0+dHJhY2VfZXZlbnRzID0gc2VjdGlvbl9vYmpzKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywKKwkJCQkJICJfZnRyYWNlX2V2ZW50cyIsCisJCQkJCSBzaXplb2YoKm1vZC0+dHJhY2VfZXZlbnRzKSwKKwkJCQkJICZtb2QtPm51bV90cmFjZV9ldmVudHMpOworI2VuZGlmCisjaWZkZWYgQ09ORklHX0ZUUkFDRV9NQ09VTlRfUkVDT1JECisJLyogc2VjaGRyc1swXS5zaF9zaXplIGlzIGFsd2F5cyB6ZXJvICovCisJbW9kLT5mdHJhY2VfY2FsbHNpdGVzID0gc2VjdGlvbl9vYmpzKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywKKwkJCQkJICAgICAiX19tY291bnRfbG9jIiwKKwkJCQkJICAgICBzaXplb2YoKm1vZC0+ZnRyYWNlX2NhbGxzaXRlcyksCisJCQkJCSAgICAgJm1vZC0+bnVtX2Z0cmFjZV9jYWxsc2l0ZXMpOworI2VuZGlmCiAjaWZkZWYgQ09ORklHX01PRFZFUlNJT05TCiAJaWYgKChtb2QtPm51bV9zeW1zICYmICFtb2QtPmNyY3MpCiAJICAgIHx8IChtb2QtPm51bV9ncGxfc3ltcyAmJiAhbW9kLT5ncGxfY3JjcykKQEAgLTIyMzcsMTEgKzIyNDUsNiBAQAogCQkJZHluYW1pY19kZWJ1Z19zZXR1cChkZWJ1ZywgbnVtX2RlYnVnKTsKIAl9CiAKLQkvKiBzZWNoZHJzWzBdLnNoX3NpemUgaXMgYWx3YXlzIHplcm8gKi8KLQltc2VnID0gc2VjdGlvbl9vYmpzKGhkciwgc2VjaGRycywgc2Vjc3RyaW5ncywgIl9fbWNvdW50X2xvYyIsCi0JCQkgICAgc2l6ZW9mKCptc2VnKSwgJm51bV9tY291bnQpOwotCWZ0cmFjZV9pbml0X21vZHVsZShtb2QsIG1zZWcsIG1zZWcgKyBudW1fbWNvdW50KTsKLQogCWVyciA9IG1vZHVsZV9maW5hbGl6ZShoZHIsIHNlY2hkcnMsIG1vZCk7CiAJaWYgKGVyciA8IDApCiAJCWdvdG8gY2xlYW51cDsKQEAgLTIzMDIsNyArMjMwNSw2IEBACiAgY2xlYW51cDoKIAlrb2JqZWN0X2RlbCgmbW9kLT5ta29iai5rb2JqKTsKIAlrb2JqZWN0X3B1dCgmbW9kLT5ta29iai5rb2JqKTsKLQlmdHJhY2VfcmVsZWFzZShtb2QtPm1vZHVsZV9jb3JlLCBtb2QtPmNvcmVfc2l6ZSk7CiAgZnJlZV91bmxvYWQ6CiAJbW9kdWxlX3VubG9hZF9mcmVlKG1vZCk7CiAjaWYgZGVmaW5lZChDT05GSUdfTU9EVUxFX1VOTE9BRCkgJiYgZGVmaW5lZChDT05GSUdfU01QKQpkaWZmIC0tZ2l0IGEva2VybmVsL211dGV4LmMgYi9rZXJuZWwvbXV0ZXguYwppbmRleCA1MDdjZjJiLi45NDdiM2FkIDEwMDY0NAotLS0gYS9rZXJuZWwvbXV0ZXguYworKysgYi9rZXJuZWwvbXV0ZXguYwpAQCAtODksNyArODksNyBAQAogICoKICAqIFRoaXMgZnVuY3Rpb24gaXMgc2ltaWxhciB0byAoYnV0IG5vdCBlcXVpdmFsZW50IHRvKSBkb3duKCkuCiAgKi8KLXZvaWQgaW5saW5lIF9fc2NoZWQgbXV0ZXhfbG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spCit2b2lkIF9fc2NoZWQgbXV0ZXhfbG9jayhzdHJ1Y3QgbXV0ZXggKmxvY2spCiB7CiAJbWlnaHRfc2xlZXAoKTsKIAkvKgpAQCAtMjQ5LDcgKzI0OSw5IEBACiAKIAkJLyogZGlkbnQgZ2V0IHRoZSBsb2NrLCBnbyB0byBzbGVlcDogKi8KIAkJc3Bpbl91bmxvY2tfbXV0ZXgoJmxvY2stPndhaXRfbG9jaywgZmxhZ3MpOwotCQlfX3NjaGVkdWxlKCk7CisJCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKKwkJc2NoZWR1bGUoKTsKKwkJcHJlZW1wdF9kaXNhYmxlKCk7CiAJCXNwaW5fbG9ja19tdXRleCgmbG9jay0+d2FpdF9sb2NrLCBmbGFncyk7CiAJfQogCkBAIC00NzEsNSArNDczLDI4IEBACiAKIAlyZXR1cm4gcmV0OwogfQotCiBFWFBPUlRfU1lNQk9MKG11dGV4X3RyeWxvY2spOworCisvKioKKyAqIGF0b21pY19kZWNfYW5kX211dGV4X2xvY2sgLSByZXR1cm4gaG9sZGluZyBtdXRleCBpZiB3ZSBkZWMgdG8gMAorICogQGNudDogdGhlIGF0b21pYyB3aGljaCB3ZSBhcmUgdG8gZGVjCisgKiBAbG9jazogdGhlIG11dGV4IHRvIHJldHVybiBob2xkaW5nIGlmIHdlIGRlYyB0byAwCisgKgorICogcmV0dXJuIHRydWUgYW5kIGhvbGQgbG9jayBpZiB3ZSBkZWMgdG8gMCwgcmV0dXJuIGZhbHNlIG90aGVyd2lzZQorICovCitpbnQgYXRvbWljX2RlY19hbmRfbXV0ZXhfbG9jayhhdG9taWNfdCAqY250LCBzdHJ1Y3QgbXV0ZXggKmxvY2spCit7CisJLyogZGVjIGlmIHdlIGNhbid0IHBvc3NpYmx5IGhpdCAwICovCisJaWYgKGF0b21pY19hZGRfdW5sZXNzKGNudCwgLTEsIDEpKQorCQlyZXR1cm4gMDsKKwkvKiB3ZSBtaWdodCBoaXQgMCwgc28gdGFrZSB0aGUgbG9jayAqLworCW11dGV4X2xvY2sobG9jayk7CisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KGNudCkpIHsKKwkJLyogd2hlbiB3ZSBhY3R1YWxseSBkaWQgdGhlIGRlYywgd2UgZGlkbid0IGhpdCAwICovCisJCW11dGV4X3VubG9jayhsb2NrKTsKKwkJcmV0dXJuIDA7CisJfQorCS8qIHdlIGhpdCAwLCBhbmQgd2UgaG9sZCB0aGUgbG9jayAqLworCXJldHVybiAxOworfQorRVhQT1JUX1NZTUJPTChhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC9wZXJmX2NvdW50ZXIuYyBiL2tlcm5lbC9wZXJmX2NvdW50ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjVkOGE1Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3BlcmZfY291bnRlci5jCkBAIC0wLDAgKzEsNDI2MCBAQAorLyoKKyAqIFBlcmZvcm1hbmNlIGNvdW50ZXIgY29yZSBjb2RlCisgKgorICogIENvcHlyaWdodCAoQykgMjAwOCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqICBDb3B5cmlnaHQgKEMpIDIwMDgtMjAwOSBSZWQgSGF0LCBJbmMuLCBJbmdvIE1vbG5hcgorICogIENvcHlyaWdodCAoQykgMjAwOC0yMDA5IFJlZCBIYXQsIEluYy4sIFBldGVyIFppamxzdHJhIDxwemlqbHN0ckByZWRoYXQuY29tPgorICogIENvcHlyaWdodCAgqSAgMjAwOSBQYXVsIE1hY2tlcnJhcywgSUJNIENvcnAuIDxwYXVsdXNAYXUxLmlibS5jb20+CisgKgorICogIEZvciBsaWNlbnNpbmcgZGV0YWlscyBzZWUga2VybmVsLWJhc2UvQ09QWUlORworICovCisKKyNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L21tLmg+CisjaW5jbHVkZSA8bGludXgvY3B1Lmg+CisjaW5jbHVkZSA8bGludXgvc21wLmg+CisjaW5jbHVkZSA8bGludXgvZmlsZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BvbGwuaD4KKyNpbmNsdWRlIDxsaW51eC9zeXNmcy5oPgorI2luY2x1ZGUgPGxpbnV4L2RjYWNoZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgorI2luY2x1ZGUgPGxpbnV4L3B0cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L3Ztc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L2hhcmRpcnEuaD4KKyNpbmNsdWRlIDxsaW51eC9yY3VsaXN0Lmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorI2luY2x1ZGUgPGxpbnV4L3N5c2NhbGxzLmg+CisjaW5jbHVkZSA8bGludXgvYW5vbl9pbm9kZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgorCisjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CisKKy8qCisgKiBFYWNoIENQVSBoYXMgYSBsaXN0IG9mIHBlciBDUFUgY291bnRlcnM6CisgKi8KK0RFRklORV9QRVJfQ1BVKHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0LCBwZXJmX2NwdV9jb250ZXh0KTsKKworaW50IHBlcmZfbWF4X2NvdW50ZXJzIF9fcmVhZF9tb3N0bHkgPSAxOworc3RhdGljIGludCBwZXJmX3Jlc2VydmVkX3BlcmNwdSBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGludCBwZXJmX292ZXJjb21taXQgX19yZWFkX21vc3RseSA9IDE7CisKK3N0YXRpYyBhdG9taWNfdCBucl9jb3VudGVycyBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGF0b21pY190IG5yX21tYXBfY291bnRlcnMgX19yZWFkX21vc3RseTsKK3N0YXRpYyBhdG9taWNfdCBucl9jb21tX2NvdW50ZXJzIF9fcmVhZF9tb3N0bHk7CisKKy8qCisgKiBwZXJmIGNvdW50ZXIgcGFyYW5vaWEgbGV2ZWw6CisgKiAgMCAtIG5vdCBwYXJhbm9pZAorICogIDEgLSBkaXNhbGxvdyBjcHUgY291bnRlcnMgdG8gdW5wcml2CisgKiAgMiAtIGRpc2FsbG93IGtlcm5lbCBwcm9maWxpbmcgdG8gdW5wcml2CisgKi8KK2ludCBzeXNjdGxfcGVyZl9jb3VudGVyX3BhcmFub2lkIF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBwZXJmX3BhcmFub2lkX2NwdSh2b2lkKQoreworCXJldHVybiBzeXNjdGxfcGVyZl9jb3VudGVyX3BhcmFub2lkID4gMDsKK30KKworc3RhdGljIGlubGluZSBib29sIHBlcmZfcGFyYW5vaWRfa2VybmVsKHZvaWQpCit7CisJcmV0dXJuIHN5c2N0bF9wZXJmX2NvdW50ZXJfcGFyYW5vaWQgPiAxOworfQorCitpbnQgc3lzY3RsX3BlcmZfY291bnRlcl9tbG9jayBfX3JlYWRfbW9zdGx5ID0gNTEyOyAvKiAnZnJlZScga2IgcGVyIHVzZXIgKi8KKworLyoKKyAqIG1heCBwZXJmIGNvdW50ZXIgc2FtcGxlIHJhdGUKKyAqLworaW50IHN5c2N0bF9wZXJmX2NvdW50ZXJfc2FtcGxlX3JhdGUgX19yZWFkX21vc3RseSA9IDEwMDAwMDsKKworc3RhdGljIGF0b21pYzY0X3QgcGVyZl9jb3VudGVyX2lkOworCisvKgorICogTG9jayBmb3IgKHN5c2FkbWluLWNvbmZpZ3VyYWJsZSkgY291bnRlciByZXNlcnZhdGlvbnM6CisgKi8KK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0socGVyZl9yZXNvdXJjZV9sb2NrKTsKKworLyoKKyAqIEFyY2hpdGVjdHVyZSBwcm92aWRlZCBBUElzIC0gd2VhayBhbGlhc2VzOgorICovCitleHRlcm4gX193ZWFrIGNvbnN0IHN0cnVjdCBwbXUgKmh3X3BlcmZfY291bnRlcl9pbml0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgX193ZWFrIGh3X3BlcmZfZGlzYWJsZSh2b2lkKQkJeyBiYXJyaWVyKCk7IH0KK3ZvaWQgX193ZWFrIGh3X3BlcmZfZW5hYmxlKHZvaWQpCQl7IGJhcnJpZXIoKTsgfQorCit2b2lkIF9fd2VhayBod19wZXJmX2NvdW50ZXJfc2V0dXAoaW50IGNwdSkJeyBiYXJyaWVyKCk7IH0KKworaW50IF9fd2VhaworaHdfcGVyZl9ncm91cF9zY2hlZF9pbihzdHJ1Y3QgcGVyZl9jb3VudGVyICpncm91cF9sZWFkZXIsCisJICAgICAgIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJICAgICAgIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LCBpbnQgY3B1KQoreworCXJldHVybiAwOworfQorCit2b2lkIF9fd2VhayBwZXJmX2NvdW50ZXJfcHJpbnRfZGVidWcodm9pZCkJeyB9CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIGRpc2FibGVfY291bnQpOworCit2b2lkIF9fcGVyZl9kaXNhYmxlKHZvaWQpCit7CisJX19nZXRfY3B1X3ZhcihkaXNhYmxlX2NvdW50KSsrOworfQorCitib29sIF9fcGVyZl9lbmFibGUodm9pZCkKK3sKKwlyZXR1cm4gIS0tX19nZXRfY3B1X3ZhcihkaXNhYmxlX2NvdW50KTsKK30KKwordm9pZCBwZXJmX2Rpc2FibGUodm9pZCkKK3sKKwlfX3BlcmZfZGlzYWJsZSgpOworCWh3X3BlcmZfZGlzYWJsZSgpOworfQorCit2b2lkIHBlcmZfZW5hYmxlKHZvaWQpCit7CisJaWYgKF9fcGVyZl9lbmFibGUoKSkKKwkJaHdfcGVyZl9lbmFibGUoKTsKK30KKworc3RhdGljIHZvaWQgZ2V0X2N0eChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwlhdG9taWNfaW5jKCZjdHgtPnJlZmNvdW50KTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jdHgoc3RydWN0IHJjdV9oZWFkICpoZWFkKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4OworCisJY3R4ID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCwgcmN1X2hlYWQpOworCWtmcmVlKGN0eCk7Cit9CisKK3N0YXRpYyB2b2lkIHB1dF9jdHgoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJaWYgKGF0b21pY19kZWNfYW5kX3Rlc3QoJmN0eC0+cmVmY291bnQpKSB7CisJCWlmIChjdHgtPnBhcmVudF9jdHgpCisJCQlwdXRfY3R4KGN0eC0+cGFyZW50X2N0eCk7CisJCWlmIChjdHgtPnRhc2spCisJCQlwdXRfdGFza19zdHJ1Y3QoY3R4LT50YXNrKTsKKwkJY2FsbF9yY3UoJmN0eC0+cmN1X2hlYWQsIGZyZWVfY3R4KTsKKwl9Cit9CisKKy8qCisgKiBHZXQgdGhlIHBlcmZfY291bnRlcl9jb250ZXh0IGZvciBhIHRhc2sgYW5kIGxvY2sgaXQuCisgKiBUaGlzIGhhcyB0byBjb3BlIHdpdGggd2l0aCB0aGUgZmFjdCB0aGF0IHVudGlsIGl0IGlzIGxvY2tlZCwKKyAqIHRoZSBjb250ZXh0IGNvdWxkIGdldCBtb3ZlZCB0byBhbm90aGVyIHRhc2suCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKgorcGVyZl9sb2NrX3Rhc2tfY29udGV4dChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2ssIHVuc2lnbmVkIGxvbmcgKmZsYWdzKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4OworCisJcmN1X3JlYWRfbG9jaygpOworIHJldHJ5OgorCWN0eCA9IHJjdV9kZXJlZmVyZW5jZSh0YXNrLT5wZXJmX2NvdW50ZXJfY3R4cCk7CisJaWYgKGN0eCkgeworCQkvKgorCQkgKiBJZiB0aGlzIGNvbnRleHQgaXMgYSBjbG9uZSBvZiBhbm90aGVyLCBpdCBtaWdodAorCQkgKiBnZXQgc3dhcHBlZCBmb3IgYW5vdGhlciB1bmRlcm5lYXRoIHVzIGJ5CisJCSAqIHBlcmZfY291bnRlcl90YXNrX3NjaGVkX291dCwgdGhvdWdoIHRoZQorCQkgKiByY3VfcmVhZF9sb2NrKCkgcHJvdGVjdHMgdXMgZnJvbSBhbnkgY29udGV4dAorCQkgKiBnZXR0aW5nIGZyZWVkLiAgTG9jayB0aGUgY29udGV4dCBhbmQgY2hlY2sgaWYgaXQKKwkJICogZ290IHN3YXBwZWQgYmVmb3JlIHdlIGNvdWxkIGdldCB0aGUgbG9jaywgYW5kIHJldHJ5CisJCSAqIGlmIHNvLiAgSWYgd2UgbG9ja2VkIHRoZSByaWdodCBjb250ZXh0LCB0aGVuIGl0CisJCSAqIGNhbid0IGdldCBzd2FwcGVkIG9uIHVzIGFueSBtb3JlLgorCQkgKi8KKwkJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+bG9jaywgKmZsYWdzKTsKKwkJaWYgKGN0eCAhPSByY3VfZGVyZWZlcmVuY2UodGFzay0+cGVyZl9jb3VudGVyX2N0eHApKSB7CisJCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPmxvY2ssICpmbGFncyk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCXJldHVybiBjdHg7Cit9CisKKy8qCisgKiBHZXQgdGhlIGNvbnRleHQgZm9yIGEgdGFzayBhbmQgaW5jcmVtZW50IGl0cyBwaW5fY291bnQgc28gaXQKKyAqIGNhbid0IGdldCBzd2FwcGVkIHRvIGFub3RoZXIgdGFzay4gIFRoaXMgYWxzbyBpbmNyZW1lbnRzIGl0cworICogcmVmZXJlbmNlIGNvdW50IHNvIHRoYXQgdGhlIGNvbnRleHQgY2FuJ3QgZ2V0IGZyZWVkLgorICovCitzdGF0aWMgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpwZXJmX3Bpbl90YXNrX2NvbnRleHQoc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwljdHggPSBwZXJmX2xvY2tfdGFza19jb250ZXh0KHRhc2ssICZmbGFncyk7CisJaWYgKGN0eCkgeworCQkrK2N0eC0+cGluX2NvdW50OworCQlnZXRfY3R4KGN0eCk7CisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCX0KKwlyZXR1cm4gY3R4OworfQorCitzdGF0aWMgdm9pZCBwZXJmX3VucGluX2NvbnRleHQoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCXNwaW5fbG9ja19pcnFzYXZlKCZjdHgtPmxvY2ssIGZsYWdzKTsKKwktLWN0eC0+cGluX2NvdW50OworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCXB1dF9jdHgoY3R4KTsKK30KKworLyoKKyAqIEFkZCBhIGNvdW50ZXIgZnJvbSB0aGUgbGlzdHMgZm9yIGl0cyBjb250ZXh0LgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBjdHgtPm11dGV4IGFuZCBjdHgtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQKK2xpc3RfYWRkX2NvdW50ZXIoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqZ3JvdXBfbGVhZGVyID0gY291bnRlci0+Z3JvdXBfbGVhZGVyOworCisJLyoKKwkgKiBEZXBlbmRpbmcgb24gd2hldGhlciBpdCBpcyBhIHN0YW5kYWxvbmUgb3Igc2libGluZyBjb3VudGVyLAorCSAqIGFkZCBpdCBzdHJhaWdodCB0byB0aGUgY29udGV4dCdzIGNvdW50ZXIgbGlzdCwgb3IgdG8gdGhlIGdyb3VwCisJICogbGVhZGVyJ3Mgc2libGluZyBsaXN0OgorCSAqLworCWlmIChncm91cF9sZWFkZXIgPT0gY291bnRlcikKKwkJbGlzdF9hZGRfdGFpbCgmY291bnRlci0+bGlzdF9lbnRyeSwgJmN0eC0+Y291bnRlcl9saXN0KTsKKwllbHNlIHsKKwkJbGlzdF9hZGRfdGFpbCgmY291bnRlci0+bGlzdF9lbnRyeSwgJmdyb3VwX2xlYWRlci0+c2libGluZ19saXN0KTsKKwkJZ3JvdXBfbGVhZGVyLT5ucl9zaWJsaW5ncysrOworCX0KKworCWxpc3RfYWRkX3JjdSgmY291bnRlci0+ZXZlbnRfZW50cnksICZjdHgtPmV2ZW50X2xpc3QpOworCWN0eC0+bnJfY291bnRlcnMrKzsKK30KKworLyoKKyAqIFJlbW92ZSBhIGNvdW50ZXIgZnJvbSB0aGUgbGlzdHMgZm9yIGl0cyBjb250ZXh0LgorICogTXVzdCBiZSBjYWxsZWQgd2l0aCBjdHgtPm11dGV4IGFuZCBjdHgtPmxvY2sgaGVsZC4KKyAqLworc3RhdGljIHZvaWQKK2xpc3RfZGVsX2NvdW50ZXIoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqc2libGluZywgKnRtcDsKKworCWlmIChsaXN0X2VtcHR5KCZjb3VudGVyLT5saXN0X2VudHJ5KSkKKwkJcmV0dXJuOworCWN0eC0+bnJfY291bnRlcnMtLTsKKworCWxpc3RfZGVsX2luaXQoJmNvdW50ZXItPmxpc3RfZW50cnkpOworCWxpc3RfZGVsX3JjdSgmY291bnRlci0+ZXZlbnRfZW50cnkpOworCisJaWYgKGNvdW50ZXItPmdyb3VwX2xlYWRlciAhPSBjb3VudGVyKQorCQljb3VudGVyLT5ncm91cF9sZWFkZXItPm5yX3NpYmxpbmdzLS07CisKKwkvKgorCSAqIElmIHRoaXMgd2FzIGEgZ3JvdXAgY291bnRlciB3aXRoIHNpYmxpbmcgY291bnRlcnMgdGhlbgorCSAqIHVwZ3JhZGUgdGhlIHNpYmxpbmdzIHRvIHNpbmdsZXRvbiBjb3VudGVycyBieSBhZGRpbmcgdGhlbQorCSAqIHRvIHRoZSBjb250ZXh0IGxpc3QgZGlyZWN0bHk6CisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHNpYmxpbmcsIHRtcCwKKwkJCQkgJmNvdW50ZXItPnNpYmxpbmdfbGlzdCwgbGlzdF9lbnRyeSkgeworCisJCWxpc3RfbW92ZV90YWlsKCZzaWJsaW5nLT5saXN0X2VudHJ5LCAmY3R4LT5jb3VudGVyX2xpc3QpOworCQlzaWJsaW5nLT5ncm91cF9sZWFkZXIgPSBzaWJsaW5nOworCX0KK30KKworc3RhdGljIHZvaWQKK2NvdW50ZXJfc2NoZWRfb3V0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsCisJCSAgc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkJICBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwlpZiAoY291bnRlci0+c3RhdGUgIT0gUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRSkKKwkJcmV0dXJuOworCisJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkU7CisJY291bnRlci0+dHN0YW1wX3N0b3BwZWQgPSBjdHgtPnRpbWU7CisJY291bnRlci0+cG11LT5kaXNhYmxlKGNvdW50ZXIpOworCWNvdW50ZXItPm9uY3B1ID0gLTE7CisKKwlpZiAoIWlzX3NvZnR3YXJlX2NvdW50ZXIoY291bnRlcikpCisJCWNwdWN0eC0+YWN0aXZlX29uY3B1LS07CisJY3R4LT5ucl9hY3RpdmUtLTsKKwlpZiAoY291bnRlci0+YXR0ci5leGNsdXNpdmUgfHwgIWNwdWN0eC0+YWN0aXZlX29uY3B1KQorCQljcHVjdHgtPmV4Y2x1c2l2ZSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkCitncm91cF9zY2hlZF9vdXQoc3RydWN0IHBlcmZfY291bnRlciAqZ3JvdXBfY291bnRlciwKKwkJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwKKwkJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCWlmIChncm91cF9jb3VudGVyLT5zdGF0ZSAhPSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFKQorCQlyZXR1cm47CisKKwljb3VudGVyX3NjaGVkX291dChncm91cF9jb3VudGVyLCBjcHVjdHgsIGN0eCk7CisKKwkvKgorCSAqIFNjaGVkdWxlIG91dCBzaWJsaW5ncyAoaWYgYW55KToKKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZncm91cF9jb3VudGVyLT5zaWJsaW5nX2xpc3QsIGxpc3RfZW50cnkpCisJCWNvdW50ZXJfc2NoZWRfb3V0KGNvdW50ZXIsIGNwdWN0eCwgY3R4KTsKKworCWlmIChncm91cF9jb3VudGVyLT5hdHRyLmV4Y2x1c2l2ZSkKKwkJY3B1Y3R4LT5leGNsdXNpdmUgPSAwOworfQorCisvKgorICogQ3Jvc3MgQ1BVIGNhbGwgdG8gcmVtb3ZlIGEgcGVyZm9ybWFuY2UgY291bnRlcgorICoKKyAqIFdlIGRpc2FibGUgdGhlIGNvdW50ZXIgb24gdGhlIGhhcmR3YXJlIGxldmVsIGZpcnN0LiBBZnRlciB0aGF0IHdlCisgKiByZW1vdmUgaXQgZnJvbSB0aGUgY29udGV4dCBsaXN0LgorICovCitzdGF0aWMgdm9pZCBfX3BlcmZfY291bnRlcl9yZW1vdmVfZnJvbV9jb250ZXh0KHZvaWQgKmluZm8pCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9ICZfX2dldF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBpbmZvOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gY291bnRlci0+Y3R4OworCisJLyoKKwkgKiBJZiB0aGlzIGlzIGEgdGFzayBjb250ZXh0LCB3ZSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgaXQgaXMKKwkgKiB0aGUgY3VycmVudCB0YXNrIGNvbnRleHQgb2YgdGhpcyBjcHUuIElmIG5vdCBpdCBoYXMgYmVlbgorCSAqIHNjaGVkdWxlZCBvdXQgYmVmb3JlIHRoZSBzbXAgY2FsbCBhcnJpdmVkLgorCSAqLworCWlmIChjdHgtPnRhc2sgJiYgY3B1Y3R4LT50YXNrX2N0eCAhPSBjdHgpCisJCXJldHVybjsKKworCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwkvKgorCSAqIFByb3RlY3QgdGhlIGxpc3Qgb3BlcmF0aW9uIGFnYWluc3QgTk1JIGJ5IGRpc2FibGluZyB0aGUKKwkgKiBjb3VudGVycyBvbiBhIGdsb2JhbCBsZXZlbC4KKwkgKi8KKwlwZXJmX2Rpc2FibGUoKTsKKworCWNvdW50ZXJfc2NoZWRfb3V0KGNvdW50ZXIsIGNwdWN0eCwgY3R4KTsKKworCWxpc3RfZGVsX2NvdW50ZXIoY291bnRlciwgY3R4KTsKKworCWlmICghY3R4LT50YXNrKSB7CisJCS8qCisJCSAqIEFsbG93IG1vcmUgcGVyIHRhc2sgY291bnRlcnMgd2l0aCByZXNwZWN0IHRvIHRoZQorCQkgKiByZXNlcnZhdGlvbjoKKwkJICovCisJCWNwdWN0eC0+bWF4X3BlcnRhc2sgPQorCQkJbWluKHBlcmZfbWF4X2NvdW50ZXJzIC0gY3R4LT5ucl9jb3VudGVycywKKwkJCSAgICBwZXJmX21heF9jb3VudGVycyAtIHBlcmZfcmVzZXJ2ZWRfcGVyY3B1KTsKKwl9CisKKwlwZXJmX2VuYWJsZSgpOworCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOworfQorCisKKy8qCisgKiBSZW1vdmUgdGhlIGNvdW50ZXIgZnJvbSBhIHRhc2sncyAob3IgYSBDUFUncykgbGlzdCBvZiBjb3VudGVycy4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGN0eC0+bXV0ZXggaGVsZC4KKyAqCisgKiBDUFUgY291bnRlcnMgYXJlIHJlbW92ZWQgd2l0aCBhIHNtcCBjYWxsLiBGb3IgdGFzayBjb3VudGVycyB3ZSBvbmx5CisgKiBjYWxsIHdoZW4gdGhlIHRhc2sgaXMgb24gYSBDUFUuCisgKgorICogSWYgY291bnRlci0+Y3R4IGlzIGEgY2xvbmVkIGNvbnRleHQsIGNhbGxlcnMgbXVzdCBtYWtlIHN1cmUgdGhhdAorICogZXZlcnkgdGFzayBzdHJ1Y3QgdGhhdCBjb3VudGVyLT5jdHgtPnRhc2sgY291bGQgcG9zc2libHkgcG9pbnQgdG8KKyAqIHJlbWFpbnMgdmFsaWQuICBUaGlzIGlzIE9LIHdoZW4gY2FsbGVkIGZyb20gcGVyZl9yZWxlYXNlIHNpbmNlCisgKiB0aGF0IG9ubHkgY2FsbHMgdXMgb24gdGhlIHRvcC1sZXZlbCBjb250ZXh0LCB3aGljaCBjYW4ndCBiZSBhIGNsb25lLgorICogV2hlbiBjYWxsZWQgZnJvbSBwZXJmX2NvdW50ZXJfZXhpdF90YXNrLCBpdCdzIE9LIGJlY2F1c2UgdGhlCisgKiBjb250ZXh0IGhhcyBiZWVuIGRldGFjaGVkIGZyb20gaXRzIHRhc2suCisgKi8KK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9yZW1vdmVfZnJvbV9jb250ZXh0KHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3R4LT50YXNrOworCisJaWYgKCF0YXNrKSB7CisJCS8qCisJCSAqIFBlciBjcHUgY291bnRlcnMgYXJlIHJlbW92ZWQgdmlhIGFuIHNtcCBjYWxsIGFuZAorCQkgKiB0aGUgcmVtb3ZhbCBpcyBhbHdheXMgc3VjZXNzZnVsLgorCQkgKi8KKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNvdW50ZXItPmNwdSwKKwkJCQkJIF9fcGVyZl9jb3VudGVyX3JlbW92ZV9mcm9tX2NvbnRleHQsCisJCQkJCSBjb3VudGVyLCAxKTsKKwkJcmV0dXJuOworCX0KKworcmV0cnk6CisJdGFza19vbmNwdV9mdW5jdGlvbl9jYWxsKHRhc2ssIF9fcGVyZl9jb3VudGVyX3JlbW92ZV9mcm9tX2NvbnRleHQsCisJCQkJIGNvdW50ZXIpOworCisJc3Bpbl9sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkvKgorCSAqIElmIHRoZSBjb250ZXh0IGlzIGFjdGl2ZSB3ZSBuZWVkIHRvIHJldHJ5IHRoZSBzbXAgY2FsbC4KKwkgKi8KKwlpZiAoY3R4LT5ucl9hY3RpdmUgJiYgIWxpc3RfZW1wdHkoJmNvdW50ZXItPmxpc3RfZW50cnkpKSB7CisJCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkJZ290byByZXRyeTsKKwl9CisKKwkvKgorCSAqIFRoZSBsb2NrIHByZXZlbnRzIHRoYXQgdGhpcyBjb250ZXh0IGlzIHNjaGVkdWxlZCBpbiBzbyB3ZQorCSAqIGNhbiByZW1vdmUgdGhlIGNvdW50ZXIgc2FmZWx5LCBpZiB0aGUgY2FsbCBhYm92ZSBkaWQgbm90CisJICogc3VjY2VlZC4KKwkgKi8KKwlpZiAoIWxpc3RfZW1wdHkoJmNvdW50ZXItPmxpc3RfZW50cnkpKSB7CisJCWxpc3RfZGVsX2NvdW50ZXIoY291bnRlciwgY3R4KTsKKwl9CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworfQorCitzdGF0aWMgaW5saW5lIHU2NCBwZXJmX2Nsb2NrKHZvaWQpCit7CisJcmV0dXJuIGNwdV9jbG9jayhzbXBfcHJvY2Vzc29yX2lkKCkpOworfQorCisvKgorICogVXBkYXRlIHRoZSByZWNvcmQgb2YgdGhlIGN1cnJlbnQgdGltZSBpbiBhIGNvbnRleHQuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9jb250ZXh0X3RpbWUoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgpCit7CisJdTY0IG5vdyA9IHBlcmZfY2xvY2soKTsKKworCWN0eC0+dGltZSArPSBub3cgLSBjdHgtPnRpbWVzdGFtcDsKKwljdHgtPnRpbWVzdGFtcCA9IG5vdzsKK30KKworLyoKKyAqIFVwZGF0ZSB0aGUgdG90YWxfdGltZV9lbmFibGVkIGFuZCB0b3RhbF90aW1lX3J1bm5pbmcgZmllbGRzIGZvciBhIGNvdW50ZXIuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9jb3VudGVyX3RpbWVzKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisJdTY0IHJ1bl9lbmQ7CisKKwlpZiAoY291bnRlci0+c3RhdGUgPCBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkUpCisJCXJldHVybjsKKworCWNvdW50ZXItPnRvdGFsX3RpbWVfZW5hYmxlZCA9IGN0eC0+dGltZSAtIGNvdW50ZXItPnRzdGFtcF9lbmFibGVkOworCisJaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkKKwkJcnVuX2VuZCA9IGNvdW50ZXItPnRzdGFtcF9zdG9wcGVkOworCWVsc2UKKwkJcnVuX2VuZCA9IGN0eC0+dGltZTsKKworCWNvdW50ZXItPnRvdGFsX3RpbWVfcnVubmluZyA9IHJ1bl9lbmQgLSBjb3VudGVyLT50c3RhbXBfcnVubmluZzsKK30KKworLyoKKyAqIFVwZGF0ZSB0b3RhbF90aW1lX2VuYWJsZWQgYW5kIHRvdGFsX3RpbWVfcnVubmluZyBmb3IgYWxsIGNvdW50ZXJzIGluIGEgZ3JvdXAuCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV9ncm91cF90aW1lcyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpsZWFkZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCXVwZGF0ZV9jb3VudGVyX3RpbWVzKGxlYWRlcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmbGVhZGVyLT5zaWJsaW5nX2xpc3QsIGxpc3RfZW50cnkpCisJCXVwZGF0ZV9jb3VudGVyX3RpbWVzKGNvdW50ZXIpOworfQorCisvKgorICogQ3Jvc3MgQ1BVIGNhbGwgdG8gZGlzYWJsZSBhIHBlcmZvcm1hbmNlIGNvdW50ZXIKKyAqLworc3RhdGljIHZvaWQgX19wZXJmX2NvdW50ZXJfZGlzYWJsZSh2b2lkICppbmZvKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBpbmZvOworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSAmX19nZXRfY3B1X3ZhcihwZXJmX2NwdV9jb250ZXh0KTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKworCS8qCisJICogSWYgdGhpcyBpcyBhIHBlci10YXNrIGNvdW50ZXIsIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGlzCisJICogY291bnRlcidzIHRhc2sgaXMgdGhlIGN1cnJlbnQgdGFzayBvbiB0aGlzIGNwdS4KKwkgKi8KKwlpZiAoY3R4LT50YXNrICYmIGNwdWN0eC0+dGFza19jdHggIT0gY3R4KQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmN0eC0+bG9jayk7CisKKwkvKgorCSAqIElmIHRoZSBjb3VudGVyIGlzIG9uLCB0dXJuIGl0IG9mZi4KKwkgKiBJZiBpdCBpcyBpbiBlcnJvciBzdGF0ZSwgbGVhdmUgaXQgaW4gZXJyb3Igc3RhdGUuCisJICovCisJaWYgKGNvdW50ZXItPnN0YXRlID49IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkgeworCQl1cGRhdGVfY29udGV4dF90aW1lKGN0eCk7CisJCXVwZGF0ZV9jb3VudGVyX3RpbWVzKGNvdW50ZXIpOworCQlpZiAoY291bnRlciA9PSBjb3VudGVyLT5ncm91cF9sZWFkZXIpCisJCQlncm91cF9zY2hlZF9vdXQoY291bnRlciwgY3B1Y3R4LCBjdHgpOworCQllbHNlCisJCQljb3VudGVyX3NjaGVkX291dChjb3VudGVyLCBjcHVjdHgsIGN0eCk7CisJCWNvdW50ZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRjsKKwl9CisKKwlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKK30KKworLyoKKyAqIERpc2FibGUgYSBjb3VudGVyLgorICoKKyAqIElmIGNvdW50ZXItPmN0eCBpcyBhIGNsb25lZCBjb250ZXh0LCBjYWxsZXJzIG11c3QgbWFrZSBzdXJlIHRoYXQKKyAqIGV2ZXJ5IHRhc2sgc3RydWN0IHRoYXQgY291bnRlci0+Y3R4LT50YXNrIGNvdWxkIHBvc3NpYmx5IHBvaW50IHRvCisgKiByZW1haW5zIHZhbGlkLiAgVGhpcyBjb25kaXRpb24gaXMgc2F0aXNpZmVkIHdoZW4gY2FsbGVkIHRocm91Z2gKKyAqIHBlcmZfY291bnRlcl9mb3JfZWFjaF9jaGlsZCBvciBwZXJmX2NvdW50ZXJfZm9yX2VhY2ggYmVjYXVzZSB0aGV5CisgKiBob2xkIHRoZSB0b3AtbGV2ZWwgY291bnRlcidzIGNoaWxkX211dGV4LCBzbyBhbnkgZGVzY2VuZGFudCB0aGF0CisgKiBnb2VzIHRvIGV4aXQgd2lsbCBibG9jayBpbiBzeW5jX2NoaWxkX2NvdW50ZXIuCisgKiBXaGVuIGNhbGxlZCBmcm9tIHBlcmZfcGVuZGluZ19jb3VudGVyIGl0J3MgT0sgYmVjYXVzZSBjb3VudGVyLT5jdHgKKyAqIGlzIHRoZSBjdXJyZW50IGNvbnRleHQgb24gdGhpcyBDUFUgYW5kIHByZWVtcHRpb24gaXMgZGlzYWJsZWQsCisgKiBoZW5jZSB3ZSBjYW4ndCBnZXQgaW50byBwZXJmX2NvdW50ZXJfdGFza19zY2hlZF9vdXQgZm9yIHRoaXMgY29udGV4dC4KKyAqLworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2Rpc2FibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBjdHgtPnRhc2s7CisKKwlpZiAoIXRhc2spIHsKKwkJLyoKKwkJICogRGlzYWJsZSB0aGUgY291bnRlciBvbiB0aGUgY3B1IHRoYXQgaXQncyBvbgorCQkgKi8KKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNvdW50ZXItPmNwdSwgX19wZXJmX2NvdW50ZXJfZGlzYWJsZSwKKwkJCQkJIGNvdW50ZXIsIDEpOworCQlyZXR1cm47CisJfQorCisgcmV0cnk6CisJdGFza19vbmNwdV9mdW5jdGlvbl9jYWxsKHRhc2ssIF9fcGVyZl9jb3VudGVyX2Rpc2FibGUsIGNvdW50ZXIpOworCisJc3Bpbl9sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwkvKgorCSAqIElmIHRoZSBjb3VudGVyIGlzIHN0aWxsIGFjdGl2ZSwgd2UgbmVlZCB0byByZXRyeSB0aGUgY3Jvc3MtY2FsbC4KKwkgKi8KKwlpZiAoY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRSkgeworCQlzcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7CisJCWdvdG8gcmV0cnk7CisJfQorCisJLyoKKwkgKiBTaW5jZSB3ZSBoYXZlIHRoZSBsb2NrIHRoaXMgY29udGV4dCBjYW4ndCBiZSBzY2hlZHVsZWQKKwkgKiBpbiwgc28gd2UgY2FuIGNoYW5nZSB0aGUgc3RhdGUgc2FmZWx5LgorCSAqLworCWlmIChjb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkUpIHsKKwkJdXBkYXRlX2NvdW50ZXJfdGltZXMoY291bnRlcik7CisJCWNvdW50ZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRjsKKwl9CisKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7Cit9CisKK3N0YXRpYyBpbnQKK2NvdW50ZXJfc2NoZWRfaW4oc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJCSBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCwKKwkJIGludCBjcHUpCit7CisJaWYgKGNvdW50ZXItPnN0YXRlIDw9IFBFUkZfQ09VTlRFUl9TVEFURV9PRkYpCisJCXJldHVybiAwOworCisJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFOworCWNvdW50ZXItPm9uY3B1ID0gY3B1OwkvKiBUT0RPOiBwdXQgJ2NwdScgaW50byBjcHVjdHgtPmNwdSAqLworCS8qCisJICogVGhlIG5ldyBzdGF0ZSBtdXN0IGJlIHZpc2libGUgYmVmb3JlIHdlIHR1cm4gaXQgb24gaW4gdGhlIGhhcmR3YXJlOgorCSAqLworCXNtcF93bWIoKTsKKworCWlmIChjb3VudGVyLT5wbXUtPmVuYWJsZShjb3VudGVyKSkgeworCQljb3VudGVyLT5zdGF0ZSA9IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRTsKKwkJY291bnRlci0+b25jcHUgPSAtMTsKKwkJcmV0dXJuIC1FQUdBSU47CisJfQorCisJY291bnRlci0+dHN0YW1wX3J1bm5pbmcgKz0gY3R4LT50aW1lIC0gY291bnRlci0+dHN0YW1wX3N0b3BwZWQ7CisKKwlpZiAoIWlzX3NvZnR3YXJlX2NvdW50ZXIoY291bnRlcikpCisJCWNwdWN0eC0+YWN0aXZlX29uY3B1Kys7CisJY3R4LT5ucl9hY3RpdmUrKzsKKworCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1c2l2ZSkKKwkJY3B1Y3R4LT5leGNsdXNpdmUgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK2dyb3VwX3NjaGVkX2luKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmdyb3VwX2NvdW50ZXIsCisJICAgICAgIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJICAgICAgIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LAorCSAgICAgICBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsICpwYXJ0aWFsX2dyb3VwOworCWludCByZXQ7CisKKwlpZiAoZ3JvdXBfY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBod19wZXJmX2dyb3VwX3NjaGVkX2luKGdyb3VwX2NvdW50ZXIsIGNwdWN0eCwgY3R4LCBjcHUpOworCWlmIChyZXQpCisJCXJldHVybiByZXQgPCAwID8gcmV0IDogMDsKKworCWlmIChjb3VudGVyX3NjaGVkX2luKGdyb3VwX2NvdW50ZXIsIGNwdWN0eCwgY3R4LCBjcHUpKQorCQlyZXR1cm4gLUVBR0FJTjsKKworCS8qCisJICogU2NoZWR1bGUgaW4gc2libGluZ3MgYXMgb25lIGdyb3VwIChpZiBhbnkpOgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmdyb3VwX2NvdW50ZXItPnNpYmxpbmdfbGlzdCwgbGlzdF9lbnRyeSkgeworCQlpZiAoY291bnRlcl9zY2hlZF9pbihjb3VudGVyLCBjcHVjdHgsIGN0eCwgY3B1KSkgeworCQkJcGFydGlhbF9ncm91cCA9IGNvdW50ZXI7CisJCQlnb3RvIGdyb3VwX2Vycm9yOworCQl9CisJfQorCisJcmV0dXJuIDA7CisKK2dyb3VwX2Vycm9yOgorCS8qCisJICogR3JvdXBzIGNhbiBiZSBzY2hlZHVsZWQgaW4gYXMgb25lIHVuaXQgb25seSwgc28gdW5kbyBhbnkKKwkgKiBwYXJ0aWFsIGdyb3VwIGJlZm9yZSByZXR1cm5pbmc6CisJICovCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjb3VudGVyLCAmZ3JvdXBfY291bnRlci0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KSB7CisJCWlmIChjb3VudGVyID09IHBhcnRpYWxfZ3JvdXApCisJCQlicmVhazsKKwkJY291bnRlcl9zY2hlZF9vdXQoY291bnRlciwgY3B1Y3R4LCBjdHgpOworCX0KKwljb3VudGVyX3NjaGVkX291dChncm91cF9jb3VudGVyLCBjcHVjdHgsIGN0eCk7CisKKwlyZXR1cm4gLUVBR0FJTjsKK30KKworLyoKKyAqIFJldHVybiAxIGZvciBhIGdyb3VwIGNvbnNpc3RpbmcgZW50aXJlbHkgb2Ygc29mdHdhcmUgY291bnRlcnMsCisgKiAwIGlmIHRoZSBncm91cCBjb250YWlucyBhbnkgaGFyZHdhcmUgY291bnRlcnMuCisgKi8KK3N0YXRpYyBpbnQgaXNfc29mdHdhcmVfb25seV9ncm91cChzdHJ1Y3QgcGVyZl9jb3VudGVyICpsZWFkZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCWlmICghaXNfc29mdHdhcmVfY291bnRlcihsZWFkZXIpKQorCQlyZXR1cm4gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmxlYWRlci0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KQorCQlpZiAoIWlzX3NvZnR3YXJlX2NvdW50ZXIoY291bnRlcikpCisJCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKgorICogV29yayBvdXQgd2hldGhlciB3ZSBjYW4gcHV0IHRoaXMgY291bnRlciBncm91cCBvbiB0aGUgQ1BVIG5vdy4KKyAqLworc3RhdGljIGludCBncm91cF9jYW5fZ29fb24oc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCSAgIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgsCisJCQkgICBpbnQgY2FuX2FkZF9odykKK3sKKwkvKgorCSAqIEdyb3VwcyBjb25zaXN0aW5nIGVudGlyZWx5IG9mIHNvZnR3YXJlIGNvdW50ZXJzIGNhbiBhbHdheXMgZ28gb24uCisJICovCisJaWYgKGlzX3NvZnR3YXJlX29ubHlfZ3JvdXAoY291bnRlcikpCisJCXJldHVybiAxOworCS8qCisJICogSWYgYW4gZXhjbHVzaXZlIGdyb3VwIGlzIGFscmVhZHkgb24sIG5vIG90aGVyIGhhcmR3YXJlCisJICogY291bnRlcnMgY2FuIGdvIG9uLgorCSAqLworCWlmIChjcHVjdHgtPmV4Y2x1c2l2ZSkKKwkJcmV0dXJuIDA7CisJLyoKKwkgKiBJZiB0aGlzIGdyb3VwIGlzIGV4Y2x1c2l2ZSBhbmQgdGhlcmUgYXJlIGFscmVhZHkKKwkgKiBjb3VudGVycyBvbiB0aGUgQ1BVLCBpdCBjYW4ndCBnbyBvbi4KKwkgKi8KKwlpZiAoY291bnRlci0+YXR0ci5leGNsdXNpdmUgJiYgY3B1Y3R4LT5hY3RpdmVfb25jcHUpCisJCXJldHVybiAwOworCS8qCisJICogT3RoZXJ3aXNlLCB0cnkgdG8gYWRkIGl0IGlmIGFsbCBwcmV2aW91cyBncm91cHMgd2VyZSBhYmxlCisJICogdG8gZ28gb24uCisJICovCisJcmV0dXJuIGNhbl9hZGRfaHc7Cit9CisKK3N0YXRpYyB2b2lkIGFkZF9jb3VudGVyX3RvX2N0eChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJICAgICAgIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4KQoreworCWxpc3RfYWRkX2NvdW50ZXIoY291bnRlciwgY3R4KTsKKwljb3VudGVyLT50c3RhbXBfZW5hYmxlZCA9IGN0eC0+dGltZTsKKwljb3VudGVyLT50c3RhbXBfcnVubmluZyA9IGN0eC0+dGltZTsKKwljb3VudGVyLT50c3RhbXBfc3RvcHBlZCA9IGN0eC0+dGltZTsKK30KKworLyoKKyAqIENyb3NzIENQVSBjYWxsIHRvIGluc3RhbGwgYW5kIGVuYWJsZSBhIHBlcmZvcm1hbmNlIGNvdW50ZXIKKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGN0eC0+bXV0ZXggaGVsZAorICovCitzdGF0aWMgdm9pZCBfX3BlcmZfaW5zdGFsbF9pbl9jb250ZXh0KHZvaWQgKmluZm8pCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9ICZfX2dldF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBpbmZvOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gY291bnRlci0+Y3R4OworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmxlYWRlciA9IGNvdW50ZXItPmdyb3VwX2xlYWRlcjsKKwlpbnQgY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWludCBlcnI7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSB0YXNrIGNvbnRleHQsIHdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciBpdCBpcworCSAqIHRoZSBjdXJyZW50IHRhc2sgY29udGV4dCBvZiB0aGlzIGNwdS4gSWYgbm90IGl0IGhhcyBiZWVuCisJICogc2NoZWR1bGVkIG91dCBiZWZvcmUgdGhlIHNtcCBjYWxsIGFycml2ZWQuCisJICogT3IgcG9zc2libHkgdGhpcyBpcyB0aGUgcmlnaHQgY29udGV4dCBidXQgaXQgaXNuJ3QKKwkgKiBvbiB0aGlzIGNwdSBiZWNhdXNlIGl0IGhhZCBubyBjb3VudGVycy4KKwkgKi8KKwlpZiAoY3R4LT50YXNrICYmIGNwdWN0eC0+dGFza19jdHggIT0gY3R4KSB7CisJCWlmIChjcHVjdHgtPnRhc2tfY3R4IHx8IGN0eC0+dGFzayAhPSBjdXJyZW50KQorCQkJcmV0dXJuOworCQljcHVjdHgtPnRhc2tfY3R4ID0gY3R4OworCX0KKworCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwljdHgtPmlzX2FjdGl2ZSA9IDE7CisJdXBkYXRlX2NvbnRleHRfdGltZShjdHgpOworCisJLyoKKwkgKiBQcm90ZWN0IHRoZSBsaXN0IG9wZXJhdGlvbiBhZ2FpbnN0IE5NSSBieSBkaXNhYmxpbmcgdGhlCisJICogY291bnRlcnMgb24gYSBnbG9iYWwgbGV2ZWwuIE5PUCBmb3Igbm9uIE5NSSBiYXNlZCBjb3VudGVycy4KKwkgKi8KKwlwZXJmX2Rpc2FibGUoKTsKKworCWFkZF9jb3VudGVyX3RvX2N0eChjb3VudGVyLCBjdHgpOworCisJLyoKKwkgKiBEb24ndCBwdXQgdGhlIGNvdW50ZXIgb24gaWYgaXQgaXMgZGlzYWJsZWQgb3IgaWYKKwkgKiBpdCBpcyBpbiBhIGdyb3VwIGFuZCB0aGUgZ3JvdXAgaXNuJ3Qgb24uCisJICovCisJaWYgKGNvdW50ZXItPnN0YXRlICE9IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSB8fAorCSAgICAobGVhZGVyICE9IGNvdW50ZXIgJiYgbGVhZGVyLT5zdGF0ZSAhPSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFKSkKKwkJZ290byB1bmxvY2s7CisKKwkvKgorCSAqIEFuIGV4Y2x1c2l2ZSBjb3VudGVyIGNhbid0IGdvIG9uIGlmIHRoZXJlIGFyZSBhbHJlYWR5IGFjdGl2ZQorCSAqIGhhcmR3YXJlIGNvdW50ZXJzLCBhbmQgbm8gaGFyZHdhcmUgY291bnRlciBjYW4gZ28gb24gaWYgdGhlcmUKKwkgKiBpcyBhbHJlYWR5IGFuIGV4Y2x1c2l2ZSBjb3VudGVyIG9uLgorCSAqLworCWlmICghZ3JvdXBfY2FuX2dvX29uKGNvdW50ZXIsIGNwdWN0eCwgMSkpCisJCWVyciA9IC1FRVhJU1Q7CisJZWxzZQorCQllcnIgPSBjb3VudGVyX3NjaGVkX2luKGNvdW50ZXIsIGNwdWN0eCwgY3R4LCBjcHUpOworCisJaWYgKGVycikgeworCQkvKgorCQkgKiBUaGlzIGNvdW50ZXIgY291bGRuJ3QgZ28gb24uICBJZiBpdCBpcyBpbiBhIGdyb3VwCisJCSAqIHRoZW4gd2UgaGF2ZSB0byBwdWxsIHRoZSB3aG9sZSBncm91cCBvZmYuCisJCSAqIElmIHRoZSBjb3VudGVyIGdyb3VwIGlzIHBpbm5lZCB0aGVuIHB1dCBpdCBpbiBlcnJvciBzdGF0ZS4KKwkJICovCisJCWlmIChsZWFkZXIgIT0gY291bnRlcikKKwkJCWdyb3VwX3NjaGVkX291dChsZWFkZXIsIGNwdWN0eCwgY3R4KTsKKwkJaWYgKGxlYWRlci0+YXR0ci5waW5uZWQpIHsKKwkJCXVwZGF0ZV9ncm91cF90aW1lcyhsZWFkZXIpOworCQkJbGVhZGVyLT5zdGF0ZSA9IFBFUkZfQ09VTlRFUl9TVEFURV9FUlJPUjsKKwkJfQorCX0KKworCWlmICghZXJyICYmICFjdHgtPnRhc2sgJiYgY3B1Y3R4LT5tYXhfcGVydGFzaykKKwkJY3B1Y3R4LT5tYXhfcGVydGFzay0tOworCisgdW5sb2NrOgorCXBlcmZfZW5hYmxlKCk7CisKKwlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKK30KKworLyoKKyAqIEF0dGFjaCBhIHBlcmZvcm1hbmNlIGNvdW50ZXIgdG8gYSBjb250ZXh0CisgKgorICogRmlyc3Qgd2UgYWRkIHRoZSBjb3VudGVyIHRvIHRoZSBsaXN0IHdpdGggdGhlIGhhcmR3YXJlIGVuYWJsZSBiaXQKKyAqIGluIGNvdW50ZXItPmh3X2NvbmZpZyBjbGVhcmVkLgorICoKKyAqIElmIHRoZSBjb3VudGVyIGlzIGF0dGFjaGVkIHRvIGEgdGFzayB3aGljaCBpcyBvbiBhIENQVSB3ZSB1c2UgYSBzbXAKKyAqIGNhbGwgdG8gZW5hYmxlIGl0IGluIHRoZSB0YXNrIGNvbnRleHQuIFRoZSB0YXNrIG1pZ2h0IGhhdmUgYmVlbgorICogc2NoZWR1bGVkIGF3YXksIGJ1dCB3ZSBjaGVjayB0aGlzIGluIHRoZSBzbXAgY2FsbCBhZ2Fpbi4KKyAqCisgKiBNdXN0IGJlIGNhbGxlZCB3aXRoIGN0eC0+bXV0ZXggaGVsZC4KKyAqLworc3RhdGljIHZvaWQKK3BlcmZfaW5zdGFsbF9pbl9jb250ZXh0KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LAorCQkJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCWludCBjcHUpCit7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3R4LT50YXNrOworCisJaWYgKCF0YXNrKSB7CisJCS8qCisJCSAqIFBlciBjcHUgY291bnRlcnMgYXJlIGluc3RhbGxlZCB2aWEgYW4gc21wIGNhbGwgYW5kCisJCSAqIHRoZSBpbnN0YWxsIGlzIGFsd2F5cyBzdWNlc3NmdWwuCisJCSAqLworCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBfX3BlcmZfaW5zdGFsbF9pbl9jb250ZXh0LAorCQkJCQkgY291bnRlciwgMSk7CisJCXJldHVybjsKKwl9CisKK3JldHJ5OgorCXRhc2tfb25jcHVfZnVuY3Rpb25fY2FsbCh0YXNrLCBfX3BlcmZfaW5zdGFsbF9pbl9jb250ZXh0LAorCQkJCSBjb3VudGVyKTsKKworCXNwaW5fbG9ja19pcnEoJmN0eC0+bG9jayk7CisJLyoKKwkgKiB3ZSBuZWVkIHRvIHJldHJ5IHRoZSBzbXAgY2FsbC4KKwkgKi8KKwlpZiAoY3R4LT5pc19hY3RpdmUgJiYgbGlzdF9lbXB0eSgmY291bnRlci0+bGlzdF9lbnRyeSkpIHsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworCQlnb3RvIHJldHJ5OworCX0KKworCS8qCisJICogVGhlIGxvY2sgcHJldmVudHMgdGhhdCB0aGlzIGNvbnRleHQgaXMgc2NoZWR1bGVkIGluIHNvIHdlCisJICogY2FuIGFkZCB0aGUgY291bnRlciBzYWZlbHksIGlmIGl0IHRoZSBjYWxsIGFib3ZlIGRpZCBub3QKKwkgKiBzdWNjZWVkLgorCSAqLworCWlmIChsaXN0X2VtcHR5KCZjb3VudGVyLT5saXN0X2VudHJ5KSkKKwkJYWRkX2NvdW50ZXJfdG9fY3R4KGNvdW50ZXIsIGN0eCk7CisJc3Bpbl91bmxvY2tfaXJxKCZjdHgtPmxvY2spOworfQorCisvKgorICogQ3Jvc3MgQ1BVIGNhbGwgdG8gZW5hYmxlIGEgcGVyZm9ybWFuY2UgY291bnRlcgorICovCitzdGF0aWMgdm9pZCBfX3BlcmZfY291bnRlcl9lbmFibGUodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyID0gaW5mbzsKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gJl9fZ2V0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisJc3RydWN0IHBlcmZfY291bnRlciAqbGVhZGVyID0gY291bnRlci0+Z3JvdXBfbGVhZGVyOworCWludCBlcnI7CisKKwkvKgorCSAqIElmIHRoaXMgaXMgYSBwZXItdGFzayBjb3VudGVyLCBuZWVkIHRvIGNoZWNrIHdoZXRoZXIgdGhpcworCSAqIGNvdW50ZXIncyB0YXNrIGlzIHRoZSBjdXJyZW50IHRhc2sgb24gdGhpcyBjcHUuCisJICovCisJaWYgKGN0eC0+dGFzayAmJiBjcHVjdHgtPnRhc2tfY3R4ICE9IGN0eCkgeworCQlpZiAoY3B1Y3R4LT50YXNrX2N0eCB8fCBjdHgtPnRhc2sgIT0gY3VycmVudCkKKwkJCXJldHVybjsKKwkJY3B1Y3R4LT50YXNrX2N0eCA9IGN0eDsKKwl9CisKKwlzcGluX2xvY2soJmN0eC0+bG9jayk7CisJY3R4LT5pc19hY3RpdmUgPSAxOworCXVwZGF0ZV9jb250ZXh0X3RpbWUoY3R4KTsKKworCWlmIChjb3VudGVyLT5zdGF0ZSA+PSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkUpCisJCWdvdG8gdW5sb2NrOworCWNvdW50ZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFOworCWNvdW50ZXItPnRzdGFtcF9lbmFibGVkID0gY3R4LT50aW1lIC0gY291bnRlci0+dG90YWxfdGltZV9lbmFibGVkOworCisJLyoKKwkgKiBJZiB0aGUgY291bnRlciBpcyBpbiBhIGdyb3VwIGFuZCBpc24ndCB0aGUgZ3JvdXAgbGVhZGVyLAorCSAqIHRoZW4gZG9uJ3QgcHV0IGl0IG9uIHVubGVzcyB0aGUgZ3JvdXAgaXMgb24uCisJICovCisJaWYgKGxlYWRlciAhPSBjb3VudGVyICYmIGxlYWRlci0+c3RhdGUgIT0gUEVSRl9DT1VOVEVSX1NUQVRFX0FDVElWRSkKKwkJZ290byB1bmxvY2s7CisKKwlpZiAoIWdyb3VwX2Nhbl9nb19vbihjb3VudGVyLCBjcHVjdHgsIDEpKSB7CisJCWVyciA9IC1FRVhJU1Q7CisJfSBlbHNlIHsKKwkJcGVyZl9kaXNhYmxlKCk7CisJCWlmIChjb3VudGVyID09IGxlYWRlcikKKwkJCWVyciA9IGdyb3VwX3NjaGVkX2luKGNvdW50ZXIsIGNwdWN0eCwgY3R4LAorCQkJCQkgICAgIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisJCWVsc2UKKwkJCWVyciA9IGNvdW50ZXJfc2NoZWRfaW4oY291bnRlciwgY3B1Y3R4LCBjdHgsCisJCQkJCSAgICAgICBzbXBfcHJvY2Vzc29yX2lkKCkpOworCQlwZXJmX2VuYWJsZSgpOworCX0KKworCWlmIChlcnIpIHsKKwkJLyoKKwkJICogSWYgdGhpcyBjb3VudGVyIGNhbid0IGdvIG9uIGFuZCBpdCdzIHBhcnQgb2YgYQorCQkgKiBncm91cCwgdGhlbiB0aGUgd2hvbGUgZ3JvdXAgaGFzIHRvIGNvbWUgb2ZmLgorCQkgKi8KKwkJaWYgKGxlYWRlciAhPSBjb3VudGVyKQorCQkJZ3JvdXBfc2NoZWRfb3V0KGxlYWRlciwgY3B1Y3R4LCBjdHgpOworCQlpZiAobGVhZGVyLT5hdHRyLnBpbm5lZCkgeworCQkJdXBkYXRlX2dyb3VwX3RpbWVzKGxlYWRlcik7CisJCQlsZWFkZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX0VSUk9SOworCQl9CisJfQorCisgdW5sb2NrOgorCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOworfQorCisvKgorICogRW5hYmxlIGEgY291bnRlci4KKyAqCisgKiBJZiBjb3VudGVyLT5jdHggaXMgYSBjbG9uZWQgY29udGV4dCwgY2FsbGVycyBtdXN0IG1ha2Ugc3VyZSB0aGF0CisgKiBldmVyeSB0YXNrIHN0cnVjdCB0aGF0IGNvdW50ZXItPmN0eC0+dGFzayBjb3VsZCBwb3NzaWJseSBwb2ludCB0bworICogcmVtYWlucyB2YWxpZC4gIFRoaXMgY29uZGl0aW9uIGlzIHNhdGlzZmllZCB3aGVuIGNhbGxlZCB0aHJvdWdoCisgKiBwZXJmX2NvdW50ZXJfZm9yX2VhY2hfY2hpbGQgb3IgcGVyZl9jb3VudGVyX2Zvcl9lYWNoIGFzIGRlc2NyaWJlZAorICogZm9yIHBlcmZfY291bnRlcl9kaXNhYmxlLgorICovCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfZW5hYmxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrID0gY3R4LT50YXNrOworCisJaWYgKCF0YXNrKSB7CisJCS8qCisJCSAqIEVuYWJsZSB0aGUgY291bnRlciBvbiB0aGUgY3B1IHRoYXQgaXQncyBvbgorCQkgKi8KKwkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNvdW50ZXItPmNwdSwgX19wZXJmX2NvdW50ZXJfZW5hYmxlLAorCQkJCQkgY291bnRlciwgMSk7CisJCXJldHVybjsKKwl9CisKKwlzcGluX2xvY2tfaXJxKCZjdHgtPmxvY2spOworCWlmIChjb3VudGVyLT5zdGF0ZSA+PSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkUpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBJZiB0aGUgY291bnRlciBpcyBpbiBlcnJvciBzdGF0ZSwgY2xlYXIgdGhhdCBmaXJzdC4KKwkgKiBUaGF0IHdheSwgaWYgd2Ugc2VlIHRoZSBjb3VudGVyIGluIGVycm9yIHN0YXRlIGJlbG93LCB3ZQorCSAqIGtub3cgdGhhdCBpdCBoYXMgZ29uZSBiYWNrIGludG8gZXJyb3Igc3RhdGUsIGFzIGRpc3RpbmN0CisJICogZnJvbSB0aGUgdGFzayBoYXZpbmcgYmVlbiBzY2hlZHVsZWQgYXdheSBiZWZvcmUgdGhlCisJICogY3Jvc3MtY2FsbCBhcnJpdmVkLgorCSAqLworCWlmIChjb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfRVJST1IpCisJCWNvdW50ZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRjsKKworIHJldHJ5OgorCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKKwl0YXNrX29uY3B1X2Z1bmN0aW9uX2NhbGwodGFzaywgX19wZXJmX2NvdW50ZXJfZW5hYmxlLCBjb3VudGVyKTsKKworCXNwaW5fbG9ja19pcnEoJmN0eC0+bG9jayk7CisKKwkvKgorCSAqIElmIHRoZSBjb250ZXh0IGlzIGFjdGl2ZSBhbmQgdGhlIGNvdW50ZXIgaXMgc3RpbGwgb2ZmLAorCSAqIHdlIG5lZWQgdG8gcmV0cnkgdGhlIGNyb3NzLWNhbGwuCisJICovCisJaWYgKGN0eC0+aXNfYWN0aXZlICYmIGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9PRkYpCisJCWdvdG8gcmV0cnk7CisKKwkvKgorCSAqIFNpbmNlIHdlIGhhdmUgdGhlIGxvY2sgdGhpcyBjb250ZXh0IGNhbid0IGJlIHNjaGVkdWxlZAorCSAqIGluLCBzbyB3ZSBjYW4gY2hhbmdlIHRoZSBzdGF0ZSBzYWZlbHkuCisJICovCisJaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9PRkYpIHsKKwkJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkU7CisJCWNvdW50ZXItPnRzdGFtcF9lbmFibGVkID0KKwkJCWN0eC0+dGltZSAtIGNvdW50ZXItPnRvdGFsX3RpbWVfZW5hYmxlZDsKKwl9Cisgb3V0OgorCXNwaW5fdW5sb2NrX2lycSgmY3R4LT5sb2NrKTsKK30KKworc3RhdGljIGludCBwZXJmX2NvdW50ZXJfcmVmcmVzaChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBpbnQgcmVmcmVzaCkKK3sKKwkvKgorCSAqIG5vdCBzdXBwb3J0ZWQgb24gaW5oZXJpdGVkIGNvdW50ZXJzCisJICovCisJaWYgKGNvdW50ZXItPmF0dHIuaW5oZXJpdCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlhdG9taWNfYWRkKHJlZnJlc2gsICZjb3VudGVyLT5ldmVudF9saW1pdCk7CisJcGVyZl9jb3VudGVyX2VuYWJsZShjb3VudGVyKTsKKworCXJldHVybiAwOworfQorCit2b2lkIF9fcGVyZl9jb3VudGVyX3NjaGVkX291dChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCwKKwkJCSAgICAgIHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwljdHgtPmlzX2FjdGl2ZSA9IDA7CisJaWYgKGxpa2VseSghY3R4LT5ucl9jb3VudGVycykpCisJCWdvdG8gb3V0OworCXVwZGF0ZV9jb250ZXh0X3RpbWUoY3R4KTsKKworCXBlcmZfZGlzYWJsZSgpOworCWlmIChjdHgtPm5yX2FjdGl2ZSkgeworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZjdHgtPmNvdW50ZXJfbGlzdCwgbGlzdF9lbnRyeSkgeworCQkJaWYgKGNvdW50ZXIgIT0gY291bnRlci0+Z3JvdXBfbGVhZGVyKQorCQkJCWNvdW50ZXJfc2NoZWRfb3V0KGNvdW50ZXIsIGNwdWN0eCwgY3R4KTsKKwkJCWVsc2UKKwkJCQlncm91cF9zY2hlZF9vdXQoY291bnRlciwgY3B1Y3R4LCBjdHgpOworCQl9CisJfQorCXBlcmZfZW5hYmxlKCk7Cisgb3V0OgorCXNwaW5fdW5sb2NrKCZjdHgtPmxvY2spOworfQorCisvKgorICogVGVzdCB3aGV0aGVyIHR3byBjb250ZXh0cyBhcmUgZXF1aXZhbGVudCwgaS5lLiB3aGV0aGVyIHRoZXkKKyAqIGhhdmUgYm90aCBiZWVuIGNsb25lZCBmcm9tIHRoZSBzYW1lIHZlcnNpb24gb2YgdGhlIHNhbWUgY29udGV4dAorICogYW5kIHRoZXkgYm90aCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBlbmFibGVkIGNvdW50ZXJzLgorICogSWYgdGhlIG51bWJlciBvZiBlbmFibGVkIGNvdW50ZXJzIGlzIHRoZSBzYW1lLCB0aGVuIHRoZSBzZXQKKyAqIG9mIGVuYWJsZWQgY291bnRlcnMgc2hvdWxkIGJlIHRoZSBzYW1lLCBiZWNhdXNlIHRoZXNlIGFyZSBib3RoCisgKiBpbmhlcml0ZWQgY29udGV4dHMsIHRoZXJlZm9yZSB3ZSBjYW4ndCBhY2Nlc3MgaW5kaXZpZHVhbCBjb3VudGVycworICogaW4gdGhlbSBkaXJlY3RseSB3aXRoIGFuIGZkOyB3ZSBjYW4gb25seSBlbmFibGUvZGlzYWJsZSBhbGwKKyAqIGNvdW50ZXJzIHZpYSBwcmN0bCwgb3IgZW5hYmxlL2Rpc2FibGUgYWxsIGNvdW50ZXJzIGluIGEgZmFtaWx5CisgKiB2aWEgaW9jdGwsIHdoaWNoIHdpbGwgaGF2ZSB0aGUgc2FtZSBlZmZlY3Qgb24gYm90aCBjb250ZXh0cy4KKyAqLworc3RhdGljIGludCBjb250ZXh0X2VxdWl2KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4MSwKKwkJCSBzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eDIpCit7CisJcmV0dXJuIGN0eDEtPnBhcmVudF9jdHggJiYgY3R4MS0+cGFyZW50X2N0eCA9PSBjdHgyLT5wYXJlbnRfY3R4CisJCSYmIGN0eDEtPnBhcmVudF9nZW4gPT0gY3R4Mi0+cGFyZW50X2dlbgorCQkmJiAhY3R4MS0+cGluX2NvdW50ICYmICFjdHgyLT5waW5fY291bnQ7Cit9CisKKy8qCisgKiBDYWxsZWQgZnJvbSBzY2hlZHVsZXIgdG8gcmVtb3ZlIHRoZSBjb3VudGVycyBvZiB0aGUgY3VycmVudCB0YXNrLAorICogd2l0aCBpbnRlcnJ1cHRzIGRpc2FibGVkLgorICoKKyAqIFdlIHN0b3AgZWFjaCBjb3VudGVyIGFuZCB1cGRhdGUgdGhlIGNvdW50ZXIgdmFsdWUgaW4gY291bnRlci0+Y291bnQuCisgKgorICogVGhpcyBkb2VzIG5vdCBwcm90ZWN0IHVzIGFnYWluc3QgTk1JLCBidXQgZGlzYWJsZSgpCisgKiBzZXRzIHRoZSBkaXNhYmxlZCBiaXQgaW4gdGhlIGNvbnRyb2wgZmllbGQgb2YgY291bnRlciBfYmVmb3JlXworICogYWNjZXNzaW5nIHRoZSBjb3VudGVyIGNvbnRyb2wgcmVnaXN0ZXIuIElmIGEgTk1JIGhpdHMsIHRoZW4gaXQgd2lsbAorICogbm90IHJlc3RhcnQgdGhlIGNvdW50ZXIuCisgKi8KK3ZvaWQgcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfb3V0KHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgc3RydWN0IHRhc2tfc3RydWN0ICpuZXh0LCBpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSAmcGVyX2NwdShwZXJmX2NwdV9jb250ZXh0LCBjcHUpOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gdGFzay0+cGVyZl9jb3VudGVyX2N0eHA7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpuZXh0X2N0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKnBhcmVudDsKKwlzdHJ1Y3QgcHRfcmVncyAqcmVnczsKKwlpbnQgZG9fc3dpdGNoID0gMTsKKworCXJlZ3MgPSB0YXNrX3B0X3JlZ3ModGFzayk7CisJcGVyZl9zd2NvdW50ZXJfZXZlbnQoUEVSRl9DT1VOVF9TV19DT05URVhUX1NXSVRDSEVTLCAxLCAxLCByZWdzLCAwKTsKKworCWlmIChsaWtlbHkoIWN0eCB8fCAhY3B1Y3R4LT50YXNrX2N0eCkpCisJCXJldHVybjsKKworCXVwZGF0ZV9jb250ZXh0X3RpbWUoY3R4KTsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlwYXJlbnQgPSByY3VfZGVyZWZlcmVuY2UoY3R4LT5wYXJlbnRfY3R4KTsKKwluZXh0X2N0eCA9IG5leHQtPnBlcmZfY291bnRlcl9jdHhwOworCWlmIChwYXJlbnQgJiYgbmV4dF9jdHggJiYKKwkgICAgcmN1X2RlcmVmZXJlbmNlKG5leHRfY3R4LT5wYXJlbnRfY3R4KSA9PSBwYXJlbnQpIHsKKwkJLyoKKwkJICogTG9va3MgbGlrZSB0aGUgdHdvIGNvbnRleHRzIGFyZSBjbG9uZXMsIHNvIHdlIG1pZ2h0IGJlCisJCSAqIGFibGUgdG8gb3B0aW1pemUgdGhlIGNvbnRleHQgc3dpdGNoLiAgV2UgbG9jayBib3RoCisJCSAqIGNvbnRleHRzIGFuZCBjaGVjayB0aGF0IHRoZXkgYXJlIGNsb25lcyB1bmRlciB0aGUKKwkJICogbG9jayAoaW5jbHVkaW5nIHJlLWNoZWNraW5nIHRoYXQgbmVpdGhlciBoYXMgYmVlbgorCQkgKiB1bmNsb25lZCBpbiB0aGUgbWVhbnRpbWUpLiAgSXQgZG9lc24ndCBtYXR0ZXIgd2hpY2gKKwkJICogb3JkZXIgd2UgdGFrZSB0aGUgbG9ja3MgYmVjYXVzZSBubyBvdGhlciBjcHUgY291bGQKKwkJICogYmUgdHJ5aW5nIHRvIGxvY2sgYm90aCBvZiB0aGVzZSB0YXNrcy4KKwkJICovCisJCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwkJc3Bpbl9sb2NrX25lc3RlZCgmbmV4dF9jdHgtPmxvY2ssIFNJTkdMRV9ERVBUSF9ORVNUSU5HKTsKKwkJaWYgKGNvbnRleHRfZXF1aXYoY3R4LCBuZXh0X2N0eCkpIHsKKwkJCS8qCisJCQkgKiBYWFggZG8gd2UgbmVlZCBhIG1lbW9yeSBiYXJyaWVyIG9mIHNvcnRzCisJCQkgKiB3cnQgdG8gcmN1X2RlcmVmZXJlbmNlKCkgb2YgcGVyZl9jb3VudGVyX2N0eHAKKwkJCSAqLworCQkJdGFzay0+cGVyZl9jb3VudGVyX2N0eHAgPSBuZXh0X2N0eDsKKwkJCW5leHQtPnBlcmZfY291bnRlcl9jdHhwID0gY3R4OworCQkJY3R4LT50YXNrID0gbmV4dDsKKwkJCW5leHRfY3R4LT50YXNrID0gdGFzazsKKwkJCWRvX3N3aXRjaCA9IDA7CisJCX0KKwkJc3Bpbl91bmxvY2soJm5leHRfY3R4LT5sb2NrKTsKKwkJc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworCisJaWYgKGRvX3N3aXRjaCkgeworCQlfX3BlcmZfY291bnRlcl9zY2hlZF9vdXQoY3R4LCBjcHVjdHgpOworCQljcHVjdHgtPnRhc2tfY3R4ID0gTlVMTDsKKwl9Cit9CisKKy8qCisgKiBDYWxsZWQgd2l0aCBJUlFzIGRpc2FibGVkCisgKi8KK3N0YXRpYyB2b2lkIF9fcGVyZl9jb3VudGVyX3Rhc2tfc2NoZWRfb3V0KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSAmX19nZXRfY3B1X3ZhcihwZXJmX2NwdV9jb250ZXh0KTsKKworCWlmICghY3B1Y3R4LT50YXNrX2N0eCkKKwkJcmV0dXJuOworCisJaWYgKFdBUk5fT05fT05DRShjdHggIT0gY3B1Y3R4LT50YXNrX2N0eCkpCisJCXJldHVybjsKKworCV9fcGVyZl9jb3VudGVyX3NjaGVkX291dChjdHgsIGNwdWN0eCk7CisJY3B1Y3R4LT50YXNrX2N0eCA9IE5VTEw7Cit9CisKKy8qCisgKiBDYWxsZWQgd2l0aCBJUlFzIGRpc2FibGVkCisgKi8KK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9jcHVfc2NoZWRfb3V0KHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgpCit7CisJX19wZXJmX2NvdW50ZXJfc2NoZWRfb3V0KCZjcHVjdHgtPmN0eCwgY3B1Y3R4KTsKK30KKworc3RhdGljIHZvaWQKK19fcGVyZl9jb3VudGVyX3NjaGVkX2luKHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LAorCQkJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCWludCBjYW5fYWRkX2h3ID0gMTsKKworCXNwaW5fbG9jaygmY3R4LT5sb2NrKTsKKwljdHgtPmlzX2FjdGl2ZSA9IDE7CisJaWYgKGxpa2VseSghY3R4LT5ucl9jb3VudGVycykpCisJCWdvdG8gb3V0OworCisJY3R4LT50aW1lc3RhbXAgPSBwZXJmX2Nsb2NrKCk7CisKKwlwZXJmX2Rpc2FibGUoKTsKKworCS8qCisJICogRmlyc3QgZ28gdGhyb3VnaCB0aGUgbGlzdCBhbmQgcHV0IG9uIGFueSBwaW5uZWQgZ3JvdXBzCisJICogaW4gb3JkZXIgdG8gZ2l2ZSB0aGVtIHRoZSBiZXN0IGNoYW5jZSBvZiBnb2luZyBvbi4KKwkgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZjdHgtPmNvdW50ZXJfbGlzdCwgbGlzdF9lbnRyeSkgeworCQlpZiAoY291bnRlci0+c3RhdGUgPD0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRiB8fAorCQkgICAgIWNvdW50ZXItPmF0dHIucGlubmVkKQorCQkJY29udGludWU7CisJCWlmIChjb3VudGVyLT5jcHUgIT0gLTEgJiYgY291bnRlci0+Y3B1ICE9IGNwdSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChjb3VudGVyICE9IGNvdW50ZXItPmdyb3VwX2xlYWRlcikKKwkJCWNvdW50ZXJfc2NoZWRfaW4oY291bnRlciwgY3B1Y3R4LCBjdHgsIGNwdSk7CisJCWVsc2UgeworCQkJaWYgKGdyb3VwX2Nhbl9nb19vbihjb3VudGVyLCBjcHVjdHgsIDEpKQorCQkJCWdyb3VwX3NjaGVkX2luKGNvdW50ZXIsIGNwdWN0eCwgY3R4LCBjcHUpOworCQl9CisKKwkJLyoKKwkJICogSWYgdGhpcyBwaW5uZWQgZ3JvdXAgaGFzbid0IGJlZW4gc2NoZWR1bGVkLAorCQkgKiBwdXQgaXQgaW4gZXJyb3Igc3RhdGUuCisJCSAqLworCQlpZiAoY291bnRlci0+c3RhdGUgPT0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFKSB7CisJCQl1cGRhdGVfZ3JvdXBfdGltZXMoY291bnRlcik7CisJCQljb3VudGVyLT5zdGF0ZSA9IFBFUkZfQ09VTlRFUl9TVEFURV9FUlJPUjsKKwkJfQorCX0KKworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmN0eC0+Y291bnRlcl9saXN0LCBsaXN0X2VudHJ5KSB7CisJCS8qCisJCSAqIElnbm9yZSBjb3VudGVycyBpbiBPRkYgb3IgRVJST1Igc3RhdGUsIGFuZAorCQkgKiBpZ25vcmUgcGlubmVkIGNvdW50ZXJzIHNpbmNlIHdlIGRpZCB0aGVtIGFscmVhZHkuCisJCSAqLworCQlpZiAoY291bnRlci0+c3RhdGUgPD0gUEVSRl9DT1VOVEVSX1NUQVRFX09GRiB8fAorCQkgICAgY291bnRlci0+YXR0ci5waW5uZWQpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBMaXN0ZW4gdG8gdGhlICdjcHUnIHNjaGVkdWxpbmcgZmlsdGVyIGNvbnN0cmFpbnQKKwkJICogb2YgY291bnRlcnM6CisJCSAqLworCQlpZiAoY291bnRlci0+Y3B1ICE9IC0xICYmIGNvdW50ZXItPmNwdSAhPSBjcHUpCisJCQljb250aW51ZTsKKworCQlpZiAoY291bnRlciAhPSBjb3VudGVyLT5ncm91cF9sZWFkZXIpIHsKKwkJCWlmIChjb3VudGVyX3NjaGVkX2luKGNvdW50ZXIsIGNwdWN0eCwgY3R4LCBjcHUpKQorCQkJCWNhbl9hZGRfaHcgPSAwOworCQl9IGVsc2UgeworCQkJaWYgKGdyb3VwX2Nhbl9nb19vbihjb3VudGVyLCBjcHVjdHgsIGNhbl9hZGRfaHcpKSB7CisJCQkJaWYgKGdyb3VwX3NjaGVkX2luKGNvdW50ZXIsIGNwdWN0eCwgY3R4LCBjcHUpKQorCQkJCQljYW5fYWRkX2h3ID0gMDsKKwkJCX0KKwkJfQorCX0KKwlwZXJmX2VuYWJsZSgpOworIG91dDoKKwlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKK30KKworLyoKKyAqIENhbGxlZCBmcm9tIHNjaGVkdWxlciB0byBhZGQgdGhlIGNvdW50ZXJzIG9mIHRoZSBjdXJyZW50IHRhc2sKKyAqIHdpdGggaW50ZXJydXB0cyBkaXNhYmxlZC4KKyAqCisgKiBXZSByZXN0b3JlIHRoZSBjb3VudGVyIHZhbHVlIGFuZCB0aGVuIGVuYWJsZSBpdC4KKyAqCisgKiBUaGlzIGRvZXMgbm90IHByb3RlY3QgdXMgYWdhaW5zdCBOTUksIGJ1dCBlbmFibGUoKQorICogc2V0cyB0aGUgZW5hYmxlZCBiaXQgaW4gdGhlIGNvbnRyb2wgZmllbGQgb2YgY291bnRlciBfYmVmb3JlXworICogYWNjZXNzaW5nIHRoZSBjb3VudGVyIGNvbnRyb2wgcmVnaXN0ZXIuIElmIGEgTk1JIGhpdHMsIHRoZW4gaXQgd2lsbAorICoga2VlcCB0aGUgY291bnRlciBydW5uaW5nLgorICovCit2b2lkIHBlcmZfY291bnRlcl90YXNrX3NjaGVkX2luKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gJnBlcl9jcHUocGVyZl9jcHVfY29udGV4dCwgY3B1KTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IHRhc2stPnBlcmZfY291bnRlcl9jdHhwOworCisJaWYgKGxpa2VseSghY3R4KSkKKwkJcmV0dXJuOworCWlmIChjcHVjdHgtPnRhc2tfY3R4ID09IGN0eCkKKwkJcmV0dXJuOworCV9fcGVyZl9jb3VudGVyX3NjaGVkX2luKGN0eCwgY3B1Y3R4LCBjcHUpOworCWNwdWN0eC0+dGFza19jdHggPSBjdHg7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9jcHVfc2NoZWRfaW4oc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9ICZjcHVjdHgtPmN0eDsKKworCV9fcGVyZl9jb3VudGVyX3NjaGVkX2luKGN0eCwgY3B1Y3R4LCBjcHUpOworfQorCisjZGVmaW5lIE1BWF9JTlRFUlJVUFRTICh+MFVMTCkKKworc3RhdGljIHZvaWQgcGVyZl9sb2dfdGhyb3R0bGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgaW50IGVuYWJsZSk7CitzdGF0aWMgdm9pZCBwZXJmX2xvZ19wZXJpb2Qoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgdTY0IHBlcmlvZCk7CisKK3N0YXRpYyB2b2lkIHBlcmZfYWRqdXN0X3BlcmlvZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCB1NjQgZXZlbnRzKQoreworCXN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YyA9ICZjb3VudGVyLT5odzsKKwl1NjQgcGVyaW9kLCBzYW1wbGVfcGVyaW9kOworCXM2NCBkZWx0YTsKKworCWV2ZW50cyAqPSBod2MtPnNhbXBsZV9wZXJpb2Q7CisJcGVyaW9kID0gZGl2NjRfdTY0KGV2ZW50cywgY291bnRlci0+YXR0ci5zYW1wbGVfZnJlcSk7CisKKwlkZWx0YSA9IChzNjQpKHBlcmlvZCAtIGh3Yy0+c2FtcGxlX3BlcmlvZCk7CisJZGVsdGEgPSAoZGVsdGEgKyA3KSAvIDg7IC8qIGxvdyBwYXNzIGZpbHRlciAqLworCisJc2FtcGxlX3BlcmlvZCA9IGh3Yy0+c2FtcGxlX3BlcmlvZCArIGRlbHRhOworCisJaWYgKCFzYW1wbGVfcGVyaW9kKQorCQlzYW1wbGVfcGVyaW9kID0gMTsKKworCXBlcmZfbG9nX3BlcmlvZChjb3VudGVyLCBzYW1wbGVfcGVyaW9kKTsKKworCWh3Yy0+c2FtcGxlX3BlcmlvZCA9IHNhbXBsZV9wZXJpb2Q7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY3R4X2FkanVzdF9mcmVxKHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjOworCXU2NCBpbnRlcnJ1cHRzLCBmcmVxOworCisJc3Bpbl9sb2NrKCZjdHgtPmxvY2spOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmN0eC0+Y291bnRlcl9saXN0LCBsaXN0X2VudHJ5KSB7CisJCWlmIChjb3VudGVyLT5zdGF0ZSAhPSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFKQorCQkJY29udGludWU7CisKKwkJaHdjID0gJmNvdW50ZXItPmh3OworCisJCWludGVycnVwdHMgPSBod2MtPmludGVycnVwdHM7CisJCWh3Yy0+aW50ZXJydXB0cyA9IDA7CisKKwkJLyoKKwkJICogdW50aHJvdHRsZSBjb3VudGVycyBvbiB0aGUgdGljaworCQkgKi8KKwkJaWYgKGludGVycnVwdHMgPT0gTUFYX0lOVEVSUlVQVFMpIHsKKwkJCXBlcmZfbG9nX3Rocm90dGxlKGNvdW50ZXIsIDEpOworCQkJY291bnRlci0+cG11LT51bnRocm90dGxlKGNvdW50ZXIpOworCQkJaW50ZXJydXB0cyA9IDIqc3lzY3RsX3BlcmZfY291bnRlcl9zYW1wbGVfcmF0ZS9IWjsKKwkJfQorCisJCWlmICghY291bnRlci0+YXR0ci5mcmVxIHx8ICFjb3VudGVyLT5hdHRyLnNhbXBsZV9mcmVxKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogaWYgdGhlIHNwZWNpZmllZCBmcmVxIDwgSFogdGhlbiB3ZSBuZWVkIHRvIHNraXAgdGlja3MKKwkJICovCisJCWlmIChjb3VudGVyLT5hdHRyLnNhbXBsZV9mcmVxIDwgSFopIHsKKwkJCWZyZXEgPSBjb3VudGVyLT5hdHRyLnNhbXBsZV9mcmVxOworCisJCQlod2MtPmZyZXFfY291bnQgKz0gZnJlcTsKKwkJCWh3Yy0+ZnJlcV9pbnRlcnJ1cHRzICs9IGludGVycnVwdHM7CisKKwkJCWlmIChod2MtPmZyZXFfY291bnQgPCBIWikKKwkJCQljb250aW51ZTsKKworCQkJaW50ZXJydXB0cyA9IGh3Yy0+ZnJlcV9pbnRlcnJ1cHRzOworCQkJaHdjLT5mcmVxX2ludGVycnVwdHMgPSAwOworCQkJaHdjLT5mcmVxX2NvdW50IC09IEhaOworCQl9IGVsc2UKKwkJCWZyZXEgPSBIWjsKKworCQlwZXJmX2FkanVzdF9wZXJpb2QoY291bnRlciwgZnJlcSAqIGludGVycnVwdHMpOworCisJCS8qCisJCSAqIEluIG9yZGVyIHRvIGF2b2lkIGJlaW5nIHN0YWxsZWQgYnkgYW4gKGFjY2lkZW50YWwpIGh1Z2UKKwkJICogc2FtcGxlIHBlcmlvZCwgZm9yY2UgcmVzZXQgdGhlIHNhbXBsZSBwZXJpb2QgaWYgd2UgZGlkbid0CisJCSAqIGdldCBhbnkgZXZlbnRzIGluIHRoaXMgZnJlcSBwZXJpb2QuCisJCSAqLworCQlpZiAoIWludGVycnVwdHMpIHsKKwkJCXBlcmZfZGlzYWJsZSgpOworCQkJY291bnRlci0+cG11LT5kaXNhYmxlKGNvdW50ZXIpOworCQkJYXRvbWljX3NldCgmaHdjLT5wZXJpb2RfbGVmdCwgMCk7CisJCQljb3VudGVyLT5wbXUtPmVuYWJsZShjb3VudGVyKTsKKwkJCXBlcmZfZW5hYmxlKCk7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmN0eC0+bG9jayk7Cit9CisKKy8qCisgKiBSb3VuZC1yb2JpbiBhIGNvbnRleHQncyBjb3VudGVyczoKKyAqLworc3RhdGljIHZvaWQgcm90YXRlX2N0eChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJaWYgKCFjdHgtPm5yX2NvdW50ZXJzKQorCQlyZXR1cm47CisKKwlzcGluX2xvY2soJmN0eC0+bG9jayk7CisJLyoKKwkgKiBSb3RhdGUgdGhlIGZpcnN0IGVudHJ5IGxhc3QgKHdvcmtzIGp1c3QgZmluZSBmb3IgZ3JvdXAgY291bnRlcnMgdG9vKToKKwkgKi8KKwlwZXJmX2Rpc2FibGUoKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvdW50ZXIsICZjdHgtPmNvdW50ZXJfbGlzdCwgbGlzdF9lbnRyeSkgeworCQlsaXN0X21vdmVfdGFpbCgmY291bnRlci0+bGlzdF9lbnRyeSwgJmN0eC0+Y291bnRlcl9saXN0KTsKKwkJYnJlYWs7CisJfQorCXBlcmZfZW5hYmxlKCk7CisKKwlzcGluX3VubG9jaygmY3R4LT5sb2NrKTsKK30KKwordm9pZCBwZXJmX2NvdW50ZXJfdGFza190aWNrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY3VyciwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4OworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4OworCisJaWYgKCFhdG9taWNfcmVhZCgmbnJfY291bnRlcnMpKQorCQlyZXR1cm47CisKKwljcHVjdHggPSAmcGVyX2NwdShwZXJmX2NwdV9jb250ZXh0LCBjcHUpOworCWN0eCA9IGN1cnItPnBlcmZfY291bnRlcl9jdHhwOworCisJcGVyZl9jdHhfYWRqdXN0X2ZyZXEoJmNwdWN0eC0+Y3R4KTsKKwlpZiAoY3R4KQorCQlwZXJmX2N0eF9hZGp1c3RfZnJlcShjdHgpOworCisJcGVyZl9jb3VudGVyX2NwdV9zY2hlZF9vdXQoY3B1Y3R4KTsKKwlpZiAoY3R4KQorCQlfX3BlcmZfY291bnRlcl90YXNrX3NjaGVkX291dChjdHgpOworCisJcm90YXRlX2N0eCgmY3B1Y3R4LT5jdHgpOworCWlmIChjdHgpCisJCXJvdGF0ZV9jdHgoY3R4KTsKKworCXBlcmZfY291bnRlcl9jcHVfc2NoZWRfaW4oY3B1Y3R4LCBjcHUpOworCWlmIChjdHgpCisJCXBlcmZfY291bnRlcl90YXNrX3NjaGVkX2luKGN1cnIsIGNwdSk7Cit9CisKKy8qCisgKiBDcm9zcyBDUFUgY2FsbCB0byByZWFkIHRoZSBoYXJkd2FyZSBjb3VudGVyCisgKi8KK3N0YXRpYyB2b2lkIF9fcmVhZCh2b2lkICppbmZvKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBpbmZvOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gY291bnRlci0+Y3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJaWYgKGN0eC0+aXNfYWN0aXZlKQorCQl1cGRhdGVfY29udGV4dF90aW1lKGN0eCk7CisJY291bnRlci0+cG11LT5yZWFkKGNvdW50ZXIpOworCXVwZGF0ZV9jb3VudGVyX3RpbWVzKGNvdW50ZXIpOworCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworc3RhdGljIHU2NCBwZXJmX2NvdW50ZXJfcmVhZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCS8qCisJICogSWYgY291bnRlciBpcyBlbmFibGVkIGFuZCBjdXJyZW50bHkgYWN0aXZlIG9uIGEgQ1BVLCB1cGRhdGUgdGhlCisJICogdmFsdWUgaW4gdGhlIGNvdW50ZXIgc3RydWN0dXJlOgorCSAqLworCWlmIChjb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFKSB7CisJCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjb3VudGVyLT5vbmNwdSwKKwkJCQkJIF9fcmVhZCwgY291bnRlciwgMSk7CisJfSBlbHNlIGlmIChjb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkUpIHsKKwkJdXBkYXRlX2NvdW50ZXJfdGltZXMoY291bnRlcik7CisJfQorCisJcmV0dXJuIGF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmNvdW50KTsKK30KKworLyoKKyAqIEluaXRpYWxpemUgdGhlIHBlcmZfY291bnRlciBjb250ZXh0IGluIGEgdGFza19zdHJ1Y3Q6CisgKi8KK3N0YXRpYyB2b2lkCitfX3BlcmZfY291bnRlcl9pbml0X2NvbnRleHQoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsCisJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCW1lbXNldChjdHgsIDAsIHNpemVvZigqY3R4KSk7CisJc3Bpbl9sb2NrX2luaXQoJmN0eC0+bG9jayk7CisJbXV0ZXhfaW5pdCgmY3R4LT5tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmN0eC0+Y291bnRlcl9saXN0KTsKKwlJTklUX0xJU1RfSEVBRCgmY3R4LT5ldmVudF9saXN0KTsKKwlhdG9taWNfc2V0KCZjdHgtPnJlZmNvdW50LCAxKTsKKwljdHgtPnRhc2sgPSB0YXNrOworfQorCitzdGF0aWMgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpmaW5kX2dldF9jb250ZXh0KHBpZF90IHBpZCwgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKnBhcmVudF9jdHg7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2s7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgZXJyOworCisJLyoKKwkgKiBJZiBjcHUgaXMgbm90IGEgd2lsZGNhcmQgdGhlbiB0aGlzIGlzIGEgcGVyY3B1IGNvdW50ZXI6CisJICovCisJaWYgKGNwdSAhPSAtMSkgeworCQkvKiBNdXN0IGJlIHJvb3QgdG8gb3BlcmF0ZSBvbiBhIENQVSBjb3VudGVyOiAqLworCQlpZiAocGVyZl9wYXJhbm9pZF9jcHUoKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FQUNDRVMpOworCisJCWlmIChjcHUgPCAwIHx8IGNwdSA+IG51bV9wb3NzaWJsZV9jcHVzKCkpCisJCQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCQkvKgorCQkgKiBXZSBjb3VsZCBiZSBjbGV2ZXIgYW5kIGFsbG93IHRvIGF0dGFjaCBhIGNvdW50ZXIgdG8gYW4KKwkJICogb2ZmbGluZSBDUFUgYW5kIGFjdGl2YXRlIGl0IHdoZW4gdGhlIENQVSBjb21lcyB1cCwgYnV0CisJCSAqIHRoYXQncyBmb3IgbGF0ZXIuCisJCSAqLworCQlpZiAoIWNwdV9pc3NldChjcHUsIGNwdV9vbmxpbmVfbWFwKSkKKwkJCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOworCisJCWNwdWN0eCA9ICZwZXJfY3B1KHBlcmZfY3B1X2NvbnRleHQsIGNwdSk7CisJCWN0eCA9ICZjcHVjdHgtPmN0eDsKKwkJZ2V0X2N0eChjdHgpOworCisJCXJldHVybiBjdHg7CisJfQorCisJcmN1X3JlYWRfbG9jaygpOworCWlmICghcGlkKQorCQl0YXNrID0gY3VycmVudDsKKwllbHNlCisJCXRhc2sgPSBmaW5kX3Rhc2tfYnlfdnBpZChwaWQpOworCWlmICh0YXNrKQorCQlnZXRfdGFza19zdHJ1Y3QodGFzayk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlpZiAoIXRhc2spCisJCXJldHVybiBFUlJfUFRSKC1FU1JDSCk7CisKKwkvKgorCSAqIENhbid0IGF0dGFjaCBjb3VudGVycyB0byBhIGR5aW5nIHRhc2suCisJICovCisJZXJyID0gLUVTUkNIOworCWlmICh0YXNrLT5mbGFncyAmIFBGX0VYSVRJTkcpCisJCWdvdG8gZXJyb3V0OworCisJLyogUmV1c2UgcHRyYWNlIHBlcm1pc3Npb24gY2hlY2tzIGZvciBub3cuICovCisJZXJyID0gLUVBQ0NFUzsKKwlpZiAoIXB0cmFjZV9tYXlfYWNjZXNzKHRhc2ssIFBUUkFDRV9NT0RFX1JFQUQpKQorCQlnb3RvIGVycm91dDsKKworIHJldHJ5OgorCWN0eCA9IHBlcmZfbG9ja190YXNrX2NvbnRleHQodGFzaywgJmZsYWdzKTsKKwlpZiAoY3R4KSB7CisJCXBhcmVudF9jdHggPSBjdHgtPnBhcmVudF9jdHg7CisJCWlmIChwYXJlbnRfY3R4KSB7CisJCQlwdXRfY3R4KHBhcmVudF9jdHgpOworCQkJY3R4LT5wYXJlbnRfY3R4ID0gTlVMTDsJCS8qIG5vIGxvbmdlciBhIGNsb25lICovCisJCX0KKwkJLyoKKwkJICogR2V0IGFuIGV4dHJhIHJlZmVyZW5jZSBiZWZvcmUgZHJvcHBpbmcgdGhlIGxvY2sgc28gdGhhdAorCQkgKiB0aGlzIGNvbnRleHQgd29uJ3QgZ2V0IGZyZWVkIGlmIHRoZSB0YXNrIGV4aXRzLgorCQkgKi8KKwkJZ2V0X2N0eChjdHgpOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdHgtPmxvY2ssIGZsYWdzKTsKKwl9CisKKwlpZiAoIWN0eCkgeworCQljdHggPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQpLCBHRlBfS0VSTkVMKTsKKwkJZXJyID0gLUVOT01FTTsKKwkJaWYgKCFjdHgpCisJCQlnb3RvIGVycm91dDsKKwkJX19wZXJmX2NvdW50ZXJfaW5pdF9jb250ZXh0KGN0eCwgdGFzayk7CisJCWdldF9jdHgoY3R4KTsKKwkJaWYgKGNtcHhjaGcoJnRhc2stPnBlcmZfY291bnRlcl9jdHhwLCBOVUxMLCBjdHgpKSB7CisJCQkvKgorCQkJICogV2UgcmFjZWQgd2l0aCBzb21lIG90aGVyIHRhc2s7IHVzZQorCQkJICogdGhlIGNvbnRleHQgdGhleSBzZXQuCisJCQkgKi8KKwkJCWtmcmVlKGN0eCk7CisJCQlnb3RvIHJldHJ5OworCQl9CisJCWdldF90YXNrX3N0cnVjdCh0YXNrKTsKKwl9CisKKwlwdXRfdGFza19zdHJ1Y3QodGFzayk7CisJcmV0dXJuIGN0eDsKKworIGVycm91dDoKKwlwdXRfdGFza19zdHJ1Y3QodGFzayk7CisJcmV0dXJuIEVSUl9QVFIoZXJyKTsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jb3VudGVyX3JjdShzdHJ1Y3QgcmN1X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCWNvdW50ZXIgPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IHBlcmZfY291bnRlciwgcmN1X2hlYWQpOworCWlmIChjb3VudGVyLT5ucykKKwkJcHV0X3BpZF9ucyhjb3VudGVyLT5ucyk7CisJa2ZyZWUoY291bnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfcGVuZGluZ19zeW5jKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpOworCitzdGF0aWMgdm9pZCBmcmVlX2NvdW50ZXIoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlwZXJmX3BlbmRpbmdfc3luYyhjb3VudGVyKTsKKworCWF0b21pY19kZWMoJm5yX2NvdW50ZXJzKTsKKwlpZiAoY291bnRlci0+YXR0ci5tbWFwKQorCQlhdG9taWNfZGVjKCZucl9tbWFwX2NvdW50ZXJzKTsKKwlpZiAoY291bnRlci0+YXR0ci5jb21tKQorCQlhdG9taWNfZGVjKCZucl9jb21tX2NvdW50ZXJzKTsKKworCWlmIChjb3VudGVyLT5kZXN0cm95KQorCQljb3VudGVyLT5kZXN0cm95KGNvdW50ZXIpOworCisJcHV0X2N0eChjb3VudGVyLT5jdHgpOworCWNhbGxfcmN1KCZjb3VudGVyLT5yY3VfaGVhZCwgZnJlZV9jb3VudGVyX3JjdSk7Cit9CisKKy8qCisgKiBDYWxsZWQgd2hlbiB0aGUgbGFzdCByZWZlcmVuY2UgdG8gdGhlIGZpbGUgaXMgZ29uZS4KKyAqLworc3RhdGljIGludCBwZXJmX3JlbGVhc2Uoc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCA9IGNvdW50ZXItPmN0eDsKKworCWZpbGUtPnByaXZhdGVfZGF0YSA9IE5VTEw7CisKKwlXQVJOX09OX09OQ0UoY3R4LT5wYXJlbnRfY3R4KTsKKwltdXRleF9sb2NrKCZjdHgtPm11dGV4KTsKKwlwZXJmX2NvdW50ZXJfcmVtb3ZlX2Zyb21fY29udGV4dChjb3VudGVyKTsKKwltdXRleF91bmxvY2soJmN0eC0+bXV0ZXgpOworCisJbXV0ZXhfbG9jaygmY291bnRlci0+b3duZXItPnBlcmZfY291bnRlcl9tdXRleCk7CisJbGlzdF9kZWxfaW5pdCgmY291bnRlci0+b3duZXJfZW50cnkpOworCW11dGV4X3VubG9jaygmY291bnRlci0+b3duZXItPnBlcmZfY291bnRlcl9tdXRleCk7CisJcHV0X3Rhc2tfc3RydWN0KGNvdW50ZXItPm93bmVyKTsKKworCWZyZWVfY291bnRlcihjb3VudGVyKTsKKworCXJldHVybiAwOworfQorCisvKgorICogUmVhZCB0aGUgcGVyZm9ybWFuY2UgY291bnRlciAtIHNpbXBsZSBub24gYmxvY2tpbmcgdmVyc2lvbiBmb3Igbm93CisgKi8KK3N0YXRpYyBzc2l6ZV90CitwZXJmX3JlYWRfaHcoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCXU2NCB2YWx1ZXNbM107CisJaW50IG47CisKKwkvKgorCSAqIFJldHVybiBlbmQtb2YtZmlsZSBmb3IgYSByZWFkIG9uIGEgY291bnRlciB0aGF0IGlzIGluCisJICogZXJyb3Igc3RhdGUgKGkuZS4gYmVjYXVzZSBpdCB3YXMgcGlubmVkIGJ1dCBpdCBjb3VsZG4ndCBiZQorCSAqIHNjaGVkdWxlZCBvbiB0byB0aGUgQ1BVIGF0IHNvbWUgcG9pbnQpLgorCSAqLworCWlmIChjb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfRVJST1IpCisJCXJldHVybiAwOworCisJV0FSTl9PTl9PTkNFKGNvdW50ZXItPmN0eC0+cGFyZW50X2N0eCk7CisJbXV0ZXhfbG9jaygmY291bnRlci0+Y2hpbGRfbXV0ZXgpOworCXZhbHVlc1swXSA9IHBlcmZfY291bnRlcl9yZWFkKGNvdW50ZXIpOworCW4gPSAxOworCWlmIChjb3VudGVyLT5hdHRyLnJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVEKQorCQl2YWx1ZXNbbisrXSA9IGNvdW50ZXItPnRvdGFsX3RpbWVfZW5hYmxlZCArCisJCQlhdG9taWM2NF9yZWFkKCZjb3VudGVyLT5jaGlsZF90b3RhbF90aW1lX2VuYWJsZWQpOworCWlmIChjb3VudGVyLT5hdHRyLnJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9SVU5OSU5HKQorCQl2YWx1ZXNbbisrXSA9IGNvdW50ZXItPnRvdGFsX3RpbWVfcnVubmluZyArCisJCQlhdG9taWM2NF9yZWFkKCZjb3VudGVyLT5jaGlsZF90b3RhbF90aW1lX3J1bm5pbmcpOworCWlmIChjb3VudGVyLT5hdHRyLnJlYWRfZm9ybWF0ICYgUEVSRl9GT1JNQVRfSUQpCisJCXZhbHVlc1tuKytdID0gY291bnRlci0+aWQ7CisJbXV0ZXhfdW5sb2NrKCZjb3VudGVyLT5jaGlsZF9tdXRleCk7CisKKwlpZiAoY291bnQgPCBuICogc2l6ZW9mKHU2NCkpCisJCXJldHVybiAtRUlOVkFMOworCWNvdW50ID0gbiAqIHNpemVvZih1NjQpOworCisJaWYgKGNvcHlfdG9fdXNlcihidWYsIHZhbHVlcywgY291bnQpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIHNzaXplX3QKK3BlcmZfcmVhZChzdHJ1Y3QgZmlsZSAqZmlsZSwgY2hhciBfX3VzZXIgKmJ1Ziwgc2l6ZV90IGNvdW50LCBsb2ZmX3QgKnBwb3MpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGZpbGUtPnByaXZhdGVfZGF0YTsKKworCXJldHVybiBwZXJmX3JlYWRfaHcoY291bnRlciwgYnVmLCBjb3VudCk7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgcGVyZl9wb2xsKHN0cnVjdCBmaWxlICpmaWxlLCBwb2xsX3RhYmxlICp3YWl0KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCXVuc2lnbmVkIGludCBldmVudHMgPSBQT0xMX0hVUDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlkYXRhID0gcmN1X2RlcmVmZXJlbmNlKGNvdW50ZXItPmRhdGEpOworCWlmIChkYXRhKQorCQlldmVudHMgPSBhdG9taWNfeGNoZygmZGF0YS0+cG9sbCwgMCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7CisKKwlwb2xsX3dhaXQoZmlsZSwgJmNvdW50ZXItPndhaXRxLCB3YWl0KTsKKworCXJldHVybiBldmVudHM7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9yZXNldChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCSh2b2lkKXBlcmZfY291bnRlcl9yZWFkKGNvdW50ZXIpOworCWF0b21pYzY0X3NldCgmY291bnRlci0+Y291bnQsIDApOworCXBlcmZfY291bnRlcl91cGRhdGVfdXNlcnBhZ2UoY291bnRlcik7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9mb3JfZWFjaF9zaWJsaW5nKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsCisJCQkJCSAgdm9pZCAoKmZ1bmMpKHN0cnVjdCBwZXJmX2NvdW50ZXIgKikpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisJc3RydWN0IHBlcmZfY291bnRlciAqc2libGluZzsKKworCVdBUk5fT05fT05DRShjdHgtPnBhcmVudF9jdHgpOworCW11dGV4X2xvY2soJmN0eC0+bXV0ZXgpOworCWNvdW50ZXIgPSBjb3VudGVyLT5ncm91cF9sZWFkZXI7CisKKwlmdW5jKGNvdW50ZXIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2libGluZywgJmNvdW50ZXItPnNpYmxpbmdfbGlzdCwgbGlzdF9lbnRyeSkKKwkJZnVuYyhzaWJsaW5nKTsKKwltdXRleF91bmxvY2soJmN0eC0+bXV0ZXgpOworfQorCisvKgorICogSG9sZGluZyB0aGUgdG9wLWxldmVsIGNvdW50ZXIncyBjaGlsZF9tdXRleCBtZWFucyB0aGF0IGFueQorICogZGVzY2VuZGFudCBwcm9jZXNzIHRoYXQgaGFzIGluaGVyaXRlZCB0aGlzIGNvdW50ZXIgd2lsbCBibG9jaworICogaW4gc3luY19jaGlsZF9jb3VudGVyIGlmIGl0IGdvZXMgdG8gZXhpdCwgdGh1cyBzYXRpc2Z5aW5nIHRoZQorICogdGFzayBleGlzdGVuY2UgcmVxdWlyZW1lbnRzIG9mIHBlcmZfY291bnRlcl9lbmFibGUvZGlzYWJsZS4KKyAqLworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2Zvcl9lYWNoX2NoaWxkKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsCisJCQkJCXZvaWQgKCpmdW5jKShzdHJ1Y3QgcGVyZl9jb3VudGVyICopKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNoaWxkOworCisJV0FSTl9PTl9PTkNFKGNvdW50ZXItPmN0eC0+cGFyZW50X2N0eCk7CisJbXV0ZXhfbG9jaygmY291bnRlci0+Y2hpbGRfbXV0ZXgpOworCWZ1bmMoY291bnRlcik7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjaGlsZCwgJmNvdW50ZXItPmNoaWxkX2xpc3QsIGNoaWxkX2xpc3QpCisJCWZ1bmMoY2hpbGQpOworCW11dGV4X3VubG9jaygmY291bnRlci0+Y2hpbGRfbXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfZm9yX2VhY2goc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCQkgIHZvaWQgKCpmdW5jKShzdHJ1Y3QgcGVyZl9jb3VudGVyICopKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNoaWxkOworCisJV0FSTl9PTl9PTkNFKGNvdW50ZXItPmN0eC0+cGFyZW50X2N0eCk7CisJbXV0ZXhfbG9jaygmY291bnRlci0+Y2hpbGRfbXV0ZXgpOworCXBlcmZfY291bnRlcl9mb3JfZWFjaF9zaWJsaW5nKGNvdW50ZXIsIGZ1bmMpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2hpbGQsICZjb3VudGVyLT5jaGlsZF9saXN0LCBjaGlsZF9saXN0KQorCQlwZXJmX2NvdW50ZXJfZm9yX2VhY2hfc2libGluZyhjaGlsZCwgZnVuYyk7CisJbXV0ZXhfdW5sb2NrKCZjb3VudGVyLT5jaGlsZF9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9jb3VudGVyX3BlcmlvZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCB1NjQgX191c2VyICphcmcpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSBjb3VudGVyLT5jdHg7CisJdW5zaWduZWQgbG9uZyBzaXplOworCWludCByZXQgPSAwOworCXU2NCB2YWx1ZTsKKworCWlmICghY291bnRlci0+YXR0ci5zYW1wbGVfcGVyaW9kKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNpemUgPSBjb3B5X2Zyb21fdXNlcigmdmFsdWUsIGFyZywgc2l6ZW9mKHZhbHVlKSk7CisJaWYgKHNpemUgIT0gc2l6ZW9mKHZhbHVlKSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlpZiAoIXZhbHVlKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXNwaW5fbG9ja19pcnEoJmN0eC0+bG9jayk7CisJaWYgKGNvdW50ZXItPmF0dHIuZnJlcSkgeworCQlpZiAodmFsdWUgPiBzeXNjdGxfcGVyZl9jb3VudGVyX3NhbXBsZV9yYXRlKSB7CisJCQlyZXQgPSAtRUlOVkFMOworCQkJZ290byB1bmxvY2s7CisJCX0KKworCQljb3VudGVyLT5hdHRyLnNhbXBsZV9mcmVxID0gdmFsdWU7CisJfSBlbHNlIHsKKwkJcGVyZl9sb2dfcGVyaW9kKGNvdW50ZXIsIHZhbHVlKTsKKworCQljb3VudGVyLT5hdHRyLnNhbXBsZV9wZXJpb2QgPSB2YWx1ZTsKKwkJY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZCA9IHZhbHVlOworCX0KK3VubG9jazoKKwlzcGluX3VubG9ja19pcnEoJmN0eC0+bG9jayk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgbG9uZyBwZXJmX2lvY3RsKHN0cnVjdCBmaWxlICpmaWxlLCB1bnNpZ25lZCBpbnQgY21kLCB1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyID0gZmlsZS0+cHJpdmF0ZV9kYXRhOworCXZvaWQgKCpmdW5jKShzdHJ1Y3QgcGVyZl9jb3VudGVyICopOworCXUzMiBmbGFncyA9IGFyZzsKKworCXN3aXRjaCAoY21kKSB7CisJY2FzZSBQRVJGX0NPVU5URVJfSU9DX0VOQUJMRToKKwkJZnVuYyA9IHBlcmZfY291bnRlcl9lbmFibGU7CisJCWJyZWFrOworCWNhc2UgUEVSRl9DT1VOVEVSX0lPQ19ESVNBQkxFOgorCQlmdW5jID0gcGVyZl9jb3VudGVyX2Rpc2FibGU7CisJCWJyZWFrOworCWNhc2UgUEVSRl9DT1VOVEVSX0lPQ19SRVNFVDoKKwkJZnVuYyA9IHBlcmZfY291bnRlcl9yZXNldDsKKwkJYnJlYWs7CisKKwljYXNlIFBFUkZfQ09VTlRFUl9JT0NfUkVGUkVTSDoKKwkJcmV0dXJuIHBlcmZfY291bnRlcl9yZWZyZXNoKGNvdW50ZXIsIGFyZyk7CisKKwljYXNlIFBFUkZfQ09VTlRFUl9JT0NfUEVSSU9EOgorCQlyZXR1cm4gcGVyZl9jb3VudGVyX3BlcmlvZChjb3VudGVyLCAodTY0IF9fdXNlciAqKWFyZyk7CisKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVOT1RUWTsKKwl9CisKKwlpZiAoZmxhZ3MgJiBQRVJGX0lPQ19GTEFHX0dST1VQKQorCQlwZXJmX2NvdW50ZXJfZm9yX2VhY2goY291bnRlciwgZnVuYyk7CisJZWxzZQorCQlwZXJmX2NvdW50ZXJfZm9yX2VhY2hfY2hpbGQoY291bnRlciwgZnVuYyk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHBlcmZfY291bnRlcl90YXNrX2VuYWJsZSh2b2lkKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisKKwltdXRleF9sb2NrKCZjdXJyZW50LT5wZXJmX2NvdW50ZXJfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmN1cnJlbnQtPnBlcmZfY291bnRlcl9saXN0LCBvd25lcl9lbnRyeSkKKwkJcGVyZl9jb3VudGVyX2Zvcl9lYWNoX2NoaWxkKGNvdW50ZXIsIHBlcmZfY291bnRlcl9lbmFibGUpOworCW11dGV4X3VubG9jaygmY3VycmVudC0+cGVyZl9jb3VudGVyX211dGV4KTsKKworCXJldHVybiAwOworfQorCitpbnQgcGVyZl9jb3VudGVyX3Rhc2tfZGlzYWJsZSh2b2lkKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisKKwltdXRleF9sb2NrKCZjdXJyZW50LT5wZXJmX2NvdW50ZXJfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY291bnRlciwgJmN1cnJlbnQtPnBlcmZfY291bnRlcl9saXN0LCBvd25lcl9lbnRyeSkKKwkJcGVyZl9jb3VudGVyX2Zvcl9lYWNoX2NoaWxkKGNvdW50ZXIsIHBlcmZfY291bnRlcl9kaXNhYmxlKTsKKwltdXRleF91bmxvY2soJmN1cnJlbnQtPnBlcmZfY291bnRlcl9tdXRleCk7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIENhbGxlcnMgbmVlZCB0byBlbnN1cmUgdGhlcmUgY2FuIGJlIG5vIG5lc3Rpbmcgb2YgdGhpcyBmdW5jdGlvbiwgb3RoZXJ3aXNlCisgKiB0aGUgc2VxbG9jayBsb2dpYyBnb2VzIGJhZC4gV2UgY2FuIG5vdCBzZXJpYWxpemUgdGhpcyBiZWNhdXNlIHRoZSBhcmNoCisgKiBjb2RlIGNhbGxzIHRoaXMgZnJvbSBOTUkgY29udGV4dC4KKyAqLwordm9pZCBwZXJmX2NvdW50ZXJfdXBkYXRlX3VzZXJwYWdlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9tbWFwX3BhZ2UgKnVzZXJwZzsKKwlzdHJ1Y3QgcGVyZl9tbWFwX2RhdGEgKmRhdGE7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJZGF0YSA9IHJjdV9kZXJlZmVyZW5jZShjb3VudGVyLT5kYXRhKTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gdW5sb2NrOworCisJdXNlcnBnID0gZGF0YS0+dXNlcl9wYWdlOworCisJLyoKKwkgKiBEaXNhYmxlIHByZWVtcHRpb24gc28gYXMgdG8gbm90IGxldCB0aGUgY29ycmVzcG9uZGluZyB1c2VyLXNwYWNlCisJICogc3BpbiB0b28gbG9uZyBpZiB3ZSBnZXQgcHJlZW1wdGVkLgorCSAqLworCXByZWVtcHRfZGlzYWJsZSgpOworCSsrdXNlcnBnLT5sb2NrOworCWJhcnJpZXIoKTsKKwl1c2VycGctPmluZGV4ID0gY291bnRlci0+aHcuaWR4OworCXVzZXJwZy0+b2Zmc2V0ID0gYXRvbWljNjRfcmVhZCgmY291bnRlci0+Y291bnQpOworCWlmIChjb3VudGVyLT5zdGF0ZSA9PSBQRVJGX0NPVU5URVJfU1RBVEVfQUNUSVZFKQorCQl1c2VycGctPm9mZnNldCAtPSBhdG9taWM2NF9yZWFkKCZjb3VudGVyLT5ody5wcmV2X2NvdW50KTsKKworCWJhcnJpZXIoKTsKKwkrK3VzZXJwZy0+bG9jazsKKwlwcmVlbXB0X2VuYWJsZSgpOwordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgaW50IHBlcmZfbW1hcF9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgc3RydWN0IHZtX2ZhdWx0ICp2bWYpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IHZtYS0+dm1fZmlsZS0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YTsKKwlpbnQgcmV0ID0gVk1fRkFVTFRfU0lHQlVTOworCisJcmN1X3JlYWRfbG9jaygpOworCWRhdGEgPSByY3VfZGVyZWZlcmVuY2UoY291bnRlci0+ZGF0YSk7CisJaWYgKCFkYXRhKQorCQlnb3RvIHVubG9jazsKKworCWlmICh2bWYtPnBnb2ZmID09IDApIHsKKwkJdm1mLT5wYWdlID0gdmlydF90b19wYWdlKGRhdGEtPnVzZXJfcGFnZSk7CisJfSBlbHNlIHsKKwkJaW50IG5yID0gdm1mLT5wZ29mZiAtIDE7CisKKwkJaWYgKCh1bnNpZ25lZCluciA+IGRhdGEtPm5yX3BhZ2VzKQorCQkJZ290byB1bmxvY2s7CisKKwkJdm1mLT5wYWdlID0gdmlydF90b19wYWdlKGRhdGEtPmRhdGFfcGFnZXNbbnJdKTsKKwl9CisJZ2V0X3BhZ2Uodm1mLT5wYWdlKTsKKwlyZXQgPSAwOwordW5sb2NrOgorCXJjdV9yZWFkX3VubG9jaygpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwZXJmX21tYXBfZGF0YV9hbGxvYyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBpbnQgbnJfcGFnZXMpCit7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlpbnQgaTsKKworCVdBUk5fT04oYXRvbWljX3JlYWQoJmNvdW50ZXItPm1tYXBfY291bnQpKTsKKworCXNpemUgPSBzaXplb2Yoc3RydWN0IHBlcmZfbW1hcF9kYXRhKTsKKwlzaXplICs9IG5yX3BhZ2VzICogc2l6ZW9mKHZvaWQgKik7CisKKwlkYXRhID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCWdvdG8gZmFpbDsKKworCWRhdGEtPnVzZXJfcGFnZSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghZGF0YS0+dXNlcl9wYWdlKQorCQlnb3RvIGZhaWxfdXNlcl9wYWdlOworCisJZm9yIChpID0gMDsgaSA8IG5yX3BhZ2VzOyBpKyspIHsKKwkJZGF0YS0+ZGF0YV9wYWdlc1tpXSA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCQlpZiAoIWRhdGEtPmRhdGFfcGFnZXNbaV0pCisJCQlnb3RvIGZhaWxfZGF0YV9wYWdlczsKKwl9CisKKwlkYXRhLT5ucl9wYWdlcyA9IG5yX3BhZ2VzOworCWF0b21pY19zZXQoJmRhdGEtPmxvY2ssIC0xKTsKKworCXJjdV9hc3NpZ25fcG9pbnRlcihjb3VudGVyLT5kYXRhLCBkYXRhKTsKKworCXJldHVybiAwOworCitmYWlsX2RhdGFfcGFnZXM6CisJZm9yIChpLS07IGkgPj0gMDsgaS0tKQorCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YS0+ZGF0YV9wYWdlc1tpXSk7CisKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpZGF0YS0+dXNlcl9wYWdlKTsKKworZmFpbF91c2VyX3BhZ2U6CisJa2ZyZWUoZGF0YSk7CisKK2ZhaWw6CisJcmV0dXJuIC1FTk9NRU07Cit9CisKK3N0YXRpYyB2b2lkIF9fcGVyZl9tbWFwX2RhdGFfZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKnJjdV9oZWFkKQoreworCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YTsKKwlpbnQgaTsKKworCWRhdGEgPSBjb250YWluZXJfb2YocmN1X2hlYWQsIHN0cnVjdCBwZXJmX21tYXBfZGF0YSwgcmN1X2hlYWQpOworCisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKWRhdGEtPnVzZXJfcGFnZSk7CisJZm9yIChpID0gMDsgaSA8IGRhdGEtPm5yX3BhZ2VzOyBpKyspCisJCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhLT5kYXRhX3BhZ2VzW2ldKTsKKwlrZnJlZShkYXRhKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9tbWFwX2RhdGFfZnJlZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXN0cnVjdCBwZXJmX21tYXBfZGF0YSAqZGF0YSA9IGNvdW50ZXItPmRhdGE7CisKKwlXQVJOX09OKGF0b21pY19yZWFkKCZjb3VudGVyLT5tbWFwX2NvdW50KSk7CisKKwlyY3VfYXNzaWduX3BvaW50ZXIoY291bnRlci0+ZGF0YSwgTlVMTCk7CisJY2FsbF9yY3UoJmRhdGEtPnJjdV9oZWFkLCBfX3BlcmZfbW1hcF9kYXRhX2ZyZWUpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX21tYXBfb3BlbihzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyID0gdm1hLT52bV9maWxlLT5wcml2YXRlX2RhdGE7CisKKwlhdG9taWNfaW5jKCZjb3VudGVyLT5tbWFwX2NvdW50KTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9tbWFwX2Nsb3NlKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSB2bWEtPnZtX2ZpbGUtPnByaXZhdGVfZGF0YTsKKworCVdBUk5fT05fT05DRShjb3VudGVyLT5jdHgtPnBhcmVudF9jdHgpOworCWlmIChhdG9taWNfZGVjX2FuZF9tdXRleF9sb2NrKCZjb3VudGVyLT5tbWFwX2NvdW50LCAmY291bnRlci0+bW1hcF9tdXRleCkpIHsKKwkJc3RydWN0IHVzZXJfc3RydWN0ICp1c2VyID0gY3VycmVudF91c2VyKCk7CisKKwkJYXRvbWljX2xvbmdfc3ViKGNvdW50ZXItPmRhdGEtPm5yX3BhZ2VzICsgMSwgJnVzZXItPmxvY2tlZF92bSk7CisJCXZtYS0+dm1fbW0tPmxvY2tlZF92bSAtPSBjb3VudGVyLT5kYXRhLT5ucl9sb2NrZWQ7CisJCXBlcmZfbW1hcF9kYXRhX2ZyZWUoY291bnRlcik7CisJCW11dGV4X3VubG9jaygmY291bnRlci0+bW1hcF9tdXRleCk7CisJfQorfQorCitzdGF0aWMgc3RydWN0IHZtX29wZXJhdGlvbnNfc3RydWN0IHBlcmZfbW1hcF92bW9wcyA9IHsKKwkub3BlbiAgPSBwZXJmX21tYXBfb3BlbiwKKwkuY2xvc2UgPSBwZXJmX21tYXBfY2xvc2UsCisJLmZhdWx0ID0gcGVyZl9tbWFwX2ZhdWx0LAorfTsKKworc3RhdGljIGludCBwZXJmX21tYXAoc3RydWN0IGZpbGUgKmZpbGUsIHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBmaWxlLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyB1c2VyX2xvY2tlZCwgdXNlcl9sb2NrX2xpbWl0OworCXN0cnVjdCB1c2VyX3N0cnVjdCAqdXNlciA9IGN1cnJlbnRfdXNlcigpOworCXVuc2lnbmVkIGxvbmcgbG9ja2VkLCBsb2NrX2xpbWl0OworCXVuc2lnbmVkIGxvbmcgdm1hX3NpemU7CisJdW5zaWduZWQgbG9uZyBucl9wYWdlczsKKwlsb25nIHVzZXJfZXh0cmEsIGV4dHJhOworCWludCByZXQgPSAwOworCisJaWYgKCEodm1hLT52bV9mbGFncyAmIFZNX1NIQVJFRCkgfHwgKHZtYS0+dm1fZmxhZ3MgJiBWTV9XUklURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJdm1hX3NpemUgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQ7CisJbnJfcGFnZXMgPSAodm1hX3NpemUgLyBQQUdFX1NJWkUpIC0gMTsKKworCS8qCisJICogSWYgd2UgaGF2ZSBkYXRhIHBhZ2VzIGVuc3VyZSB0aGV5J3JlIGEgcG93ZXItb2YtdHdvIG51bWJlciwgc28gd2UKKwkgKiBjYW4gZG8gYml0bWFza3MgaW5zdGVhZCBvZiBtb2R1bG8uCisJICovCisJaWYgKG5yX3BhZ2VzICE9IDAgJiYgIWlzX3Bvd2VyX29mXzIobnJfcGFnZXMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmICh2bWFfc2l6ZSAhPSBQQUdFX1NJWkUgKiAoMSArIG5yX3BhZ2VzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAodm1hLT52bV9wZ29mZiAhPSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCVdBUk5fT05fT05DRShjb3VudGVyLT5jdHgtPnBhcmVudF9jdHgpOworCW11dGV4X2xvY2soJmNvdW50ZXItPm1tYXBfbXV0ZXgpOworCWlmIChhdG9taWNfaW5jX25vdF96ZXJvKCZjb3VudGVyLT5tbWFwX2NvdW50KSkgeworCQlpZiAobnJfcGFnZXMgIT0gY291bnRlci0+ZGF0YS0+bnJfcGFnZXMpCisJCQlyZXQgPSAtRUlOVkFMOworCQlnb3RvIHVubG9jazsKKwl9CisKKwl1c2VyX2V4dHJhID0gbnJfcGFnZXMgKyAxOworCXVzZXJfbG9ja19saW1pdCA9IHN5c2N0bF9wZXJmX2NvdW50ZXJfbWxvY2sgPj4gKFBBR0VfU0hJRlQgLSAxMCk7CisKKwkvKgorCSAqIEluY3JlYXNlIHRoZSBsaW1pdCBsaW5lYXJseSB3aXRoIG1vcmUgQ1BVczoKKwkgKi8KKwl1c2VyX2xvY2tfbGltaXQgKj0gbnVtX29ubGluZV9jcHVzKCk7CisKKwl1c2VyX2xvY2tlZCA9IGF0b21pY19sb25nX3JlYWQoJnVzZXItPmxvY2tlZF92bSkgKyB1c2VyX2V4dHJhOworCisJZXh0cmEgPSAwOworCWlmICh1c2VyX2xvY2tlZCA+IHVzZXJfbG9ja19saW1pdCkKKwkJZXh0cmEgPSB1c2VyX2xvY2tlZCAtIHVzZXJfbG9ja19saW1pdDsKKworCWxvY2tfbGltaXQgPSBjdXJyZW50LT5zaWduYWwtPnJsaW1bUkxJTUlUX01FTUxPQ0tdLnJsaW1fY3VyOworCWxvY2tfbGltaXQgPj49IFBBR0VfU0hJRlQ7CisJbG9ja2VkID0gdm1hLT52bV9tbS0+bG9ja2VkX3ZtICsgZXh0cmE7CisKKwlpZiAoKGxvY2tlZCA+IGxvY2tfbGltaXQpICYmICFjYXBhYmxlKENBUF9JUENfTE9DSykpIHsKKwkJcmV0ID0gLUVQRVJNOworCQlnb3RvIHVubG9jazsKKwl9CisKKwlXQVJOX09OKGNvdW50ZXItPmRhdGEpOworCXJldCA9IHBlcmZfbW1hcF9kYXRhX2FsbG9jKGNvdW50ZXIsIG5yX3BhZ2VzKTsKKwlpZiAocmV0KQorCQlnb3RvIHVubG9jazsKKworCWF0b21pY19zZXQoJmNvdW50ZXItPm1tYXBfY291bnQsIDEpOworCWF0b21pY19sb25nX2FkZCh1c2VyX2V4dHJhLCAmdXNlci0+bG9ja2VkX3ZtKTsKKwl2bWEtPnZtX21tLT5sb2NrZWRfdm0gKz0gZXh0cmE7CisJY291bnRlci0+ZGF0YS0+bnJfbG9ja2VkID0gZXh0cmE7Cit1bmxvY2s6CisJbXV0ZXhfdW5sb2NrKCZjb3VudGVyLT5tbWFwX211dGV4KTsKKworCXZtYS0+dm1fZmxhZ3MgJj0gflZNX01BWVdSSVRFOworCXZtYS0+dm1fZmxhZ3MgfD0gVk1fUkVTRVJWRUQ7CisJdm1hLT52bV9vcHMgPSAmcGVyZl9tbWFwX3Ztb3BzOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBwZXJmX2Zhc3luYyhpbnQgZmQsIHN0cnVjdCBmaWxlICpmaWxwLCBpbnQgb24pCit7CisJc3RydWN0IGlub2RlICppbm9kZSA9IGZpbHAtPmZfcGF0aC5kZW50cnktPmRfaW5vZGU7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciA9IGZpbHAtPnByaXZhdGVfZGF0YTsKKwlpbnQgcmV0dmFsOworCisJbXV0ZXhfbG9jaygmaW5vZGUtPmlfbXV0ZXgpOworCXJldHZhbCA9IGZhc3luY19oZWxwZXIoZmQsIGZpbHAsIG9uLCAmY291bnRlci0+ZmFzeW5jKTsKKwltdXRleF91bmxvY2soJmlub2RlLT5pX211dGV4KTsKKworCWlmIChyZXR2YWwgPCAwKQorCQlyZXR1cm4gcmV0dmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIHBlcmZfZm9wcyA9IHsKKwkucmVsZWFzZQkJPSBwZXJmX3JlbGVhc2UsCisJLnJlYWQJCQk9IHBlcmZfcmVhZCwKKwkucG9sbAkJCT0gcGVyZl9wb2xsLAorCS51bmxvY2tlZF9pb2N0bAkJPSBwZXJmX2lvY3RsLAorCS5jb21wYXRfaW9jdGwJCT0gcGVyZl9pb2N0bCwKKwkubW1hcAkJCT0gcGVyZl9tbWFwLAorCS5mYXN5bmMJCQk9IHBlcmZfZmFzeW5jLAorfTsKKworLyoKKyAqIFBlcmYgY291bnRlciB3YWtldXAKKyAqCisgKiBJZiB0aGVyZSdzIGRhdGEsIGVuc3VyZSB3ZSBzZXQgdGhlIHBvbGwoKSBzdGF0ZSBhbmQgcHVibGlzaCBldmVyeXRoaW5nCisgKiB0byB1c2VyLXNwYWNlIGJlZm9yZSB3YWtpbmcgZXZlcnlib2R5IHVwLgorICovCisKK3ZvaWQgcGVyZl9jb3VudGVyX3dha2V1cChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXdha2VfdXBfYWxsKCZjb3VudGVyLT53YWl0cSk7CisKKwlpZiAoY291bnRlci0+cGVuZGluZ19raWxsKSB7CisJCWtpbGxfZmFzeW5jKCZjb3VudGVyLT5mYXN5bmMsIFNJR0lPLCBjb3VudGVyLT5wZW5kaW5nX2tpbGwpOworCQljb3VudGVyLT5wZW5kaW5nX2tpbGwgPSAwOworCX0KK30KKworLyoKKyAqIFBlbmRpbmcgd2FrZXVwcworICoKKyAqIEhhbmRsZSB0aGUgY2FzZSB3aGVyZSB3ZSBuZWVkIHRvIHdha2V1cCB1cCBmcm9tIE5NSSAob3IgcnEtPmxvY2spIGNvbnRleHQuCisgKgorICogVGhlIE5NSSBiaXQgbWVhbnMgd2UgY2Fubm90IHBvc3NpYmx5IHRha2UgbG9ja3MuIFRoZXJlZm9yZSwgbWFpbnRhaW4gYQorICogc2luZ2xlIGxpbmtlZCBsaXN0IGFuZCB1c2UgY21weGNoZygpIHRvIGFkZCBlbnRyaWVzIGxvY2tsZXNzLgorICovCisKK3N0YXRpYyB2b2lkIHBlcmZfcGVuZGluZ19jb3VudGVyKHN0cnVjdCBwZXJmX3BlbmRpbmdfZW50cnkgKmVudHJ5KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBjb250YWluZXJfb2YoZW50cnksCisJCQlzdHJ1Y3QgcGVyZl9jb3VudGVyLCBwZW5kaW5nKTsKKworCWlmIChjb3VudGVyLT5wZW5kaW5nX2Rpc2FibGUpIHsKKwkJY291bnRlci0+cGVuZGluZ19kaXNhYmxlID0gMDsKKwkJcGVyZl9jb3VudGVyX2Rpc2FibGUoY291bnRlcik7CisJfQorCisJaWYgKGNvdW50ZXItPnBlbmRpbmdfd2FrZXVwKSB7CisJCWNvdW50ZXItPnBlbmRpbmdfd2FrZXVwID0gMDsKKwkJcGVyZl9jb3VudGVyX3dha2V1cChjb3VudGVyKTsKKwl9Cit9CisKKyNkZWZpbmUgUEVORElOR19UQUlMICgoc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqKS0xVUwpCisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgcGVyZl9wZW5kaW5nX2VudHJ5ICosIHBlcmZfcGVuZGluZ19oZWFkKSA9IHsKKwlQRU5ESU5HX1RBSUwsCit9OworCitzdGF0aWMgdm9pZCBwZXJmX3BlbmRpbmdfcXVldWUoc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqZW50cnksCisJCQkgICAgICAgdm9pZCAoKmZ1bmMpKHN0cnVjdCBwZXJmX3BlbmRpbmdfZW50cnkgKikpCit7CisJc3RydWN0IHBlcmZfcGVuZGluZ19lbnRyeSAqKmhlYWQ7CisKKwlpZiAoY21weGNoZygmZW50cnktPm5leHQsIE5VTEwsIFBFTkRJTkdfVEFJTCkgIT0gTlVMTCkKKwkJcmV0dXJuOworCisJZW50cnktPmZ1bmMgPSBmdW5jOworCisJaGVhZCA9ICZnZXRfY3B1X3ZhcihwZXJmX3BlbmRpbmdfaGVhZCk7CisKKwlkbyB7CisJCWVudHJ5LT5uZXh0ID0gKmhlYWQ7CisJfSB3aGlsZSAoY21weGNoZyhoZWFkLCBlbnRyeS0+bmV4dCwgZW50cnkpICE9IGVudHJ5LT5uZXh0KTsKKworCXNldF9wZXJmX2NvdW50ZXJfcGVuZGluZygpOworCisJcHV0X2NwdV92YXIocGVyZl9wZW5kaW5nX2hlYWQpOworfQorCitzdGF0aWMgaW50IF9fcGVyZl9wZW5kaW5nX3J1bih2b2lkKQoreworCXN0cnVjdCBwZXJmX3BlbmRpbmdfZW50cnkgKmxpc3Q7CisJaW50IG5yID0gMDsKKworCWxpc3QgPSB4Y2hnKCZfX2dldF9jcHVfdmFyKHBlcmZfcGVuZGluZ19oZWFkKSwgUEVORElOR19UQUlMKTsKKwl3aGlsZSAobGlzdCAhPSBQRU5ESU5HX1RBSUwpIHsKKwkJdm9pZCAoKmZ1bmMpKHN0cnVjdCBwZXJmX3BlbmRpbmdfZW50cnkgKik7CisJCXN0cnVjdCBwZXJmX3BlbmRpbmdfZW50cnkgKmVudHJ5ID0gbGlzdDsKKworCQlsaXN0ID0gbGlzdC0+bmV4dDsKKworCQlmdW5jID0gZW50cnktPmZ1bmM7CisJCWVudHJ5LT5uZXh0ID0gTlVMTDsKKwkJLyoKKwkJICogRW5zdXJlIHdlIG9ic2VydmUgdGhlIHVucXVldWUgYmVmb3JlIHdlIGlzc3VlIHRoZSB3YWtldXAsCisJCSAqIHNvIHRoYXQgd2Ugd29uJ3QgYmUgd2FpdGluZyBmb3JldmVyLgorCQkgKiAtLSBzZWUgcGVyZl9ub3RfcGVuZGluZygpLgorCQkgKi8KKwkJc21wX3dtYigpOworCisJCWZ1bmMoZW50cnkpOworCQlucisrOworCX0KKworCXJldHVybiBucjsKK30KKworc3RhdGljIGlubGluZSBpbnQgcGVyZl9ub3RfcGVuZGluZyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCS8qCisJICogSWYgd2UgZmx1c2ggb24gd2hhdGV2ZXIgY3B1IHdlIHJ1biwgdGhlcmUgaXMgYSBjaGFuY2Ugd2UgZG9uJ3QKKwkgKiBuZWVkIHRvIHdhaXQuCisJICovCisJZ2V0X2NwdSgpOworCV9fcGVyZl9wZW5kaW5nX3J1bigpOworCXB1dF9jcHUoKTsKKworCS8qCisJICogRW5zdXJlIHdlIHNlZSB0aGUgcHJvcGVyIHF1ZXVlIHN0YXRlIGJlZm9yZSBnb2luZyB0byBzbGVlcAorCSAqIHNvIHRoYXQgd2UgZG8gbm90IG1pc3MgdGhlIHdha2V1cC4gLS0gc2VlIHBlcmZfcGVuZGluZ19oYW5kbGUoKQorCSAqLworCXNtcF9ybWIoKTsKKwlyZXR1cm4gY291bnRlci0+cGVuZGluZy5uZXh0ID09IE5VTEw7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfcGVuZGluZ19zeW5jKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJd2FpdF9ldmVudChjb3VudGVyLT53YWl0cSwgcGVyZl9ub3RfcGVuZGluZyhjb3VudGVyKSk7Cit9CisKK3ZvaWQgcGVyZl9jb3VudGVyX2RvX3BlbmRpbmcodm9pZCkKK3sKKwlfX3BlcmZfcGVuZGluZ19ydW4oKTsKK30KKworLyoKKyAqIENhbGxjaGFpbiBzdXBwb3J0IC0tIGFyY2ggc3BlY2lmaWMKKyAqLworCitfX3dlYWsgc3RydWN0IHBlcmZfY2FsbGNoYWluX2VudHJ5ICpwZXJmX2NhbGxjaGFpbihzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIE91dHB1dAorICovCisKK3N0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgeworCXN0cnVjdCBwZXJmX2NvdW50ZXIJKmNvdW50ZXI7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhCSpkYXRhOworCXVuc2lnbmVkIGxvbmcJCWhlYWQ7CisJdW5zaWduZWQgbG9uZwkJb2Zmc2V0OworCWludAkJCW5taTsKKwlpbnQJCQlvdmVyZmxvdzsKKwlpbnQJCQlsb2NrZWQ7CisJdW5zaWduZWQgbG9uZwkJZmxhZ3M7Cit9OworCitzdGF0aWMgdm9pZCBwZXJmX291dHB1dF93YWtldXAoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlKQoreworCWF0b21pY19zZXQoJmhhbmRsZS0+ZGF0YS0+cG9sbCwgUE9MTF9JTik7CisKKwlpZiAoaGFuZGxlLT5ubWkpIHsKKwkJaGFuZGxlLT5jb3VudGVyLT5wZW5kaW5nX3dha2V1cCA9IDE7CisJCXBlcmZfcGVuZGluZ19xdWV1ZSgmaGFuZGxlLT5jb3VudGVyLT5wZW5kaW5nLAorCQkJCSAgIHBlcmZfcGVuZGluZ19jb3VudGVyKTsKKwl9IGVsc2UKKwkJcGVyZl9jb3VudGVyX3dha2V1cChoYW5kbGUtPmNvdW50ZXIpOworfQorCisvKgorICogQ3VyaW91cyBsb2NraW5nIGNvbnN0cnVjdC4KKyAqCisgKiBXZSBuZWVkIHRvIGVuc3VyZSBhIGxhdGVyIGV2ZW50IGRvZXNuJ3QgcHVibGlzaCBhIGhlYWQgd2hlbiBhIGZvcm1lcgorICogZXZlbnQgaXNuJ3QgZG9uZSB3cml0aW5nLiBIb3dldmVyIHNpbmNlIHdlIG5lZWQgdG8gZGVhbCB3aXRoIE5NSXMgd2UKKyAqIGNhbm5vdCBmdWxseSBzZXJpYWxpemUgdGhpbmdzLgorICoKKyAqIFdoYXQgd2UgZG8gaXMgc2VyaWFsaXplIGJldHdlZW4gQ1BVcyBzbyB3ZSBvbmx5IGhhdmUgdG8gZGVhbCB3aXRoIE5NSQorICogbmVzdGluZyBvbiBhIHNpbmdsZSBDUFUuCisgKgorICogV2Ugb25seSBwdWJsaXNoIHRoZSBoZWFkIChhbmQgZ2VuZXJhdGUgYSB3YWtldXApIHdoZW4gdGhlIG91dGVyLW1vc3QKKyAqIGV2ZW50IGNvbXBsZXRlcy4KKyAqLworc3RhdGljIHZvaWQgcGVyZl9vdXRwdXRfbG9jayhzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhID0gaGFuZGxlLT5kYXRhOworCWludCBjcHU7CisKKwloYW5kbGUtPmxvY2tlZCA9IDA7CisKKwlsb2NhbF9pcnFfc2F2ZShoYW5kbGUtPmZsYWdzKTsKKwljcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7CisKKwlpZiAoaW5fbm1pKCkgJiYgYXRvbWljX3JlYWQoJmRhdGEtPmxvY2spID09IGNwdSkKKwkJcmV0dXJuOworCisJd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZkYXRhLT5sb2NrLCAtMSwgY3B1KSAhPSAtMSkKKwkJY3B1X3JlbGF4KCk7CisKKwloYW5kbGUtPmxvY2tlZCA9IDE7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfb3V0cHV0X3VubG9jayhzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUpCit7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhID0gaGFuZGxlLT5kYXRhOworCXVuc2lnbmVkIGxvbmcgaGVhZDsKKwlpbnQgY3B1OworCisJZGF0YS0+ZG9uZV9oZWFkID0gZGF0YS0+aGVhZDsKKworCWlmICghaGFuZGxlLT5sb2NrZWQpCisJCWdvdG8gb3V0OworCithZ2FpbjoKKwkvKgorCSAqIFRoZSB4Y2hnIGltcGxpZXMgYSBmdWxsIGJhcnJpZXIgdGhhdCBlbnN1cmVzIGFsbCB3cml0ZXMgYXJlIGRvbmUKKwkgKiBiZWZvcmUgd2UgcHVibGlzaCB0aGUgbmV3IGhlYWQsIG1hdGNoZWQgYnkgYSBybWIoKSBpbiB1c2Vyc3BhY2Ugd2hlbgorCSAqIHJlYWRpbmcgdGhpcyBwb3NpdGlvbi4KKwkgKi8KKwl3aGlsZSAoKGhlYWQgPSBhdG9taWNfbG9uZ194Y2hnKCZkYXRhLT5kb25lX2hlYWQsIDApKSkKKwkJZGF0YS0+dXNlcl9wYWdlLT5kYXRhX2hlYWQgPSBoZWFkOworCisJLyoKKwkgKiBOTUkgY2FuIGhhcHBlbiBoZXJlLCB3aGljaCBtZWFucyB3ZSBjYW4gbWlzcyBhIGRvbmVfaGVhZCB1cGRhdGUuCisJICovCisKKwljcHUgPSBhdG9taWNfeGNoZygmZGF0YS0+bG9jaywgLTEpOworCVdBUk5fT05fT05DRShjcHUgIT0gc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKworCS8qCisJICogVGhlcmVmb3JlIHdlIGhhdmUgdG8gdmFsaWRhdGUgd2UgZGlkIG5vdCBpbmRlZWQgZG8gc28uCisJICovCisJaWYgKHVubGlrZWx5KGF0b21pY19sb25nX3JlYWQoJmRhdGEtPmRvbmVfaGVhZCkpKSB7CisJCS8qCisJCSAqIFNpbmNlIHdlIGhhZCBpdCBsb2NrZWQsIHdlIGNhbiBsb2NrIGl0IGFnYWluLgorCQkgKi8KKwkJd2hpbGUgKGF0b21pY19jbXB4Y2hnKCZkYXRhLT5sb2NrLCAtMSwgY3B1KSAhPSAtMSkKKwkJCWNwdV9yZWxheCgpOworCisJCWdvdG8gYWdhaW47CisJfQorCisJaWYgKGF0b21pY194Y2hnKCZkYXRhLT53YWtldXAsIDApKQorCQlwZXJmX291dHB1dF93YWtldXAoaGFuZGxlKTsKK291dDoKKwlsb2NhbF9pcnFfcmVzdG9yZShoYW5kbGUtPmZsYWdzKTsKK30KKworc3RhdGljIGludCBwZXJmX291dHB1dF9iZWdpbihzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlICpoYW5kbGUsCisJCQkgICAgIHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIHVuc2lnbmVkIGludCBzaXplLAorCQkJICAgICBpbnQgbm1pLCBpbnQgb3ZlcmZsb3cpCit7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhOworCXVuc2lnbmVkIGludCBvZmZzZXQsIGhlYWQ7CisKKwkvKgorCSAqIEZvciBpbmhlcml0ZWQgY291bnRlcnMgd2Ugc2VuZCBhbGwgdGhlIG91dHB1dCB0b3dhcmRzIHRoZSBwYXJlbnQuCisJICovCisJaWYgKGNvdW50ZXItPnBhcmVudCkKKwkJY291bnRlciA9IGNvdW50ZXItPnBhcmVudDsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlkYXRhID0gcmN1X2RlcmVmZXJlbmNlKGNvdW50ZXItPmRhdGEpOworCWlmICghZGF0YSkKKwkJZ290byBvdXQ7CisKKwloYW5kbGUtPmRhdGEJID0gZGF0YTsKKwloYW5kbGUtPmNvdW50ZXIJID0gY291bnRlcjsKKwloYW5kbGUtPm5taQkgPSBubWk7CisJaGFuZGxlLT5vdmVyZmxvdyA9IG92ZXJmbG93OworCisJaWYgKCFkYXRhLT5ucl9wYWdlcykKKwkJZ290byBmYWlsOworCisJcGVyZl9vdXRwdXRfbG9jayhoYW5kbGUpOworCisJZG8geworCQlvZmZzZXQgPSBoZWFkID0gYXRvbWljX2xvbmdfcmVhZCgmZGF0YS0+aGVhZCk7CisJCWhlYWQgKz0gc2l6ZTsKKwl9IHdoaWxlIChhdG9taWNfbG9uZ19jbXB4Y2hnKCZkYXRhLT5oZWFkLCBvZmZzZXQsIGhlYWQpICE9IG9mZnNldCk7CisKKwloYW5kbGUtPm9mZnNldAk9IG9mZnNldDsKKwloYW5kbGUtPmhlYWQJPSBoZWFkOworCisJaWYgKChvZmZzZXQgPj4gUEFHRV9TSElGVCkgIT0gKGhlYWQgPj4gUEFHRV9TSElGVCkpCisJCWF0b21pY19zZXQoJmRhdGEtPndha2V1cCwgMSk7CisKKwlyZXR1cm4gMDsKKworZmFpbDoKKwlwZXJmX291dHB1dF93YWtldXAoaGFuZGxlKTsKK291dDoKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCXJldHVybiAtRU5PU1BDOworfQorCitzdGF0aWMgdm9pZCBwZXJmX291dHB1dF9jb3B5KHN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgKmhhbmRsZSwKKwkJCSAgICAgY29uc3Qgdm9pZCAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCXVuc2lnbmVkIGludCBwYWdlc19tYXNrOworCXVuc2lnbmVkIGludCBvZmZzZXQ7CisJdW5zaWduZWQgaW50IHNpemU7CisJdm9pZCAqKnBhZ2VzOworCisJb2Zmc2V0CQk9IGhhbmRsZS0+b2Zmc2V0OworCXBhZ2VzX21hc2sJPSBoYW5kbGUtPmRhdGEtPm5yX3BhZ2VzIC0gMTsKKwlwYWdlcwkJPSBoYW5kbGUtPmRhdGEtPmRhdGFfcGFnZXM7CisKKwlkbyB7CisJCXVuc2lnbmVkIGludCBwYWdlX29mZnNldDsKKwkJaW50IG5yOworCisJCW5yCSAgICA9IChvZmZzZXQgPj4gUEFHRV9TSElGVCkgJiBwYWdlc19tYXNrOworCQlwYWdlX29mZnNldCA9IG9mZnNldCAmIChQQUdFX1NJWkUgLSAxKTsKKwkJc2l6ZQkgICAgPSBtaW5fdCh1bnNpZ25lZCBpbnQsIFBBR0VfU0laRSAtIHBhZ2Vfb2Zmc2V0LCBsZW4pOworCisJCW1lbWNweShwYWdlc1tucl0gKyBwYWdlX29mZnNldCwgYnVmLCBzaXplKTsKKworCQlsZW4JICAgIC09IHNpemU7CisJCWJ1ZgkgICAgKz0gc2l6ZTsKKwkJb2Zmc2V0CSAgICArPSBzaXplOworCX0gd2hpbGUgKGxlbik7CisKKwloYW5kbGUtPm9mZnNldCA9IG9mZnNldDsKKworCS8qCisJICogQ2hlY2sgd2UgZGlkbid0IGNvcHkgcGFzdCBvdXIgcmVzZXJ2YXRpb24gd2luZG93LCB0YWtpbmcgdGhlCisJICogcG9zc2libGUgdW5zaWduZWQgaW50IHdyYXAgaW50byBhY2NvdW50LgorCSAqLworCVdBUk5fT05fT05DRSgoKGxvbmcpKGhhbmRsZS0+aGVhZCAtIGhhbmRsZS0+b2Zmc2V0KSkgPCAwKTsKK30KKworI2RlZmluZSBwZXJmX291dHB1dF9wdXQoaGFuZGxlLCB4KSBcCisJcGVyZl9vdXRwdXRfY29weSgoaGFuZGxlKSwgJih4KSwgc2l6ZW9mKHgpKQorCitzdGF0aWMgdm9pZCBwZXJmX291dHB1dF9lbmQoc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSAqaGFuZGxlKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIgPSBoYW5kbGUtPmNvdW50ZXI7CisJc3RydWN0IHBlcmZfbW1hcF9kYXRhICpkYXRhID0gaGFuZGxlLT5kYXRhOworCisJaW50IHdha2V1cF9ldmVudHMgPSBjb3VudGVyLT5hdHRyLndha2V1cF9ldmVudHM7CisKKwlpZiAoaGFuZGxlLT5vdmVyZmxvdyAmJiB3YWtldXBfZXZlbnRzKSB7CisJCWludCBldmVudHMgPSBhdG9taWNfaW5jX3JldHVybigmZGF0YS0+ZXZlbnRzKTsKKwkJaWYgKGV2ZW50cyA+PSB3YWtldXBfZXZlbnRzKSB7CisJCQlhdG9taWNfc3ViKHdha2V1cF9ldmVudHMsICZkYXRhLT5ldmVudHMpOworCQkJYXRvbWljX3NldCgmZGF0YS0+d2FrZXVwLCAxKTsKKwkJfQorCX0KKworCXBlcmZfb3V0cHV0X3VubG9jayhoYW5kbGUpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgdTMyIHBlcmZfY291bnRlcl9waWQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgc3RydWN0IHRhc2tfc3RydWN0ICpwKQoreworCS8qCisJICogb25seSB0b3AgbGV2ZWwgY291bnRlcnMgaGF2ZSB0aGUgcGlkIG5hbWVzcGFjZSB0aGV5IHdlcmUgY3JlYXRlZCBpbgorCSAqLworCWlmIChjb3VudGVyLT5wYXJlbnQpCisJCWNvdW50ZXIgPSBjb3VudGVyLT5wYXJlbnQ7CisKKwlyZXR1cm4gdGFza190Z2lkX25yX25zKHAsIGNvdW50ZXItPm5zKTsKK30KKworc3RhdGljIHUzMiBwZXJmX2NvdW50ZXJfdGlkKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwkvKgorCSAqIG9ubHkgdG9wIGxldmVsIGNvdW50ZXJzIGhhdmUgdGhlIHBpZCBuYW1lc3BhY2UgdGhleSB3ZXJlIGNyZWF0ZWQgaW4KKwkgKi8KKwlpZiAoY291bnRlci0+cGFyZW50KQorCQljb3VudGVyID0gY291bnRlci0+cGFyZW50OworCisJcmV0dXJuIHRhc2tfcGlkX25yX25zKHAsIGNvdW50ZXItPm5zKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX291dHB1dChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCBpbnQgbm1pLAorCQkJCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhICpkYXRhKQoreworCWludCByZXQ7CisJdTY0IHNhbXBsZV90eXBlID0gY291bnRlci0+YXR0ci5zYW1wbGVfdHlwZTsKKwlzdHJ1Y3QgcGVyZl9vdXRwdXRfaGFuZGxlIGhhbmRsZTsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCXU2NCBpcDsKKwlzdHJ1Y3QgeworCQl1MzIgcGlkLCB0aWQ7CisJfSB0aWRfZW50cnk7CisJc3RydWN0IHsKKwkJdTY0IGlkOworCQl1NjQgY291bnRlcjsKKwl9IGdyb3VwX2VudHJ5OworCXN0cnVjdCBwZXJmX2NhbGxjaGFpbl9lbnRyeSAqY2FsbGNoYWluID0gTlVMTDsKKwlpbnQgY2FsbGNoYWluX3NpemUgPSAwOworCXU2NCB0aW1lOworCXN0cnVjdCB7CisJCXUzMiBjcHUsIHJlc2VydmVkOworCX0gY3B1X2VudHJ5OworCisJaGVhZGVyLnR5cGUgPSAwOworCWhlYWRlci5zaXplID0gc2l6ZW9mKGhlYWRlcik7CisKKwloZWFkZXIubWlzYyA9IFBFUkZfRVZFTlRfTUlTQ19PVkVSRkxPVzsKKwloZWFkZXIubWlzYyB8PSBwZXJmX21pc2NfZmxhZ3MoZGF0YS0+cmVncyk7CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9JUCkgeworCQlpcCA9IHBlcmZfaW5zdHJ1Y3Rpb25fcG9pbnRlcihkYXRhLT5yZWdzKTsKKwkJaGVhZGVyLnR5cGUgfD0gUEVSRl9TQU1QTEVfSVA7CisJCWhlYWRlci5zaXplICs9IHNpemVvZihpcCk7CisJfQorCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElEKSB7CisJCS8qIG5hbWVzcGFjZSBpc3N1ZXMgKi8KKwkJdGlkX2VudHJ5LnBpZCA9IHBlcmZfY291bnRlcl9waWQoY291bnRlciwgY3VycmVudCk7CisJCXRpZF9lbnRyeS50aWQgPSBwZXJmX2NvdW50ZXJfdGlkKGNvdW50ZXIsIGN1cnJlbnQpOworCisJCWhlYWRlci50eXBlIHw9IFBFUkZfU0FNUExFX1RJRDsKKwkJaGVhZGVyLnNpemUgKz0gc2l6ZW9mKHRpZF9lbnRyeSk7CisJfQorCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfVElNRSkgeworCQkvKgorCQkgKiBNYXliZSBkbyBiZXR0ZXIgb24geDg2IGFuZCBwcm92aWRlIGNwdV9jbG9ja19ubWkoKQorCQkgKi8KKwkJdGltZSA9IHNjaGVkX2Nsb2NrKCk7CisKKwkJaGVhZGVyLnR5cGUgfD0gUEVSRl9TQU1QTEVfVElNRTsKKwkJaGVhZGVyLnNpemUgKz0gc2l6ZW9mKHU2NCk7CisJfQorCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQUREUikgeworCQloZWFkZXIudHlwZSB8PSBQRVJGX1NBTVBMRV9BRERSOworCQloZWFkZXIuc2l6ZSArPSBzaXplb2YodTY0KTsKKwl9CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9JRCkgeworCQloZWFkZXIudHlwZSB8PSBQRVJGX1NBTVBMRV9JRDsKKwkJaGVhZGVyLnNpemUgKz0gc2l6ZW9mKHU2NCk7CisJfQorCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfQ1BVKSB7CisJCWhlYWRlci50eXBlIHw9IFBFUkZfU0FNUExFX0NQVTsKKwkJaGVhZGVyLnNpemUgKz0gc2l6ZW9mKGNwdV9lbnRyeSk7CisKKwkJY3B1X2VudHJ5LmNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CisJfQorCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUEVSSU9EKSB7CisJCWhlYWRlci50eXBlIHw9IFBFUkZfU0FNUExFX1BFUklPRDsKKwkJaGVhZGVyLnNpemUgKz0gc2l6ZW9mKHU2NCk7CisJfQorCisJaWYgKHNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfR1JPVVApIHsKKwkJaGVhZGVyLnR5cGUgfD0gUEVSRl9TQU1QTEVfR1JPVVA7CisJCWhlYWRlci5zaXplICs9IHNpemVvZih1NjQpICsKKwkJCWNvdW50ZXItPm5yX3NpYmxpbmdzICogc2l6ZW9mKGdyb3VwX2VudHJ5KTsKKwl9CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9DQUxMQ0hBSU4pIHsKKwkJY2FsbGNoYWluID0gcGVyZl9jYWxsY2hhaW4oZGF0YS0+cmVncyk7CisKKwkJaWYgKGNhbGxjaGFpbikgeworCQkJY2FsbGNoYWluX3NpemUgPSAoMSArIGNhbGxjaGFpbi0+bnIpICogc2l6ZW9mKHU2NCk7CisKKwkJCWhlYWRlci50eXBlIHw9IFBFUkZfU0FNUExFX0NBTExDSEFJTjsKKwkJCWhlYWRlci5zaXplICs9IGNhbGxjaGFpbl9zaXplOworCQl9CisJfQorCisJcmV0ID0gcGVyZl9vdXRwdXRfYmVnaW4oJmhhbmRsZSwgY291bnRlciwgaGVhZGVyLnNpemUsIG5taSwgMSk7CisJaWYgKHJldCkKKwkJcmV0dXJuOworCisJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIGhlYWRlcik7CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9JUCkKKwkJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIGlwKTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX1RJRCkKKwkJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIHRpZF9lbnRyeSk7CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9USU1FKQorCQlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgdGltZSk7CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9BRERSKQorCQlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgZGF0YS0+YWRkcik7CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9JRCkKKwkJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIGNvdW50ZXItPmlkKTsKKworCWlmIChzYW1wbGVfdHlwZSAmIFBFUkZfU0FNUExFX0NQVSkKKwkJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIGNwdV9lbnRyeSk7CisKKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9QRVJJT0QpCisJCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCBkYXRhLT5wZXJpb2QpOworCisJLyoKKwkgKiBYWFggUEVSRl9TQU1QTEVfR1JPVVAgdnMgaW5oZXJpdGVkIGNvdW50ZXJzIHNlZW1zIGRpZmZpY3VsdC4KKwkgKi8KKwlpZiAoc2FtcGxlX3R5cGUgJiBQRVJGX1NBTVBMRV9HUk9VUCkgeworCQlzdHJ1Y3QgcGVyZl9jb3VudGVyICpsZWFkZXIsICpzdWI7CisJCXU2NCBuciA9IGNvdW50ZXItPm5yX3NpYmxpbmdzOworCisJCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCBucik7CisKKwkJbGVhZGVyID0gY291bnRlci0+Z3JvdXBfbGVhZGVyOworCQlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YiwgJmxlYWRlci0+c2libGluZ19saXN0LCBsaXN0X2VudHJ5KSB7CisJCQlpZiAoc3ViICE9IGNvdW50ZXIpCisJCQkJc3ViLT5wbXUtPnJlYWQoc3ViKTsKKworCQkJZ3JvdXBfZW50cnkuaWQgPSBzdWItPmlkOworCQkJZ3JvdXBfZW50cnkuY291bnRlciA9IGF0b21pYzY0X3JlYWQoJnN1Yi0+Y291bnQpOworCisJCQlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgZ3JvdXBfZW50cnkpOworCQl9CisJfQorCisJaWYgKGNhbGxjaGFpbikKKwkJcGVyZl9vdXRwdXRfY29weSgmaGFuZGxlLCBjYWxsY2hhaW4sIGNhbGxjaGFpbl9zaXplKTsKKworCXBlcmZfb3V0cHV0X2VuZCgmaGFuZGxlKTsKK30KKworLyoKKyAqIGZvcmsgdHJhY2tpbmcKKyAqLworCitzdHJ1Y3QgcGVyZl9mb3JrX2V2ZW50IHsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QJKnRhc2s7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCisJCXUzMgkJCQlwaWQ7CisJCXUzMgkJCQlwcGlkOworCX0gZXZlbnQ7Cit9OworCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfZm9ya19vdXRwdXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCQkgICAgIHN0cnVjdCBwZXJmX2ZvcmtfZXZlbnQgKmZvcmtfZXZlbnQpCit7CisJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSBoYW5kbGU7CisJaW50IHNpemUgPSBmb3JrX2V2ZW50LT5ldmVudC5oZWFkZXIuc2l6ZTsKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2sgPSBmb3JrX2V2ZW50LT50YXNrOworCWludCByZXQgPSBwZXJmX291dHB1dF9iZWdpbigmaGFuZGxlLCBjb3VudGVyLCBzaXplLCAwLCAwKTsKKworCWlmIChyZXQpCisJCXJldHVybjsKKworCWZvcmtfZXZlbnQtPmV2ZW50LnBpZCA9IHBlcmZfY291bnRlcl9waWQoY291bnRlciwgdGFzayk7CisJZm9ya19ldmVudC0+ZXZlbnQucHBpZCA9IHBlcmZfY291bnRlcl9waWQoY291bnRlciwgdGFzay0+cmVhbF9wYXJlbnQpOworCisJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIGZvcmtfZXZlbnQtPmV2ZW50KTsKKwlwZXJmX291dHB1dF9lbmQoJmhhbmRsZSk7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9jb3VudGVyX2ZvcmtfbWF0Y2goc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlpZiAoY291bnRlci0+YXR0ci5jb21tIHx8IGNvdW50ZXItPmF0dHIubW1hcCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2ZvcmtfY3R4KHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4LAorCQkJCSAgc3RydWN0IHBlcmZfZm9ya19ldmVudCAqZm9ya19ldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJaWYgKHN5c3RlbV9zdGF0ZSAhPSBTWVNURU1fUlVOTklORyB8fCBsaXN0X2VtcHR5KCZjdHgtPmV2ZW50X2xpc3QpKQorCQlyZXR1cm47CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY291bnRlciwgJmN0eC0+ZXZlbnRfbGlzdCwgZXZlbnRfZW50cnkpIHsKKwkJaWYgKHBlcmZfY291bnRlcl9mb3JrX21hdGNoKGNvdW50ZXIpKQorCQkJcGVyZl9jb3VudGVyX2Zvcmtfb3V0cHV0KGNvdW50ZXIsIGZvcmtfZXZlbnQpOworCX0KKwlyY3VfcmVhZF91bmxvY2soKTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9jb3VudGVyX2ZvcmtfZXZlbnQoc3RydWN0IHBlcmZfZm9ya19ldmVudCAqZm9ya19ldmVudCkKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4OworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4OworCisJY3B1Y3R4ID0gJmdldF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCXBlcmZfY291bnRlcl9mb3JrX2N0eCgmY3B1Y3R4LT5jdHgsIGZvcmtfZXZlbnQpOworCXB1dF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCisJcmN1X3JlYWRfbG9jaygpOworCS8qCisJICogZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoaWNoIG9mIHRoZSBjaGlsZCBjb250ZXh0cyB0aGUKKwkgKiBldmVudHMgZW5kcyB1cCBpbi4KKwkgKi8KKwljdHggPSByY3VfZGVyZWZlcmVuY2UoY3VycmVudC0+cGVyZl9jb3VudGVyX2N0eHApOworCWlmIChjdHgpCisJCXBlcmZfY291bnRlcl9mb3JrX2N0eChjdHgsIGZvcmtfZXZlbnQpOworCXJjdV9yZWFkX3VubG9jaygpOworfQorCit2b2lkIHBlcmZfY291bnRlcl9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaykKK3sKKwlzdHJ1Y3QgcGVyZl9mb3JrX2V2ZW50IGZvcmtfZXZlbnQ7CisKKwlpZiAoIWF0b21pY19yZWFkKCZucl9jb21tX2NvdW50ZXJzKSAmJgorCSAgICAhYXRvbWljX3JlYWQoJm5yX21tYXBfY291bnRlcnMpKQorCQlyZXR1cm47CisKKwlmb3JrX2V2ZW50ID0gKHN0cnVjdCBwZXJmX2ZvcmtfZXZlbnQpeworCQkudGFzawk9IHRhc2ssCisJCS5ldmVudCAgPSB7CisJCQkuaGVhZGVyID0geworCQkJCS50eXBlID0gUEVSRl9FVkVOVF9GT1JLLAorCQkJCS5zaXplID0gc2l6ZW9mKGZvcmtfZXZlbnQuZXZlbnQpLAorCQkJfSwKKwkJfSwKKwl9OworCisJcGVyZl9jb3VudGVyX2ZvcmtfZXZlbnQoJmZvcmtfZXZlbnQpOworfQorCisvKgorICogY29tbSB0cmFja2luZworICovCisKK3N0cnVjdCBwZXJmX2NvbW1fZXZlbnQgeworCXN0cnVjdCB0YXNrX3N0cnVjdAkqdGFzazsKKwljaGFyCQkJKmNvbW07CisJaW50CQkJY29tbV9zaXplOworCisJc3RydWN0IHsKKwkJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKworCQl1MzIJCQkJcGlkOworCQl1MzIJCQkJdGlkOworCX0gZXZlbnQ7Cit9OworCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfY29tbV9vdXRwdXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCQkgICAgIHN0cnVjdCBwZXJmX2NvbW1fZXZlbnQgKmNvbW1fZXZlbnQpCit7CisJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSBoYW5kbGU7CisJaW50IHNpemUgPSBjb21tX2V2ZW50LT5ldmVudC5oZWFkZXIuc2l6ZTsKKwlpbnQgcmV0ID0gcGVyZl9vdXRwdXRfYmVnaW4oJmhhbmRsZSwgY291bnRlciwgc2l6ZSwgMCwgMCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwljb21tX2V2ZW50LT5ldmVudC5waWQgPSBwZXJmX2NvdW50ZXJfcGlkKGNvdW50ZXIsIGNvbW1fZXZlbnQtPnRhc2spOworCWNvbW1fZXZlbnQtPmV2ZW50LnRpZCA9IHBlcmZfY291bnRlcl90aWQoY291bnRlciwgY29tbV9ldmVudC0+dGFzayk7CisKKwlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgY29tbV9ldmVudC0+ZXZlbnQpOworCXBlcmZfb3V0cHV0X2NvcHkoJmhhbmRsZSwgY29tbV9ldmVudC0+Y29tbSwKKwkJCQkgICBjb21tX2V2ZW50LT5jb21tX3NpemUpOworCXBlcmZfb3V0cHV0X2VuZCgmaGFuZGxlKTsKK30KKworc3RhdGljIGludCBwZXJmX2NvdW50ZXJfY29tbV9tYXRjaChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWlmIChjb3VudGVyLT5hdHRyLmNvbW0pCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9jb21tX2N0eChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCwKKwkJCQkgIHN0cnVjdCBwZXJmX2NvbW1fZXZlbnQgKmNvbW1fZXZlbnQpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKworCWlmIChzeXN0ZW1fc3RhdGUgIT0gU1lTVEVNX1JVTk5JTkcgfHwgbGlzdF9lbXB0eSgmY3R4LT5ldmVudF9saXN0KSkKKwkJcmV0dXJuOworCisJcmN1X3JlYWRfbG9jaygpOworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvdW50ZXIsICZjdHgtPmV2ZW50X2xpc3QsIGV2ZW50X2VudHJ5KSB7CisJCWlmIChwZXJmX2NvdW50ZXJfY29tbV9tYXRjaChjb3VudGVyKSkKKwkJCXBlcmZfY291bnRlcl9jb21tX291dHB1dChjb3VudGVyLCBjb21tX2V2ZW50KTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9jb21tX2V2ZW50KHN0cnVjdCBwZXJmX2NvbW1fZXZlbnQgKmNvbW1fZXZlbnQpCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eDsKKwl1bnNpZ25lZCBpbnQgc2l6ZTsKKwljaGFyICpjb21tID0gY29tbV9ldmVudC0+dGFzay0+Y29tbTsKKworCXNpemUgPSBBTElHTihzdHJsZW4oY29tbSkrMSwgc2l6ZW9mKHU2NCkpOworCisJY29tbV9ldmVudC0+Y29tbSA9IGNvbW07CisJY29tbV9ldmVudC0+Y29tbV9zaXplID0gc2l6ZTsKKworCWNvbW1fZXZlbnQtPmV2ZW50LmhlYWRlci5zaXplID0gc2l6ZW9mKGNvbW1fZXZlbnQtPmV2ZW50KSArIHNpemU7CisKKwljcHVjdHggPSAmZ2V0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisJcGVyZl9jb3VudGVyX2NvbW1fY3R4KCZjcHVjdHgtPmN0eCwgY29tbV9ldmVudCk7CisJcHV0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJLyoKKwkgKiBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgd2hpY2ggb2YgdGhlIGNoaWxkIGNvbnRleHRzIHRoZQorCSAqIGV2ZW50cyBlbmRzIHVwIGluLgorCSAqLworCWN0eCA9IHJjdV9kZXJlZmVyZW5jZShjdXJyZW50LT5wZXJmX2NvdW50ZXJfY3R4cCk7CisJaWYgKGN0eCkKKwkJcGVyZl9jb3VudGVyX2NvbW1fY3R4KGN0eCwgY29tbV9ldmVudCk7CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3ZvaWQgcGVyZl9jb3VudGVyX2NvbW0oc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCBwZXJmX2NvbW1fZXZlbnQgY29tbV9ldmVudDsKKworCWlmICghYXRvbWljX3JlYWQoJm5yX2NvbW1fY291bnRlcnMpKQorCQlyZXR1cm47CisKKwljb21tX2V2ZW50ID0gKHN0cnVjdCBwZXJmX2NvbW1fZXZlbnQpeworCQkudGFzawk9IHRhc2ssCisJCS5ldmVudCAgPSB7CisJCQkuaGVhZGVyID0geyAudHlwZSA9IFBFUkZfRVZFTlRfQ09NTSwgfSwKKwkJfSwKKwl9OworCisJcGVyZl9jb3VudGVyX2NvbW1fZXZlbnQoJmNvbW1fZXZlbnQpOworfQorCisvKgorICogbW1hcCB0cmFja2luZworICovCisKK3N0cnVjdCBwZXJmX21tYXBfZXZlbnQgeworCXN0cnVjdCB2bV9hcmVhX3N0cnVjdAkqdm1hOworCisJY29uc3QgY2hhcgkJKmZpbGVfbmFtZTsKKwlpbnQJCQlmaWxlX3NpemU7CisKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCisJCXUzMgkJCQlwaWQ7CisJCXUzMgkJCQl0aWQ7CisJCXU2NAkJCQlzdGFydDsKKwkJdTY0CQkJCWxlbjsKKwkJdTY0CQkJCXBnb2ZmOworCX0gZXZlbnQ7Cit9OworCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfbW1hcF9vdXRwdXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCQkgICAgIHN0cnVjdCBwZXJmX21tYXBfZXZlbnQgKm1tYXBfZXZlbnQpCit7CisJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSBoYW5kbGU7CisJaW50IHNpemUgPSBtbWFwX2V2ZW50LT5ldmVudC5oZWFkZXIuc2l6ZTsKKwlpbnQgcmV0ID0gcGVyZl9vdXRwdXRfYmVnaW4oJmhhbmRsZSwgY291bnRlciwgc2l6ZSwgMCwgMCk7CisKKwlpZiAocmV0KQorCQlyZXR1cm47CisKKwltbWFwX2V2ZW50LT5ldmVudC5waWQgPSBwZXJmX2NvdW50ZXJfcGlkKGNvdW50ZXIsIGN1cnJlbnQpOworCW1tYXBfZXZlbnQtPmV2ZW50LnRpZCA9IHBlcmZfY291bnRlcl90aWQoY291bnRlciwgY3VycmVudCk7CisKKwlwZXJmX291dHB1dF9wdXQoJmhhbmRsZSwgbW1hcF9ldmVudC0+ZXZlbnQpOworCXBlcmZfb3V0cHV0X2NvcHkoJmhhbmRsZSwgbW1hcF9ldmVudC0+ZmlsZV9uYW1lLAorCQkJCSAgIG1tYXBfZXZlbnQtPmZpbGVfc2l6ZSk7CisJcGVyZl9vdXRwdXRfZW5kKCZoYW5kbGUpOworfQorCitzdGF0aWMgaW50IHBlcmZfY291bnRlcl9tbWFwX21hdGNoKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsCisJCQkJICAgc3RydWN0IHBlcmZfbW1hcF9ldmVudCAqbW1hcF9ldmVudCkKK3sKKwlpZiAoY291bnRlci0+YXR0ci5tbWFwKQorCQlyZXR1cm4gMTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfbW1hcF9jdHgoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsCisJCQkJICBzdHJ1Y3QgcGVyZl9tbWFwX2V2ZW50ICptbWFwX2V2ZW50KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisKKwlpZiAoc3lzdGVtX3N0YXRlICE9IFNZU1RFTV9SVU5OSU5HIHx8IGxpc3RfZW1wdHkoJmN0eC0+ZXZlbnRfbGlzdCkpCisJCXJldHVybjsKKworCXJjdV9yZWFkX2xvY2soKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JjdShjb3VudGVyLCAmY3R4LT5ldmVudF9saXN0LCBldmVudF9lbnRyeSkgeworCQlpZiAocGVyZl9jb3VudGVyX21tYXBfbWF0Y2goY291bnRlciwgbW1hcF9ldmVudCkpCisJCQlwZXJmX2NvdW50ZXJfbW1hcF9vdXRwdXQoY291bnRlciwgbW1hcF9ldmVudCk7CisJfQorCXJjdV9yZWFkX3VubG9jaygpOworfQorCitzdGF0aWMgdm9pZCBwZXJmX2NvdW50ZXJfbW1hcF9ldmVudChzdHJ1Y3QgcGVyZl9tbWFwX2V2ZW50ICptbWFwX2V2ZW50KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHg7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisJc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEgPSBtbWFwX2V2ZW50LT52bWE7CisJc3RydWN0IGZpbGUgKmZpbGUgPSB2bWEtPnZtX2ZpbGU7CisJdW5zaWduZWQgaW50IHNpemU7CisJY2hhciB0bXBbMTZdOworCWNoYXIgKmJ1ZiA9IE5VTEw7CisJY29uc3QgY2hhciAqbmFtZTsKKworCWlmIChmaWxlKSB7CisJCWJ1ZiA9IGt6YWxsb2MoUEFUSF9NQVgsIEdGUF9LRVJORUwpOworCQlpZiAoIWJ1ZikgeworCQkJbmFtZSA9IHN0cm5jcHkodG1wLCAiLy9lbm9tZW0iLCBzaXplb2YodG1wKSk7CisJCQlnb3RvIGdvdF9uYW1lOworCQl9CisJCW5hbWUgPSBkX3BhdGgoJmZpbGUtPmZfcGF0aCwgYnVmLCBQQVRIX01BWCk7CisJCWlmIChJU19FUlIobmFtZSkpIHsKKwkJCW5hbWUgPSBzdHJuY3B5KHRtcCwgIi8vdG9vbG9uZyIsIHNpemVvZih0bXApKTsKKwkJCWdvdG8gZ290X25hbWU7CisJCX0KKwl9IGVsc2UgeworCQluYW1lID0gYXJjaF92bWFfbmFtZShtbWFwX2V2ZW50LT52bWEpOworCQlpZiAobmFtZSkKKwkJCWdvdG8gZ290X25hbWU7CisKKwkJaWYgKCF2bWEtPnZtX21tKSB7CisJCQluYW1lID0gc3RybmNweSh0bXAsICJbdmRzb10iLCBzaXplb2YodG1wKSk7CisJCQlnb3RvIGdvdF9uYW1lOworCQl9CisKKwkJbmFtZSA9IHN0cm5jcHkodG1wLCAiLy9hbm9uIiwgc2l6ZW9mKHRtcCkpOworCQlnb3RvIGdvdF9uYW1lOworCX0KKworZ290X25hbWU6CisJc2l6ZSA9IEFMSUdOKHN0cmxlbihuYW1lKSsxLCBzaXplb2YodTY0KSk7CisKKwltbWFwX2V2ZW50LT5maWxlX25hbWUgPSBuYW1lOworCW1tYXBfZXZlbnQtPmZpbGVfc2l6ZSA9IHNpemU7CisKKwltbWFwX2V2ZW50LT5ldmVudC5oZWFkZXIuc2l6ZSA9IHNpemVvZihtbWFwX2V2ZW50LT5ldmVudCkgKyBzaXplOworCisJY3B1Y3R4ID0gJmdldF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCXBlcmZfY291bnRlcl9tbWFwX2N0eCgmY3B1Y3R4LT5jdHgsIG1tYXBfZXZlbnQpOworCXB1dF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworCisJcmN1X3JlYWRfbG9jaygpOworCS8qCisJICogZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoaWNoIG9mIHRoZSBjaGlsZCBjb250ZXh0cyB0aGUKKwkgKiBldmVudHMgZW5kcyB1cCBpbi4KKwkgKi8KKwljdHggPSByY3VfZGVyZWZlcmVuY2UoY3VycmVudC0+cGVyZl9jb3VudGVyX2N0eHApOworCWlmIChjdHgpCisJCXBlcmZfY291bnRlcl9tbWFwX2N0eChjdHgsIG1tYXBfZXZlbnQpOworCXJjdV9yZWFkX3VubG9jaygpOworCisJa2ZyZWUoYnVmKTsKK30KKwordm9pZCBfX3BlcmZfY291bnRlcl9tbWFwKHN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hKQoreworCXN0cnVjdCBwZXJmX21tYXBfZXZlbnQgbW1hcF9ldmVudDsKKworCWlmICghYXRvbWljX3JlYWQoJm5yX21tYXBfY291bnRlcnMpKQorCQlyZXR1cm47CisKKwltbWFwX2V2ZW50ID0gKHN0cnVjdCBwZXJmX21tYXBfZXZlbnQpeworCQkudm1hCT0gdm1hLAorCQkuZXZlbnQgID0geworCQkJLmhlYWRlciA9IHsgLnR5cGUgPSBQRVJGX0VWRU5UX01NQVAsIH0sCisJCQkuc3RhcnQgID0gdm1hLT52bV9zdGFydCwKKwkJCS5sZW4gICAgPSB2bWEtPnZtX2VuZCAtIHZtYS0+dm1fc3RhcnQsCisJCQkucGdvZmYgID0gdm1hLT52bV9wZ29mZiwKKwkJfSwKKwl9OworCisJcGVyZl9jb3VudGVyX21tYXBfZXZlbnQoJm1tYXBfZXZlbnQpOworfQorCisvKgorICogTG9nIHNhbXBsZV9wZXJpb2QgY2hhbmdlcyBzbyB0aGF0IGFuYWx5emluZyB0b29scyBjYW4gcmUtbm9ybWFsaXplIHRoZQorICogZXZlbnQgZmxvdy4KKyAqLworCitzdHJ1Y3QgZnJlcV9ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwl1NjQJCQkJdGltZTsKKwl1NjQJCQkJaWQ7CisJdTY0CQkJCXBlcmlvZDsKK307CisKK3N0YXRpYyB2b2lkIHBlcmZfbG9nX3BlcmlvZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCB1NjQgcGVyaW9kKQoreworCXN0cnVjdCBwZXJmX291dHB1dF9oYW5kbGUgaGFuZGxlOworCXN0cnVjdCBmcmVxX2V2ZW50IGV2ZW50OworCWludCByZXQ7CisKKwlpZiAoY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZCA9PSBwZXJpb2QpCisJCXJldHVybjsKKworCWlmIChjb3VudGVyLT5hdHRyLnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfUEVSSU9EKQorCQlyZXR1cm47CisKKwlldmVudCA9IChzdHJ1Y3QgZnJlcV9ldmVudCkgeworCQkuaGVhZGVyID0geworCQkJLnR5cGUgPSBQRVJGX0VWRU5UX1BFUklPRCwKKwkJCS5taXNjID0gMCwKKwkJCS5zaXplID0gc2l6ZW9mKGV2ZW50KSwKKwkJfSwKKwkJLnRpbWUgPSBzY2hlZF9jbG9jaygpLAorCQkuaWQgPSBjb3VudGVyLT5pZCwKKwkJLnBlcmlvZCA9IHBlcmlvZCwKKwl9OworCisJcmV0ID0gcGVyZl9vdXRwdXRfYmVnaW4oJmhhbmRsZSwgY291bnRlciwgc2l6ZW9mKGV2ZW50KSwgMSwgMCk7CisJaWYgKHJldCkKKwkJcmV0dXJuOworCisJcGVyZl9vdXRwdXRfcHV0KCZoYW5kbGUsIGV2ZW50KTsKKwlwZXJmX291dHB1dF9lbmQoJmhhbmRsZSk7Cit9CisKKy8qCisgKiBJUlEgdGhyb3R0bGUgbG9nZ2luZworICovCisKK3N0YXRpYyB2b2lkIHBlcmZfbG9nX3Rocm90dGxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsIGludCBlbmFibGUpCit7CisJc3RydWN0IHBlcmZfb3V0cHV0X2hhbmRsZSBoYW5kbGU7CisJaW50IHJldDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJCXU2NAkJCQl0aW1lOworCQl1NjQJCQkJaWQ7CisJfSB0aHJvdHRsZV9ldmVudCA9IHsKKwkJLmhlYWRlciA9IHsKKwkJCS50eXBlID0gUEVSRl9FVkVOVF9USFJPVFRMRSArIDEsCisJCQkubWlzYyA9IDAsCisJCQkuc2l6ZSA9IHNpemVvZih0aHJvdHRsZV9ldmVudCksCisJCX0sCisJCS50aW1lCT0gc2NoZWRfY2xvY2soKSwKKwkJLmlkCT0gY291bnRlci0+aWQsCisJfTsKKworCXJldCA9IHBlcmZfb3V0cHV0X2JlZ2luKCZoYW5kbGUsIGNvdW50ZXIsIHNpemVvZih0aHJvdHRsZV9ldmVudCksIDEsIDApOworCWlmIChyZXQpCisJCXJldHVybjsKKworCXBlcmZfb3V0cHV0X3B1dCgmaGFuZGxlLCB0aHJvdHRsZV9ldmVudCk7CisJcGVyZl9vdXRwdXRfZW5kKCZoYW5kbGUpOworfQorCisvKgorICogR2VuZXJpYyBjb3VudGVyIG92ZXJmbG93IGhhbmRsaW5nLgorICovCisKK2ludCBwZXJmX2NvdW50ZXJfb3ZlcmZsb3coc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgaW50IG5taSwKKwkJCSAgc3RydWN0IHBlcmZfc2FtcGxlX2RhdGEgKmRhdGEpCit7CisJaW50IGV2ZW50cyA9IGF0b21pY19yZWFkKCZjb3VudGVyLT5ldmVudF9saW1pdCk7CisJaW50IHRocm90dGxlID0gY291bnRlci0+cG11LT51bnRocm90dGxlICE9IE5VTEw7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCWludCByZXQgPSAwOworCisJaWYgKCF0aHJvdHRsZSkgeworCQlod2MtPmludGVycnVwdHMrKzsKKwl9IGVsc2UgeworCQlpZiAoaHdjLT5pbnRlcnJ1cHRzICE9IE1BWF9JTlRFUlJVUFRTKSB7CisJCQlod2MtPmludGVycnVwdHMrKzsKKwkJCWlmIChIWiAqIGh3Yy0+aW50ZXJydXB0cyA+CisJCQkJCSh1NjQpc3lzY3RsX3BlcmZfY291bnRlcl9zYW1wbGVfcmF0ZSkgeworCQkJCWh3Yy0+aW50ZXJydXB0cyA9IE1BWF9JTlRFUlJVUFRTOworCQkJCXBlcmZfbG9nX3Rocm90dGxlKGNvdW50ZXIsIDApOworCQkJCXJldCA9IDE7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogS2VlcCByZS1kaXNhYmxpbmcgY291bnRlcnMgZXZlbiB0aG91Z2ggb24gdGhlIHByZXZpb3VzCisJCQkgKiBwYXNzIHdlIGRpc2FibGVkIGl0IC0ganVzdCBpbiBjYXNlIHdlIHJhY2VkIHdpdGggYQorCQkJICogc2NoZWQtaW4gYW5kIHRoZSBjb3VudGVyIGdvdCBlbmFibGVkIGFnYWluOgorCQkJICovCisJCQlyZXQgPSAxOworCQl9CisJfQorCisJaWYgKGNvdW50ZXItPmF0dHIuZnJlcSkgeworCQl1NjQgbm93ID0gc2NoZWRfY2xvY2soKTsKKwkJczY0IGRlbHRhID0gbm93IC0gaHdjLT5mcmVxX3N0YW1wOworCisJCWh3Yy0+ZnJlcV9zdGFtcCA9IG5vdzsKKworCQlpZiAoZGVsdGEgPiAwICYmIGRlbHRhIDwgVElDS19OU0VDKQorCQkJcGVyZl9hZGp1c3RfcGVyaW9kKGNvdW50ZXIsIE5TRUNfUEVSX1NFQyAvIChpbnQpZGVsdGEpOworCX0KKworCS8qCisJICogWFhYIGV2ZW50X2xpbWl0IG1pZ2h0IG5vdCBxdWl0ZSB3b3JrIGFzIGV4cGVjdGVkIG9uIGluaGVyaXRlZAorCSAqIGNvdW50ZXJzCisJICovCisKKwljb3VudGVyLT5wZW5kaW5nX2tpbGwgPSBQT0xMX0lOOworCWlmIChldmVudHMgJiYgYXRvbWljX2RlY19hbmRfdGVzdCgmY291bnRlci0+ZXZlbnRfbGltaXQpKSB7CisJCXJldCA9IDE7CisJCWNvdW50ZXItPnBlbmRpbmdfa2lsbCA9IFBPTExfSFVQOworCQlpZiAobm1pKSB7CisJCQljb3VudGVyLT5wZW5kaW5nX2Rpc2FibGUgPSAxOworCQkJcGVyZl9wZW5kaW5nX3F1ZXVlKCZjb3VudGVyLT5wZW5kaW5nLAorCQkJCQkgICBwZXJmX3BlbmRpbmdfY291bnRlcik7CisJCX0gZWxzZQorCQkJcGVyZl9jb3VudGVyX2Rpc2FibGUoY291bnRlcik7CisJfQorCisJcGVyZl9jb3VudGVyX291dHB1dChjb3VudGVyLCBubWksIGRhdGEpOworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBHZW5lcmljIHNvZnR3YXJlIGNvdW50ZXIgaW5mcmFzdHJ1Y3R1cmUKKyAqLworCitzdGF0aWMgdm9pZCBwZXJmX3N3Y291bnRlcl91cGRhdGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlzdHJ1Y3QgaHdfcGVyZl9jb3VudGVyICpod2MgPSAmY291bnRlci0+aHc7CisJdTY0IHByZXYsIG5vdzsKKwlzNjQgZGVsdGE7CisKK2FnYWluOgorCXByZXYgPSBhdG9taWM2NF9yZWFkKCZod2MtPnByZXZfY291bnQpOworCW5vdyA9IGF0b21pYzY0X3JlYWQoJmh3Yy0+Y291bnQpOworCWlmIChhdG9taWM2NF9jbXB4Y2hnKCZod2MtPnByZXZfY291bnQsIHByZXYsIG5vdykgIT0gcHJldikKKwkJZ290byBhZ2FpbjsKKworCWRlbHRhID0gbm93IC0gcHJldjsKKworCWF0b21pYzY0X2FkZChkZWx0YSwgJmNvdW50ZXItPmNvdW50KTsKKwlhdG9taWM2NF9zdWIoZGVsdGEsICZod2MtPnBlcmlvZF9sZWZ0KTsKK30KKworc3RhdGljIHZvaWQgcGVyZl9zd2NvdW50ZXJfc2V0X3BlcmlvZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YyA9ICZjb3VudGVyLT5odzsKKwlzNjQgbGVmdCA9IGF0b21pYzY0X3JlYWQoJmh3Yy0+cGVyaW9kX2xlZnQpOworCXM2NCBwZXJpb2QgPSBod2MtPnNhbXBsZV9wZXJpb2Q7CisKKwlpZiAodW5saWtlbHkobGVmdCA8PSAtcGVyaW9kKSkgeworCQlsZWZ0ID0gcGVyaW9kOworCQlhdG9taWM2NF9zZXQoJmh3Yy0+cGVyaW9kX2xlZnQsIGxlZnQpOworCQlod2MtPmxhc3RfcGVyaW9kID0gcGVyaW9kOworCX0KKworCWlmICh1bmxpa2VseShsZWZ0IDw9IDApKSB7CisJCWxlZnQgKz0gcGVyaW9kOworCQlhdG9taWM2NF9hZGQocGVyaW9kLCAmaHdjLT5wZXJpb2RfbGVmdCk7CisJCWh3Yy0+bGFzdF9wZXJpb2QgPSBwZXJpb2Q7CisJfQorCisJYXRvbWljNjRfc2V0KCZod2MtPnByZXZfY291bnQsIC1sZWZ0KTsKKwlhdG9taWM2NF9zZXQoJmh3Yy0+Y291bnQsIC1sZWZ0KTsKK30KKworc3RhdGljIGVudW0gaHJ0aW1lcl9yZXN0YXJ0IHBlcmZfc3djb3VudGVyX2hydGltZXIoc3RydWN0IGhydGltZXIgKmhydGltZXIpCit7CisJZW51bSBocnRpbWVyX3Jlc3RhcnQgcmV0ID0gSFJUSU1FUl9SRVNUQVJUOworCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIGRhdGE7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcjsKKwl1NjQgcGVyaW9kOworCisJY291bnRlcgk9IGNvbnRhaW5lcl9vZihocnRpbWVyLCBzdHJ1Y3QgcGVyZl9jb3VudGVyLCBody5ocnRpbWVyKTsKKwljb3VudGVyLT5wbXUtPnJlYWQoY291bnRlcik7CisKKwlkYXRhLmFkZHIgPSAwOworCWRhdGEucmVncyA9IGdldF9pcnFfcmVncygpOworCS8qCisJICogSW4gY2FzZSB3ZSBleGNsdWRlIGtlcm5lbCBJUHMgb3IgYXJlIHNvbWVob3cgbm90IGluIGludGVycnVwdAorCSAqIGNvbnRleHQsIHByb3ZpZGUgdGhlIG5leHQgYmVzdCB0aGluZywgdGhlIHVzZXIgSVAuCisJICovCisJaWYgKChjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfa2VybmVsIHx8ICFkYXRhLnJlZ3MpICYmCisJCQkhY291bnRlci0+YXR0ci5leGNsdWRlX3VzZXIpCisJCWRhdGEucmVncyA9IHRhc2tfcHRfcmVncyhjdXJyZW50KTsKKworCWlmIChkYXRhLnJlZ3MpIHsKKwkJaWYgKHBlcmZfY291bnRlcl9vdmVyZmxvdyhjb3VudGVyLCAwLCAmZGF0YSkpCisJCQlyZXQgPSBIUlRJTUVSX05PUkVTVEFSVDsKKwl9CisKKwlwZXJpb2QgPSBtYXhfdCh1NjQsIDEwMDAwLCBjb3VudGVyLT5ody5zYW1wbGVfcGVyaW9kKTsKKwlocnRpbWVyX2ZvcndhcmRfbm93KGhydGltZXIsIG5zX3RvX2t0aW1lKHBlcmlvZCkpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgcGVyZl9zd2NvdW50ZXJfb3ZlcmZsb3coc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwKKwkJCQkgICAgaW50IG5taSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHU2NCBhZGRyKQoreworCXN0cnVjdCBwZXJmX3NhbXBsZV9kYXRhIGRhdGEgPSB7CisJCS5yZWdzCT0gcmVncywKKwkJLmFkZHIJPSBhZGRyLAorCQkucGVyaW9kCT0gY291bnRlci0+aHcubGFzdF9wZXJpb2QsCisJfTsKKworCXBlcmZfc3djb3VudGVyX3VwZGF0ZShjb3VudGVyKTsKKwlwZXJmX3N3Y291bnRlcl9zZXRfcGVyaW9kKGNvdW50ZXIpOworCWlmIChwZXJmX2NvdW50ZXJfb3ZlcmZsb3coY291bnRlciwgbm1pLCAmZGF0YSkpCisJCS8qIHNvZnQtZGlzYWJsZSB0aGUgY291bnRlciAqLworCQk7CisKK30KKworc3RhdGljIGludCBwZXJmX3N3Y291bnRlcl9pc19jb3VudGluZyhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJaW50IGNvdW50OworCisJaWYgKGNvdW50ZXItPnN0YXRlID09IFBFUkZfQ09VTlRFUl9TVEFURV9BQ1RJVkUpCisJCXJldHVybiAxOworCisJaWYgKGNvdW50ZXItPnN0YXRlICE9IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSkKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIElmIHRoZSBjb3VudGVyIGlzIGluYWN0aXZlLCBpdCBjb3VsZCBiZSBqdXN0IGJlY2F1c2UKKwkgKiBpdHMgdGFzayBpcyBzY2hlZHVsZWQgb3V0LCBvciBiZWNhdXNlIGl0J3MgaW4gYSBncm91cAorCSAqIHdoaWNoIGNvdWxkIG5vdCBnbyBvbiB0aGUgUE1VLiAgV2Ugd2FudCB0byBjb3VudCBpbgorCSAqIHRoZSBmaXJzdCBjYXNlIGJ1dCBub3QgdGhlIHNlY29uZC4gIElmIHRoZSBjb250ZXh0IGlzCisJICogY3VycmVudGx5IGFjdGl2ZSB0aGVuIGFuIGluYWN0aXZlIHNvZnR3YXJlIGNvdW50ZXIgbXVzdAorCSAqIGJlIHRoZSBzZWNvbmQgY2FzZS4gIElmIGl0J3Mgbm90IGN1cnJlbnRseSBhY3RpdmUgdGhlbgorCSAqIHdlIG5lZWQgdG8ga25vdyB3aGV0aGVyIHRoZSBjb3VudGVyIHdhcyBhY3RpdmUgd2hlbiB0aGUKKwkgKiBjb250ZXh0IHdhcyBsYXN0IGFjdGl2ZSwgd2hpY2ggd2UgY2FuIGRldGVybWluZSBieQorCSAqIGNvbXBhcmluZyBjb3VudGVyLT50c3RhbXBfc3RvcHBlZCB3aXRoIGN0eC0+dGltZS4KKwkgKgorCSAqIFdlIGFyZSB3aXRoaW4gYW4gUkNVIHJlYWQtc2lkZSBjcml0aWNhbCBzZWN0aW9uLAorCSAqIHdoaWNoIHByb3RlY3RzIHRoZSBleGlzdGVuY2Ugb2YgKmN0eC4KKwkgKi8KKwljdHggPSBjb3VudGVyLT5jdHg7CisJc3Bpbl9sb2NrX2lycXNhdmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCWNvdW50ID0gMTsKKwkvKiBSZS1jaGVjayBzdGF0ZSBub3cgd2UgaGF2ZSB0aGUgbG9jayAqLworCWlmIChjb3VudGVyLT5zdGF0ZSA8IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRSB8fAorCSAgICBjb3VudGVyLT5jdHgtPmlzX2FjdGl2ZSB8fAorCSAgICBjb3VudGVyLT50c3RhbXBfc3RvcHBlZCA8IGN0eC0+dGltZSkKKwkJY291bnQgPSAwOworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN0eC0+bG9jaywgZmxhZ3MpOworCXJldHVybiBjb3VudDsKK30KKworc3RhdGljIGludCBwZXJmX3N3Y291bnRlcl9tYXRjaChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLAorCQkJCWVudW0gcGVyZl90eXBlX2lkIHR5cGUsCisJCQkJdTMyIGV2ZW50LCBzdHJ1Y3QgcHRfcmVncyAqcmVncykKK3sKKwlpZiAoIXBlcmZfc3djb3VudGVyX2lzX2NvdW50aW5nKGNvdW50ZXIpKQorCQlyZXR1cm4gMDsKKworCWlmIChjb3VudGVyLT5hdHRyLnR5cGUgIT0gdHlwZSkKKwkJcmV0dXJuIDA7CisJaWYgKGNvdW50ZXItPmF0dHIuY29uZmlnICE9IGV2ZW50KQorCQlyZXR1cm4gMDsKKworCWlmIChyZWdzKSB7CisJCWlmIChjb3VudGVyLT5hdHRyLmV4Y2x1ZGVfdXNlciAmJiB1c2VyX21vZGUocmVncykpCisJCQlyZXR1cm4gMDsKKworCQlpZiAoY291bnRlci0+YXR0ci5leGNsdWRlX2tlcm5lbCAmJiAhdXNlcl9tb2RlKHJlZ3MpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfc3djb3VudGVyX2FkZChzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCB1NjQgbnIsCisJCQkgICAgICAgaW50IG5taSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHU2NCBhZGRyKQoreworCWludCBuZWcgPSBhdG9taWM2NF9hZGRfbmVnYXRpdmUobnIsICZjb3VudGVyLT5ody5jb3VudCk7CisKKwlpZiAoY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZCAmJiAhbmVnICYmIHJlZ3MpCisJCXBlcmZfc3djb3VudGVyX292ZXJmbG93KGNvdW50ZXIsIG5taSwgcmVncywgYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfc3djb3VudGVyX2N0eF9ldmVudChzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eCwKKwkJCQkgICAgIGVudW0gcGVyZl90eXBlX2lkIHR5cGUsIHUzMiBldmVudCwKKwkJCQkgICAgIHU2NCBuciwgaW50IG5taSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICAgICB1NjQgYWRkcikKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyOworCisJaWYgKHN5c3RlbV9zdGF0ZSAhPSBTWVNURU1fUlVOTklORyB8fCBsaXN0X2VtcHR5KCZjdHgtPmV2ZW50X2xpc3QpKQorCQlyZXR1cm47CisKKwlyY3VfcmVhZF9sb2NrKCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UoY291bnRlciwgJmN0eC0+ZXZlbnRfbGlzdCwgZXZlbnRfZW50cnkpIHsKKwkJaWYgKHBlcmZfc3djb3VudGVyX21hdGNoKGNvdW50ZXIsIHR5cGUsIGV2ZW50LCByZWdzKSkKKwkJCXBlcmZfc3djb3VudGVyX2FkZChjb3VudGVyLCBuciwgbm1pLCByZWdzLCBhZGRyKTsKKwl9CisJcmN1X3JlYWRfdW5sb2NrKCk7Cit9CisKK3N0YXRpYyBpbnQgKnBlcmZfc3djb3VudGVyX3JlY3Vyc2lvbl9jb250ZXh0KHN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHgpCit7CisJaWYgKGluX25taSgpKQorCQlyZXR1cm4gJmNwdWN0eC0+cmVjdXJzaW9uWzNdOworCisJaWYgKGluX2lycSgpKQorCQlyZXR1cm4gJmNwdWN0eC0+cmVjdXJzaW9uWzJdOworCisJaWYgKGluX3NvZnRpcnEoKSkKKwkJcmV0dXJuICZjcHVjdHgtPnJlY3Vyc2lvblsxXTsKKworCXJldHVybiAmY3B1Y3R4LT5yZWN1cnNpb25bMF07Cit9CisKK3N0YXRpYyB2b2lkIF9fcGVyZl9zd2NvdW50ZXJfZXZlbnQoZW51bSBwZXJmX3R5cGVfaWQgdHlwZSwgdTMyIGV2ZW50LAorCQkJCSAgIHU2NCBuciwgaW50IG5taSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsCisJCQkJICAgdTY0IGFkZHIpCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eCA9ICZnZXRfY3B1X3ZhcihwZXJmX2NwdV9jb250ZXh0KTsKKwlpbnQgKnJlY3Vyc2lvbiA9IHBlcmZfc3djb3VudGVyX3JlY3Vyc2lvbl9jb250ZXh0KGNwdWN0eCk7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisKKwlpZiAoKnJlY3Vyc2lvbikKKwkJZ290byBvdXQ7CisKKwkoKnJlY3Vyc2lvbikrKzsKKwliYXJyaWVyKCk7CisKKwlwZXJmX3N3Y291bnRlcl9jdHhfZXZlbnQoJmNwdWN0eC0+Y3R4LCB0eXBlLCBldmVudCwKKwkJCQkgbnIsIG5taSwgcmVncywgYWRkcik7CisJcmN1X3JlYWRfbG9jaygpOworCS8qCisJICogZG9lc24ndCByZWFsbHkgbWF0dGVyIHdoaWNoIG9mIHRoZSBjaGlsZCBjb250ZXh0cyB0aGUKKwkgKiBldmVudHMgZW5kcyB1cCBpbi4KKwkgKi8KKwljdHggPSByY3VfZGVyZWZlcmVuY2UoY3VycmVudC0+cGVyZl9jb3VudGVyX2N0eHApOworCWlmIChjdHgpCisJCXBlcmZfc3djb3VudGVyX2N0eF9ldmVudChjdHgsIHR5cGUsIGV2ZW50LCBuciwgbm1pLCByZWdzLCBhZGRyKTsKKwlyY3VfcmVhZF91bmxvY2soKTsKKworCWJhcnJpZXIoKTsKKwkoKnJlY3Vyc2lvbiktLTsKKworb3V0OgorCXB1dF9jcHVfdmFyKHBlcmZfY3B1X2NvbnRleHQpOworfQorCit2b2lkCitwZXJmX3N3Y291bnRlcl9ldmVudCh1MzIgZXZlbnQsIHU2NCBuciwgaW50IG5taSwgc3RydWN0IHB0X3JlZ3MgKnJlZ3MsIHU2NCBhZGRyKQoreworCV9fcGVyZl9zd2NvdW50ZXJfZXZlbnQoUEVSRl9UWVBFX1NPRlRXQVJFLCBldmVudCwgbnIsIG5taSwgcmVncywgYWRkcik7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZfc3djb3VudGVyX3JlYWQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlwZXJmX3N3Y291bnRlcl91cGRhdGUoY291bnRlcik7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9zd2NvdW50ZXJfZW5hYmxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJcGVyZl9zd2NvdW50ZXJfc2V0X3BlcmlvZChjb3VudGVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGVyZl9zd2NvdW50ZXJfZGlzYWJsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXBlcmZfc3djb3VudGVyX3VwZGF0ZShjb3VudGVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbXUgcGVyZl9vcHNfZ2VuZXJpYyA9IHsKKwkuZW5hYmxlCQk9IHBlcmZfc3djb3VudGVyX2VuYWJsZSwKKwkuZGlzYWJsZQk9IHBlcmZfc3djb3VudGVyX2Rpc2FibGUsCisJLnJlYWQJCT0gcGVyZl9zd2NvdW50ZXJfcmVhZCwKK307CisKKy8qCisgKiBTb2Z0d2FyZSBjb3VudGVyOiBjcHUgd2FsbCB0aW1lIGNsb2NrCisgKi8KKworc3RhdGljIHZvaWQgY3B1X2Nsb2NrX3BlcmZfY291bnRlcl91cGRhdGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKwlzNjQgcHJldjsKKwl1NjQgbm93OworCisJbm93ID0gY3B1X2Nsb2NrKGNwdSk7CisJcHJldiA9IGF0b21pYzY0X3JlYWQoJmNvdW50ZXItPmh3LnByZXZfY291bnQpOworCWF0b21pYzY0X3NldCgmY291bnRlci0+aHcucHJldl9jb3VudCwgbm93KTsKKwlhdG9taWM2NF9hZGQobm93IC0gcHJldiwgJmNvdW50ZXItPmNvdW50KTsKK30KKworc3RhdGljIGludCBjcHVfY2xvY2tfcGVyZl9jb3VudGVyX2VuYWJsZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCXN0cnVjdCBod19wZXJmX2NvdW50ZXIgKmh3YyA9ICZjb3VudGVyLT5odzsKKwlpbnQgY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKKworCWF0b21pYzY0X3NldCgmaHdjLT5wcmV2X2NvdW50LCBjcHVfY2xvY2soY3B1KSk7CisJaHJ0aW1lcl9pbml0KCZod2MtPmhydGltZXIsIENMT0NLX01PTk9UT05JQywgSFJUSU1FUl9NT0RFX1JFTCk7CisJaHdjLT5ocnRpbWVyLmZ1bmN0aW9uID0gcGVyZl9zd2NvdW50ZXJfaHJ0aW1lcjsKKwlpZiAoaHdjLT5zYW1wbGVfcGVyaW9kKSB7CisJCXU2NCBwZXJpb2QgPSBtYXhfdCh1NjQsIDEwMDAwLCBod2MtPnNhbXBsZV9wZXJpb2QpOworCQlfX2hydGltZXJfc3RhcnRfcmFuZ2VfbnMoJmh3Yy0+aHJ0aW1lciwKKwkJCQluc190b19rdGltZShwZXJpb2QpLCAwLAorCQkJCUhSVElNRVJfTU9ERV9SRUwsIDApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBjcHVfY2xvY2tfcGVyZl9jb3VudGVyX2Rpc2FibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlpZiAoY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZCkKKwkJaHJ0aW1lcl9jYW5jZWwoJmNvdW50ZXItPmh3LmhydGltZXIpOworCWNwdV9jbG9ja19wZXJmX2NvdW50ZXJfdXBkYXRlKGNvdW50ZXIpOworfQorCitzdGF0aWMgdm9pZCBjcHVfY2xvY2tfcGVyZl9jb3VudGVyX3JlYWQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwljcHVfY2xvY2tfcGVyZl9jb3VudGVyX3VwZGF0ZShjb3VudGVyKTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCBwbXUgcGVyZl9vcHNfY3B1X2Nsb2NrID0geworCS5lbmFibGUJCT0gY3B1X2Nsb2NrX3BlcmZfY291bnRlcl9lbmFibGUsCisJLmRpc2FibGUJPSBjcHVfY2xvY2tfcGVyZl9jb3VudGVyX2Rpc2FibGUsCisJLnJlYWQJCT0gY3B1X2Nsb2NrX3BlcmZfY291bnRlcl9yZWFkLAorfTsKKworLyoKKyAqIFNvZnR3YXJlIGNvdW50ZXI6IHRhc2sgdGltZSBjbG9jaworICovCisKK3N0YXRpYyB2b2lkIHRhc2tfY2xvY2tfcGVyZl9jb3VudGVyX3VwZGF0ZShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyLCB1NjQgbm93KQoreworCXU2NCBwcmV2OworCXM2NCBkZWx0YTsKKworCXByZXYgPSBhdG9taWM2NF94Y2hnKCZjb3VudGVyLT5ody5wcmV2X2NvdW50LCBub3cpOworCWRlbHRhID0gbm93IC0gcHJldjsKKwlhdG9taWM2NF9hZGQoZGVsdGEsICZjb3VudGVyLT5jb3VudCk7Cit9CisKK3N0YXRpYyBpbnQgdGFza19jbG9ja19wZXJmX2NvdW50ZXJfZW5hYmxlKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIpCit7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjID0gJmNvdW50ZXItPmh3OworCXU2NCBub3c7CisKKwlub3cgPSBjb3VudGVyLT5jdHgtPnRpbWU7CisKKwlhdG9taWM2NF9zZXQoJmh3Yy0+cHJldl9jb3VudCwgbm93KTsKKwlocnRpbWVyX2luaXQoJmh3Yy0+aHJ0aW1lciwgQ0xPQ0tfTU9OT1RPTklDLCBIUlRJTUVSX01PREVfUkVMKTsKKwlod2MtPmhydGltZXIuZnVuY3Rpb24gPSBwZXJmX3N3Y291bnRlcl9ocnRpbWVyOworCWlmIChod2MtPnNhbXBsZV9wZXJpb2QpIHsKKwkJdTY0IHBlcmlvZCA9IG1heF90KHU2NCwgMTAwMDAsIGh3Yy0+c2FtcGxlX3BlcmlvZCk7CisJCV9faHJ0aW1lcl9zdGFydF9yYW5nZV9ucygmaHdjLT5ocnRpbWVyLAorCQkJCW5zX3RvX2t0aW1lKHBlcmlvZCksIDAsCisJCQkJSFJUSU1FUl9NT0RFX1JFTCwgMCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRhc2tfY2xvY2tfcGVyZl9jb3VudGVyX2Rpc2FibGUoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlpZiAoY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZCkKKwkJaHJ0aW1lcl9jYW5jZWwoJmNvdW50ZXItPmh3LmhydGltZXIpOworCXRhc2tfY2xvY2tfcGVyZl9jb3VudGVyX3VwZGF0ZShjb3VudGVyLCBjb3VudGVyLT5jdHgtPnRpbWUpOworCit9CisKK3N0YXRpYyB2b2lkIHRhc2tfY2xvY2tfcGVyZl9jb3VudGVyX3JlYWQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwl1NjQgdGltZTsKKworCWlmICghaW5fbm1pKCkpIHsKKwkJdXBkYXRlX2NvbnRleHRfdGltZShjb3VudGVyLT5jdHgpOworCQl0aW1lID0gY291bnRlci0+Y3R4LT50aW1lOworCX0gZWxzZSB7CisJCXU2NCBub3cgPSBwZXJmX2Nsb2NrKCk7CisJCXU2NCBkZWx0YSA9IG5vdyAtIGNvdW50ZXItPmN0eC0+dGltZXN0YW1wOworCQl0aW1lID0gY291bnRlci0+Y3R4LT50aW1lICsgZGVsdGE7CisJfQorCisJdGFza19jbG9ja19wZXJmX2NvdW50ZXJfdXBkYXRlKGNvdW50ZXIsIHRpbWUpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtdSBwZXJmX29wc190YXNrX2Nsb2NrID0geworCS5lbmFibGUJCT0gdGFza19jbG9ja19wZXJmX2NvdW50ZXJfZW5hYmxlLAorCS5kaXNhYmxlCT0gdGFza19jbG9ja19wZXJmX2NvdW50ZXJfZGlzYWJsZSwKKwkucmVhZAkJPSB0YXNrX2Nsb2NrX3BlcmZfY291bnRlcl9yZWFkLAorfTsKKworLyoKKyAqIFNvZnR3YXJlIGNvdW50ZXI6IGNwdSBtaWdyYXRpb25zCisgKi8KK3ZvaWQgcGVyZl9jb3VudGVyX3Rhc2tfbWlncmF0aW9uKHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywgaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gJnBlcl9jcHUocGVyZl9jcHVfY29udGV4dCwgY3B1KTsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmN0eDsKKworCXBlcmZfc3djb3VudGVyX2N0eF9ldmVudCgmY3B1Y3R4LT5jdHgsIFBFUkZfVFlQRV9TT0ZUV0FSRSwKKwkJCQkgUEVSRl9DT1VOVF9TV19DUFVfTUlHUkFUSU9OUywKKwkJCQkgMSwgMSwgTlVMTCwgMCk7CisKKwljdHggPSBwZXJmX3Bpbl90YXNrX2NvbnRleHQodGFzayk7CisJaWYgKGN0eCkgeworCQlwZXJmX3N3Y291bnRlcl9jdHhfZXZlbnQoY3R4LCBQRVJGX1RZUEVfU09GVFdBUkUsCisJCQkJCSBQRVJGX0NPVU5UX1NXX0NQVV9NSUdSQVRJT05TLAorCQkJCQkgMSwgMSwgTlVMTCwgMCk7CisJCXBlcmZfdW5waW5fY29udGV4dChjdHgpOworCX0KK30KKworI2lmZGVmIENPTkZJR19FVkVOVF9QUk9GSUxFCit2b2lkIHBlcmZfdHBjb3VudGVyX2V2ZW50KGludCBldmVudF9pZCkKK3sKKwlzdHJ1Y3QgcHRfcmVncyAqcmVncyA9IGdldF9pcnFfcmVncygpOworCisJaWYgKCFyZWdzKQorCQlyZWdzID0gdGFza19wdF9yZWdzKGN1cnJlbnQpOworCisJX19wZXJmX3N3Y291bnRlcl9ldmVudChQRVJGX1RZUEVfVFJBQ0VQT0lOVCwgZXZlbnRfaWQsIDEsIDEsIHJlZ3MsIDApOworfQorRVhQT1JUX1NZTUJPTF9HUEwocGVyZl90cGNvdW50ZXJfZXZlbnQpOworCitleHRlcm4gaW50IGZ0cmFjZV9wcm9maWxlX2VuYWJsZShpbnQpOworZXh0ZXJuIHZvaWQgZnRyYWNlX3Byb2ZpbGVfZGlzYWJsZShpbnQpOworCitzdGF0aWMgdm9pZCB0cF9wZXJmX2NvdW50ZXJfZGVzdHJveShzdHJ1Y3QgcGVyZl9jb3VudGVyICpjb3VudGVyKQoreworCWZ0cmFjZV9wcm9maWxlX2Rpc2FibGUocGVyZl9ldmVudF9pZCgmY291bnRlci0+YXR0cikpOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtdSAqdHBfcGVyZl9jb3VudGVyX2luaXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlpbnQgZXZlbnRfaWQgPSBwZXJmX2V2ZW50X2lkKCZjb3VudGVyLT5hdHRyKTsKKwlpbnQgcmV0OworCisJcmV0ID0gZnRyYWNlX3Byb2ZpbGVfZW5hYmxlKGV2ZW50X2lkKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gTlVMTDsKKworCWNvdW50ZXItPmRlc3Ryb3kgPSB0cF9wZXJmX2NvdW50ZXJfZGVzdHJveTsKKworCXJldHVybiAmcGVyZl9vcHNfZ2VuZXJpYzsKK30KKyNlbHNlCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtdSAqdHBfcGVyZl9jb3VudGVyX2luaXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwlyZXR1cm4gTlVMTDsKK30KKyNlbmRpZgorCitzdGF0aWMgY29uc3Qgc3RydWN0IHBtdSAqc3dfcGVyZl9jb3VudGVyX2luaXQoc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlcikKK3sKKwljb25zdCBzdHJ1Y3QgcG11ICpwbXUgPSBOVUxMOworCisJLyoKKwkgKiBTb2Z0d2FyZSBjb3VudGVycyAoY3VycmVudGx5KSBjYW4ndCBpbiBnZW5lcmFsIGRpc3Rpbmd1aXNoCisJICogYmV0d2VlbiB1c2VyLCBrZXJuZWwgYW5kIGh5cGVydmlzb3IgZXZlbnRzLgorCSAqIEhvd2V2ZXIsIGNvbnRleHQgc3dpdGNoZXMgYW5kIGNwdSBtaWdyYXRpb25zIGFyZSBjb25zaWRlcmVkCisJICogdG8gYmUga2VybmVsIGV2ZW50cywgYW5kIHBhZ2UgZmF1bHRzIGFyZSBuZXZlciBoeXBlcnZpc29yCisJICogZXZlbnRzLgorCSAqLworCXN3aXRjaCAoY291bnRlci0+YXR0ci5jb25maWcpIHsKKwljYXNlIFBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLOgorCQlwbXUgPSAmcGVyZl9vcHNfY3B1X2Nsb2NrOworCisJCWJyZWFrOworCWNhc2UgUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLOgorCQkvKgorCQkgKiBJZiB0aGUgdXNlciBpbnN0YW50aWF0ZXMgdGhpcyBhcyBhIHBlci1jcHUgY291bnRlciwKKwkJICogdXNlIHRoZSBjcHVfY2xvY2sgY291bnRlciBpbnN0ZWFkLgorCQkgKi8KKwkJaWYgKGNvdW50ZXItPmN0eC0+dGFzaykKKwkJCXBtdSA9ICZwZXJmX29wc190YXNrX2Nsb2NrOworCQllbHNlCisJCQlwbXUgPSAmcGVyZl9vcHNfY3B1X2Nsb2NrOworCisJCWJyZWFrOworCWNhc2UgUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUzoKKwljYXNlIFBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUlOOgorCWNhc2UgUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NQUo6CisJY2FzZSBQRVJGX0NPVU5UX1NXX0NPTlRFWFRfU1dJVENIRVM6CisJY2FzZSBQRVJGX0NPVU5UX1NXX0NQVV9NSUdSQVRJT05TOgorCQlwbXUgPSAmcGVyZl9vcHNfZ2VuZXJpYzsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHBtdTsKK30KKworLyoKKyAqIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY291bnRlciBzdHJ1Y3R1cmUKKyAqLworc3RhdGljIHN0cnVjdCBwZXJmX2NvdW50ZXIgKgorcGVyZl9jb3VudGVyX2FsbG9jKHN0cnVjdCBwZXJmX2NvdW50ZXJfYXR0ciAqYXR0ciwKKwkJICAgaW50IGNwdSwKKwkJICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHgsCisJCSAgIHN0cnVjdCBwZXJmX2NvdW50ZXIgKmdyb3VwX2xlYWRlciwKKwkJICAgZ2ZwX3QgZ2ZwZmxhZ3MpCit7CisJY29uc3Qgc3RydWN0IHBtdSAqcG11OworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJc3RydWN0IGh3X3BlcmZfY291bnRlciAqaHdjOworCWxvbmcgZXJyOworCisJY291bnRlciA9IGt6YWxsb2Moc2l6ZW9mKCpjb3VudGVyKSwgZ2ZwZmxhZ3MpOworCWlmICghY291bnRlcikKKwkJcmV0dXJuIEVSUl9QVFIoLUVOT01FTSk7CisKKwkvKgorCSAqIFNpbmdsZSBjb3VudGVycyBhcmUgdGhlaXIgb3duIGdyb3VwIGxlYWRlcnMsIHdpdGggYW4KKwkgKiBlbXB0eSBzaWJsaW5nIGxpc3Q6CisJICovCisJaWYgKCFncm91cF9sZWFkZXIpCisJCWdyb3VwX2xlYWRlciA9IGNvdW50ZXI7CisKKwltdXRleF9pbml0KCZjb3VudGVyLT5jaGlsZF9tdXRleCk7CisJSU5JVF9MSVNUX0hFQUQoJmNvdW50ZXItPmNoaWxkX2xpc3QpOworCisJSU5JVF9MSVNUX0hFQUQoJmNvdW50ZXItPmxpc3RfZW50cnkpOworCUlOSVRfTElTVF9IRUFEKCZjb3VudGVyLT5ldmVudF9lbnRyeSk7CisJSU5JVF9MSVNUX0hFQUQoJmNvdW50ZXItPnNpYmxpbmdfbGlzdCk7CisJaW5pdF93YWl0cXVldWVfaGVhZCgmY291bnRlci0+d2FpdHEpOworCisJbXV0ZXhfaW5pdCgmY291bnRlci0+bW1hcF9tdXRleCk7CisKKwljb3VudGVyLT5jcHUJCT0gY3B1OworCWNvdW50ZXItPmF0dHIJCT0gKmF0dHI7CisJY291bnRlci0+Z3JvdXBfbGVhZGVyCT0gZ3JvdXBfbGVhZGVyOworCWNvdW50ZXItPnBtdQkJPSBOVUxMOworCWNvdW50ZXItPmN0eAkJPSBjdHg7CisJY291bnRlci0+b25jcHUJCT0gLTE7CisKKwljb3VudGVyLT5ucwkJPSBnZXRfcGlkX25zKGN1cnJlbnQtPm5zcHJveHktPnBpZF9ucyk7CisJY291bnRlci0+aWQJCT0gYXRvbWljNjRfaW5jX3JldHVybigmcGVyZl9jb3VudGVyX2lkKTsKKworCWNvdW50ZXItPnN0YXRlCQk9IFBFUkZfQ09VTlRFUl9TVEFURV9JTkFDVElWRTsKKworCWlmIChhdHRyLT5kaXNhYmxlZCkKKwkJY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGOworCisJcG11ID0gTlVMTDsKKworCWh3YyA9ICZjb3VudGVyLT5odzsKKwlod2MtPnNhbXBsZV9wZXJpb2QgPSBhdHRyLT5zYW1wbGVfcGVyaW9kOworCWlmIChhdHRyLT5mcmVxICYmIGF0dHItPnNhbXBsZV9mcmVxKQorCQlod2MtPnNhbXBsZV9wZXJpb2QgPSAxOworCisJYXRvbWljNjRfc2V0KCZod2MtPnBlcmlvZF9sZWZ0LCBod2MtPnNhbXBsZV9wZXJpb2QpOworCisJLyoKKwkgKiB3ZSBjdXJyZW50bHkgZG8gbm90IHN1cHBvcnQgUEVSRl9TQU1QTEVfR1JPVVAgb24gaW5oZXJpdGVkIGNvdW50ZXJzCisJICovCisJaWYgKGF0dHItPmluaGVyaXQgJiYgKGF0dHItPnNhbXBsZV90eXBlICYgUEVSRl9TQU1QTEVfR1JPVVApKQorCQlnb3RvIGRvbmU7CisKKwlpZiAoYXR0ci0+dHlwZSA9PSBQRVJGX1RZUEVfUkFXKSB7CisJCXBtdSA9IGh3X3BlcmZfY291bnRlcl9pbml0KGNvdW50ZXIpOworCQlnb3RvIGRvbmU7CisJfQorCisJc3dpdGNoIChhdHRyLT50eXBlKSB7CisJY2FzZSBQRVJGX1RZUEVfSEFSRFdBUkU6CisJY2FzZSBQRVJGX1RZUEVfSFdfQ0FDSEU6CisJCXBtdSA9IGh3X3BlcmZfY291bnRlcl9pbml0KGNvdW50ZXIpOworCQlicmVhazsKKworCWNhc2UgUEVSRl9UWVBFX1NPRlRXQVJFOgorCQlwbXUgPSBzd19wZXJmX2NvdW50ZXJfaW5pdChjb3VudGVyKTsKKwkJYnJlYWs7CisKKwljYXNlIFBFUkZfVFlQRV9UUkFDRVBPSU5UOgorCQlwbXUgPSB0cF9wZXJmX2NvdW50ZXJfaW5pdChjb3VudGVyKTsKKwkJYnJlYWs7CisJfQorZG9uZToKKwllcnIgPSAwOworCWlmICghcG11KQorCQllcnIgPSAtRUlOVkFMOworCWVsc2UgaWYgKElTX0VSUihwbXUpKQorCQllcnIgPSBQVFJfRVJSKHBtdSk7CisKKwlpZiAoZXJyKSB7CisJCWlmIChjb3VudGVyLT5ucykKKwkJCXB1dF9waWRfbnMoY291bnRlci0+bnMpOworCQlrZnJlZShjb3VudGVyKTsKKwkJcmV0dXJuIEVSUl9QVFIoZXJyKTsKKwl9CisKKwljb3VudGVyLT5wbXUgPSBwbXU7CisKKwlhdG9taWNfaW5jKCZucl9jb3VudGVycyk7CisJaWYgKGNvdW50ZXItPmF0dHIubW1hcCkKKwkJYXRvbWljX2luYygmbnJfbW1hcF9jb3VudGVycyk7CisJaWYgKGNvdW50ZXItPmF0dHIuY29tbSkKKwkJYXRvbWljX2luYygmbnJfY29tbV9jb3VudGVycyk7CisKKwlyZXR1cm4gY291bnRlcjsKK30KKworLyoqCisgKiBzeXNfcGVyZl9jb3VudGVyX29wZW4gLSBvcGVuIGEgcGVyZm9ybWFuY2UgY291bnRlciwgYXNzb2NpYXRlIGl0IHRvIGEgdGFzay9jcHUKKyAqCisgKiBAYXR0cl91cHRyOglldmVudCB0eXBlIGF0dHJpYnV0ZXMgZm9yIG1vbml0b3Jpbmcvc2FtcGxpbmcKKyAqIEBwaWQ6CQl0YXJnZXQgcGlkCisgKiBAY3B1OgkJdGFyZ2V0IGNwdQorICogQGdyb3VwX2ZkOgkJZ3JvdXAgbGVhZGVyIGNvdW50ZXIgZmQKKyAqLworU1lTQ0FMTF9ERUZJTkU1KHBlcmZfY291bnRlcl9vcGVuLAorCQljb25zdCBzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgX191c2VyICosIGF0dHJfdXB0ciwKKwkJcGlkX3QsIHBpZCwgaW50LCBjcHUsIGludCwgZ3JvdXBfZmQsIHVuc2lnbmVkIGxvbmcsIGZsYWdzKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXIsICpncm91cF9sZWFkZXI7CisJc3RydWN0IHBlcmZfY291bnRlcl9hdHRyIGF0dHI7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHg7CisJc3RydWN0IGZpbGUgKmNvdW50ZXJfZmlsZSA9IE5VTEw7CisJc3RydWN0IGZpbGUgKmdyb3VwX2ZpbGUgPSBOVUxMOworCWludCBmcHV0X25lZWRlZCA9IDA7CisJaW50IGZwdXRfbmVlZGVkMiA9IDA7CisJaW50IHJldDsKKworCS8qIGZvciBmdXR1cmUgZXhwYW5kYWJpbGl0eS4uLiAqLworCWlmIChmbGFncykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmF0dHIsIGF0dHJfdXB0ciwgc2l6ZW9mKGF0dHIpKSAhPSAwKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCWlmICghYXR0ci5leGNsdWRlX2tlcm5lbCkgeworCQlpZiAocGVyZl9wYXJhbm9pZF9rZXJuZWwoKSAmJiAhY2FwYWJsZShDQVBfU1lTX0FETUlOKSkKKwkJCXJldHVybiAtRUFDQ0VTOworCX0KKworCWlmIChhdHRyLmZyZXEpIHsKKwkJaWYgKGF0dHIuc2FtcGxlX2ZyZXEgPiBzeXNjdGxfcGVyZl9jb3VudGVyX3NhbXBsZV9yYXRlKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBHZXQgdGhlIHRhcmdldCBjb250ZXh0ICh0YXNrIG9yIHBlcmNwdSk6CisJICovCisJY3R4ID0gZmluZF9nZXRfY29udGV4dChwaWQsIGNwdSk7CisJaWYgKElTX0VSUihjdHgpKQorCQlyZXR1cm4gUFRSX0VSUihjdHgpOworCisJLyoKKwkgKiBMb29rIHVwIHRoZSBncm91cCBsZWFkZXIgKHdlIHdpbGwgYXR0YWNoIHRoaXMgY291bnRlciB0byBpdCk6CisJICovCisJZ3JvdXBfbGVhZGVyID0gTlVMTDsKKwlpZiAoZ3JvdXBfZmQgIT0gLTEpIHsKKwkJcmV0ID0gLUVJTlZBTDsKKwkJZ3JvdXBfZmlsZSA9IGZnZXRfbGlnaHQoZ3JvdXBfZmQsICZmcHV0X25lZWRlZCk7CisJCWlmICghZ3JvdXBfZmlsZSkKKwkJCWdvdG8gZXJyX3B1dF9jb250ZXh0OworCQlpZiAoZ3JvdXBfZmlsZS0+Zl9vcCAhPSAmcGVyZl9mb3BzKQorCQkJZ290byBlcnJfcHV0X2NvbnRleHQ7CisKKwkJZ3JvdXBfbGVhZGVyID0gZ3JvdXBfZmlsZS0+cHJpdmF0ZV9kYXRhOworCQkvKgorCQkgKiBEbyBub3QgYWxsb3cgYSByZWN1cnNpdmUgaGllcmFyY2h5ICh0aGlzIG5ldyBzaWJsaW5nCisJCSAqIGJlY29taW5nIHBhcnQgb2YgYW5vdGhlciBncm91cC1zaWJsaW5nKToKKwkJICovCisJCWlmIChncm91cF9sZWFkZXItPmdyb3VwX2xlYWRlciAhPSBncm91cF9sZWFkZXIpCisJCQlnb3RvIGVycl9wdXRfY29udGV4dDsKKwkJLyoKKwkJICogRG8gbm90IGFsbG93IHRvIGF0dGFjaCB0byBhIGdyb3VwIGluIGEgZGlmZmVyZW50CisJCSAqIHRhc2sgb3IgQ1BVIGNvbnRleHQ6CisJCSAqLworCQlpZiAoZ3JvdXBfbGVhZGVyLT5jdHggIT0gY3R4KQorCQkJZ290byBlcnJfcHV0X2NvbnRleHQ7CisJCS8qCisJCSAqIE9ubHkgYSBncm91cCBsZWFkZXIgY2FuIGJlIGV4Y2x1c2l2ZSBvciBwaW5uZWQKKwkJICovCisJCWlmIChhdHRyLmV4Y2x1c2l2ZSB8fCBhdHRyLnBpbm5lZCkKKwkJCWdvdG8gZXJyX3B1dF9jb250ZXh0OworCX0KKworCWNvdW50ZXIgPSBwZXJmX2NvdW50ZXJfYWxsb2MoJmF0dHIsIGNwdSwgY3R4LCBncm91cF9sZWFkZXIsCisJCQkJICAgICBHRlBfS0VSTkVMKTsKKwlyZXQgPSBQVFJfRVJSKGNvdW50ZXIpOworCWlmIChJU19FUlIoY291bnRlcikpCisJCWdvdG8gZXJyX3B1dF9jb250ZXh0OworCisJcmV0ID0gYW5vbl9pbm9kZV9nZXRmZCgiW3BlcmZfY291bnRlcl0iLCAmcGVyZl9mb3BzLCBjb3VudGVyLCAwKTsKKwlpZiAocmV0IDwgMCkKKwkJZ290byBlcnJfZnJlZV9wdXRfY29udGV4dDsKKworCWNvdW50ZXJfZmlsZSA9IGZnZXRfbGlnaHQocmV0LCAmZnB1dF9uZWVkZWQyKTsKKwlpZiAoIWNvdW50ZXJfZmlsZSkKKwkJZ290byBlcnJfZnJlZV9wdXRfY29udGV4dDsKKworCWNvdW50ZXItPmZpbHAgPSBjb3VudGVyX2ZpbGU7CisJV0FSTl9PTl9PTkNFKGN0eC0+cGFyZW50X2N0eCk7CisJbXV0ZXhfbG9jaygmY3R4LT5tdXRleCk7CisJcGVyZl9pbnN0YWxsX2luX2NvbnRleHQoY3R4LCBjb3VudGVyLCBjcHUpOworCSsrY3R4LT5nZW5lcmF0aW9uOworCW11dGV4X3VubG9jaygmY3R4LT5tdXRleCk7CisKKwljb3VudGVyLT5vd25lciA9IGN1cnJlbnQ7CisJZ2V0X3Rhc2tfc3RydWN0KGN1cnJlbnQpOworCW11dGV4X2xvY2soJmN1cnJlbnQtPnBlcmZfY291bnRlcl9tdXRleCk7CisJbGlzdF9hZGRfdGFpbCgmY291bnRlci0+b3duZXJfZW50cnksICZjdXJyZW50LT5wZXJmX2NvdW50ZXJfbGlzdCk7CisJbXV0ZXhfdW5sb2NrKCZjdXJyZW50LT5wZXJmX2NvdW50ZXJfbXV0ZXgpOworCisJZnB1dF9saWdodChjb3VudGVyX2ZpbGUsIGZwdXRfbmVlZGVkMik7CisKK291dF9mcHV0OgorCWZwdXRfbGlnaHQoZ3JvdXBfZmlsZSwgZnB1dF9uZWVkZWQpOworCisJcmV0dXJuIHJldDsKKworZXJyX2ZyZWVfcHV0X2NvbnRleHQ6CisJa2ZyZWUoY291bnRlcik7CisKK2Vycl9wdXRfY29udGV4dDoKKwlwdXRfY3R4KGN0eCk7CisKKwlnb3RvIG91dF9mcHV0OworfQorCisvKgorICogaW5oZXJpdCBhIGNvdW50ZXIgZnJvbSBwYXJlbnQgdGFzayB0byBjaGlsZCB0YXNrOgorICovCitzdGF0aWMgc3RydWN0IHBlcmZfY291bnRlciAqCitpbmhlcml0X2NvdW50ZXIoc3RydWN0IHBlcmZfY291bnRlciAqcGFyZW50X2NvdW50ZXIsCisJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQsCisJICAgICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpwYXJlbnRfY3R4LAorCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCisJICAgICAgc3RydWN0IHBlcmZfY291bnRlciAqZ3JvdXBfbGVhZGVyLAorCSAgICAgIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY2hpbGRfY3R4KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNoaWxkX2NvdW50ZXI7CisKKwkvKgorCSAqIEluc3RlYWQgb2YgY3JlYXRpbmcgcmVjdXJzaXZlIGhpZXJhcmNoaWVzIG9mIGNvdW50ZXJzLAorCSAqIHdlIGxpbmsgaW5oZXJpdGVkIGNvdW50ZXJzIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHBhcmVudCwKKwkgKiB3aGljaCBoYXMgYSBmaWxwIGZvciBzdXJlLCB3aGljaCB3ZSB1c2UgYXMgdGhlIHJlZmVyZW5jZQorCSAqIGNvdW50OgorCSAqLworCWlmIChwYXJlbnRfY291bnRlci0+cGFyZW50KQorCQlwYXJlbnRfY291bnRlciA9IHBhcmVudF9jb3VudGVyLT5wYXJlbnQ7CisKKwljaGlsZF9jb3VudGVyID0gcGVyZl9jb3VudGVyX2FsbG9jKCZwYXJlbnRfY291bnRlci0+YXR0ciwKKwkJCQkJICAgcGFyZW50X2NvdW50ZXItPmNwdSwgY2hpbGRfY3R4LAorCQkJCQkgICBncm91cF9sZWFkZXIsIEdGUF9LRVJORUwpOworCWlmIChJU19FUlIoY2hpbGRfY291bnRlcikpCisJCXJldHVybiBjaGlsZF9jb3VudGVyOworCWdldF9jdHgoY2hpbGRfY3R4KTsKKworCS8qCisJICogTWFrZSB0aGUgY2hpbGQgc3RhdGUgZm9sbG93IHRoZSBzdGF0ZSBvZiB0aGUgcGFyZW50IGNvdW50ZXIsCisJICogbm90IGl0cyBhdHRyLmRpc2FibGVkIGJpdC4gIFdlIGhvbGQgdGhlIHBhcmVudCdzIG11dGV4LAorCSAqIHNvIHdlIHdvbid0IHJhY2Ugd2l0aCBwZXJmX2NvdW50ZXJfe2VuLCBkaXN9YWJsZV9mYW1pbHkuCisJICovCisJaWYgKHBhcmVudF9jb3VudGVyLT5zdGF0ZSA+PSBQRVJGX0NPVU5URVJfU1RBVEVfSU5BQ1RJVkUpCisJCWNoaWxkX2NvdW50ZXItPnN0YXRlID0gUEVSRl9DT1VOVEVSX1NUQVRFX0lOQUNUSVZFOworCWVsc2UKKwkJY2hpbGRfY291bnRlci0+c3RhdGUgPSBQRVJGX0NPVU5URVJfU1RBVEVfT0ZGOworCisJaWYgKHBhcmVudF9jb3VudGVyLT5hdHRyLmZyZXEpCisJCWNoaWxkX2NvdW50ZXItPmh3LnNhbXBsZV9wZXJpb2QgPSBwYXJlbnRfY291bnRlci0+aHcuc2FtcGxlX3BlcmlvZDsKKworCS8qCisJICogTGluayBpdCB1cCBpbiB0aGUgY2hpbGQncyBjb250ZXh0OgorCSAqLworCWFkZF9jb3VudGVyX3RvX2N0eChjaGlsZF9jb3VudGVyLCBjaGlsZF9jdHgpOworCisJY2hpbGRfY291bnRlci0+cGFyZW50ID0gcGFyZW50X2NvdW50ZXI7CisJLyoKKwkgKiBpbmhlcml0IGludG8gY2hpbGQncyBjaGlsZCBhcyB3ZWxsOgorCSAqLworCWNoaWxkX2NvdW50ZXItPmF0dHIuaW5oZXJpdCA9IDE7CisKKwkvKgorCSAqIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyZW50IGZpbHAgLSB3ZSB3aWxsIGZwdXQgaXQKKwkgKiB3aGVuIHRoZSBjaGlsZCBjb3VudGVyIGV4aXRzLiBUaGlzIGlzIHNhZmUgdG8gZG8gYmVjYXVzZQorCSAqIHdlIGFyZSBpbiB0aGUgcGFyZW50IGFuZCB3ZSBrbm93IHRoYXQgdGhlIGZpbHAgc3RpbGwKKwkgKiBleGlzdHMgYW5kIGhhcyBhIG5vbnplcm8gY291bnQ6CisJICovCisJYXRvbWljX2xvbmdfaW5jKCZwYXJlbnRfY291bnRlci0+ZmlscC0+Zl9jb3VudCk7CisKKwkvKgorCSAqIExpbmsgdGhpcyBpbnRvIHRoZSBwYXJlbnQgY291bnRlcidzIGNoaWxkIGxpc3QKKwkgKi8KKwlXQVJOX09OX09OQ0UocGFyZW50X2NvdW50ZXItPmN0eC0+cGFyZW50X2N0eCk7CisJbXV0ZXhfbG9jaygmcGFyZW50X2NvdW50ZXItPmNoaWxkX211dGV4KTsKKwlsaXN0X2FkZF90YWlsKCZjaGlsZF9jb3VudGVyLT5jaGlsZF9saXN0LCAmcGFyZW50X2NvdW50ZXItPmNoaWxkX2xpc3QpOworCW11dGV4X3VubG9jaygmcGFyZW50X2NvdW50ZXItPmNoaWxkX211dGV4KTsKKworCXJldHVybiBjaGlsZF9jb3VudGVyOworfQorCitzdGF0aWMgaW50IGluaGVyaXRfZ3JvdXAoc3RydWN0IHBlcmZfY291bnRlciAqcGFyZW50X2NvdW50ZXIsCisJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQsCisJICAgICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpwYXJlbnRfY3R4LAorCSAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsCisJICAgICAgc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjaGlsZF9jdHgpCit7CisJc3RydWN0IHBlcmZfY291bnRlciAqbGVhZGVyOworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKnN1YjsKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjaGlsZF9jdHI7CisKKwlsZWFkZXIgPSBpbmhlcml0X2NvdW50ZXIocGFyZW50X2NvdW50ZXIsIHBhcmVudCwgcGFyZW50X2N0eCwKKwkJCQkgY2hpbGQsIE5VTEwsIGNoaWxkX2N0eCk7CisJaWYgKElTX0VSUihsZWFkZXIpKQorCQlyZXR1cm4gUFRSX0VSUihsZWFkZXIpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoc3ViLCAmcGFyZW50X2NvdW50ZXItPnNpYmxpbmdfbGlzdCwgbGlzdF9lbnRyeSkgeworCQljaGlsZF9jdHIgPSBpbmhlcml0X2NvdW50ZXIoc3ViLCBwYXJlbnQsIHBhcmVudF9jdHgsCisJCQkJCSAgICBjaGlsZCwgbGVhZGVyLCBjaGlsZF9jdHgpOworCQlpZiAoSVNfRVJSKGNoaWxkX2N0cikpCisJCQlyZXR1cm4gUFRSX0VSUihjaGlsZF9jdHIpOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgc3luY19jaGlsZF9jb3VudGVyKHN0cnVjdCBwZXJmX2NvdW50ZXIgKmNoaWxkX2NvdW50ZXIsCisJCQkgICAgICAgc3RydWN0IHBlcmZfY291bnRlciAqcGFyZW50X2NvdW50ZXIpCit7CisJdTY0IGNoaWxkX3ZhbDsKKworCWNoaWxkX3ZhbCA9IGF0b21pYzY0X3JlYWQoJmNoaWxkX2NvdW50ZXItPmNvdW50KTsKKworCS8qCisJICogQWRkIGJhY2sgdGhlIGNoaWxkJ3MgY291bnQgdG8gdGhlIHBhcmVudCdzIGNvdW50OgorCSAqLworCWF0b21pYzY0X2FkZChjaGlsZF92YWwsICZwYXJlbnRfY291bnRlci0+Y291bnQpOworCWF0b21pYzY0X2FkZChjaGlsZF9jb3VudGVyLT50b3RhbF90aW1lX2VuYWJsZWQsCisJCSAgICAgJnBhcmVudF9jb3VudGVyLT5jaGlsZF90b3RhbF90aW1lX2VuYWJsZWQpOworCWF0b21pYzY0X2FkZChjaGlsZF9jb3VudGVyLT50b3RhbF90aW1lX3J1bm5pbmcsCisJCSAgICAgJnBhcmVudF9jb3VudGVyLT5jaGlsZF90b3RhbF90aW1lX3J1bm5pbmcpOworCisJLyoKKwkgKiBSZW1vdmUgdGhpcyBjb3VudGVyIGZyb20gdGhlIHBhcmVudCdzIGxpc3QKKwkgKi8KKwlXQVJOX09OX09OQ0UocGFyZW50X2NvdW50ZXItPmN0eC0+cGFyZW50X2N0eCk7CisJbXV0ZXhfbG9jaygmcGFyZW50X2NvdW50ZXItPmNoaWxkX211dGV4KTsKKwlsaXN0X2RlbF9pbml0KCZjaGlsZF9jb3VudGVyLT5jaGlsZF9saXN0KTsKKwltdXRleF91bmxvY2soJnBhcmVudF9jb3VudGVyLT5jaGlsZF9tdXRleCk7CisKKwkvKgorCSAqIFJlbGVhc2UgdGhlIHBhcmVudCBjb3VudGVyLCBpZiB0aGlzIHdhcyB0aGUgbGFzdAorCSAqIHJlZmVyZW5jZSB0byBpdC4KKwkgKi8KKwlmcHV0KHBhcmVudF9jb3VudGVyLT5maWxwKTsKK30KKworc3RhdGljIHZvaWQKK19fcGVyZl9jb3VudGVyX2V4aXRfdGFzayhzdHJ1Y3QgcGVyZl9jb3VudGVyICpjaGlsZF9jb3VudGVyLAorCQkJIHN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY2hpbGRfY3R4KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKnBhcmVudF9jb3VudGVyOworCisJdXBkYXRlX2NvdW50ZXJfdGltZXMoY2hpbGRfY291bnRlcik7CisJcGVyZl9jb3VudGVyX3JlbW92ZV9mcm9tX2NvbnRleHQoY2hpbGRfY291bnRlcik7CisKKwlwYXJlbnRfY291bnRlciA9IGNoaWxkX2NvdW50ZXItPnBhcmVudDsKKwkvKgorCSAqIEl0IGNhbiBoYXBwZW4gdGhhdCBwYXJlbnQgZXhpdHMgZmlyc3QsIGFuZCBoYXMgY291bnRlcnMKKwkgKiB0aGF0IGFyZSBzdGlsbCBhcm91bmQgZHVlIHRvIHRoZSBjaGlsZCByZWZlcmVuY2UuIFRoZXNlCisJICogY291bnRlcnMgbmVlZCB0byBiZSB6YXBwZWQgLSBidXQgb3RoZXJ3aXNlIGxpbmdlci4KKwkgKi8KKwlpZiAocGFyZW50X2NvdW50ZXIpIHsKKwkJc3luY19jaGlsZF9jb3VudGVyKGNoaWxkX2NvdW50ZXIsIHBhcmVudF9jb3VudGVyKTsKKwkJZnJlZV9jb3VudGVyKGNoaWxkX2NvdW50ZXIpOworCX0KK30KKworLyoKKyAqIFdoZW4gYSBjaGlsZCB0YXNrIGV4aXRzLCBmZWVkIGJhY2sgY291bnRlciB2YWx1ZXMgdG8gcGFyZW50IGNvdW50ZXJzLgorICovCit2b2lkIHBlcmZfY291bnRlcl9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyICpjaGlsZF9jb3VudGVyLCAqdG1wOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY2hpbGRfY3R4OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisKKwlpZiAobGlrZWx5KCFjaGlsZC0+cGVyZl9jb3VudGVyX2N0eHApKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisJLyoKKwkgKiBXZSBjYW4ndCByZXNjaGVkdWxlIGhlcmUgYmVjYXVzZSBpbnRlcnJ1cHRzIGFyZSBkaXNhYmxlZCwKKwkgKiBhbmQgZWl0aGVyIGNoaWxkIGlzIGN1cnJlbnQgb3IgaXQgaXMgYSB0YXNrIHRoYXQgY2FuJ3QgYmUKKwkgKiBzY2hlZHVsZWQsIHNvIHdlIGFyZSBub3cgc2FmZSBmcm9tIHJlc2NoZWR1bGluZyBjaGFuZ2luZworCSAqIG91ciBjb250ZXh0LgorCSAqLworCWNoaWxkX2N0eCA9IGNoaWxkLT5wZXJmX2NvdW50ZXJfY3R4cDsKKwlfX3BlcmZfY291bnRlcl90YXNrX3NjaGVkX291dChjaGlsZF9jdHgpOworCisJLyoKKwkgKiBUYWtlIHRoZSBjb250ZXh0IGxvY2sgaGVyZSBzbyB0aGF0IGlmIGZpbmRfZ2V0X2NvbnRleHQgaXMKKwkgKiByZWFkaW5nIGNoaWxkLT5wZXJmX2NvdW50ZXJfY3R4cCwgd2Ugd2FpdCB1bnRpbCBpdCBoYXMKKwkgKiBpbmNyZW1lbnRlZCB0aGUgY29udGV4dCdzIHJlZmNvdW50IGJlZm9yZSB3ZSBkbyBwdXRfY3R4IGJlbG93LgorCSAqLworCXNwaW5fbG9jaygmY2hpbGRfY3R4LT5sb2NrKTsKKwljaGlsZC0+cGVyZl9jb3VudGVyX2N0eHAgPSBOVUxMOworCWlmIChjaGlsZF9jdHgtPnBhcmVudF9jdHgpIHsKKwkJLyoKKwkJICogVGhpcyBjb250ZXh0IGlzIGEgY2xvbmU7IHVuY2xvbmUgaXQgc28gaXQgY2FuJ3QgZ2V0CisJCSAqIHN3YXBwZWQgdG8gYW5vdGhlciBwcm9jZXNzIHdoaWxlIHdlJ3JlIHJlbW92aW5nIGFsbAorCQkgKiB0aGUgY291bnRlcnMgZnJvbSBpdC4KKwkJICovCisJCXB1dF9jdHgoY2hpbGRfY3R4LT5wYXJlbnRfY3R4KTsKKwkJY2hpbGRfY3R4LT5wYXJlbnRfY3R4ID0gTlVMTDsKKwl9CisJc3Bpbl91bmxvY2soJmNoaWxkX2N0eC0+bG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyoKKwkgKiBXZSBjYW4gcmVjdXJzZSBvbiB0aGUgc2FtZSBsb2NrIHR5cGUgdGhyb3VnaDoKKwkgKgorCSAqICAgX19wZXJmX2NvdW50ZXJfZXhpdF90YXNrKCkKKwkgKiAgICAgc3luY19jaGlsZF9jb3VudGVyKCkKKwkgKiAgICAgICBmcHV0KHBhcmVudF9jb3VudGVyLT5maWxwKQorCSAqICAgICAgICAgcGVyZl9yZWxlYXNlKCkKKwkgKiAgICAgICAgICAgbXV0ZXhfbG9jaygmY3R4LT5tdXRleCkKKwkgKgorCSAqIEJ1dCBzaW5jZSBpdHMgdGhlIHBhcmVudCBjb250ZXh0IGl0IHdvbid0IGJlIHRoZSBzYW1lIGluc3RhbmNlLgorCSAqLworCW11dGV4X2xvY2tfbmVzdGVkKCZjaGlsZF9jdHgtPm11dGV4LCBTSU5HTEVfREVQVEhfTkVTVElORyk7CisKK2FnYWluOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjaGlsZF9jb3VudGVyLCB0bXAsICZjaGlsZF9jdHgtPmNvdW50ZXJfbGlzdCwKKwkJCQkgbGlzdF9lbnRyeSkKKwkJX19wZXJmX2NvdW50ZXJfZXhpdF90YXNrKGNoaWxkX2NvdW50ZXIsIGNoaWxkX2N0eCk7CisKKwkvKgorCSAqIElmIHRoZSBsYXN0IGNvdW50ZXIgd2FzIGEgZ3JvdXAgY291bnRlciwgaXQgd2lsbCBoYXZlIGFwcGVuZGVkIGFsbAorCSAqIGl0cyBzaWJsaW5ncyB0byB0aGUgbGlzdCwgYnV0IHdlIG9idGFpbmVkICd0bXAnIGJlZm9yZSB0aGF0IHdoaWNoCisJICogd2lsbCBzdGlsbCBwb2ludCB0byB0aGUgbGlzdCBoZWFkIHRlcm1pbmF0aW5nIHRoZSBpdGVyYXRpb24uCisJICovCisJaWYgKCFsaXN0X2VtcHR5KCZjaGlsZF9jdHgtPmNvdW50ZXJfbGlzdCkpCisJCWdvdG8gYWdhaW47CisKKwltdXRleF91bmxvY2soJmNoaWxkX2N0eC0+bXV0ZXgpOworCisJcHV0X2N0eChjaGlsZF9jdHgpOworfQorCisvKgorICogZnJlZSBhbiB1bmV4cG9zZWQsIHVudXNlZCBjb250ZXh0IGFzIGNyZWF0ZWQgYnkgaW5oZXJpdGFuY2UgYnkKKyAqIGluaXRfdGFzayBiZWxvdywgdXNlZCBieSBmb3JrKCkgaW4gY2FzZSBvZiBmYWlsLgorICovCit2b2lkIHBlcmZfY291bnRlcl9mcmVlX3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gdGFzay0+cGVyZl9jb3VudGVyX2N0eHA7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgKnRtcDsKKworCWlmICghY3R4KQorCQlyZXR1cm47CisKKwltdXRleF9sb2NrKCZjdHgtPm11dGV4KTsKK2FnYWluOgorCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb3VudGVyLCB0bXAsICZjdHgtPmNvdW50ZXJfbGlzdCwgbGlzdF9lbnRyeSkgeworCQlzdHJ1Y3QgcGVyZl9jb3VudGVyICpwYXJlbnQgPSBjb3VudGVyLT5wYXJlbnQ7CisKKwkJaWYgKFdBUk5fT05fT05DRSghcGFyZW50KSkKKwkJCWNvbnRpbnVlOworCisJCW11dGV4X2xvY2soJnBhcmVudC0+Y2hpbGRfbXV0ZXgpOworCQlsaXN0X2RlbF9pbml0KCZjb3VudGVyLT5jaGlsZF9saXN0KTsKKwkJbXV0ZXhfdW5sb2NrKCZwYXJlbnQtPmNoaWxkX211dGV4KTsKKworCQlmcHV0KHBhcmVudC0+ZmlscCk7CisKKwkJbGlzdF9kZWxfY291bnRlcihjb3VudGVyLCBjdHgpOworCQlmcmVlX2NvdW50ZXIoY291bnRlcik7CisJfQorCisJaWYgKCFsaXN0X2VtcHR5KCZjdHgtPmNvdW50ZXJfbGlzdCkpCisJCWdvdG8gYWdhaW47CisKKwltdXRleF91bmxvY2soJmN0eC0+bXV0ZXgpOworCisJcHV0X2N0eChjdHgpOworfQorCisvKgorICogSW5pdGlhbGl6ZSB0aGUgcGVyZl9jb3VudGVyIGNvbnRleHQgaW4gdGFza19zdHJ1Y3QKKyAqLworaW50IHBlcmZfY291bnRlcl9pbml0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICpjaGlsZCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2NvbnRleHQgKmNoaWxkX2N0eCwgKnBhcmVudF9jdHg7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjbG9uZWRfY3R4OworCXN0cnVjdCBwZXJmX2NvdW50ZXIgKmNvdW50ZXI7CisJc3RydWN0IHRhc2tfc3RydWN0ICpwYXJlbnQgPSBjdXJyZW50OworCWludCBpbmhlcml0ZWRfYWxsID0gMTsKKwlpbnQgcmV0ID0gMDsKKworCWNoaWxkLT5wZXJmX2NvdW50ZXJfY3R4cCA9IE5VTEw7CisKKwltdXRleF9pbml0KCZjaGlsZC0+cGVyZl9jb3VudGVyX211dGV4KTsKKwlJTklUX0xJU1RfSEVBRCgmY2hpbGQtPnBlcmZfY291bnRlcl9saXN0KTsKKworCWlmIChsaWtlbHkoIXBhcmVudC0+cGVyZl9jb3VudGVyX2N0eHApKQorCQlyZXR1cm4gMDsKKworCS8qCisJICogVGhpcyBpcyBleGVjdXRlZCBmcm9tIHRoZSBwYXJlbnQgdGFzayBjb250ZXh0LCBzbyBpbmhlcml0CisJICogY291bnRlcnMgdGhhdCBoYXZlIGJlZW4gbWFya2VkIGZvciBjbG9uaW5nLgorCSAqIEZpcnN0IGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgY29udGV4dCBmb3IgdGhlIGNoaWxkLgorCSAqLworCisJY2hpbGRfY3R4ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFjaGlsZF9jdHgpCisJCXJldHVybiAtRU5PTUVNOworCisJX19wZXJmX2NvdW50ZXJfaW5pdF9jb250ZXh0KGNoaWxkX2N0eCwgY2hpbGQpOworCWNoaWxkLT5wZXJmX2NvdW50ZXJfY3R4cCA9IGNoaWxkX2N0eDsKKwlnZXRfdGFza19zdHJ1Y3QoY2hpbGQpOworCisJLyoKKwkgKiBJZiB0aGUgcGFyZW50J3MgY29udGV4dCBpcyBhIGNsb25lLCBwaW4gaXQgc28gaXQgd29uJ3QgZ2V0CisJICogc3dhcHBlZCB1bmRlciB1cy4KKwkgKi8KKwlwYXJlbnRfY3R4ID0gcGVyZl9waW5fdGFza19jb250ZXh0KHBhcmVudCk7CisKKwkvKgorCSAqIE5vIG5lZWQgdG8gY2hlY2sgaWYgcGFyZW50X2N0eCAhPSBOVUxMIGhlcmU7IHNpbmNlIHdlIHNhdworCSAqIGl0IG5vbi1OVUxMIGVhcmxpZXIsIHRoZSBvbmx5IHJlYXNvbiBmb3IgaXQgdG8gYmVjb21lIE5VTEwKKwkgKiBpcyBpZiB3ZSBleGl0LCBhbmQgc2luY2Ugd2UncmUgY3VycmVudGx5IGluIHRoZSBtaWRkbGUgb2YKKwkgKiBhIGZvcmsgd2UgY2FuJ3QgYmUgZXhpdGluZyBhdCB0aGUgc2FtZSB0aW1lLgorCSAqLworCisJLyoKKwkgKiBMb2NrIHRoZSBwYXJlbnQgbGlzdC4gTm8gbmVlZCB0byBsb2NrIHRoZSBjaGlsZCAtIG5vdCBQSUQKKwkgKiBoYXNoZWQgeWV0IGFuZCBub3QgcnVubmluZywgc28gbm9ib2R5IGNhbiBhY2Nlc3MgaXQuCisJICovCisJbXV0ZXhfbG9jaygmcGFyZW50X2N0eC0+bXV0ZXgpOworCisJLyoKKwkgKiBXZSBkb250IGhhdmUgdG8gZGlzYWJsZSBOTUlzIC0gd2UgYXJlIG9ubHkgbG9va2luZyBhdAorCSAqIHRoZSBsaXN0LCBub3QgbWFuaXB1bGF0aW5nIGl0OgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGNvdW50ZXIsICZwYXJlbnRfY3R4LT5ldmVudF9saXN0LCBldmVudF9lbnRyeSkgeworCQlpZiAoY291bnRlciAhPSBjb3VudGVyLT5ncm91cF9sZWFkZXIpCisJCQljb250aW51ZTsKKworCQlpZiAoIWNvdW50ZXItPmF0dHIuaW5oZXJpdCkgeworCQkJaW5oZXJpdGVkX2FsbCA9IDA7CisJCQljb250aW51ZTsKKwkJfQorCisJCXJldCA9IGluaGVyaXRfZ3JvdXAoY291bnRlciwgcGFyZW50LCBwYXJlbnRfY3R4LAorCQkJCQkgICAgIGNoaWxkLCBjaGlsZF9jdHgpOworCQlpZiAocmV0KSB7CisJCQlpbmhlcml0ZWRfYWxsID0gMDsKKwkJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGluaGVyaXRlZF9hbGwpIHsKKwkJLyoKKwkJICogTWFyayB0aGUgY2hpbGQgY29udGV4dCBhcyBhIGNsb25lIG9mIHRoZSBwYXJlbnQKKwkJICogY29udGV4dCwgb3Igb2Ygd2hhdGV2ZXIgdGhlIHBhcmVudCBpcyBhIGNsb25lIG9mLgorCQkgKiBOb3RlIHRoYXQgaWYgdGhlIHBhcmVudCBpcyBhIGNsb25lLCBpdCBjb3VsZCBnZXQKKwkJICogdW5jbG9uZWQgYXQgYW55IHBvaW50LCBidXQgdGhhdCBkb2Vzbid0IG1hdHRlcgorCQkgKiBiZWNhdXNlIHRoZSBsaXN0IG9mIGNvdW50ZXJzIGFuZCB0aGUgZ2VuZXJhdGlvbgorCQkgKiBjb3VudCBjYW4ndCBoYXZlIGNoYW5nZWQgc2luY2Ugd2UgdG9vayB0aGUgbXV0ZXguCisJCSAqLworCQljbG9uZWRfY3R4ID0gcmN1X2RlcmVmZXJlbmNlKHBhcmVudF9jdHgtPnBhcmVudF9jdHgpOworCQlpZiAoY2xvbmVkX2N0eCkgeworCQkJY2hpbGRfY3R4LT5wYXJlbnRfY3R4ID0gY2xvbmVkX2N0eDsKKwkJCWNoaWxkX2N0eC0+cGFyZW50X2dlbiA9IHBhcmVudF9jdHgtPnBhcmVudF9nZW47CisJCX0gZWxzZSB7CisJCQljaGlsZF9jdHgtPnBhcmVudF9jdHggPSBwYXJlbnRfY3R4OworCQkJY2hpbGRfY3R4LT5wYXJlbnRfZ2VuID0gcGFyZW50X2N0eC0+Z2VuZXJhdGlvbjsKKwkJfQorCQlnZXRfY3R4KGNoaWxkX2N0eC0+cGFyZW50X2N0eCk7CisJfQorCisJbXV0ZXhfdW5sb2NrKCZwYXJlbnRfY3R4LT5tdXRleCk7CisKKwlwZXJmX3VucGluX2NvbnRleHQocGFyZW50X2N0eCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgdm9pZCBfX2NwdWluaXQgcGVyZl9jb3VudGVyX2luaXRfY3B1KGludCBjcHUpCit7CisJc3RydWN0IHBlcmZfY3B1X2NvbnRleHQgKmNwdWN0eDsKKworCWNwdWN0eCA9ICZwZXJfY3B1KHBlcmZfY3B1X2NvbnRleHQsIGNwdSk7CisJX19wZXJmX2NvdW50ZXJfaW5pdF9jb250ZXh0KCZjcHVjdHgtPmN0eCwgTlVMTCk7CisKKwlzcGluX2xvY2soJnBlcmZfcmVzb3VyY2VfbG9jayk7CisJY3B1Y3R4LT5tYXhfcGVydGFzayA9IHBlcmZfbWF4X2NvdW50ZXJzIC0gcGVyZl9yZXNlcnZlZF9wZXJjcHU7CisJc3Bpbl91bmxvY2soJnBlcmZfcmVzb3VyY2VfbG9jayk7CisKKwlod19wZXJmX2NvdW50ZXJfc2V0dXAoY3B1KTsKK30KKworI2lmZGVmIENPTkZJR19IT1RQTFVHX0NQVQorc3RhdGljIHZvaWQgX19wZXJmX2NvdW50ZXJfZXhpdF9jcHUodm9pZCAqaW5mbykKK3sKKwlzdHJ1Y3QgcGVyZl9jcHVfY29udGV4dCAqY3B1Y3R4ID0gJl9fZ2V0X2NwdV92YXIocGVyZl9jcHVfY29udGV4dCk7CisJc3RydWN0IHBlcmZfY291bnRlcl9jb250ZXh0ICpjdHggPSAmY3B1Y3R4LT5jdHg7CisJc3RydWN0IHBlcmZfY291bnRlciAqY291bnRlciwgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShjb3VudGVyLCB0bXAsICZjdHgtPmNvdW50ZXJfbGlzdCwgbGlzdF9lbnRyeSkKKwkJX19wZXJmX2NvdW50ZXJfcmVtb3ZlX2Zyb21fY29udGV4dChjb3VudGVyKTsKK30KK3N0YXRpYyB2b2lkIHBlcmZfY291bnRlcl9leGl0X2NwdShpbnQgY3B1KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHggPSAmcGVyX2NwdShwZXJmX2NwdV9jb250ZXh0LCBjcHUpOworCXN0cnVjdCBwZXJmX2NvdW50ZXJfY29udGV4dCAqY3R4ID0gJmNwdWN0eC0+Y3R4OworCisJbXV0ZXhfbG9jaygmY3R4LT5tdXRleCk7CisJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgX19wZXJmX2NvdW50ZXJfZXhpdF9jcHUsIE5VTEwsIDEpOworCW11dGV4X3VubG9jaygmY3R4LT5tdXRleCk7Cit9CisjZWxzZQorc3RhdGljIGlubGluZSB2b2lkIHBlcmZfY291bnRlcl9leGl0X2NwdShpbnQgY3B1KSB7IH0KKyNlbmRpZgorCitzdGF0aWMgaW50IF9fY3B1aW5pdAorcGVyZl9jcHVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwgdW5zaWduZWQgbG9uZyBhY3Rpb24sIHZvaWQgKmhjcHUpCit7CisJdW5zaWduZWQgaW50IGNwdSA9IChsb25nKWhjcHU7CisKKwlzd2l0Y2ggKGFjdGlvbikgeworCisJY2FzZSBDUFVfVVBfUFJFUEFSRToKKwljYXNlIENQVV9VUF9QUkVQQVJFX0ZST1pFTjoKKwkJcGVyZl9jb3VudGVyX2luaXRfY3B1KGNwdSk7CisJCWJyZWFrOworCisJY2FzZSBDUFVfRE9XTl9QUkVQQVJFOgorCWNhc2UgQ1BVX0RPV05fUFJFUEFSRV9GUk9aRU46CisJCXBlcmZfY291bnRlcl9leGl0X2NwdShjcHUpOworCQlicmVhazsKKworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiBOT1RJRllfT0s7Cit9CisKKy8qCisgKiBUaGlzIGhhcyB0byBoYXZlIGEgaGlnaGVyIHByaW9yaXR5IHRoYW4gbWlncmF0aW9uX25vdGlmaWVyIGluIHNjaGVkLmMuCisgKi8KK3N0YXRpYyBzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgX19jcHVpbml0ZGF0YSBwZXJmX2NwdV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbAkJPSBwZXJmX2NwdV9ub3RpZnksCisJLnByaW9yaXR5CQk9IDIwLAorfTsKKwordm9pZCBfX2luaXQgcGVyZl9jb3VudGVyX2luaXQodm9pZCkKK3sKKwlwZXJmX2NwdV9ub3RpZnkoJnBlcmZfY3B1X25iLCAodW5zaWduZWQgbG9uZylDUFVfVVBfUFJFUEFSRSwKKwkJCSh2b2lkICopKGxvbmcpc21wX3Byb2Nlc3Nvcl9pZCgpKTsKKwlyZWdpc3Rlcl9jcHVfbm90aWZpZXIoJnBlcmZfY3B1X25iKTsKK30KKworc3RhdGljIHNzaXplX3QgcGVyZl9zaG93X3Jlc2VydmVfcGVyY3B1KHN0cnVjdCBzeXNkZXZfY2xhc3MgKmNsYXNzLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBlcmZfcmVzZXJ2ZWRfcGVyY3B1KTsKK30KKworc3RhdGljIHNzaXplX3QKK3BlcmZfc2V0X3Jlc2VydmVfcGVyY3B1KHN0cnVjdCBzeXNkZXZfY2xhc3MgKmNsYXNzLAorCQkJY29uc3QgY2hhciAqYnVmLAorCQkJc2l6ZV90IGNvdW50KQoreworCXN0cnVjdCBwZXJmX2NwdV9jb250ZXh0ICpjcHVjdHg7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJaW50IGVyciwgY3B1LCBtcHQ7CisKKwllcnIgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAoZXJyKQorCQlyZXR1cm4gZXJyOworCWlmICh2YWwgPiBwZXJmX21heF9jb3VudGVycykKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJnBlcmZfcmVzb3VyY2VfbG9jayk7CisJcGVyZl9yZXNlcnZlZF9wZXJjcHUgPSB2YWw7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJY3B1Y3R4ID0gJnBlcl9jcHUocGVyZl9jcHVfY29udGV4dCwgY3B1KTsKKwkJc3Bpbl9sb2NrX2lycSgmY3B1Y3R4LT5jdHgubG9jayk7CisJCW1wdCA9IG1pbihwZXJmX21heF9jb3VudGVycyAtIGNwdWN0eC0+Y3R4Lm5yX2NvdW50ZXJzLAorCQkJICBwZXJmX21heF9jb3VudGVycyAtIHBlcmZfcmVzZXJ2ZWRfcGVyY3B1KTsKKwkJY3B1Y3R4LT5tYXhfcGVydGFzayA9IG1wdDsKKwkJc3Bpbl91bmxvY2tfaXJxKCZjcHVjdHgtPmN0eC5sb2NrKTsKKwl9CisJc3Bpbl91bmxvY2soJnBlcmZfcmVzb3VyY2VfbG9jayk7CisKKwlyZXR1cm4gY291bnQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHBlcmZfc2hvd19vdmVyY29tbWl0KHN0cnVjdCBzeXNkZXZfY2xhc3MgKmNsYXNzLCBjaGFyICpidWYpCit7CisJcmV0dXJuIHNwcmludGYoYnVmLCAiJWRcbiIsIHBlcmZfb3ZlcmNvbW1pdCk7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitwZXJmX3NldF9vdmVyY29tbWl0KHN0cnVjdCBzeXNkZXZfY2xhc3MgKmNsYXNzLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBjb3VudCkKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwlpbnQgZXJyOworCisJZXJyID0gc3RyaWN0X3N0cnRvdWwoYnVmLCAxMCwgJnZhbCk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKwlpZiAodmFsID4gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzcGluX2xvY2soJnBlcmZfcmVzb3VyY2VfbG9jayk7CisJcGVyZl9vdmVyY29tbWl0ID0gdmFsOworCXNwaW5fdW5sb2NrKCZwZXJmX3Jlc291cmNlX2xvY2spOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgU1lTREVWX0NMQVNTX0FUVFIoCisJCQkJcmVzZXJ2ZV9wZXJjcHUsCisJCQkJMDY0NCwKKwkJCQlwZXJmX3Nob3dfcmVzZXJ2ZV9wZXJjcHUsCisJCQkJcGVyZl9zZXRfcmVzZXJ2ZV9wZXJjcHUKKwkJCSk7CisKK3N0YXRpYyBTWVNERVZfQ0xBU1NfQVRUUigKKwkJCQlvdmVyY29tbWl0LAorCQkJCTA2NDQsCisJCQkJcGVyZl9zaG93X292ZXJjb21taXQsCisJCQkJcGVyZl9zZXRfb3ZlcmNvbW1pdAorCQkJKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1dGUgKnBlcmZjbGFzc19hdHRyc1tdID0geworCSZhdHRyX3Jlc2VydmVfcGVyY3B1LmF0dHIsCisJJmF0dHJfb3ZlcmNvbW1pdC5hdHRyLAorCU5VTEwKK307CisKK3N0YXRpYyBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHBlcmZjbGFzc19hdHRyX2dyb3VwID0geworCS5hdHRycwkJCT0gcGVyZmNsYXNzX2F0dHJzLAorCS5uYW1lCQkJPSAicGVyZl9jb3VudGVycyIsCit9OworCitzdGF0aWMgaW50IF9faW5pdCBwZXJmX2NvdW50ZXJfc3lzZnNfaW5pdCh2b2lkKQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmNwdV9zeXNkZXZfY2xhc3Mua3NldC5rb2JqLAorCQkJCSAgJnBlcmZjbGFzc19hdHRyX2dyb3VwKTsKK30KK2RldmljZV9pbml0Y2FsbChwZXJmX2NvdW50ZXJfc3lzZnNfaW5pdCk7CmRpZmYgLS1naXQgYS9rZXJuZWwvcHRyYWNlLmMgYi9rZXJuZWwvcHRyYWNlLmMKaW5kZXggNDJjMzE3OC4uMjQ0MmQxNCAxMDA2NDQKLS0tIGEva2VybmVsL3B0cmFjZS5jCisrKyBiL2tlcm5lbC9wdHJhY2UuYwpAQCAtMjUsMTYgKzI1LDYgQEAKIAogCiAvKgotICogSW5pdGlhbGl6ZSBhIG5ldyB0YXNrIHdob3NlIGZhdGhlciBoYWQgYmVlbiBwdHJhY2VkLgotICoKLSAqIENhbGxlZCBmcm9tIGNvcHlfcHJvY2VzcygpLgotICovCi12b2lkIHB0cmFjZV9mb3JrKHN0cnVjdCB0YXNrX3N0cnVjdCAqY2hpbGQsIHVuc2lnbmVkIGxvbmcgY2xvbmVfZmxhZ3MpCi17Ci0JYXJjaF9wdHJhY2VfZm9yayhjaGlsZCwgY2xvbmVfZmxhZ3MpOwotfQotCi0vKgogICogcHRyYWNlIGEgdGFzazogbWFrZSB0aGUgZGVidWdnZXIgaXRzIG5ldyBwYXJlbnQgYW5kCiAgKiBtb3ZlIGl0IHRvIHRoZSBwdHJhY2UgbGlzdC4KICAqCmRpZmYgLS1naXQgYS9rZXJuZWwvcmN1cHJlZW1wdC5jIGIva2VybmVsL3JjdXByZWVtcHQuYwppbmRleCBjZTk3YTRkLi5iZWIwZTY1IDEwMDY0NAotLS0gYS9rZXJuZWwvcmN1cHJlZW1wdC5jCisrKyBiL2tlcm5lbC9yY3VwcmVlbXB0LmMKQEAgLTEzNTYsMTcgKzEzNTYsMTEgQEAKIAogCQlyY3VfY3RybGJsay5zY2hlZF9zbGVlcCA9IHJjdV9zY2hlZF9zbGVlcGluZzsKIAkJc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcmN1X2N0cmxibGsuc2NoZWRsb2NrLCBmbGFncyk7Ci0JCXJldCA9IDA7CisJCXJldCA9IDA7IC8qIHVudXNlZCAqLwogCQlfX3dhaXRfZXZlbnRfaW50ZXJydXB0aWJsZShyY3VfY3RybGJsay5zY2hlZF93cSwKIAkJCXJjdV9jdHJsYmxrLnNjaGVkX3NsZWVwICE9IHJjdV9zY2hlZF9zbGVlcGluZywKIAkJCXJldCk7CiAKLQkJLyoKLQkJICogU2lnbmFscyB3b3VsZCBwcmV2ZW50IHVzIGZyb20gc2xlZXBpbmcsIGFuZCB3ZSBjYW5ub3QKLQkJICogZG8gbXVjaCB3aXRoIHRoZW0gaW4gYW55IGNhc2UuICBTbyBmbHVzaCB0aGVtLgotCQkgKi8KLQkJaWYgKHJldCkKLQkJCWZsdXNoX3NpZ25hbHMoY3VycmVudCk7CiAJCWNvdWxkc2xlZXBuZXh0ID0gMDsKIAogCX0gd2hpbGUgKCFrdGhyZWFkX3Nob3VsZF9zdG9wKCkpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3JjdXRyZWUuYyBiL2tlcm5lbC9yY3V0cmVlLmMKaW5kZXggZDJhMzcyZi4uMGRjY2ZiYiAxMDA2NDQKLS0tIGEva2VybmVsL3JjdXRyZWUuYworKysgYi9rZXJuZWwvcmN1dHJlZS5jCkBAIC0xMjU5LDMxICsxMjU5LDQ0IEBACiAJY2hlY2tfY3B1X3N0YWxsKHJzcCwgcmRwKTsKIAogCS8qIElzIHRoZSBSQ1UgY29yZSB3YWl0aW5nIGZvciBhIHF1aWVzY2VudCBzdGF0ZSBmcm9tIHRoaXMgQ1BVPyAqLwotCWlmIChyZHAtPnFzX3BlbmRpbmcpCisJaWYgKHJkcC0+cXNfcGVuZGluZykgeworCQlyZHAtPm5fcnBfcXNfcGVuZGluZysrOwogCQlyZXR1cm4gMTsKKwl9CiAKIAkvKiBEb2VzIHRoaXMgQ1BVIGhhdmUgY2FsbGJhY2tzIHJlYWR5IHRvIGludm9rZT8gKi8KLQlpZiAoY3B1X2hhc19jYWxsYmFja3NfcmVhZHlfdG9faW52b2tlKHJkcCkpCisJaWYgKGNwdV9oYXNfY2FsbGJhY2tzX3JlYWR5X3RvX2ludm9rZShyZHApKSB7CisJCXJkcC0+bl9ycF9jYl9yZWFkeSsrOwogCQlyZXR1cm4gMTsKKwl9CiAKIAkvKiBIYXMgUkNVIGdvbmUgaWRsZSB3aXRoIHRoaXMgQ1BVIG5lZWRpbmcgYW5vdGhlciBncmFjZSBwZXJpb2Q/ICovCi0JaWYgKGNwdV9uZWVkc19hbm90aGVyX2dwKHJzcCwgcmRwKSkKKwlpZiAoY3B1X25lZWRzX2Fub3RoZXJfZ3AocnNwLCByZHApKSB7CisJCXJkcC0+bl9ycF9jcHVfbmVlZHNfZ3ArKzsKIAkJcmV0dXJuIDE7CisJfQogCiAJLyogSGFzIGFub3RoZXIgUkNVIGdyYWNlIHBlcmlvZCBjb21wbGV0ZWQ/ICAqLwotCWlmIChBQ0NFU1NfT05DRShyc3AtPmNvbXBsZXRlZCkgIT0gcmRwLT5jb21wbGV0ZWQpIC8qIG91dHNpZGUgb2YgbG9jayAqLworCWlmIChBQ0NFU1NfT05DRShyc3AtPmNvbXBsZXRlZCkgIT0gcmRwLT5jb21wbGV0ZWQpIHsgLyogb3V0c2lkZSBsb2NrICovCisJCXJkcC0+bl9ycF9ncF9jb21wbGV0ZWQrKzsKIAkJcmV0dXJuIDE7CisJfQogCiAJLyogSGFzIGEgbmV3IFJDVSBncmFjZSBwZXJpb2Qgc3RhcnRlZD8gKi8KLQlpZiAoQUNDRVNTX09OQ0UocnNwLT5ncG51bSkgIT0gcmRwLT5ncG51bSkgLyogb3V0c2lkZSBvZiBsb2NrICovCisJaWYgKEFDQ0VTU19PTkNFKHJzcC0+Z3BudW0pICE9IHJkcC0+Z3BudW0pIHsgLyogb3V0c2lkZSBsb2NrICovCisJCXJkcC0+bl9ycF9ncF9zdGFydGVkKys7CiAJCXJldHVybiAxOworCX0KIAogCS8qIEhhcyBhbiBSQ1UgR1AgZ29uZSBsb25nIGVub3VnaCB0byBzZW5kIHJlc2NoZWQgSVBJcyAmYz8gKi8KIAlpZiAoQUNDRVNTX09OQ0UocnNwLT5jb21wbGV0ZWQpICE9IEFDQ0VTU19PTkNFKHJzcC0+Z3BudW0pICYmCi0JICAgICgobG9uZykoQUNDRVNTX09OQ0UocnNwLT5qaWZmaWVzX2ZvcmNlX3FzKSAtIGppZmZpZXMpIDwgMCkpCisJICAgICgobG9uZykoQUNDRVNTX09OQ0UocnNwLT5qaWZmaWVzX2ZvcmNlX3FzKSAtIGppZmZpZXMpIDwgMCkpIHsKKwkJcmRwLT5uX3JwX25lZWRfZnFzKys7CiAJCXJldHVybiAxOworCX0KIAogCS8qIG5vdGhpbmcgdG8gZG8gKi8KKwlyZHAtPm5fcnBfbmVlZF9ub3RoaW5nKys7CiAJcmV0dXJuIDA7CiB9CiAKZGlmZiAtLWdpdCBhL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMgYi9rZXJuZWwvcmN1dHJlZV90cmFjZS5jCmluZGV4IDRiMTg3NWIuLmZlMWRjZGIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9yY3V0cmVlX3RyYWNlLmMKKysrIGIva2VybmVsL3JjdXRyZWVfdHJhY2UuYwpAQCAtMjEzLDcgKzIxMyw2MyBAQAogCS5yZWxlYXNlID0gc2luZ2xlX3JlbGVhc2UsCiB9OwogCi1zdGF0aWMgc3RydWN0IGRlbnRyeSAqcmN1ZGlyLCAqZGF0YWRpciwgKmRhdGFkaXJfY3N2LCAqaGllcmRpciwgKmdwZGlyOworc3RhdGljIHZvaWQgcHJpbnRfb25lX3JjdV9wZW5kaW5nKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHJjdV9kYXRhICpyZHApCit7CisJc2VxX3ByaW50ZihtLCAiJTNkJWNucD0lbGQgIgorCQkgICAicXNwPSVsZCBjYnI9JWxkIGNuZz0lbGQgZ3BjPSVsZCBncHM9JWxkIG5mPSVsZCBubj0lbGRcbiIsCisJCSAgIHJkcC0+Y3B1LAorCQkgICBjcHVfaXNfb2ZmbGluZShyZHAtPmNwdSkgPyAnIScgOiAnICcsCisJCSAgIHJkcC0+bl9yY3VfcGVuZGluZywKKwkJICAgcmRwLT5uX3JwX3FzX3BlbmRpbmcsCisJCSAgIHJkcC0+bl9ycF9jYl9yZWFkeSwKKwkJICAgcmRwLT5uX3JwX2NwdV9uZWVkc19ncCwKKwkJICAgcmRwLT5uX3JwX2dwX2NvbXBsZXRlZCwKKwkJICAgcmRwLT5uX3JwX2dwX3N0YXJ0ZWQsCisJCSAgIHJkcC0+bl9ycF9uZWVkX2ZxcywKKwkJICAgcmRwLT5uX3JwX25lZWRfbm90aGluZyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JjdV9wZW5kaW5ncyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCByY3Vfc3RhdGUgKnJzcCkKK3sKKwlpbnQgY3B1OworCXN0cnVjdCByY3VfZGF0YSAqcmRwOworCisJZm9yX2VhY2hfcG9zc2libGVfY3B1KGNwdSkgeworCQlyZHAgPSByc3AtPnJkYVtjcHVdOworCQlpZiAocmRwLT5iZWVub25saW5lKQorCQkJcHJpbnRfb25lX3JjdV9wZW5kaW5nKG0sIHJkcCk7CisJfQorfQorCitzdGF0aWMgaW50IHNob3dfcmN1X3BlbmRpbmcoc3RydWN0IHNlcV9maWxlICptLCB2b2lkICp1bnVzZWQpCit7CisJc2VxX3B1dHMobSwgInJjdTpcbiIpOworCXByaW50X3JjdV9wZW5kaW5ncyhtLCAmcmN1X3N0YXRlKTsKKwlzZXFfcHV0cyhtLCAicmN1X2JoOlxuIik7CisJcHJpbnRfcmN1X3BlbmRpbmdzKG0sICZyY3VfYmhfc3RhdGUpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJjdV9wZW5kaW5nX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGZpbGUgKmZpbGUpCit7CisJcmV0dXJuIHNpbmdsZV9vcGVuKGZpbGUsIHNob3dfcmN1X3BlbmRpbmcsIE5VTEwpOworfQorCitzdGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyByY3VfcGVuZGluZ19mb3BzID0geworCS5vd25lciA9IFRISVNfTU9EVUxFLAorCS5vcGVuID0gcmN1X3BlbmRpbmdfb3BlbiwKKwkucmVhZCA9IHNlcV9yZWFkLAorCS5sbHNlZWsgPSBzZXFfbHNlZWssCisJLnJlbGVhc2UgPSBzaW5nbGVfcmVsZWFzZSwKK307CisKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpyY3VkaXI7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZGF0YWRpcjsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpkYXRhZGlyX2NzdjsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpncGRpcjsKK3N0YXRpYyBzdHJ1Y3QgZGVudHJ5ICpoaWVyZGlyOworc3RhdGljIHN0cnVjdCBkZW50cnkgKnJjdV9wZW5kaW5nZGlyOworCiBzdGF0aWMgaW50IF9faW5pdCByY3VjbGFzc2ljX3RyYWNlX2luaXQodm9pZCkKIHsKIAlyY3VkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoInJjdSIsIE5VTEwpOwpAQCAtMjM4LDYgKzI5NCwxMSBAQAogCQkJCQkJTlVMTCwgJnJjdWhpZXJfZm9wcyk7CiAJaWYgKCFoaWVyZGlyKQogCQlnb3RvIGZyZWVfb3V0OworCisJcmN1X3BlbmRpbmdkaXIgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJyY3VfcGVuZGluZyIsIDA0NDQsIHJjdWRpciwKKwkJCQkJCU5VTEwsICZyY3VfcGVuZGluZ19mb3BzKTsKKwlpZiAoIXJjdV9wZW5kaW5nZGlyKQorCQlnb3RvIGZyZWVfb3V0OwogCXJldHVybiAwOwogZnJlZV9vdXQ6CiAJaWYgKGRhdGFkaXIpCkBAIC0yNTcsNiArMzE4LDcgQEAKIAlkZWJ1Z2ZzX3JlbW92ZShkYXRhZGlyX2Nzdik7CiAJZGVidWdmc19yZW1vdmUoZ3BkaXIpOwogCWRlYnVnZnNfcmVtb3ZlKGhpZXJkaXIpOworCWRlYnVnZnNfcmVtb3ZlKHJjdV9wZW5kaW5nZGlyKTsKIAlkZWJ1Z2ZzX3JlbW92ZShyY3VkaXIpOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleC5jIGIva2VybmVsL3J0bXV0ZXguYwppbmRleCA2OWQ5Y2I5Li44MjBjNWFmIDEwMDY0NAotLS0gYS9rZXJuZWwvcnRtdXRleC5jCisrKyBiL2tlcm5lbC9ydG11dGV4LmMKQEAgLTMwMCw3ICszMDAsOCBAQAogICogYXNzaWduZWQgcGVuZGluZyBvd25lciBbd2hpY2ggbWlnaHQgbm90IGhhdmUgdGFrZW4gdGhlCiAgKiBsb2NrIHlldF06CiAgKi8KLXN0YXRpYyBpbmxpbmUgaW50IHRyeV90b19zdGVhbF9sb2NrKHN0cnVjdCBydF9tdXRleCAqbG9jaykKK3N0YXRpYyBpbmxpbmUgaW50IHRyeV90b19zdGVhbF9sb2NrKHN0cnVjdCBydF9tdXRleCAqbG9jaywKKwkJCQkgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcGVuZG93bmVyID0gcnRfbXV0ZXhfb3duZXIobG9jayk7CiAJc3RydWN0IHJ0X211dGV4X3dhaXRlciAqbmV4dDsKQEAgLTMwOSwxMSArMzEwLDExIEBACiAJaWYgKCFydF9tdXRleF9vd25lcl9wZW5kaW5nKGxvY2spKQogCQlyZXR1cm4gMDsKIAotCWlmIChwZW5kb3duZXIgPT0gY3VycmVudCkKKwlpZiAocGVuZG93bmVyID09IHRhc2spCiAJCXJldHVybiAxOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJnBlbmRvd25lci0+cGlfbG9jaywgZmxhZ3MpOwotCWlmIChjdXJyZW50LT5wcmlvID49IHBlbmRvd25lci0+cHJpbykgeworCWlmICh0YXNrLT5wcmlvID49IHBlbmRvd25lci0+cHJpbykgewogCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZwZW5kb3duZXItPnBpX2xvY2ssIGZsYWdzKTsKIAkJcmV0dXJuIDA7CiAJfQpAQCAtMzM4LDIxICszMzksMjEgQEAKIAkgKiBXZSBhcmUgZ29pbmcgdG8gc3RlYWwgdGhlIGxvY2sgYW5kIGEgd2FpdGVyIHdhcwogCSAqIGVucXVldWVkIG9uIHRoZSBwZW5kaW5nIG93bmVycyBwaV93YWl0ZXJzIHF1ZXVlLiBTbwogCSAqIHdlIGhhdmUgdG8gZW5xdWV1ZSB0aGlzIHdhaXRlciBpbnRvCi0JICogY3VycmVudC0+cGlfd2FpdGVycyBsaXN0LiBUaGlzIGNvdmVycyB0aGUgY2FzZSwKLQkgKiB3aGVyZSBjdXJyZW50IGlzIGJvb3N0ZWQgYmVjYXVzZSBpdCBob2xkcyBhbm90aGVyCisJICogdGFzay0+cGlfd2FpdGVycyBsaXN0LiBUaGlzIGNvdmVycyB0aGUgY2FzZSwKKwkgKiB3aGVyZSB0YXNrIGlzIGJvb3N0ZWQgYmVjYXVzZSBpdCBob2xkcyBhbm90aGVyCiAJICogbG9jayBhbmQgZ2V0cyB1bmJvb3N0ZWQgYmVjYXVzZSB0aGUgYm9vc3RlciBpcwogCSAqIGludGVycnVwdGVkLCBzbyB3ZSB3b3VsZCBkZWxheSBhIHdhaXRlciB3aXRoIGhpZ2hlcgotCSAqIHByaW9yaXR5IGFzIGN1cnJlbnQtPm5vcm1hbF9wcmlvLgorCSAqIHByaW9yaXR5IGFzIHRhc2stPm5vcm1hbF9wcmlvLgogCSAqCiAJICogTm90ZTogaW4gdGhlIHJhcmUgY2FzZSBvZiBhIFNDSEVEX09USEVSIHRhc2sgY2hhbmdpbmcKIAkgKiBpdHMgcHJpb3JpdHkgYW5kIHRodXMgc3RlYWxpbmcgdGhlIGxvY2ssIG5leHQtPnRhc2sKLQkgKiBtaWdodCBiZSBjdXJyZW50OgorCSAqIG1pZ2h0IGJlIHRhc2s6CiAJICovCi0JaWYgKGxpa2VseShuZXh0LT50YXNrICE9IGN1cnJlbnQpKSB7Ci0JCXNwaW5fbG9ja19pcnFzYXZlKCZjdXJyZW50LT5waV9sb2NrLCBmbGFncyk7Ci0JCXBsaXN0X2FkZCgmbmV4dC0+cGlfbGlzdF9lbnRyeSwgJmN1cnJlbnQtPnBpX3dhaXRlcnMpOwotCQlfX3J0X211dGV4X2FkanVzdF9wcmlvKGN1cnJlbnQpOwotCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjdXJyZW50LT5waV9sb2NrLCBmbGFncyk7CisJaWYgKGxpa2VseShuZXh0LT50YXNrICE9IHRhc2spKSB7CisJCXNwaW5fbG9ja19pcnFzYXZlKCZ0YXNrLT5waV9sb2NrLCBmbGFncyk7CisJCXBsaXN0X2FkZCgmbmV4dC0+cGlfbGlzdF9lbnRyeSwgJnRhc2stPnBpX3dhaXRlcnMpOworCQlfX3J0X211dGV4X2FkanVzdF9wcmlvKHRhc2spOworCQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT5waV9sb2NrLCBmbGFncyk7CiAJfQogCXJldHVybiAxOwogfQpAQCAtMzg5LDcgKzM5MCw3IEBACiAJICovCiAJbWFya19ydF9tdXRleF93YWl0ZXJzKGxvY2spOwogCi0JaWYgKHJ0X211dGV4X293bmVyKGxvY2spICYmICF0cnlfdG9fc3RlYWxfbG9jayhsb2NrKSkKKwlpZiAocnRfbXV0ZXhfb3duZXIobG9jaykgJiYgIXRyeV90b19zdGVhbF9sb2NrKGxvY2ssIGN1cnJlbnQpKQogCQlyZXR1cm4gMDsKIAogCS8qIFdlIGdvdCB0aGUgbG9jay4gKi8KQEAgLTQxMSw2ICs0MTIsNyBAQAogICovCiBzdGF0aWMgaW50IHRhc2tfYmxvY2tzX29uX3J0X211dGV4KHN0cnVjdCBydF9tdXRleCAqbG9jaywKIAkJCQkgICBzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICp3YWl0ZXIsCisJCQkJICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLAogCQkJCSAgIGludCBkZXRlY3RfZGVhZGxvY2spCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICpvd25lciA9IHJ0X211dGV4X293bmVyKGxvY2spOwpAQCAtNDE4LDIxICs0MjAsMjEgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjaGFpbl93YWxrID0gMCwgcmVzOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJmN1cnJlbnQtPnBpX2xvY2ssIGZsYWdzKTsKLQlfX3J0X211dGV4X2FkanVzdF9wcmlvKGN1cnJlbnQpOwotCXdhaXRlci0+dGFzayA9IGN1cnJlbnQ7CisJc3Bpbl9sb2NrX2lycXNhdmUoJnRhc2stPnBpX2xvY2ssIGZsYWdzKTsKKwlfX3J0X211dGV4X2FkanVzdF9wcmlvKHRhc2spOworCXdhaXRlci0+dGFzayA9IHRhc2s7CiAJd2FpdGVyLT5sb2NrID0gbG9jazsKLQlwbGlzdF9ub2RlX2luaXQoJndhaXRlci0+bGlzdF9lbnRyeSwgY3VycmVudC0+cHJpbyk7Ci0JcGxpc3Rfbm9kZV9pbml0KCZ3YWl0ZXItPnBpX2xpc3RfZW50cnksIGN1cnJlbnQtPnByaW8pOworCXBsaXN0X25vZGVfaW5pdCgmd2FpdGVyLT5saXN0X2VudHJ5LCB0YXNrLT5wcmlvKTsKKwlwbGlzdF9ub2RlX2luaXQoJndhaXRlci0+cGlfbGlzdF9lbnRyeSwgdGFzay0+cHJpbyk7CiAKIAkvKiBHZXQgdGhlIHRvcCBwcmlvcml0eSB3YWl0ZXIgb24gdGhlIGxvY2sgKi8KIAlpZiAocnRfbXV0ZXhfaGFzX3dhaXRlcnMobG9jaykpCiAJCXRvcF93YWl0ZXIgPSBydF9tdXRleF90b3Bfd2FpdGVyKGxvY2spOwogCXBsaXN0X2FkZCgmd2FpdGVyLT5saXN0X2VudHJ5LCAmbG9jay0+d2FpdF9saXN0KTsKIAotCWN1cnJlbnQtPnBpX2Jsb2NrZWRfb24gPSB3YWl0ZXI7CisJdGFzay0+cGlfYmxvY2tlZF9vbiA9IHdhaXRlcjsKIAotCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmN1cnJlbnQtPnBpX2xvY2ssIGZsYWdzKTsKKwlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ0YXNrLT5waV9sb2NrLCBmbGFncyk7CiAKIAlpZiAod2FpdGVyID09IHJ0X211dGV4X3RvcF93YWl0ZXIobG9jaykpIHsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJm93bmVyLT5waV9sb2NrLCBmbGFncyk7CkBAIC00NjAsNyArNDYyLDcgQEAKIAlzcGluX3VubG9jaygmbG9jay0+d2FpdF9sb2NrKTsKIAogCXJlcyA9IHJ0X211dGV4X2FkanVzdF9wcmlvX2NoYWluKG93bmVyLCBkZXRlY3RfZGVhZGxvY2ssIGxvY2ssIHdhaXRlciwKLQkJCQkJIGN1cnJlbnQpOworCQkJCQkgdGFzayk7CiAKIAlzcGluX2xvY2soJmxvY2stPndhaXRfbG9jayk7CiAKQEAgLTYwNSw2ICs2MDcsODUgQEAKIAlydF9tdXRleF9hZGp1c3RfcHJpb19jaGFpbih0YXNrLCAwLCBOVUxMLCBOVUxMLCB0YXNrKTsKIH0KIAorLyoqCisgKiBfX3J0X211dGV4X3Nsb3dsb2NrKCkgLSBQZXJmb3JtIHRoZSB3YWl0LXdha2UtdHJ5LXRvLXRha2UgbG9vcAorICogQGxvY2s6CQkgdGhlIHJ0X211dGV4IHRvIHRha2UKKyAqIEBzdGF0ZToJCSB0aGUgc3RhdGUgdGhlIHRhc2sgc2hvdWxkIGJsb2NrIGluIChUQVNLX0lOVEVSUlVQVElCTEUKKyAqIAkJCSBvciBUQVNLX1VOSU5URVJSVVBUSUJMRSkKKyAqIEB0aW1lb3V0OgkJIHRoZSBwcmUtaW5pdGlhbGl6ZWQgYW5kIHN0YXJ0ZWQgdGltZXIsIG9yIE5VTEwgZm9yIG5vbmUKKyAqIEB3YWl0ZXI6CQkgdGhlIHByZS1pbml0aWFsaXplZCBydF9tdXRleF93YWl0ZXIKKyAqIEBkZXRlY3RfZGVhZGxvY2s6CSBwYXNzZWQgdG8gdGFza19ibG9ja3Nfb25fcnRfbXV0ZXgKKyAqCisgKiBsb2NrLT53YWl0X2xvY2sgbXVzdCBiZSBoZWxkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbnQgX19zY2hlZAorX19ydF9tdXRleF9zbG93bG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssIGludCBzdGF0ZSwKKwkJICAgIHN0cnVjdCBocnRpbWVyX3NsZWVwZXIgKnRpbWVvdXQsCisJCSAgICBzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICp3YWl0ZXIsCisJCSAgICBpbnQgZGV0ZWN0X2RlYWRsb2NrKQoreworCWludCByZXQgPSAwOworCisJZm9yICg7OykgeworCQkvKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jazogKi8KKwkJaWYgKHRyeV90b190YWtlX3J0X211dGV4KGxvY2spKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogVEFTS19JTlRFUlJVUFRJQkxFIGNoZWNrcyBmb3Igc2lnbmFscyBhbmQKKwkJICogdGltZW91dC4gSWdub3JlZCBvdGhlcndpc2UuCisJCSAqLworCQlpZiAodW5saWtlbHkoc3RhdGUgPT0gVEFTS19JTlRFUlJVUFRJQkxFKSkgeworCQkJLyogU2lnbmFsIHBlbmRpbmc/ICovCisJCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCisJCQkJcmV0ID0gLUVJTlRSOworCQkJaWYgKHRpbWVvdXQgJiYgIXRpbWVvdXQtPnRhc2spCisJCQkJcmV0ID0gLUVUSU1FRE9VVDsKKwkJCWlmIChyZXQpCisJCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiB3YWl0ZXItPnRhc2sgaXMgTlVMTCB0aGUgZmlyc3QgdGltZSB3ZSBjb21lIGhlcmUgYW5kCisJCSAqIHdoZW4gd2UgaGF2ZSBiZWVuIHdva2VuIHVwIGJ5IHRoZSBwcmV2aW91cyBvd25lcgorCQkgKiBidXQgdGhlIGxvY2sgZ290IHN0b2xlbiBieSBhIGhpZ2hlciBwcmlvIHRhc2suCisJCSAqLworCQlpZiAoIXdhaXRlci0+dGFzaykgeworCQkJcmV0ID0gdGFza19ibG9ja3Nfb25fcnRfbXV0ZXgobG9jaywgd2FpdGVyLCBjdXJyZW50LAorCQkJCQkJICAgICAgZGV0ZWN0X2RlYWRsb2NrKTsKKwkJCS8qCisJCQkgKiBJZiB3ZSBnb3Qgd29rZW4gdXAgYnkgdGhlIG93bmVyIHRoZW4gc3RhcnQgbG9vcAorCQkJICogYWxsIG92ZXIgd2l0aG91dCBnb2luZyBpbnRvIHNjaGVkdWxlIHRvIHRyeQorCQkJICogdG8gZ2V0IHRoZSBsb2NrIG5vdzoKKwkJCSAqLworCQkJaWYgKHVubGlrZWx5KCF3YWl0ZXItPnRhc2spKSB7CisJCQkJLyoKKwkJCQkgKiBSZXNldCB0aGUgcmV0dXJuIHZhbHVlLiBXZSBtaWdodAorCQkJCSAqIGhhdmUgcmV0dXJuZWQgd2l0aCAtRURFQURMSyBhbmQgdGhlCisJCQkJICogb3duZXIgcmVsZWFzZWQgdGhlIGxvY2sgd2hpbGUgd2UKKwkJCQkgKiB3ZXJlIHdhbGtpbmcgdGhlIHBpIGNoYWluLgorCQkJCSAqLworCQkJCXJldCA9IDA7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAodW5saWtlbHkocmV0KSkKKwkJCQlicmVhazsKKwkJfQorCisJCXNwaW5fdW5sb2NrKCZsb2NrLT53YWl0X2xvY2spOworCisJCWRlYnVnX3J0X211dGV4X3ByaW50X2RlYWRsb2NrKHdhaXRlcik7CisKKwkJaWYgKHdhaXRlci0+dGFzaykKKwkJCXNjaGVkdWxlX3J0X211dGV4KGxvY2spOworCisJCXNwaW5fbG9jaygmbG9jay0+d2FpdF9sb2NrKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoc3RhdGUpOworCX0KKworCXJldHVybiByZXQ7Cit9CisKIC8qCiAgKiBTbG93IHBhdGggbG9jayBmdW5jdGlvbjoKICAqLwpAQCAtNjM2LDYyICs3MTcsOCBAQAogCQkJdGltZW91dC0+dGFzayA9IE5VTEw7CiAJfQogCi0JZm9yICg7OykgewotCQkvKiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jazogKi8KLQkJaWYgKHRyeV90b190YWtlX3J0X211dGV4KGxvY2spKQotCQkJYnJlYWs7Ci0KLQkJLyoKLQkJICogVEFTS19JTlRFUlJVUFRJQkxFIGNoZWNrcyBmb3Igc2lnbmFscyBhbmQKLQkJICogdGltZW91dC4gSWdub3JlZCBvdGhlcndpc2UuCi0JCSAqLwotCQlpZiAodW5saWtlbHkoc3RhdGUgPT0gVEFTS19JTlRFUlJVUFRJQkxFKSkgewotCQkJLyogU2lnbmFsIHBlbmRpbmc/ICovCi0JCQlpZiAoc2lnbmFsX3BlbmRpbmcoY3VycmVudCkpCi0JCQkJcmV0ID0gLUVJTlRSOwotCQkJaWYgKHRpbWVvdXQgJiYgIXRpbWVvdXQtPnRhc2spCi0JCQkJcmV0ID0gLUVUSU1FRE9VVDsKLQkJCWlmIChyZXQpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQkvKgotCQkgKiB3YWl0ZXIudGFzayBpcyBOVUxMIHRoZSBmaXJzdCB0aW1lIHdlIGNvbWUgaGVyZSBhbmQKLQkJICogd2hlbiB3ZSBoYXZlIGJlZW4gd29rZW4gdXAgYnkgdGhlIHByZXZpb3VzIG93bmVyCi0JCSAqIGJ1dCB0aGUgbG9jayBnb3Qgc3RvbGVuIGJ5IGEgaGlnaGVyIHByaW8gdGFzay4KLQkJICovCi0JCWlmICghd2FpdGVyLnRhc2spIHsKLQkJCXJldCA9IHRhc2tfYmxvY2tzX29uX3J0X211dGV4KGxvY2ssICZ3YWl0ZXIsCi0JCQkJCQkgICAgICBkZXRlY3RfZGVhZGxvY2spOwotCQkJLyoKLQkJCSAqIElmIHdlIGdvdCB3b2tlbiB1cCBieSB0aGUgb3duZXIgdGhlbiBzdGFydCBsb29wCi0JCQkgKiBhbGwgb3ZlciB3aXRob3V0IGdvaW5nIGludG8gc2NoZWR1bGUgdG8gdHJ5Ci0JCQkgKiB0byBnZXQgdGhlIGxvY2sgbm93OgotCQkJICovCi0JCQlpZiAodW5saWtlbHkoIXdhaXRlci50YXNrKSkgewotCQkJCS8qCi0JCQkJICogUmVzZXQgdGhlIHJldHVybiB2YWx1ZS4gV2UgbWlnaHQKLQkJCQkgKiBoYXZlIHJldHVybmVkIHdpdGggLUVERUFETEsgYW5kIHRoZQotCQkJCSAqIG93bmVyIHJlbGVhc2VkIHRoZSBsb2NrIHdoaWxlIHdlCi0JCQkJICogd2VyZSB3YWxraW5nIHRoZSBwaSBjaGFpbi4KLQkJCQkgKi8KLQkJCQlyZXQgPSAwOwotCQkJCWNvbnRpbnVlOwotCQkJfQotCQkJaWYgKHVubGlrZWx5KHJldCkpCi0JCQkJYnJlYWs7Ci0JCX0KLQotCQlzcGluX3VubG9jaygmbG9jay0+d2FpdF9sb2NrKTsKLQotCQlkZWJ1Z19ydF9tdXRleF9wcmludF9kZWFkbG9jaygmd2FpdGVyKTsKLQotCQlpZiAod2FpdGVyLnRhc2spCi0JCQlzY2hlZHVsZV9ydF9tdXRleChsb2NrKTsKLQotCQlzcGluX2xvY2soJmxvY2stPndhaXRfbG9jayk7Ci0JCXNldF9jdXJyZW50X3N0YXRlKHN0YXRlKTsKLQl9CisJcmV0ID0gX19ydF9tdXRleF9zbG93bG9jayhsb2NrLCBzdGF0ZSwgdGltZW91dCwgJndhaXRlciwKKwkJCQkgIGRldGVjdF9kZWFkbG9jayk7CiAKIAlzZXRfY3VycmVudF9zdGF0ZShUQVNLX1JVTk5JTkcpOwogCkBAIC04NjQsOSArODkxLDkgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHJ0X211dGV4X2xvY2tfaW50ZXJydXB0aWJsZSk7CiAKIC8qKgotICogcnRfbXV0ZXhfbG9ja19pbnRlcnJ1cHRpYmxlX2t0aW1lIC0gbG9jayBhIHJ0X211dGV4IGludGVycnVwdGlibGUKLSAqCQkJCSAgICAgICB0aGUgdGltZW91dCBzdHJ1Y3R1cmUgaXMgcHJvdmlkZWQKLSAqCQkJCSAgICAgICBieSB0aGUgY2FsbGVyCisgKiBydF9tdXRleF90aW1lZF9sb2NrIC0gbG9jayBhIHJ0X211dGV4IGludGVycnVwdGlibGUKKyAqCQkJdGhlIHRpbWVvdXQgc3RydWN0dXJlIGlzIHByb3ZpZGVkCisgKgkJCWJ5IHRoZSBjYWxsZXIKICAqCiAgKiBAbG9jazogCQl0aGUgcnRfbXV0ZXggdG8gYmUgbG9ja2VkCiAgKiBAdGltZW91dDoJCXRpbWVvdXQgc3RydWN0dXJlIG9yIE5VTEwgKG5vIHRpbWVvdXQpCkBAIC05MTMsNyArOTQwLDcgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJ0X211dGV4X3VubG9jayk7CiAKLS8qKioKKy8qKgogICogcnRfbXV0ZXhfZGVzdHJveSAtIG1hcmsgYSBtdXRleCB1bnVzYWJsZQogICogQGxvY2s6IHRoZSBtdXRleCB0byBiZSBkZXN0cm95ZWQKICAqCkBAIC05ODYsNiArMTAxMyw1OSBAQAogfQogCiAvKioKKyAqIHJ0X211dGV4X3N0YXJ0X3Byb3h5X2xvY2soKSAtIFN0YXJ0IGxvY2sgYWNxdWlzaXRpb24gZm9yIGFub3RoZXIgdGFzaworICogQGxvY2s6CQl0aGUgcnRfbXV0ZXggdG8gdGFrZQorICogQHdhaXRlcjoJCXRoZSBwcmUtaW5pdGlhbGl6ZWQgcnRfbXV0ZXhfd2FpdGVyCisgKiBAdGFzazoJCXRoZSB0YXNrIHRvIHByZXBhcmUKKyAqIEBkZXRlY3RfZGVhZGxvY2s6CXBlcmZvcm0gZGVhZGxvY2sgZGV0ZWN0aW9uICgxKSBvciBub3QgKDApCisgKgorICogUmV0dXJuczoKKyAqICAwIC0gdGFzayBibG9ja2VkIG9uIGxvY2sKKyAqICAxIC0gYWNxdWlyZWQgdGhlIGxvY2sgZm9yIHRhc2ssIGNhbGxlciBzaG91bGQgd2FrZSBpdCB1cAorICogPDAgLSBlcnJvcgorICoKKyAqIFNwZWNpYWwgQVBJIGNhbGwgZm9yIEZVVEVYX1JFUVVFVUVfUEkgc3VwcG9ydC4KKyAqLworaW50IHJ0X211dGV4X3N0YXJ0X3Byb3h5X2xvY2soc3RydWN0IHJ0X211dGV4ICpsb2NrLAorCQkJICAgICAgc3RydWN0IHJ0X211dGV4X3dhaXRlciAqd2FpdGVyLAorCQkJICAgICAgc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrLCBpbnQgZGV0ZWN0X2RlYWRsb2NrKQoreworCWludCByZXQ7CisKKwlzcGluX2xvY2soJmxvY2stPndhaXRfbG9jayk7CisKKwltYXJrX3J0X211dGV4X3dhaXRlcnMobG9jayk7CisKKwlpZiAoIXJ0X211dGV4X293bmVyKGxvY2spIHx8IHRyeV90b19zdGVhbF9sb2NrKGxvY2ssIHRhc2spKSB7CisJCS8qIFdlIGdvdCB0aGUgbG9jayBmb3IgdGFzay4gKi8KKwkJZGVidWdfcnRfbXV0ZXhfbG9jayhsb2NrKTsKKworCQlydF9tdXRleF9zZXRfb3duZXIobG9jaywgdGFzaywgMCk7CisKKwkJcnRfbXV0ZXhfZGVhZGxvY2tfYWNjb3VudF9sb2NrKGxvY2ssIHRhc2spOworCQlyZXR1cm4gMTsKKwl9CisKKwlyZXQgPSB0YXNrX2Jsb2Nrc19vbl9ydF9tdXRleChsb2NrLCB3YWl0ZXIsIHRhc2ssIGRldGVjdF9kZWFkbG9jayk7CisKKworCWlmIChyZXQgJiYgIXdhaXRlci0+dGFzaykgeworCQkvKgorCQkgKiBSZXNldCB0aGUgcmV0dXJuIHZhbHVlLiBXZSBtaWdodCBoYXZlCisJCSAqIHJldHVybmVkIHdpdGggLUVERUFETEsgYW5kIHRoZSBvd25lcgorCQkgKiByZWxlYXNlZCB0aGUgbG9jayB3aGlsZSB3ZSB3ZXJlIHdhbGtpbmcgdGhlCisJCSAqIHBpIGNoYWluLiAgTGV0IHRoZSB3YWl0ZXIgc29ydCBpdCBvdXQuCisJCSAqLworCQlyZXQgPSAwOworCX0KKwlzcGluX3VubG9jaygmbG9jay0+d2FpdF9sb2NrKTsKKworCWRlYnVnX3J0X211dGV4X3ByaW50X2RlYWRsb2NrKHdhaXRlcik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKioKICAqIHJ0X211dGV4X25leHRfb3duZXIgLSByZXR1cm4gdGhlIG5leHQgb3duZXIgb2YgdGhlIGxvY2sKICAqCiAgKiBAbG9jazogdGhlIHJ0IGxvY2sgcXVlcnkKQEAgLTEwMDQsMyArMTA4NCw1NyBAQAogCiAJcmV0dXJuIHJ0X211dGV4X3RvcF93YWl0ZXIobG9jayktPnRhc2s7CiB9CisKKy8qKgorICogcnRfbXV0ZXhfZmluaXNoX3Byb3h5X2xvY2soKSAtIENvbXBsZXRlIGxvY2sgYWNxdWlzaXRpb24KKyAqIEBsb2NrOgkJdGhlIHJ0X211dGV4IHdlIHdlcmUgd29rZW4gb24KKyAqIEB0bzoJCQl0aGUgdGltZW91dCwgbnVsbCBpZiBub25lLiBocnRpbWVyIHNob3VsZCBhbHJlYWR5IGhhdmUKKyAqIAkJCWJlZW4gc3RhcnRlZC4KKyAqIEB3YWl0ZXI6CQl0aGUgcHJlLWluaXRpYWxpemVkIHJ0X211dGV4X3dhaXRlcgorICogQGRldGVjdF9kZWFkbG9jazoJcGVyZm9ybSBkZWFkbG9jayBkZXRlY3Rpb24gKDEpIG9yIG5vdCAoMCkKKyAqCisgKiBDb21wbGV0ZSB0aGUgbG9jayBhY3F1aXNpdGlvbiBzdGFydGVkIG91ciBiZWhhbGYgYnkgYW5vdGhlciB0aHJlYWQuCisgKgorICogUmV0dXJuczoKKyAqICAwIC0gc3VjY2VzcworICogPDAgLSBlcnJvciwgb25lIG9mIC1FSU5UUiwgLUVUSU1FRE9VVCwgb3IgLUVERUFETEsKKyAqCisgKiBTcGVjaWFsIEFQSSBjYWxsIGZvciBQSS1mdXRleCByZXF1ZXVlIHN1cHBvcnQKKyAqLworaW50IHJ0X211dGV4X2ZpbmlzaF9wcm94eV9sb2NrKHN0cnVjdCBydF9tdXRleCAqbG9jaywKKwkJCSAgICAgICBzdHJ1Y3QgaHJ0aW1lcl9zbGVlcGVyICp0bywKKwkJCSAgICAgICBzdHJ1Y3QgcnRfbXV0ZXhfd2FpdGVyICp3YWl0ZXIsCisJCQkgICAgICAgaW50IGRldGVjdF9kZWFkbG9jaykKK3sKKwlpbnQgcmV0OworCisJc3Bpbl9sb2NrKCZsb2NrLT53YWl0X2xvY2spOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKworCXJldCA9IF9fcnRfbXV0ZXhfc2xvd2xvY2sobG9jaywgVEFTS19JTlRFUlJVUFRJQkxFLCB0bywgd2FpdGVyLAorCQkJCSAgZGV0ZWN0X2RlYWRsb2NrKTsKKworCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisKKwlpZiAodW5saWtlbHkod2FpdGVyLT50YXNrKSkKKwkJcmVtb3ZlX3dhaXRlcihsb2NrLCB3YWl0ZXIpOworCisJLyoKKwkgKiB0cnlfdG9fdGFrZV9ydF9tdXRleCgpIHNldHMgdGhlIHdhaXRlciBiaXQgdW5jb25kaXRpb25hbGx5LiBXZSBtaWdodAorCSAqIGhhdmUgdG8gZml4IHRoYXQgdXAuCisJICovCisJZml4dXBfcnRfbXV0ZXhfd2FpdGVycyhsb2NrKTsKKworCXNwaW5fdW5sb2NrKCZsb2NrLT53YWl0X2xvY2spOworCisJLyoKKwkgKiBSZWFkanVzdCBwcmlvcml0eSwgd2hlbiB3ZSBkaWQgbm90IGdldCB0aGUgbG9jay4gV2UgbWlnaHQgaGF2ZSBiZWVuCisJICogdGhlIHBlbmRpbmcgb3duZXIgYW5kIGJvb3N0ZWQuIFNpbmNlIHdlIGRpZCBub3QgdGFrZSB0aGUgbG9jaywgdGhlCisJICogUEkgYm9vc3QgaGFzIHRvIGdvLgorCSAqLworCWlmICh1bmxpa2VseShyZXQpKQorCQlydF9tdXRleF9hZGp1c3RfcHJpbyhjdXJyZW50KTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9rZXJuZWwvcnRtdXRleF9jb21tb24uaCBiL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oCmluZGV4IGUxMjRiZjUuLjk3YTJmODEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oCisrKyBiL2tlcm5lbC9ydG11dGV4X2NvbW1vbi5oCkBAIC0xMjAsNiArMTIwLDE0IEBACiAJCQkJICAgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJveHlfb3duZXIpOwogZXh0ZXJuIHZvaWQgcnRfbXV0ZXhfcHJveHlfdW5sb2NrKHN0cnVjdCBydF9tdXRleCAqbG9jaywKIAkJCQkgIHN0cnVjdCB0YXNrX3N0cnVjdCAqcHJveHlfb3duZXIpOworZXh0ZXJuIGludCBydF9tdXRleF9zdGFydF9wcm94eV9sb2NrKHN0cnVjdCBydF9tdXRleCAqbG9jaywKKwkJCQkgICAgIHN0cnVjdCBydF9tdXRleF93YWl0ZXIgKndhaXRlciwKKwkJCQkgICAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqdGFzaywKKwkJCQkgICAgIGludCBkZXRlY3RfZGVhZGxvY2spOworZXh0ZXJuIGludCBydF9tdXRleF9maW5pc2hfcHJveHlfbG9jayhzdHJ1Y3QgcnRfbXV0ZXggKmxvY2ssCisJCQkJICAgICAgc3RydWN0IGhydGltZXJfc2xlZXBlciAqdG8sCisJCQkJICAgICAgc3RydWN0IHJ0X211dGV4X3dhaXRlciAqd2FpdGVyLAorCQkJCSAgICAgIGludCBkZXRlY3RfZGVhZGxvY2spOwogCiAjaWZkZWYgQ09ORklHX0RFQlVHX1JUX01VVEVYRVMKICMgaW5jbHVkZSAicnRtdXRleC1kZWJ1Zy5oIgpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkLmMgYi9rZXJuZWwvc2NoZWQuYwppbmRleCAyNmVmYTQ3Li41YjNmNmVjIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWQuYworKysgYi9rZXJuZWwvc2NoZWQuYwpAQCAtMzksNiArMzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KICNpbmNsdWRlIDxsaW51eC9rZXJuZWxfc3RhdC5oPgogI2luY2x1ZGUgPGxpbnV4L2RlYnVnX2xvY2tzLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CiAjaW5jbHVkZSA8bGludXgvc2VjdXJpdHkuaD4KICNpbmNsdWRlIDxsaW51eC9ub3RpZmllci5oPgogI2luY2x1ZGUgPGxpbnV4L3Byb2ZpbGUuaD4KQEAgLTcyLDEzICs3MywxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgotI2luY2x1ZGUgPHRyYWNlL3NjaGVkLmg+CiAKICNpbmNsdWRlIDxhc20vdGxiLmg+CiAjaW5jbHVkZSA8YXNtL2lycV9yZWdzLmg+CiAKICNpbmNsdWRlICJzY2hlZF9jcHVwcmkuaCIKIAorI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CisKIC8qCiAgKiBDb252ZXJ0IHVzZXItbmljZSB2YWx1ZXMgWyAtMjAgLi4uIDAgLi4uIDE5IF0KICAqIHRvIHN0YXRpYyBwcmlvcml0eSBbIE1BWF9SVF9QUklPLi5NQVhfUFJJTy0xIF0sCkBAIC0xMTgsMTIgKzEyMSw2IEBACiAgKi8KICNkZWZpbmUgUlVOVElNRV9JTkYJKCh1NjQpfjBVTEwpCiAKLURFRklORV9UUkFDRShzY2hlZF93YWl0X3Rhc2spOwotREVGSU5FX1RSQUNFKHNjaGVkX3dha2V1cCk7Ci1ERUZJTkVfVFJBQ0Uoc2NoZWRfd2FrZXVwX25ldyk7Ci1ERUZJTkVfVFJBQ0Uoc2NoZWRfc3dpdGNoKTsKLURFRklORV9UUkFDRShzY2hlZF9taWdyYXRlX3Rhc2spOwotCiAjaWZkZWYgQ09ORklHX1NNUAogCiBzdGF0aWMgdm9pZCBkb3VibGVfcnFfbG9jayhzdHJ1Y3QgcnEgKnJxMSwgc3RydWN0IHJxICpycTIpOwpAQCAtNTg0LDYgKzU4MSw3IEBACiAJc3RydWN0IGxvYWRfd2VpZ2h0IGxvYWQ7CiAJdW5zaWduZWQgbG9uZyBucl9sb2FkX3VwZGF0ZXM7CiAJdTY0IG5yX3N3aXRjaGVzOworCXU2NCBucl9taWdyYXRpb25zX2luOwogCiAJc3RydWN0IGNmc19ycSBjZnM7CiAJc3RydWN0IHJ0X3JxIHJ0OwpAQCAtNjMwLDYgKzYyOCwxMCBAQAogCXN0cnVjdCBsaXN0X2hlYWQgbWlncmF0aW9uX3F1ZXVlOwogI2VuZGlmCiAKKwkvKiBjYWxjX2xvYWQgcmVsYXRlZCBmaWVsZHMgKi8KKwl1bnNpZ25lZCBsb25nIGNhbGNfbG9hZF91cGRhdGU7CisJbG9uZyBjYWxjX2xvYWRfYWN0aXZlOworCiAjaWZkZWYgQ09ORklHX1NDSEVEX0hSVElDSwogI2lmZGVmIENPTkZJR19TTVAKIAlpbnQgaHJ0aWNrX2NzZF9wZW5kaW5nOwpAQCAtNjkyLDcgKzY5NCw3IEBACiAjZGVmaW5lIHRhc2tfcnEocCkJCWNwdV9ycSh0YXNrX2NwdShwKSkKICNkZWZpbmUgY3B1X2N1cnIoY3B1KQkJKGNwdV9ycShjcHUpLT5jdXJyKQogCi1zdGF0aWMgaW5saW5lIHZvaWQgdXBkYXRlX3JxX2Nsb2NrKHN0cnVjdCBycSAqcnEpCitpbmxpbmUgdm9pZCB1cGRhdGVfcnFfY2xvY2soc3RydWN0IHJxICpycSkKIHsKIAlycS0+Y2xvY2sgPSBzY2hlZF9jbG9ja19jcHUoY3B1X29mKHJxKSk7CiB9CkBAIC0xNzI4LDYgKzE3MzAsOCBAQAogfQogI2VuZGlmCiAKK3N0YXRpYyB2b2lkIGNhbGNfbG9hZF9hY2NvdW50X2FjdGl2ZShzdHJ1Y3QgcnEgKnRoaXNfcnEpOworCiAjaW5jbHVkZSAic2NoZWRfc3RhdHMuaCIKICNpbmNsdWRlICJzY2hlZF9pZGxldGFzay5jIgogI2luY2x1ZGUgInNjaGVkX2ZhaXIuYyIKQEAgLTE5NTgsNyArMTk2Miw3IEBACiAKIAljbG9ja19vZmZzZXQgPSBvbGRfcnEtPmNsb2NrIC0gbmV3X3JxLT5jbG9jazsKIAotCXRyYWNlX3NjaGVkX21pZ3JhdGVfdGFzayhwLCB0YXNrX2NwdShwKSwgbmV3X2NwdSk7CisJdHJhY2Vfc2NoZWRfbWlncmF0ZV90YXNrKHAsIG5ld19jcHUpOwogCiAjaWZkZWYgQ09ORklHX1NDSEVEU1RBVFMKIAlpZiAocC0+c2Uud2FpdF9zdGFydCkKQEAgLTE5NjcsMTIgKzE5NzEsMTYgQEAKIAkJcC0+c2Uuc2xlZXBfc3RhcnQgLT0gY2xvY2tfb2Zmc2V0OwogCWlmIChwLT5zZS5ibG9ja19zdGFydCkKIAkJcC0+c2UuYmxvY2tfc3RhcnQgLT0gY2xvY2tfb2Zmc2V0OworI2VuZGlmCiAJaWYgKG9sZF9jcHUgIT0gbmV3X2NwdSkgewotCQlzY2hlZHN0YXRfaW5jKHAsIHNlLm5yX21pZ3JhdGlvbnMpOworCQlwLT5zZS5ucl9taWdyYXRpb25zKys7CisJCW5ld19ycS0+bnJfbWlncmF0aW9uc19pbisrOworI2lmZGVmIENPTkZJR19TQ0hFRFNUQVRTCiAJCWlmICh0YXNrX2hvdChwLCBvbGRfcnEtPmNsb2NrLCBOVUxMKSkKIAkJCXNjaGVkc3RhdF9pbmMocCwgc2UubnJfZm9yY2VkMl9taWdyYXRpb25zKTsKLQl9CiAjZW5kaWYKKwkJcGVyZl9jb3VudGVyX3Rhc2tfbWlncmF0aW9uKHAsIG5ld19jcHUpOworCX0KIAlwLT5zZS52cnVudGltZSAtPSBvbGRfY2ZzcnEtPm1pbl92cnVudGltZSAtCiAJCQkJCSBuZXdfY2ZzcnEtPm1pbl92cnVudGltZTsKIApAQCAtMjAxNSw2ICsyMDIzLDQ5IEBACiB9CiAKIC8qCisgKiB3YWl0X3Rhc2tfY29udGV4dF9zd2l0Y2ggLQl3YWl0IGZvciBhIHRocmVhZCB0byBjb21wbGV0ZSBhdCBsZWFzdCBvbmUKKyAqCQkJCWNvbnRleHQgc3dpdGNoLgorICoKKyAqIEBwIG11c3Qgbm90IGJlIGN1cnJlbnQuCisgKi8KK3ZvaWQgd2FpdF90YXNrX2NvbnRleHRfc3dpdGNoKHN0cnVjdCB0YXNrX3N0cnVjdCAqcCkKK3sKKwl1bnNpZ25lZCBsb25nIG52Y3N3LCBuaXZjc3csIGZsYWdzOworCWludCBydW5uaW5nOworCXN0cnVjdCBycSAqcnE7CisKKwludmNzdwk9IHAtPm52Y3N3OworCW5pdmNzdwk9IHAtPm5pdmNzdzsKKwlmb3IgKDs7KSB7CisJCS8qCisJCSAqIFRoZSBydW5xdWV1ZSBpcyBhc3NpZ25lZCBiZWZvcmUgdGhlIGFjdHVhbCBjb250ZXh0CisJCSAqIHN3aXRjaC4gV2UgbmVlZCB0byB0YWtlIHRoZSBydW5xdWV1ZSBsb2NrLgorCQkgKgorCQkgKiBXZSBjb3VsZCBjaGVjayBpbml0aWFsbHkgd2l0aG91dCB0aGUgbG9jayBidXQgaXQgaXMKKwkJICogdmVyeSBsaWtlbHkgdGhhdCB3ZSBuZWVkIHRvIHRha2UgdGhlIGxvY2sgaW4gZXZlcnkKKwkJICogaXRlcmF0aW9uLgorCQkgKi8KKwkJcnEgPSB0YXNrX3JxX2xvY2socCwgJmZsYWdzKTsKKwkJcnVubmluZyA9IHRhc2tfcnVubmluZyhycSwgcCk7CisJCXRhc2tfcnFfdW5sb2NrKHJxLCAmZmxhZ3MpOworCisJCWlmIChsaWtlbHkoIXJ1bm5pbmcpKQorCQkJYnJlYWs7CisJCS8qCisJCSAqIFRoZSBzd2l0Y2ggY291bnQgaXMgaW5jcmVtZW50ZWQgYmVmb3JlIHRoZSBhY3R1YWwKKwkJICogY29udGV4dCBzd2l0Y2guIFdlIHRodXMgd2FpdCBmb3IgdHdvIHN3aXRjaGVzIHRvIGJlCisJCSAqIHN1cmUgYXQgbGVhc3Qgb25lIGNvbXBsZXRlZC4KKwkJICovCisJCWlmICgocC0+bnZjc3cgLSBudmNzdykgPiAxKQorCQkJYnJlYWs7CisJCWlmICgocC0+bml2Y3N3IC0gbml2Y3N3KSA+IDEpCisJCQlicmVhazsKKworCQljcHVfcmVsYXgoKTsKKwl9Cit9CisKKy8qCiAgKiB3YWl0X3Rhc2tfaW5hY3RpdmUgLSB3YWl0IGZvciBhIHRocmVhZCB0byB1bnNjaGVkdWxlLgogICoKICAqIElmIEBtYXRjaF9zdGF0ZSBpcyBub256ZXJvLCBpdCdzIHRoZSBAcC0+c3RhdGUgdmFsdWUganVzdCBjaGVja2VkIGFuZApAQCAtMjMyNCw2ICsyMzc1LDI3IEBACiAKICNlbmRpZiAvKiBDT05GSUdfU01QICovCiAKKy8qKgorICogdGFza19vbmNwdV9mdW5jdGlvbl9jYWxsIC0gY2FsbCBhIGZ1bmN0aW9uIG9uIHRoZSBjcHUgb24gd2hpY2ggYSB0YXNrIHJ1bnMKKyAqIEBwOgkJdGhlIHRhc2sgdG8gZXZhbHVhdGUKKyAqIEBmdW5jOgl0aGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkCisgKiBAaW5mbzoJdGhlIGZ1bmN0aW9uIGNhbGwgYXJndW1lbnQKKyAqCisgKiBDYWxscyB0aGUgZnVuY3Rpb24gQGZ1bmMgd2hlbiB0aGUgdGFzayBpcyBjdXJyZW50bHkgcnVubmluZy4gVGhpcyBtaWdodAorICogYmUgb24gdGhlIGN1cnJlbnQgQ1BVLCB3aGljaCBqdXN0IGNhbGxzIHRoZSBmdW5jdGlvbiBkaXJlY3RseQorICovCit2b2lkIHRhc2tfb25jcHVfZnVuY3Rpb25fY2FsbChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnAsCisJCQkgICAgICB2b2lkICgqZnVuYykgKHZvaWQgKmluZm8pLCB2b2lkICppbmZvKQoreworCWludCBjcHU7CisKKwlwcmVlbXB0X2Rpc2FibGUoKTsKKwljcHUgPSB0YXNrX2NwdShwKTsKKwlpZiAodGFza19jdXJyKHApKQorCQlzbXBfY2FsbF9mdW5jdGlvbl9zaW5nbGUoY3B1LCBmdW5jLCBpbmZvLCAxKTsKKwlwcmVlbXB0X2VuYWJsZSgpOworfQorCiAvKioqCiAgKiB0cnlfdG9fd2FrZV91cCAtIHdha2UgdXAgYSB0aHJlYWQKICAqIEBwOiB0aGUgdG8tYmUtd29rZW4tdXAgdGhyZWFkCkBAIC0yNDU4LDYgKzI1MzAsMTcgQEAKIAlyZXR1cm4gc3VjY2VzczsKIH0KIAorLyoqCisgKiB3YWtlX3VwX3Byb2Nlc3MgLSBXYWtlIHVwIGEgc3BlY2lmaWMgcHJvY2VzcworICogQHA6IFRoZSBwcm9jZXNzIHRvIGJlIHdva2VuIHVwLgorICoKKyAqIEF0dGVtcHQgdG8gd2FrZSB1cCB0aGUgbm9taW5hdGVkIHByb2Nlc3MgYW5kIG1vdmUgaXQgdG8gdGhlIHNldCBvZiBydW5uYWJsZQorICogcHJvY2Vzc2VzLiAgUmV0dXJucyAxIGlmIHRoZSBwcm9jZXNzIHdhcyB3b2tlbiB1cCwgMCBpZiBpdCB3YXMgYWxyZWFkeQorICogcnVubmluZy4KKyAqCisgKiBJdCBtYXkgYmUgYXNzdW1lZCB0aGF0IHRoaXMgZnVuY3Rpb24gaW1wbGllcyBhIHdyaXRlIG1lbW9yeSBiYXJyaWVyIGJlZm9yZQorICogY2hhbmdpbmcgdGhlIHRhc2sgc3RhdGUgaWYgYW5kIG9ubHkgaWYgYW55IHRhc2tzIGFyZSB3b2tlbiB1cC4KKyAqLwogaW50IHdha2VfdXBfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnApCiB7CiAJcmV0dXJuIHRyeV90b193YWtlX3VwKHAsIFRBU0tfQUxMLCAwKTsKQEAgLTI0ODAsNiArMjU2Myw3IEBACiAJcC0+c2UuZXhlY19zdGFydAkJPSAwOwogCXAtPnNlLnN1bV9leGVjX3J1bnRpbWUJCT0gMDsKIAlwLT5zZS5wcmV2X3N1bV9leGVjX3J1bnRpbWUJPSAwOworCXAtPnNlLm5yX21pZ3JhdGlvbnMJCT0gMDsKIAlwLT5zZS5sYXN0X3dha2V1cAkJPSAwOwogCXAtPnNlLmF2Z19vdmVybGFwCQk9IDA7CiAJcC0+c2Uuc3RhcnRfcnVudGltZQkJPSAwOwpAQCAtMjcxMCw2ICsyNzk0LDcgQEAKIAkgKi8KIAlwcmV2X3N0YXRlID0gcHJldi0+c3RhdGU7CiAJZmluaXNoX2FyY2hfc3dpdGNoKHByZXYpOworCXBlcmZfY291bnRlcl90YXNrX3NjaGVkX2luKGN1cnJlbnQsIGNwdV9vZihycSkpOwogCWZpbmlzaF9sb2NrX3N3aXRjaChycSwgcHJldik7CiAjaWZkZWYgQ09ORklHX1NNUAogCWlmIChwb3N0X3NjaGVkdWxlKQpAQCAtMjc2Niw3ICsyODUxLDcgQEAKIAkgKiBjb21iaW5lIHRoZSBwYWdlIHRhYmxlIHJlbG9hZCBhbmQgdGhlIHN3aXRjaCBiYWNrZW5kIGludG8KIAkgKiBvbmUgaHlwZXJjYWxsLgogCSAqLwotCWFyY2hfZW50ZXJfbGF6eV9jcHVfbW9kZSgpOworCWFyY2hfc3RhcnRfY29udGV4dF9zd2l0Y2gocHJldik7CiAKIAlpZiAodW5saWtlbHkoIW1tKSkgewogCQluZXh0LT5hY3RpdmVfbW0gPSBvbGRtbTsKQEAgLTI4NTYsMTkgKzI5NDEsODEgQEAKIAlyZXR1cm4gc3VtOwogfQogCi11bnNpZ25lZCBsb25nIG5yX2FjdGl2ZSh2b2lkKQorLyogVmFyaWFibGVzIGFuZCBmdW5jdGlvbnMgZm9yIGNhbGNfbG9hZCAqLworc3RhdGljIGF0b21pY19sb25nX3QgY2FsY19sb2FkX3Rhc2tzOworc3RhdGljIHVuc2lnbmVkIGxvbmcgY2FsY19sb2FkX3VwZGF0ZTsKK3Vuc2lnbmVkIGxvbmcgYXZlbnJ1blszXTsKK0VYUE9SVF9TWU1CT0woYXZlbnJ1bik7CisKKy8qKgorICogZ2V0X2F2ZW5ydW4gLSBnZXQgdGhlIGxvYWQgYXZlcmFnZSBhcnJheQorICogQGxvYWRzOglwb2ludGVyIHRvIGRlc3QgbG9hZCBhcnJheQorICogQG9mZnNldDoJb2Zmc2V0IHRvIGFkZAorICogQHNoaWZ0OglzaGlmdCBjb3VudCB0byBzaGlmdCB0aGUgcmVzdWx0IGxlZnQKKyAqCisgKiBUaGVzZSB2YWx1ZXMgYXJlIGVzdGltYXRlcyBhdCBiZXN0LCBzbyBubyBuZWVkIGZvciBsb2NraW5nLgorICovCit2b2lkIGdldF9hdmVucnVuKHVuc2lnbmVkIGxvbmcgKmxvYWRzLCB1bnNpZ25lZCBsb25nIG9mZnNldCwgaW50IHNoaWZ0KQogewotCXVuc2lnbmVkIGxvbmcgaSwgcnVubmluZyA9IDAsIHVuaW50ZXJydXB0aWJsZSA9IDA7CisJbG9hZHNbMF0gPSAoYXZlbnJ1blswXSArIG9mZnNldCkgPDwgc2hpZnQ7CisJbG9hZHNbMV0gPSAoYXZlbnJ1blsxXSArIG9mZnNldCkgPDwgc2hpZnQ7CisJbG9hZHNbMl0gPSAoYXZlbnJ1blsyXSArIG9mZnNldCkgPDwgc2hpZnQ7Cit9CiAKLQlmb3JfZWFjaF9vbmxpbmVfY3B1KGkpIHsKLQkJcnVubmluZyArPSBjcHVfcnEoaSktPm5yX3J1bm5pbmc7Ci0JCXVuaW50ZXJydXB0aWJsZSArPSBjcHVfcnEoaSktPm5yX3VuaW50ZXJydXB0aWJsZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitjYWxjX2xvYWQodW5zaWduZWQgbG9uZyBsb2FkLCB1bnNpZ25lZCBsb25nIGV4cCwgdW5zaWduZWQgbG9uZyBhY3RpdmUpCit7CisJbG9hZCAqPSBleHA7CisJbG9hZCArPSBhY3RpdmUgKiAoRklYRURfMSAtIGV4cCk7CisJcmV0dXJuIGxvYWQgPj4gRlNISUZUOworfQorCisvKgorICogY2FsY19sb2FkIC0gdXBkYXRlIHRoZSBhdmVucnVuIGxvYWQgZXN0aW1hdGVzIDEwIHRpY2tzIGFmdGVyIHRoZQorICogQ1BVcyBoYXZlIHVwZGF0ZWQgY2FsY19sb2FkX3Rhc2tzLgorICovCit2b2lkIGNhbGNfZ2xvYmFsX2xvYWQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIHVwZCA9IGNhbGNfbG9hZF91cGRhdGUgKyAxMDsKKwlsb25nIGFjdGl2ZTsKKworCWlmICh0aW1lX2JlZm9yZShqaWZmaWVzLCB1cGQpKQorCQlyZXR1cm47CisKKwlhY3RpdmUgPSBhdG9taWNfbG9uZ19yZWFkKCZjYWxjX2xvYWRfdGFza3MpOworCWFjdGl2ZSA9IGFjdGl2ZSA+IDAgPyBhY3RpdmUgKiBGSVhFRF8xIDogMDsKKworCWF2ZW5ydW5bMF0gPSBjYWxjX2xvYWQoYXZlbnJ1blswXSwgRVhQXzEsIGFjdGl2ZSk7CisJYXZlbnJ1blsxXSA9IGNhbGNfbG9hZChhdmVucnVuWzFdLCBFWFBfNSwgYWN0aXZlKTsKKwlhdmVucnVuWzJdID0gY2FsY19sb2FkKGF2ZW5ydW5bMl0sIEVYUF8xNSwgYWN0aXZlKTsKKworCWNhbGNfbG9hZF91cGRhdGUgKz0gTE9BRF9GUkVROworfQorCisvKgorICogRWl0aGVyIGNhbGxlZCBmcm9tIHVwZGF0ZV9jcHVfbG9hZCgpIG9yIGZyb20gYSBjcHUgZ29pbmcgaWRsZQorICovCitzdGF0aWMgdm9pZCBjYWxjX2xvYWRfYWNjb3VudF9hY3RpdmUoc3RydWN0IHJxICp0aGlzX3JxKQoreworCWxvbmcgbnJfYWN0aXZlLCBkZWx0YTsKKworCW5yX2FjdGl2ZSA9IHRoaXNfcnEtPm5yX3J1bm5pbmc7CisJbnJfYWN0aXZlICs9IChsb25nKSB0aGlzX3JxLT5ucl91bmludGVycnVwdGlibGU7CisKKwlpZiAobnJfYWN0aXZlICE9IHRoaXNfcnEtPmNhbGNfbG9hZF9hY3RpdmUpIHsKKwkJZGVsdGEgPSBucl9hY3RpdmUgLSB0aGlzX3JxLT5jYWxjX2xvYWRfYWN0aXZlOworCQl0aGlzX3JxLT5jYWxjX2xvYWRfYWN0aXZlID0gbnJfYWN0aXZlOworCQlhdG9taWNfbG9uZ19hZGQoZGVsdGEsICZjYWxjX2xvYWRfdGFza3MpOwogCX0KK30KIAotCWlmICh1bmxpa2VseSgobG9uZyl1bmludGVycnVwdGlibGUgPCAwKSkKLQkJdW5pbnRlcnJ1cHRpYmxlID0gMDsKLQotCXJldHVybiBydW5uaW5nICsgdW5pbnRlcnJ1cHRpYmxlOworLyoKKyAqIEV4dGVybmFsbHkgdmlzaWJsZSBwZXItY3B1IHNjaGVkdWxlciBzdGF0aXN0aWNzOgorICogY3B1X25yX21pZ3JhdGlvbnMoY3B1KSAtIG51bWJlciBvZiBtaWdyYXRpb25zIGludG8gdGhhdCBjcHUKKyAqLwordTY0IGNwdV9ucl9taWdyYXRpb25zKGludCBjcHUpCit7CisJcmV0dXJuIGNwdV9ycShjcHUpLT5ucl9taWdyYXRpb25zX2luOwogfQogCiAvKgpAQCAtMjg5OSw2ICszMDQ2LDExIEBACiAJCQluZXdfbG9hZCArPSBzY2FsZS0xOwogCQl0aGlzX3JxLT5jcHVfbG9hZFtpXSA9IChvbGRfbG9hZCooc2NhbGUtMSkgKyBuZXdfbG9hZCkgPj4gaTsKIAl9CisKKwlpZiAodGltZV9hZnRlcl9lcShqaWZmaWVzLCB0aGlzX3JxLT5jYWxjX2xvYWRfdXBkYXRlKSkgeworCQl0aGlzX3JxLT5jYWxjX2xvYWRfdXBkYXRlICs9IExPQURfRlJFUTsKKwkJY2FsY19sb2FkX2FjY291bnRfYWN0aXZlKHRoaXNfcnEpOworCX0KIH0KIAogI2lmZGVmIENPTkZJR19TTVAKQEAgLTQyNDAsMTAgKzQzOTIsMTI2IEBACiBzdGF0aWMgc3RydWN0IHsKIAlhdG9taWNfdCBsb2FkX2JhbGFuY2VyOwogCWNwdW1hc2tfdmFyX3QgY3B1X21hc2s7CisJY3B1bWFza192YXJfdCBpbGJfZ3JwX25vaHpfbWFzazsKIH0gbm9oeiBfX19fY2FjaGVsaW5lX2FsaWduZWQgPSB7CiAJLmxvYWRfYmFsYW5jZXIgPSBBVE9NSUNfSU5JVCgtMSksCiB9OwogCisjaWYgZGVmaW5lZChDT05GSUdfU0NIRURfTUMpIHx8IGRlZmluZWQoQ09ORklHX1NDSEVEX1NNVCkKKy8qKgorICogbG93ZXN0X2ZsYWdfZG9tYWluIC0gUmV0dXJuIGxvd2VzdCBzY2hlZF9kb21haW4gY29udGFpbmluZyBmbGFnLgorICogQGNwdToJVGhlIGNwdSB3aG9zZSBsb3dlc3QgbGV2ZWwgb2Ygc2NoZWQgZG9tYWluIGlzIHRvCisgKgkJYmUgcmV0dXJuZWQuCisgKiBAZmxhZzoJVGhlIGZsYWcgdG8gY2hlY2sgZm9yIHRoZSBsb3dlc3Qgc2NoZWRfZG9tYWluCisgKgkJZm9yIHRoZSBnaXZlbiBjcHUuCisgKgorICogUmV0dXJucyB0aGUgbG93ZXN0IHNjaGVkX2RvbWFpbiBvZiBhIGNwdSB3aGljaCBjb250YWlucyB0aGUgZ2l2ZW4gZmxhZy4KKyAqLworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc2NoZWRfZG9tYWluICpsb3dlc3RfZmxhZ19kb21haW4oaW50IGNwdSwgaW50IGZsYWcpCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisKKwlmb3JfZWFjaF9kb21haW4oY3B1LCBzZCkKKwkJaWYgKHNkICYmIChzZC0+ZmxhZ3MgJiBmbGFnKSkKKwkJCWJyZWFrOworCisJcmV0dXJuIHNkOworfQorCisvKioKKyAqIGZvcl9lYWNoX2ZsYWdfZG9tYWluIC0gSXRlcmF0ZXMgb3ZlciBzY2hlZF9kb21haW5zIGNvbnRhaW5pbmcgdGhlIGZsYWcuCisgKiBAY3B1OglUaGUgY3B1IHdob3NlIGRvbWFpbnMgd2UncmUgaXRlcmF0aW5nIG92ZXIuCisgKiBAc2Q6CQl2YXJpYWJsZSBob2xkaW5nIHRoZSB2YWx1ZSBvZiB0aGUgcG93ZXJfc2F2aW5nc19zZAorICoJCWZvciBjcHUuCisgKiBAZmxhZzoJVGhlIGZsYWcgdG8gZmlsdGVyIHRoZSBzY2hlZF9kb21haW5zIHRvIGJlIGl0ZXJhdGVkLgorICoKKyAqIEl0ZXJhdGVzIG92ZXIgYWxsIHRoZSBzY2hlZHVsZXIgZG9tYWlucyBmb3IgYSBnaXZlbiBjcHUgdGhhdCBoYXMgdGhlICdmbGFnJworICogc2V0LCBzdGFydGluZyBmcm9tIHRoZSBsb3dlc3Qgc2NoZWRfZG9tYWluIHRvIHRoZSBoaWdoZXN0LgorICovCisjZGVmaW5lIGZvcl9lYWNoX2ZsYWdfZG9tYWluKGNwdSwgc2QsIGZsYWcpIFwKKwlmb3IgKHNkID0gbG93ZXN0X2ZsYWdfZG9tYWluKGNwdSwgZmxhZyk7IFwKKwkJKHNkICYmIChzZC0+ZmxhZ3MgJiBmbGFnKSk7IHNkID0gc2QtPnBhcmVudCkKKworLyoqCisgKiBpc19zZW1pX2lkbGVfZ3JvdXAgLSBDaGVja3MgaWYgdGhlIGdpdmVuIHNjaGVkX2dyb3VwIGlzIHNlbWktaWRsZS4KKyAqIEBpbGJfZ3JvdXA6CWdyb3VwIHRvIGJlIGNoZWNrZWQgZm9yIHNlbWktaWRsZW5lc3MKKyAqCisgKiBSZXR1cm5zOgkxIGlmIHRoZSBncm91cCBpcyBzZW1pLWlkbGUuIDAgb3RoZXJ3aXNlLgorICoKKyAqIFdlIGRlZmluZSBhIHNjaGVkX2dyb3VwIHRvIGJlIHNlbWkgaWRsZSBpZiBpdCBoYXMgYXRsZWFzdCBvbmUgaWRsZS1DUFUKKyAqIGFuZCBhdGxlYXN0IG9uZSBub24taWRsZSBDUFUuIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGNoZWNrcyBpZiB0aGUgZ2l2ZW4KKyAqIHNjaGVkX2dyb3VwIGlzIHNlbWktaWRsZSBvciBub3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NlbWlfaWRsZV9ncm91cChzdHJ1Y3Qgc2NoZWRfZ3JvdXAgKmlsYl9ncm91cCkKK3sKKwljcHVtYXNrX2FuZChub2h6LmlsYl9ncnBfbm9oel9tYXNrLCBub2h6LmNwdV9tYXNrLAorCQkJCQlzY2hlZF9ncm91cF9jcHVzKGlsYl9ncm91cCkpOworCisJLyoKKwkgKiBBIHNjaGVkX2dyb3VwIGlzIHNlbWktaWRsZSB3aGVuIGl0IGhhcyBhdGxlYXN0IG9uZSBidXN5IGNwdQorCSAqIGFuZCBhdGxlYXN0IG9uZSBpZGxlIGNwdS4KKwkgKi8KKwlpZiAoY3B1bWFza19lbXB0eShub2h6LmlsYl9ncnBfbm9oel9tYXNrKSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoY3B1bWFza19lcXVhbChub2h6LmlsYl9ncnBfbm9oel9tYXNrLCBzY2hlZF9ncm91cF9jcHVzKGlsYl9ncm91cCkpKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorLyoqCisgKiBmaW5kX25ld19pbGIgLSBGaW5kcyB0aGUgb3B0aW11bSBpZGxlIGxvYWQgYmFsYW5jZXIgZm9yIG5vbWluYXRpb24uCisgKiBAY3B1OglUaGUgY3B1IHdoaWNoIGlzIG5vbWluYXRpbmcgYSBuZXcgaWRsZV9sb2FkX2JhbGFuY2VyLgorICoKKyAqIFJldHVybnM6CVJldHVybnMgdGhlIGlkIG9mIHRoZSBpZGxlIGxvYWQgYmFsYW5jZXIgaWYgaXQgZXhpc3RzLAorICoJCUVsc2UsIHJldHVybnMgPj0gbnJfY3B1X2lkcy4KKyAqCisgKiBUaGlzIGFsZ29yaXRobSBwaWNrcyB0aGUgaWRsZSBsb2FkIGJhbGFuY2VyIHN1Y2ggdGhhdCBpdCBiZWxvbmdzIHRvIGEKKyAqIHNlbWktaWRsZSBwb3dlcnNhdmluZ3Mgc2NoZWRfZG9tYWluLiBUaGUgaWRlYSBpcyB0byB0cnkgYW5kIGF2b2lkCisgKiBjb21wbGV0ZWx5IGlkbGUgcGFja2FnZXMvY29yZXMganVzdCBmb3IgdGhlIHB1cnBvc2Ugb2YgaWRsZSBsb2FkIGJhbGFuY2luZworICogd2hlbiB0aGVyZSBhcmUgb3RoZXIgaWRsZSBjcHUncyB3aGljaCBhcmUgYmV0dGVyIHN1aXRlZCBmb3IgdGhhdCBqb2IuCisgKi8KK3N0YXRpYyBpbnQgZmluZF9uZXdfaWxiKGludCBjcHUpCit7CisJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CisJc3RydWN0IHNjaGVkX2dyb3VwICppbGJfZ3JvdXA7CisKKwkvKgorCSAqIEhhdmUgaWRsZSBsb2FkIGJhbGFuY2VyIHNlbGVjdGlvbiBmcm9tIHNlbWktaWRsZSBwYWNrYWdlcyBvbmx5CisJICogd2hlbiBwb3dlci1hd2FyZSBsb2FkIGJhbGFuY2luZyBpcyBlbmFibGVkCisJICovCisJaWYgKCEoc2NoZWRfc210X3Bvd2VyX3NhdmluZ3MgfHwgc2NoZWRfbWNfcG93ZXJfc2F2aW5ncykpCisJCWdvdG8gb3V0X2RvbmU7CisKKwkvKgorCSAqIE9wdGltaXplIGZvciB0aGUgY2FzZSB3aGVuIHdlIGhhdmUgbm8gaWRsZSBDUFVzIG9yIG9ubHkgb25lCisJICogaWRsZSBDUFUuIERvbid0IHdhbGsgdGhlIHNjaGVkX2RvbWFpbiBoaWVyYXJjaHkgaW4gc3VjaCBjYXNlcworCSAqLworCWlmIChjcHVtYXNrX3dlaWdodChub2h6LmNwdV9tYXNrKSA8IDIpCisJCWdvdG8gb3V0X2RvbmU7CisKKwlmb3JfZWFjaF9mbGFnX2RvbWFpbihjcHUsIHNkLCBTRF9QT1dFUlNBVklOR1NfQkFMQU5DRSkgeworCQlpbGJfZ3JvdXAgPSBzZC0+Z3JvdXBzOworCisJCWRvIHsKKwkJCWlmIChpc19zZW1pX2lkbGVfZ3JvdXAoaWxiX2dyb3VwKSkKKwkJCQlyZXR1cm4gY3B1bWFza19maXJzdChub2h6LmlsYl9ncnBfbm9oel9tYXNrKTsKKworCQkJaWxiX2dyb3VwID0gaWxiX2dyb3VwLT5uZXh0OworCisJCX0gd2hpbGUgKGlsYl9ncm91cCAhPSBzZC0+Z3JvdXBzKTsKKwl9CisKK291dF9kb25lOgorCXJldHVybiBjcHVtYXNrX2ZpcnN0KG5vaHouY3B1X21hc2spOworfQorI2Vsc2UgLyogIChDT05GSUdfU0NIRURfTUMgfHwgQ09ORklHX1NDSEVEX1NNVCkgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGZpbmRfbmV3X2lsYihpbnQgY2FsbF9jcHUpCit7CisJcmV0dXJuIGNwdW1hc2tfZmlyc3Qobm9oei5jcHVfbWFzayk7Cit9CisjZW5kaWYKKwogLyoKICAqIFRoaXMgcm91dGluZSB3aWxsIHRyeSB0byBub21pbmF0ZSB0aGUgaWxiIChpZGxlIGxvYWQgYmFsYW5jaW5nKQogICogb3duZXIgYW1vbmcgdGhlIGNwdXMgd2hvc2UgdGlja3MgYXJlIHN0b3BwZWQuIGlsYiBvd25lciB3aWxsIGRvIHRoZSBpZGxlCkBAIC00Mjk4LDggKzQ1NjYsMjQgQEAKIAkJCS8qIG1ha2UgbWUgdGhlIGlsYiBvd25lciAqLwogCQkJaWYgKGF0b21pY19jbXB4Y2hnKCZub2h6LmxvYWRfYmFsYW5jZXIsIC0xLCBjcHUpID09IC0xKQogCQkJCXJldHVybiAxOwotCQl9IGVsc2UgaWYgKGF0b21pY19yZWFkKCZub2h6LmxvYWRfYmFsYW5jZXIpID09IGNwdSkKKwkJfSBlbHNlIGlmIChhdG9taWNfcmVhZCgmbm9oei5sb2FkX2JhbGFuY2VyKSA9PSBjcHUpIHsKKwkJCWludCBuZXdfaWxiOworCisJCQlpZiAoIShzY2hlZF9zbXRfcG93ZXJfc2F2aW5ncyB8fAorCQkJCQkJc2NoZWRfbWNfcG93ZXJfc2F2aW5ncykpCisJCQkJcmV0dXJuIDE7CisJCQkvKgorCQkJICogQ2hlY2sgdG8gc2VlIGlmIHRoZXJlIGlzIGEgbW9yZSBwb3dlci1lZmZpY2llbnQKKwkJCSAqIGlsYi4KKwkJCSAqLworCQkJbmV3X2lsYiA9IGZpbmRfbmV3X2lsYihjcHUpOworCQkJaWYgKG5ld19pbGIgPCBucl9jcHVfaWRzICYmIG5ld19pbGIgIT0gY3B1KSB7CisJCQkJYXRvbWljX3NldCgmbm9oei5sb2FkX2JhbGFuY2VyLCAtMSk7CisJCQkJcmVzY2hlZF9jcHUobmV3X2lsYik7CisJCQkJcmV0dXJuIDA7CisJCQl9CiAJCQlyZXR1cm4gMTsKKwkJfQogCX0gZWxzZSB7CiAJCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIG5vaHouY3B1X21hc2spKQogCQkJcmV0dXJuIDA7CkBAIC00NDY4LDE1ICs0NzUyLDcgQEAKIAkJfQogCiAJCWlmIChhdG9taWNfcmVhZCgmbm9oei5sb2FkX2JhbGFuY2VyKSA9PSAtMSkgewotCQkJLyoKLQkJCSAqIHNpbXBsZSBzZWxlY3Rpb24gZm9yIG5vdzogTm9taW5hdGUgdGhlCi0JCQkgKiBmaXJzdCBjcHUgaW4gdGhlIG5vaHogbGlzdCB0byBiZSB0aGUgbmV4dAotCQkJICogaWxiIG93bmVyLgotCQkJICoKLQkJCSAqIFRCRDogVHJhdmVyc2UgdGhlIHNjaGVkIGRvbWFpbnMgYW5kIG5vbWluYXRlCi0JCQkgKiB0aGUgbmVhcmVzdCBjcHUgaW4gdGhlIG5vaHouY3B1X21hc2suCi0JCQkgKi8KLQkJCWludCBpbGIgPSBjcHVtYXNrX2ZpcnN0KG5vaHouY3B1X21hc2spOworCQkJaW50IGlsYiA9IGZpbmRfbmV3X2lsYihjcHUpOwogCiAJCQlpZiAoaWxiIDwgbnJfY3B1X2lkcykKIAkJCQlyZXNjaGVkX2NwdShpbGIpOwpAQCAtNDg0MCw2ICs1MTE2LDggQEAKIAljdXJyLT5zY2hlZF9jbGFzcy0+dGFza190aWNrKHJxLCBjdXJyLCAwKTsKIAlzcGluX3VubG9jaygmcnEtPmxvY2spOwogCisJcGVyZl9jb3VudGVyX3Rhc2tfdGljayhjdXJyLCBjcHUpOworCiAjaWZkZWYgQ09ORklHX1NNUAogCXJxLT5pZGxlX2F0X3RpY2sgPSBpZGxlX2NwdShjcHUpOwogCXRyaWdnZXJfbG9hZF9iYWxhbmNlKHJxLCBjcHUpOwpAQCAtNTAwNywxMyArNTI4NSwxNSBAQAogLyoKICAqIHNjaGVkdWxlKCkgaXMgdGhlIG1haW4gc2NoZWR1bGVyIGZ1bmN0aW9uLgogICovCi1hc21saW5rYWdlIHZvaWQgX19zY2hlZCBfX3NjaGVkdWxlKHZvaWQpCithc21saW5rYWdlIHZvaWQgX19zY2hlZCBzY2hlZHVsZSh2b2lkKQogewogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcHJldiwgKm5leHQ7CiAJdW5zaWduZWQgbG9uZyAqc3dpdGNoX2NvdW50OwogCXN0cnVjdCBycSAqcnE7CiAJaW50IGNwdTsKIAorbmVlZF9yZXNjaGVkOgorCXByZWVtcHRfZGlzYWJsZSgpOwogCWNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKIAlycSA9IGNwdV9ycShjcHUpOwogCXJjdV9xc2N0cl9pbmMoY3B1KTsKQEAgLTUwNTMsNiArNTMzMyw3IEBACiAKIAlpZiAobGlrZWx5KHByZXYgIT0gbmV4dCkpIHsKIAkJc2NoZWRfaW5mb19zd2l0Y2gocHJldiwgbmV4dCk7CisJCXBlcmZfY291bnRlcl90YXNrX3NjaGVkX291dChwcmV2LCBuZXh0LCBjcHUpOwogCiAJCXJxLT5ucl9zd2l0Y2hlcysrOwogCQlycS0+Y3VyciA9IG5leHQ7CkBAIC01MDcwLDE1ICs1MzUxLDkgQEAKIAogCWlmICh1bmxpa2VseShyZWFjcXVpcmVfa2VybmVsX2xvY2soY3VycmVudCkgPCAwKSkKIAkJZ290byBuZWVkX3Jlc2NoZWRfbm9ucHJlZW1wdGlibGU7Ci19CiAKLWFzbWxpbmthZ2Ugdm9pZCBfX3NjaGVkIHNjaGVkdWxlKHZvaWQpCi17Ci1uZWVkX3Jlc2NoZWQ6Ci0JcHJlZW1wdF9kaXNhYmxlKCk7Ci0JX19zY2hlZHVsZSgpOwogCXByZWVtcHRfZW5hYmxlX25vX3Jlc2NoZWQoKTsKLQlpZiAodW5saWtlbHkodGVzdF90aHJlYWRfZmxhZyhUSUZfTkVFRF9SRVNDSEVEKSkpCisJaWYgKG5lZWRfcmVzY2hlZCgpKQogCQlnb3RvIG5lZWRfcmVzY2hlZDsKIH0KIEVYUE9SVF9TWU1CT0woc2NoZWR1bGUpOwpAQCAtNTIyMSw3ICs1NDk2LDcgQEAKICAqIHN0YXJ0ZWQgdG8gcnVuIGJ1dCBpcyBub3QgaW4gc3RhdGUgVEFTS19SVU5OSU5HLiB0cnlfdG9fd2FrZV91cCgpIHJldHVybnMKICAqIHplcm8gaW4gdGhpcyAocmFyZSkgY2FzZSwgYW5kIHdlIGhhbmRsZSBpdCBieSBjb250aW51aW5nIHRvIHNjYW4gdGhlIHF1ZXVlLgogICovCi12b2lkIF9fd2FrZV91cF9jb21tb24od2FpdF9xdWV1ZV9oZWFkX3QgKnEsIHVuc2lnbmVkIGludCBtb2RlLAorc3RhdGljIHZvaWQgX193YWtlX3VwX2NvbW1vbih3YWl0X3F1ZXVlX2hlYWRfdCAqcSwgdW5zaWduZWQgaW50IG1vZGUsCiAJCQlpbnQgbnJfZXhjbHVzaXZlLCBpbnQgc3luYywgdm9pZCAqa2V5KQogewogCXdhaXRfcXVldWVfdCAqY3VyciwgKm5leHQ7CkBAIC01MjQxLDYgKzU1MTYsOSBAQAogICogQG1vZGU6IHdoaWNoIHRocmVhZHMKICAqIEBucl9leGNsdXNpdmU6IGhvdyBtYW55IHdha2Utb25lIG9yIHdha2UtbWFueSB0aHJlYWRzIHRvIHdha2UgdXAKICAqIEBrZXk6IGlzIGRpcmVjdGx5IHBhc3NlZCB0byB0aGUgd2FrZXVwIGZ1bmN0aW9uCisgKgorICogSXQgbWF5IGJlIGFzc3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGltcGxpZXMgYSB3cml0ZSBtZW1vcnkgYmFycmllciBiZWZvcmUKKyAqIGNoYW5naW5nIHRoZSB0YXNrIHN0YXRlIGlmIGFuZCBvbmx5IGlmIGFueSB0YXNrcyBhcmUgd29rZW4gdXAuCiAgKi8KIHZvaWQgX193YWtlX3VwKHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwKIAkJCWludCBucl9leGNsdXNpdmUsIHZvaWQgKmtleSkKQEAgLTUyNzksNiArNTU1Nyw5IEBACiAgKiB3aXRoIGVhY2ggb3RoZXIuIFRoaXMgY2FuIHByZXZlbnQgbmVlZGxlc3MgYm91bmNpbmcgYmV0d2VlbiBDUFVzLgogICoKICAqIE9uIFVQIGl0IGNhbiBwcmV2ZW50IGV4dHJhIHByZWVtcHRpb24uCisgKgorICogSXQgbWF5IGJlIGFzc3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGltcGxpZXMgYSB3cml0ZSBtZW1vcnkgYmFycmllciBiZWZvcmUKKyAqIGNoYW5naW5nIHRoZSB0YXNrIHN0YXRlIGlmIGFuZCBvbmx5IGlmIGFueSB0YXNrcyBhcmUgd29rZW4gdXAuCiAgKi8KIHZvaWQgX193YWtlX3VwX3N5bmNfa2V5KHdhaXRfcXVldWVfaGVhZF90ICpxLCB1bnNpZ25lZCBpbnQgbW9kZSwKIAkJCWludCBucl9leGNsdXNpdmUsIHZvaWQgKmtleSkKQEAgLTUzMTUsNiArNTU5Niw5IEBACiAgKiBhd2FrZW5lZCBpbiB0aGUgc2FtZSBvcmRlciBpbiB3aGljaCB0aGV5IHdlcmUgcXVldWVkLgogICoKICAqIFNlZSBhbHNvIGNvbXBsZXRlX2FsbCgpLCB3YWl0X2Zvcl9jb21wbGV0aW9uKCkgYW5kIHJlbGF0ZWQgcm91dGluZXMuCisgKgorICogSXQgbWF5IGJlIGFzc3VtZWQgdGhhdCB0aGlzIGZ1bmN0aW9uIGltcGxpZXMgYSB3cml0ZSBtZW1vcnkgYmFycmllciBiZWZvcmUKKyAqIGNoYW5naW5nIHRoZSB0YXNrIHN0YXRlIGlmIGFuZCBvbmx5IGlmIGFueSB0YXNrcyBhcmUgd29rZW4gdXAuCiAgKi8KIHZvaWQgY29tcGxldGUoc3RydWN0IGNvbXBsZXRpb24gKngpCiB7CkBAIC01MzMyLDYgKzU2MTYsOSBAQAogICogQHg6ICBob2xkcyB0aGUgc3RhdGUgb2YgdGhpcyBwYXJ0aWN1bGFyIGNvbXBsZXRpb24KICAqCiAgKiBUaGlzIHdpbGwgd2FrZSB1cCBhbGwgdGhyZWFkcyB3YWl0aW5nIG9uIHRoaXMgcGFydGljdWxhciBjb21wbGV0aW9uIGV2ZW50LgorICoKKyAqIEl0IG1heSBiZSBhc3N1bWVkIHRoYXQgdGhpcyBmdW5jdGlvbiBpbXBsaWVzIGEgd3JpdGUgbWVtb3J5IGJhcnJpZXIgYmVmb3JlCisgKiBjaGFuZ2luZyB0aGUgdGFzayBzdGF0ZSBpZiBhbmQgb25seSBpZiBhbnkgdGFza3MgYXJlIHdva2VuIHVwLgogICovCiB2b2lkIGNvbXBsZXRlX2FsbChzdHJ1Y3QgY29tcGxldGlvbiAqeCkKIHsKQEAgLTY0OTAsOCArNjc3Nyw5IEBACiAjaWZkZWYgQ09ORklHX0RFQlVHX1NUQUNLX1VTQUdFCiAJZnJlZSA9IHN0YWNrX25vdF91c2VkKHApOwogI2VuZGlmCi0JcHJpbnRrKEtFUk5fQ09OVCAiJTVsdSAlNWQgJTZkXG4iLCBmcmVlLAotCQl0YXNrX3BpZF9ucihwKSwgdGFza19waWRfbnIocC0+cmVhbF9wYXJlbnQpKTsKKwlwcmludGsoS0VSTl9DT05UICIlNWx1ICU1ZCAlNmQgMHglMDhseFxuIiwgZnJlZSwKKwkJdGFza19waWRfbnIocCksIHRhc2tfcGlkX25yKHAtPnJlYWxfcGFyZW50KSwKKwkJKHVuc2lnbmVkIGxvbmcpdGFza190aHJlYWRfaW5mbyhwKS0+ZmxhZ3MpOwogCiAJc2hvd19zdGFjayhwLCBOVUxMKTsKIH0KQEAgLTY5NzAsNiArNzI1OCwxNCBAQAogCiAJfQogfQorCisvKgorICogcmVtb3ZlIHRoZSB0YXNrcyB3aGljaCB3ZXJlIGFjY291bnRlZCBieSBycSBmcm9tIGNhbGNfbG9hZF90YXNrcy4KKyAqLworc3RhdGljIHZvaWQgY2FsY19nbG9iYWxfbG9hZF9yZW1vdmUoc3RydWN0IHJxICpycSkKK3sKKwlhdG9taWNfbG9uZ19zdWIocnEtPmNhbGNfbG9hZF9hY3RpdmUsICZjYWxjX2xvYWRfdGFza3MpOworfQogI2VuZGlmIC8qIENPTkZJR19IT1RQTFVHX0NQVSAqLwogCiAjaWYgZGVmaW5lZChDT05GSUdfU0NIRURfREVCVUcpICYmIGRlZmluZWQoQ09ORklHX1NZU0NUTCkKQEAgLTcyMDQsNiArNzUwMCw4IEBACiAJCS8qIFVwZGF0ZSBvdXIgcm9vdC1kb21haW4gKi8KIAkJcnEgPSBjcHVfcnEoY3B1KTsKIAkJc3Bpbl9sb2NrX2lycXNhdmUoJnJxLT5sb2NrLCBmbGFncyk7CisJCXJxLT5jYWxjX2xvYWRfdXBkYXRlID0gY2FsY19sb2FkX3VwZGF0ZTsKKwkJcnEtPmNhbGNfbG9hZF9hY3RpdmUgPSAwOwogCQlpZiAocnEtPnJkKSB7CiAJCQlCVUdfT04oIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBycS0+cmQtPnNwYW4pKTsKIApAQCAtNzI0Myw3ICs3NTQxLDcgQEAKIAkJY3B1c2V0X3VubG9jaygpOwogCQltaWdyYXRlX25yX3VuaW50ZXJydXB0aWJsZShycSk7CiAJCUJVR19PTihycS0+bnJfcnVubmluZyAhPSAwKTsKLQorCQljYWxjX2dsb2JhbF9sb2FkX3JlbW92ZShycSk7CiAJCS8qCiAJCSAqIE5vIG5lZWQgdG8gbWlncmF0ZSB0aGUgdGFza3M6IGl0IHdhcyBiZXN0LWVmZm9ydCBpZgogCQkgKiB0aGV5IGRpZG4ndCB0YWtlIHNjaGVkX2hvdGNwdV9tdXRleC4gSnVzdCB3YWtlIHVwCkBAIC03Mjc5LDggKzc1NzcsMTAgQEAKIAlyZXR1cm4gTk9USUZZX09LOwogfQogCi0vKiBSZWdpc3RlciBhdCBoaWdoZXN0IHByaW9yaXR5IHNvIHRoYXQgdGFzayBtaWdyYXRpb24gKG1pZ3JhdGVfYWxsX3Rhc2tzKQotICogaGFwcGVucyBiZWZvcmUgZXZlcnl0aGluZyBlbHNlLgorLyoKKyAqIFJlZ2lzdGVyIGF0IGhpZ2ggcHJpb3JpdHkgc28gdGhhdCB0YXNrIG1pZ3JhdGlvbiAobWlncmF0ZV9hbGxfdGFza3MpCisgKiBoYXBwZW5zIGJlZm9yZSBldmVyeXRoaW5nIGVsc2UuICBUaGlzIGhhcyB0byBiZSBsb3dlciBwcmlvcml0eSB0aGFuCisgKiB0aGUgbm90aWZpZXIgaW4gdGhlIHBlcmZfY291bnRlciBzdWJzeXN0ZW0sIHRob3VnaC4KICAqLwogc3RhdGljIHN0cnVjdCBub3RpZmllcl9ibG9jayBfX2NwdWluaXRkYXRhIG1pZ3JhdGlvbl9ub3RpZmllciA9IHsKIAkubm90aWZpZXJfY2FsbCA9IG1pZ3JhdGlvbl9jYWxsLApAQCAtNzc1Myw4ICs4MDUzLDkgQEAKIAogLyoKICAqIFRoZSBjcHVzIG1hc2sgaW4gc2NoZWRfZ3JvdXAgYW5kIHNjaGVkX2RvbWFpbiBoYW5ncyBvZmYgdGhlIGVuZC4KLSAqIEZJWE1FOiB1c2UgY3B1bWFza192YXJfdCBvciBkeW5hbWljIHBlcmNwdSBhbGxvYyB0byBhdm9pZCB3YXN0aW5nIHNwYWNlCi0gKiBmb3IgbnJfY3B1X2lkcyA8IENPTkZJR19OUl9DUFVTLgorICoKKyAqICggU2VlIHRoZSB0aGUgY29tbWVudHMgaW4gaW5jbHVkZS9saW51eC9zY2hlZC5oOnN0cnVjdCBzY2hlZF9ncm91cAorICogICBhbmQgc3RydWN0IHNjaGVkX2RvbWFpbi4gKQogICovCiBzdHJ1Y3Qgc3RhdGljX3NjaGVkX2dyb3VwIHsKIAlzdHJ1Y3Qgc2NoZWRfZ3JvdXAgc2c7CkBAIC03ODc1LDcgKzgxNzYsNyBAQAogCQkJc3RydWN0IHNjaGVkX2RvbWFpbiAqc2Q7CiAKIAkJCXNkID0gJnBlcl9jcHUocGh5c19kb21haW5zLCBqKS5zZDsKLQkJCWlmIChqICE9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZ3JvdXBfY3B1cyhzZC0+Z3JvdXBzKSkpIHsKKwkJCWlmIChqICE9IGdyb3VwX2ZpcnN0X2NwdShzZC0+Z3JvdXBzKSkgewogCQkJCS8qCiAJCQkJICogT25seSBhZGQgInBvd2VyIiBvbmNlIGZvciBlYWNoCiAJCQkJICogcGh5c2ljYWwgcGFja2FnZS4KQEAgLTc5NTMsNyArODI1NCw3IEBACiAKIAlXQVJOX09OKCFzZCB8fCAhc2QtPmdyb3Vwcyk7CiAKLQlpZiAoY3B1ICE9IGNwdW1hc2tfZmlyc3Qoc2NoZWRfZ3JvdXBfY3B1cyhzZC0+Z3JvdXBzKSkpCisJaWYgKGNwdSAhPSBncm91cF9maXJzdF9jcHUoc2QtPmdyb3VwcykpCiAJCXJldHVybjsKIAogCWNoaWxkID0gc2QtPmNoaWxkOwpAQCAtODkzOCw2ICs5MjM5LDggQEAKIAkJcnEgPSBjcHVfcnEoaSk7CiAJCXNwaW5fbG9ja19pbml0KCZycS0+bG9jayk7CiAJCXJxLT5ucl9ydW5uaW5nID0gMDsKKwkJcnEtPmNhbGNfbG9hZF9hY3RpdmUgPSAwOworCQlycS0+Y2FsY19sb2FkX3VwZGF0ZSA9IGppZmZpZXMgKyBMT0FEX0ZSRVE7CiAJCWluaXRfY2ZzX3JxKCZycS0+Y2ZzLCBycSk7CiAJCWluaXRfcnRfcnEoJnJxLT5ydCwgcnEpOwogI2lmZGVmIENPTkZJR19GQUlSX0dST1VQX1NDSEVECkBAIC04OTU4LDcgKzkyNjEsNyBAQAogCQkgKiAxMDI0KSBhbmQgdHdvIGNoaWxkIGdyb3VwcyBBMCBhbmQgQTEgKG9mIHdlaWdodCAxMDI0IGVhY2gpLAogCQkgKiB0aGVuIEEwJ3Mgc2hhcmUgb2YgdGhlIGNwdSByZXNvdXJjZSBpczoKIAkJICoKLQkJICogCUEwJ3MgYmFuZHdpZHRoID0gMTAyNCAvICgxMCoxMDI0ICsgMTAyNCArIDEwMjQpID0gOC4zMyUKKwkJICoJQTAncyBiYW5kd2lkdGggPSAxMDI0IC8gKDEwKjEwMjQgKyAxMDI0ICsgMTAyNCkgPSA4LjMzJQogCQkgKgogCQkgKiBXZSBhY2hpZXZlIHRoaXMgYnkgbGV0dGluZyBpbml0X3Rhc2tfZ3JvdXAncyB0YXNrcyBzaXQKIAkJICogZGlyZWN0bHkgaW4gcnEtPmNmcyAoaS5lIGluaXRfdGFza19ncm91cC0+c2VbXSA9IE5VTEwpLgpAQCAtOTA0NSw2ICs5MzQ4LDkgQEAKIAkgKiB3aGVuIHRoaXMgcnVucXVldWUgYmVjb21lcyAiaWRsZSIuCiAJICovCiAJaW5pdF9pZGxlKGN1cnJlbnQsIHNtcF9wcm9jZXNzb3JfaWQoKSk7CisKKwljYWxjX2xvYWRfdXBkYXRlID0gamlmZmllcyArIExPQURfRlJFUTsKKwogCS8qCiAJICogRHVyaW5nIGVhcmx5IGJvb3R1cCB3ZSBwcmV0ZW5kIHRvIGJlIGEgbm9ybWFsIHRhc2s6CiAJICovCkBAIC05MDU1LDEwICs5MzYxLDEzIEBACiAjaWZkZWYgQ09ORklHX1NNUAogI2lmZGVmIENPTkZJR19OT19IWgogCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJm5vaHouY3B1X21hc2spOworCWFsbG9jX2Jvb3RtZW1fY3B1bWFza192YXIoJm5vaHouaWxiX2dycF9ub2h6X21hc2spOwogI2VuZGlmCiAJYWxsb2NfYm9vdG1lbV9jcHVtYXNrX3ZhcigmY3B1X2lzb2xhdGVkX21hcCk7CiAjZW5kaWYgLyogU01QICovCiAKKwlwZXJmX2NvdW50ZXJfaW5pdCgpOworCiAJc2NoZWR1bGVyX3J1bm5pbmcgPSAxOwogfQogCkBAIC05ODAwLDYgKzEwMTA5LDEzIEBACiAJaWYgKHN5c2N0bF9zY2hlZF9ydF9wZXJpb2QgPD0gMCkKIAkJcmV0dXJuIC1FSU5WQUw7CiAKKwkvKgorCSAqIFRoZXJlJ3MgYWx3YXlzIHNvbWUgUlQgdGFza3MgaW4gdGhlIHJvb3QgZ3JvdXAKKwkgKiAtLSBtaWdyYXRpb24sIGtzdG9wbWFjaGluZSBldGMuLgorCSAqLworCWlmIChzeXNjdGxfc2NoZWRfcnRfcnVudGltZSA9PSAwKQorCQlyZXR1cm4gLUVCVVNZOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmRlZl9ydF9iYW5kd2lkdGgucnRfcnVudGltZV9sb2NrLCBmbGFncyk7CiAJZm9yX2VhY2hfcG9zc2libGVfY3B1KGkpIHsKIAkJc3RydWN0IHJ0X3JxICpydF9ycSA9ICZjcHVfcnEoaSktPnJ0OwpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2ZhaXIuYyBiL2tlcm5lbC9zY2hlZF9mYWlyLmMKaW5kZXggMzgxNmYyMS4uNWY5NjUwZSAxMDA2NDQKLS0tIGEva2VybmVsL3NjaGVkX2ZhaXIuYworKysgYi9rZXJuZWwvc2NoZWRfZmFpci5jCkBAIC0xNDg3LDE3ICsxNDg3LDEwIEBACiAKIAlmaW5kX21hdGNoaW5nX3NlKCZzZSwgJnBzZSk7CiAKLQl3aGlsZSAoc2UpIHsKLQkJQlVHX09OKCFwc2UpOworCUJVR19PTighcHNlKTsKIAotCQlpZiAod2FrZXVwX3ByZWVtcHRfZW50aXR5KHNlLCBwc2UpID09IDEpIHsKLQkJCXJlc2NoZWRfdGFzayhjdXJyKTsKLQkJCWJyZWFrOwotCQl9Ci0KLQkJc2UgPSBwYXJlbnRfZW50aXR5KHNlKTsKLQkJcHNlID0gcGFyZW50X2VudGl0eShwc2UpOwotCX0KKwlpZiAod2FrZXVwX3ByZWVtcHRfZW50aXR5KHNlLCBwc2UpID09IDEpCisJCXJlc2NoZWRfdGFzayhjdXJyKTsKIH0KIAogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlja19uZXh0X3Rhc2tfZmFpcihzdHJ1Y3QgcnEgKnJxKQpkaWZmIC0tZ2l0IGEva2VybmVsL3NjaGVkX2lkbGV0YXNrLmMgYi9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYwppbmRleCA4YTIxYTJlLi40OTk2NzJjIDEwMDY0NAotLS0gYS9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYworKysgYi9rZXJuZWwvc2NoZWRfaWRsZXRhc2suYwpAQCAtMjIsNyArMjIsOCBAQAogc3RhdGljIHN0cnVjdCB0YXNrX3N0cnVjdCAqcGlja19uZXh0X3Rhc2tfaWRsZShzdHJ1Y3QgcnEgKnJxKQogewogCXNjaGVkc3RhdF9pbmMocnEsIHNjaGVkX2dvaWRsZSk7Ci0KKwkvKiBhZGp1c3QgdGhlIGFjdGl2ZSB0YXNrcyBhcyB3ZSBtaWdodCBnbyBpbnRvIGEgbG9uZyBzbGVlcCAqLworCWNhbGNfbG9hZF9hY2NvdW50X2FjdGl2ZShycSk7CiAJcmV0dXJuIHJxLT5pZGxlOwogfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvc2lnbmFsLmMgYi9rZXJuZWwvc2lnbmFsLmMKaW5kZXggZDgwMzQ3My4uZGJhNmFlOSAxMDA2NDQKLS0tIGEva2VybmVsL3NpZ25hbC5jCisrKyBiL2tlcm5lbC9zaWduYWwuYwpAQCAtMjcsNyArMjcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2ZyZWV6ZXIuaD4KICNpbmNsdWRlIDxsaW51eC9waWRfbmFtZXNwYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvbnNwcm94eS5oPgotI2luY2x1ZGUgPHRyYWNlL3NjaGVkLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CiAKICNpbmNsdWRlIDxhc20vcGFyYW0uaD4KICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgpAQCAtNDEsOCArNDEsNiBAQAogCiBzdGF0aWMgc3RydWN0IGttZW1fY2FjaGUgKnNpZ3F1ZXVlX2NhY2hlcDsKIAotREVGSU5FX1RSQUNFKHNjaGVkX3NpZ25hbF9zZW5kKTsKLQogc3RhdGljIHZvaWQgX191c2VyICpzaWdfaGFuZGxlcihzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQsIGludCBzaWcpCiB7CiAJcmV0dXJuIHQtPnNpZ2hhbmQtPmFjdGlvbltzaWcgLSAxXS5zYS5zYV9oYW5kbGVyOwpAQCAtMjI3OCwyNCArMjI3NiwxNyBAQAogCXJldHVybiBraWxsX3NvbWV0aGluZ19pbmZvKHNpZywgJmluZm8sIHBpZCk7CiB9CiAKLXN0YXRpYyBpbnQgZG9fdGtpbGwocGlkX3QgdGdpZCwgcGlkX3QgcGlkLCBpbnQgc2lnKQorc3RhdGljIGludAorZG9fc2VuZF9zcGVjaWZpYyhwaWRfdCB0Z2lkLCBwaWRfdCBwaWQsIGludCBzaWcsIHN0cnVjdCBzaWdpbmZvICppbmZvKQogewotCWludCBlcnJvcjsKLQlzdHJ1Y3Qgc2lnaW5mbyBpbmZvOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwotCi0JZXJyb3IgPSAtRVNSQ0g7Ci0JaW5mby5zaV9zaWdubyA9IHNpZzsKLQlpbmZvLnNpX2Vycm5vID0gMDsKLQlpbmZvLnNpX2NvZGUgPSBTSV9US0lMTDsKLQlpbmZvLnNpX3BpZCA9IHRhc2tfdGdpZF92bnIoY3VycmVudCk7Ci0JaW5mby5zaV91aWQgPSBjdXJyZW50X3VpZCgpOworCWludCBlcnJvciA9IC1FU1JDSDsKIAogCXJjdV9yZWFkX2xvY2soKTsKIAlwID0gZmluZF90YXNrX2J5X3ZwaWQocGlkKTsKIAlpZiAocCAmJiAodGdpZCA8PSAwIHx8IHRhc2tfdGdpZF92bnIocCkgPT0gdGdpZCkpIHsKLQkJZXJyb3IgPSBjaGVja19raWxsX3Blcm1pc3Npb24oc2lnLCAmaW5mbywgcCk7CisJCWVycm9yID0gY2hlY2tfa2lsbF9wZXJtaXNzaW9uKHNpZywgaW5mbywgcCk7CiAJCS8qCiAJCSAqIFRoZSBudWxsIHNpZ25hbCBpcyBhIHBlcm1pc3Npb25zIGFuZCBwcm9jZXNzIGV4aXN0ZW5jZQogCQkgKiBwcm9iZS4gIE5vIHNpZ25hbCBpcyBhY3R1YWxseSBkZWxpdmVyZWQuCkBAIC0yMzA1LDcgKzIyOTYsNyBAQAogCQkgKiBzaWduYWwgaXMgcHJpdmF0ZSBhbnl3YXkuCiAJCSAqLwogCQlpZiAoIWVycm9yICYmIHNpZyAmJiBsb2NrX3Rhc2tfc2lnaGFuZChwLCAmZmxhZ3MpKSB7Ci0JCQllcnJvciA9IHNwZWNpZmljX3NlbmRfc2lnX2luZm8oc2lnLCAmaW5mbywgcCk7CisJCQllcnJvciA9IHNwZWNpZmljX3NlbmRfc2lnX2luZm8oc2lnLCBpbmZvLCBwKTsKIAkJCXVubG9ja190YXNrX3NpZ2hhbmQocCwgJmZsYWdzKTsKIAkJfQogCX0KQEAgLTIzMTQsNiArMjMwNSwxOSBAQAogCXJldHVybiBlcnJvcjsKIH0KIAorc3RhdGljIGludCBkb190a2lsbChwaWRfdCB0Z2lkLCBwaWRfdCBwaWQsIGludCBzaWcpCit7CisJc3RydWN0IHNpZ2luZm8gaW5mbzsKKworCWluZm8uc2lfc2lnbm8gPSBzaWc7CisJaW5mby5zaV9lcnJubyA9IDA7CisJaW5mby5zaV9jb2RlID0gU0lfVEtJTEw7CisJaW5mby5zaV9waWQgPSB0YXNrX3RnaWRfdm5yKGN1cnJlbnQpOworCWluZm8uc2lfdWlkID0gY3VycmVudF91aWQoKTsKKworCXJldHVybiBkb19zZW5kX3NwZWNpZmljKHRnaWQsIHBpZCwgc2lnLCAmaW5mbyk7Cit9CisKIC8qKgogICogIHN5c190Z2tpbGwgLSBzZW5kIHNpZ25hbCB0byBvbmUgc3BlY2lmaWMgdGhyZWFkCiAgKiAgQHRnaWQ6IHRoZSB0aHJlYWQgZ3JvdXAgSUQgb2YgdGhlIHRocmVhZApAQCAtMjM2Myw2ICsyMzY3LDMyIEBACiAJcmV0dXJuIGtpbGxfcHJvY19pbmZvKHNpZywgJmluZm8sIHBpZCk7CiB9CiAKK2xvbmcgZG9fcnRfdGdzaWdxdWV1ZWluZm8ocGlkX3QgdGdpZCwgcGlkX3QgcGlkLCBpbnQgc2lnLCBzaWdpbmZvX3QgKmluZm8pCit7CisJLyogVGhpcyBpcyBvbmx5IHZhbGlkIGZvciBzaW5nbGUgdGFza3MgKi8KKwlpZiAocGlkIDw9IDAgfHwgdGdpZCA8PSAwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE5vdCBldmVuIHJvb3QgY2FuIHByZXRlbmQgdG8gc2VuZCBzaWduYWxzIGZyb20gdGhlIGtlcm5lbC4KKwkgICBOb3IgY2FuIHRoZXkgaW1wZXJzb25hdGUgYSBraWxsKCksIHdoaWNoIGFkZHMgc291cmNlIGluZm8uICAqLworCWlmIChpbmZvLT5zaV9jb2RlID49IDApCisJCXJldHVybiAtRVBFUk07CisJaW5mby0+c2lfc2lnbm8gPSBzaWc7CisKKwlyZXR1cm4gZG9fc2VuZF9zcGVjaWZpYyh0Z2lkLCBwaWQsIHNpZywgaW5mbyk7Cit9CisKK1NZU0NBTExfREVGSU5FNChydF90Z3NpZ3F1ZXVlaW5mbywgcGlkX3QsIHRnaWQsIHBpZF90LCBwaWQsIGludCwgc2lnLAorCQlzaWdpbmZvX3QgX191c2VyICosIHVpbmZvKQoreworCXNpZ2luZm9fdCBpbmZvOworCisJaWYgKGNvcHlfZnJvbV91c2VyKCZpbmZvLCB1aW5mbywgc2l6ZW9mKHNpZ2luZm9fdCkpKQorCQlyZXR1cm4gLUVGQVVMVDsKKworCXJldHVybiBkb19ydF90Z3NpZ3F1ZXVlaW5mbyh0Z2lkLCBwaWQsIHNpZywgJmluZm8pOworfQorCiBpbnQgZG9fc2lnYWN0aW9uKGludCBzaWcsIHN0cnVjdCBrX3NpZ2FjdGlvbiAqYWN0LCBzdHJ1Y3Qga19zaWdhY3Rpb24gKm9hY3QpCiB7CiAJc3RydWN0IHRhc2tfc3RydWN0ICp0ID0gY3VycmVudDsKZGlmZiAtLWdpdCBhL2tlcm5lbC9zb2Z0aXJxLmMgYi9rZXJuZWwvc29mdGlycS5jCmluZGV4IGI1MjVkZDMuLjI1ODg4NWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zb2Z0aXJxLmMKKysrIGIva2VybmVsL3NvZnRpcnEuYwpAQCAtMjQsNyArMjQsOSBAQAogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgogI2luY2x1ZGUgPGxpbnV4L3NtcC5oPgogI2luY2x1ZGUgPGxpbnV4L3RpY2suaD4KLSNpbmNsdWRlIDx0cmFjZS9pcnEuaD4KKworI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2lycS5oPgogCiAjaW5jbHVkZSA8YXNtL2lycS5oPgogLyoKQEAgLTE4Niw5ICsxODgsNiBAQAogICovCiAjZGVmaW5lIE1BWF9TT0ZUSVJRX1JFU1RBUlQgMTAKIAotREVGSU5FX1RSQUNFKHNvZnRpcnFfZW50cnkpOwotREVGSU5FX1RSQUNFKHNvZnRpcnFfZXhpdCk7Ci0KIGFzbWxpbmthZ2Ugdm9pZCBfX2RvX3NvZnRpcnEodm9pZCkKIHsKIAlzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmg7CkBAIC04MjgsNyArODI3LDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotaW50IF9fd2VhayBhcmNoX2luaXRfY2hpcF9kYXRhKHN0cnVjdCBpcnFfZGVzYyAqZGVzYywgaW50IGNwdSkKK2ludCBfX3dlYWsgYXJjaF9pbml0X2NoaXBfZGF0YShzdHJ1Y3QgaXJxX2Rlc2MgKmRlc2MsIGludCBub2RlKQogewogCXJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEva2VybmVsL3N5cy5jIGIva2VybmVsL3N5cy5jCmluZGV4IGU3OTk4Y2YuLjQzOGQ5OWEgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXMuYworKysgYi9rZXJuZWwvc3lzLmMKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlIDxsaW51eC9wcmN0bC5oPgogI2luY2x1ZGUgPGxpbnV4L2hpZ2h1aWQuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogI2luY2x1ZGUgPGxpbnV4L3Jlc291cmNlLmg+CiAjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiAjaW5jbHVkZSA8bGludXgva2V4ZWMuaD4KQEAgLTE3OTMsNiArMTc5NCwxMiBAQAogCQljYXNlIFBSX1NFVF9UU0M6CiAJCQllcnJvciA9IFNFVF9UU0NfQ1RMKGFyZzIpOwogCQkJYnJlYWs7CisJCWNhc2UgUFJfVEFTS19QRVJGX0NPVU5URVJTX0RJU0FCTEU6CisJCQllcnJvciA9IHBlcmZfY291bnRlcl90YXNrX2Rpc2FibGUoKTsKKwkJCWJyZWFrOworCQljYXNlIFBSX1RBU0tfUEVSRl9DT1VOVEVSU19FTkFCTEU6CisJCQllcnJvciA9IHBlcmZfY291bnRlcl90YXNrX2VuYWJsZSgpOworCQkJYnJlYWs7CiAJCWNhc2UgUFJfR0VUX1RJTUVSU0xBQ0s6CiAJCQllcnJvciA9IGN1cnJlbnQtPnRpbWVyX3NsYWNrX25zOwogCQkJYnJlYWs7CmRpZmYgLS1naXQgYS9rZXJuZWwvc3lzX25pLmMgYi9rZXJuZWwvc3lzX25pLmMKaW5kZXggMjdkYWQyOS4uNjgzMjBmNiAxMDA2NDQKLS0tIGEva2VybmVsL3N5c19uaS5jCisrKyBiL2tlcm5lbC9zeXNfbmkuYwpAQCAtMTc1LDMgKzE3NSw2IEBACiBjb25kX3N5c2NhbGwoY29tcGF0X3N5c190aW1lcmZkX2dldHRpbWUpOwogY29uZF9zeXNjYWxsKHN5c19ldmVudGZkKTsKIGNvbmRfc3lzY2FsbChzeXNfZXZlbnRmZDIpOworCisvKiBwZXJmb3JtYW5jZSBjb3VudGVyczogKi8KK2NvbmRfc3lzY2FsbChzeXNfcGVyZl9jb3VudGVyX29wZW4pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3N5c2N0bC5jIGIva2VybmVsL3N5c2N0bC5jCmluZGV4IGIyOTcwZDUuLmE3ZTRlYjAgMTAwNjQ0Ci0tLSBhL2tlcm5lbC9zeXNjdGwuYworKysgYi9rZXJuZWwvc3lzY3RsLmMKQEAgLTQ5LDYgKzQ5LDcgQEAKICNpbmNsdWRlIDxsaW51eC9yZWJvb3QuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9zbG93LXdvcmsuaD4KKyNpbmNsdWRlIDxsaW51eC9wZXJmX2NvdW50ZXIuaD4KIAogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3Byb2Nlc3Nvci5oPgpAQCAtNzMxLDYgKzczMiwxNCBAQAogCX0sCiAJewogCQkuY3RsX25hbWUJPSBDVExfVU5OVU1CRVJFRCwKKwkJLnByb2NuYW1lCT0gImJvb3Rsb2FkZXJfdmVyc2lvbiIsCisJCS5kYXRhCQk9ICZib290bG9hZGVyX3ZlcnNpb24sCisJCS5tYXhsZW4JCT0gc2l6ZW9mIChpbnQpLAorCQkubW9kZQkJPSAwNDQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKwl7CisJCS5jdGxfbmFtZQk9IENUTF9VTk5VTUJFUkVELAogCQkucHJvY25hbWUJPSAia3N0YWNrX2RlcHRoX3RvX3ByaW50IiwKIAkJLmRhdGEJCT0gJmtzdGFja19kZXB0aF90b19wcmludCwKIAkJLm1heGxlbgkJPSBzaXplb2YoaW50KSwKQEAgLTkxMiw2ICs5MjEsMzIgQEAKIAkJLmNoaWxkCQk9IHNsb3dfd29ya19zeXNjdGxzLAogCX0sCiAjZW5kaWYKKyNpZmRlZiBDT05GSUdfUEVSRl9DT1VOVEVSUworCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJwZXJmX2NvdW50ZXJfcGFyYW5vaWQiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3BlcmZfY291bnRlcl9wYXJhbm9pZCwKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX3BlcmZfY291bnRlcl9wYXJhbm9pZCksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJwZXJmX2NvdW50ZXJfbWxvY2tfa2IiLAorCQkuZGF0YQkJPSAmc3lzY3RsX3BlcmZfY291bnRlcl9tbG9jaywKKwkJLm1heGxlbgkJPSBzaXplb2Yoc3lzY3RsX3BlcmZfY291bnRlcl9tbG9jayksCisJCS5tb2RlCQk9IDA2NDQsCisJCS5wcm9jX2hhbmRsZXIJPSAmcHJvY19kb2ludHZlYywKKwl9LAorCXsKKwkJLmN0bF9uYW1lCT0gQ1RMX1VOTlVNQkVSRUQsCisJCS5wcm9jbmFtZQk9ICJwZXJmX2NvdW50ZXJfbWF4X3NhbXBsZV9yYXRlIiwKKwkJLmRhdGEJCT0gJnN5c2N0bF9wZXJmX2NvdW50ZXJfc2FtcGxlX3JhdGUsCisJCS5tYXhsZW4JCT0gc2l6ZW9mKHN5c2N0bF9wZXJmX2NvdW50ZXJfc2FtcGxlX3JhdGUpLAorCQkubW9kZQkJPSAwNjQ0LAorCQkucHJvY19oYW5kbGVyCT0gJnByb2NfZG9pbnR2ZWMsCisJfSwKKyNlbmRpZgogLyoKICAqIE5PVEU6IGRvIG5vdCBhZGQgbmV3IGVudHJpZXMgdG8gdGhpcyB0YWJsZSB1bmxlc3MgeW91IGhhdmUgcmVhZAogICogRG9jdW1lbnRhdGlvbi9zeXNjdGwvY3RsX3VubnVtYmVyZWQudHh0CmRpZmYgLS1naXQgYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jIGIva2VybmVsL3RpbWUvdGltZWtlZXBpbmcuYwppbmRleCA2ODdkZmY0Li41MmE4YmY4IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZS90aW1la2VlcGluZy5jCisrKyBiL2tlcm5lbC90aW1lL3RpbWVrZWVwaW5nLmMKQEAgLTIyLDcgKzIyLDcgQEAKIAogLyoKICAqIFRoaXMgcmVhZC13cml0ZSBzcGlubG9jayBwcm90ZWN0cyB1cyBmcm9tIHJhY2VzIGluIFNNUCB3aGlsZQotICogcGxheWluZyB3aXRoIHh0aW1lIGFuZCBhdmVucnVuLgorICogcGxheWluZyB3aXRoIHh0aW1lLgogICovCiBfX2NhY2hlbGluZV9hbGlnbmVkX2luX3NtcCBERUZJTkVfU0VRTE9DSyh4dGltZV9sb2NrKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RpbWVyLmMgYi9rZXJuZWwvdGltZXIuYwppbmRleCBjZmZmZmFkLi5jMDFlNTY4IDEwMDY0NAotLS0gYS9rZXJuZWwvdGltZXIuYworKysgYi9rZXJuZWwvdGltZXIuYwpAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAjaW5jbHVkZSA8bGludXgvdGljay5oPgogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS91bmlzdGQuaD4KQEAgLTExMjMsNTMgKzExMjQsMTQgQEAKIH0KIAogLyoKLSAqIE5yIG9mIGFjdGl2ZSB0YXNrcyAtIGNvdW50ZWQgaW4gZml4ZWQtcG9pbnQgbnVtYmVycwotICovCi1zdGF0aWMgdW5zaWduZWQgbG9uZyBjb3VudF9hY3RpdmVfdGFza3Modm9pZCkKLXsKLQlyZXR1cm4gbnJfYWN0aXZlKCkgKiBGSVhFRF8xOwotfQotCi0vKgotICogSG1tLi4gQ2hhbmdlZCB0aGlzLCBhcyB0aGUgR05VIG1ha2Ugc291cmNlcyAobG9hZC5jKSBzZWVtcyB0bwotICogaW1wbHkgdGhhdCBhdmVucnVuW10gaXMgdGhlIHN0YW5kYXJkIG5hbWUgZm9yIHRoaXMga2luZCBvZiB0aGluZy4KLSAqIE5vdGhpbmcgZWxzZSBzZWVtcyB0byBiZSBzdGFuZGFyZGl6ZWQ6IHRoZSBmcmFjdGlvbmFsIHNpemUgZXRjCi0gKiBhbGwgc2VlbSB0byBkaWZmZXIgb24gZGlmZmVyZW50IG1hY2hpbmVzLgotICoKLSAqIFJlcXVpcmVzIHh0aW1lX2xvY2sgdG8gYWNjZXNzLgotICovCi11bnNpZ25lZCBsb25nIGF2ZW5ydW5bM107Ci0KLUVYUE9SVF9TWU1CT0woYXZlbnJ1bik7Ci0KLS8qCi0gKiBjYWxjX2xvYWQgLSBnaXZlbiB0aWNrIGNvdW50LCB1cGRhdGUgdGhlIGF2ZW5ydW4gbG9hZCBlc3RpbWF0ZXMuCi0gKiBUaGlzIGlzIGNhbGxlZCB3aGlsZSBob2xkaW5nIGEgd3JpdGVfbG9jayBvbiB4dGltZV9sb2NrLgotICovCi1zdGF0aWMgaW5saW5lIHZvaWQgY2FsY19sb2FkKHVuc2lnbmVkIGxvbmcgdGlja3MpCi17Ci0JdW5zaWduZWQgbG9uZyBhY3RpdmVfdGFza3M7IC8qIGZpeGVkLXBvaW50ICovCi0Jc3RhdGljIGludCBjb3VudCA9IExPQURfRlJFUTsKLQotCWNvdW50IC09IHRpY2tzOwotCWlmICh1bmxpa2VseShjb3VudCA8IDApKSB7Ci0JCWFjdGl2ZV90YXNrcyA9IGNvdW50X2FjdGl2ZV90YXNrcygpOwotCQlkbyB7Ci0JCQlDQUxDX0xPQUQoYXZlbnJ1blswXSwgRVhQXzEsIGFjdGl2ZV90YXNrcyk7Ci0JCQlDQUxDX0xPQUQoYXZlbnJ1blsxXSwgRVhQXzUsIGFjdGl2ZV90YXNrcyk7Ci0JCQlDQUxDX0xPQUQoYXZlbnJ1blsyXSwgRVhQXzE1LCBhY3RpdmVfdGFza3MpOwotCQkJY291bnQgKz0gTE9BRF9GUkVROwotCQl9IHdoaWxlIChjb3VudCA8IDApOwotCX0KLX0KLQotLyoKICAqIFRoaXMgZnVuY3Rpb24gcnVucyB0aW1lcnMgYW5kIHRoZSB0aW1lci10cSBpbiBib3R0b20gaGFsZiBjb250ZXh0LgogICovCiBzdGF0aWMgdm9pZCBydW5fdGltZXJfc29mdGlycShzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmgpCiB7CiAJc3RydWN0IHR2ZWNfYmFzZSAqYmFzZSA9IF9fZ2V0X2NwdV92YXIodHZlY19iYXNlcyk7CiAKKwlwZXJmX2NvdW50ZXJfZG9fcGVuZGluZygpOworCiAJaHJ0aW1lcl9ydW5fcGVuZGluZygpOwogCiAJaWYgKHRpbWVfYWZ0ZXJfZXEoamlmZmllcywgYmFzZS0+dGltZXJfamlmZmllcykpCkBAIC0xMTg3LDE2ICsxMTQ5LDYgQEAKIH0KIAogLyoKLSAqIENhbGxlZCBieSB0aGUgdGltZXIgaW50ZXJydXB0LiB4dGltZV9sb2NrIG11c3QgYWxyZWFkeSBiZSB0YWtlbgotICogYnkgdGhlIHRpbWVyIElSUSEKLSAqLwotc3RhdGljIGlubGluZSB2b2lkIHVwZGF0ZV90aW1lcyh1bnNpZ25lZCBsb25nIHRpY2tzKQotewotCXVwZGF0ZV93YWxsX3RpbWUoKTsKLQljYWxjX2xvYWQodGlja3MpOwotfQotCi0vKgogICogVGhlIDY0LWJpdCBqaWZmaWVzIHZhbHVlIGlzIG5vdCBhdG9taWMgLSB5b3UgTVVTVCBOT1QgcmVhZCBpdAogICogd2l0aG91dCBzYW1wbGluZyB0aGUgc2VxdWVuY2UgbnVtYmVyIGluIHh0aW1lX2xvY2suCiAgKiBqaWZmaWVzIGlzIGRlZmluZWQgaW4gdGhlIGxpbmtlciBzY3JpcHQuLi4KQEAgLTEyMDUsNyArMTE1Nyw4IEBACiB2b2lkIGRvX3RpbWVyKHVuc2lnbmVkIGxvbmcgdGlja3MpCiB7CiAJamlmZmllc182NCArPSB0aWNrczsKLQl1cGRhdGVfdGltZXModGlja3MpOworCXVwZGF0ZV93YWxsX3RpbWUoKTsKKwljYWxjX2dsb2JhbF9sb2FkKCk7CiB9CiAKICNpZmRlZiBfX0FSQ0hfV0FOVF9TWVNfQUxBUk0KQEAgLTE0MDYsMzcgKzEzNTksMTcgQEAKIHsKIAl1bnNpZ25lZCBsb25nIG1lbV90b3RhbCwgc2F2X3RvdGFsOwogCXVuc2lnbmVkIGludCBtZW1fdW5pdCwgYml0Y291bnQ7Ci0JdW5zaWduZWQgbG9uZyBzZXE7CisJc3RydWN0IHRpbWVzcGVjIHRwOwogCiAJbWVtc2V0KGluZm8sIDAsIHNpemVvZihzdHJ1Y3Qgc3lzaW5mbykpOwogCi0JZG8gewotCQlzdHJ1Y3QgdGltZXNwZWMgdHA7Ci0JCXNlcSA9IHJlYWRfc2VxYmVnaW4oJnh0aW1lX2xvY2spOworCWt0aW1lX2dldF90cygmdHApOworCW1vbm90b25pY190b19ib290YmFzZWQoJnRwKTsKKwlpbmZvLT51cHRpbWUgPSB0cC50dl9zZWMgKyAodHAudHZfbnNlYyA/IDEgOiAwKTsKIAotCQkvKgotCQkgKiBUaGlzIGlzIGFubm95aW5nLiAgVGhlIGJlbG93IGlzIHRoZSBzYW1lIHRoaW5nCi0JCSAqIHBvc2l4X2dldF9jbG9ja19tb25vdG9uaWMoKSBkb2VzLCBidXQgaXQgd2FudHMgdG8KLQkJICogdGFrZSB0aGUgbG9jayB3aGljaCB3ZSB3YW50IHRvIGNvdmVyIHRoZSBsb2FkcyBzdHVmZgotCQkgKiB0b28uCi0JCSAqLworCWdldF9hdmVucnVuKGluZm8tPmxvYWRzLCAwLCBTSV9MT0FEX1NISUZUIC0gRlNISUZUKTsKIAotCQlnZXRuc3RpbWVvZmRheSgmdHApOwotCQl0cC50dl9zZWMgKz0gd2FsbF90b19tb25vdG9uaWMudHZfc2VjOwotCQl0cC50dl9uc2VjICs9IHdhbGxfdG9fbW9ub3RvbmljLnR2X25zZWM7Ci0JCW1vbm90b25pY190b19ib290YmFzZWQoJnRwKTsKLQkJaWYgKHRwLnR2X25zZWMgLSBOU0VDX1BFUl9TRUMgPj0gMCkgewotCQkJdHAudHZfbnNlYyA9IHRwLnR2X25zZWMgLSBOU0VDX1BFUl9TRUM7Ci0JCQl0cC50dl9zZWMrKzsKLQkJfQotCQlpbmZvLT51cHRpbWUgPSB0cC50dl9zZWMgKyAodHAudHZfbnNlYyA/IDEgOiAwKTsKLQotCQlpbmZvLT5sb2Fkc1swXSA9IGF2ZW5ydW5bMF0gPDwgKFNJX0xPQURfU0hJRlQgLSBGU0hJRlQpOwotCQlpbmZvLT5sb2Fkc1sxXSA9IGF2ZW5ydW5bMV0gPDwgKFNJX0xPQURfU0hJRlQgLSBGU0hJRlQpOwotCQlpbmZvLT5sb2Fkc1syXSA9IGF2ZW5ydW5bMl0gPDwgKFNJX0xPQURfU0hJRlQgLSBGU0hJRlQpOwotCi0JCWluZm8tPnByb2NzID0gbnJfdGhyZWFkczsKLQl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZ4dGltZV9sb2NrLCBzZXEpKTsKKwlpbmZvLT5wcm9jcyA9IG5yX3RocmVhZHM7CiAKIAlzaV9tZW1pbmZvKGluZm8pOwogCXNpX3N3YXBpbmZvKGluZm8pOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL0tjb25maWcgYi9rZXJuZWwvdHJhY2UvS2NvbmZpZwppbmRleCA0MTdkMTk4Li40YTEzZTVhIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvS2NvbmZpZworKysgYi9rZXJuZWwvdHJhY2UvS2NvbmZpZwpAQCAtNDgsNiArNDgsMjEgQEAKICAgICAgICBkZXBlbmRzIG9uIEhBVkVfRlRSQUNFX05NSV9FTlRFUgogICAgICAgIGRlZmF1bHQgeQogCitjb25maWcgRVZFTlRfVFJBQ0lORworCXNlbGVjdCBDT05URVhUX1NXSVRDSF9UUkFDRVIKKwlib29sCisKK2NvbmZpZyBDT05URVhUX1NXSVRDSF9UUkFDRVIKKwlzZWxlY3QgTUFSS0VSUworCWJvb2wKKworIyBBbGwgdHJhY2VyIG9wdGlvbnMgc2hvdWxkIHNlbGVjdCBHRU5FUklDX1RSQUNFUi4gRm9yIHRob3NlIG9wdGlvbnMgdGhhdCBhcmUKKyMgZW5hYmxlZCBieSBhbGwgdHJhY2VycyAoY29udGV4dCBzd2l0Y2ggYW5kIGV2ZW50IHRyYWNlcikgdGhleSBzZWxlY3QgVFJBQ0lORy4KKyMgVGhpcyBhbGxvd3MgdGhvc2Ugb3B0aW9ucyB0byBhcHBlYXIgd2hlbiBubyBvdGhlciB0cmFjZXIgaXMgc2VsZWN0ZWQuIEJ1dCB0aGUKKyMgb3B0aW9ucyBkbyBub3QgYXBwZWFyIHdoZW4gc29tZXRoaW5nIGVsc2Ugc2VsZWN0cyBpdC4gV2UgbmVlZCB0aGUgdHdvIG9wdGlvbnMKKyMgR0VORVJJQ19UUkFDRVIgYW5kIFRSQUNJTkcgdG8gYXZvaWQgY2lyY3VsYXIgZGVwZW5kZW5jaWVzIHRvIGFjY29tcGxpc2ggdGhlCisjIGhpZGRpbmcgb2YgdGhlIGF1dG9tYXRpYyBvcHRpb25zIG9wdGlvbnMuCisKIGNvbmZpZyBUUkFDSU5HCiAJYm9vbAogCXNlbGVjdCBERUJVR19GUwpAQCAtNTYsNiArNzEsMTEgQEAKIAlzZWxlY3QgVFJBQ0VQT0lOVFMKIAlzZWxlY3QgTk9QX1RSQUNFUgogCXNlbGVjdCBCSU5BUllfUFJJTlRGCisJc2VsZWN0IEVWRU5UX1RSQUNJTkcKKworY29uZmlnIEdFTkVSSUNfVFJBQ0VSCisJYm9vbAorCXNlbGVjdCBUUkFDSU5HCiAKICMKICMgTWluaW11bSByZXF1aXJlbWVudHMgYW4gYXJjaGl0ZWN0dXJlIGhhcyB0byBtZWV0IGZvciB1cyB0bwpAQCAtNzMsMTQgKzkzLDIwIEBACiAKIGlmIFRSQUNJTkdfU1VQUE9SVAogCi1tZW51ICJUcmFjZXJzIgorbWVudWNvbmZpZyBGVFJBQ0UKKwlib29sICJUcmFjZXJzIgorCWRlZmF1bHQgeSBpZiBERUJVR19LRVJORUwKKwloZWxwCisJIEVuYWJsZSB0aGUga2VybmVsIHRyYWNpbmcgaW5mcmFzdHJ1Y3R1cmUuCisKK2lmIEZUUkFDRQogCiBjb25maWcgRlVOQ1RJT05fVFJBQ0VSCiAJYm9vbCAiS2VybmVsIEZ1bmN0aW9uIFRyYWNlciIKIAlkZXBlbmRzIG9uIEhBVkVfRlVOQ1RJT05fVFJBQ0VSCiAJc2VsZWN0IEZSQU1FX1BPSU5URVIKIAlzZWxlY3QgS0FMTFNZTVMKLQlzZWxlY3QgVFJBQ0lORworCXNlbGVjdCBHRU5FUklDX1RSQUNFUgogCXNlbGVjdCBDT05URVhUX1NXSVRDSF9UUkFDRVIKIAloZWxwCiAJICBFbmFibGUgdGhlIGtlcm5lbCB0byB0cmFjZSBldmVyeSBrZXJuZWwgZnVuY3Rpb24uIFRoaXMgaXMgZG9uZQpAQCAtMTA0LDEzICsxMzAsMTQgQEAKIAkgIHRoZSByZXR1cm4gdmFsdWUuIFRoaXMgaXMgZG9uZSBieSBzZXR0aW5nIHRoZSBjdXJyZW50IHJldHVybiAKIAkgIGFkZHJlc3Mgb24gdGhlIGN1cnJlbnQgdGFzayBzdHJ1Y3R1cmUgaW50byBhIHN0YWNrIG9mIGNhbGxzLgogCisKIGNvbmZpZyBJUlFTT0ZGX1RSQUNFUgogCWJvb2wgIkludGVycnVwdHMtb2ZmIExhdGVuY3kgVHJhY2VyIgogCWRlZmF1bHQgbgogCWRlcGVuZHMgb24gVFJBQ0VfSVJRRkxBR1NfU1VQUE9SVAogCWRlcGVuZHMgb24gR0VORVJJQ19USU1FCiAJc2VsZWN0IFRSQUNFX0lSUUZMQUdTCi0Jc2VsZWN0IFRSQUNJTkcKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKIAlzZWxlY3QgVFJBQ0VSX01BWF9UUkFDRQogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIG1lYXN1cmVzIHRoZSB0aW1lIHNwZW50IGluIGlycXMtb2ZmIGNyaXRpY2FsCkBAIC0xMzEsNyArMTU4LDcgQEAKIAlkZWZhdWx0IG4KIAlkZXBlbmRzIG9uIEdFTkVSSUNfVElNRQogCWRlcGVuZHMgb24gUFJFRU1QVAotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IFRSQUNFUl9NQVhfVFJBQ0UKIAloZWxwCiAJICBUaGlzIG9wdGlvbiBtZWFzdXJlcyB0aGUgdGltZSBzcGVudCBpbiBwcmVlbXB0aW9uIG9mZiBjcml0aWNhbApAQCAtMTUwLDcgKzE3Nyw3IEBACiBjb25maWcgU1lTUFJPRl9UUkFDRVIKIAlib29sICJTeXNwcm9mIFRyYWNlciIKIAlkZXBlbmRzIG9uIFg4NgotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IENPTlRFWFRfU1dJVENIX1RSQUNFUgogCWhlbHAKIAkgIFRoaXMgdHJhY2VyIHByb3ZpZGVzIHRoZSB0cmFjZSBuZWVkZWQgYnkgdGhlICdTeXNwcm9mJyB1c2Vyc3BhY2UKQEAgLTE1OCw0MCArMTg1LDMzIEBACiAKIGNvbmZpZyBTQ0hFRF9UUkFDRVIKIAlib29sICJTY2hlZHVsaW5nIExhdGVuY3kgVHJhY2VyIgotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IENPTlRFWFRfU1dJVENIX1RSQUNFUgogCXNlbGVjdCBUUkFDRVJfTUFYX1RSQUNFCiAJaGVscAogCSAgVGhpcyB0cmFjZXIgdHJhY2tzIHRoZSBsYXRlbmN5IG9mIHRoZSBoaWdoZXN0IHByaW9yaXR5IHRhc2sKIAkgIHRvIGJlIHNjaGVkdWxlZCBpbiwgc3RhcnRpbmcgZnJvbSB0aGUgcG9pbnQgaXQgaGFzIHdva2VuIHVwLgogCi1jb25maWcgQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSCi0JYm9vbCAiVHJhY2UgcHJvY2VzcyBjb250ZXh0IHN3aXRjaGVzIgotCXNlbGVjdCBUUkFDSU5HCi0Jc2VsZWN0IE1BUktFUlMKLQloZWxwCi0JICBUaGlzIHRyYWNlciBnZXRzIGNhbGxlZCBmcm9tIHRoZSBjb250ZXh0IHN3aXRjaCBhbmQgcmVjb3JkcwotCSAgYWxsIHN3aXRjaGluZyBvZiB0YXNrcy4KLQotY29uZmlnIEVWRU5UX1RSQUNFUgotCWJvb2wgIlRyYWNlIHZhcmlvdXMgZXZlbnRzIGluIHRoZSBrZXJuZWwiCitjb25maWcgRU5BQkxFX0RFRkFVTFRfVFJBQ0VSUworCWJvb2wgIlRyYWNlIHByb2Nlc3MgY29udGV4dCBzd2l0Y2hlcyBhbmQgZXZlbnRzIgorCWRlcGVuZHMgb24gIUdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IFRSQUNJTkcKIAloZWxwCiAJICBUaGlzIHRyYWNlciBob29rcyB0byB2YXJpb3VzIHRyYWNlIHBvaW50cyBpbiB0aGUga2VybmVsCiAJICBhbGxvd2luZyB0aGUgdXNlciB0byBwaWNrIGFuZCBjaG9vc2Ugd2hpY2ggdHJhY2UgcG9pbnQgdGhleQotCSAgd2FudCB0byB0cmFjZS4KKwkgIHdhbnQgdG8gdHJhY2UuIEl0IGFsc28gaW5jbHVkZXMgdGhlIHNjaGVkX3N3aXRjaCB0cmFjZXIgcGx1Z2luLgogCiBjb25maWcgRlRSQUNFX1NZU0NBTExTCiAJYm9vbCAiVHJhY2Ugc3lzY2FsbHMiCiAJZGVwZW5kcyBvbiBIQVZFX0ZUUkFDRV9TWVNDQUxMUwotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IEtBTExTWU1TCiAJaGVscAogCSAgQmFzaWMgdHJhY2VyIHRvIGNhdGNoIHRoZSBzeXNjYWxsIGVudHJ5IGFuZCBleGl0IGV2ZW50cy4KIAogY29uZmlnIEJPT1RfVFJBQ0VSCiAJYm9vbCAiVHJhY2UgYm9vdCBpbml0Y2FsbHMiCi0Jc2VsZWN0IFRSQUNJTkcKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKIAlzZWxlY3QgQ09OVEVYVF9TV0lUQ0hfVFJBQ0VSCiAJaGVscAogCSAgVGhpcyB0cmFjZXIgaGVscHMgZGV2ZWxvcGVycyB0byBvcHRpbWl6ZSBib290IHRpbWVzOiBpdCByZWNvcmRzCkBAIC0yMDcsOCArMjI3LDM2IEBACiAJICB0byBlbmFibGUgdGhpcyBvbiBib290dXAuCiAKIGNvbmZpZyBUUkFDRV9CUkFOQ0hfUFJPRklMSU5HCisJYm9vbAorCXNlbGVjdCBHRU5FUklDX1RSQUNFUgorCitjaG9pY2UKKwlwcm9tcHQgIkJyYW5jaCBQcm9maWxpbmciCisJZGVmYXVsdCBCUkFOQ0hfUFJPRklMRV9OT05FCisJaGVscAorCSBUaGUgYnJhbmNoIHByb2ZpbGluZyBpcyBhIHNvZnR3YXJlIHByb2ZpbGVyLiBJdCB3aWxsIGFkZCBob29rcworCSBpbnRvIHRoZSBDIGNvbmRpdGlvbmFscyB0byB0ZXN0IHdoaWNoIHBhdGggYSBicmFuY2ggdGFrZXMuCisKKwkgVGhlIGxpa2VseS91bmxpa2VseSBwcm9maWxlciBvbmx5IGxvb2tzIGF0IHRoZSBjb25kaXRpb25zIHRoYXQKKwkgYXJlIGFubm90YXRlZCB3aXRoIGEgbGlrZWx5IG9yIHVubGlrZWx5IG1hY3JvLgorCisJIFRoZSAiYWxsIGJyYW5jaCIgcHJvZmlsZXIgd2lsbCBwcm9maWxlIGV2ZXJ5IGlmIHN0YXRlbWVudCBpbiB0aGUKKwkga2VybmVsLiBUaGlzIHByb2ZpbGVyIHdpbGwgYWxzbyBlbmFibGUgdGhlIGxpa2VseS91bmxpa2VseQorCSBwcm9maWxlciBhcyB3ZWxsLgorCisJIEVpdGhlciBvZiB0aGUgYWJvdmUgcHJvZmlsZXJzIGFkZCBhIGJpdCBvZiBvdmVyaGVhZCB0byB0aGUgc3lzdGVtLgorCSBJZiB1bnN1cmUgY2hvb3NlICJObyBicmFuY2ggcHJvZmlsaW5nIi4KKworY29uZmlnIEJSQU5DSF9QUk9GSUxFX05PTkUKKwlib29sICJObyBicmFuY2ggcHJvZmlsaW5nIgorCWhlbHAKKwkgTm8gYnJhbmNoIHByb2ZpbGluZy4gQnJhbmNoIHByb2ZpbGluZyBhZGRzIGEgYml0IG9mIG92ZXJoZWFkLgorCSBPbmx5IGVuYWJsZSBpdCBpZiB5b3Ugd2FudCB0byBhbmFseXNlIHRoZSBicmFuY2hpbmcgYmVoYXZpb3IuCisJIE90aGVyd2lzZSBrZWVwIGl0IGRpc2FibGVkLgorCitjb25maWcgUFJPRklMRV9BTk5PVEFURURfQlJBTkNIRVMKIAlib29sICJUcmFjZSBsaWtlbHkvdW5saWtlbHkgcHJvZmlsZXIiCi0Jc2VsZWN0IFRSQUNJTkcKKwlzZWxlY3QgVFJBQ0VfQlJBTkNIX1BST0ZJTElORwogCWhlbHAKIAkgIFRoaXMgdHJhY2VyIHByb2ZpbGVzIGFsbCB0aGUgdGhlIGxpa2VseSBhbmQgdW5saWtlbHkgbWFjcm9zCiAJICBpbiB0aGUga2VybmVsLiBJdCB3aWxsIGRpc3BsYXkgdGhlIHJlc3VsdHMgaW46CkBAIC0yMTgsMTEgKzI2Niw5IEBACiAJICBOb3RlOiB0aGlzIHdpbGwgYWRkIGEgc2lnbmlmaWNhbnQgb3ZlcmhlYWQsIG9ubHkgdHVybiB0aGlzCiAJICBvbiBpZiB5b3UgbmVlZCB0byBwcm9maWxlIHRoZSBzeXN0ZW0ncyB1c2Ugb2YgdGhlc2UgbWFjcm9zLgogCi0JICBTYXkgTiBpZiB1bnN1cmUuCi0KIGNvbmZpZyBQUk9GSUxFX0FMTF9CUkFOQ0hFUwogCWJvb2wgIlByb2ZpbGUgYWxsIGlmIGNvbmRpdGlvbmFscyIKLQlkZXBlbmRzIG9uIFRSQUNFX0JSQU5DSF9QUk9GSUxJTkcKKwlzZWxlY3QgVFJBQ0VfQlJBTkNIX1BST0ZJTElORwogCWhlbHAKIAkgIFRoaXMgdHJhY2VyIHByb2ZpbGVzIGFsbCBicmFuY2ggY29uZGl0aW9ucy4gRXZlcnkgaWYgKCkKIAkgIHRha2VuIGluIHRoZSBrZXJuZWwgaXMgcmVjb3JkZWQgd2hldGhlciBpdCBoaXQgb3IgbWlzcy4KQEAgLTIzMCwxMSArMjc2LDEyIEBACiAKIAkgIC9kZWJ1Z2ZzL3RyYWNpbmcvcHJvZmlsZV9icmFuY2gKIAorCSAgVGhpcyBvcHRpb24gYWxzbyBlbmFibGVzIHRoZSBsaWtlbHkvdW5saWtlbHkgcHJvZmlsZXIuCisKIAkgIFRoaXMgY29uZmlndXJhdGlvbiwgd2hlbiBlbmFibGVkLCB3aWxsIGltcG9zZSBhIGdyZWF0IG92ZXJoZWFkCiAJICBvbiB0aGUgc3lzdGVtLiBUaGlzIHNob3VsZCBvbmx5IGJlIGVuYWJsZWQgd2hlbiB0aGUgc3lzdGVtCiAJICBpcyB0byBiZSBhbmFseXplZAotCi0JICBTYXkgTiBpZiB1bnN1cmUuCitlbmRjaG9pY2UKIAogY29uZmlnIFRSQUNJTkdfQlJBTkNIRVMKIAlib29sCkBAIC0yNjEsNyArMzA4LDcgQEAKIGNvbmZpZyBQT1dFUl9UUkFDRVIKIAlib29sICJUcmFjZSBwb3dlciBjb25zdW1wdGlvbiBiZWhhdmlvciIKIAlkZXBlbmRzIG9uIFg4NgotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJaGVscAogCSAgVGhpcyB0cmFjZXIgaGVscHMgZGV2ZWxvcGVycyB0byBhbmFseXplIGFuZCBvcHRpbWl6ZSB0aGUga2VybmVscwogCSAgcG93ZXIgbWFuYWdlbWVudCBkZWNpc2lvbnMsIHNwZWNpZmljYWxseSB0aGUgQy1zdGF0ZSBhbmQgUC1zdGF0ZQpAQCAtMjk1LDE0ICszNDIsMTQgQEAKIGNvbmZpZyBIV19CUkFOQ0hfVFJBQ0VSCiAJZGVwZW5kcyBvbiBIQVZFX0hXX0JSQU5DSF9UUkFDRVIKIAlib29sICJUcmFjZSBodyBicmFuY2hlcyIKLQlzZWxlY3QgVFJBQ0lORworCXNlbGVjdCBHRU5FUklDX1RSQUNFUgogCWhlbHAKIAkgIFRoaXMgdHJhY2VyIHJlY29yZHMgYWxsIGJyYW5jaGVzIG9uIHRoZSBzeXN0ZW0gaW4gYSBjaXJjdWxhcgogCSAgYnVmZmVyIGdpdmluZyBhY2Nlc3MgdG8gdGhlIGxhc3QgTiBicmFuY2hlcyBmb3IgZWFjaCBjcHUuCiAKIGNvbmZpZyBLTUVNVFJBQ0UKIAlib29sICJUcmFjZSBTTEFCIGFsbG9jYXRpb25zIgotCXNlbGVjdCBUUkFDSU5HCisJc2VsZWN0IEdFTkVSSUNfVFJBQ0VSCiAJaGVscAogCSAga21lbXRyYWNlIHByb3ZpZGVzIHRyYWNpbmcgZm9yIHNsYWIgYWxsb2NhdG9yIGZ1bmN0aW9ucywgc3VjaCBhcwogCSAga21hbGxvYywga2ZyZWUsIGttZW1fY2FjaGVfYWxsb2MsIGttZW1fY2FjaGVfZnJlZSBldGMuLiBDb2xsZWN0ZWQKQEAgLTMyMiw3ICszNjksNyBAQAogCiBjb25maWcgV09SS1FVRVVFX1RSQUNFUgogCWJvb2wgIlRyYWNlIHdvcmtxdWV1ZXMiCi0Jc2VsZWN0IFRSQUNJTkcKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKIAloZWxwCiAJICBUaGUgd29ya3F1ZXVlIHRyYWNlciBwcm92aWRlcyBzb21lIHN0YXRpc3RpY2FsIGluZm9ybWF0aW9ucwogICAgICAgICAgIGFib3V0IGVhY2ggY3B1IHdvcmtxdWV1ZSB0aHJlYWQgc3VjaCBhcyB0aGUgbnVtYmVyIG9mIHRoZQpAQCAtMzM4LDcgKzM4NSw3IEBACiAJc2VsZWN0IFJFTEFZCiAJc2VsZWN0IERFQlVHX0ZTCiAJc2VsZWN0IFRSQUNFUE9JTlRTCi0Jc2VsZWN0IFRSQUNJTkcKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKIAlzZWxlY3QgU1RBQ0tUUkFDRQogCWhlbHAKIAkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gYmUgYWJsZSB0byB0cmFjZSB0aGUgYmxvY2sgbGF5ZXIgYWN0aW9ucwpAQCAtMzc1LDYgKzQyMiwyMCBAQAogCSB3ZXJlIG1hZGUuIElmIHNvLCBpdCBydW5zIHN0b3BfbWFjaGluZSAoc3RvcHMgYWxsIENQVVMpCiAJIGFuZCBtb2RpZmllcyB0aGUgY29kZSB0byBqdW1wIG92ZXIgdGhlIGNhbGwgdG8gZnRyYWNlLgogCitjb25maWcgRlVOQ1RJT05fUFJPRklMRVIKKwlib29sICJLZXJuZWwgZnVuY3Rpb24gcHJvZmlsZXIiCisJZGVwZW5kcyBvbiBGVU5DVElPTl9UUkFDRVIKKwlkZWZhdWx0IG4KKwloZWxwCisJIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGtlcm5lbCBmdW5jdGlvbiBwcm9maWxlci4gQSBmaWxlIGlzIGNyZWF0ZWQKKwkgaW4gZGVidWdmcyBjYWxsZWQgZnVuY3Rpb25fcHJvZmlsZV9lbmFibGVkIHdoaWNoIGRlZmF1bHRzIHRvIHplcm8uCisJIFdoZW4gYSAxIGlzIGVjaG9lZCBpbnRvIHRoaXMgZmlsZSBwcm9maWxpbmcgYmVnaW5zLCBhbmQgd2hlbiBhCisJIHplcm8gaXMgZW50ZXJlZCwgcHJvZmlsaW5nIHN0b3BzLiBBIGZpbGUgaW4gdGhlIHRyYWNlX3N0YXRzCisJIGRpcmVjdG9yeSBjYWxsZWQgZnVuY3Rpb25zLCB0aGF0IHNob3cgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zIHRoYXQKKwkgaGF2ZSBiZWVuIGhpdCBhbmQgdGhlaXIgY291bnRlcnMuCisKKwkgSWYgaW4gZG91YnQsIHNheSBOCisKIGNvbmZpZyBGVFJBQ0VfTUNPVU5UX1JFQ09SRAogCWRlZl9ib29sIHkKIAlkZXBlbmRzIG9uIERZTkFNSUNfRlRSQUNFCkBAIC0zODUsNyArNDQ2LDcgQEAKIAogY29uZmlnIEZUUkFDRV9TVEFSVFVQX1RFU1QKIAlib29sICJQZXJmb3JtIGEgc3RhcnR1cCB0ZXN0IG9uIGZ0cmFjZSIKLQlkZXBlbmRzIG9uIFRSQUNJTkcKKwlkZXBlbmRzIG9uIEdFTkVSSUNfVFJBQ0VSCiAJc2VsZWN0IEZUUkFDRV9TRUxGVEVTVAogCWhlbHAKIAkgIFRoaXMgb3B0aW9uIHBlcmZvcm1zIGEgc2VyaWVzIG9mIHN0YXJ0dXAgdGVzdHMgb24gZnRyYWNlLiBPbiBib290dXAKQEAgLTM5Niw3ICs0NTcsNyBAQAogY29uZmlnIE1NSU9UUkFDRQogCWJvb2wgIk1lbW9yeSBtYXBwZWQgSU8gdHJhY2luZyIKIAlkZXBlbmRzIG9uIEhBVkVfTU1JT1RSQUNFX1NVUFBPUlQgJiYgUENJCi0Jc2VsZWN0IFRSQUNJTkcKKwlzZWxlY3QgR0VORVJJQ19UUkFDRVIKIAloZWxwCiAJICBNbWlvdHJhY2UgdHJhY2VzIE1lbW9yeSBNYXBwZWQgSS9PIGFjY2VzcyBhbmQgaXMgbWVhbnQgZm9yCiAJICBkZWJ1Z2dpbmcgYW5kIHJldmVyc2UgZW5naW5lZXJpbmcuIEl0IGlzIGNhbGxlZCBmcm9tIHRoZSBpb3JlbWFwCkBAIC00MTYsNyArNDc3LDIzIEBACiAKIAkgIFNheSBOLCB1bmxlc3MgeW91IGFic29sdXRlbHkga25vdyB3aGF0IHlvdSBhcmUgZG9pbmcuCiAKLWVuZG1lbnUKK2NvbmZpZyBSSU5HX0JVRkZFUl9CRU5DSE1BUksKKwl0cmlzdGF0ZSAiUmluZyBidWZmZXIgYmVuY2htYXJrIHN0cmVzcyB0ZXN0ZXIiCisJZGVwZW5kcyBvbiBSSU5HX0JVRkZFUgorCWhlbHAKKwkgIFRoaXMgb3B0aW9uIGNyZWF0ZXMgYSB0ZXN0IHRvIHN0cmVzcyB0aGUgcmluZyBidWZmZXIgYW5kIGJlbmNoIG1hcmsgaXQuCisJICBJdCBjcmVhdGVzIGl0cyBvd24gcmluZyBidWZmZXIgc3VjaCB0aGF0IGl0IHdpbGwgbm90IGludGVyZmVyIHdpdGgKKwkgIGFueSBvdGhlciB1c2VycyBvZiB0aGUgcmluZyBidWZmZXIgKHN1Y2ggYXMgZnRyYWNlKS4gSXQgdGhlbiBjcmVhdGVzCisJICBhIHByb2R1Y2VyIGFuZCBjb25zdW1lciB0aGF0IHdpbGwgcnVuIGZvciAxMCBzZWNvbmRzIGFuZCBzbGVlcCBmb3IKKwkgIDEwIHNlY29uZHMuIEVhY2ggaW50ZXJ2YWwgaXQgd2lsbCBwcmludCBvdXQgdGhlIG51bWJlciBvZiBldmVudHMKKwkgIGl0IHJlY29yZGVkIGFuZCBnaXZlIGEgcm91Z2ggZXN0aW1hdGUgb2YgaG93IGxvbmcgZWFjaCBpdGVyYXRpb24gdG9vay4KKworCSAgSXQgZG9lcyBub3QgZGlzYWJsZSBpbnRlcnJ1cHRzIG9yIHJhaXNlIGl0cyBwcmlvcml0eSwgc28gaXQgbWF5IGJlCisJICBhZmZlY3RlZCBieSBwcm9jZXNzZXMgdGhhdCBhcmUgcnVubmluZy4KKworCSAgSWYgdW5zdXJlLCBzYXkgTgorCitlbmRpZiAjIEZUUkFDRQogCiBlbmRpZiAjIFRSQUNJTkdfU1VQUE9SVAogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvTWFrZWZpbGUgYi9rZXJuZWwvdHJhY2UvTWFrZWZpbGUKaW5kZXggMjYzMGY1MS4uODQ0MTY0ZCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL01ha2VmaWxlCisrKyBiL2tlcm5lbC90cmFjZS9NYWtlZmlsZQpAQCAtMTUsMTEgKzE1LDE3IEBACiBLQlVJTERfQ0ZMQUdTICs9IC1ERElTQUJMRV9CUkFOQ0hfUFJPRklMSU5HCiBlbmRpZgogCisjCisjIE1ha2UgdGhlIHRyYWNlIGNsb2NrcyBhdmFpbGFibGUgZ2VuZXJhbGx5OiBpdCdzIGluZnJhc3RydWN0dXJlCisjIHJlbGllZCBvbiBieSBwdHJhY2UgZm9yIGV4YW1wbGU6CisjCitvYmoteSArPSB0cmFjZV9jbG9jay5vCisKIG9iai0kKENPTkZJR19GVU5DVElPTl9UUkFDRVIpICs9IGxpYmZ0cmFjZS5vCiBvYmotJChDT05GSUdfUklOR19CVUZGRVIpICs9IHJpbmdfYnVmZmVyLm8KK29iai0kKENPTkZJR19SSU5HX0JVRkZFUl9CRU5DSE1BUkspICs9IHJpbmdfYnVmZmVyX2JlbmNobWFyay5vCiAKIG9iai0kKENPTkZJR19UUkFDSU5HKSArPSB0cmFjZS5vCi1vYmotJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2VfY2xvY2subwogb2JqLSQoQ09ORklHX1RSQUNJTkcpICs9IHRyYWNlX291dHB1dC5vCiBvYmotJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2Vfc3RhdC5vCiBvYmotJChDT05GSUdfVFJBQ0lORykgKz0gdHJhY2VfcHJpbnRrLm8KQEAgLTM5LDEyICs0NSwxNCBAQAogb2JqLSQoQ09ORklHX1BPV0VSX1RSQUNFUikgKz0gdHJhY2VfcG93ZXIubwogb2JqLSQoQ09ORklHX0tNRU1UUkFDRSkgKz0ga21lbXRyYWNlLm8KIG9iai0kKENPTkZJR19XT1JLUVVFVUVfVFJBQ0VSKSArPSB0cmFjZV93b3JrcXVldWUubwotb2JqLSQoQ09ORklHX0JMS19ERVZfSU9fVFJBQ0UpCSs9IGJsa3RyYWNlLm8KLW9iai0kKENPTkZJR19FVkVOVF9UUkFDRVIpICs9IHRyYWNlX2V2ZW50cy5vCi1vYmotJChDT05GSUdfRVZFTlRfVFJBQ0VSKSArPSBldmVudHMubwotb2JqLSQoQ09ORklHX0VWRU5UX1RSQUNFUikgKz0gdHJhY2VfZXhwb3J0Lm8KK29iai0kKENPTkZJR19CTEtfREVWX0lPX1RSQUNFKSArPSBibGt0cmFjZS5vCitpZmVxICgkKENPTkZJR19CTE9DSykseSkKK29iai0kKENPTkZJR19FVkVOVF9UUkFDSU5HKSArPSBibGt0cmFjZS5vCitlbmRpZgorb2JqLSQoQ09ORklHX0VWRU5UX1RSQUNJTkcpICs9IHRyYWNlX2V2ZW50cy5vCitvYmotJChDT05GSUdfRVZFTlRfVFJBQ0lORykgKz0gdHJhY2VfZXhwb3J0Lm8KIG9iai0kKENPTkZJR19GVFJBQ0VfU1lTQ0FMTFMpICs9IHRyYWNlX3N5c2NhbGxzLm8KIG9iai0kKENPTkZJR19FVkVOVF9QUk9GSUxFKSArPSB0cmFjZV9ldmVudF9wcm9maWxlLm8KLW9iai0kKENPTkZJR19FVkVOVF9UUkFDRVIpICs9IHRyYWNlX2V2ZW50c19maWx0ZXIubworb2JqLSQoQ09ORklHX0VWRU5UX1RSQUNJTkcpICs9IHRyYWNlX2V2ZW50c19maWx0ZXIubwogCiBsaWJmdHJhY2UteSA6PSBmdHJhY2UubwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2Jsa3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwppbmRleCA5MjFlZjVkLi43YmQ2YTk4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvYmxrdHJhY2UuYwpAQCAtMjMsMTAgKzIzLDE0IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvdGltZS5oPgotI2luY2x1ZGUgPHRyYWNlL2Jsb2NrLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgorCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2Jsb2NrLmg+CisKICNpbmNsdWRlICJ0cmFjZV9vdXRwdXQuaCIKIAorI2lmZGVmIENPTkZJR19CTEtfREVWX0lPX1RSQUNFCisKIHN0YXRpYyB1bnNpZ25lZCBpbnQgYmxrdHJhY2Vfc2VxIF9fcmVhZF9tb3N0bHkgPSAxOwogCiBzdGF0aWMgc3RydWN0IHRyYWNlX2FycmF5ICpibGtfdHI7CkBAIC0xNDcsNyArMTUxLDcgQEAKIHsKIAlpZiAoKChidC0+YWN0X21hc2sgPDwgQkxLX1RDX1NISUZUKSAmIHdoYXQpID09IDApCiAJCXJldHVybiAxOwotCWlmIChzZWN0b3IgPCBidC0+c3RhcnRfbGJhIHx8IHNlY3RvciA+IGJ0LT5lbmRfbGJhKQorCWlmIChzZWN0b3IgJiYgKHNlY3RvciA8IGJ0LT5zdGFydF9sYmEgfHwgc2VjdG9yID4gYnQtPmVuZF9sYmEpKQogCQlyZXR1cm4gMTsKIAlpZiAoYnQtPnBpZCAmJiBwaWQgIT0gYnQtPnBpZCkKIAkJcmV0dXJuIDE7CkBAIC0xOTIsNyArMTk2LDcgQEAKIAl3aGF0IHw9IE1BU0tfVENfQklUKHJ3LCBESVNDQVJEKTsKIAogCXBpZCA9IHRzay0+cGlkOwotCWlmICh1bmxpa2VseShhY3RfbG9nX2NoZWNrKGJ0LCB3aGF0LCBzZWN0b3IsIHBpZCkpKQorCWlmIChhY3RfbG9nX2NoZWNrKGJ0LCB3aGF0LCBzZWN0b3IsIHBpZCkpCiAJCXJldHVybjsKIAljcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOwogCkBAIC0yNjIsNiArMjY2LDcgQEAKIHsKIAlkZWJ1Z2ZzX3JlbW92ZShidC0+bXNnX2ZpbGUpOwogCWRlYnVnZnNfcmVtb3ZlKGJ0LT5kcm9wcGVkX2ZpbGUpOworCWRlYnVnZnNfcmVtb3ZlKGJ0LT5kaXIpOwogCXJlbGF5X2Nsb3NlKGJ0LT5yY2hhbik7CiAJZnJlZV9wZXJjcHUoYnQtPnNlcXVlbmNlKTsKIAlmcmVlX3BlcmNwdShidC0+bXNnX2RhdGEpOwpAQCAtNDAzLDExICs0MDgsMjkgQEAKIAkucmVtb3ZlX2J1Zl9maWxlCT0gYmxrX3JlbW92ZV9idWZfZmlsZV9jYWxsYmFjaywKIH07CiAKK3N0YXRpYyB2b2lkIGJsa190cmFjZV9zZXR1cF9sYmEoc3RydWN0IGJsa190cmFjZSAqYnQsCisJCQkJc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKK3sKKwlzdHJ1Y3QgaGRfc3RydWN0ICpwYXJ0ID0gTlVMTDsKKworCWlmIChiZGV2KQorCQlwYXJ0ID0gYmRldi0+YmRfcGFydDsKKworCWlmIChwYXJ0KSB7CisJCWJ0LT5zdGFydF9sYmEgPSBwYXJ0LT5zdGFydF9zZWN0OworCQlidC0+ZW5kX2xiYSA9IHBhcnQtPnN0YXJ0X3NlY3QgKyBwYXJ0LT5ucl9zZWN0czsKKwl9IGVsc2UgeworCQlidC0+c3RhcnRfbGJhID0gMDsKKwkJYnQtPmVuZF9sYmEgPSAtMVVMTDsKKwl9Cit9CisKIC8qCiAgKiBTZXR1cCBldmVyeXRoaW5nIHJlcXVpcmVkIHRvIHN0YXJ0IHRyYWNpbmcKICAqLwogaW50IGRvX2Jsa190cmFjZV9zZXR1cChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgY2hhciAqbmFtZSwgZGV2X3QgZGV2LAotCQkJc3RydWN0IGJsa191c2VyX3RyYWNlX3NldHVwICpidXRzKQorCQkgICAgICAgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwKKwkJICAgICAgIHN0cnVjdCBibGtfdXNlcl90cmFjZV9zZXR1cCAqYnV0cykKIHsKIAlzdHJ1Y3QgYmxrX3RyYWNlICpvbGRfYnQsICpidCA9IE5VTEw7CiAJc3RydWN0IGRlbnRyeSAqZGlyID0gTlVMTDsKQEAgLTQ4MCwxMCArNTAzLDEzIEBACiAJaWYgKCFidC0+YWN0X21hc2spCiAJCWJ0LT5hY3RfbWFzayA9ICh1MTYpIC0xOwogCi0JYnQtPnN0YXJ0X2xiYSA9IGJ1dHMtPnN0YXJ0X2xiYTsKLQlidC0+ZW5kX2xiYSA9IGJ1dHMtPmVuZF9sYmE7Ci0JaWYgKCFidC0+ZW5kX2xiYSkKLQkJYnQtPmVuZF9sYmEgPSAtMVVMTDsKKwlibGtfdHJhY2Vfc2V0dXBfbGJhKGJ0LCBiZGV2KTsKKworCS8qIG92ZXJ3cml0ZSB3aXRoIHVzZXIgc2V0dGluZ3MgKi8KKwlpZiAoYnV0cy0+c3RhcnRfbGJhKQorCQlidC0+c3RhcnRfbGJhID0gYnV0cy0+c3RhcnRfbGJhOworCWlmIChidXRzLT5lbmRfbGJhKQorCQlidC0+ZW5kX2xiYSA9IGJ1dHMtPmVuZF9sYmE7CiAKIAlidC0+cGlkID0gYnV0cy0+cGlkOwogCWJ0LT50cmFjZV9zdGF0ZSA9IEJsa3RyYWNlX3NldHVwOwpAQCAtNTA1LDYgKzUzMSw3IEBACiB9CiAKIGludCBibGtfdHJhY2Vfc2V0dXAoc3RydWN0IHJlcXVlc3RfcXVldWUgKnEsIGNoYXIgKm5hbWUsIGRldl90IGRldiwKKwkJICAgIHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsCiAJCSAgICBjaGFyIF9fdXNlciAqYXJnKQogewogCXN0cnVjdCBibGtfdXNlcl90cmFjZV9zZXR1cCBidXRzOwpAQCAtNTE0LDcgKzU0MSw3IEBACiAJaWYgKHJldCkKIAkJcmV0dXJuIC1FRkFVTFQ7CiAKLQlyZXQgPSBkb19ibGtfdHJhY2Vfc2V0dXAocSwgbmFtZSwgZGV2LCAmYnV0cyk7CisJcmV0ID0gZG9fYmxrX3RyYWNlX3NldHVwKHEsIG5hbWUsIGRldiwgYmRldiwgJmJ1dHMpOwogCWlmIChyZXQpCiAJCXJldHVybiByZXQ7CiAKQEAgLTU4Miw3ICs2MDksNyBAQAogCXN3aXRjaCAoY21kKSB7CiAJY2FzZSBCTEtUUkFDRVNFVFVQOgogCQliZGV2bmFtZShiZGV2LCBiKTsKLQkJcmV0ID0gYmxrX3RyYWNlX3NldHVwKHEsIGIsIGJkZXYtPmJkX2RldiwgYXJnKTsKKwkJcmV0ID0gYmxrX3RyYWNlX3NldHVwKHEsIGIsIGJkZXYtPmJkX2RldiwgYmRldiwgYXJnKTsKIAkJYnJlYWs7CiAJY2FzZSBCTEtUUkFDRVNUQVJUOgogCQlzdGFydCA9IDE7CkBAIC04MDksNyArODM2LDYgQEAKICAqIEBiaW86CXRoZSBzb3VyY2UgYmlvCiAgKiBAZGV2Ogl0YXJnZXQgZGV2aWNlCiAgKiBAZnJvbToJc291cmNlIHNlY3RvcgotICogQHRvOgkJdGFyZ2V0IHNlY3RvcgogICoKICAqIERlc2NyaXB0aW9uOgogICogICAgIERldmljZSBtYXBwZXIgb3IgcmFpZCB0YXJnZXQgc29tZXRpbWVzIG5lZWQgdG8gc3BsaXQgYSBiaW8gYmVjYXVzZQpAQCAtODE3LDcgKzg0Myw3IEBACiAgKgogICoqLwogc3RhdGljIHZvaWQgYmxrX2FkZF90cmFjZV9yZW1hcChzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwgc3RydWN0IGJpbyAqYmlvLAotCQkJCSAgICAgICBkZXZfdCBkZXYsIHNlY3Rvcl90IGZyb20sIHNlY3Rvcl90IHRvKQorCQkJCSAgICAgICBkZXZfdCBkZXYsIHNlY3Rvcl90IGZyb20pCiB7CiAJc3RydWN0IGJsa190cmFjZSAqYnQgPSBxLT5ibGtfdHJhY2U7CiAJc3RydWN0IGJsa19pb190cmFjZV9yZW1hcCByOwpAQCAtODI1LDEyICs4NTEsMTMgQEAKIAlpZiAobGlrZWx5KCFidCkpCiAJCXJldHVybjsKIAotCXIuZGV2aWNlID0gY3B1X3RvX2JlMzIoZGV2KTsKLQlyLmRldmljZV9mcm9tID0gY3B1X3RvX2JlMzIoYmlvLT5iaV9iZGV2LT5iZF9kZXYpOwotCXIuc2VjdG9yID0gY3B1X3RvX2JlNjQodG8pOworCXIuZGV2aWNlX2Zyb20gPSBjcHVfdG9fYmUzMihkZXYpOworCXIuZGV2aWNlX3RvICAgPSBjcHVfdG9fYmUzMihiaW8tPmJpX2JkZXYtPmJkX2Rldik7CisJci5zZWN0b3JfZnJvbSA9IGNwdV90b19iZTY0KGZyb20pOwogCi0JX19ibGtfYWRkX3RyYWNlKGJ0LCBmcm9tLCBiaW8tPmJpX3NpemUsIGJpby0+YmlfcncsIEJMS19UQV9SRU1BUCwKLQkJCSFiaW9fZmxhZ2dlZChiaW8sIEJJT19VUFRPREFURSksIHNpemVvZihyKSwgJnIpOworCV9fYmxrX2FkZF90cmFjZShidCwgYmlvLT5iaV9zZWN0b3IsIGJpby0+Ymlfc2l6ZSwgYmlvLT5iaV9ydywKKwkJCUJMS19UQV9SRU1BUCwgIWJpb19mbGFnZ2VkKGJpbywgQklPX1VQVE9EQVRFKSwKKwkJCXNpemVvZihyKSwgJnIpOwogfQogCiAvKioKQEAgLTk3MSw2ICs5OTgsMTYgQEAKIAlyZXR1cm4gdGVfYmxrX2lvX3RyYWNlKGVudCkgKyAxOwogfQogCitzdGF0aWMgaW5saW5lIHUzMiB0X2FjdGlvbihjb25zdCBzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudCkKK3sKKwlyZXR1cm4gdGVfYmxrX2lvX3RyYWNlKGVudCktPmFjdGlvbjsKK30KKworc3RhdGljIGlubGluZSB1MzIgdF9ieXRlcyhjb25zdCBzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudCkKK3sKKwlyZXR1cm4gdGVfYmxrX2lvX3RyYWNlKGVudCktPmJ5dGVzOworfQorCiBzdGF0aWMgaW5saW5lIHUzMiB0X3NlYyhjb25zdCBzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudCkKIHsKIAlyZXR1cm4gdGVfYmxrX2lvX3RyYWNlKGVudCktPmJ5dGVzID4+IDk7CkBAIC05OTYsMTEgKzEwMzMsMTEgQEAKIAkJCSAgc3RydWN0IGJsa19pb190cmFjZV9yZW1hcCAqcikKIHsKIAljb25zdCBzdHJ1Y3QgYmxrX2lvX3RyYWNlX3JlbWFwICpfX3IgPSBwZHVfc3RhcnQoZW50KTsKLQlfX3U2NCBzZWN0b3IgPSBfX3ItPnNlY3RvcjsKKwlfX3U2NCBzZWN0b3JfZnJvbSA9IF9fci0+c2VjdG9yX2Zyb207CiAKLQlyLT5kZXZpY2UgPSBiZTMyX3RvX2NwdShfX3ItPmRldmljZSk7CiAJci0+ZGV2aWNlX2Zyb20gPSBiZTMyX3RvX2NwdShfX3ItPmRldmljZV9mcm9tKTsKLQlyLT5zZWN0b3IgPSBiZTY0X3RvX2NwdShzZWN0b3IpOworCXItPmRldmljZV90byAgID0gYmUzMl90b19jcHUoX19yLT5kZXZpY2VfdG8pOworCXItPnNlY3Rvcl9mcm9tID0gYmU2NF90b19jcHUoc2VjdG9yX2Zyb20pOwogfQogCiB0eXBlZGVmIGludCAoYmxrX2xvZ19hY3Rpb25fdCkgKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwgY29uc3QgY2hhciAqYWN0KTsKQEAgLTEwMzEsMzYgKzEwNjgsOTggQEAKIAkJCQlNQUpPUih0LT5kZXZpY2UpLCBNSU5PUih0LT5kZXZpY2UpLCBhY3QsIHJ3YnMpOwogfQogCitzdGF0aWMgaW50IGJsa19sb2dfZHVtcF9wZHUoc3RydWN0IHRyYWNlX3NlcSAqcywgY29uc3Qgc3RydWN0IHRyYWNlX2VudHJ5ICplbnQpCit7CisJY29uc3QgdW5zaWduZWQgY2hhciAqcGR1X2J1ZjsKKwlpbnQgcGR1X2xlbjsKKwlpbnQgaSwgZW5kLCByZXQ7CisKKwlwZHVfYnVmID0gcGR1X3N0YXJ0KGVudCk7CisJcGR1X2xlbiA9IHRlX2Jsa19pb190cmFjZShlbnQpLT5wZHVfbGVuOworCisJaWYgKCFwZHVfbGVuKQorCQlyZXR1cm4gMTsKKworCS8qIGZpbmQgdGhlIGxhc3QgemVybyB0aGF0IG5lZWRzIHRvIGJlIHByaW50ZWQgKi8KKwlmb3IgKGVuZCA9IHBkdV9sZW4gLSAxOyBlbmQgPj0gMDsgZW5kLS0pCisJCWlmIChwZHVfYnVmW2VuZF0pCisJCQlicmVhazsKKwllbmQrKzsKKworCWlmICghdHJhY2Vfc2VxX3B1dGMocywgJygnKSkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgcGR1X2xlbjsgaSsrKSB7CisKKwkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJXMlMDJ4IiwKKwkJCQkgICAgICAgaSA9PSAwID8gIiIgOiAiICIsIHBkdV9idWZbaV0pOworCQlpZiAoIXJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJLyoKKwkJICogc3RvcCB3aGVuIHRoZSByZXN0IGlzIGp1c3QgemVyb2VzIGFuZCBpbmRpY2F0ZSBzbworCQkgKiB3aXRoIGEgIi4uIiBhcHBlbmRlZAorCQkgKi8KKwkJaWYgKGkgPT0gZW5kICYmIGVuZCAhPSBwZHVfbGVuIC0gMSkKKwkJCXJldHVybiB0cmFjZV9zZXFfcHV0cyhzLCAiIC4uKSAiKTsKKwl9CisKKwlyZXR1cm4gdHJhY2Vfc2VxX3B1dHMocywgIikgIik7Cit9CisKIHN0YXRpYyBpbnQgYmxrX2xvZ19nZW5lcmljKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IHN0cnVjdCB0cmFjZV9lbnRyeSAqZW50KQogewogCWNoYXIgY21kW1RBU0tfQ09NTV9MRU5dOwogCiAJdHJhY2VfZmluZF9jbWRsaW5lKGVudC0+cGlkLCBjbWQpOwogCi0JaWYgKHRfc2VjKGVudCkpCi0JCXJldHVybiB0cmFjZV9zZXFfcHJpbnRmKHMsICIlbGx1ICsgJXUgWyVzXVxuIiwKLQkJCQkJdF9zZWN0b3IoZW50KSwgdF9zZWMoZW50KSwgY21kKTsKLQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiWyVzXVxuIiwgY21kKTsKKwlpZiAodF9hY3Rpb24oZW50KSAmIEJMS19UQ19BQ1QoQkxLX1RDX1BDKSkgeworCQlpbnQgcmV0OworCisJCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIiV1ICIsIHRfYnl0ZXMoZW50KSk7CisJCWlmICghcmV0KQorCQkJcmV0dXJuIDA7CisJCXJldCA9IGJsa19sb2dfZHVtcF9wZHUocywgZW50KTsKKwkJaWYgKCFyZXQpCisJCQlyZXR1cm4gMDsKKwkJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIlslc11cbiIsIGNtZCk7CisJfSBlbHNlIHsKKwkJaWYgKHRfc2VjKGVudCkpCisJCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJWxsdSArICV1IFslc11cbiIsCisJCQkJCQl0X3NlY3RvcihlbnQpLCB0X3NlYyhlbnQpLCBjbWQpOworCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiWyVzXVxuIiwgY21kKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYmxrX2xvZ193aXRoX2Vycm9yKHN0cnVjdCB0cmFjZV9zZXEgKnMsCiAJCQkgICAgICBjb25zdCBzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudCkKIHsKLQlpZiAodF9zZWMoZW50KSkKLQkJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiVsbHUgKyAldSBbJWRdXG4iLCB0X3NlY3RvcihlbnQpLAotCQkJCQl0X3NlYyhlbnQpLCB0X2Vycm9yKGVudCkpOwotCXJldHVybiB0cmFjZV9zZXFfcHJpbnRmKHMsICIlbGx1IFslZF1cbiIsIHRfc2VjdG9yKGVudCksIHRfZXJyb3IoZW50KSk7CisJaWYgKHRfYWN0aW9uKGVudCkgJiBCTEtfVENfQUNUKEJMS19UQ19QQykpIHsKKwkJaW50IHJldDsKKworCQlyZXQgPSBibGtfbG9nX2R1bXBfcGR1KHMsIGVudCk7CisJCWlmIChyZXQpCisJCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiWyVkXVxuIiwgdF9lcnJvcihlbnQpKTsKKwkJcmV0dXJuIDA7CisJfSBlbHNlIHsKKwkJaWYgKHRfc2VjKGVudCkpCisJCQlyZXR1cm4gdHJhY2Vfc2VxX3ByaW50ZihzLCAiJWxsdSArICV1IFslZF1cbiIsCisJCQkJCQl0X3NlY3RvcihlbnQpLAorCQkJCQkJdF9zZWMoZW50KSwgdF9lcnJvcihlbnQpKTsKKwkJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiVsbHUgWyVkXVxuIiwKKwkJCQkJdF9zZWN0b3IoZW50KSwgdF9lcnJvcihlbnQpKTsKKwl9CiB9CiAKIHN0YXRpYyBpbnQgYmxrX2xvZ19yZW1hcChzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudCkKIHsKLQlzdHJ1Y3QgYmxrX2lvX3RyYWNlX3JlbWFwIHIgPSB7IC5kZXZpY2UgPSAwLCB9OworCXN0cnVjdCBibGtfaW9fdHJhY2VfcmVtYXAgciA9IHsgLmRldmljZV9mcm9tID0gMCwgfTsKIAogCWdldF9wZHVfcmVtYXAoZW50LCAmcik7CiAJcmV0dXJuIHRyYWNlX3NlcV9wcmludGYocywgIiVsbHUgKyAldSA8LSAoJWQsJWQpICVsbHVcbiIsCi0JCQkgICAgICAgdF9zZWN0b3IoZW50KSwKLQkJCSAgICAgICB0X3NlYyhlbnQpLCBNQUpPUihyLmRldmljZSksIE1JTk9SKHIuZGV2aWNlKSwKLQkJCSAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXIuc2VjdG9yKTsKKwkJCQl0X3NlY3RvcihlbnQpLCB0X3NlYyhlbnQpLAorCQkJCU1BSk9SKHIuZGV2aWNlX2Zyb20pLCBNSU5PUihyLmRldmljZV9mcm9tKSwKKwkJCQkodW5zaWduZWQgbG9uZyBsb25nKXIuc2VjdG9yX2Zyb20pOwogfQogCiBzdGF0aWMgaW50IGJsa19sb2dfcGx1ZyhzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBzdHJ1Y3QgdHJhY2VfZW50cnkgKmVudCkKQEAgLTExMTcsNyArMTIxNiw2IEBACiBzdGF0aWMgdm9pZCBibGtfdHJhY2VyX3N0YXJ0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCiB7CiAJYmxrX3RyYWNlcl9lbmFibGVkID0gdHJ1ZTsKLQl0cmFjZV9mbGFncyAmPSB+VFJBQ0VfSVRFUl9DT05URVhUX0lORk87CiB9CiAKIHN0YXRpYyBpbnQgYmxrX3RyYWNlcl9pbml0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCkBAIC0xMTMwLDcgKzEyMjgsNiBAQAogc3RhdGljIHZvaWQgYmxrX3RyYWNlcl9zdG9wKHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCiB7CiAJYmxrX3RyYWNlcl9lbmFibGVkID0gZmFsc2U7Ci0JdHJhY2VfZmxhZ3MgfD0gVFJBQ0VfSVRFUl9DT05URVhUX0lORk87CiB9CiAKIHN0YXRpYyB2b2lkIGJsa190cmFjZXJfcmVzZXQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKQEAgLTExODIsNyArMTI3OSw3IEBACiAJfQogCiAJaWYgKHVubGlrZWx5KHdoYXQgPT0gMCB8fCB3aGF0ID49IEFSUkFZX1NJWkUod2hhdDJhY3QpKSkKLQkJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiQmFkIHBjIGFjdGlvbiAleFxuIiwgd2hhdCk7CisJCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlVua25vd24gYWN0aW9uICV4XG4iLCB3aGF0KTsKIAllbHNlIHsKIAkJcmV0ID0gbG9nX2FjdGlvbihpdGVyLCB3aGF0MmFjdFt3aGF0XS5hY3RbbG9uZ19hY3RdKTsKIAkJaWYgKHJldCkKQEAgLTExOTUsOSArMTI5Miw2IEBACiBzdGF0aWMgZW51bSBwcmludF9saW5lX3QgYmxrX3RyYWNlX2V2ZW50X3ByaW50KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlciwKIAkJCQkJICAgICAgIGludCBmbGFncykKIHsKLQlpZiAoIXRyYWNlX3ByaW50X2NvbnRleHQoaXRlcikpCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLQogCXJldHVybiBwcmludF9vbmVfbGluZShpdGVyLCBmYWxzZSk7CiB9CiAKQEAgLTEyMzIsNiArMTMyNiwxOCBAQAogCXJldHVybiBwcmludF9vbmVfbGluZShpdGVyLCB0cnVlKTsKIH0KIAorc3RhdGljIGludCBibGtfdHJhY2VyX3NldF9mbGFnKHUzMiBvbGRfZmxhZ3MsIHUzMiBiaXQsIGludCBzZXQpCit7CisJLyogZG9uJ3Qgb3V0cHV0IGNvbnRleHQtaW5mbyBmb3IgYmxrX2NsYXNzaWMgb3V0cHV0ICovCisJaWYgKGJpdCA9PSBUUkFDRV9CTEtfT1BUX0NMQVNTSUMpIHsKKwkJaWYgKHNldCkKKwkJCXRyYWNlX2ZsYWdzICY9IH5UUkFDRV9JVEVSX0NPTlRFWFRfSU5GTzsKKwkJZWxzZQorCQkJdHJhY2VfZmxhZ3MgfD0gVFJBQ0VfSVRFUl9DT05URVhUX0lORk87CisJfQorCXJldHVybiAwOworfQorCiBzdGF0aWMgc3RydWN0IHRyYWNlciBibGtfdHJhY2VyIF9fcmVhZF9tb3N0bHkgPSB7CiAJLm5hbWUJCT0gImJsayIsCiAJLmluaXQJCT0gYmxrX3RyYWNlcl9pbml0LApAQCAtMTI0MSw2ICsxMzQ3LDcgQEAKIAkucHJpbnRfaGVhZGVyCT0gYmxrX3RyYWNlcl9wcmludF9oZWFkZXIsCiAJLnByaW50X2xpbmUJPSBibGtfdHJhY2VyX3ByaW50X2xpbmUsCiAJLmZsYWdzCQk9ICZibGtfdHJhY2VyX2ZsYWdzLAorCS5zZXRfZmxhZwk9IGJsa190cmFjZXJfc2V0X2ZsYWcsCiB9OwogCiBzdGF0aWMgc3RydWN0IHRyYWNlX2V2ZW50IHRyYWNlX2Jsa19ldmVudCA9IHsKQEAgLTEyODUsNyArMTM5Miw4IEBACiAvKgogICogU2V0dXAgZXZlcnl0aGluZyByZXF1aXJlZCB0byBzdGFydCB0cmFjaW5nCiAgKi8KLXN0YXRpYyBpbnQgYmxrX3RyYWNlX3NldHVwX3F1ZXVlKHN0cnVjdCByZXF1ZXN0X3F1ZXVlICpxLCBkZXZfdCBkZXYpCitzdGF0aWMgaW50IGJsa190cmFjZV9zZXR1cF9xdWV1ZShzdHJ1Y3QgcmVxdWVzdF9xdWV1ZSAqcSwKKwkJCQkgc3RydWN0IGJsb2NrX2RldmljZSAqYmRldikKIHsKIAlzdHJ1Y3QgYmxrX3RyYWNlICpvbGRfYnQsICpidCA9IE5VTEw7CiAJaW50IHJldCA9IC1FTk9NRU07CkBAIC0xMjk4LDkgKzE0MDYsMTAgQEAKIAlpZiAoIWJ0LT5tc2dfZGF0YSkKIAkJZ290byBmcmVlX2J0OwogCi0JYnQtPmRldiA9IGRldjsKKwlidC0+ZGV2ID0gYmRldi0+YmRfZGV2OwogCWJ0LT5hY3RfbWFzayA9ICh1MTYpLTE7Ci0JYnQtPmVuZF9sYmEgPSAtMVVMTDsKKworCWJsa190cmFjZV9zZXR1cF9sYmEoYnQsIGJkZXYpOwogCiAJb2xkX2J0ID0geGNoZygmcS0+YmxrX3RyYWNlLCBidCk7CiAJaWYgKG9sZF9idCAhPSBOVUxMKSB7CkBAIC0xNTE3LDcgKzE2MjYsNyBAQAogCiAJaWYgKGF0dHIgPT0gJmRldl9hdHRyX2VuYWJsZSkgewogCQlpZiAodmFsdWUpCi0JCQlyZXQgPSBibGtfdHJhY2Vfc2V0dXBfcXVldWUocSwgYmRldi0+YmRfZGV2KTsKKwkJCXJldCA9IGJsa190cmFjZV9zZXR1cF9xdWV1ZShxLCBiZGV2KTsKIAkJZWxzZQogCQkJcmV0ID0gYmxrX3RyYWNlX3JlbW92ZV9xdWV1ZShxKTsKIAkJZ290byBvdXRfdW5sb2NrX2JkZXY7CkBAIC0xNTI1LDcgKzE2MzQsNyBAQAogCiAJcmV0ID0gMDsKIAlpZiAocS0+YmxrX3RyYWNlID09IE5VTEwpCi0JCXJldCA9IGJsa190cmFjZV9zZXR1cF9xdWV1ZShxLCBiZGV2LT5iZF9kZXYpOworCQlyZXQgPSBibGtfdHJhY2Vfc2V0dXBfcXVldWUocSwgYmRldik7CiAKIAlpZiAocmV0ID09IDApIHsKIAkJaWYgKGF0dHIgPT0gJmRldl9hdHRyX2FjdF9tYXNrKQpAQCAtMTU0OCwzICsxNjU3LDgwIEBACiAJcmV0dXJuIHJldCA/IHJldCA6IGNvdW50OwogfQogCitpbnQgYmxrX3RyYWNlX2luaXRfc3lzZnMoc3RydWN0IGRldmljZSAqZGV2KQoreworCXJldHVybiBzeXNmc19jcmVhdGVfZ3JvdXAoJmRldi0+a29iaiwgJmJsa190cmFjZV9hdHRyX2dyb3VwKTsKK30KKworI2VuZGlmIC8qIENPTkZJR19CTEtfREVWX0lPX1RSQUNFICovCisKKyNpZmRlZiBDT05GSUdfRVZFTlRfVFJBQ0lORworCit2b2lkIGJsa19kdW1wX2NtZChjaGFyICpidWYsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlpbnQgaSwgZW5kOworCWludCBsZW4gPSBycS0+Y21kX2xlbjsKKwl1bnNpZ25lZCBjaGFyICpjbWQgPSBycS0+Y21kOworCisJaWYgKCFibGtfcGNfcmVxdWVzdChycSkpIHsKKwkJYnVmWzBdID0gJ1wwJzsKKwkJcmV0dXJuOworCX0KKworCWZvciAoZW5kID0gbGVuIC0gMTsgZW5kID49IDA7IGVuZC0tKQorCQlpZiAoY21kW2VuZF0pCisJCQlicmVhazsKKwllbmQrKzsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlidWYgKz0gc3ByaW50ZihidWYsICIlcyUwMngiLCBpID09IDAgPyAiIiA6ICIgIiwgY21kW2ldKTsKKwkJaWYgKGkgPT0gZW5kICYmIGVuZCAhPSBsZW4gLSAxKSB7CisJCQlzcHJpbnRmKGJ1ZiwgIiAuLiIpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgYmxrX2ZpbGxfcndicyhjaGFyICpyd2JzLCB1MzIgcncsIGludCBieXRlcykKK3sKKwlpbnQgaSA9IDA7CisKKwlpZiAocncgJiBXUklURSkKKwkJcndic1tpKytdID0gJ1cnOworCWVsc2UgaWYgKHJ3ICYgMSA8PCBCSU9fUldfRElTQ0FSRCkKKwkJcndic1tpKytdID0gJ0QnOworCWVsc2UgaWYgKGJ5dGVzKQorCQlyd2JzW2krK10gPSAnUic7CisJZWxzZQorCQlyd2JzW2krK10gPSAnTic7CisKKwlpZiAocncgJiAxIDw8IEJJT19SV19BSEVBRCkKKwkJcndic1tpKytdID0gJ0EnOworCWlmIChydyAmIDEgPDwgQklPX1JXX0JBUlJJRVIpCisJCXJ3YnNbaSsrXSA9ICdCJzsKKwlpZiAocncgJiAxIDw8IEJJT19SV19TWU5DSU8pCisJCXJ3YnNbaSsrXSA9ICdTJzsKKwlpZiAocncgJiAxIDw8IEJJT19SV19NRVRBKQorCQlyd2JzW2krK10gPSAnTSc7CisKKwlyd2JzW2ldID0gJ1wwJzsKK30KKwordm9pZCBibGtfZmlsbF9yd2JzX3JxKGNoYXIgKnJ3YnMsIHN0cnVjdCByZXF1ZXN0ICpycSkKK3sKKwlpbnQgcncgPSBycS0+Y21kX2ZsYWdzICYgMHgwMzsKKwlpbnQgYnl0ZXM7CisKKwlpZiAoYmxrX2Rpc2NhcmRfcnEocnEpKQorCQlydyB8PSAoMSA8PCBCSU9fUldfRElTQ0FSRCk7CisKKwlpZiAoYmxrX3BjX3JlcXVlc3QocnEpKQorCQlieXRlcyA9IHJxLT5kYXRhX2xlbjsKKwllbHNlCisJCWJ5dGVzID0gcnEtPmhhcmRfbnJfc2VjdG9ycyA8PCA5OworCisJYmxrX2ZpbGxfcndicyhyd2JzLCBydywgYnl0ZXMpOworfQorCisjZW5kaWYgLyogQ09ORklHX0VWRU5UX1RSQUNJTkcgKi8KKwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2V2ZW50cy5jIGIva2VybmVsL3RyYWNlL2V2ZW50cy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDZmMmFhLi4wMDAwMDAwCi0tLSBhL2tlcm5lbC90cmFjZS9ldmVudHMuYworKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLS8qCi0gKiBUaGlzIGlzIHRoZSBwbGFjZSB0byByZWdpc3RlciBhbGwgdHJhY2UgcG9pbnRzIGFzIGV2ZW50cy4KLSAqLwotCi0jaW5jbHVkZSA8bGludXgvc3RyaW5naWZ5Lmg+Ci0KLSNpbmNsdWRlIDx0cmFjZS90cmFjZV9ldmVudHMuaD4KLQotI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgotCi0jaW5jbHVkZSAidHJhY2VfZXZlbnRzX3N0YWdlXzEuaCIKLSNpbmNsdWRlICJ0cmFjZV9ldmVudHNfc3RhZ2VfMi5oIgotI2luY2x1ZGUgInRyYWNlX2V2ZW50c19zdGFnZV8zLmgiCi0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9mdHJhY2UuYyBiL2tlcm5lbC90cmFjZS9mdHJhY2UuYwppbmRleCBmMWVkMDgwLi5iYjYwNzMyIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvZnRyYWNlLmMKKysrIGIva2VybmVsL3RyYWNlL2Z0cmFjZS5jCkBAIC0yOSwxMSArMjksMTMgQEAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CiAjaW5jbHVkZSA8bGludXgvaGFzaC5oPgogCi0jaW5jbHVkZSA8dHJhY2Uvc2NoZWQuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2NoZWQuaD4KIAogI2luY2x1ZGUgPGFzbS9mdHJhY2UuaD4KKyNpbmNsdWRlIDxhc20vc2V0dXAuaD4KIAotI2luY2x1ZGUgInRyYWNlLmgiCisjaW5jbHVkZSAidHJhY2Vfb3V0cHV0LmgiCisjaW5jbHVkZSAidHJhY2Vfc3RhdC5oIgogCiAjZGVmaW5lIEZUUkFDRV9XQVJOX09OKGNvbmQpCQkJXAogCWRvIHsJCQkJCVwKQEAgLTY4LDcgKzcwLDcgQEAKIAogc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIGZ0cmFjZV9saXN0X2VuZCBfX3JlYWRfbW9zdGx5ID0KIHsKLQkuZnVuYyA9IGZ0cmFjZV9zdHViLAorCS5mdW5jCQk9IGZ0cmFjZV9zdHViLAogfTsKIAogc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzICpmdHJhY2VfbGlzdCBfX3JlYWRfbW9zdGx5ID0gJmZ0cmFjZV9saXN0X2VuZDsKQEAgLTI0MCw2ICsyNDIsNTgwIEBACiAjZW5kaWYKIH0KIAorI2lmZGVmIENPTkZJR19GVU5DVElPTl9QUk9GSUxFUgorc3RydWN0IGZ0cmFjZV9wcm9maWxlIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZQkJbm9kZTsKKwl1bnNpZ25lZCBsb25nCQkJaXA7CisJdW5zaWduZWQgbG9uZwkJCWNvdW50ZXI7CisjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorCXVuc2lnbmVkIGxvbmcgbG9uZwkJdGltZTsKKyNlbmRpZgorfTsKKworc3RydWN0IGZ0cmFjZV9wcm9maWxlX3BhZ2UgeworCXN0cnVjdCBmdHJhY2VfcHJvZmlsZV9wYWdlCSpuZXh0OworCXVuc2lnbmVkIGxvbmcJCQlpbmRleDsKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUJCXJlY29yZHNbXTsKK307CisKK3N0cnVjdCBmdHJhY2VfcHJvZmlsZV9zdGF0IHsKKwlhdG9taWNfdAkJCWRpc2FibGVkOworCXN0cnVjdCBobGlzdF9oZWFkCQkqaGFzaDsKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfcGFnZQkqcGFnZXM7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3BhZ2UJKnN0YXJ0OworCXN0cnVjdCB0cmFjZXJfc3RhdAkJc3RhdDsKK307CisKKyNkZWZpbmUgUFJPRklMRV9SRUNPUkRTX1NJWkUJCQkJCQlcCisJKFBBR0VfU0laRSAtIG9mZnNldG9mKHN0cnVjdCBmdHJhY2VfcHJvZmlsZV9wYWdlLCByZWNvcmRzKSkKKworI2RlZmluZSBQUk9GSUxFU19QRVJfUEFHRQkJCQkJXAorCShQUk9GSUxFX1JFQ09SRFNfU0laRSAvIHNpemVvZihzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUpKQorCitzdGF0aWMgaW50IGZ0cmFjZV9wcm9maWxlX2JpdHMgX19yZWFkX21vc3RseTsKK3N0YXRpYyBpbnQgZnRyYWNlX3Byb2ZpbGVfZW5hYmxlZCBfX3JlYWRfbW9zdGx5OworCisvKiBmdHJhY2VfcHJvZmlsZV9sb2NrIC0gc3luY2hyb25pemUgdGhlIGVuYWJsZSBhbmQgZGlzYWJsZSBvZiB0aGUgcHJvZmlsZXIgKi8KK3N0YXRpYyBERUZJTkVfTVVURVgoZnRyYWNlX3Byb2ZpbGVfbG9jayk7CisKK3N0YXRpYyBERUZJTkVfUEVSX0NQVShzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCwgZnRyYWNlX3Byb2ZpbGVfc3RhdHMpOworCisjZGVmaW5lIEZUUkFDRV9QUk9GSUxFX0hBU0hfU0laRSAxMDI0IC8qIG11c3QgYmUgcG93ZXIgb2YgMiAqLworCitzdGF0aWMgdm9pZCAqCitmdW5jdGlvbl9zdGF0X25leHQodm9pZCAqdiwgaW50IGlkeCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKnJlYyA9IHY7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3BhZ2UgKnBnOworCisJcGcgPSAoc3RydWN0IGZ0cmFjZV9wcm9maWxlX3BhZ2UgKikoKHVuc2lnbmVkIGxvbmcpcmVjICYgUEFHRV9NQVNLKTsKKworIGFnYWluOgorCXJlYysrOworCWlmICgodm9pZCAqKXJlYyA+PSAodm9pZCAqKSZwZy0+cmVjb3Jkc1twZy0+aW5kZXhdKSB7CisJCXBnID0gcGctPm5leHQ7CisJCWlmICghcGcpCisJCQlyZXR1cm4gTlVMTDsKKwkJcmVjID0gJnBnLT5yZWNvcmRzWzBdOworCQlpZiAoIXJlYy0+Y291bnRlcikKKwkJCWdvdG8gYWdhaW47CisJfQorCisJcmV0dXJuIHJlYzsKK30KKworc3RhdGljIHZvaWQgKmZ1bmN0aW9uX3N0YXRfc3RhcnQoc3RydWN0IHRyYWNlcl9zdGF0ICp0cmFjZSkKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCAqc3RhdCA9CisJCWNvbnRhaW5lcl9vZih0cmFjZSwgc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQsIHN0YXQpOworCisJaWYgKCFzdGF0IHx8ICFzdGF0LT5zdGFydCkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gZnVuY3Rpb25fc3RhdF9uZXh0KCZzdGF0LT5zdGFydC0+cmVjb3Jkc1swXSwgMCk7Cit9CisKKyNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCisvKiBmdW5jdGlvbiBncmFwaCBjb21wYXJlcyBvbiB0b3RhbCB0aW1lICovCitzdGF0aWMgaW50IGZ1bmN0aW9uX3N0YXRfY21wKHZvaWQgKnAxLCB2b2lkICpwMikKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKmEgPSBwMTsKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKmIgPSBwMjsKKworCWlmIChhLT50aW1lIDwgYi0+dGltZSkKKwkJcmV0dXJuIC0xOworCWlmIChhLT50aW1lID4gYi0+dGltZSkKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKyNlbHNlCisvKiBub3QgZnVuY3Rpb24gZ3JhcGggY29tcGFyZXMgYWdhaW5zdCBoaXRzICovCitzdGF0aWMgaW50IGZ1bmN0aW9uX3N0YXRfY21wKHZvaWQgKnAxLCB2b2lkICpwMikKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKmEgPSBwMTsKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKmIgPSBwMjsKKworCWlmIChhLT5jb3VudGVyIDwgYi0+Y291bnRlcikKKwkJcmV0dXJuIC0xOworCWlmIChhLT5jb3VudGVyID4gYi0+Y291bnRlcikKKwkJcmV0dXJuIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50IGZ1bmN0aW9uX3N0YXRfaGVhZGVycyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCit7CisjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgorCXNlcV9wcmludGYobSwgIiAgRnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkgICAiSGl0ICAgIFRpbWUgICAgICAgICAgICBBdmdcbiIKKwkJICAgICAgIiAgLS0tLS0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIgorCQkgICAiLS0tICAgIC0tLS0gICAgICAgICAgICAtLS1cbiIpOworI2Vsc2UKKwlzZXFfcHJpbnRmKG0sICIgIEZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhpdFxuIgorCQkgICAgICAiICAtLS0tLS0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS1cbiIpOworI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZnVuY3Rpb25fc3RhdF9zaG93KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdikKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKnJlYyA9IHY7CisJY2hhciBzdHJbS1NZTV9TWU1CT0xfTEVOXTsKKyNpZmRlZiBDT05GSUdfRlVOQ1RJT05fR1JBUEhfVFJBQ0VSCisJc3RhdGljIERFRklORV9NVVRFWChtdXRleCk7CisJc3RhdGljIHN0cnVjdCB0cmFjZV9zZXEgczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgYXZnOworI2VuZGlmCisKKwlrYWxsc3ltc19sb29rdXAocmVjLT5pcCwgTlVMTCwgTlVMTCwgTlVMTCwgc3RyKTsKKwlzZXFfcHJpbnRmKG0sICIgICUtMzAuMzBzICAlMTBsdSIsIHN0ciwgcmVjLT5jb3VudGVyKTsKKworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKKwlzZXFfcHJpbnRmKG0sICIgICAgIik7CisJYXZnID0gcmVjLT50aW1lOworCWRvX2RpdihhdmcsIHJlYy0+Y291bnRlcik7CisKKwltdXRleF9sb2NrKCZtdXRleCk7CisJdHJhY2Vfc2VxX2luaXQoJnMpOworCXRyYWNlX3ByaW50X2dyYXBoX2R1cmF0aW9uKHJlYy0+dGltZSwgJnMpOworCXRyYWNlX3NlcV9wdXRzKCZzLCAiICAgICIpOworCXRyYWNlX3ByaW50X2dyYXBoX2R1cmF0aW9uKGF2ZywgJnMpOworCXRyYWNlX3ByaW50X3NlcShtLCAmcyk7CisJbXV0ZXhfdW5sb2NrKCZtdXRleCk7CisjZW5kaWYKKwlzZXFfcHV0YyhtLCAnXG4nKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBmdHJhY2VfcHJvZmlsZV9yZXNldChzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfcGFnZSAqcGc7CisKKwlwZyA9IHN0YXQtPnBhZ2VzID0gc3RhdC0+c3RhcnQ7CisKKwl3aGlsZSAocGcpIHsKKwkJbWVtc2V0KHBnLT5yZWNvcmRzLCAwLCBQUk9GSUxFX1JFQ09SRFNfU0laRSk7CisJCXBnLT5pbmRleCA9IDA7CisJCXBnID0gcGctPm5leHQ7CisJfQorCisJbWVtc2V0KHN0YXQtPmhhc2gsIDAsCisJICAgICAgIEZUUkFDRV9QUk9GSUxFX0hBU0hfU0laRSAqIHNpemVvZihzdHJ1Y3QgaGxpc3RfaGVhZCkpOworfQorCitpbnQgZnRyYWNlX3Byb2ZpbGVfcGFnZXNfaW5pdChzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCAqc3RhdCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfcGFnZSAqcGc7CisJaW50IGZ1bmN0aW9uczsKKwlpbnQgcGFnZXM7CisJaW50IGk7CisKKwkvKiBJZiB3ZSBhbHJlYWR5IGFsbG9jYXRlZCwgZG8gbm90aGluZyAqLworCWlmIChzdGF0LT5wYWdlcykKKwkJcmV0dXJuIDA7CisKKwlzdGF0LT5wYWdlcyA9ICh2b2lkICopZ2V0X3plcm9lZF9wYWdlKEdGUF9LRVJORUwpOworCWlmICghc3RhdC0+cGFnZXMpCisJCXJldHVybiAtRU5PTUVNOworCisjaWZkZWYgQ09ORklHX0RZTkFNSUNfRlRSQUNFCisJZnVuY3Rpb25zID0gZnRyYWNlX3VwZGF0ZV90b3RfY250OworI2Vsc2UKKwkvKgorCSAqIFdlIGRvIG5vdCBrbm93IHRoZSBudW1iZXIgb2YgZnVuY3Rpb25zIHRoYXQgZXhpc3QgYmVjYXVzZQorCSAqIGR5bmFtaWMgdHJhY2luZyBpcyB3aGF0IGNvdW50cyB0aGVtLiBXaXRoIHBhc3QgZXhwZXJpZW5jZQorCSAqIHdlIGhhdmUgYXJvdW5kIDIwSyBmdW5jdGlvbnMuIFRoYXQgc2hvdWxkIGJlIG1vcmUgdGhhbiBlbm91Z2guCisJICogSXQgaXMgaGlnaGx5IHVubGlrZWx5IHdlIHdpbGwgZXhlY3V0ZSBldmVyeSBmdW5jdGlvbiBpbgorCSAqIHRoZSBrZXJuZWwuCisJICovCisJZnVuY3Rpb25zID0gMjAwMDA7CisjZW5kaWYKKworCXBnID0gc3RhdC0+c3RhcnQgPSBzdGF0LT5wYWdlczsKKworCXBhZ2VzID0gRElWX1JPVU5EX1VQKGZ1bmN0aW9ucywgUFJPRklMRVNfUEVSX1BBR0UpOworCisJZm9yIChpID0gMDsgaSA8IHBhZ2VzOyBpKyspIHsKKwkJcGctPm5leHQgPSAodm9pZCAqKWdldF96ZXJvZWRfcGFnZShHRlBfS0VSTkVMKTsKKwkJaWYgKCFwZy0+bmV4dCkKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCXBnID0gcGctPm5leHQ7CisJfQorCisJcmV0dXJuIDA7CisKKyBvdXRfZnJlZToKKwlwZyA9IHN0YXQtPnN0YXJ0OworCXdoaWxlIChwZykgeworCQl1bnNpZ25lZCBsb25nIHRtcCA9ICh1bnNpZ25lZCBsb25nKXBnOworCisJCXBnID0gcGctPm5leHQ7CisJCWZyZWVfcGFnZSh0bXApOworCX0KKworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylzdGF0LT5wYWdlcyk7CisJc3RhdC0+cGFnZXMgPSBOVUxMOworCXN0YXQtPnN0YXJ0ID0gTlVMTDsKKworCXJldHVybiAtRU5PTUVNOworfQorCitzdGF0aWMgaW50IGZ0cmFjZV9wcm9maWxlX2luaXRfY3B1KGludCBjcHUpCit7CisJc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQgKnN0YXQ7CisJaW50IHNpemU7CisKKwlzdGF0ID0gJnBlcl9jcHUoZnRyYWNlX3Byb2ZpbGVfc3RhdHMsIGNwdSk7CisKKwlpZiAoc3RhdC0+aGFzaCkgeworCQkvKiBJZiB0aGUgcHJvZmlsZSBpcyBhbHJlYWR5IGNyZWF0ZWQsIHNpbXBseSByZXNldCBpdCAqLworCQlmdHJhY2VfcHJvZmlsZV9yZXNldChzdGF0KTsKKwkJcmV0dXJuIDA7CisJfQorCisJLyoKKwkgKiBXZSBhcmUgcHJvZmlsaW5nIGFsbCBmdW5jdGlvbnMsIGJ1dCB1c3VhbGx5IG9ubHkgYSBmZXcgdGhvdXNhbmQKKwkgKiBmdW5jdGlvbnMgYXJlIGhpdC4gV2UnbGwgbWFrZSBhIGhhc2ggb2YgMTAyNCBpdGVtcy4KKwkgKi8KKwlzaXplID0gRlRSQUNFX1BST0ZJTEVfSEFTSF9TSVpFOworCisJc3RhdC0+aGFzaCA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBobGlzdF9oZWFkKSAqIHNpemUsIEdGUF9LRVJORUwpOworCisJaWYgKCFzdGF0LT5oYXNoKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWlmICghZnRyYWNlX3Byb2ZpbGVfYml0cykgeworCQlzaXplLS07CisKKwkJZm9yICg7IHNpemU7IHNpemUgPj49IDEpCisJCQlmdHJhY2VfcHJvZmlsZV9iaXRzKys7CisJfQorCisJLyogUHJlYWxsb2NhdGUgdGhlIGZ1bmN0aW9uIHByb2ZpbGluZyBwYWdlcyAqLworCWlmIChmdHJhY2VfcHJvZmlsZV9wYWdlc19pbml0KHN0YXQpIDwgMCkgeworCQlrZnJlZShzdGF0LT5oYXNoKTsKKwkJc3RhdC0+aGFzaCA9IE5VTEw7CisJCXJldHVybiAtRU5PTUVNOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZ0cmFjZV9wcm9maWxlX2luaXQodm9pZCkKK3sKKwlpbnQgY3B1OworCWludCByZXQgPSAwOworCisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJcmV0ID0gZnRyYWNlX3Byb2ZpbGVfaW5pdF9jcHUoY3B1KTsKKwkJaWYgKHJldCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qIGludGVycnVwdHMgbXVzdCBiZSBkaXNhYmxlZCAqLworc3RhdGljIHN0cnVjdCBmdHJhY2VfcHJvZmlsZSAqCitmdHJhY2VfZmluZF9wcm9maWxlZF9mdW5jKHN0cnVjdCBmdHJhY2VfcHJvZmlsZV9zdGF0ICpzdGF0LCB1bnNpZ25lZCBsb25nIGlwKQoreworCXN0cnVjdCBmdHJhY2VfcHJvZmlsZSAqcmVjOworCXN0cnVjdCBobGlzdF9oZWFkICpoaGQ7CisJc3RydWN0IGhsaXN0X25vZGUgKm47CisJdW5zaWduZWQgbG9uZyBrZXk7CisKKwlrZXkgPSBoYXNoX2xvbmcoaXAsIGZ0cmFjZV9wcm9maWxlX2JpdHMpOworCWhoZCA9ICZzdGF0LT5oYXNoW2tleV07CisKKwlpZiAoaGxpc3RfZW1wdHkoaGhkKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlobGlzdF9mb3JfZWFjaF9lbnRyeV9yY3UocmVjLCBuLCBoaGQsIG5vZGUpIHsKKwkJaWYgKHJlYy0+aXAgPT0gaXApCisJCQlyZXR1cm4gcmVjOworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBmdHJhY2VfYWRkX3Byb2ZpbGUoc3RydWN0IGZ0cmFjZV9wcm9maWxlX3N0YXQgKnN0YXQsCisJCQkgICAgICAgc3RydWN0IGZ0cmFjZV9wcm9maWxlICpyZWMpCit7CisJdW5zaWduZWQgbG9uZyBrZXk7CisKKwlrZXkgPSBoYXNoX2xvbmcocmVjLT5pcCwgZnRyYWNlX3Byb2ZpbGVfYml0cyk7CisJaGxpc3RfYWRkX2hlYWRfcmN1KCZyZWMtPm5vZGUsICZzdGF0LT5oYXNoW2tleV0pOworfQorCisvKgorICogVGhlIG1lbW9yeSBpcyBhbHJlYWR5IGFsbG9jYXRlZCwgdGhpcyBzaW1wbHkgZmluZHMgYSBuZXcgcmVjb3JkIHRvIHVzZS4KKyAqLworc3RhdGljIHN0cnVjdCBmdHJhY2VfcHJvZmlsZSAqCitmdHJhY2VfcHJvZmlsZV9hbGxvYyhzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCAqc3RhdCwgdW5zaWduZWQgbG9uZyBpcCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKnJlYyA9IE5VTEw7CisKKwkvKiBwcmV2ZW50IHJlY3Vyc2lvbiAoZnJvbSBOTUlzKSAqLworCWlmIChhdG9taWNfaW5jX3JldHVybigmc3RhdC0+ZGlzYWJsZWQpICE9IDEpCisJCWdvdG8gb3V0OworCisJLyoKKwkgKiBUcnkgdG8gZmluZCB0aGUgZnVuY3Rpb24gYWdhaW4gc2luY2UgYW4gTk1JCisJICogY291bGQgaGF2ZSBhZGRlZCBpdAorCSAqLworCXJlYyA9IGZ0cmFjZV9maW5kX3Byb2ZpbGVkX2Z1bmMoc3RhdCwgaXApOworCWlmIChyZWMpCisJCWdvdG8gb3V0OworCisJaWYgKHN0YXQtPnBhZ2VzLT5pbmRleCA9PSBQUk9GSUxFU19QRVJfUEFHRSkgeworCQlpZiAoIXN0YXQtPnBhZ2VzLT5uZXh0KQorCQkJZ290byBvdXQ7CisJCXN0YXQtPnBhZ2VzID0gc3RhdC0+cGFnZXMtPm5leHQ7CisJfQorCisJcmVjID0gJnN0YXQtPnBhZ2VzLT5yZWNvcmRzW3N0YXQtPnBhZ2VzLT5pbmRleCsrXTsKKwlyZWMtPmlwID0gaXA7CisJZnRyYWNlX2FkZF9wcm9maWxlKHN0YXQsIHJlYyk7CisKKyBvdXQ6CisJYXRvbWljX2RlYygmc3RhdC0+ZGlzYWJsZWQpOworCisJcmV0dXJuIHJlYzsKK30KKworc3RhdGljIHZvaWQKK2Z1bmN0aW9uX3Byb2ZpbGVfY2FsbCh1bnNpZ25lZCBsb25nIGlwLCB1bnNpZ25lZCBsb25nIHBhcmVudF9pcCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCAqc3RhdDsKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKnJlYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJaWYgKCFmdHJhY2VfcHJvZmlsZV9lbmFibGVkKQorCQlyZXR1cm47CisKKwlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CisKKwlzdGF0ID0gJl9fZ2V0X2NwdV92YXIoZnRyYWNlX3Byb2ZpbGVfc3RhdHMpOworCWlmICghc3RhdC0+aGFzaCB8fCAhZnRyYWNlX3Byb2ZpbGVfZW5hYmxlZCkKKwkJZ290byBvdXQ7CisKKwlyZWMgPSBmdHJhY2VfZmluZF9wcm9maWxlZF9mdW5jKHN0YXQsIGlwKTsKKwlpZiAoIXJlYykgeworCQlyZWMgPSBmdHJhY2VfcHJvZmlsZV9hbGxvYyhzdGF0LCBpcCk7CisJCWlmICghcmVjKQorCQkJZ290byBvdXQ7CisJfQorCisJcmVjLT5jb3VudGVyKys7Cisgb3V0OgorCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKK30KKworI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKK3N0YXRpYyBpbnQgcHJvZmlsZV9ncmFwaF9lbnRyeShzdHJ1Y3QgZnRyYWNlX2dyYXBoX2VudCAqdHJhY2UpCit7CisJZnVuY3Rpb25fcHJvZmlsZV9jYWxsKHRyYWNlLT5mdW5jLCAwKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgcHJvZmlsZV9ncmFwaF9yZXR1cm4oc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXQgKnRyYWNlKQoreworCXN0cnVjdCBmdHJhY2VfcHJvZmlsZV9zdGF0ICpzdGF0OworCXVuc2lnbmVkIGxvbmcgbG9uZyBjYWxsdGltZTsKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGUgKnJlYzsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCXN0YXQgPSAmX19nZXRfY3B1X3ZhcihmdHJhY2VfcHJvZmlsZV9zdGF0cyk7CisJaWYgKCFzdGF0LT5oYXNoIHx8ICFmdHJhY2VfcHJvZmlsZV9lbmFibGVkKQorCQlnb3RvIG91dDsKKworCWNhbGx0aW1lID0gdHJhY2UtPnJldHRpbWUgLSB0cmFjZS0+Y2FsbHRpbWU7CisKKwlpZiAoISh0cmFjZV9mbGFncyAmIFRSQUNFX0lURVJfR1JBUEhfVElNRSkpIHsKKwkJaW50IGluZGV4OworCisJCWluZGV4ID0gdHJhY2UtPmRlcHRoOworCisJCS8qIEFwcGVuZCB0aGlzIGNhbGwgdGltZSB0byB0aGUgcGFyZW50IHRpbWUgdG8gc3VidHJhY3QgKi8KKwkJaWYgKGluZGV4KQorCQkJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4IC0gMV0uc3VidGltZSArPSBjYWxsdGltZTsKKworCQlpZiAoY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5zdWJ0aW1lIDwgY2FsbHRpbWUpCisJCQljYWxsdGltZSAtPSBjdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLnN1YnRpbWU7CisJCWVsc2UKKwkJCWNhbGx0aW1lID0gMDsKKwl9CisKKwlyZWMgPSBmdHJhY2VfZmluZF9wcm9maWxlZF9mdW5jKHN0YXQsIHRyYWNlLT5mdW5jKTsKKwlpZiAocmVjKQorCQlyZWMtPnRpbWUgKz0gY2FsbHRpbWU7CisKKyBvdXQ6CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworfQorCitzdGF0aWMgaW50IHJlZ2lzdGVyX2Z0cmFjZV9wcm9maWxlcih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9mdHJhY2VfZ3JhcGgoJnByb2ZpbGVfZ3JhcGhfcmV0dXJuLAorCQkJCSAgICAgJnByb2ZpbGVfZ3JhcGhfZW50cnkpOworfQorCitzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyX2Z0cmFjZV9wcm9maWxlcih2b2lkKQoreworCXVucmVnaXN0ZXJfZnRyYWNlX2dyYXBoKCk7Cit9CisjZWxzZQorc3RhdGljIHN0cnVjdCBmdHJhY2Vfb3BzIGZ0cmFjZV9wcm9maWxlX29wcyBfX3JlYWRfbW9zdGx5ID0KK3sKKwkuZnVuYwkJPSBmdW5jdGlvbl9wcm9maWxlX2NhbGwsCit9OworCitzdGF0aWMgaW50IHJlZ2lzdGVyX2Z0cmFjZV9wcm9maWxlcih2b2lkKQoreworCXJldHVybiByZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24oJmZ0cmFjZV9wcm9maWxlX29wcyk7Cit9CisKK3N0YXRpYyB2b2lkIHVucmVnaXN0ZXJfZnRyYWNlX3Byb2ZpbGVyKHZvaWQpCit7CisJdW5yZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24oJmZ0cmFjZV9wcm9maWxlX29wcyk7Cit9CisjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUiAqLworCitzdGF0aWMgc3NpemVfdAorZnRyYWNlX3Byb2ZpbGVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbHAsIGNvbnN0IGNoYXIgX191c2VyICp1YnVmLAorCQkgICAgIHNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwl1bnNpZ25lZCBsb25nIHZhbDsKKwljaGFyIGJ1Zls2NF07CQkvKiBiaWcgZW5vdWdoIHRvIGhvbGQgYSBudW1iZXIgKi8KKwlpbnQgcmV0OworCisJaWYgKGNudCA+PSBzaXplb2YoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY250KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlidWZbY250XSA9IDA7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXZhbCA9ICEhdmFsOworCisJbXV0ZXhfbG9jaygmZnRyYWNlX3Byb2ZpbGVfbG9jayk7CisJaWYgKGZ0cmFjZV9wcm9maWxlX2VuYWJsZWQgXiB2YWwpIHsKKwkJaWYgKHZhbCkgeworCQkJcmV0ID0gZnRyYWNlX3Byb2ZpbGVfaW5pdCgpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQljbnQgPSByZXQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisKKwkJCXJldCA9IHJlZ2lzdGVyX2Z0cmFjZV9wcm9maWxlcigpOworCQkJaWYgKHJldCA8IDApIHsKKwkJCQljbnQgPSByZXQ7CisJCQkJZ290byBvdXQ7CisJCQl9CisJCQlmdHJhY2VfcHJvZmlsZV9lbmFibGVkID0gMTsKKwkJfSBlbHNlIHsKKwkJCWZ0cmFjZV9wcm9maWxlX2VuYWJsZWQgPSAwOworCQkJLyoKKwkJCSAqIHVucmVnaXN0ZXJfZnRyYWNlX3Byb2ZpbGVyIGNhbGxzIHN0b3BfbWFjaGluZQorCQkJICogc28gdGhpcyBhY3RzIGxpa2UgYW4gc3luY2hyb25pemVfc2NoZWQuCisJCQkgKi8KKwkJCXVucmVnaXN0ZXJfZnRyYWNlX3Byb2ZpbGVyKCk7CisJCX0KKwl9Cisgb3V0OgorCW11dGV4X3VubG9jaygmZnRyYWNlX3Byb2ZpbGVfbG9jayk7CisKKwlmaWxwLT5mX3BvcyArPSBjbnQ7CisKKwlyZXR1cm4gY250OworfQorCitzdGF0aWMgc3NpemVfdAorZnRyYWNlX3Byb2ZpbGVfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCisJCSAgICAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmWzY0XTsJCS8qIGJpZyBlbm91Z2ggdG8gaG9sZCBhIG51bWJlciAqLworCWludCByOworCisJciA9IHNwcmludGYoYnVmLCAiJXVcbiIsIGZ0cmFjZV9wcm9maWxlX2VuYWJsZWQpOworCXJldHVybiBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjbnQsIHBwb3MsIGJ1Ziwgcik7Cit9CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ0cmFjZV9wcm9maWxlX2ZvcHMgPSB7CisJLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCisJLnJlYWQJCT0gZnRyYWNlX3Byb2ZpbGVfcmVhZCwKKwkud3JpdGUJCT0gZnRyYWNlX3Byb2ZpbGVfd3JpdGUsCit9OworCisvKiB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHJlYWwgc3RhdCBmaWxlcyAqLworc3RhdGljIHN0cnVjdCB0cmFjZXJfc3RhdCBmdW5jdGlvbl9zdGF0cyBfX2luaXRkYXRhID0geworCS5uYW1lCQk9ICJmdW5jdGlvbnMiLAorCS5zdGF0X3N0YXJ0CT0gZnVuY3Rpb25fc3RhdF9zdGFydCwKKwkuc3RhdF9uZXh0CT0gZnVuY3Rpb25fc3RhdF9uZXh0LAorCS5zdGF0X2NtcAk9IGZ1bmN0aW9uX3N0YXRfY21wLAorCS5zdGF0X2hlYWRlcnMJPSBmdW5jdGlvbl9zdGF0X2hlYWRlcnMsCisJLnN0YXRfc2hvdwk9IGZ1bmN0aW9uX3N0YXRfc2hvdworfTsKKworc3RhdGljIHZvaWQgZnRyYWNlX3Byb2ZpbGVfZGVidWdmcyhzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcikKK3sKKwlzdHJ1Y3QgZnRyYWNlX3Byb2ZpbGVfc3RhdCAqc3RhdDsKKwlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKKwljaGFyICpuYW1lOworCWludCByZXQ7CisJaW50IGNwdTsKKworCWZvcl9lYWNoX3Bvc3NpYmxlX2NwdShjcHUpIHsKKwkJc3RhdCA9ICZwZXJfY3B1KGZ0cmFjZV9wcm9maWxlX3N0YXRzLCBjcHUpOworCisJCS8qIGFsbG9jYXRlIGVub3VnaCBmb3IgZnVuY3Rpb24gbmFtZSArIGNwdSBudW1iZXIgKi8KKwkJbmFtZSA9IGttYWxsb2MoMzIsIEdGUF9LRVJORUwpOworCQlpZiAoIW5hbWUpIHsKKwkJCS8qCisJCQkgKiBUaGUgZmlsZXMgY3JlYXRlZCBhcmUgcGVybWFuZW50LCBpZiBzb21ldGhpbmcgaGFwcGVucworCQkJICogd2Ugc3RpbGwgZG8gbm90IGZyZWUgbWVtb3J5LgorCQkJICovCisJCQlrZnJlZShzdGF0KTsKKwkJCVdBUk4oMSwKKwkJCSAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBzdGF0IGZpbGUgZm9yIGNwdSAlZFxuIiwKKwkJCSAgICAgY3B1KTsKKwkJCXJldHVybjsKKwkJfQorCQlzdGF0LT5zdGF0ID0gZnVuY3Rpb25fc3RhdHM7CisJCXNucHJpbnRmKG5hbWUsIDMyLCAiZnVuY3Rpb24lZCIsIGNwdSk7CisJCXN0YXQtPnN0YXQubmFtZSA9IG5hbWU7CisJCXJldCA9IHJlZ2lzdGVyX3N0YXRfdHJhY2VyKCZzdGF0LT5zdGF0KTsKKwkJaWYgKHJldCkgeworCQkJV0FSTigxLAorCQkJICAgICAiQ291bGQgbm90IHJlZ2lzdGVyIGZ1bmN0aW9uIHN0YXQgZm9yIGNwdSAlZFxuIiwKKwkJCSAgICAgY3B1KTsKKwkJCWtmcmVlKG5hbWUpOworCQkJcmV0dXJuOworCQl9CisJfQorCisJZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmdW5jdGlvbl9wcm9maWxlX2VuYWJsZWQiLCAwNjQ0LAorCQkJCSAgICBkX3RyYWNlciwgTlVMTCwgJmZ0cmFjZV9wcm9maWxlX2ZvcHMpOworCWlmICghZW50cnkpCisJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCisJCQkgICAiJ2Z1bmN0aW9uX3Byb2ZpbGVfZW5hYmxlZCcgZW50cnlcbiIpOworfQorCisjZWxzZSAvKiBDT05GSUdfRlVOQ1RJT05fUFJPRklMRVIgKi8KK3N0YXRpYyB2b2lkIGZ0cmFjZV9wcm9maWxlX2RlYnVnZnMoc3RydWN0IGRlbnRyeSAqZF90cmFjZXIpCit7Cit9CisjZW5kaWYgLyogQ09ORklHX0ZVTkNUSU9OX1BST0ZJTEVSICovCisKIC8qIHNldCB3aGVuIHRyYWNpbmcgb25seSBhIHBpZCAqLwogc3RydWN0IHBpZCAqZnRyYWNlX3BpZF90cmFjZTsKIHN0YXRpYyBzdHJ1Y3QgcGlkICogY29uc3QgZnRyYWNlX3N3YXBwZXJfcGlkID0gJmluaXRfc3RydWN0X3BpZDsKQEAgLTI2MSw3ICs4MzcsNiBAQAogCXN0cnVjdCByY3VfaGVhZAkJcmN1OwogfTsKIAotCiBlbnVtIHsKIAlGVFJBQ0VfRU5BQkxFX0NBTExTCQk9ICgxIDw8IDApLAogCUZUUkFDRV9ESVNBQkxFX0NBTExTCQk9ICgxIDw8IDEpLApAQCAtMzQ2LDMwICs5MjEsNiBAQAogCXJlYy0+ZmxhZ3MgfD0gRlRSQUNFX0ZMX0ZSRUU7CiB9CiAKLXZvaWQgZnRyYWNlX3JlbGVhc2Uodm9pZCAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKLXsKLQlzdHJ1Y3QgZHluX2Z0cmFjZSAqcmVjOwotCXN0cnVjdCBmdHJhY2VfcGFnZSAqcGc7Ci0JdW5zaWduZWQgbG9uZyBzID0gKHVuc2lnbmVkIGxvbmcpc3RhcnQ7Ci0JdW5zaWduZWQgbG9uZyBlID0gcyArIHNpemU7Ci0KLQlpZiAoZnRyYWNlX2Rpc2FibGVkIHx8ICFzdGFydCkKLQkJcmV0dXJuOwotCi0JbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOwotCWRvX2Zvcl9lYWNoX2Z0cmFjZV9yZWMocGcsIHJlYykgewotCQlpZiAoKHJlYy0+aXAgPj0gcykgJiYgKHJlYy0+aXAgPCBlKSkgewotCQkJLyoKLQkJCSAqIHJlYy0+aXAgaXMgY2hhbmdlZCBpbiBmdHJhY2VfZnJlZV9yZWMoKQotCQkJICogSXQgc2hvdWxkIG5vdCBiZXR3ZWVuIHMgYW5kIGUgaWYgcmVjb3JkIHdhcyBmcmVlZC4KLQkJCSAqLwotCQkJRlRSQUNFX1dBUk5fT04ocmVjLT5mbGFncyAmIEZUUkFDRV9GTF9GUkVFKTsKLQkJCWZ0cmFjZV9mcmVlX3JlYyhyZWMpOwotCQl9Ci0JfSB3aGlsZV9mb3JfZWFjaF9mdHJhY2VfcmVjKCk7Ci0JbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7Ci19Ci0KIHN0YXRpYyBzdHJ1Y3QgZHluX2Z0cmFjZSAqZnRyYWNlX2FsbG9jX2R5bl9ub2RlKHVuc2lnbmVkIGxvbmcgaXApCiB7CiAJc3RydWN0IGR5bl9mdHJhY2UgKnJlYzsKQEAgLTE0MDgsNyArMTk1OSw3IEBACiAKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX29wcyB0cmFjZV9wcm9iZV9vcHMgX19yZWFkX21vc3RseSA9CiB7Ci0JLmZ1bmMgPSBmdW5jdGlvbl90cmFjZV9wcm9iZV9jYWxsLAorCS5mdW5jCQk9IGZ1bmN0aW9uX3RyYWNlX3Byb2JlX2NhbGwsCiB9OwogCiBzdGF0aWMgaW50IGZ0cmFjZV9wcm9iZV9yZWdpc3RlcmVkOwpAQCAtMTgyMyw2ICsyMzc0LDQ1IEBACiAJZnRyYWNlX3NldF9yZWdleChidWYsIGxlbiwgcmVzZXQsIDApOwogfQogCisvKgorICogY29tbWFuZCBsaW5lIGludGVyZmFjZSB0byBhbGxvdyB1c2VycyB0byBzZXQgZmlsdGVycyBvbiBib290IHVwLgorICovCisjZGVmaW5lIEZUUkFDRV9GSUxURVJfU0laRQkJQ09NTUFORF9MSU5FX1NJWkUKK3N0YXRpYyBjaGFyIGZ0cmFjZV9ub3RyYWNlX2J1ZltGVFJBQ0VfRklMVEVSX1NJWkVdIF9faW5pdGRhdGE7CitzdGF0aWMgY2hhciBmdHJhY2VfZmlsdGVyX2J1ZltGVFJBQ0VfRklMVEVSX1NJWkVdIF9faW5pdGRhdGE7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldF9mdHJhY2Vfbm90cmFjZShjaGFyICpzdHIpCit7CisJc3RybmNweShmdHJhY2Vfbm90cmFjZV9idWYsIHN0ciwgRlRSQUNFX0ZJTFRFUl9TSVpFKTsKKwlyZXR1cm4gMTsKK30KK19fc2V0dXAoImZ0cmFjZV9ub3RyYWNlPSIsIHNldF9mdHJhY2Vfbm90cmFjZSk7CisKK3N0YXRpYyBpbnQgX19pbml0IHNldF9mdHJhY2VfZmlsdGVyKGNoYXIgKnN0cikKK3sKKwlzdHJuY3B5KGZ0cmFjZV9maWx0ZXJfYnVmLCBzdHIsIEZUUkFDRV9GSUxURVJfU0laRSk7CisJcmV0dXJuIDE7Cit9CitfX3NldHVwKCJmdHJhY2VfZmlsdGVyPSIsIHNldF9mdHJhY2VfZmlsdGVyKTsKKworc3RhdGljIHZvaWQgX19pbml0IHNldF9mdHJhY2VfZWFybHlfZmlsdGVyKGNoYXIgKmJ1ZiwgaW50IGVuYWJsZSkKK3sKKwljaGFyICpmdW5jOworCisJd2hpbGUgKGJ1ZikgeworCQlmdW5jID0gc3Ryc2VwKCZidWYsICIsIik7CisJCWZ0cmFjZV9zZXRfcmVnZXgoZnVuYywgc3RybGVuKGZ1bmMpLCAwLCBlbmFibGUpOworCX0KK30KKworc3RhdGljIHZvaWQgX19pbml0IHNldF9mdHJhY2VfZWFybHlfZmlsdGVycyh2b2lkKQoreworCWlmIChmdHJhY2VfZmlsdGVyX2J1ZlswXSkKKwkJc2V0X2Z0cmFjZV9lYXJseV9maWx0ZXIoZnRyYWNlX2ZpbHRlcl9idWYsIDEpOworCWlmIChmdHJhY2Vfbm90cmFjZV9idWZbMF0pCisJCXNldF9mdHJhY2VfZWFybHlfZmlsdGVyKGZ0cmFjZV9ub3RyYWNlX2J1ZiwgMCk7Cit9CisKIHN0YXRpYyBpbnQKIGZ0cmFjZV9yZWdleF9yZWxlYXNlKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLCBpbnQgZW5hYmxlKQogewpAQCAtMjEyOCwzOCArMjcxOCwyMyBAQAogCiBzdGF0aWMgX19pbml0IGludCBmdHJhY2VfaW5pdF9keW5fZGVidWdmcyhzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcikKIHsKLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYXZhaWxhYmxlX2ZpbHRlcl9mdW5jdGlvbnMiLCAwNDQ0LAotCQkJCSAgICBkX3RyYWNlciwgTlVMTCwgJmZ0cmFjZV9hdmFpbF9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIidhdmFpbGFibGVfZmlsdGVyX2Z1bmN0aW9ucycgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJhdmFpbGFibGVfZmlsdGVyX2Z1bmN0aW9ucyIsIDA0NDQsCisJCQlkX3RyYWNlciwgTlVMTCwgJmZ0cmFjZV9hdmFpbF9mb3BzKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZmFpbHVyZXMiLCAwNDQ0LAotCQkJCSAgICBkX3RyYWNlciwgTlVMTCwgJmZ0cmFjZV9mYWlsdXJlc19mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ2ZhaWx1cmVzJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoImZhaWx1cmVzIiwgMDQ0NCwKKwkJCWRfdHJhY2VyLCBOVUxMLCAmZnRyYWNlX2ZhaWx1cmVzX2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzZXRfZnRyYWNlX2ZpbHRlciIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICBOVUxMLCAmZnRyYWNlX2ZpbHRlcl9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIidzZXRfZnRyYWNlX2ZpbHRlcicgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJzZXRfZnRyYWNlX2ZpbHRlciIsIDA2NDQsIGRfdHJhY2VyLAorCQkJTlVMTCwgJmZ0cmFjZV9maWx0ZXJfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInNldF9mdHJhY2Vfbm90cmFjZSIsIDA2NDQsIGRfdHJhY2VyLAorCXRyYWNlX2NyZWF0ZV9maWxlKCJzZXRfZnRyYWNlX25vdHJhY2UiLCAwNjQ0LCBkX3RyYWNlciwKIAkJCQkgICAgTlVMTCwgJmZ0cmFjZV9ub3RyYWNlX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCi0JCQkgICAiJ3NldF9mdHJhY2Vfbm90cmFjZScgZW50cnlcbiIpOwogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgic2V0X2dyYXBoX2Z1bmN0aW9uIiwgMDQ0NCwgZF90cmFjZXIsCisJdHJhY2VfY3JlYXRlX2ZpbGUoInNldF9ncmFwaF9mdW5jdGlvbiIsIDA0NDQsIGRfdHJhY2VyLAogCQkJCSAgICBOVUxMLAogCQkJCSAgICAmZnRyYWNlX2dyYXBoX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCi0JCQkgICAiJ3NldF9ncmFwaF9mdW5jdGlvbicgZW50cnlcbiIpOwogI2VuZGlmIC8qIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIgKi8KIAogCXJldHVybiAwOwpAQCAtMjE5NywxNCArMjc3Miw3MiBAQAogCXJldHVybiAwOwogfQogCi12b2lkIGZ0cmFjZV9pbml0X21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsCi0JCQl1bnNpZ25lZCBsb25nICpzdGFydCwgdW5zaWduZWQgbG9uZyAqZW5kKQorI2lmZGVmIENPTkZJR19NT0RVTEVTCit2b2lkIGZ0cmFjZV9yZWxlYXNlKHZvaWQgKnN0YXJ0LCB2b2lkICplbmQpCit7CisJc3RydWN0IGR5bl9mdHJhY2UgKnJlYzsKKwlzdHJ1Y3QgZnRyYWNlX3BhZ2UgKnBnOworCXVuc2lnbmVkIGxvbmcgcyA9ICh1bnNpZ25lZCBsb25nKXN0YXJ0OworCXVuc2lnbmVkIGxvbmcgZSA9ICh1bnNpZ25lZCBsb25nKWVuZDsKKworCWlmIChmdHJhY2VfZGlzYWJsZWQgfHwgIXN0YXJ0IHx8IHN0YXJ0ID09IGVuZCkKKwkJcmV0dXJuOworCisJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOworCWRvX2Zvcl9lYWNoX2Z0cmFjZV9yZWMocGcsIHJlYykgeworCQlpZiAoKHJlYy0+aXAgPj0gcykgJiYgKHJlYy0+aXAgPCBlKSkgeworCQkJLyoKKwkJCSAqIHJlYy0+aXAgaXMgY2hhbmdlZCBpbiBmdHJhY2VfZnJlZV9yZWMoKQorCQkJICogSXQgc2hvdWxkIG5vdCBiZXR3ZWVuIHMgYW5kIGUgaWYgcmVjb3JkIHdhcyBmcmVlZC4KKwkJCSAqLworCQkJRlRSQUNFX1dBUk5fT04ocmVjLT5mbGFncyAmIEZUUkFDRV9GTF9GUkVFKTsKKwkJCWZ0cmFjZV9mcmVlX3JlYyhyZWMpOworCQl9CisJfSB3aGlsZV9mb3JfZWFjaF9mdHJhY2VfcmVjKCk7CisJbXV0ZXhfdW5sb2NrKCZmdHJhY2VfbG9jayk7Cit9CisKK3N0YXRpYyB2b2lkIGZ0cmFjZV9pbml0X21vZHVsZShzdHJ1Y3QgbW9kdWxlICptb2QsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyAqc3RhcnQsIHVuc2lnbmVkIGxvbmcgKmVuZCkKIHsKIAlpZiAoZnRyYWNlX2Rpc2FibGVkIHx8IHN0YXJ0ID09IGVuZCkKIAkJcmV0dXJuOwogCWZ0cmFjZV9jb252ZXJ0X25vcHMobW9kLCBzdGFydCwgZW5kKTsKIH0KIAorc3RhdGljIGludCBmdHJhY2VfbW9kdWxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkJdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kID0gZGF0YTsKKworCXN3aXRjaCAodmFsKSB7CisJY2FzZSBNT0RVTEVfU1RBVEVfQ09NSU5HOgorCQlmdHJhY2VfaW5pdF9tb2R1bGUobW9kLCBtb2QtPmZ0cmFjZV9jYWxsc2l0ZXMsCisJCQkJICAgbW9kLT5mdHJhY2VfY2FsbHNpdGVzICsKKwkJCQkgICBtb2QtPm51bV9mdHJhY2VfY2FsbHNpdGVzKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RVTEVfU1RBVEVfR09JTkc6CisJCWZ0cmFjZV9yZWxlYXNlKG1vZC0+ZnRyYWNlX2NhbGxzaXRlcywKKwkJCSAgICAgICBtb2QtPmZ0cmFjZV9jYWxsc2l0ZXMgKworCQkJICAgICAgIG1vZC0+bnVtX2Z0cmFjZV9jYWxsc2l0ZXMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKyNlbHNlCitzdGF0aWMgaW50IGZ0cmFjZV9tb2R1bGVfbm90aWZ5KHN0cnVjdCBub3RpZmllcl9ibG9jayAqc2VsZiwKKwkJCQl1bnNpZ25lZCBsb25nIHZhbCwgdm9pZCAqZGF0YSkKK3sKKwlyZXR1cm4gMDsKK30KKyNlbmRpZiAvKiBDT05GSUdfTU9EVUxFUyAqLworCitzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgZnRyYWNlX21vZHVsZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IGZ0cmFjZV9tb2R1bGVfbm90aWZ5LAorCS5wcmlvcml0eSA9IDAsCit9OworCiBleHRlcm4gdW5zaWduZWQgbG9uZyBfX3N0YXJ0X21jb3VudF9sb2NbXTsKIGV4dGVybiB1bnNpZ25lZCBsb25nIF9fc3RvcF9tY291bnRfbG9jW107CiAKQEAgLTIyMzYsNiArMjg2OSwxMiBAQAogCQkJCSAgX19zdGFydF9tY291bnRfbG9jLAogCQkJCSAgX19zdG9wX21jb3VudF9sb2MpOwogCisJcmV0ID0gcmVnaXN0ZXJfbW9kdWxlX25vdGlmaWVyKCZmdHJhY2VfbW9kdWxlX25iKTsKKwlpZiAocmV0KQorCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gcmVnaXN0ZXIgdHJhY2UgZnRyYWNlIG1vZHVsZSBub3RpZmllclxuIik7CisKKwlzZXRfZnRyYWNlX2Vhcmx5X2ZpbHRlcnMoKTsKKwogCXJldHVybjsKICBmYWlsZWQ6CiAJZnRyYWNlX2Rpc2FibGVkID0gMTsKQEAgLTI0MTcsNyArMzA1Niw2IEBACiBzdGF0aWMgX19pbml0IGludCBmdHJhY2VfaW5pdF9kZWJ1Z2ZzKHZvaWQpCiB7CiAJc3RydWN0IGRlbnRyeSAqZF90cmFjZXI7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7CiAKIAlkX3RyYWNlciA9IHRyYWNpbmdfaW5pdF9kZW50cnkoKTsKIAlpZiAoIWRfdHJhY2VyKQpAQCAtMjQyNSwxMSArMzA2MywxMSBAQAogCiAJZnRyYWNlX2luaXRfZHluX2RlYnVnZnMoZF90cmFjZXIpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzZXRfZnRyYWNlX3BpZCIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICBOVUxMLCAmZnRyYWNlX3BpZF9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIidzZXRfZnRyYWNlX3BpZCcgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJzZXRfZnRyYWNlX3BpZCIsIDA2NDQsIGRfdHJhY2VyLAorCQkJICAgIE5VTEwsICZmdHJhY2VfcGlkX2ZvcHMpOworCisJZnRyYWNlX3Byb2ZpbGVfZGVidWdmcyhkX3RyYWNlcik7CisKIAlyZXR1cm4gMDsKIH0KIGZzX2luaXRjYWxsKGZ0cmFjZV9pbml0X2RlYnVnZnMpOwpAQCAtMjUzOCw3ICszMTc2LDcgQEAKIAogI2lmZGVmIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIKIAotc3RhdGljIGF0b21pY190IGZ0cmFjZV9ncmFwaF9hY3RpdmU7CitzdGF0aWMgaW50IGZ0cmFjZV9ncmFwaF9hY3RpdmU7CiBzdGF0aWMgc3RydWN0IG5vdGlmaWVyX2Jsb2NrIGZ0cmFjZV9zdXNwZW5kX25vdGlmaWVyOwogCiBpbnQgZnRyYWNlX2dyYXBoX2VudHJ5X3N0dWIoc3RydWN0IGZ0cmFjZV9ncmFwaF9lbnQgKnRyYWNlKQpAQCAtMjU4MCwxMiArMzIxOCwxMiBAQAogCQl9CiAKIAkJaWYgKHQtPnJldF9zdGFjayA9PSBOVUxMKSB7Ci0JCQl0LT5jdXJyX3JldF9zdGFjayA9IC0xOwotCQkJLyogTWFrZSBzdXJlIElSUXMgc2VlIHRoZSAtMSBmaXJzdDogKi8KLQkJCWJhcnJpZXIoKTsKLQkJCXQtPnJldF9zdGFjayA9IHJldF9zdGFja19saXN0W3N0YXJ0KytdOwogCQkJYXRvbWljX3NldCgmdC0+dHJhY2luZ19ncmFwaF9wYXVzZSwgMCk7CiAJCQlhdG9taWNfc2V0KCZ0LT50cmFjZV9vdmVycnVuLCAwKTsKKwkJCXQtPmN1cnJfcmV0X3N0YWNrID0gLTE7CisJCQkvKiBNYWtlIHN1cmUgdGhlIHRhc2tzIHNlZSB0aGUgLTEgZmlyc3Q6ICovCisJCQlzbXBfd21iKCk7CisJCQl0LT5yZXRfc3RhY2sgPSByZXRfc3RhY2tfbGlzdFtzdGFydCsrXTsKIAkJfQogCX0gd2hpbGVfZWFjaF90aHJlYWQoZywgdCk7CiAKQEAgLTI2NDMsOCArMzI4MSwxMCBAQAogCQlyZXR1cm4gLUVOT01FTTsKIAogCS8qIFRoZSBjcHVfYm9vdCBpbml0X3Rhc2stPnJldF9zdGFjayB3aWxsIG5ldmVyIGJlIGZyZWVkICovCi0JZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCi0JCWZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soaWRsZV90YXNrKGNwdSkpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWlmICghaWRsZV90YXNrKGNwdSktPnJldF9zdGFjaykKKwkJCWZ0cmFjZV9ncmFwaF9pbml0X3Rhc2soaWRsZV90YXNrKGNwdSkpOworCX0KIAogCWRvIHsKIAkJcmV0ID0gYWxsb2NfcmV0c3RhY2tfdGFza2xpc3QocmV0X3N0YWNrX2xpc3QpOwpAQCAtMjY5MCw3ICszMzMwLDcgQEAKIAltdXRleF9sb2NrKCZmdHJhY2VfbG9jayk7CiAKIAkvKiB3ZSBjdXJyZW50bHkgYWxsb3cgb25seSBvbmUgdHJhY2VyIHJlZ2lzdGVyZWQgYXQgYSB0aW1lICovCi0JaWYgKGF0b21pY19yZWFkKCZmdHJhY2VfZ3JhcGhfYWN0aXZlKSkgeworCWlmIChmdHJhY2VfZ3JhcGhfYWN0aXZlKSB7CiAJCXJldCA9IC1FQlVTWTsKIAkJZ290byBvdXQ7CiAJfQpAQCAtMjY5OCwxMCArMzMzOCwxMCBAQAogCWZ0cmFjZV9zdXNwZW5kX25vdGlmaWVyLm5vdGlmaWVyX2NhbGwgPSBmdHJhY2Vfc3VzcGVuZF9ub3RpZmllcl9jYWxsOwogCXJlZ2lzdGVyX3BtX25vdGlmaWVyKCZmdHJhY2Vfc3VzcGVuZF9ub3RpZmllcik7CiAKLQlhdG9taWNfaW5jKCZmdHJhY2VfZ3JhcGhfYWN0aXZlKTsKKwlmdHJhY2VfZ3JhcGhfYWN0aXZlKys7CiAJcmV0ID0gc3RhcnRfZ3JhcGhfdHJhY2luZygpOwogCWlmIChyZXQpIHsKLQkJYXRvbWljX2RlYygmZnRyYWNlX2dyYXBoX2FjdGl2ZSk7CisJCWZ0cmFjZV9ncmFwaF9hY3RpdmUtLTsKIAkJZ290byBvdXQ7CiAJfQogCkBAIC0yNzE5LDEwICszMzU5LDEwIEBACiB7CiAJbXV0ZXhfbG9jaygmZnRyYWNlX2xvY2spOwogCi0JaWYgKCF1bmxpa2VseShhdG9taWNfcmVhZCgmZnRyYWNlX2dyYXBoX2FjdGl2ZSkpKQorCWlmICh1bmxpa2VseSghZnRyYWNlX2dyYXBoX2FjdGl2ZSkpCiAJCWdvdG8gb3V0OwogCi0JYXRvbWljX2RlYygmZnRyYWNlX2dyYXBoX2FjdGl2ZSk7CisJZnRyYWNlX2dyYXBoX2FjdGl2ZS0tOwogCXVucmVnaXN0ZXJfdHJhY2Vfc2NoZWRfc3dpdGNoKGZ0cmFjZV9ncmFwaF9wcm9iZV9zY2hlZF9zd2l0Y2gpOwogCWZ0cmFjZV9ncmFwaF9yZXR1cm4gPSAodHJhY2VfZnVuY19ncmFwaF9yZXRfdClmdHJhY2Vfc3R1YjsKIAlmdHJhY2VfZ3JhcGhfZW50cnkgPSBmdHJhY2VfZ3JhcGhfZW50cnlfc3R1YjsKQEAgLTI3MzYsMTggKzMzNzYsMjUgQEAKIC8qIEFsbG9jYXRlIGEgcmV0dXJuIHN0YWNrIGZvciBuZXdseSBjcmVhdGVkIHRhc2sgKi8KIHZvaWQgZnRyYWNlX2dyYXBoX2luaXRfdGFzayhzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpCiB7Ci0JaWYgKGF0b21pY19yZWFkKCZmdHJhY2VfZ3JhcGhfYWN0aXZlKSkgewotCQl0LT5yZXRfc3RhY2sgPSBrbWFsbG9jKEZUUkFDRV9SRVRGVU5DX0RFUFRICisJLyogTWFrZSBzdXJlIHdlIGRvIG5vdCB1c2UgdGhlIHBhcmVudCByZXRfc3RhY2sgKi8KKwl0LT5yZXRfc3RhY2sgPSBOVUxMOworCisJaWYgKGZ0cmFjZV9ncmFwaF9hY3RpdmUpIHsKKwkJc3RydWN0IGZ0cmFjZV9yZXRfc3RhY2sgKnJldF9zdGFjazsKKworCQlyZXRfc3RhY2sgPSBrbWFsbG9jKEZUUkFDRV9SRVRGVU5DX0RFUFRICiAJCQkJKiBzaXplb2Yoc3RydWN0IGZ0cmFjZV9yZXRfc3RhY2spLAogCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoIXQtPnJldF9zdGFjaykKKwkJaWYgKCFyZXRfc3RhY2spCiAJCQlyZXR1cm47CiAJCXQtPmN1cnJfcmV0X3N0YWNrID0gLTE7CiAJCWF0b21pY19zZXQoJnQtPnRyYWNpbmdfZ3JhcGhfcGF1c2UsIDApOwogCQlhdG9taWNfc2V0KCZ0LT50cmFjZV9vdmVycnVuLCAwKTsKIAkJdC0+ZnRyYWNlX3RpbWVzdGFtcCA9IDA7Ci0JfSBlbHNlCi0JCXQtPnJldF9zdGFjayA9IE5VTEw7CisJCS8qIG1ha2UgY3Vycl9yZXRfc3RhY2sgdmlzYWJsZSBiZWZvcmUgd2UgYWRkIHRoZSByZXRfc3RhY2sgKi8KKwkJc21wX3dtYigpOworCQl0LT5yZXRfc3RhY2sgPSByZXRfc3RhY2s7CisJfQogfQogCiB2b2lkIGZ0cmFjZV9ncmFwaF9leGl0X3Rhc2soc3RydWN0IHRhc2tfc3RydWN0ICp0KQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL2ttZW10cmFjZS5jIGIva2VybmVsL3RyYWNlL2ttZW10cmFjZS5jCmluZGV4IDUwMTFmNGQuLjg2Y2RmNjcgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9rbWVtdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2Uva21lbXRyYWNlLmMKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlIDxsaW51eC9kY2FjaGUuaD4KICNpbmNsdWRlIDxsaW51eC9mcy5oPgogCi0jaW5jbHVkZSA8dHJhY2Uva21lbXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAKICNpbmNsdWRlICJ0cmFjZV9vdXRwdXQuaCIKICNpbmNsdWRlICJ0cmFjZS5oIgpAQCAtNDIsNiArNDIsNyBAQAogCQkJCSAgIGdmcF90IGdmcF9mbGFncywKIAkJCQkgICBpbnQgbm9kZSkKIHsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfa21lbV9hbGxvYzsKIAlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyID0ga21lbXRyYWNlX2FycmF5OwogCXN0cnVjdCBrbWVtdHJhY2VfYWxsb2NfZW50cnkgKmVudHJ5OwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CkBAIC02Miw3ICs2Myw4IEBACiAJZW50cnktPmdmcF9mbGFncwk9IGdmcF9mbGFnczsKIAllbnRyeS0+bm9kZQkJPSBub2RlOwogCi0JcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CisJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgdHItPmJ1ZmZlciwgZXZlbnQpKQorCQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKIAogCXRyYWNlX3dha2VfdXAoKTsKIH0KQEAgLTcxLDYgKzczLDcgQEAKIAkJCQkgIHVuc2lnbmVkIGxvbmcgY2FsbF9zaXRlLAogCQkJCSAgY29uc3Qgdm9pZCAqcHRyKQogeworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9rbWVtX2ZyZWU7CiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGttZW10cmFjZV9hcnJheTsKIAlzdHJ1Y3Qga21lbXRyYWNlX2ZyZWVfZW50cnkgKmVudHJ5OwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CkBAIC04Niw3ICs4OSw4IEBACiAJZW50cnktPmNhbGxfc2l0ZQk9IGNhbGxfc2l0ZTsKIAllbnRyeS0+cHRyCQk9IHB0cjsKIAotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CiAKIAl0cmFjZV93YWtlX3VwKCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvcmluZ19idWZmZXIuYyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCmluZGV4IDk2MGNiZjQuLjJlNjQyYjIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCisrKyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlci5jCkBAIC0yMiw2ICsyMiwyOCBAQAogI2luY2x1ZGUgInRyYWNlLmgiCiAKIC8qCisgKiBUaGUgcmluZyBidWZmZXIgaGVhZGVyIGlzIHNwZWNpYWwuIFdlIG11c3QgbWFudWFsbHkgdXAga2VlcCBpdC4KKyAqLworaW50IHJpbmdfYnVmZmVyX3ByaW50X2VudHJ5X2hlYWRlcihzdHJ1Y3QgdHJhY2Vfc2VxICpzKQoreworCWludCByZXQ7CisKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICIjIGNvbXByZXNzZWQgZW50cnkgaGVhZGVyXG4iKTsKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdHR5cGVfbGVuICAgIDogICAgNSBiaXRzXG4iKTsKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdHRpbWVfZGVsdGEgIDogICAyNyBiaXRzXG4iKTsKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdGFycmF5ICAgICAgIDogICAzMiBiaXRzXG4iKTsKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcbiIpOworCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0cGFkZGluZyAgICAgOiB0eXBlID09ICVkXG4iLAorCQkJICAgICAgIFJJTkdCVUZfVFlQRV9QQURESU5HKTsKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdHRpbWVfZXh0ZW5kIDogdHlwZSA9PSAlZFxuIiwKKwkJCSAgICAgICBSSU5HQlVGX1RZUEVfVElNRV9FWFRFTkQpOworCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZGF0YSBtYXggdHlwZV9sZW4gID09ICVkXG4iLAorCQkJICAgICAgIFJJTkdCVUZfVFlQRV9EQVRBX1RZUEVfTEVOX01BWCk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgogICogVGhlIHJpbmcgYnVmZmVyIGlzIG1hZGUgdXAgb2YgYSBsaXN0IG9mIHBhZ2VzLiBBIHNlcGFyYXRlIGxpc3Qgb2YgcGFnZXMgaXMKICAqIGFsbG9jYXRlZCBmb3IgZWFjaCBDUFUuIEEgd3JpdGVyIG1heSBvbmx5IHdyaXRlIHRvIGEgYnVmZmVyIHRoYXQgaXMKICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgQ1BVIGl0IGlzIGN1cnJlbnRseSBleGVjdXRpbmcgb24uICBBIHJlYWRlciBtYXkgcmVhZApAQCAtMTgyLDcgKzIwNCwxMCBAQAogCiAjZGVmaW5lIFJCX0VWTlRfSERSX1NJWkUgKG9mZnNldG9mKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCwgYXJyYXkpKQogI2RlZmluZSBSQl9BTElHTk1FTlQJCTRVCi0jZGVmaW5lIFJCX01BWF9TTUFMTF9EQVRBCTI4CisjZGVmaW5lIFJCX01BWF9TTUFMTF9EQVRBCShSQl9BTElHTk1FTlQgKiBSSU5HQlVGX1RZUEVfREFUQV9UWVBFX0xFTl9NQVgpCisKKy8qIGRlZmluZSBSSU5HQlVGX1RZUEVfREFUQSBmb3IgJ2Nhc2UgUklOR0JVRl9UWVBFX0RBVEE6JyAqLworI2RlZmluZSBSSU5HQlVGX1RZUEVfREFUQSAwIC4uLiBSSU5HQlVGX1RZUEVfREFUQV9UWVBFX0xFTl9NQVgKIAogZW51bSB7CiAJUkJfTEVOX1RJTUVfRVhURU5EID0gOCwKQEAgLTE5MSw0OCArMjE2LDI4IEBACiAKIHN0YXRpYyBpbmxpbmUgaW50IHJiX251bGxfZXZlbnQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKIHsKLQlyZXR1cm4gZXZlbnQtPnR5cGUgPT0gUklOR0JVRl9UWVBFX1BBRERJTkcgJiYgZXZlbnQtPnRpbWVfZGVsdGEgPT0gMDsKKwlyZXR1cm4gZXZlbnQtPnR5cGVfbGVuID09IFJJTkdCVUZfVFlQRV9QQURESU5HCisJCQkmJiBldmVudC0+dGltZV9kZWx0YSA9PSAwOwogfQogCiBzdGF0aWMgaW5saW5lIGludCByYl9kaXNjYXJkZWRfZXZlbnQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKIHsKLQlyZXR1cm4gZXZlbnQtPnR5cGUgPT0gUklOR0JVRl9UWVBFX1BBRERJTkcgJiYgZXZlbnQtPnRpbWVfZGVsdGE7CisJcmV0dXJuIGV2ZW50LT50eXBlX2xlbiA9PSBSSU5HQlVGX1RZUEVfUEFERElORyAmJiBldmVudC0+dGltZV9kZWx0YTsKIH0KIAogc3RhdGljIHZvaWQgcmJfZXZlbnRfc2V0X3BhZGRpbmcoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKIHsKLQlldmVudC0+dHlwZSA9IFJJTkdCVUZfVFlQRV9QQURESU5HOworCWV2ZW50LT50eXBlX2xlbiA9IFJJTkdCVUZfVFlQRV9QQURESU5HOwogCWV2ZW50LT50aW1lX2RlbHRhID0gMDsKIH0KIAotLyoqCi0gKiByaW5nX2J1ZmZlcl9ldmVudF9kaXNjYXJkIC0gZGlzY2FyZCBhbiBldmVudCBpbiB0aGUgcmluZyBidWZmZXIKLSAqIEBidWZmZXI6IHRoZSByaW5nIGJ1ZmZlcgotICogQGV2ZW50OiB0aGUgZXZlbnQgdG8gZGlzY2FyZAotICoKLSAqIFNvbWV0aW1lcyBhIGV2ZW50IHRoYXQgaXMgaW4gdGhlIHJpbmcgYnVmZmVyIG5lZWRzIHRvIGJlIGlnbm9yZWQuCi0gKiBUaGlzIGZ1bmN0aW9uIGxldHMgdGhlIHVzZXIgZGlzY2FyZCBhbiBldmVudCBpbiB0aGUgcmluZyBidWZmZXIKLSAqIGFuZCB0aGVuIHRoYXQgZXZlbnQgd2lsbCBub3QgYmUgcmVhZCBsYXRlci4KLSAqCi0gKiBOb3RlLCBpdCBpcyB1cCB0byB0aGUgdXNlciB0byBiZSBjYXJlZnVsIHdpdGggdGhpcywgYW5kIHByb3RlY3QKLSAqIGFnYWluc3QgcmFjZXMuIElmIHRoZSB1c2VyIGRpc2NhcmRzIGFuIGV2ZW50IHRoYXQgaGFzIGJlZW4gY29uc3VtZWQKLSAqIGl0IGlzIHBvc3NpYmxlIHRoYXQgaXQgY291bGQgY29ycnVwdCB0aGUgcmluZyBidWZmZXIuCi0gKi8KLXZvaWQgcmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQotewotCWV2ZW50LT50eXBlID0gUklOR0JVRl9UWVBFX1BBRERJTkc7Ci0JLyogdGltZSBkZWx0YSBtdXN0IGJlIG5vbiB6ZXJvICovCi0JaWYgKCFldmVudC0+dGltZV9kZWx0YSkKLQkJZXZlbnQtPnRpbWVfZGVsdGEgPSAxOwotfQotCiBzdGF0aWMgdW5zaWduZWQKIHJiX2V2ZW50X2RhdGFfbGVuZ3RoKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7CiAJdW5zaWduZWQgbGVuZ3RoOwogCi0JaWYgKGV2ZW50LT5sZW4pCi0JCWxlbmd0aCA9IGV2ZW50LT5sZW4gKiBSQl9BTElHTk1FTlQ7CisJaWYgKGV2ZW50LT50eXBlX2xlbikKKwkJbGVuZ3RoID0gZXZlbnQtPnR5cGVfbGVuICogUkJfQUxJR05NRU5UOwogCWVsc2UKIAkJbGVuZ3RoID0gZXZlbnQtPmFycmF5WzBdOwogCXJldHVybiBsZW5ndGggKyBSQl9FVk5UX0hEUl9TSVpFOwpAQCAtMjQyLDEyICsyNDcsMTIgQEAKIHN0YXRpYyB1bnNpZ25lZAogcmJfZXZlbnRfbGVuZ3RoKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7Ci0Jc3dpdGNoIChldmVudC0+dHlwZSkgeworCXN3aXRjaCAoZXZlbnQtPnR5cGVfbGVuKSB7CiAJY2FzZSBSSU5HQlVGX1RZUEVfUEFERElORzoKIAkJaWYgKHJiX251bGxfZXZlbnQoZXZlbnQpKQogCQkJLyogdW5kZWZpbmVkICovCiAJCQlyZXR1cm4gLTE7Ci0JCXJldHVybiByYl9ldmVudF9kYXRhX2xlbmd0aChldmVudCk7CisJCXJldHVybiAgZXZlbnQtPmFycmF5WzBdICsgUkJfRVZOVF9IRFJfU0laRTsKIAogCWNhc2UgUklOR0JVRl9UWVBFX1RJTUVfRVhURU5EOgogCQlyZXR1cm4gUkJfTEVOX1RJTUVfRVhURU5EOwpAQCAtMjcxLDcgKzI3Niw3IEBACiB1bnNpZ25lZCByaW5nX2J1ZmZlcl9ldmVudF9sZW5ndGgoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKIHsKIAl1bnNpZ25lZCBsZW5ndGggPSByYl9ldmVudF9sZW5ndGgoZXZlbnQpOwotCWlmIChldmVudC0+dHlwZSAhPSBSSU5HQlVGX1RZUEVfREFUQSkKKwlpZiAoZXZlbnQtPnR5cGVfbGVuID4gUklOR0JVRl9UWVBFX0RBVEFfVFlQRV9MRU5fTUFYKQogCQlyZXR1cm4gbGVuZ3RoOwogCWxlbmd0aCAtPSBSQl9FVk5UX0hEUl9TSVpFOwogCWlmIChsZW5ndGggPiBSQl9NQVhfU01BTExfREFUQSArIHNpemVvZihldmVudC0+YXJyYXlbMF0pKQpAQCAtMjg0LDkgKzI4OSw5IEBACiBzdGF0aWMgdm9pZCAqCiByYl9ldmVudF9kYXRhKHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7Ci0JQlVHX09OKGV2ZW50LT50eXBlICE9IFJJTkdCVUZfVFlQRV9EQVRBKTsKKwlCVUdfT04oZXZlbnQtPnR5cGVfbGVuID4gUklOR0JVRl9UWVBFX0RBVEFfVFlQRV9MRU5fTUFYKTsKIAkvKiBJZiBsZW5ndGggaXMgaW4gbGVuIGZpZWxkLCB0aGVuIGFycmF5WzBdIGhhcyB0aGUgZGF0YSAqLwotCWlmIChldmVudC0+bGVuKQorCWlmIChldmVudC0+dHlwZV9sZW4pCiAJCXJldHVybiAodm9pZCAqKSZldmVudC0+YXJyYXlbMF07CiAJLyogT3RoZXJ3aXNlIGxlbmd0aCBpcyBpbiBhcnJheVswXSBhbmQgYXJyYXlbMV0gaGFzIHRoZSBkYXRhICovCiAJcmV0dXJuICh2b2lkICopJmV2ZW50LT5hcnJheVsxXTsKQEAgLTMxNiw5ICszMjEsMTAgQEAKIH07CiAKIHN0cnVjdCBidWZmZXJfcGFnZSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OwkJLyogbGlzdCBvZiBidWZmZXIgcGFnZXMgKi8KIAlsb2NhbF90CQkgd3JpdGU7CQkvKiBpbmRleCBmb3IgbmV4dCB3cml0ZSAqLwogCXVuc2lnbmVkCSByZWFkOwkJLyogaW5kZXggZm9yIG5leHQgcmVhZCAqLwotCXN0cnVjdCBsaXN0X2hlYWQgbGlzdDsJCS8qIGxpc3Qgb2YgZnJlZSBwYWdlcyAqLworCWxvY2FsX3QJCSBlbnRyaWVzOwkvKiBlbnRyaWVzIG9uIHRoaXMgcGFnZSAqLwogCXN0cnVjdCBidWZmZXJfZGF0YV9wYWdlICpwYWdlOwkvKiBBY3R1YWwgZGF0YSBwYWdlICovCiB9OwogCkBAIC0zNjEsNiArMzY3LDM0IEBACiAKICNkZWZpbmUgQlVGX1BBR0VfU0laRSAoUEFHRV9TSVpFIC0gQlVGX1BBR0VfSERSX1NJWkUpCiAKKy8qIE1heCBwYXlsb2FkIGlzIEJVRl9QQUdFX1NJWkUgLSBoZWFkZXIgKDhieXRlcykgKi8KKyNkZWZpbmUgQlVGX01BWF9EQVRBX1NJWkUgKEJVRl9QQUdFX1NJWkUgLSAoc2l6ZW9mKHUzMikgKiAyKSkKKworLyogTWF4IG51bWJlciBvZiB0aW1lc3RhbXBzIHRoYXQgY2FuIGZpdCBvbiBhIHBhZ2UgKi8KKyNkZWZpbmUgUkJfVElNRVNUQU1QU19QRVJfUEFHRQkoQlVGX1BBR0VfU0laRSAvIFJCX0xFTl9USU1FX1NUQU1QKQorCitpbnQgcmluZ19idWZmZXJfcHJpbnRfcGFnZV9oZWFkZXIoc3RydWN0IHRyYWNlX3NlcSAqcykKK3sKKwlzdHJ1Y3QgYnVmZmVyX2RhdGFfcGFnZSBmaWVsZDsKKwlpbnQgcmV0OworCisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZDogdTY0IHRpbWVzdGFtcDtcdCIKKwkJCSAgICAgICAib2Zmc2V0OjA7XHRzaXplOiV1O1xuIiwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KXNpemVvZihmaWVsZC50aW1lX3N0YW1wKSk7CisKKwlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdGZpZWxkOiBsb2NhbF90IGNvbW1pdDtcdCIKKwkJCSAgICAgICAib2Zmc2V0OiV1O1x0c2l6ZToldTtcbiIsCisJCQkgICAgICAgKHVuc2lnbmVkIGludClvZmZzZXRvZih0eXBlb2YoZmllbGQpLCBjb21taXQpLAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpc2l6ZW9mKGZpZWxkLmNvbW1pdCkpOworCisJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZDogY2hhciBkYXRhO1x0IgorCQkJICAgICAgICJvZmZzZXQ6JXU7XHRzaXplOiV1O1xuIiwKKwkJCSAgICAgICAodW5zaWduZWQgaW50KW9mZnNldG9mKHR5cGVvZihmaWVsZCksIGRhdGEpLAorCQkJICAgICAgICh1bnNpZ25lZCBpbnQpQlVGX1BBR0VfU0laRSk7CisKKwlyZXR1cm4gcmV0OworfQorCiAvKgogICogaGVhZF9wYWdlID09IHRhaWxfcGFnZSAmJiBoZWFkID09IHRhaWwgdGhlbiBidWZmZXIgaXMgZW1wdHkuCiAgKi8KQEAgLTM3NSw4ICs0MDksMTEgQEAKIAlzdHJ1Y3QgYnVmZmVyX3BhZ2UJCSp0YWlsX3BhZ2U7CS8qIHdyaXRlIHRvIHRhaWwgKi8KIAlzdHJ1Y3QgYnVmZmVyX3BhZ2UJCSpjb21taXRfcGFnZTsJLyogY29tbWl0dGVkIHBhZ2VzICovCiAJc3RydWN0IGJ1ZmZlcl9wYWdlCQkqcmVhZGVyX3BhZ2U7CisJdW5zaWduZWQgbG9uZwkJCW5taV9kcm9wcGVkOworCXVuc2lnbmVkIGxvbmcJCQljb21taXRfb3ZlcnJ1bjsKIAl1bnNpZ25lZCBsb25nCQkJb3ZlcnJ1bjsKLQl1bnNpZ25lZCBsb25nCQkJZW50cmllczsKKwl1bnNpZ25lZCBsb25nCQkJcmVhZDsKKwlsb2NhbF90CQkJCWVudHJpZXM7CiAJdTY0CQkJCXdyaXRlX3N0YW1wOwogCXU2NAkJCQlyZWFkX3N0YW1wOwogCWF0b21pY190CQkJcmVjb3JkX2Rpc2FibGVkOwpAQCAtMzg5LDYgKzQyNiw4IEBACiAJYXRvbWljX3QJCQlyZWNvcmRfZGlzYWJsZWQ7CiAJY3B1bWFza192YXJfdAkJCWNwdW1hc2s7CiAKKwlzdHJ1Y3QgbG9ja19jbGFzc19rZXkJCSpyZWFkZXJfbG9ja19rZXk7CisKIAlzdHJ1Y3QgbXV0ZXgJCQltdXRleDsKIAogCXN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1CSoqYnVmZmVyczsKQEAgLTQyMCwxMyArNDU5LDE4IEBACiAvKiBVcCB0aGlzIGlmIHlvdSB3YW50IHRvIHRlc3QgdGhlIFRJTUVfRVhURU5UUyBhbmQgbm9ybWFsaXphdGlvbiAqLwogI2RlZmluZSBERUJVR19TSElGVCAwCiAKK3N0YXRpYyBpbmxpbmUgdTY0IHJiX3RpbWVfc3RhbXAoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpCit7CisJLyogc2hpZnQgdG8gZGVidWcvdGVzdCBub3JtYWxpemF0aW9uIGFuZCBUSU1FX0VYVEVOVFMgKi8KKwlyZXR1cm4gYnVmZmVyLT5jbG9jaygpIDw8IERFQlVHX1NISUZUOworfQorCiB1NjQgcmluZ19idWZmZXJfdGltZV9zdGFtcChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwgaW50IGNwdSkKIHsKIAl1NjQgdGltZTsKIAogCXByZWVtcHRfZGlzYWJsZV9ub3RyYWNlKCk7Ci0JLyogc2hpZnQgdG8gZGVidWcvdGVzdCBub3JtYWxpemF0aW9uIGFuZCBUSU1FX0VYVEVOVFMgKi8KLQl0aW1lID0gYnVmZmVyLT5jbG9jaygpIDw8IERFQlVHX1NISUZUOworCXRpbWUgPSByYl90aW1lX3N0YW1wKGJ1ZmZlciwgY3B1KTsKIAlwcmVlbXB0X2VuYWJsZV9ub19yZXNjaGVkX25vdHJhY2UoKTsKIAogCXJldHVybiB0aW1lOwpAQCAtNTIzLDYgKzU2Nyw3IEBACiAJY3B1X2J1ZmZlci0+Y3B1ID0gY3B1OwogCWNwdV9idWZmZXItPmJ1ZmZlciA9IGJ1ZmZlcjsKIAlzcGluX2xvY2tfaW5pdCgmY3B1X2J1ZmZlci0+cmVhZGVyX2xvY2spOworCWxvY2tkZXBfc2V0X2NsYXNzKCZjcHVfYnVmZmVyLT5yZWFkZXJfbG9jaywgYnVmZmVyLT5yZWFkZXJfbG9ja19rZXkpOwogCWNwdV9idWZmZXItPmxvY2sgPSAocmF3X3NwaW5sb2NrX3QpX19SQVdfU1BJTl9MT0NLX1VOTE9DS0VEOwogCUlOSVRfTElTVF9IRUFEKCZjcHVfYnVmZmVyLT5wYWdlcyk7CiAKQEAgLTU5Myw3ICs2MzgsOCBAQAogICogd2hlbiB0aGUgYnVmZmVyIHdyYXBzLiBJZiB0aGlzIGZsYWcgaXMgbm90IHNldCwgdGhlIGJ1ZmZlciB3aWxsCiAgKiBkcm9wIGRhdGEgd2hlbiB0aGUgdGFpbCBoaXRzIHRoZSBoZWFkLgogICovCi1zdHJ1Y3QgcmluZ19idWZmZXIgKnJpbmdfYnVmZmVyX2FsbG9jKHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgZmxhZ3MpCitzdHJ1Y3QgcmluZ19idWZmZXIgKl9fcmluZ19idWZmZXJfYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBmbGFncywKKwkJCQkJc3RydWN0IGxvY2tfY2xhc3Nfa2V5ICprZXkpCiB7CiAJc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXI7CiAJaW50IGJzaXplOwpAQCAtNjE2LDYgKzY2Miw3IEBACiAJYnVmZmVyLT5wYWdlcyA9IERJVl9ST1VORF9VUChzaXplLCBCVUZfUEFHRV9TSVpFKTsKIAlidWZmZXItPmZsYWdzID0gZmxhZ3M7CiAJYnVmZmVyLT5jbG9jayA9IHRyYWNlX2Nsb2NrX2xvY2FsOworCWJ1ZmZlci0+cmVhZGVyX2xvY2tfa2V5ID0ga2V5OwogCiAJLyogbmVlZCBhdCBsZWFzdCB0d28gcGFnZXMgKi8KIAlpZiAoYnVmZmVyLT5wYWdlcyA9PSAxKQpAQCAtNjczLDcgKzcyMCw3IEBACiAJa2ZyZWUoYnVmZmVyKTsKIAlyZXR1cm4gTlVMTDsKIH0KLUVYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2FsbG9jKTsKK0VYUE9SVF9TWU1CT0xfR1BMKF9fcmluZ19idWZmZXJfYWxsb2MpOwogCiAvKioKICAqIHJpbmdfYnVmZmVyX2ZyZWUgLSBmcmVlIGEgcmluZyBidWZmZXIuCkBAIC05NDcsMzEgKzk5NCw2IEBACiAJcmV0dXJuIHJiX3BhZ2VfY29tbWl0KGNwdV9idWZmZXItPmhlYWRfcGFnZSk7CiB9CiAKLS8qCi0gKiBXaGVuIHRoZSB0YWlsIGhpdHMgdGhlIGhlYWQgYW5kIHRoZSBidWZmZXIgaXMgaW4gb3ZlcndyaXRlIG1vZGUsCi0gKiB0aGUgaGVhZCBqdW1wcyB0byB0aGUgbmV4dCBwYWdlIGFuZCBhbGwgY29udGVudCBvbiB0aGUgcHJldmlvdXMKLSAqIHBhZ2UgaXMgZGlzY2FyZGVkLiBCdXQgYmVmb3JlIGRvaW5nIHNvLCB3ZSB1cGRhdGUgdGhlIG92ZXJydW4KLSAqIHZhcmlhYmxlIG9mIHRoZSBidWZmZXIuCi0gKi8KLXN0YXRpYyB2b2lkIHJiX3VwZGF0ZV9vdmVyZmxvdyhzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlcikKLXsKLQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotCXVuc2lnbmVkIGxvbmcgaGVhZDsKLQotCWZvciAoaGVhZCA9IDA7IGhlYWQgPCByYl9oZWFkX3NpemUoY3B1X2J1ZmZlcik7Ci0JICAgICBoZWFkICs9IHJiX2V2ZW50X2xlbmd0aChldmVudCkpIHsKLQotCQlldmVudCA9IF9fcmJfcGFnZV9pbmRleChjcHVfYnVmZmVyLT5oZWFkX3BhZ2UsIGhlYWQpOwotCQlpZiAoUkJfV0FSTl9PTihjcHVfYnVmZmVyLCByYl9udWxsX2V2ZW50KGV2ZW50KSkpCi0JCQlyZXR1cm47Ci0JCS8qIE9ubHkgY291bnQgZGF0YSBlbnRyaWVzICovCi0JCWlmIChldmVudC0+dHlwZSAhPSBSSU5HQlVGX1RZUEVfREFUQSkKLQkJCWNvbnRpbnVlOwotCQljcHVfYnVmZmVyLT5vdmVycnVuKys7Ci0JCWNwdV9idWZmZXItPmVudHJpZXMtLTsKLQl9Ci19Ci0KIHN0YXRpYyBpbmxpbmUgdm9pZCByYl9pbmNfcGFnZShzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKIAkJCSAgICAgICBzdHJ1Y3QgYnVmZmVyX3BhZ2UgKipicGFnZSkKIHsKQEAgLTk5MSw3ICsxMDEzLDcgQEAKIAlyZXR1cm4gKGFkZHIgJiB+UEFHRV9NQVNLKSAtIChQQUdFX1NJWkUgLSBCVUZfUEFHRV9TSVpFKTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIGlubGluZSBpbnQKIHJiX2lzX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKIAkgICAgIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCiB7CkBAIC0xMTEwLDI4ICsxMTMyLDIxIEBACiByYl91cGRhdGVfZXZlbnQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCwKIAkJCSB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBsZW5ndGgpCiB7Ci0JZXZlbnQtPnR5cGUgPSB0eXBlOworCWV2ZW50LT50eXBlX2xlbiA9IHR5cGU7CiAKIAlzd2l0Y2ggKHR5cGUpIHsKIAogCWNhc2UgUklOR0JVRl9UWVBFX1BBRERJTkc6Ci0JCWJyZWFrOwotCiAJY2FzZSBSSU5HQlVGX1RZUEVfVElNRV9FWFRFTkQ6Ci0JCWV2ZW50LT5sZW4gPSBESVZfUk9VTkRfVVAoUkJfTEVOX1RJTUVfRVhURU5ELCBSQl9BTElHTk1FTlQpOwotCQlicmVhazsKLQogCWNhc2UgUklOR0JVRl9UWVBFX1RJTUVfU1RBTVA6Ci0JCWV2ZW50LT5sZW4gPSBESVZfUk9VTkRfVVAoUkJfTEVOX1RJTUVfU1RBTVAsIFJCX0FMSUdOTUVOVCk7CiAJCWJyZWFrOwogCi0JY2FzZSBSSU5HQlVGX1RZUEVfREFUQToKKwljYXNlIDA6CiAJCWxlbmd0aCAtPSBSQl9FVk5UX0hEUl9TSVpFOwotCQlpZiAobGVuZ3RoID4gUkJfTUFYX1NNQUxMX0RBVEEpIHsKLQkJCWV2ZW50LT5sZW4gPSAwOworCQlpZiAobGVuZ3RoID4gUkJfTUFYX1NNQUxMX0RBVEEpCiAJCQlldmVudC0+YXJyYXlbMF0gPSBsZW5ndGg7Ci0JCX0gZWxzZQotCQkJZXZlbnQtPmxlbiA9IERJVl9ST1VORF9VUChsZW5ndGgsIFJCX0FMSUdOTUVOVCk7CisJCWVsc2UKKwkJCWV2ZW50LT50eXBlX2xlbiA9IERJVl9ST1VORF9VUChsZW5ndGgsIFJCX0FMSUdOTUVOVCk7CiAJCWJyZWFrOwogCWRlZmF1bHQ6CiAJCUJVRygpOwpAQCAtMTE1NSwxNiArMTE3MCwxNDQgQEAKIAlyZXR1cm4gbGVuZ3RoOwogfQogCisKK3N0YXRpYyBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKgorcmJfbW92ZV90YWlsKHN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1ICpjcHVfYnVmZmVyLAorCSAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdGFpbCwKKwkgICAgIHN0cnVjdCBidWZmZXJfcGFnZSAqY29tbWl0X3BhZ2UsCisJICAgICBzdHJ1Y3QgYnVmZmVyX3BhZ2UgKnRhaWxfcGFnZSwgdTY0ICp0cykKK3sKKwlzdHJ1Y3QgYnVmZmVyX3BhZ2UgKm5leHRfcGFnZSwgKmhlYWRfcGFnZSwgKnJlYWRlcl9wYWdlOworCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyID0gY3B1X2J1ZmZlci0+YnVmZmVyOworCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CisJYm9vbCBsb2NrX3Rha2VuID0gZmFsc2U7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKworCW5leHRfcGFnZSA9IHRhaWxfcGFnZTsKKworCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsKKwkvKgorCSAqIFNpbmNlIHRoZSB3cml0ZSB0byB0aGUgYnVmZmVyIGlzIHN0aWxsIG5vdAorCSAqIGZ1bGx5IGxvY2tsZXNzLCB3ZSBtdXN0IGJlIGNhcmVmdWwgd2l0aCBOTUlzLgorCSAqIFRoZSBsb2NrcyBpbiB0aGUgd3JpdGVycyBhcmUgdGFrZW4gd2hlbiBhIHdyaXRlCisJICogY3Jvc3NlcyB0byBhIG5ldyBwYWdlLiBUaGUgbG9ja3MgcHJvdGVjdCBhZ2FpbnN0CisJICogcmFjZXMgd2l0aCB0aGUgcmVhZGVycyAodGhpcyB3aWxsIHNvb24gYmUgZml4ZWQKKwkgKiB3aXRoIGEgbG9ja2xlc3Mgc29sdXRpb24pLgorCSAqCisJICogQmVjYXVzZSB3ZSBjYW4gbm90IHByb3RlY3QgYWdhaW5zdCBOTUlzLCBhbmQgd2UKKwkgKiB3YW50IHRvIGtlZXAgdHJhY2VzIHJlZW50cmFudCwgd2UgbmVlZCB0byBtYW5hZ2UKKwkgKiB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBhcmUgaW4gYW4gTk1JLgorCSAqCisJICogTk1JcyBjYW4gaGFwcGVuIGFmdGVyIHdlIHRha2UgdGhlIGxvY2suCisJICogSWYgd2UgYXJlIGluIGFuIE5NSSwgb25seSB0YWtlIHRoZSBsb2NrCisJICogaWYgaXQgaXMgbm90IGFscmVhZHkgdGFrZW4uIE90aGVyd2lzZQorCSAqIHNpbXBseSBmYWlsLgorCSAqLworCWlmICh1bmxpa2VseShpbl9ubWkoKSkpIHsKKwkJaWYgKCFfX3Jhd19zcGluX3RyeWxvY2soJmNwdV9idWZmZXItPmxvY2spKSB7CisJCQljcHVfYnVmZmVyLT5ubWlfZHJvcHBlZCsrOworCQkJZ290byBvdXRfcmVzZXQ7CisJCX0KKwl9IGVsc2UKKwkJX19yYXdfc3Bpbl9sb2NrKCZjcHVfYnVmZmVyLT5sb2NrKTsKKworCWxvY2tfdGFrZW4gPSB0cnVlOworCisJcmJfaW5jX3BhZ2UoY3B1X2J1ZmZlciwgJm5leHRfcGFnZSk7CisKKwloZWFkX3BhZ2UgPSBjcHVfYnVmZmVyLT5oZWFkX3BhZ2U7CisJcmVhZGVyX3BhZ2UgPSBjcHVfYnVmZmVyLT5yZWFkZXJfcGFnZTsKKworCS8qIHdlIGdyYWJiZWQgdGhlIGxvY2sgYmVmb3JlIGluY3JlbWVudGluZyAqLworCWlmIChSQl9XQVJOX09OKGNwdV9idWZmZXIsIG5leHRfcGFnZSA9PSByZWFkZXJfcGFnZSkpCisJCWdvdG8gb3V0X3Jlc2V0OworCisJLyoKKwkgKiBJZiBmb3Igc29tZSByZWFzb24sIHdlIGhhZCBhbiBpbnRlcnJ1cHQgc3Rvcm0gdGhhdCBtYWRlCisJICogaXQgYWxsIHRoZSB3YXkgYXJvdW5kIHRoZSBidWZmZXIsIGJhaWwsIGFuZCB3YXJuCisJICogYWJvdXQgaXQuCisJICovCisJaWYgKHVubGlrZWx5KG5leHRfcGFnZSA9PSBjb21taXRfcGFnZSkpIHsKKwkJY3B1X2J1ZmZlci0+Y29tbWl0X292ZXJydW4rKzsKKwkJZ290byBvdXRfcmVzZXQ7CisJfQorCisJaWYgKG5leHRfcGFnZSA9PSBoZWFkX3BhZ2UpIHsKKwkJaWYgKCEoYnVmZmVyLT5mbGFncyAmIFJCX0ZMX09WRVJXUklURSkpCisJCQlnb3RvIG91dF9yZXNldDsKKworCQkvKiB0YWlsX3BhZ2UgaGFzIG5vdCBtb3ZlZCB5ZXQ/ICovCisJCWlmICh0YWlsX3BhZ2UgPT0gY3B1X2J1ZmZlci0+dGFpbF9wYWdlKSB7CisJCQkvKiBjb3VudCBvdmVyZmxvd3MgKi8KKwkJCWNwdV9idWZmZXItPm92ZXJydW4gKz0KKwkJCQlsb2NhbF9yZWFkKCZoZWFkX3BhZ2UtPmVudHJpZXMpOworCisJCQlyYl9pbmNfcGFnZShjcHVfYnVmZmVyLCAmaGVhZF9wYWdlKTsKKwkJCWNwdV9idWZmZXItPmhlYWRfcGFnZSA9IGhlYWRfcGFnZTsKKwkJCWNwdV9idWZmZXItPmhlYWRfcGFnZS0+cmVhZCA9IDA7CisJCX0KKwl9CisKKwkvKgorCSAqIElmIHRoZSB0YWlsIHBhZ2UgaXMgc3RpbGwgdGhlIHNhbWUgYXMgd2hhdCB3ZSB0aGluaworCSAqIGl0IGlzLCB0aGVuIGl0IGlzIHVwIHRvIHVzIHRvIHVwZGF0ZSB0aGUgdGFpbAorCSAqIHBvaW50ZXIuCisJICovCisJaWYgKHRhaWxfcGFnZSA9PSBjcHVfYnVmZmVyLT50YWlsX3BhZ2UpIHsKKwkJbG9jYWxfc2V0KCZuZXh0X3BhZ2UtPndyaXRlLCAwKTsKKwkJbG9jYWxfc2V0KCZuZXh0X3BhZ2UtPmVudHJpZXMsIDApOworCQlsb2NhbF9zZXQoJm5leHRfcGFnZS0+cGFnZS0+Y29tbWl0LCAwKTsKKwkJY3B1X2J1ZmZlci0+dGFpbF9wYWdlID0gbmV4dF9wYWdlOworCisJCS8qIHJlcmVhZCB0aGUgdGltZSBzdGFtcCAqLworCQkqdHMgPSByYl90aW1lX3N0YW1wKGJ1ZmZlciwgY3B1X2J1ZmZlci0+Y3B1KTsKKwkJY3B1X2J1ZmZlci0+dGFpbF9wYWdlLT5wYWdlLT50aW1lX3N0YW1wID0gKnRzOworCX0KKworCS8qCisJICogVGhlIGFjdHVhbCB0YWlsIHBhZ2UgaGFzIG1vdmVkIGZvcndhcmQuCisJICovCisJaWYgKHRhaWwgPCBCVUZfUEFHRV9TSVpFKSB7CisJCS8qIE1hcmsgdGhlIHJlc3Qgb2YgdGhlIHBhZ2Ugd2l0aCBwYWRkaW5nICovCisJCWV2ZW50ID0gX19yYl9wYWdlX2luZGV4KHRhaWxfcGFnZSwgdGFpbCk7CisJCXJiX2V2ZW50X3NldF9wYWRkaW5nKGV2ZW50KTsKKwl9CisKKwkvKiBTZXQgdGhlIHdyaXRlIGJhY2sgdG8gdGhlIHByZXZpb3VzIHNldHRpbmcgKi8KKwlsb2NhbF9zdWIobGVuZ3RoLCAmdGFpbF9wYWdlLT53cml0ZSk7CisKKwkvKgorCSAqIElmIHRoaXMgd2FzIGEgY29tbWl0IGVudHJ5IHRoYXQgZmFpbGVkLAorCSAqIGluY3JlbWVudCB0aGF0IHRvbworCSAqLworCWlmICh0YWlsX3BhZ2UgPT0gY3B1X2J1ZmZlci0+Y29tbWl0X3BhZ2UgJiYKKwkgICAgdGFpbCA9PSByYl9jb21taXRfaW5kZXgoY3B1X2J1ZmZlcikpIHsKKwkJcmJfc2V0X2NvbW1pdF90b193cml0ZShjcHVfYnVmZmVyKTsKKwl9CisKKwlfX3Jhd19zcGluX3VubG9jaygmY3B1X2J1ZmZlci0+bG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJLyogZmFpbCBhbmQgbGV0IHRoZSBjYWxsZXIgdHJ5IGFnYWluICovCisJcmV0dXJuIEVSUl9QVFIoLUVBR0FJTik7CisKKyBvdXRfcmVzZXQ6CisJLyogcmVzZXQgd3JpdGUgKi8KKwlsb2NhbF9zdWIobGVuZ3RoLCAmdGFpbF9wYWdlLT53cml0ZSk7CisKKwlpZiAobGlrZWx5KGxvY2tfdGFrZW4pKQorCQlfX3Jhd19zcGluX3VubG9jaygmY3B1X2J1ZmZlci0+bG9jayk7CisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCXJldHVybiBOVUxMOworfQorCiBzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICoKIF9fcmJfcmVzZXJ2ZV9uZXh0KHN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1ICpjcHVfYnVmZmVyLAogCQkgIHVuc2lnbmVkIHR5cGUsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoLCB1NjQgKnRzKQogewotCXN0cnVjdCBidWZmZXJfcGFnZSAqdGFpbF9wYWdlLCAqaGVhZF9wYWdlLCAqcmVhZGVyX3BhZ2UsICpjb21taXRfcGFnZTsKLQl1bnNpZ25lZCBsb25nIHRhaWwsIHdyaXRlOwotCXN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyID0gY3B1X2J1ZmZlci0+YnVmZmVyOworCXN0cnVjdCBidWZmZXJfcGFnZSAqdGFpbF9wYWdlLCAqY29tbWl0X3BhZ2U7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKLQl1bnNpZ25lZCBsb25nIGZsYWdzOwotCWJvb2wgbG9ja190YWtlbiA9IGZhbHNlOworCXVuc2lnbmVkIGxvbmcgdGFpbCwgd3JpdGU7CiAKIAljb21taXRfcGFnZSA9IGNwdV9idWZmZXItPmNvbW1pdF9wYWdlOwogCS8qIHdlIGp1c3QgbmVlZCB0byBwcm90ZWN0IGFnYWluc3QgaW50ZXJydXB0cyAqLwpAQCAtMTE3NCwxMTIgKzEzMTcsOSBAQAogCXRhaWwgPSB3cml0ZSAtIGxlbmd0aDsKIAogCS8qIFNlZSBpZiB3ZSBzaG90IHBhc3MgdGhlIGVuZCBvZiB0aGlzIGJ1ZmZlciBwYWdlICovCi0JaWYgKHdyaXRlID4gQlVGX1BBR0VfU0laRSkgewotCQlzdHJ1Y3QgYnVmZmVyX3BhZ2UgKm5leHRfcGFnZSA9IHRhaWxfcGFnZTsKLQotCQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7Ci0JCS8qCi0JCSAqIFNpbmNlIHRoZSB3cml0ZSB0byB0aGUgYnVmZmVyIGlzIHN0aWxsIG5vdAotCQkgKiBmdWxseSBsb2NrbGVzcywgd2UgbXVzdCBiZSBjYXJlZnVsIHdpdGggTk1Jcy4KLQkJICogVGhlIGxvY2tzIGluIHRoZSB3cml0ZXJzIGFyZSB0YWtlbiB3aGVuIGEgd3JpdGUKLQkJICogY3Jvc3NlcyB0byBhIG5ldyBwYWdlLiBUaGUgbG9ja3MgcHJvdGVjdCBhZ2FpbnN0Ci0JCSAqIHJhY2VzIHdpdGggdGhlIHJlYWRlcnMgKHRoaXMgd2lsbCBzb29uIGJlIGZpeGVkCi0JCSAqIHdpdGggYSBsb2NrbGVzcyBzb2x1dGlvbikuCi0JCSAqCi0JCSAqIEJlY2F1c2Ugd2UgY2FuIG5vdCBwcm90ZWN0IGFnYWluc3QgTk1JcywgYW5kIHdlCi0JCSAqIHdhbnQgdG8ga2VlcCB0cmFjZXMgcmVlbnRyYW50LCB3ZSBuZWVkIHRvIG1hbmFnZQotCQkgKiB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBhcmUgaW4gYW4gTk1JLgotCQkgKgotCQkgKiBOTUlzIGNhbiBoYXBwZW4gYWZ0ZXIgd2UgdGFrZSB0aGUgbG9jay4KLQkJICogSWYgd2UgYXJlIGluIGFuIE5NSSwgb25seSB0YWtlIHRoZSBsb2NrCi0JCSAqIGlmIGl0IGlzIG5vdCBhbHJlYWR5IHRha2VuLiBPdGhlcndpc2UKLQkJICogc2ltcGx5IGZhaWwuCi0JCSAqLwotCQlpZiAodW5saWtlbHkoaW5fbm1pKCkpKSB7Ci0JCQlpZiAoIV9fcmF3X3NwaW5fdHJ5bG9jaygmY3B1X2J1ZmZlci0+bG9jaykpCi0JCQkJZ290byBvdXRfcmVzZXQ7Ci0JCX0gZWxzZQotCQkJX19yYXdfc3Bpbl9sb2NrKCZjcHVfYnVmZmVyLT5sb2NrKTsKLQotCQlsb2NrX3Rha2VuID0gdHJ1ZTsKLQotCQlyYl9pbmNfcGFnZShjcHVfYnVmZmVyLCAmbmV4dF9wYWdlKTsKLQotCQloZWFkX3BhZ2UgPSBjcHVfYnVmZmVyLT5oZWFkX3BhZ2U7Ci0JCXJlYWRlcl9wYWdlID0gY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2U7Ci0KLQkJLyogd2UgZ3JhYmJlZCB0aGUgbG9jayBiZWZvcmUgaW5jcmVtZW50aW5nICovCi0JCWlmIChSQl9XQVJOX09OKGNwdV9idWZmZXIsIG5leHRfcGFnZSA9PSByZWFkZXJfcGFnZSkpCi0JCQlnb3RvIG91dF9yZXNldDsKLQotCQkvKgotCQkgKiBJZiBmb3Igc29tZSByZWFzb24sIHdlIGhhZCBhbiBpbnRlcnJ1cHQgc3Rvcm0gdGhhdCBtYWRlCi0JCSAqIGl0IGFsbCB0aGUgd2F5IGFyb3VuZCB0aGUgYnVmZmVyLCBiYWlsLCBhbmQgd2FybgotCQkgKiBhYm91dCBpdC4KLQkJICovCi0JCWlmICh1bmxpa2VseShuZXh0X3BhZ2UgPT0gY29tbWl0X3BhZ2UpKSB7Ci0JCQlXQVJOX09OX09OQ0UoMSk7Ci0JCQlnb3RvIG91dF9yZXNldDsKLQkJfQotCi0JCWlmIChuZXh0X3BhZ2UgPT0gaGVhZF9wYWdlKSB7Ci0JCQlpZiAoIShidWZmZXItPmZsYWdzICYgUkJfRkxfT1ZFUldSSVRFKSkKLQkJCQlnb3RvIG91dF9yZXNldDsKLQotCQkJLyogdGFpbF9wYWdlIGhhcyBub3QgbW92ZWQgeWV0PyAqLwotCQkJaWYgKHRhaWxfcGFnZSA9PSBjcHVfYnVmZmVyLT50YWlsX3BhZ2UpIHsKLQkJCQkvKiBjb3VudCBvdmVyZmxvd3MgKi8KLQkJCQlyYl91cGRhdGVfb3ZlcmZsb3coY3B1X2J1ZmZlcik7Ci0KLQkJCQlyYl9pbmNfcGFnZShjcHVfYnVmZmVyLCAmaGVhZF9wYWdlKTsKLQkJCQljcHVfYnVmZmVyLT5oZWFkX3BhZ2UgPSBoZWFkX3BhZ2U7Ci0JCQkJY3B1X2J1ZmZlci0+aGVhZF9wYWdlLT5yZWFkID0gMDsKLQkJCX0KLQkJfQotCi0JCS8qCi0JCSAqIElmIHRoZSB0YWlsIHBhZ2UgaXMgc3RpbGwgdGhlIHNhbWUgYXMgd2hhdCB3ZSB0aGluawotCQkgKiBpdCBpcywgdGhlbiBpdCBpcyB1cCB0byB1cyB0byB1cGRhdGUgdGhlIHRhaWwKLQkJICogcG9pbnRlci4KLQkJICovCi0JCWlmICh0YWlsX3BhZ2UgPT0gY3B1X2J1ZmZlci0+dGFpbF9wYWdlKSB7Ci0JCQlsb2NhbF9zZXQoJm5leHRfcGFnZS0+d3JpdGUsIDApOwotCQkJbG9jYWxfc2V0KCZuZXh0X3BhZ2UtPnBhZ2UtPmNvbW1pdCwgMCk7Ci0JCQljcHVfYnVmZmVyLT50YWlsX3BhZ2UgPSBuZXh0X3BhZ2U7Ci0KLQkJCS8qIHJlcmVhZCB0aGUgdGltZSBzdGFtcCAqLwotCQkJKnRzID0gcmluZ19idWZmZXJfdGltZV9zdGFtcChidWZmZXIsIGNwdV9idWZmZXItPmNwdSk7Ci0JCQljcHVfYnVmZmVyLT50YWlsX3BhZ2UtPnBhZ2UtPnRpbWVfc3RhbXAgPSAqdHM7Ci0JCX0KLQotCQkvKgotCQkgKiBUaGUgYWN0dWFsIHRhaWwgcGFnZSBoYXMgbW92ZWQgZm9yd2FyZC4KLQkJICovCi0JCWlmICh0YWlsIDwgQlVGX1BBR0VfU0laRSkgewotCQkJLyogTWFyayB0aGUgcmVzdCBvZiB0aGUgcGFnZSB3aXRoIHBhZGRpbmcgKi8KLQkJCWV2ZW50ID0gX19yYl9wYWdlX2luZGV4KHRhaWxfcGFnZSwgdGFpbCk7Ci0JCQlyYl9ldmVudF9zZXRfcGFkZGluZyhldmVudCk7Ci0JCX0KLQotCQlpZiAodGFpbCA8PSBCVUZfUEFHRV9TSVpFKQotCQkJLyogU2V0IHRoZSB3cml0ZSBiYWNrIHRvIHRoZSBwcmV2aW91cyBzZXR0aW5nICovCi0JCQlsb2NhbF9zZXQoJnRhaWxfcGFnZS0+d3JpdGUsIHRhaWwpOwotCi0JCS8qCi0JCSAqIElmIHRoaXMgd2FzIGEgY29tbWl0IGVudHJ5IHRoYXQgZmFpbGVkLAotCQkgKiBpbmNyZW1lbnQgdGhhdCB0b28KLQkJICovCi0JCWlmICh0YWlsX3BhZ2UgPT0gY3B1X2J1ZmZlci0+Y29tbWl0X3BhZ2UgJiYKLQkJICAgIHRhaWwgPT0gcmJfY29tbWl0X2luZGV4KGNwdV9idWZmZXIpKSB7Ci0JCQlyYl9zZXRfY29tbWl0X3RvX3dyaXRlKGNwdV9idWZmZXIpOwotCQl9Ci0KLQkJX19yYXdfc3Bpbl91bmxvY2soJmNwdV9idWZmZXItPmxvY2spOwotCQlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7Ci0KLQkJLyogZmFpbCBhbmQgbGV0IHRoZSBjYWxsZXIgdHJ5IGFnYWluICovCi0JCXJldHVybiBFUlJfUFRSKC1FQUdBSU4pOwotCX0KKwlpZiAod3JpdGUgPiBCVUZfUEFHRV9TSVpFKQorCQlyZXR1cm4gcmJfbW92ZV90YWlsKGNwdV9idWZmZXIsIGxlbmd0aCwgdGFpbCwKKwkJCQkgICAgY29tbWl0X3BhZ2UsIHRhaWxfcGFnZSwgdHMpOwogCiAJLyogV2UgcmVzZXJ2ZWQgc29tZXRoaW5nIG9uIHRoZSBidWZmZXIgKi8KIApAQCAtMTI4OSw2ICsxMzI5LDEwIEBACiAJZXZlbnQgPSBfX3JiX3BhZ2VfaW5kZXgodGFpbF9wYWdlLCB0YWlsKTsKIAlyYl91cGRhdGVfZXZlbnQoZXZlbnQsIHR5cGUsIGxlbmd0aCk7CiAKKwkvKiBUaGUgcGFzc2VkIGluIHR5cGUgaXMgemVybyBmb3IgREFUQSAqLworCWlmIChsaWtlbHkoIXR5cGUpKQorCQlsb2NhbF9pbmMoJnRhaWxfcGFnZS0+ZW50cmllcyk7CisKIAkvKgogCSAqIElmIHRoaXMgaXMgYSBjb21taXQgYW5kIHRoZSB0YWlsIGlzIHplcm8sIHRoZW4gdXBkYXRlCiAJICogdGhpcyBwYWdlJ3MgdGltZSBzdGFtcC4KQEAgLTEyOTcsMTYgKzEzNDEsMzggQEAKIAkJY3B1X2J1ZmZlci0+Y29tbWl0X3BhZ2UtPnBhZ2UtPnRpbWVfc3RhbXAgPSAqdHM7CiAKIAlyZXR1cm4gZXZlbnQ7Cit9CiAKLSBvdXRfcmVzZXQ6Ci0JLyogcmVzZXQgd3JpdGUgKi8KLQlpZiAodGFpbCA8PSBCVUZfUEFHRV9TSVpFKQotCQlsb2NhbF9zZXQoJnRhaWxfcGFnZS0+d3JpdGUsIHRhaWwpOworc3RhdGljIGlubGluZSBpbnQKK3JiX3RyeV90b19kaXNjYXJkKHN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1ICpjcHVfYnVmZmVyLAorCQkgIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCit7CisJdW5zaWduZWQgbG9uZyBuZXdfaW5kZXgsIG9sZF9pbmRleDsKKwlzdHJ1Y3QgYnVmZmVyX3BhZ2UgKmJwYWdlOworCXVuc2lnbmVkIGxvbmcgaW5kZXg7CisJdW5zaWduZWQgbG9uZyBhZGRyOwogCi0JaWYgKGxpa2VseShsb2NrX3Rha2VuKSkKLQkJX19yYXdfc3Bpbl91bmxvY2soJmNwdV9idWZmZXItPmxvY2spOwotCWxvY2FsX2lycV9yZXN0b3JlKGZsYWdzKTsKLQlyZXR1cm4gTlVMTDsKKwluZXdfaW5kZXggPSByYl9ldmVudF9pbmRleChldmVudCk7CisJb2xkX2luZGV4ID0gbmV3X2luZGV4ICsgcmJfZXZlbnRfbGVuZ3RoKGV2ZW50KTsKKwlhZGRyID0gKHVuc2lnbmVkIGxvbmcpZXZlbnQ7CisJYWRkciAmPSBQQUdFX01BU0s7CisKKwlicGFnZSA9IGNwdV9idWZmZXItPnRhaWxfcGFnZTsKKworCWlmIChicGFnZS0+cGFnZSA9PSAodm9pZCAqKWFkZHIgJiYgcmJfcGFnZV93cml0ZShicGFnZSkgPT0gb2xkX2luZGV4KSB7CisJCS8qCisJCSAqIFRoaXMgaXMgb24gdGhlIHRhaWwgcGFnZS4gSXQgaXMgcG9zc2libGUgdGhhdAorCQkgKiBhIHdyaXRlIGNvdWxkIGNvbWUgaW4gYW5kIG1vdmUgdGhlIHRhaWwgcGFnZQorCQkgKiBhbmQgd3JpdGUgdG8gdGhlIG5leHQgcGFnZS4gVGhhdCBpcyBmaW5lCisJCSAqIGJlY2F1c2Ugd2UganVzdCBzaG9ydGVuIHdoYXQgaXMgb24gdGhpcyBwYWdlLgorCQkgKi8KKwkJaW5kZXggPSBsb2NhbF9jbXB4Y2hnKCZicGFnZS0+d3JpdGUsIG9sZF9pbmRleCwgbmV3X2luZGV4KTsKKwkJaWYgKGluZGV4ID09IG9sZF9pbmRleCkKKwkJCXJldHVybiAxOworCX0KKworCS8qIGNvdWxkIG5vdCBkaXNjYXJkICovCisJcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBpbnQKQEAgLTEzNTEsMTYgKzE0MTcsMjMgQEAKIAkJCWV2ZW50LT5hcnJheVswXSA9ICpkZWx0YSA+PiBUU19TSElGVDsKIAkJfSBlbHNlIHsKIAkJCWNwdV9idWZmZXItPmNvbW1pdF9wYWdlLT5wYWdlLT50aW1lX3N0YW1wID0gKnRzOwotCQkJZXZlbnQtPnRpbWVfZGVsdGEgPSAwOwotCQkJZXZlbnQtPmFycmF5WzBdID0gMDsKKwkJCS8qIHRyeSB0byBkaXNjYXJkLCBzaW5jZSB3ZSBkbyBub3QgbmVlZCB0aGlzICovCisJCQlpZiAoIXJiX3RyeV90b19kaXNjYXJkKGNwdV9idWZmZXIsIGV2ZW50KSkgeworCQkJCS8qIG5vcGUsIGp1c3QgemVybyBpdCAqLworCQkJCWV2ZW50LT50aW1lX2RlbHRhID0gMDsKKwkJCQlldmVudC0+YXJyYXlbMF0gPSAwOworCQkJfQogCQl9CiAJCWNwdV9idWZmZXItPndyaXRlX3N0YW1wID0gKnRzOwogCQkvKiBsZXQgdGhlIGNhbGxlciBrbm93IHRoaXMgd2FzIHRoZSBjb21taXQgKi8KIAkJcmV0ID0gMTsKIAl9IGVsc2UgewotCQkvKiBEYXJuLCB0aGlzIGlzIGp1c3Qgd2FzdGVkIHNwYWNlICovCi0JCWV2ZW50LT50aW1lX2RlbHRhID0gMDsKLQkJZXZlbnQtPmFycmF5WzBdID0gMDsKKwkJLyogVHJ5IHRvIGRpc2NhcmQgdGhlIGV2ZW50ICovCisJCWlmICghcmJfdHJ5X3RvX2Rpc2NhcmQoY3B1X2J1ZmZlciwgZXZlbnQpKSB7CisJCQkvKiBEYXJuLCB0aGlzIGlzIGp1c3Qgd2FzdGVkIHNwYWNlICovCisJCQlldmVudC0+dGltZV9kZWx0YSA9IDA7CisJCQlldmVudC0+YXJyYXlbMF0gPSAwOworCQl9CiAJCXJldCA9IDA7CiAJfQogCkBAIC0xMzcxLDEzICsxNDQ0LDE0IEBACiAKIHN0YXRpYyBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKgogcmJfcmVzZXJ2ZV9uZXh0X2V2ZW50KHN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1ICpjcHVfYnVmZmVyLAotCQkgICAgICB1bnNpZ25lZCB0eXBlLCB1bnNpZ25lZCBsb25nIGxlbmd0aCkKKwkJICAgICAgdW5zaWduZWQgbG9uZyBsZW5ndGgpCiB7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKLQl1NjQgdHMsIGRlbHRhOworCXU2NCB0cywgZGVsdGEgPSAwOwogCWludCBjb21taXQgPSAwOwogCWludCBucl9sb29wcyA9IDA7CiAKKwlsZW5ndGggPSByYl9jYWxjdWxhdGVfZXZlbnRfbGVuZ3RoKGxlbmd0aCk7CiAgYWdhaW46CiAJLyoKIAkgKiBXZSBhbGxvdyBmb3IgaW50ZXJydXB0cyB0byByZWVudGVyIGhlcmUgYW5kIGRvIGEgdHJhY2UuCkBAIC0xMzkxLDcgKzE0NjUsNyBAQAogCWlmIChSQl9XQVJOX09OKGNwdV9idWZmZXIsICsrbnJfbG9vcHMgPiAxMDAwKSkKIAkJcmV0dXJuIE5VTEw7CiAKLQl0cyA9IHJpbmdfYnVmZmVyX3RpbWVfc3RhbXAoY3B1X2J1ZmZlci0+YnVmZmVyLCBjcHVfYnVmZmVyLT5jcHUpOworCXRzID0gcmJfdGltZV9zdGFtcChjcHVfYnVmZmVyLT5idWZmZXIsIGNwdV9idWZmZXItPmNwdSk7CiAKIAkvKgogCSAqIE9ubHkgdGhlIGZpcnN0IGNvbW1pdCBjYW4gdXBkYXRlIHRoZSB0aW1lc3RhbXAuCkBAIC0xNDAxLDIzICsxNDc1LDI0IEBACiAJICogYWxzbyBiZSBtYWRlLiBCdXQgb25seSB0aGUgZW50cnkgdGhhdCBkaWQgdGhlIGFjdHVhbAogCSAqIGNvbW1pdCB3aWxsIGJlIHNvbWV0aGluZyBvdGhlciB0aGFuIHplcm8uCiAJICovCi0JaWYgKGNwdV9idWZmZXItPnRhaWxfcGFnZSA9PSBjcHVfYnVmZmVyLT5jb21taXRfcGFnZSAmJgotCSAgICByYl9wYWdlX3dyaXRlKGNwdV9idWZmZXItPnRhaWxfcGFnZSkgPT0KLQkgICAgcmJfY29tbWl0X2luZGV4KGNwdV9idWZmZXIpKSB7CisJaWYgKGxpa2VseShjcHVfYnVmZmVyLT50YWlsX3BhZ2UgPT0gY3B1X2J1ZmZlci0+Y29tbWl0X3BhZ2UgJiYKKwkJICAgcmJfcGFnZV93cml0ZShjcHVfYnVmZmVyLT50YWlsX3BhZ2UpID09CisJCSAgIHJiX2NvbW1pdF9pbmRleChjcHVfYnVmZmVyKSkpIHsKKwkJdTY0IGRpZmY7CiAKLQkJZGVsdGEgPSB0cyAtIGNwdV9idWZmZXItPndyaXRlX3N0YW1wOworCQlkaWZmID0gdHMgLSBjcHVfYnVmZmVyLT53cml0ZV9zdGFtcDsKIAotCQkvKiBtYWtlIHN1cmUgdGhpcyBkZWx0YSBpcyBjYWxjdWxhdGVkIGhlcmUgKi8KKwkJLyogbWFrZSBzdXJlIHRoaXMgZGlmZiBpcyBjYWxjdWxhdGVkIGhlcmUgKi8KIAkJYmFycmllcigpOwogCiAJCS8qIERpZCB0aGUgd3JpdGUgc3RhbXAgZ2V0IHVwZGF0ZWQgYWxyZWFkeT8gKi8KIAkJaWYgKHVubGlrZWx5KHRzIDwgY3B1X2J1ZmZlci0+d3JpdGVfc3RhbXApKQotCQkJZGVsdGEgPSAwOworCQkJZ290byBnZXRfZXZlbnQ7CiAKLQkJaWYgKHRlc3RfdGltZV9zdGFtcChkZWx0YSkpIHsKKwkJZGVsdGEgPSBkaWZmOworCQlpZiAodW5saWtlbHkodGVzdF90aW1lX3N0YW1wKGRlbHRhKSkpIHsKIAogCQkJY29tbWl0ID0gcmJfYWRkX3RpbWVfc3RhbXAoY3B1X2J1ZmZlciwgJnRzLCAmZGVsdGEpOwotCiAJCQlpZiAoY29tbWl0ID09IC1FQlVTWSkKIAkJCQlyZXR1cm4gTlVMTDsKIApAQCAtMTQyNiwxMiArMTUwMSwxMSBAQAogCiAJCQlSQl9XQVJOX09OKGNwdV9idWZmZXIsIGNvbW1pdCA8IDApOwogCQl9Ci0JfSBlbHNlCi0JCS8qIE5vbiBjb21taXRzIGhhdmUgemVybyBkZWx0YXMgKi8KLQkJZGVsdGEgPSAwOworCX0KIAotCWV2ZW50ID0gX19yYl9yZXNlcnZlX25leHQoY3B1X2J1ZmZlciwgdHlwZSwgbGVuZ3RoLCAmdHMpOwotCWlmIChQVFJfRVJSKGV2ZW50KSA9PSAtRUFHQUlOKQorIGdldF9ldmVudDoKKwlldmVudCA9IF9fcmJfcmVzZXJ2ZV9uZXh0KGNwdV9idWZmZXIsIDAsIGxlbmd0aCwgJnRzKTsKKwlpZiAodW5saWtlbHkoUFRSX0VSUihldmVudCkgPT0gLUVBR0FJTikpCiAJCWdvdG8gYWdhaW47CiAKIAlpZiAoIWV2ZW50KSB7CkBAIC0xNDQ4LDcgKzE1MjIsNyBAQAogCSAqIElmIHRoZSB0aW1lc3RhbXAgd2FzIGNvbW1pdGVkLCBtYWtlIHRoZSBjb21taXQgb3VyIGVudHJ5CiAJICogbm93IHNvIHRoYXQgd2Ugd2lsbCB1cGRhdGUgaXQgd2hlbiBuZWVkZWQuCiAJICovCi0JaWYgKGNvbW1pdCkKKwlpZiAodW5saWtlbHkoY29tbWl0KSkKIAkJcmJfc2V0X2NvbW1pdF9ldmVudChjcHVfYnVmZmVyLCBldmVudCk7CiAJZWxzZSBpZiAoIXJiX2lzX2NvbW1pdChjcHVfYnVmZmVyLCBldmVudCkpCiAJCWRlbHRhID0gMDsKQEAgLTE0NTgsNiArMTUzMiwzNiBAQAogCXJldHVybiBldmVudDsKIH0KIAorI2RlZmluZSBUUkFDRV9SRUNVUlNJVkVfREVQVEggMTYKKworc3RhdGljIGludCB0cmFjZV9yZWN1cnNpdmVfbG9jayh2b2lkKQoreworCWN1cnJlbnQtPnRyYWNlX3JlY3Vyc2lvbisrOworCisJaWYgKGxpa2VseShjdXJyZW50LT50cmFjZV9yZWN1cnNpb24gPCBUUkFDRV9SRUNVUlNJVkVfREVQVEgpKQorCQlyZXR1cm4gMDsKKworCS8qIERpc2FibGUgYWxsIHRyYWNpbmcgYmVmb3JlIHdlIGRvIGFueXRoaW5nIGVsc2UgKi8KKwl0cmFjaW5nX29mZl9wZXJtYW5lbnQoKTsKKworCXByaW50a19vbmNlKEtFUk5fV0FSTklORyAiVHJhY2luZyByZWN1cnNpb246IGRlcHRoWyVsZF06IgorCQkgICAgIkhDWyVsdV06U0NbJWx1XTpOTUlbJWx1XVxuIiwKKwkJICAgIGN1cnJlbnQtPnRyYWNlX3JlY3Vyc2lvbiwKKwkJICAgIGhhcmRpcnFfY291bnQoKSA+PiBIQVJESVJRX1NISUZULAorCQkgICAgc29mdGlycV9jb3VudCgpID4+IFNPRlRJUlFfU0hJRlQsCisJCSAgICBpbl9ubWkoKSk7CisKKwlXQVJOX09OX09OQ0UoMSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCB0cmFjZV9yZWN1cnNpdmVfdW5sb2NrKHZvaWQpCit7CisJV0FSTl9PTl9PTkNFKCFjdXJyZW50LT50cmFjZV9yZWN1cnNpb24pOworCisJY3VycmVudC0+dHJhY2VfcmVjdXJzaW9uLS07Cit9CisKIHN0YXRpYyBERUZJTkVfUEVSX0NQVShpbnQsIHJiX25lZWRfcmVzY2hlZCk7CiAKIC8qKgpAQCAtMTQ5MSw2ICsxNTk1LDkgQEAKIAkvKiBJZiB3ZSBhcmUgdHJhY2luZyBzY2hlZHVsZSwgd2UgZG9uJ3Qgd2FudCB0byByZWN1cnNlICovCiAJcmVzY2hlZCA9IGZ0cmFjZV9wcmVlbXB0X2Rpc2FibGUoKTsKIAorCWlmICh0cmFjZV9yZWN1cnNpdmVfbG9jaygpKQorCQlnb3RvIG91dF9ub2NoZWNrOworCiAJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAogCWlmICghY3B1bWFza190ZXN0X2NwdShjcHUsIGJ1ZmZlci0+Y3B1bWFzaykpCkBAIC0xNTAxLDExICsxNjA4LDEwIEBACiAJaWYgKGF0b21pY19yZWFkKCZjcHVfYnVmZmVyLT5yZWNvcmRfZGlzYWJsZWQpKQogCQlnb3RvIG91dDsKIAotCWxlbmd0aCA9IHJiX2NhbGN1bGF0ZV9ldmVudF9sZW5ndGgobGVuZ3RoKTsKLQlpZiAobGVuZ3RoID4gQlVGX1BBR0VfU0laRSkKKwlpZiAobGVuZ3RoID4gQlVGX01BWF9EQVRBX1NJWkUpCiAJCWdvdG8gb3V0OwogCi0JZXZlbnQgPSByYl9yZXNlcnZlX25leHRfZXZlbnQoY3B1X2J1ZmZlciwgUklOR0JVRl9UWVBFX0RBVEEsIGxlbmd0aCk7CisJZXZlbnQgPSByYl9yZXNlcnZlX25leHRfZXZlbnQoY3B1X2J1ZmZlciwgbGVuZ3RoKTsKIAlpZiAoIWV2ZW50KQogCQlnb3RvIG91dDsKIApAQCAtMTUyMCw2ICsxNjI2LDkgQEAKIAlyZXR1cm4gZXZlbnQ7CiAKICBvdXQ6CisJdHJhY2VfcmVjdXJzaXZlX3VubG9jaygpOworCisgb3V0X25vY2hlY2s6CiAJZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHJlc2NoZWQpOwogCXJldHVybiBOVUxMOwogfQpAQCAtMTUyOCw3ICsxNjM3LDcgQEAKIHN0YXRpYyB2b2lkIHJiX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKIAkJICAgICAgc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCkKIHsKLQljcHVfYnVmZmVyLT5lbnRyaWVzKys7CisJbG9jYWxfaW5jKCZjcHVfYnVmZmVyLT5lbnRyaWVzKTsKIAogCS8qIE9ubHkgcHJvY2VzcyBmdXJ0aGVyIGlmIHdlIG93biB0aGUgY29tbWl0ICovCiAJaWYgKCFyYl9pc19jb21taXQoY3B1X2J1ZmZlciwgZXZlbnQpKQpAQCAtMTU1OCw2ICsxNjY3LDggQEAKIAogCXJiX2NvbW1pdChjcHVfYnVmZmVyLCBldmVudCk7CiAKKwl0cmFjZV9yZWN1cnNpdmVfdW5sb2NrKCk7CisKIAkvKgogCSAqIE9ubHkgdGhlIGxhc3QgcHJlZW1wdCBjb3VudCBuZWVkcyB0byByZXN0b3JlIHByZWVtcHRpb24uCiAJICovCkBAIC0xNTcwLDYgKzE2ODEsOTkgQEAKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3VubG9ja19jb21taXQpOwogCitzdGF0aWMgaW5saW5lIHZvaWQgcmJfZXZlbnRfZGlzY2FyZChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQoreworCS8qIGFycmF5WzBdIGhvbGRzIHRoZSBhY3R1YWwgbGVuZ3RoIGZvciB0aGUgZGlzY2FyZGVkIGV2ZW50ICovCisJZXZlbnQtPmFycmF5WzBdID0gcmJfZXZlbnRfZGF0YV9sZW5ndGgoZXZlbnQpIC0gUkJfRVZOVF9IRFJfU0laRTsKKwlldmVudC0+dHlwZV9sZW4gPSBSSU5HQlVGX1RZUEVfUEFERElORzsKKwkvKiB0aW1lIGRlbHRhIG11c3QgYmUgbm9uIHplcm8gKi8KKwlpZiAoIWV2ZW50LT50aW1lX2RlbHRhKQorCQlldmVudC0+dGltZV9kZWx0YSA9IDE7Cit9CisKKy8qKgorICogcmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZCAtIGRpc2NhcmQgYW55IGV2ZW50IGluIHRoZSByaW5nIGJ1ZmZlcgorICogQGV2ZW50OiB0aGUgZXZlbnQgdG8gZGlzY2FyZAorICoKKyAqIFNvbWV0aW1lcyBhIGV2ZW50IHRoYXQgaXMgaW4gdGhlIHJpbmcgYnVmZmVyIG5lZWRzIHRvIGJlIGlnbm9yZWQuCisgKiBUaGlzIGZ1bmN0aW9uIGxldHMgdGhlIHVzZXIgZGlzY2FyZCBhbiBldmVudCBpbiB0aGUgcmluZyBidWZmZXIKKyAqIGFuZCB0aGVuIHRoYXQgZXZlbnQgd2lsbCBub3QgYmUgcmVhZCBsYXRlci4KKyAqCisgKiBOb3RlLCBpdCBpcyB1cCB0byB0aGUgdXNlciB0byBiZSBjYXJlZnVsIHdpdGggdGhpcywgYW5kIHByb3RlY3QKKyAqIGFnYWluc3QgcmFjZXMuIElmIHRoZSB1c2VyIGRpc2NhcmRzIGFuIGV2ZW50IHRoYXQgaGFzIGJlZW4gY29uc3VtZWQKKyAqIGl0IGlzIHBvc3NpYmxlIHRoYXQgaXQgY291bGQgY29ycnVwdCB0aGUgcmluZyBidWZmZXIuCisgKi8KK3ZvaWQgcmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQoreworCXJiX2V2ZW50X2Rpc2NhcmQoZXZlbnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZCk7CisKKy8qKgorICogcmluZ19idWZmZXJfY29tbWl0X2Rpc2NhcmQgLSBkaXNjYXJkIGFuIGV2ZW50IHRoYXQgaGFzIG5vdCBiZWVuIGNvbW1pdHRlZAorICogQGJ1ZmZlcjogdGhlIHJpbmcgYnVmZmVyCisgKiBAZXZlbnQ6IG5vbiBjb21taXR0ZWQgZXZlbnQgdG8gZGlzY2FyZAorICoKKyAqIFRoaXMgaXMgc2ltaWxhciB0byByaW5nX2J1ZmZlcl9ldmVudF9kaXNjYXJkIGJ1dCBtdXN0IG9ubHkgYmUKKyAqIHBlcmZvcm1lZCBvbiBhbiBldmVudCB0aGF0IGhhcyBub3QgYmVlbiBjb21taXR0ZWQgeWV0LiBUaGUgZGlmZmVyZW5jZQorICogaXMgdGhhdCB0aGlzIHdpbGwgYWxzbyB0cnkgdG8gZnJlZSB0aGUgZXZlbnQgZnJvbSB0aGUgcmluZyBidWZmZXIKKyAqIGlmIGFub3RoZXIgZXZlbnQgaGFzIG5vdCBiZWVuIGFkZGVkIGJlaGluZCBpdC4KKyAqCisgKiBJZiBhbm90aGVyIGV2ZW50IGhhcyBiZWVuIGFkZGVkIGJlaGluZCBpdCwgaXQgd2lsbCBzZXQgdGhlIGV2ZW50CisgKiB1cCBhcyBkaXNjYXJkZWQsIGFuZCBwZXJmb3JtIHRoZSBjb21taXQuCisgKgorICogSWYgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQsIGRvIG5vdCBjYWxsIHJpbmdfYnVmZmVyX3VubG9ja19jb21taXQgb24KKyAqIHRoZSBldmVudC4KKyAqLwordm9pZCByaW5nX2J1ZmZlcl9kaXNjYXJkX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXIgKmJ1ZmZlciwKKwkJCQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQoreworCXN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1ICpjcHVfYnVmZmVyOworCWludCBjcHU7CisKKwkvKiBUaGUgZXZlbnQgaXMgZGlzY2FyZGVkIHJlZ2FyZGxlc3MgKi8KKwlyYl9ldmVudF9kaXNjYXJkKGV2ZW50KTsKKworCS8qCisJICogVGhpcyBtdXN0IG9ubHkgYmUgY2FsbGVkIGlmIHRoZSBldmVudCBoYXMgbm90IGJlZW4KKwkgKiBjb21taXR0ZWQgeWV0LiBUaHVzIHdlIGNhbiBhc3N1bWUgdGhhdCBwcmVlbXB0aW9uCisJICogaXMgc3RpbGwgZGlzYWJsZWQuCisJICovCisJUkJfV0FSTl9PTihidWZmZXIsIHByZWVtcHRpYmxlKCkpOworCisJY3B1ID0gc21wX3Byb2Nlc3Nvcl9pZCgpOworCWNwdV9idWZmZXIgPSBidWZmZXItPmJ1ZmZlcnNbY3B1XTsKKworCWlmICghcmJfdHJ5X3RvX2Rpc2NhcmQoY3B1X2J1ZmZlciwgZXZlbnQpKQorCQlnb3RvIG91dDsKKworCS8qCisJICogVGhlIGNvbW1pdCBpcyBzdGlsbCB2aXNpYmxlIGJ5IHRoZSByZWFkZXIsIHNvIHdlCisJICogbXVzdCBpbmNyZW1lbnQgZW50cmllcy4KKwkgKi8KKwlsb2NhbF9pbmMoJmNwdV9idWZmZXItPmVudHJpZXMpOworIG91dDoKKwkvKgorCSAqIElmIGEgd3JpdGUgY2FtZSBpbiBhbmQgcHVzaGVkIHRoZSB0YWlsIHBhZ2UKKwkgKiB3ZSBzdGlsbCBuZWVkIHRvIHVwZGF0ZSB0aGUgY29tbWl0IHBvaW50ZXIKKwkgKiBpZiB3ZSB3ZXJlIHRoZSBjb21taXQuCisJICovCisJaWYgKHJiX2lzX2NvbW1pdChjcHVfYnVmZmVyLCBldmVudCkpCisJCXJiX3NldF9jb21taXRfdG9fd3JpdGUoY3B1X2J1ZmZlcik7CisKKwl0cmFjZV9yZWN1cnNpdmVfdW5sb2NrKCk7CisKKwkvKgorCSAqIE9ubHkgdGhlIGxhc3QgcHJlZW1wdCBjb3VudCBuZWVkcyB0byByZXN0b3JlIHByZWVtcHRpb24uCisJICovCisJaWYgKHByZWVtcHRfY291bnQoKSA9PSAxKQorCQlmdHJhY2VfcHJlZW1wdF9lbmFibGUocGVyX2NwdShyYl9uZWVkX3Jlc2NoZWQsIGNwdSkpOworCWVsc2UKKwkJcHJlZW1wdF9lbmFibGVfbm9fcmVzY2hlZF9ub3RyYWNlKCk7CisKK30KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2Rpc2NhcmRfY29tbWl0KTsKKwogLyoqCiAgKiByaW5nX2J1ZmZlcl93cml0ZSAtIHdyaXRlIGRhdGEgdG8gdGhlIGJ1ZmZlciB3aXRob3V0IHJlc2VydmluZwogICogQGJ1ZmZlcjogVGhlIHJpbmcgYnVmZmVyIHRvIHdyaXRlIHRvLgpAQCAtMTU4OSw3ICsxNzkzLDYgQEAKIHsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlcjsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwotCXVuc2lnbmVkIGxvbmcgZXZlbnRfbGVuZ3RoOwogCXZvaWQgKmJvZHk7CiAJaW50IHJldCA9IC1FQlVTWTsKIAlpbnQgY3B1LCByZXNjaGVkOwpAQCAtMTYxMiw5ICsxODE1LDEwIEBACiAJaWYgKGF0b21pY19yZWFkKCZjcHVfYnVmZmVyLT5yZWNvcmRfZGlzYWJsZWQpKQogCQlnb3RvIG91dDsKIAotCWV2ZW50X2xlbmd0aCA9IHJiX2NhbGN1bGF0ZV9ldmVudF9sZW5ndGgobGVuZ3RoKTsKLQlldmVudCA9IHJiX3Jlc2VydmVfbmV4dF9ldmVudChjcHVfYnVmZmVyLAotCQkJCSAgICAgIFJJTkdCVUZfVFlQRV9EQVRBLCBldmVudF9sZW5ndGgpOworCWlmIChsZW5ndGggPiBCVUZfTUFYX0RBVEFfU0laRSkKKwkJZ290byBvdXQ7CisKKwlldmVudCA9IHJiX3Jlc2VydmVfbmV4dF9ldmVudChjcHVfYnVmZmVyLCBsZW5ndGgpOwogCWlmICghZXZlbnQpCiAJCWdvdG8gb3V0OwogCkBAIC0xNzI4LDcgKzE5MzIsOCBAQAogCQlyZXR1cm4gMDsKIAogCWNwdV9idWZmZXIgPSBidWZmZXItPmJ1ZmZlcnNbY3B1XTsKLQlyZXQgPSBjcHVfYnVmZmVyLT5lbnRyaWVzOworCXJldCA9IChsb2NhbF9yZWFkKCZjcHVfYnVmZmVyLT5lbnRyaWVzKSAtIGNwdV9idWZmZXItPm92ZXJydW4pCisJCS0gY3B1X2J1ZmZlci0+cmVhZDsKIAogCXJldHVybiByZXQ7CiB9CkBAIC0xNzU1LDYgKzE5NjAsNDcgQEAKIEVYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX292ZXJydW5fY3B1KTsKIAogLyoqCisgKiByaW5nX2J1ZmZlcl9ubWlfZHJvcHBlZF9jcHUgLSBnZXQgdGhlIG51bWJlciBvZiBubWlzIHRoYXQgd2VyZSBkcm9wcGVkCisgKiBAYnVmZmVyOiBUaGUgcmluZyBidWZmZXIKKyAqIEBjcHU6IFRoZSBwZXIgQ1BVIGJ1ZmZlciB0byBnZXQgdGhlIG51bWJlciBvZiBvdmVycnVucyBmcm9tCisgKi8KK3Vuc2lnbmVkIGxvbmcgcmluZ19idWZmZXJfbm1pX2Ryb3BwZWRfY3B1KHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLCBpbnQgY3B1KQoreworCXN0cnVjdCByaW5nX2J1ZmZlcl9wZXJfY3B1ICpjcHVfYnVmZmVyOworCXVuc2lnbmVkIGxvbmcgcmV0OworCisJaWYgKCFjcHVtYXNrX3Rlc3RfY3B1KGNwdSwgYnVmZmVyLT5jcHVtYXNrKSkKKwkJcmV0dXJuIDA7CisKKwljcHVfYnVmZmVyID0gYnVmZmVyLT5idWZmZXJzW2NwdV07CisJcmV0ID0gY3B1X2J1ZmZlci0+bm1pX2Ryb3BwZWQ7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfbm1pX2Ryb3BwZWRfY3B1KTsKKworLyoqCisgKiByaW5nX2J1ZmZlcl9jb21taXRfb3ZlcnJ1bl9jcHUgLSBnZXQgdGhlIG51bWJlciBvZiBvdmVycnVucyBjYXVzZWQgYnkgY29tbWl0cworICogQGJ1ZmZlcjogVGhlIHJpbmcgYnVmZmVyCisgKiBAY3B1OiBUaGUgcGVyIENQVSBidWZmZXIgdG8gZ2V0IHRoZSBudW1iZXIgb2Ygb3ZlcnJ1bnMgZnJvbQorICovCit1bnNpZ25lZCBsb25nCityaW5nX2J1ZmZlcl9jb21taXRfb3ZlcnJ1bl9jcHUoc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXIsIGludCBjcHUpCit7CisJc3RydWN0IHJpbmdfYnVmZmVyX3Blcl9jcHUgKmNwdV9idWZmZXI7CisJdW5zaWduZWQgbG9uZyByZXQ7CisKKwlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBidWZmZXItPmNwdW1hc2spKQorCQlyZXR1cm4gMDsKKworCWNwdV9idWZmZXIgPSBidWZmZXItPmJ1ZmZlcnNbY3B1XTsKKwlyZXQgPSBjcHVfYnVmZmVyLT5jb21taXRfb3ZlcnJ1bjsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9jb21taXRfb3ZlcnJ1bl9jcHUpOworCisvKioKICAqIHJpbmdfYnVmZmVyX2VudHJpZXMgLSBnZXQgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIGEgYnVmZmVyCiAgKiBAYnVmZmVyOiBUaGUgcmluZyBidWZmZXIKICAqCkBAIC0xNzcwLDcgKzIwMTYsOCBAQAogCS8qIGlmIHlvdSBjYXJlIGFib3V0IHRoaXMgYmVpbmcgY29ycmVjdCwgbG9jayB0aGUgYnVmZmVyICovCiAJZm9yX2VhY2hfYnVmZmVyX2NwdShidWZmZXIsIGNwdSkgewogCQljcHVfYnVmZmVyID0gYnVmZmVyLT5idWZmZXJzW2NwdV07Ci0JCWVudHJpZXMgKz0gY3B1X2J1ZmZlci0+ZW50cmllczsKKwkJZW50cmllcyArPSAobG9jYWxfcmVhZCgmY3B1X2J1ZmZlci0+ZW50cmllcykgLQorCQkJICAgIGNwdV9idWZmZXItPm92ZXJydW4pIC0gY3B1X2J1ZmZlci0+cmVhZDsKIAl9CiAKIAlyZXR1cm4gZW50cmllczsKQEAgLTE4NjIsNyArMjEwOSw3IEBACiB7CiAJdTY0IGRlbHRhOwogCi0Jc3dpdGNoIChldmVudC0+dHlwZSkgeworCXN3aXRjaCAoZXZlbnQtPnR5cGVfbGVuKSB7CiAJY2FzZSBSSU5HQlVGX1RZUEVfUEFERElORzoKIAkJcmV0dXJuOwogCkBAIC0xODkzLDcgKzIxNDAsNyBAQAogewogCXU2NCBkZWx0YTsKIAotCXN3aXRjaCAoZXZlbnQtPnR5cGUpIHsKKwlzd2l0Y2ggKGV2ZW50LT50eXBlX2xlbikgewogCWNhc2UgUklOR0JVRl9UWVBFX1BBRERJTkc6CiAJCXJldHVybjsKIApAQCAtMTk2Niw2ICsyMjEzLDcgQEAKIAljcHVfYnVmZmVyLT5yZWFkZXJfcGFnZS0+bGlzdC5wcmV2ID0gcmVhZGVyLT5saXN0LnByZXY7CiAKIAlsb2NhbF9zZXQoJmNwdV9idWZmZXItPnJlYWRlcl9wYWdlLT53cml0ZSwgMCk7CisJbG9jYWxfc2V0KCZjcHVfYnVmZmVyLT5yZWFkZXJfcGFnZS0+ZW50cmllcywgMCk7CiAJbG9jYWxfc2V0KCZjcHVfYnVmZmVyLT5yZWFkZXJfcGFnZS0+cGFnZS0+Y29tbWl0LCAwKTsKIAogCS8qIE1ha2UgdGhlIHJlYWRlciBwYWdlIG5vdyByZXBsYWNlIHRoZSBoZWFkICovCkBAIC0yMDA4LDggKzIyNTYsOSBAQAogCiAJZXZlbnQgPSByYl9yZWFkZXJfZXZlbnQoY3B1X2J1ZmZlcik7CiAKLQlpZiAoZXZlbnQtPnR5cGUgPT0gUklOR0JVRl9UWVBFX0RBVEEgfHwgcmJfZGlzY2FyZGVkX2V2ZW50KGV2ZW50KSkKLQkJY3B1X2J1ZmZlci0+ZW50cmllcy0tOworCWlmIChldmVudC0+dHlwZV9sZW4gPD0gUklOR0JVRl9UWVBFX0RBVEFfVFlQRV9MRU5fTUFYCisJCQl8fCByYl9kaXNjYXJkZWRfZXZlbnQoZXZlbnQpKQorCQljcHVfYnVmZmVyLT5yZWFkKys7CiAKIAlyYl91cGRhdGVfcmVhZF9zdGFtcChjcHVfYnVmZmVyLCBldmVudCk7CiAKQEAgLTIwMzEsOCArMjI4MCw4IEBACiAJICogQ2hlY2sgaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KIAkgKi8KIAlpZiAoaXRlci0+aGVhZCA+PSByYl9wYWdlX3NpemUoaXRlci0+aGVhZF9wYWdlKSkgewotCQlpZiAoUkJfV0FSTl9PTihidWZmZXIsCi0JCQkgICAgICAgaXRlci0+aGVhZF9wYWdlID09IGNwdV9idWZmZXItPmNvbW1pdF9wYWdlKSkKKwkJLyogZGlzY2FyZGVkIGNvbW1pdHMgY2FuIG1ha2UgdGhlIHBhZ2UgZW1wdHkgKi8KKwkJaWYgKGl0ZXItPmhlYWRfcGFnZSA9PSBjcHVfYnVmZmVyLT5jb21taXRfcGFnZSkKIAkJCXJldHVybjsKIAkJcmJfaW5jX2l0ZXIoaXRlcik7CiAJCXJldHVybjsKQEAgLTIwNzUsMTIgKzIzMjQsMTAgQEAKIAkvKgogCSAqIFdlIHJlcGVhdCB3aGVuIGEgdGltZXN0YW1wIGlzIGVuY291bnRlcmVkLiBJdCBpcyBwb3NzaWJsZQogCSAqIHRvIGdldCBtdWx0aXBsZSB0aW1lc3RhbXBzIGZyb20gYW4gaW50ZXJydXB0IGVudGVyaW5nIGp1c3QKLQkgKiBhcyBvbmUgdGltZXN0YW1wIGlzIGFib3V0IHRvIGJlIHdyaXR0ZW4uIFRoZSBtYXggdGltZXMKLQkgKiB0aGF0IHRoaXMgY2FuIGhhcHBlbiBpcyB0aGUgbnVtYmVyIG9mIG5lc3RlZCBpbnRlcnJ1cHRzIHdlCi0JICogY2FuIGhhdmUuICBOZXN0aW5nIDEwIGRlZXAgb2YgaW50ZXJydXB0cyBpcyBjbGVhcmx5Ci0JICogYW4gYW5vbWFseS4KKwkgKiBhcyBvbmUgdGltZXN0YW1wIGlzIGFib3V0IHRvIGJlIHdyaXR0ZW4sIG9yIGZyb20gZGlzY2FyZGVkCisJICogY29tbWl0cy4gVGhlIG1vc3QgdGhhdCB3ZSBjYW4gaGF2ZSBpcyB0aGUgbnVtYmVyIG9uIGEgc2luZ2xlIHBhZ2UuCiAJICovCi0JaWYgKFJCX1dBUk5fT04oY3B1X2J1ZmZlciwgKytucl9sb29wcyA+IDEwKSkKKwlpZiAoUkJfV0FSTl9PTihjcHVfYnVmZmVyLCArK25yX2xvb3BzID4gUkJfVElNRVNUQU1QU19QRVJfUEFHRSkpCiAJCXJldHVybiBOVUxMOwogCiAJcmVhZGVyID0gcmJfZ2V0X3JlYWRlcl9wYWdlKGNwdV9idWZmZXIpOwpAQCAtMjA4OSw3ICsyMzM2LDcgQEAKIAogCWV2ZW50ID0gcmJfcmVhZGVyX2V2ZW50KGNwdV9idWZmZXIpOwogCi0Jc3dpdGNoIChldmVudC0+dHlwZSkgeworCXN3aXRjaCAoZXZlbnQtPnR5cGVfbGVuKSB7CiAJY2FzZSBSSU5HQlVGX1RZUEVfUEFERElORzoKIAkJaWYgKHJiX251bGxfZXZlbnQoZXZlbnQpKQogCQkJUkJfV0FSTl9PTihjcHVfYnVmZmVyLCAxKTsKQEAgLTIxNDYsMTQgKzIzOTMsMTQgQEAKIAogIGFnYWluOgogCS8qCi0JICogV2UgcmVwZWF0IHdoZW4gYSB0aW1lc3RhbXAgaXMgZW5jb3VudGVyZWQuIEl0IGlzIHBvc3NpYmxlCi0JICogdG8gZ2V0IG11bHRpcGxlIHRpbWVzdGFtcHMgZnJvbSBhbiBpbnRlcnJ1cHQgZW50ZXJpbmcganVzdAotCSAqIGFzIG9uZSB0aW1lc3RhbXAgaXMgYWJvdXQgdG8gYmUgd3JpdHRlbi4gVGhlIG1heCB0aW1lcwotCSAqIHRoYXQgdGhpcyBjYW4gaGFwcGVuIGlzIHRoZSBudW1iZXIgb2YgbmVzdGVkIGludGVycnVwdHMgd2UKLQkgKiBjYW4gaGF2ZS4gTmVzdGluZyAxMCBkZWVwIG9mIGludGVycnVwdHMgaXMgY2xlYXJseQotCSAqIGFuIGFub21hbHkuCisJICogV2UgcmVwZWF0IHdoZW4gYSB0aW1lc3RhbXAgaXMgZW5jb3VudGVyZWQuCisJICogV2UgY2FuIGdldCBtdWx0aXBsZSB0aW1lc3RhbXBzIGJ5IG5lc3RlZCBpbnRlcnJ1cHRzIG9yIGFsc28KKwkgKiBpZiBmaWx0ZXJpbmcgaXMgb24gKGRpc2NhcmRpbmcgY29tbWl0cykuIFNpbmNlIGRpc2NhcmRpbmcKKwkgKiBjb21taXRzIGNhbiBiZSBmcmVxdWVudCB3ZSBjYW4gZ2V0IGEgbG90IG9mIHRpbWVzdGFtcHMuCisJICogQnV0IHdlIGxpbWl0IHRoZW0gYnkgbm90IGFkZGluZyB0aW1lc3RhbXBzIGlmIHRoZXkgYmVnaW4KKwkgKiBhdCB0aGUgc3RhcnQgb2YgYSBwYWdlLgogCSAqLwotCWlmIChSQl9XQVJOX09OKGNwdV9idWZmZXIsICsrbnJfbG9vcHMgPiAxMCkpCisJaWYgKFJCX1dBUk5fT04oY3B1X2J1ZmZlciwgKytucl9sb29wcyA+IFJCX1RJTUVTVEFNUFNfUEVSX1BBR0UpKQogCQlyZXR1cm4gTlVMTDsKIAogCWlmIChyYl9wZXJfY3B1X2VtcHR5KGNwdV9idWZmZXIpKQpAQCAtMjE2MSw3ICsyNDA4LDcgQEAKIAogCWV2ZW50ID0gcmJfaXRlcl9oZWFkX2V2ZW50KGl0ZXIpOwogCi0Jc3dpdGNoIChldmVudC0+dHlwZSkgeworCXN3aXRjaCAoZXZlbnQtPnR5cGVfbGVuKSB7CiAJY2FzZSBSSU5HQlVGX1RZUEVfUEFERElORzoKIAkJaWYgKHJiX251bGxfZXZlbnQoZXZlbnQpKSB7CiAJCQlyYl9pbmNfaXRlcihpdGVyKTsKQEAgLTIyMjAsNyArMjQ2Nyw3IEBACiAJZXZlbnQgPSByYl9idWZmZXJfcGVlayhidWZmZXIsIGNwdSwgdHMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdV9idWZmZXItPnJlYWRlcl9sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXZlbnQgJiYgZXZlbnQtPnR5cGUgPT0gUklOR0JVRl9UWVBFX1BBRERJTkcpIHsKKwlpZiAoZXZlbnQgJiYgZXZlbnQtPnR5cGVfbGVuID09IFJJTkdCVUZfVFlQRV9QQURESU5HKSB7CiAJCWNwdV9yZWxheCgpOwogCQlnb3RvIGFnYWluOwogCX0KQEAgLTIyNDgsNyArMjQ5NSw3IEBACiAJZXZlbnQgPSByYl9pdGVyX3BlZWsoaXRlciwgdHMpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdV9idWZmZXItPnJlYWRlcl9sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXZlbnQgJiYgZXZlbnQtPnR5cGUgPT0gUklOR0JVRl9UWVBFX1BBRERJTkcpIHsKKwlpZiAoZXZlbnQgJiYgZXZlbnQtPnR5cGVfbGVuID09IFJJTkdCVUZfVFlQRV9QQURESU5HKSB7CiAJCWNwdV9yZWxheCgpOwogCQlnb3RvIGFnYWluOwogCX0KQEAgLTIyOTMsNyArMjU0MCw3IEBACiAgb3V0OgogCXByZWVtcHRfZW5hYmxlKCk7CiAKLQlpZiAoZXZlbnQgJiYgZXZlbnQtPnR5cGUgPT0gUklOR0JVRl9UWVBFX1BBRERJTkcpIHsKKwlpZiAoZXZlbnQgJiYgZXZlbnQtPnR5cGVfbGVuID09IFJJTkdCVUZfVFlQRV9QQURESU5HKSB7CiAJCWNwdV9yZWxheCgpOwogCQlnb3RvIGFnYWluOwogCX0KQEAgLTIzODYsNyArMjYzMyw3IEBACiAgb3V0OgogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmNwdV9idWZmZXItPnJlYWRlcl9sb2NrLCBmbGFncyk7CiAKLQlpZiAoZXZlbnQgJiYgZXZlbnQtPnR5cGUgPT0gUklOR0JVRl9UWVBFX1BBRERJTkcpIHsKKwlpZiAoZXZlbnQgJiYgZXZlbnQtPnR5cGVfbGVuID09IFJJTkdCVUZfVFlQRV9QQURESU5HKSB7CiAJCWNwdV9yZWxheCgpOwogCQlnb3RvIGFnYWluOwogCX0KQEAgLTI0MTEsNiArMjY1OCw3IEBACiAJY3B1X2J1ZmZlci0+aGVhZF9wYWdlCiAJCT0gbGlzdF9lbnRyeShjcHVfYnVmZmVyLT5wYWdlcy5uZXh0LCBzdHJ1Y3QgYnVmZmVyX3BhZ2UsIGxpc3QpOwogCWxvY2FsX3NldCgmY3B1X2J1ZmZlci0+aGVhZF9wYWdlLT53cml0ZSwgMCk7CisJbG9jYWxfc2V0KCZjcHVfYnVmZmVyLT5oZWFkX3BhZ2UtPmVudHJpZXMsIDApOwogCWxvY2FsX3NldCgmY3B1X2J1ZmZlci0+aGVhZF9wYWdlLT5wYWdlLT5jb21taXQsIDApOwogCiAJY3B1X2J1ZmZlci0+aGVhZF9wYWdlLT5yZWFkID0gMDsKQEAgLTI0MjAsMTEgKzI2NjgsMTUgQEAKIAogCUlOSVRfTElTVF9IRUFEKCZjcHVfYnVmZmVyLT5yZWFkZXJfcGFnZS0+bGlzdCk7CiAJbG9jYWxfc2V0KCZjcHVfYnVmZmVyLT5yZWFkZXJfcGFnZS0+d3JpdGUsIDApOworCWxvY2FsX3NldCgmY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UtPmVudHJpZXMsIDApOwogCWxvY2FsX3NldCgmY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UtPnBhZ2UtPmNvbW1pdCwgMCk7CiAJY3B1X2J1ZmZlci0+cmVhZGVyX3BhZ2UtPnJlYWQgPSAwOwogCisJY3B1X2J1ZmZlci0+bm1pX2Ryb3BwZWQgPSAwOworCWNwdV9idWZmZXItPmNvbW1pdF9vdmVycnVuID0gMDsKIAljcHVfYnVmZmVyLT5vdmVycnVuID0gMDsKLQljcHVfYnVmZmVyLT5lbnRyaWVzID0gMDsKKwljcHVfYnVmZmVyLT5yZWFkID0gMDsKKwlsb2NhbF9zZXQoJmNwdV9idWZmZXItPmVudHJpZXMsIDApOwogCiAJY3B1X2J1ZmZlci0+d3JpdGVfc3RhbXAgPSAwOwogCWNwdV9idWZmZXItPnJlYWRfc3RhbXAgPSAwOwpAQCAtMjQ0Myw2ICsyNjk1LDggQEAKIAlpZiAoIWNwdW1hc2tfdGVzdF9jcHUoY3B1LCBidWZmZXItPmNwdW1hc2spKQogCQlyZXR1cm47CiAKKwlhdG9taWNfaW5jKCZjcHVfYnVmZmVyLT5yZWNvcmRfZGlzYWJsZWQpOworCiAJc3Bpbl9sb2NrX2lycXNhdmUoJmNwdV9idWZmZXItPnJlYWRlcl9sb2NrLCBmbGFncyk7CiAKIAlfX3Jhd19zcGluX2xvY2soJmNwdV9idWZmZXItPmxvY2spOwpAQCAtMjQ1Miw2ICsyNzA2LDggQEAKIAlfX3Jhd19zcGluX3VubG9jaygmY3B1X2J1ZmZlci0+bG9jayk7CiAKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZjcHVfYnVmZmVyLT5yZWFkZXJfbG9jaywgZmxhZ3MpOworCisJYXRvbWljX2RlYygmY3B1X2J1ZmZlci0+cmVjb3JkX2Rpc2FibGVkKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX3Jlc2V0X2NwdSk7CiAKQEAgLTI1NzgsMjggKzI4MzQsNiBAQAogfQogRVhQT1JUX1NZTUJPTF9HUEwocmluZ19idWZmZXJfc3dhcF9jcHUpOwogCi1zdGF0aWMgdm9pZCByYl9yZW1vdmVfZW50cmllcyhzdHJ1Y3QgcmluZ19idWZmZXJfcGVyX2NwdSAqY3B1X2J1ZmZlciwKLQkJCSAgICAgIHN0cnVjdCBidWZmZXJfZGF0YV9wYWdlICpicGFnZSwKLQkJCSAgICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCi17Ci0Jc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKLQl1bnNpZ25lZCBsb25nIGhlYWQ7Ci0KLQlfX3Jhd19zcGluX2xvY2soJmNwdV9idWZmZXItPmxvY2spOwotCWZvciAoaGVhZCA9IG9mZnNldDsgaGVhZCA8IGxvY2FsX3JlYWQoJmJwYWdlLT5jb21taXQpOwotCSAgICAgaGVhZCArPSByYl9ldmVudF9sZW5ndGgoZXZlbnQpKSB7Ci0KLQkJZXZlbnQgPSBfX3JiX2RhdGFfcGFnZV9pbmRleChicGFnZSwgaGVhZCk7Ci0JCWlmIChSQl9XQVJOX09OKGNwdV9idWZmZXIsIHJiX251bGxfZXZlbnQoZXZlbnQpKSkKLQkJCXJldHVybjsKLQkJLyogT25seSBjb3VudCBkYXRhIGVudHJpZXMgKi8KLQkJaWYgKGV2ZW50LT50eXBlICE9IFJJTkdCVUZfVFlQRV9EQVRBKQotCQkJY29udGludWU7Ci0JCWNwdV9idWZmZXItPmVudHJpZXMtLTsKLQl9Ci0JX19yYXdfc3Bpbl91bmxvY2soJmNwdV9idWZmZXItPmxvY2spOwotfQotCiAvKioKICAqIHJpbmdfYnVmZmVyX2FsbG9jX3JlYWRfcGFnZSAtIGFsbG9jYXRlIGEgcGFnZSB0byByZWFkIGZyb20gYnVmZmVyCiAgKiBAYnVmZmVyOiB0aGUgYnVmZmVyIHRvIGFsbG9jYXRlIGZvci4KQEAgLTI2MzAsNiArMjg2NCw3IEBACiAKIAlyZXR1cm4gYnBhZ2U7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9hbGxvY19yZWFkX3BhZ2UpOwogCiAvKioKICAqIHJpbmdfYnVmZmVyX2ZyZWVfcmVhZF9wYWdlIC0gZnJlZSBhbiBhbGxvY2F0ZWQgcmVhZCBwYWdlCkBAIC0yNjQyLDYgKzI4NzcsNyBAQAogewogCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZylkYXRhKTsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHJpbmdfYnVmZmVyX2ZyZWVfcmVhZF9wYWdlKTsKIAogLyoqCiAgKiByaW5nX2J1ZmZlcl9yZWFkX3BhZ2UgLSBleHRyYWN0IGEgcGFnZSBmcm9tIHRoZSByaW5nIGJ1ZmZlcgpAQCAtMjc2OCwxNiArMzAwNCwxNyBAQAogCQkvKiB3ZSBjb3BpZWQgZXZlcnl0aGluZyB0byB0aGUgYmVnaW5uaW5nICovCiAJCXJlYWQgPSAwOwogCX0gZWxzZSB7CisJCS8qIHVwZGF0ZSB0aGUgZW50cnkgY291bnRlciAqLworCQljcHVfYnVmZmVyLT5yZWFkICs9IGxvY2FsX3JlYWQoJnJlYWRlci0+ZW50cmllcyk7CisKIAkJLyogc3dhcCB0aGUgcGFnZXMgKi8KIAkJcmJfaW5pdF9wYWdlKGJwYWdlKTsKIAkJYnBhZ2UgPSByZWFkZXItPnBhZ2U7CiAJCXJlYWRlci0+cGFnZSA9ICpkYXRhX3BhZ2U7CiAJCWxvY2FsX3NldCgmcmVhZGVyLT53cml0ZSwgMCk7CisJCWxvY2FsX3NldCgmcmVhZGVyLT5lbnRyaWVzLCAwKTsKIAkJcmVhZGVyLT5yZWFkID0gMDsKIAkJKmRhdGFfcGFnZSA9IGJwYWdlOwotCi0JCS8qIHVwZGF0ZSB0aGUgZW50cnkgY291bnRlciAqLwotCQlyYl9yZW1vdmVfZW50cmllcyhjcHVfYnVmZmVyLCBicGFnZSwgcmVhZCk7CiAJfQogCXJldCA9IHJlYWQ7CiAKQEAgLTI3ODcsNiArMzAyNCw3IEBACiAgb3V0OgogCXJldHVybiByZXQ7CiB9CitFWFBPUlRfU1lNQk9MX0dQTChyaW5nX2J1ZmZlcl9yZWFkX3BhZ2UpOwogCiBzdGF0aWMgc3NpemVfdAogcmJfc2ltcGxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLApAQCAtMjg0NSwxNCArMzA4MywxMSBAQAogc3RhdGljIF9faW5pdCBpbnQgcmJfaW5pdF9kZWJ1Z2ZzKHZvaWQpCiB7CiAJc3RydWN0IGRlbnRyeSAqZF90cmFjZXI7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7CiAKIAlkX3RyYWNlciA9IHRyYWNpbmdfaW5pdF9kZW50cnkoKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2luZ19vbiIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICAmcmluZ19idWZmZXJfZmxhZ3MsICZyYl9zaW1wbGVfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICd0cmFjaW5nX29uJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNpbmdfb24iLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSAgICAmcmluZ19idWZmZXJfZmxhZ3MsICZyYl9zaW1wbGVfZm9wcyk7CiAKIAlyZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlcl9iZW5jaG1hcmsuYyBiL2tlcm5lbC90cmFjZS9yaW5nX2J1ZmZlcl9iZW5jaG1hcmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDY4ZTE0Ci0tLSAvZGV2L251bGwKKysrIGIva2VybmVsL3RyYWNlL3JpbmdfYnVmZmVyX2JlbmNobWFyay5jCkBAIC0wLDAgKzEsNDE2IEBACisvKgorICogcmluZyBidWZmZXIgdGVzdGVyIGFuZCBiZW5jaG1hcmsKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgU3RldmVuIFJvc3RlZHQgPHNyb3N0ZWR0QHJlZGhhdC5jb20+CisgKi8KKyNpbmNsdWRlIDxsaW51eC9yaW5nX2J1ZmZlci5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbXBsZXRpb24uaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgvdGltZS5oPgorCitzdHJ1Y3QgcmJfcGFnZSB7CisJdTY0CQl0czsKKwlsb2NhbF90CQljb21taXQ7CisJY2hhcgkJZGF0YVs0MDgwXTsKK307CisKKy8qIHJ1biB0aW1lIGFuZCBzbGVlcCB0aW1lIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgUlVOX1RJTUUJMTAKKyNkZWZpbmUgU0xFRVBfVElNRQkxMAorCisvKiBudW1iZXIgb2YgZXZlbnRzIGZvciB3cml0ZXIgdG8gd2FrZSB1cCB0aGUgcmVhZGVyICovCitzdGF0aWMgaW50IHdha2V1cF9pbnRlcnZhbCA9IDEwMDsKKworc3RhdGljIGludCByZWFkZXJfZmluaXNoOworc3RhdGljIHN0cnVjdCBjb21wbGV0aW9uIHJlYWRfc3RhcnQ7CitzdGF0aWMgc3RydWN0IGNvbXBsZXRpb24gcmVhZF9kb25lOworCitzdGF0aWMgc3RydWN0IHJpbmdfYnVmZmVyICpidWZmZXI7CitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpwcm9kdWNlcjsKK3N0YXRpYyBzdHJ1Y3QgdGFza19zdHJ1Y3QgKmNvbnN1bWVyOworc3RhdGljIHVuc2lnbmVkIGxvbmcgcmVhZDsKKworc3RhdGljIGludCBkaXNhYmxlX3JlYWRlcjsKK21vZHVsZV9wYXJhbShkaXNhYmxlX3JlYWRlciwgdWludCwgMDY0NCk7CitNT0RVTEVfUEFSTV9ERVNDKGRpc2FibGVfcmVhZGVyLCAib25seSBydW4gcHJvZHVjZXIiKTsKKworc3RhdGljIGludCByZWFkX2V2ZW50czsKKworc3RhdGljIGludCBraWxsX3Rlc3Q7CisKKyNkZWZpbmUgS0lMTF9URVNUKCkJCQkJXAorCWRvIHsJCQkJCVwKKwkJaWYgKCFraWxsX3Rlc3QpIHsJCVwKKwkJCWtpbGxfdGVzdCA9IDE7CQlcCisJCQlXQVJOX09OKDEpOwkJXAorCQl9CQkJCVwKKwl9IHdoaWxlICgwKQorCitlbnVtIGV2ZW50X3N0YXR1cyB7CisJRVZFTlRfRk9VTkQsCisJRVZFTlRfRFJPUFBFRCwKK307CisKK3N0YXRpYyBlbnVtIGV2ZW50X3N0YXR1cyByZWFkX2V2ZW50KGludCBjcHUpCit7CisJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKKwlpbnQgKmVudHJ5OworCXU2NCB0czsKKworCWV2ZW50ID0gcmluZ19idWZmZXJfY29uc3VtZShidWZmZXIsIGNwdSwgJnRzKTsKKwlpZiAoIWV2ZW50KQorCQlyZXR1cm4gRVZFTlRfRFJPUFBFRDsKKworCWVudHJ5ID0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CisJaWYgKCplbnRyeSAhPSBjcHUpIHsKKwkJS0lMTF9URVNUKCk7CisJCXJldHVybiBFVkVOVF9EUk9QUEVEOworCX0KKworCXJlYWQrKzsKKwlyZXR1cm4gRVZFTlRfRk9VTkQ7Cit9CisKK3N0YXRpYyBlbnVtIGV2ZW50X3N0YXR1cyByZWFkX3BhZ2UoaW50IGNwdSkKK3sKKwlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OworCXN0cnVjdCByYl9wYWdlICpycGFnZTsKKwl1bnNpZ25lZCBsb25nIGNvbW1pdDsKKwl2b2lkICpicGFnZTsKKwlpbnQgKmVudHJ5OworCWludCByZXQ7CisJaW50IGluYzsKKwlpbnQgaTsKKworCWJwYWdlID0gcmluZ19idWZmZXJfYWxsb2NfcmVhZF9wYWdlKGJ1ZmZlcik7CisJaWYgKCFicGFnZSkKKwkJcmV0dXJuIEVWRU5UX0RST1BQRUQ7CisKKwlyZXQgPSByaW5nX2J1ZmZlcl9yZWFkX3BhZ2UoYnVmZmVyLCAmYnBhZ2UsIFBBR0VfU0laRSwgY3B1LCAxKTsKKwlpZiAocmV0ID49IDApIHsKKwkJcnBhZ2UgPSBicGFnZTsKKwkJY29tbWl0ID0gbG9jYWxfcmVhZCgmcnBhZ2UtPmNvbW1pdCk7CisJCWZvciAoaSA9IDA7IGkgPCBjb21taXQgJiYgIWtpbGxfdGVzdDsgaSArPSBpbmMpIHsKKworCQkJaWYgKGkgPj0gKFBBR0VfU0laRSAtIG9mZnNldG9mKHN0cnVjdCByYl9wYWdlLCBkYXRhKSkpIHsKKwkJCQlLSUxMX1RFU1QoKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJaW5jID0gLTE7CisJCQlldmVudCA9ICh2b2lkICopJnJwYWdlLT5kYXRhW2ldOworCQkJc3dpdGNoIChldmVudC0+dHlwZV9sZW4pIHsKKwkJCWNhc2UgUklOR0JVRl9UWVBFX1BBRERJTkc6CisJCQkJLyogV2UgZG9uJ3QgZXhwZWN0IGFueSBwYWRkaW5nICovCisJCQkJS0lMTF9URVNUKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFJJTkdCVUZfVFlQRV9USU1FX0VYVEVORDoKKwkJCQlpbmMgPSA4OworCQkJCWJyZWFrOworCQkJY2FzZSAwOgorCQkJCWVudHJ5ID0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CisJCQkJaWYgKCplbnRyeSAhPSBjcHUpIHsKKwkJCQkJS0lMTF9URVNUKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZWFkKys7CisJCQkJaWYgKCFldmVudC0+YXJyYXlbMF0pIHsKKwkJCQkJS0lMTF9URVNUKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpbmMgPSBldmVudC0+YXJyYXlbMF07CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWVudHJ5ID0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CisJCQkJaWYgKCplbnRyeSAhPSBjcHUpIHsKKwkJCQkJS0lMTF9URVNUKCk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlyZWFkKys7CisJCQkJaW5jID0gKChldmVudC0+dHlwZV9sZW4gKyAxKSAqIDQpOworCQkJfQorCQkJaWYgKGtpbGxfdGVzdCkKKwkJCQlicmVhazsKKworCQkJaWYgKGluYyA8PSAwKSB7CisJCQkJS0lMTF9URVNUKCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJcmluZ19idWZmZXJfZnJlZV9yZWFkX3BhZ2UoYnVmZmVyLCBicGFnZSk7CisKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIEVWRU5UX0RST1BQRUQ7CisJcmV0dXJuIEVWRU5UX0ZPVU5EOworfQorCitzdGF0aWMgdm9pZCByaW5nX2J1ZmZlcl9jb25zdW1lcih2b2lkKQoreworCS8qIHRvZ2dsZSBiZXR3ZWVuIHJlYWRpbmcgcGFnZXMgYW5kIGV2ZW50cyAqLworCXJlYWRfZXZlbnRzIF49IDE7CisKKwlyZWFkID0gMDsKKwl3aGlsZSAoIXJlYWRlcl9maW5pc2ggJiYgIWtpbGxfdGVzdCkgeworCQlpbnQgZm91bmQ7CisKKwkJZG8geworCQkJaW50IGNwdTsKKworCQkJZm91bmQgPSAwOworCQkJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJCQllbnVtIGV2ZW50X3N0YXR1cyBzdGF0OworCisJCQkJaWYgKHJlYWRfZXZlbnRzKQorCQkJCQlzdGF0ID0gcmVhZF9ldmVudChjcHUpOworCQkJCWVsc2UKKwkJCQkJc3RhdCA9IHJlYWRfcGFnZShjcHUpOworCisJCQkJaWYgKGtpbGxfdGVzdCkKKwkJCQkJYnJlYWs7CisJCQkJaWYgKHN0YXQgPT0gRVZFTlRfRk9VTkQpCisJCQkJCWZvdW5kID0gMTsKKwkJCX0KKwkJfSB3aGlsZSAoZm91bmQgJiYgIWtpbGxfdGVzdCk7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKHJlYWRlcl9maW5pc2gpCisJCQlicmVhazsKKworCQlzY2hlZHVsZSgpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCXJlYWRlcl9maW5pc2ggPSAwOworCWNvbXBsZXRlKCZyZWFkX2RvbmUpOworfQorCitzdGF0aWMgdm9pZCByaW5nX2J1ZmZlcl9wcm9kdWNlcih2b2lkKQoreworCXN0cnVjdCB0aW1ldmFsIHN0YXJ0X3R2OworCXN0cnVjdCB0aW1ldmFsIGVuZF90djsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdGltZTsKKwl1bnNpZ25lZCBsb25nIGxvbmcgZW50cmllczsKKwl1bnNpZ25lZCBsb25nIGxvbmcgb3ZlcnJ1bnM7CisJdW5zaWduZWQgbG9uZyBtaXNzZWQgPSAwOworCXVuc2lnbmVkIGxvbmcgaGl0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGF2ZzsKKwlpbnQgY250ID0gMDsKKworCS8qCisJICogSGFtbWVyIHRoZSBidWZmZXIgZm9yIDEwIHNlY3MgKHRoaXMgbWF5CisJICogbWFrZSB0aGUgc3lzdGVtIHN0YWxsKQorCSAqLworCXByX2luZm8oIlN0YXJ0aW5nIHJpbmcgYnVmZmVyIGhhbW1lclxuIik7CisJZG9fZ2V0dGltZW9mZGF5KCZzdGFydF90dik7CisJZG8geworCQlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OworCQlpbnQgKmVudHJ5OworCisJCWV2ZW50ID0gcmluZ19idWZmZXJfbG9ja19yZXNlcnZlKGJ1ZmZlciwgMTApOworCQlpZiAoIWV2ZW50KSB7CisJCQltaXNzZWQrKzsKKwkJfSBlbHNlIHsKKwkJCWhpdCsrOworCQkJZW50cnkgPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKKwkJCSplbnRyeSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsKKwkJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQoYnVmZmVyLCBldmVudCk7CisJCX0KKwkJZG9fZ2V0dGltZW9mZGF5KCZlbmRfdHYpOworCisJCWNudCsrOworCQlpZiAoY29uc3VtZXIgJiYgIShjbnQgJSB3YWtldXBfaW50ZXJ2YWwpKQorCQkJd2FrZV91cF9wcm9jZXNzKGNvbnN1bWVyKTsKKworI2lmbmRlZiBDT05GSUdfUFJFRU1QVAorCQkvKgorCQkgKiBJZiB3ZSBhcmUgYSBub24gcHJlZW1wdCBrZXJuZWwsIHRoZSAxMCBzZWNvbmQgcnVuIHdpbGwKKwkJICogc3RvcCBldmVyeXRoaW5nIHdoaWxlIGl0IHJ1bnMuIEluc3RlYWQsIHdlIHdpbGwgY2FsbAorCQkgKiBjb25kX3Jlc2NoZWQgYW5kIGFsc28gYWRkIGFueSB0aW1lIHRoYXQgd2FzIGxvc3QgYnkgYQorCQkgKiByZXNjZWR1bGUuCisJCSAqCisJCSAqIERvIGEgY29uZCByZXNjaGVkIGF0IHRoZSBzYW1lIGZyZXF1ZW5jeSB3ZSB3b3VsZCB3YWtlIHVwCisJCSAqIHRoZSByZWFkZXIuCisJCSAqLworCQlpZiAoY250ICUgd2FrZXVwX2ludGVydmFsKQorCQkJY29uZF9yZXNjaGVkKCk7CisjZW5kaWYKKworCX0gd2hpbGUgKGVuZF90di50dl9zZWMgPCAoc3RhcnRfdHYudHZfc2VjICsgUlVOX1RJTUUpICYmICFraWxsX3Rlc3QpOworCXByX2luZm8oIkVuZCByaW5nIGJ1ZmZlciBoYW1tZXJcbiIpOworCisJaWYgKGNvbnN1bWVyKSB7CisJCS8qIEluaXQgYm90aCBjb21wbGV0aW9ucyBoZXJlIHRvIGF2b2lkIHJhY2VzICovCisJCWluaXRfY29tcGxldGlvbigmcmVhZF9zdGFydCk7CisJCWluaXRfY29tcGxldGlvbigmcmVhZF9kb25lKTsKKwkJLyogdGhlIGNvbXBsZXRpb25zIG11c3QgYmUgdmlzaWJsZSBiZWZvcmUgdGhlIGZpbmlzaCB2YXIgKi8KKwkJc21wX3dtYigpOworCQlyZWFkZXJfZmluaXNoID0gMTsKKwkJLyogZmluaXNoIHZhciB2aXNpYmxlIGJlZm9yZSB3YWtpbmcgdXAgdGhlIGNvbnN1bWVyICovCisJCXNtcF93bWIoKTsKKwkJd2FrZV91cF9wcm9jZXNzKGNvbnN1bWVyKTsKKwkJd2FpdF9mb3JfY29tcGxldGlvbigmcmVhZF9kb25lKTsKKwl9CisKKwl0aW1lID0gZW5kX3R2LnR2X3NlYyAtIHN0YXJ0X3R2LnR2X3NlYzsKKwl0aW1lICo9IFVTRUNfUEVSX1NFQzsKKwl0aW1lICs9IChsb25nIGxvbmcpKChsb25nKWVuZF90di50dl91c2VjIC0gKGxvbmcpc3RhcnRfdHYudHZfdXNlYyk7CisKKwllbnRyaWVzID0gcmluZ19idWZmZXJfZW50cmllcyhidWZmZXIpOworCW92ZXJydW5zID0gcmluZ19idWZmZXJfb3ZlcnJ1bnMoYnVmZmVyKTsKKworCWlmIChraWxsX3Rlc3QpCisJCXByX2luZm8oIkVSUk9SIVxuIik7CisJcHJfaW5mbygiVGltZTogICAgICVsbGQgKHVzZWNzKVxuIiwgdGltZSk7CisJcHJfaW5mbygiT3ZlcnJ1bnM6ICVsbGRcbiIsIG92ZXJydW5zKTsKKwlpZiAoZGlzYWJsZV9yZWFkZXIpCisJCXByX2luZm8oIlJlYWQ6ICAgICAocmVhZGVyIGRpc2FibGVkKVxuIik7CisJZWxzZQorCQlwcl9pbmZvKCJSZWFkOiAgICAgJWxkICAoYnkgJXMpXG4iLCByZWFkLAorCQkJcmVhZF9ldmVudHMgPyAiZXZlbnRzIiA6ICJwYWdlcyIpOworCXByX2luZm8oIkVudHJpZXM6ICAlbGxkXG4iLCBlbnRyaWVzKTsKKwlwcl9pbmZvKCJUb3RhbDogICAgJWxsZFxuIiwgZW50cmllcyArIG92ZXJydW5zICsgcmVhZCk7CisJcHJfaW5mbygiTWlzc2VkOiAgICVsZFxuIiwgbWlzc2VkKTsKKwlwcl9pbmZvKCJIaXQ6ICAgICAgJWxkXG4iLCBoaXQpOworCisJLyogQ29udmVydCB0aW1lIGZyb20gdXNlY3MgdG8gbWlsbGlzZWNzICovCisJZG9fZGl2KHRpbWUsIFVTRUNfUEVSX01TRUMpOworCWlmICh0aW1lKQorCQloaXQgLz0gKGxvbmcpdGltZTsKKwllbHNlCisJCXByX2luZm8oIlRJTUUgSVMgWkVSTz8/XG4iKTsKKworCXByX2luZm8oIkVudHJpZXMgcGVyIG1pbGxpc2VjOiAlbGRcbiIsIGhpdCk7CisKKwlpZiAoaGl0KSB7CisJCS8qIENhbGN1bGF0ZSB0aGUgYXZlcmFnZSB0aW1lIGluIG5hbm9zZWNzICovCisJCWF2ZyA9IE5TRUNfUEVSX01TRUMgLyBoaXQ7CisJCXByX2luZm8oIiVsZCBucyBwZXIgZW50cnlcbiIsIGF2Zyk7CisJfQorCisJaWYgKG1pc3NlZCkgeworCQlpZiAodGltZSkKKwkJCW1pc3NlZCAvPSAobG9uZyl0aW1lOworCisJCXByX2luZm8oIlRvdGFsIGl0ZXJhdGlvbnMgcGVyIG1pbGxpc2VjOiAlbGRcbiIsIGhpdCArIG1pc3NlZCk7CisKKwkJLyogaXQgaXMgcG9zc2libGUgdGhhdCBoaXQgKyBtaXNzZWQgd2lsbCBvdmVyZmxvdyBhbmQgYmUgemVybyAqLworCQlpZiAoIShoaXQgKyBtaXNzZWQpKSB7CisJCQlwcl9pbmZvKCJoaXQgKyBtaXNzZWQgb3ZlcmZsb3dlZCBhbmQgdG90YWxsZWQgemVybyFcbiIpOworCQkJaGl0LS07IC8qIG1ha2UgaXQgbm9uIHplcm8gKi8KKwkJfQorCisJCS8qIENhY3VsYXRlIHRoZSBhdmVyYWdlIHRpbWUgaW4gbmFub3NlY3MgKi8KKwkJYXZnID0gTlNFQ19QRVJfTVNFQyAvIChoaXQgKyBtaXNzZWQpOworCQlwcl9pbmZvKCIlbGQgbnMgcGVyIGVudHJ5XG4iLCBhdmcpOworCX0KK30KKworc3RhdGljIHZvaWQgd2FpdF90b19kaWUodm9pZCkKK3sKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKSB7CisJCXNjaGVkdWxlKCk7CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKK30KKworc3RhdGljIGludCByaW5nX2J1ZmZlcl9jb25zdW1lcl90aHJlYWQodm9pZCAqYXJnKQoreworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpICYmICFraWxsX3Rlc3QpIHsKKwkJY29tcGxldGUoJnJlYWRfc3RhcnQpOworCisJCXJpbmdfYnVmZmVyX2NvbnN1bWVyKCk7CisKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJaWYgKGt0aHJlYWRfc2hvdWxkX3N0b3AoKSB8fCBraWxsX3Rlc3QpCisJCQlicmVhazsKKworCQlzY2hlZHVsZSgpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCV9fc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKKworCWlmIChraWxsX3Rlc3QpCisJCXdhaXRfdG9fZGllKCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByaW5nX2J1ZmZlcl9wcm9kdWNlcl90aHJlYWQodm9pZCAqYXJnKQoreworCWluaXRfY29tcGxldGlvbigmcmVhZF9zdGFydCk7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSAmJiAha2lsbF90ZXN0KSB7CisJCXJpbmdfYnVmZmVyX3Jlc2V0KGJ1ZmZlcik7CisKKwkJaWYgKGNvbnN1bWVyKSB7CisJCQlzbXBfd21iKCk7CisJCQl3YWtlX3VwX3Byb2Nlc3MoY29uc3VtZXIpOworCQkJd2FpdF9mb3JfY29tcGxldGlvbigmcmVhZF9zdGFydCk7CisJCX0KKworCQlyaW5nX2J1ZmZlcl9wcm9kdWNlcigpOworCisJCXByX2luZm8oIlNsZWVwaW5nIGZvciAxMCBzZWNzXG4iKTsKKwkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwkJc2NoZWR1bGVfdGltZW91dChIWiAqIFNMRUVQX1RJTUUpOworCQlfX3NldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJfQorCisJaWYgKGtpbGxfdGVzdCkKKwkJd2FpdF90b19kaWUoKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9faW5pdCByaW5nX2J1ZmZlcl9iZW5jaG1hcmtfaW5pdCh2b2lkKQoreworCWludCByZXQ7CisKKwkvKiBtYWtlIGEgb25lIG1lZyBidWZmZXIgaW4gb3ZlcndpdGUgbW9kZSAqLworCWJ1ZmZlciA9IHJpbmdfYnVmZmVyX2FsbG9jKDEwMDAwMDAsIFJCX0ZMX09WRVJXUklURSk7CisJaWYgKCFidWZmZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJaWYgKCFkaXNhYmxlX3JlYWRlcikgeworCQljb25zdW1lciA9IGt0aHJlYWRfY3JlYXRlKHJpbmdfYnVmZmVyX2NvbnN1bWVyX3RocmVhZCwKKwkJCQkJICBOVUxMLCAicmJfY29uc3VtZXIiKTsKKwkJcmV0ID0gUFRSX0VSUihjb25zdW1lcik7CisJCWlmIChJU19FUlIoY29uc3VtZXIpKQorCQkJZ290byBvdXRfZmFpbDsKKwl9CisKKwlwcm9kdWNlciA9IGt0aHJlYWRfcnVuKHJpbmdfYnVmZmVyX3Byb2R1Y2VyX3RocmVhZCwKKwkJCSAgICAgICBOVUxMLCAicmJfcHJvZHVjZXIiKTsKKwlyZXQgPSBQVFJfRVJSKHByb2R1Y2VyKTsKKworCWlmIChJU19FUlIocHJvZHVjZXIpKQorCQlnb3RvIG91dF9raWxsOworCisJcmV0dXJuIDA7CisKKyBvdXRfa2lsbDoKKwlpZiAoY29uc3VtZXIpCisJCWt0aHJlYWRfc3RvcChjb25zdW1lcik7CisKKyBvdXRfZmFpbDoKKwlyaW5nX2J1ZmZlcl9mcmVlKGJ1ZmZlcik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHJpbmdfYnVmZmVyX2JlbmNobWFya19leGl0KHZvaWQpCit7CisJa3RocmVhZF9zdG9wKHByb2R1Y2VyKTsKKwlpZiAoY29uc3VtZXIpCisJCWt0aHJlYWRfc3RvcChjb25zdW1lcik7CisJcmluZ19idWZmZXJfZnJlZShidWZmZXIpOworfQorCittb2R1bGVfaW5pdChyaW5nX2J1ZmZlcl9iZW5jaG1hcmtfaW5pdCk7Cittb2R1bGVfZXhpdChyaW5nX2J1ZmZlcl9iZW5jaG1hcmtfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlbiBSb3N0ZWR0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInJpbmdfYnVmZmVyX2JlbmNobWFyayIpOworTU9EVUxFX0xJQ0VOU0UoIkdQTCIpOwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwppbmRleCBjZGE4MWVjLi44YWNkOWI4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuYwpAQCAtMTcxLDYgKzE3MSwxMyBAQAogCiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IHRyYWNlX2FycmF5X2NwdSwgZ2xvYmFsX3RyYWNlX2NwdSk7CiAKK2ludCBmaWx0ZXJfY3VycmVudF9jaGVja19kaXNjYXJkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgdm9pZCAqcmVjLAorCQkJCSBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50KQoreworCXJldHVybiBmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCByZWMsIGdsb2JhbF90cmFjZS5idWZmZXIsIGV2ZW50KTsKK30KK0VYUE9SVF9TWU1CT0xfR1BMKGZpbHRlcl9jdXJyZW50X2NoZWNrX2Rpc2NhcmQpOworCiBjeWNsZV90IGZ0cmFjZV9ub3coaW50IGNwdSkKIHsKIAl1NjQgdHM7CkBAIC0yNTUsNyArMjYyLDggQEAKIAogLyogdHJhY2VfZmxhZ3MgaG9sZHMgdHJhY2Vfb3B0aW9ucyBkZWZhdWx0IHZhbHVlcyAqLwogdW5zaWduZWQgbG9uZyB0cmFjZV9mbGFncyA9IFRSQUNFX0lURVJfUFJJTlRfUEFSRU5UIHwgVFJBQ0VfSVRFUl9QUklOVEsgfAotCVRSQUNFX0lURVJfQU5OT1RBVEUgfCBUUkFDRV9JVEVSX0NPTlRFWFRfSU5GTyB8IFRSQUNFX0lURVJfU0xFRVBfVElNRTsKKwlUUkFDRV9JVEVSX0FOTk9UQVRFIHwgVFJBQ0VfSVRFUl9DT05URVhUX0lORk8gfCBUUkFDRV9JVEVSX1NMRUVQX1RJTUUgfAorCVRSQUNFX0lURVJfR1JBUEhfVElNRTsKIAogLyoqCiAgKiB0cmFjZV93YWtlX3VwIC0gd2FrZSB1cCB0YXNrcyB3YWl0aW5nIGZvciB0cmFjZSBpbnB1dApAQCAtMzE3LDYgKzMyNSw3IEBACiAJImxhdGVuY3ktZm9ybWF0IiwKIAkiZ2xvYmFsLWNsb2NrIiwKIAkic2xlZXAtdGltZSIsCisJImdyYXBoLXRpbWUiLAogCU5VTEwKIH07CiAKQEAgLTQwMiwxNyArNDExLDYgQEAKIAlyZXR1cm4gY250OwogfQogCi1zdGF0aWMgdm9pZAotdHJhY2VfcHJpbnRfc2VxKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHRyYWNlX3NlcSAqcykKLXsKLQlpbnQgbGVuID0gcy0+bGVuID49IFBBR0VfU0laRSA/IFBBR0VfU0laRSAtIDEgOiBzLT5sZW47Ci0KLQlzLT5idWZmZXJbbGVuXSA9IDA7Ci0Jc2VxX3B1dHMobSwgcy0+YnVmZmVyKTsKLQotCXRyYWNlX3NlcV9pbml0KHMpOwotfQotCiAvKioKICAqIHVwZGF0ZV9tYXhfdHIgLSBzbmFwc2hvdCBhbGwgdHJhY2UgYnVmZmVycyBmcm9tIGdsb2JhbF90cmFjZSB0byBtYXhfdHIKICAqIEB0cjogdHJhY2VyCkBAIC02NDEsNiArNjM5LDE2IEBACiAJCXRyYWNpbmdfcmVzZXQodHIsIGNwdSk7CiB9CiAKK3ZvaWQgdHJhY2luZ19yZXNldF9jdXJyZW50KGludCBjcHUpCit7CisJdHJhY2luZ19yZXNldCgmZ2xvYmFsX3RyYWNlLCBjcHUpOworfQorCit2b2lkIHRyYWNpbmdfcmVzZXRfY3VycmVudF9vbmxpbmVfY3B1cyh2b2lkKQoreworCXRyYWNpbmdfcmVzZXRfb25saW5lX2NwdXMoJmdsb2JhbF90cmFjZSk7Cit9CisKICNkZWZpbmUgU0FWRURfQ01ETElORVMgMTI4CiAjZGVmaW5lIE5PX0NNRExJTkVfTUFQIFVJTlRfTUFYCiBzdGF0aWMgdW5zaWduZWQgbWFwX3BpZF90b19jbWRsaW5lW1BJRF9NQVhfREVGQVVMVCsxXTsKQEAgLTgwMCw2ICs4MDgsNyBAQAogCQlyZXR1cm47CiAJfQogCisJcHJlZW1wdF9kaXNhYmxlKCk7CiAJX19yYXdfc3Bpbl9sb2NrKCZ0cmFjZV9jbWRsaW5lX2xvY2spOwogCW1hcCA9IG1hcF9waWRfdG9fY21kbGluZVtwaWRdOwogCWlmIChtYXAgIT0gTk9fQ01ETElORV9NQVApCkBAIC04MDgsNiArODE3LDcgQEAKIAkJc3RyY3B5KGNvbW0sICI8Li4uPiIpOwogCiAJX19yYXdfc3Bpbl91bmxvY2soJnRyYWNlX2NtZGxpbmVfbG9jayk7CisJcHJlZW1wdF9lbmFibGUoKTsKIH0KIAogdm9pZCB0cmFjaW5nX3JlY29yZF9jbWRsaW5lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKQpAQCAtODQwLDcgKzg1MCw3IEBACiB9CiAKIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZShzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLAotCQkJCQkJICAgIHVuc2lnbmVkIGNoYXIgdHlwZSwKKwkJCQkJCSAgICBpbnQgdHlwZSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpCiB7CkBAIC04ODMsMzAgKzg5Myw0MCBAQAogfQogCiBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKgotdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKHVuc2lnbmVkIGNoYXIgdHlwZSwgdW5zaWduZWQgbG9uZyBsZW4sCit0cmFjZV9jdXJyZW50X2J1ZmZlcl9sb2NrX3Jlc2VydmUoaW50IHR5cGUsIHVuc2lnbmVkIGxvbmcgbGVuLAogCQkJCSAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKQogewogCXJldHVybiB0cmFjZV9idWZmZXJfbG9ja19yZXNlcnZlKCZnbG9iYWxfdHJhY2UsCiAJCQkJCSB0eXBlLCBsZW4sIGZsYWdzLCBwYyk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh0cmFjZV9jdXJyZW50X2J1ZmZlcl9sb2NrX3Jlc2VydmUpOwogCiB2b2lkIHRyYWNlX2N1cnJlbnRfYnVmZmVyX3VubG9ja19jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCwKIAkJCQkJdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKQogewotCXJldHVybiBfX3RyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KCZnbG9iYWxfdHJhY2UsIGV2ZW50LCBmbGFncywgcGMsIDEpOworCV9fdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQoJmdsb2JhbF90cmFjZSwgZXZlbnQsIGZsYWdzLCBwYywgMSk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh0cmFjZV9jdXJyZW50X2J1ZmZlcl91bmxvY2tfY29tbWl0KTsKIAogdm9pZCB0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXQoc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCwKIAkJCQkJdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKQogewotCXJldHVybiBfX3RyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KCZnbG9iYWxfdHJhY2UsIGV2ZW50LCBmbGFncywgcGMsIDApOworCV9fdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQoJmdsb2JhbF90cmFjZSwgZXZlbnQsIGZsYWdzLCBwYywgMCk7CiB9CitFWFBPUlRfU1lNQk9MX0dQTCh0cmFjZV9ub3dha2VfYnVmZmVyX3VubG9ja19jb21taXQpOworCit2b2lkIHRyYWNlX2N1cnJlbnRfYnVmZmVyX2Rpc2NhcmRfY29tbWl0KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCit7CisJcmluZ19idWZmZXJfZGlzY2FyZF9jb21taXQoZ2xvYmFsX3RyYWNlLmJ1ZmZlciwgZXZlbnQpOworfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfY3VycmVudF9idWZmZXJfZGlzY2FyZF9jb21taXQpOwogCiB2b2lkCiB0cmFjZV9mdW5jdGlvbihzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLAogCSAgICAgICB1bnNpZ25lZCBsb25nIGlwLCB1bnNpZ25lZCBsb25nIHBhcmVudF9pcCwgdW5zaWduZWQgbG9uZyBmbGFncywKIAkgICAgICAgaW50IHBjKQogeworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9mdW5jdGlvbjsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBmdHJhY2VfZW50cnkgKmVudHJ5OwogCkBAIC05MjEsNyArOTQxLDkgQEAKIAllbnRyeQk9IHJpbmdfYnVmZmVyX2V2ZW50X2RhdGEoZXZlbnQpOwogCWVudHJ5LT5pcAkJCT0gaXA7CiAJZW50cnktPnBhcmVudF9pcAkJPSBwYXJlbnRfaXA7Ci0JcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CisKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOwogfQogCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgpAQCAtOTMwLDYgKzk1Miw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQlpbnQgcGMpCiB7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2Z1bmNncmFwaF9lbnRyeTsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBmdHJhY2VfZ3JhcGhfZW50X2VudHJ5ICplbnRyeTsKIApAQCAtOTQyLDcgKzk2NSw4IEBACiAJCXJldHVybiAwOwogCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CiAJZW50cnktPmdyYXBoX2VudAkJCT0gKnRyYWNlOwotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQoZ2xvYmFsX3RyYWNlLmJ1ZmZlciwgZXZlbnQpOworCWlmICghZmlsdGVyX2N1cnJlbnRfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgZXZlbnQpKQorCQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KGdsb2JhbF90cmFjZS5idWZmZXIsIGV2ZW50KTsKIAogCXJldHVybiAxOwogfQpAQCAtOTUyLDYgKzk3Niw3IEBACiAJCQkJdW5zaWduZWQgbG9uZyBmbGFncywKIAkJCQlpbnQgcGMpCiB7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2Z1bmNncmFwaF9leGl0OwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IGZ0cmFjZV9ncmFwaF9yZXRfZW50cnkgKmVudHJ5OwogCkBAIC05NjQsNyArOTg5LDggQEAKIAkJcmV0dXJuOwogCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CiAJZW50cnktPnJldAkJCQk9ICp0cmFjZTsKLQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KGdsb2JhbF90cmFjZS5idWZmZXIsIGV2ZW50KTsKKwlpZiAoIWZpbHRlcl9jdXJyZW50X2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdChnbG9iYWxfdHJhY2UuYnVmZmVyLCBldmVudCk7CiB9CiAjZW5kaWYKIApAQCAtOTgyLDYgKzEwMDgsNyBAQAogCQkJCSBpbnQgc2tpcCwgaW50IHBjKQogewogI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2tlcm5lbF9zdGFjazsKIAlzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50OwogCXN0cnVjdCBzdGFja19lbnRyeSAqZW50cnk7CiAJc3RydWN0IHN0YWNrX3RyYWNlIHRyYWNlOwpAQCAtOTk5LDcgKzEwMjYsOCBAQAogCXRyYWNlLmVudHJpZXMJCT0gZW50cnktPmNhbGxlcjsKIAogCXNhdmVfc3RhY2tfdHJhY2UoJnRyYWNlKTsKLQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOwogI2VuZGlmCiB9CiAKQEAgLTEwMjQsNiArMTA1Miw3IEBACiAJCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKQogewogI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X3VzZXJfc3RhY2s7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgdXNlcnN0YWNrX2VudHJ5ICplbnRyeTsKIAlzdHJ1Y3Qgc3RhY2tfdHJhY2UgdHJhY2U7CkBAIC0xMDQ1LDcgKzEwNzQsOCBAQAogCXRyYWNlLmVudHJpZXMJCT0gZW50cnktPmNhbGxlcjsKIAogCXNhdmVfc3RhY2tfdHJhY2VfdXNlcigmdHJhY2UpOwotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CiAjZW5kaWYKIH0KIApAQCAtMTA4OSw2ICsxMTE5LDcgQEAKIAkJCSAgIHN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCwKIAkJCSAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYykKIHsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfY29udGV4dF9zd2l0Y2g7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgY3R4X3N3aXRjaF9lbnRyeSAqZW50cnk7CiAKQEAgLTExMDQsNyArMTEzNSw5IEBACiAJZW50cnktPm5leHRfcHJpbwkJPSBuZXh0LT5wcmlvOwogCWVudHJ5LT5uZXh0X3N0YXRlCQk9IG5leHQtPnN0YXRlOwogCWVudHJ5LT5uZXh0X2NwdQk9IHRhc2tfY3B1KG5leHQpOwotCXRyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLCBldmVudCwgZmxhZ3MsIHBjKTsKKworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQodHIsIGV2ZW50LCBmbGFncywgcGMpOwogfQogCiB2b2lkCkBAIC0xMTEzLDYgKzExNDYsNyBAQAogCQkJICAgc3RydWN0IHRhc2tfc3RydWN0ICpjdXJyLAogCQkJICAgdW5zaWduZWQgbG9uZyBmbGFncywgaW50IHBjKQogeworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF93YWtldXA7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgY3R4X3N3aXRjaF9lbnRyeSAqZW50cnk7CiAKQEAgLTExMjksNyArMTE2Myw4IEBACiAJZW50cnktPm5leHRfc3RhdGUJCT0gd2FrZWUtPnN0YXRlOwogCWVudHJ5LT5uZXh0X2NwdQkJCT0gdGFza19jcHUod2FrZWUpOwogCi0JcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CisJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgdHItPmJ1ZmZlciwgZXZlbnQpKQorCQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKIAlmdHJhY2VfdHJhY2Vfc3RhY2sodHIsIGZsYWdzLCA2LCBwYyk7CiAJZnRyYWNlX3RyYWNlX3VzZXJzdGFjayh0ciwgZmxhZ3MsIHBjKTsKIH0KQEAgLTEyMzAsMTEgKzEyNjUsMTMgQEAKIAkJKHJhd19zcGlubG9ja190KV9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRDsKIAlzdGF0aWMgdTMyIHRyYWNlX2J1ZltUUkFDRV9CVUZfU0laRV07CiAKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfYnByaW50OwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9ICZnbG9iYWxfdHJhY2U7CiAJc3RydWN0IHRyYWNlX2FycmF5X2NwdSAqZGF0YTsKIAlzdHJ1Y3QgYnByaW50X2VudHJ5ICplbnRyeTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBkaXNhYmxlOwogCWludCByZXNjaGVkOwogCWludCBjcHUsIGxlbiA9IDAsIHNpemUsIHBjOwogCkBAIC0xMjQ5LDcgKzEyODYsOCBAQAogCWNwdSA9IHJhd19zbXBfcHJvY2Vzc29yX2lkKCk7CiAJZGF0YSA9IHRyLT5kYXRhW2NwdV07CiAKLQlpZiAodW5saWtlbHkoYXRvbWljX3JlYWQoJmRhdGEtPmRpc2FibGVkKSkpCisJZGlzYWJsZSA9IGF0b21pY19pbmNfcmV0dXJuKCZkYXRhLT5kaXNhYmxlZCk7CisJaWYgKHVubGlrZWx5KGRpc2FibGUgIT0gMSkpCiAJCWdvdG8gb3V0OwogCiAJLyogTG9ja2RlcCB1c2VzIHRyYWNlX3ByaW50ayBmb3IgbG9jayB0cmFjaW5nICovCkBAIC0xMjY5LDEzICsxMzA3LDE1IEBACiAJZW50cnktPmZtdAkJCT0gZm10OwogCiAJbWVtY3B5KGVudHJ5LT5idWYsIHRyYWNlX2J1Ziwgc2l6ZW9mKHUzMikgKiBsZW4pOwotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CiAKIG91dF91bmxvY2s6CiAJX19yYXdfc3Bpbl91bmxvY2soJnRyYWNlX2J1Zl9sb2NrKTsKIAlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiAKIG91dDoKKwlhdG9taWNfZGVjX3JldHVybigmZGF0YS0+ZGlzYWJsZWQpOwogCWZ0cmFjZV9wcmVlbXB0X2VuYWJsZShyZXNjaGVkKTsKIAl1bnBhdXNlX2dyYXBoX3RyYWNpbmcoKTsKIApAQCAtMTI4OCwxMiArMTMyOCwxNCBAQAogCXN0YXRpYyByYXdfc3BpbmxvY2tfdCB0cmFjZV9idWZfbG9jayA9IF9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRDsKIAlzdGF0aWMgY2hhciB0cmFjZV9idWZbVFJBQ0VfQlVGX1NJWkVdOwogCisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X3ByaW50OwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9ICZnbG9iYWxfdHJhY2U7CiAJc3RydWN0IHRyYWNlX2FycmF5X2NwdSAqZGF0YTsKIAlpbnQgY3B1LCBsZW4gPSAwLCBzaXplLCBwYzsKIAlzdHJ1Y3QgcHJpbnRfZW50cnkgKmVudHJ5OwogCXVuc2lnbmVkIGxvbmcgaXJxX2ZsYWdzOworCWludCBkaXNhYmxlOwogCiAJaWYgKHRyYWNpbmdfZGlzYWJsZWQgfHwgdHJhY2luZ19zZWxmdGVzdF9ydW5uaW5nKQogCQlyZXR1cm4gMDsKQEAgLTEzMDMsNyArMTM0NSw4IEBACiAJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlkYXRhID0gdHItPmRhdGFbY3B1XTsKIAotCWlmICh1bmxpa2VseShhdG9taWNfcmVhZCgmZGF0YS0+ZGlzYWJsZWQpKSkKKwlkaXNhYmxlID0gYXRvbWljX2luY19yZXR1cm4oJmRhdGEtPmRpc2FibGVkKTsKKwlpZiAodW5saWtlbHkoZGlzYWJsZSAhPSAxKSkKIAkJZ290byBvdXQ7CiAKIAlwYXVzZV9ncmFwaF90cmFjaW5nKCk7CkBAIC0xMzIzLDEzICsxMzY2LDE1IEBACiAKIAltZW1jcHkoJmVudHJ5LT5idWYsIHRyYWNlX2J1ZiwgbGVuKTsKIAllbnRyeS0+YnVmW2xlbl0gPSAwOwotCXJpbmdfYnVmZmVyX3VubG9ja19jb21taXQodHItPmJ1ZmZlciwgZXZlbnQpOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CiAKICBvdXRfdW5sb2NrOgogCV9fcmF3X3NwaW5fdW5sb2NrKCZ0cmFjZV9idWZfbG9jayk7CiAJcmF3X2xvY2FsX2lycV9yZXN0b3JlKGlycV9mbGFncyk7CiAJdW5wYXVzZV9ncmFwaF90cmFjaW5nKCk7CiAgb3V0OgorCWF0b21pY19kZWNfcmV0dXJuKCZkYXRhLT5kaXNhYmxlZCk7CiAJcHJlZW1wdF9lbmFibGVfbm90cmFjZSgpOwogCiAJcmV0dXJuIGxlbjsKQEAgLTE1MjYsMTIgKzE1NzEsMTQgQEAKIAkJcCA9IHNfbmV4dChtLCBwLCAmbCk7CiAJfQogCisJdHJhY2VfZXZlbnRfcmVhZF9sb2NrKCk7CiAJcmV0dXJuIHA7CiB9CiAKIHN0YXRpYyB2b2lkIHNfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnApCiB7CiAJYXRvbWljX2RlYygmdHJhY2VfcmVjb3JkX2NtZGxpbmVfZGlzYWJsZWQpOworCXRyYWNlX2V2ZW50X3JlYWRfdW5sb2NrKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHByaW50X2xhdF9oZWxwX2hlYWRlcihzdHJ1Y3Qgc2VxX2ZpbGUgKm0pCkBAIC0xNzc0LDYgKzE4MjEsNyBAQAogCXJldHVybiAxOwogfQogCisvKiAgQ2FsbGVkIHdpdGggdHJhY2VfZXZlbnRfcmVhZF9sb2NrKCkgaGVsZC4gKi8KIHN0YXRpYyBlbnVtIHByaW50X2xpbmVfdCBwcmludF90cmFjZV9saW5lKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKIAllbnVtIHByaW50X2xpbmVfdCByZXQ7CkBAIC0yMzk3LDYgKzI0NDUsNTYgQEAKIH07CiAKIHN0YXRpYyBzc2l6ZV90Cit0cmFjaW5nX3NhdmVkX2NtZGxpbmVzX3JlYWQoc3RydWN0IGZpbGUgKmZpbGUsIGNoYXIgX191c2VyICp1YnVmLAorCQkJCXNpemVfdCBjbnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyICpidWZfY29tbTsKKwljaGFyICpmaWxlX2J1ZjsKKwljaGFyICpidWY7CisJaW50IGxlbiA9IDA7CisJaW50IHBpZDsKKwlpbnQgaTsKKworCWZpbGVfYnVmID0ga21hbGxvYyhTQVZFRF9DTURMSU5FUyooMTYrVEFTS19DT01NX0xFTiksIEdGUF9LRVJORUwpOworCWlmICghZmlsZV9idWYpCisJCXJldHVybiAtRU5PTUVNOworCisJYnVmX2NvbW0gPSBrbWFsbG9jKFRBU0tfQ09NTV9MRU4sIEdGUF9LRVJORUwpOworCWlmICghYnVmX2NvbW0pIHsKKwkJa2ZyZWUoZmlsZV9idWYpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlidWYgPSBmaWxlX2J1ZjsKKworCWZvciAoaSA9IDA7IGkgPCBTQVZFRF9DTURMSU5FUzsgaSsrKSB7CisJCWludCByOworCisJCXBpZCA9IG1hcF9jbWRsaW5lX3RvX3BpZFtpXTsKKwkJaWYgKHBpZCA9PSAtMSB8fCBwaWQgPT0gTk9fQ01ETElORV9NQVApCisJCQljb250aW51ZTsKKworCQl0cmFjZV9maW5kX2NtZGxpbmUocGlkLCBidWZfY29tbSk7CisJCXIgPSBzcHJpbnRmKGJ1ZiwgIiVkICVzXG4iLCBwaWQsIGJ1Zl9jb21tKTsKKwkJYnVmICs9IHI7CisJCWxlbiArPSByOworCX0KKworCWxlbiA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNudCwgcHBvcywKKwkJCQkgICAgICBmaWxlX2J1ZiwgbGVuKTsKKworCWtmcmVlKGZpbGVfYnVmKTsKKwlrZnJlZShidWZfY29tbSk7CisKKwlyZXR1cm4gbGVuOworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX3NhdmVkX2NtZGxpbmVzX2ZvcHMgPSB7CisgICAgLm9wZW4gICAgICAgPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKKyAgICAucmVhZCAgICAgICA9IHRyYWNpbmdfc2F2ZWRfY21kbGluZXNfcmVhZCwKK307CisKK3N0YXRpYyBzc2l6ZV90CiB0cmFjaW5nX2N0cmxfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCiAJCSAgc2l6ZV90IGNudCwgbG9mZl90ICpwcG9zKQogewpAQCAtMjcyOCw2ICsyODI2LDkgQEAKIAkvKiB0cmFjZSBwaXBlIGRvZXMgbm90IHNob3cgc3RhcnQgb2YgYnVmZmVyICovCiAJY3B1bWFza19zZXRhbGwoaXRlci0+c3RhcnRlZCk7CiAKKwlpZiAodHJhY2VfZmxhZ3MgJiBUUkFDRV9JVEVSX0xBVEVOQ1lfRk1UKQorCQlpdGVyLT5pdGVyX2ZsYWdzIHw9IFRSQUNFX0ZJTEVfTEFUX0ZNVDsKKwogCWl0ZXItPmNwdV9maWxlID0gY3B1X2ZpbGU7CiAJaXRlci0+dHIgPSAmZ2xvYmFsX3RyYWNlOwogCW11dGV4X2luaXQoJml0ZXItPm11dGV4KTsKQEAgLTI5MTUsNiArMzAxNiw3IEBACiAJICAgICAgIG9mZnNldG9mKHN0cnVjdCB0cmFjZV9pdGVyYXRvciwgc2VxKSk7CiAJaXRlci0+cG9zID0gLTE7CiAKKwl0cmFjZV9ldmVudF9yZWFkX2xvY2soKTsKIAl3aGlsZSAoZmluZF9uZXh0X2VudHJ5X2luYyhpdGVyKSAhPSBOVUxMKSB7CiAJCWVudW0gcHJpbnRfbGluZV90IHJldDsKIAkJaW50IGxlbiA9IGl0ZXItPnNlcS5sZW47CkBAIC0yOTMxLDYgKzMwMzMsNyBAQAogCQlpZiAoaXRlci0+c2VxLmxlbiA+PSBjbnQpCiAJCQlicmVhazsKIAl9CisJdHJhY2VfZXZlbnRfcmVhZF91bmxvY2soKTsKIAogCS8qIE5vdyBjb3B5IHdoYXQgd2UgaGF2ZSB0byB0aGUgdXNlciAqLwogCXNyZXQgPSB0cmFjZV9zZXFfdG9fdXNlcigmaXRlci0+c2VxLCB1YnVmLCBjbnQpOwpAQCAtMzA1Myw2ICszMTU2LDggQEAKIAkJZ290byBvdXRfZXJyOwogCX0KIAorCXRyYWNlX2V2ZW50X3JlYWRfbG9jaygpOworCiAJLyogRmlsbCBhcyBtYW55IHBhZ2VzIGFzIHBvc3NpYmxlLiAqLwogCWZvciAoaSA9IDAsIHJlbSA9IGxlbjsgaSA8IFBJUEVfQlVGRkVSUyAmJiByZW07IGkrKykgewogCQlwYWdlc1tpXSA9IGFsbG9jX3BhZ2UoR0ZQX0tFUk5FTCk7CkBAIC0zMDc1LDYgKzMxODAsNyBAQAogCQl0cmFjZV9zZXFfaW5pdCgmaXRlci0+c2VxKTsKIAl9CiAKKwl0cmFjZV9ldmVudF9yZWFkX3VubG9jaygpOwogCW11dGV4X3VubG9jaygmaXRlci0+bXV0ZXgpOwogCiAJc3BkLm5yX3BhZ2VzID0gaTsKQEAgLTM0MjUsNyArMzUzMSw3IEBACiAJCS5zcGRfcmVsZWFzZQk9IGJ1ZmZlcl9zcGRfcmVsZWFzZSwKIAl9OwogCXN0cnVjdCBidWZmZXJfcmVmICpyZWY7Ci0JaW50IHNpemUsIGk7CisJaW50IGVudHJpZXMsIHNpemUsIGk7CiAJc2l6ZV90IHJldDsKIAogCWlmICgqcHBvcyAmIChQQUdFX1NJWkUgLSAxKSkgewpAQCAtMzQ0MCw3ICszNTQ2LDkgQEAKIAkJbGVuICY9IFBBR0VfTUFTSzsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgUElQRV9CVUZGRVJTICYmIGxlbjsgaSsrLCBsZW4gLT0gUEFHRV9TSVpFKSB7CisJZW50cmllcyA9IHJpbmdfYnVmZmVyX2VudHJpZXNfY3B1KGluZm8tPnRyLT5idWZmZXIsIGluZm8tPmNwdSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUElQRV9CVUZGRVJTICYmIGxlbiAmJiBlbnRyaWVzOyBpKyssIGxlbiAtPSBQQUdFX1NJWkUpIHsKIAkJc3RydWN0IHBhZ2UgKnBhZ2U7CiAJCWludCByOwogCkBAIC0zNDU3LDcgKzM1NjUsNyBAQAogCQl9CiAKIAkJciA9IHJpbmdfYnVmZmVyX3JlYWRfcGFnZShyZWYtPmJ1ZmZlciwgJnJlZi0+cGFnZSwKLQkJCQkJICBsZW4sIGluZm8tPmNwdSwgMCk7CisJCQkJCSAgbGVuLCBpbmZvLT5jcHUsIDEpOwogCQlpZiAociA8IDApIHsKIAkJCXJpbmdfYnVmZmVyX2ZyZWVfcmVhZF9wYWdlKHJlZi0+YnVmZmVyLAogCQkJCQkJICAgcmVmLT5wYWdlKTsKQEAgLTM0ODEsNiArMzU4OSw4IEBACiAJCXNwZC5wYXJ0aWFsW2ldLnByaXZhdGUgPSAodW5zaWduZWQgbG9uZylyZWY7CiAJCXNwZC5ucl9wYWdlcysrOwogCQkqcHBvcyArPSBQQUdFX1NJWkU7CisKKwkJZW50cmllcyA9IHJpbmdfYnVmZmVyX2VudHJpZXNfY3B1KGluZm8tPnRyLT5idWZmZXIsIGluZm8tPmNwdSk7CiAJfQogCiAJc3BkLm5yX3BhZ2VzID0gaTsKQEAgLTM1MDgsNiArMzYxOCw0NSBAQAogCS5sbHNlZWsJCT0gbm9fbGxzZWVrLAogfTsKIAorc3RhdGljIHNzaXplX3QKK3RyYWNpbmdfc3RhdHNfcmVhZChzdHJ1Y3QgZmlsZSAqZmlscCwgY2hhciBfX3VzZXIgKnVidWYsCisJCSAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCXVuc2lnbmVkIGxvbmcgY3B1ID0gKHVuc2lnbmVkIGxvbmcpZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCB0cmFjZV9hcnJheSAqdHIgPSAmZ2xvYmFsX3RyYWNlOworCXN0cnVjdCB0cmFjZV9zZXEgKnM7CisJdW5zaWduZWQgbG9uZyBjbnQ7CisKKwlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfQVRPTUlDKTsKKwlpZiAoIXMpCisJCXJldHVybiBFTk9NRU07CisKKwl0cmFjZV9zZXFfaW5pdChzKTsKKworCWNudCA9IHJpbmdfYnVmZmVyX2VudHJpZXNfY3B1KHRyLT5idWZmZXIsIGNwdSk7CisJdHJhY2Vfc2VxX3ByaW50ZihzLCAiZW50cmllczogJWxkXG4iLCBjbnQpOworCisJY250ID0gcmluZ19idWZmZXJfb3ZlcnJ1bl9jcHUodHItPmJ1ZmZlciwgY3B1KTsKKwl0cmFjZV9zZXFfcHJpbnRmKHMsICJvdmVycnVuOiAlbGRcbiIsIGNudCk7CisKKwljbnQgPSByaW5nX2J1ZmZlcl9jb21taXRfb3ZlcnJ1bl9jcHUodHItPmJ1ZmZlciwgY3B1KTsKKwl0cmFjZV9zZXFfcHJpbnRmKHMsICJjb21taXQgb3ZlcnJ1bjogJWxkXG4iLCBjbnQpOworCisJY250ID0gcmluZ19idWZmZXJfbm1pX2Ryb3BwZWRfY3B1KHRyLT5idWZmZXIsIGNwdSk7CisJdHJhY2Vfc2VxX3ByaW50ZihzLCAibm1pIGRyb3BwZWQ6ICVsZFxuIiwgY250KTsKKworCWNvdW50ID0gc2ltcGxlX3JlYWRfZnJvbV9idWZmZXIodWJ1ZiwgY291bnQsIHBwb3MsIHMtPmJ1ZmZlciwgcy0+bGVuKTsKKworCWtmcmVlKHMpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyB0cmFjaW5nX3N0YXRzX2ZvcHMgPSB7CisJLm9wZW4JCT0gdHJhY2luZ19vcGVuX2dlbmVyaWMsCisJLnJlYWQJCT0gdHJhY2luZ19zdGF0c19yZWFkLAorfTsKKwogI2lmZGVmIENPTkZJR19EWU5BTUlDX0ZUUkFDRQogCiBpbnQgX193ZWFrIGZ0cmFjZV9hcmNoX3JlYWRfZHluX2luZm8oY2hhciAqYnVmLCBpbnQgc2l6ZSkKQEAgLTM1OTcsNyArMzc0Niw3IEBACiBzdGF0aWMgdm9pZCB0cmFjaW5nX2luaXRfZGVidWdmc19wZXJjcHUobG9uZyBjcHUpCiB7CiAJc3RydWN0IGRlbnRyeSAqZF9wZXJjcHUgPSB0cmFjaW5nX2RlbnRyeV9wZXJjcHUoKTsKLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeSwgKmRfY3B1OworCXN0cnVjdCBkZW50cnkgKmRfY3B1OwogCS8qIHN0cmxlbihjcHUpICsgTUFYKGxvZzEwKGNwdSkpICsgJ1wwJyAqLwogCWNoYXIgY3B1X2Rpcls3XTsKIApAQCAtMzYxMiwyMSArMzc2MSwxOCBAQAogCX0KIAogCS8qIHBlciBjcHUgdHJhY2VfcGlwZSAqLwotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2VfcGlwZSIsIDA0NDQsIGRfY3B1LAotCQkJCSh2b2lkICopIGNwdSwgJnRyYWNpbmdfcGlwZV9mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ3RyYWNlX3BpcGUnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgidHJhY2VfcGlwZSIsIDA0NDQsIGRfY3B1LAorCQkJKHZvaWQgKikgY3B1LCAmdHJhY2luZ19waXBlX2ZvcHMpOwogCiAJLyogcGVyIGNwdSB0cmFjZSAqLwotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2UiLCAwNjQ0LCBkX2NwdSwKLQkJCQkodm9pZCAqKSBjcHUsICZ0cmFjaW5nX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAndHJhY2UnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgidHJhY2UiLCAwNjQ0LCBkX2NwdSwKKwkJCSh2b2lkICopIGNwdSwgJnRyYWNpbmdfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNlX3BpcGVfcmF3IiwgMDQ0NCwgZF9jcHUsCi0JCQkJICAgICh2b2lkICopIGNwdSwgJnRyYWNpbmdfYnVmZmVyc19mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJ3RyYWNlX3BpcGVfcmF3JyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNlX3BpcGVfcmF3IiwgMDQ0NCwgZF9jcHUsCisJCQkodm9pZCAqKSBjcHUsICZ0cmFjaW5nX2J1ZmZlcnNfZm9wcyk7CisKKwl0cmFjZV9jcmVhdGVfZmlsZSgic3RhdHMiLCAwNDQ0LCBkX2NwdSwKKwkJCSh2b2lkICopIGNwdSwgJnRyYWNpbmdfc3RhdHNfZm9wcyk7CiB9CiAKICNpZmRlZiBDT05GSUdfRlRSQUNFX1NFTEZURVNUCkBAIC0zNzgyLDYgKzM5MjgsMjIgQEAKIAkud3JpdGUgPSB0cmFjZV9vcHRpb25zX2NvcmVfd3JpdGUsCiB9OwogCitzdHJ1Y3QgZGVudHJ5ICp0cmFjZV9jcmVhdGVfZmlsZShjb25zdCBjaGFyICpuYW1lLAorCQkJCSBtb2RlX3QgbW9kZSwKKwkJCQkgc3RydWN0IGRlbnRyeSAqcGFyZW50LAorCQkJCSB2b2lkICpkYXRhLAorCQkJCSBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zICpmb3BzKQoreworCXN0cnVjdCBkZW50cnkgKnJldDsKKworCXJldCA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUobmFtZSwgbW9kZSwgcGFyZW50LCBkYXRhLCBmb3BzKTsKKwlpZiAoIXJldCkKKwkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICclcycgZW50cnlcbiIsIG5hbWUpOworCisJcmV0dXJuIHJldDsKK30KKworCiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqdHJhY2Vfb3B0aW9uc19pbml0X2RlbnRyeSh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwpAQCAtMzgwOSw3ICszOTcxLDYgQEAKIAkJCSBzdHJ1Y3QgdHJhY2VyX29wdCAqb3B0KQogewogCXN0cnVjdCBkZW50cnkgKnRfb3B0aW9uczsKLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAogCXRfb3B0aW9ucyA9IHRyYWNlX29wdGlvbnNfaW5pdF9kZW50cnkoKTsKIAlpZiAoIXRfb3B0aW9ucykKQEAgLTM4MTgsMTEgKzM5NzksOSBAQAogCXRvcHQtPmZsYWdzID0gZmxhZ3M7CiAJdG9wdC0+b3B0ID0gb3B0OwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG9wdC0+bmFtZSwgMDY0NCwgdF9vcHRpb25zLCB0b3B0LAorCXRvcHQtPmVudHJ5ID0gdHJhY2VfY3JlYXRlX2ZpbGUob3B0LT5uYW1lLCAwNjQ0LCB0X29wdGlvbnMsIHRvcHQsCiAJCQkJICAgICZ0cmFjZV9vcHRpb25zX2ZvcHMpOwogCi0JdG9wdC0+ZW50cnkgPSBlbnRyeTsKLQogfQogCiBzdGF0aWMgc3RydWN0IHRyYWNlX29wdGlvbl9kZW50cnkgKgpAQCAtMzg3NywxMjMgKzQwMzYsODQgQEAKIGNyZWF0ZV90cmFjZV9vcHRpb25fY29yZV9maWxlKGNvbnN0IGNoYXIgKm9wdGlvbiwgbG9uZyBpbmRleCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICp0X29wdGlvbnM7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7CiAKIAl0X29wdGlvbnMgPSB0cmFjZV9vcHRpb25zX2luaXRfZGVudHJ5KCk7CiAJaWYgKCF0X29wdGlvbnMpCiAJCXJldHVybiBOVUxMOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKG9wdGlvbiwgMDY0NCwgdF9vcHRpb25zLCAodm9pZCAqKWluZGV4LAorCXJldHVybiB0cmFjZV9jcmVhdGVfZmlsZShvcHRpb24sIDA2NDQsIHRfb3B0aW9ucywgKHZvaWQgKilpbmRleCwKIAkJCQkgICAgJnRyYWNlX29wdGlvbnNfY29yZV9mb3BzKTsKLQotCXJldHVybiBlbnRyeTsKIH0KIAogc3RhdGljIF9faW5pdCB2b2lkIGNyZWF0ZV90cmFjZV9vcHRpb25zX2Rpcih2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKnRfb3B0aW9uczsKLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAlpbnQgaTsKIAogCXRfb3B0aW9ucyA9IHRyYWNlX29wdGlvbnNfaW5pdF9kZW50cnkoKTsKIAlpZiAoIXRfb3B0aW9ucykKIAkJcmV0dXJuOwogCi0JZm9yIChpID0gMDsgdHJhY2Vfb3B0aW9uc1tpXTsgaSsrKSB7Ci0JCWVudHJ5ID0gY3JlYXRlX3RyYWNlX29wdGlvbl9jb3JlX2ZpbGUodHJhY2Vfb3B0aW9uc1tpXSwgaSk7Ci0JCWlmICghZW50cnkpCi0JCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJXMgZW50cnlcbiIsCi0JCQkJICAgdHJhY2Vfb3B0aW9uc1tpXSk7Ci0JfQorCWZvciAoaSA9IDA7IHRyYWNlX29wdGlvbnNbaV07IGkrKykKKwkJY3JlYXRlX3RyYWNlX29wdGlvbl9jb3JlX2ZpbGUodHJhY2Vfb3B0aW9uc1tpXSwgaSk7CiB9CiAKIHN0YXRpYyBfX2luaXQgaW50IHRyYWNlcl9pbml0X2RlYnVnZnModm9pZCkKIHsKIAlzdHJ1Y3QgZGVudHJ5ICpkX3RyYWNlcjsKLQlzdHJ1Y3QgZGVudHJ5ICplbnRyeTsKIAlpbnQgY3B1OwogCiAJZF90cmFjZXIgPSB0cmFjaW5nX2luaXRfZGVudHJ5KCk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNpbmdfZW5hYmxlZCIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICAmZ2xvYmFsX3RyYWNlLCAmdHJhY2luZ19jdHJsX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAndHJhY2luZ19lbmFibGVkJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNpbmdfZW5hYmxlZCIsIDA2NDQsIGRfdHJhY2VyLAorCQkJJmdsb2JhbF90cmFjZSwgJnRyYWNpbmdfY3RybF9mb3BzKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2Vfb3B0aW9ucyIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICBOVUxMLCAmdHJhY2luZ19pdGVyX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAndHJhY2Vfb3B0aW9ucycgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjZV9vcHRpb25zIiwgMDY0NCwgZF90cmFjZXIsCisJCQlOVUxMLCAmdHJhY2luZ19pdGVyX2ZvcHMpOwogCi0JY3JlYXRlX3RyYWNlX29wdGlvbnNfZGlyKCk7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNpbmdfY3B1bWFzayIsIDA2NDQsIGRfdHJhY2VyLAorCQkJTlVMTCwgJnRyYWNpbmdfY3B1bWFza19mb3BzKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2luZ19jcHVtYXNrIiwgMDY0NCwgZF90cmFjZXIsCi0JCQkJICAgIE5VTEwsICZ0cmFjaW5nX2NwdW1hc2tfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICd0cmFjaW5nX2NwdW1hc2snIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgidHJhY2UiLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSh2b2lkICopIFRSQUNFX1BJUEVfQUxMX0NQVSwgJnRyYWNpbmdfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNlIiwgMDY0NCwgZF90cmFjZXIsCi0JCQkJICh2b2lkICopIFRSQUNFX1BJUEVfQUxMX0NQVSwgJnRyYWNpbmdfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICd0cmFjZScgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJhdmFpbGFibGVfdHJhY2VycyIsIDA0NDQsIGRfdHJhY2VyLAorCQkJJmdsb2JhbF90cmFjZSwgJnNob3dfdHJhY2VzX2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJhdmFpbGFibGVfdHJhY2VycyIsIDA0NDQsIGRfdHJhY2VyLAotCQkJCSAgICAmZ2xvYmFsX3RyYWNlLCAmc2hvd190cmFjZXNfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICdhdmFpbGFibGVfdHJhY2VycycgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJjdXJyZW50X3RyYWNlciIsIDA2NDQsIGRfdHJhY2VyLAorCQkJJmdsb2JhbF90cmFjZSwgJnNldF90cmFjZXJfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImN1cnJlbnRfdHJhY2VyIiwgMDQ0NCwgZF90cmFjZXIsCi0JCQkJICAgICZnbG9iYWxfdHJhY2UsICZzZXRfdHJhY2VyX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnY3VycmVudF90cmFjZXInIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgidHJhY2luZ19tYXhfbGF0ZW5jeSIsIDA2NDQsIGRfdHJhY2VyLAorCQkJJnRyYWNpbmdfbWF4X2xhdGVuY3ksICZ0cmFjaW5nX21heF9sYXRfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNpbmdfbWF4X2xhdGVuY3kiLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgJnRyYWNpbmdfbWF4X2xhdGVuY3ksCi0JCQkJICAgICZ0cmFjaW5nX21heF9sYXRfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICIndHJhY2luZ19tYXhfbGF0ZW5jeScgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJ0cmFjaW5nX3RocmVzaCIsIDA2NDQsIGRfdHJhY2VyLAorCQkJJnRyYWNpbmdfdGhyZXNoLCAmdHJhY2luZ19tYXhfbGF0X2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJ0cmFjaW5nX3RocmVzaCIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICAmdHJhY2luZ190aHJlc2gsICZ0cmFjaW5nX21heF9sYXRfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICIndHJhY2luZ190aHJlc2gnIGVudHJ5XG4iKTsKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoIlJFQURNRSIsIDA2NDQsIGRfdHJhY2VyLAotCQkJCSAgICBOVUxMLCAmdHJhY2luZ19yZWFkbWVfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICdSRUFETUUnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgiUkVBRE1FIiwgMDQ0NCwgZF90cmFjZXIsCisJCQlOVUxMLCAmdHJhY2luZ19yZWFkbWVfZm9wcyk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInRyYWNlX3BpcGUiLCAwNDQ0LCBkX3RyYWNlciwKKwl0cmFjZV9jcmVhdGVfZmlsZSgidHJhY2VfcGlwZSIsIDA0NDQsIGRfdHJhY2VyLAogCQkJKHZvaWQgKikgVFJBQ0VfUElQRV9BTExfQ1BVLCAmdHJhY2luZ19waXBlX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCi0JCQkgICAiJ3RyYWNlX3BpcGUnIGVudHJ5XG4iKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiYnVmZmVyX3NpemVfa2IiLCAwNjQ0LCBkX3RyYWNlciwKLQkJCQkgICAgJmdsb2JhbF90cmFjZSwgJnRyYWNpbmdfZW50cmllc19mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIididWZmZXJfc2l6ZV9rYicgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJidWZmZXJfc2l6ZV9rYiIsIDA2NDQsIGRfdHJhY2VyLAorCQkJJmdsb2JhbF90cmFjZSwgJnRyYWNpbmdfZW50cmllc19mb3BzKTsKIAotCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgidHJhY2VfbWFya2VyIiwgMDIyMCwgZF90cmFjZXIsCi0JCQkJICAgIE5VTEwsICZ0cmFjaW5nX21hcmtfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCSAgICIndHJhY2VfbWFya2VyJyBlbnRyeVxuIik7CisJdHJhY2VfY3JlYXRlX2ZpbGUoInRyYWNlX21hcmtlciIsIDAyMjAsIGRfdHJhY2VyLAorCQkJTlVMTCwgJnRyYWNpbmdfbWFya19mb3BzKTsKKworCXRyYWNlX2NyZWF0ZV9maWxlKCJzYXZlZF9jbWRsaW5lcyIsIDA0NDQsIGRfdHJhY2VyLAorCQkJTlVMTCwgJnRyYWNpbmdfc2F2ZWRfY21kbGluZXNfZm9wcyk7CiAKICNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImR5bl9mdHJhY2VfdG90YWxfaW5mbyIsIDA0NDQsIGRfdHJhY2VyLAotCQkJCSAgICAmZnRyYWNlX3VwZGF0ZV90b3RfY250LAotCQkJCSAgICAmdHJhY2luZ19keW5faW5mb19mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIidkeW5fZnRyYWNlX3RvdGFsX2luZm8nIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgiZHluX2Z0cmFjZV90b3RhbF9pbmZvIiwgMDQ0NCwgZF90cmFjZXIsCisJCQkmZnRyYWNlX3VwZGF0ZV90b3RfY250LCAmdHJhY2luZ19keW5faW5mb19mb3BzKTsKICNlbmRpZgogI2lmZGVmIENPTkZJR19TWVNQUk9GX1RSQUNFUgogCWluaXRfdHJhY2VyX3N5c3Byb2ZfZGVidWdmcyhkX3RyYWNlcik7CiAjZW5kaWYKIAorCWNyZWF0ZV90cmFjZV9vcHRpb25zX2RpcigpOworCiAJZm9yX2VhY2hfdHJhY2luZ19jcHUoY3B1KQogCQl0cmFjaW5nX2luaXRfZGVidWdmc19wZXJjcHUoY3B1KTsKIApAQCAtNDA2NCw3ICs0MTg0LDggQEAKIAogc3RhdGljIHZvaWQgX19mdHJhY2VfZHVtcChib29sIGRpc2FibGVfdHJhY2luZykKIHsKLQlzdGF0aWMgREVGSU5FX1NQSU5MT0NLKGZ0cmFjZV9kdW1wX2xvY2spOworCXN0YXRpYyByYXdfc3BpbmxvY2tfdCBmdHJhY2VfZHVtcF9sb2NrID0KKwkJKHJhd19zcGlubG9ja190KV9fUkFXX1NQSU5fTE9DS19VTkxPQ0tFRDsKIAkvKiB1c2Ugc3RhdGljIGJlY2F1c2UgaXRlciBjYW4gYmUgYSBiaXQgYmlnIGZvciB0aGUgc3RhY2sgKi8KIAlzdGF0aWMgc3RydWN0IHRyYWNlX2l0ZXJhdG9yIGl0ZXI7CiAJdW5zaWduZWQgaW50IG9sZF91c2Vyb2JqOwpAQCAtNDA3Myw3ICs0MTk0LDggQEAKIAlpbnQgY250ID0gMCwgY3B1OwogCiAJLyogb25seSBvbmUgZHVtcCAqLwotCXNwaW5fbG9ja19pcnFzYXZlKCZmdHJhY2VfZHVtcF9sb2NrLCBmbGFncyk7CisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCV9fcmF3X3NwaW5fbG9jaygmZnRyYWNlX2R1bXBfbG9jayk7CiAJaWYgKGR1bXBfcmFuKQogCQlnb3RvIG91dDsKIApAQCAtNDE0NSw3ICs0MjY3LDggQEAKIAl9CiAKICBvdXQ6Ci0Jc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmZnRyYWNlX2R1bXBfbG9jaywgZmxhZ3MpOworCV9fcmF3X3NwaW5fdW5sb2NrKCZmdHJhY2VfZHVtcF9sb2NrKTsKKwlsb2NhbF9pcnFfcmVzdG9yZShmbGFncyk7CiB9CiAKIC8qIEJ5IGRlZmF1bHQ6IGRpc2FibGUgdHJhY2luZyBhZnRlciB0aGUgZHVtcCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlLmggYi9rZXJuZWwvdHJhY2UvdHJhY2UuaAppbmRleCBlNjg1YWMyLi42ZTczNWQ0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2UuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2UuaApAQCAtOSw5ICs5LDEyIEBACiAjaW5jbHVkZSA8bGludXgvbW1pb3RyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CiAjaW5jbHVkZSA8dHJhY2UvYm9vdC5oPgotI2luY2x1ZGUgPHRyYWNlL2ttZW10cmFjZS5oPgorI2luY2x1ZGUgPGxpbnV4L2ttZW10cmFjZS5oPgogI2luY2x1ZGUgPHRyYWNlL3Bvd2VyLmg+CiAKKyNpbmNsdWRlIDxsaW51eC90cmFjZV9zZXEuaD4KKyNpbmNsdWRlIDxsaW51eC9mdHJhY2VfZXZlbnQuaD4KKwogZW51bSB0cmFjZV90eXBlIHsKIAlfX1RSQUNFX0ZJUlNUX1RZUEUgPSAwLAogCkBAIC00MiwyMCArNDUsNiBAQAogfTsKIAogLyoKLSAqIFRoZSB0cmFjZSBlbnRyeSAtIHRoZSBtb3N0IGJhc2ljIHVuaXQgb2YgdHJhY2luZy4gVGhpcyBpcyB3aGF0Ci0gKiBpcyBwcmludGVkIGluIHRoZSBlbmQgYXMgYSBzaW5nbGUgbGluZSBpbiB0aGUgdHJhY2Ugb3V0cHV0LCBzdWNoIGFzOgotICoKLSAqICAgICBiYXNoLTE1ODE2IFswMV0gICAyMzUuMTk3NTg1OiBpZGxlX2NwdSA8LSBpcnFfZW50ZXIKLSAqLwotc3RydWN0IHRyYWNlX2VudHJ5IHsKLQl1bnNpZ25lZCBjaGFyCQl0eXBlOwotCXVuc2lnbmVkIGNoYXIJCWZsYWdzOwotCXVuc2lnbmVkIGNoYXIJCXByZWVtcHRfY291bnQ7Ci0JaW50CQkJcGlkOwotCWludAkJCXRnaWQ7Ci19OwotCi0vKgogICogRnVuY3Rpb24gdHJhY2UgZW50cnkgLSBmdW5jdGlvbiBhZGRyZXNzIGFuZCBwYXJlbnQgZnVuY3Rpb24gYWRkcmVzOgogICovCiBzdHJ1Y3QgZnRyYWNlX2VudHJ5IHsKQEAgLTI2Myw4ICsyNTIsNiBAQAogCWNoYXIJCQljb21tW1RBU0tfQ09NTV9MRU5dOwogfTsKIAotc3RydWN0IHRyYWNlX2l0ZXJhdG9yOwotCiAvKgogICogVGhlIHRyYWNlIGFycmF5IC0gYW4gYXJyYXkgb2YgcGVyLUNQVSB0cmFjZSBhcnJheXMuIFRoaXMgaXMgdGhlCiAgKiBoaWdoZXN0IGxldmVsIGRhdGEgc3RydWN0dXJlIHRoYXQgaW5kaXZpZHVhbCB0cmFjZXJzIGRlYWwgd2l0aC4KQEAgLTMzOSwxNSArMzI2LDYgQEAKIAkJX19mdHJhY2VfYmFkX3R5cGUoKTsJCQkJCVwKIAl9IHdoaWxlICgwKQogCi0vKiBSZXR1cm4gdmFsdWVzIGZvciBwcmludF9saW5lIGNhbGxiYWNrICovCi1lbnVtIHByaW50X2xpbmVfdCB7Ci0JVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkUJPSAwLAkvKiBSZXRyeSBhZnRlciBmbHVzaGluZyB0aGUgc2VxICovCi0JVFJBQ0VfVFlQRV9IQU5ETEVECT0gMSwKLQlUUkFDRV9UWVBFX1VOSEFORExFRAk9IDIsCS8qIFJlbGF5IHRvIG90aGVyIG91dHB1dCBmdW5jdGlvbnMgKi8KLQlUUkFDRV9UWVBFX05PX0NPTlNVTUUJPSAzCS8qIEhhbmRsZWQgYnV0IGFzayB0byBub3QgY29uc3VtZSAqLwotfTsKLQotCiAvKgogICogQW4gb3B0aW9uIHNwZWNpZmljIHRvIGEgdHJhY2VyLiBUaGlzIGlzIGEgYm9vbGVhbiB2YWx1ZS4KICAqIFRoZSBiaXQgaXMgdGhlIGJpdCBpbmRleCB0aGF0IHNldHMgaXRzIHZhbHVlIG9uIHRoZQpAQCAtNDIzLDYwICs0MDEsMzAgQEAKIAlzdHJ1Y3QgdHJhY2VyX3N0YXQJKnN0YXRzOwogfTsKIAotc3RydWN0IHRyYWNlX3NlcSB7Ci0JdW5zaWduZWQgY2hhcgkJYnVmZmVyW1BBR0VfU0laRV07Ci0JdW5zaWduZWQgaW50CQlsZW47Ci0JdW5zaWduZWQgaW50CQlyZWFkcG9zOwotfTsKLQotc3RhdGljIGlubGluZSB2b2lkCi10cmFjZV9zZXFfaW5pdChzdHJ1Y3QgdHJhY2Vfc2VxICpzKQotewotCXMtPmxlbiA9IDA7Ci0Jcy0+cmVhZHBvcyA9IDA7Ci19Ci0KIAogI2RlZmluZSBUUkFDRV9QSVBFX0FMTF9DUFUJLTEKIAotLyoKLSAqIFRyYWNlIGl0ZXJhdG9yIC0gdXNlZCBieSBwcmludG91dCByb3V0aW5lcyB3aG8gcHJlc2VudCB0cmFjZQotICogcmVzdWx0cyB0byB1c2VycyBhbmQgd2hpY2ggcm91dGluZXMgbWlnaHQgc2xlZXAsIGV0YzoKLSAqLwotc3RydWN0IHRyYWNlX2l0ZXJhdG9yIHsKLQlzdHJ1Y3QgdHJhY2VfYXJyYXkJKnRyOwotCXN0cnVjdCB0cmFjZXIJCSp0cmFjZTsKLQl2b2lkCQkJKnByaXZhdGU7Ci0JaW50CQkJY3B1X2ZpbGU7Ci0Jc3RydWN0IG11dGV4CQltdXRleDsKLQlzdHJ1Y3QgcmluZ19idWZmZXJfaXRlcgkqYnVmZmVyX2l0ZXJbTlJfQ1BVU107Ci0KLQkvKiBUaGUgYmVsb3cgaXMgemVyb2VkIG91dCBpbiBwaXBlX3JlYWQgKi8KLQlzdHJ1Y3QgdHJhY2Vfc2VxCXNlcTsKLQlzdHJ1Y3QgdHJhY2VfZW50cnkJKmVudDsKLQlpbnQJCQljcHU7Ci0JdTY0CQkJdHM7Ci0KLQl1bnNpZ25lZCBsb25nCQlpdGVyX2ZsYWdzOwotCWxvZmZfdAkJCXBvczsKLQlsb25nCQkJaWR4OwotCi0JY3B1bWFza192YXJfdAkJc3RhcnRlZDsKLX07Ci0KIGludCB0cmFjZXJfaW5pdChzdHJ1Y3QgdHJhY2VyICp0LCBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKTsKIGludCB0cmFjaW5nX2lzX2VuYWJsZWQodm9pZCk7CiB2b2lkIHRyYWNlX3dha2VfdXAodm9pZCk7CiB2b2lkIHRyYWNpbmdfcmVzZXQoc3RydWN0IHRyYWNlX2FycmF5ICp0ciwgaW50IGNwdSk7CiB2b2lkIHRyYWNpbmdfcmVzZXRfb25saW5lX2NwdXMoc3RydWN0IHRyYWNlX2FycmF5ICp0cik7Cit2b2lkIHRyYWNpbmdfcmVzZXRfY3VycmVudChpbnQgY3B1KTsKK3ZvaWQgdHJhY2luZ19yZXNldF9jdXJyZW50X29ubGluZV9jcHVzKHZvaWQpOwogaW50IHRyYWNpbmdfb3Blbl9nZW5lcmljKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxwKTsKK3N0cnVjdCBkZW50cnkgKnRyYWNlX2NyZWF0ZV9maWxlKGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJIG1vZGVfdCBtb2RlLAorCQkJCSBzdHJ1Y3QgZGVudHJ5ICpwYXJlbnQsCisJCQkJIHZvaWQgKmRhdGEsCisJCQkJIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmZvcHMpOworCiBzdHJ1Y3QgZGVudHJ5ICp0cmFjaW5nX2luaXRfZGVudHJ5KHZvaWQpOwogdm9pZCBpbml0X3RyYWNlcl9zeXNwcm9mX2RlYnVnZnMoc3RydWN0IGRlbnRyeSAqZF90cmFjZXIpOwogCiBzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQ7CiAKIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqdHJhY2VfYnVmZmVyX2xvY2tfcmVzZXJ2ZShzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLAotCQkJCQkJICAgIHVuc2lnbmVkIGNoYXIgdHlwZSwKKwkJCQkJCSAgICBpbnQgdHlwZSwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIGxlbiwKIAkJCQkJCSAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAogCQkJCQkJICAgIGludCBwYyk7CkBAIC00ODQsMTQgKzQzMiw2IEBACiAJCQkJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudCwKIAkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwogCi1zdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKgotdHJhY2VfY3VycmVudF9idWZmZXJfbG9ja19yZXNlcnZlKHVuc2lnbmVkIGNoYXIgdHlwZSwgdW5zaWduZWQgbG9uZyBsZW4sCi0JCQkJICB1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwotdm9pZCB0cmFjZV9jdXJyZW50X2J1ZmZlcl91bmxvY2tfY29tbWl0KHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQsCi0JCQkJCXVuc2lnbmVkIGxvbmcgZmxhZ3MsIGludCBwYyk7Ci12b2lkIHRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdChzdHJ1Y3QgcmluZ19idWZmZXJfZXZlbnQgKmV2ZW50LAotCQkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwotCiBzdHJ1Y3QgdHJhY2VfZW50cnkgKnRyYWNpbmdfZ2V0X3RyYWNlX2VudHJ5KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIsCiAJCQkJCQlzdHJ1Y3QgdHJhY2VfYXJyYXlfY3B1ICpkYXRhKTsKIApAQCAtNTE0LDcgKzQ1NCw2IEBACiAJCQkJc3RydWN0IHRhc2tfc3RydWN0ICpwcmV2LAogCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqbmV4dCwKIAkJCQl1bnNpZ25lZCBsb25nIGZsYWdzLCBpbnQgcGMpOwotdm9pZCB0cmFjaW5nX3JlY29yZF9jbWRsaW5lKHN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrKTsKIAogdm9pZCB0cmFjaW5nX3NjaGVkX3dha2V1cF90cmFjZShzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyLAogCQkJCXN0cnVjdCB0YXNrX3N0cnVjdCAqd2FrZWUsCkBAIC01OTksNiArNTM4LDggQEAKIAkJCQkJICAgICAgIHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpOwogZXh0ZXJuIGludCB0cmFjZV9zZWxmdGVzdF9zdGFydHVwX2JyYW5jaChzdHJ1Y3QgdHJhY2VyICp0cmFjZSwKIAkJCQkJIHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpOworZXh0ZXJuIGludCB0cmFjZV9zZWxmdGVzdF9zdGFydHVwX2h3X2JyYW5jaGVzKHN0cnVjdCB0cmFjZXIgKnRyYWNlLAorCQkJCQkgICAgICBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKTsKICNlbmRpZiAvKiBDT05GSUdfRlRSQUNFX1NUQVJUVVBfVEVTVCAqLwogCiBleHRlcm4gdm9pZCAqaGVhZF9wYWdlKHN0cnVjdCB0cmFjZV9hcnJheV9jcHUgKmRhdGEpOwpAQCAtNjEzLDYgKzU1NCw4IEBACiAvKiBTdGFuZGFyZCBvdXRwdXQgZm9ybWF0dGluZyBmdW5jdGlvbiB1c2VkIGZvciBmdW5jdGlvbiByZXR1cm4gdHJhY2VzICovCiAjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX0dSQVBIX1RSQUNFUgogZXh0ZXJuIGVudW0gcHJpbnRfbGluZV90IHByaW50X2dyYXBoX2Z1bmN0aW9uKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcik7CitleHRlcm4gZW51bSBwcmludF9saW5lX3QKK3RyYWNlX3ByaW50X2dyYXBoX2R1cmF0aW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBkdXJhdGlvbiwgc3RydWN0IHRyYWNlX3NlcSAqcyk7CiAKICNpZmRlZiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UKIC8qIFRPRE86IG1ha2UgdGhpcyB2YXJpYWJsZSAqLwpAQCAtNjQ0LDcgKzU4Nyw2IEBACiAJcmV0dXJuIDE7CiB9CiAjZW5kaWYgLyogQ09ORklHX0RZTkFNSUNfRlRSQUNFICovCi0KICNlbHNlIC8qIENPTkZJR19GVU5DVElPTl9HUkFQSF9UUkFDRVIgKi8KIHN0YXRpYyBpbmxpbmUgZW51bSBwcmludF9saW5lX3QKIHByaW50X2dyYXBoX2Z1bmN0aW9uKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKQEAgLTY5Miw2ICs2MzQsNyBAQAogCVRSQUNFX0lURVJfTEFURU5DWV9GTVQJCT0gMHg0MDAwMCwKIAlUUkFDRV9JVEVSX0dMT0JBTF9DTEsJCT0gMHg4MDAwMCwKIAlUUkFDRV9JVEVSX1NMRUVQX1RJTUUJCT0gMHgxMDAwMDAsCisJVFJBQ0VfSVRFUl9HUkFQSF9USU1FCQk9IDB4MjAwMDAwLAogfTsKIAogLyoKQEAgLTc5MCwxMDMgKzczMywxMTMgQEAKIAljaGFyCQkJKnR5cGU7CiAJaW50CQkJb2Zmc2V0OwogCWludAkJCXNpemU7CisJaW50CQkJaXNfc2lnbmVkOwogfTsKIAotc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIHsKLQljaGFyCQkJKm5hbWU7Ci0JY2hhcgkJCSpzeXN0ZW07Ci0Jc3RydWN0IGRlbnRyeQkJKmRpcjsKLQlpbnQJCQllbmFibGVkOwotCWludAkJCSgqcmVnZnVuYykodm9pZCk7Ci0Jdm9pZAkJCSgqdW5yZWdmdW5jKSh2b2lkKTsKLQlpbnQJCQlpZDsKLQlpbnQJCQkoKnJhd19pbml0KSh2b2lkKTsKLQlpbnQJCQkoKnNob3dfZm9ybWF0KShzdHJ1Y3QgdHJhY2Vfc2VxICpzKTsKLQlpbnQJCQkoKmRlZmluZV9maWVsZHMpKHZvaWQpOwotCXN0cnVjdCBsaXN0X2hlYWQJZmllbGRzOworc3RydWN0IGV2ZW50X2ZpbHRlciB7CisJaW50CQkJbl9wcmVkczsKIAlzdHJ1Y3QgZmlsdGVyX3ByZWQJKipwcmVkczsKLQotI2lmZGVmIENPTkZJR19FVkVOVF9QUk9GSUxFCi0JYXRvbWljX3QJcHJvZmlsZV9jb3VudDsKLQlpbnQJCSgqcHJvZmlsZV9lbmFibGUpKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqKTsKLQl2b2lkCQkoKnByb2ZpbGVfZGlzYWJsZSkoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICopOwotI2VuZGlmCisJY2hhcgkJCSpmaWx0ZXJfc3RyaW5nOwogfTsKIAogc3RydWN0IGV2ZW50X3N1YnN5c3RlbSB7CiAJc3RydWN0IGxpc3RfaGVhZAlsaXN0OwogCWNvbnN0IGNoYXIJCSpuYW1lOwogCXN0cnVjdCBkZW50cnkJCSplbnRyeTsKLQlzdHJ1Y3QgZmlsdGVyX3ByZWQJKipwcmVkczsKKwl2b2lkCQkJKmZpbHRlcjsKIH07CiAKLSNkZWZpbmUgZXZlbnRzX2Zvcl9lYWNoKGV2ZW50KQkJCQkJCVwKLQlmb3IgKGV2ZW50ID0gX19zdGFydF9mdHJhY2VfZXZlbnRzOwkJCQlcCi0JICAgICAodW5zaWduZWQgbG9uZylldmVudCA8ICh1bnNpZ25lZCBsb25nKV9fc3RvcF9mdHJhY2VfZXZlbnRzOyBcCi0JICAgICBldmVudCsrKQotCi0jZGVmaW5lIE1BWF9GSUxURVJfUFJFRCA4Ci0KIHN0cnVjdCBmaWx0ZXJfcHJlZDsKIAotdHlwZWRlZiBpbnQgKCpmaWx0ZXJfcHJlZF9mbl90KSAoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLCB2b2lkICpldmVudCk7Cit0eXBlZGVmIGludCAoKmZpbHRlcl9wcmVkX2ZuX3QpIChzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQsIHZvaWQgKmV2ZW50LAorCQkJCSBpbnQgdmFsMSwgaW50IHZhbDIpOwogCiBzdHJ1Y3QgZmlsdGVyX3ByZWQgewogCWZpbHRlcl9wcmVkX2ZuX3QgZm47CiAJdTY0IHZhbDsKLQljaGFyICpzdHJfdmFsOworCWNoYXIgc3RyX3ZhbFtNQVhfRklMVEVSX1NUUl9WQUxdOwogCWludCBzdHJfbGVuOwogCWNoYXIgKmZpZWxkX25hbWU7CiAJaW50IG9mZnNldDsKIAlpbnQgbm90OwotCWludCBvcjsKLQlpbnQgY29tcG91bmQ7Ci0JaW50IGNsZWFyOworCWludCBvcDsKKwlpbnQgcG9wX247CiB9OwogCi1pbnQgdHJhY2VfZGVmaW5lX2ZpZWxkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgY2hhciAqdHlwZSwKLQkJICAgICAgIGNoYXIgKm5hbWUsIGludCBvZmZzZXQsIGludCBzaXplKTsKLWV4dGVybiB2b2lkIGZpbHRlcl9mcmVlX3ByZWQoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKTsKLWV4dGVybiB2b2lkIGZpbHRlcl9wcmludF9wcmVkcyhzdHJ1Y3QgZmlsdGVyX3ByZWQgKipwcmVkcywKK2V4dGVybiB2b2lkIHByaW50X2V2ZW50X2ZpbHRlcihzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCiAJCQkgICAgICAgc3RydWN0IHRyYWNlX3NlcSAqcyk7Ci1leHRlcm4gaW50IGZpbHRlcl9wYXJzZShjaGFyICoqcGJ1Ziwgc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKTsKLWV4dGVybiBpbnQgZmlsdGVyX2FkZF9wcmVkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwKLQkJCSAgIHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCk7Ci1leHRlcm4gdm9pZCBmaWx0ZXJfZnJlZV9wcmVkcyhzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpOwotZXh0ZXJuIGludCBmaWx0ZXJfbWF0Y2hfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCB2b2lkICpyZWMpOwotZXh0ZXJuIHZvaWQgZmlsdGVyX2ZyZWVfc3Vic3lzdGVtX3ByZWRzKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSk7Ci1leHRlcm4gaW50IGZpbHRlcl9hZGRfc3Vic3lzdGVtX3ByZWQoc3RydWN0IGV2ZW50X3N1YnN5c3RlbSAqc3lzdGVtLAotCQkJCSAgICAgc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKTsKK2V4dGVybiBpbnQgYXBwbHlfZXZlbnRfZmlsdGVyKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwKKwkJCSAgICAgIGNoYXIgKmZpbHRlcl9zdHJpbmcpOworZXh0ZXJuIGludCBhcHBseV9zdWJzeXN0ZW1fZXZlbnRfZmlsdGVyKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSwKKwkJCQkJY2hhciAqZmlsdGVyX3N0cmluZyk7CitleHRlcm4gdm9pZCBwcmludF9zdWJzeXN0ZW1fZXZlbnRfZmlsdGVyKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSwKKwkJCQkJIHN0cnVjdCB0cmFjZV9zZXEgKnMpOwogCi12b2lkIGV2ZW50X3RyYWNlX3ByaW50ayh1bnNpZ25lZCBsb25nIGlwLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci1leHRlcm4gc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fc3RhcnRfZnRyYWNlX2V2ZW50c1tdOwotZXh0ZXJuIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3N0b3BfZnRyYWNlX2V2ZW50c1tdOworc3RhdGljIGlubGluZSBpbnQKK2ZpbHRlcl9jaGVja19kaXNjYXJkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgdm9pZCAqcmVjLAorCQkgICAgIHN0cnVjdCByaW5nX2J1ZmZlciAqYnVmZmVyLAorCQkgICAgIHN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQpCit7CisJaWYgKHVubGlrZWx5KGNhbGwtPmZpbHRlcl9hY3RpdmUpICYmICFmaWx0ZXJfbWF0Y2hfcHJlZHMoY2FsbCwgcmVjKSkgeworCQlyaW5nX2J1ZmZlcl9kaXNjYXJkX2NvbW1pdChidWZmZXIsIGV2ZW50KTsKKwkJcmV0dXJuIDE7CisJfQogCi0jZGVmaW5lIGZvcl9lYWNoX2V2ZW50KGV2ZW50KQkJCQkJCVwKLQlmb3IgKGV2ZW50ID0gX19zdGFydF9mdHJhY2VfZXZlbnRzOwkJCQlcCi0JICAgICAodW5zaWduZWQgbG9uZylldmVudCA8ICh1bnNpZ25lZCBsb25nKV9fc3RvcF9mdHJhY2VfZXZlbnRzOyBcCi0JICAgICBldmVudCsrKQorCXJldHVybiAwOworfQorCisjZGVmaW5lIERFRklORV9DT01QQVJJU09OX1BSRUQodHlwZSkJCQkJCVwKK3N0YXRpYyBpbnQgZmlsdGVyX3ByZWRfIyN0eXBlKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQsCVwKKwkJCSAgICAgIGludCB2YWwxLCBpbnQgdmFsMikJCQlcCit7CQkJCQkJCQkJXAorCXR5cGUgKmFkZHIgPSAodHlwZSAqKShldmVudCArIHByZWQtPm9mZnNldCk7CQkJXAorCXR5cGUgdmFsID0gKHR5cGUpcHJlZC0+dmFsOwkJCQkJXAorCWludCBtYXRjaCA9IDA7CQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlzd2l0Y2ggKHByZWQtPm9wKSB7CQkJCQkJXAorCWNhc2UgT1BfTFQ6CQkJCQkJCVwKKwkJbWF0Y2ggPSAoKmFkZHIgPCB2YWwpOwkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCWNhc2UgT1BfTEU6CQkJCQkJCVwKKwkJbWF0Y2ggPSAoKmFkZHIgPD0gdmFsKTsJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwljYXNlIE9QX0dUOgkJCQkJCQlcCisJCW1hdGNoID0gKCphZGRyID4gdmFsKTsJCQkJCVwKKwkJYnJlYWs7CQkJCQkJCVwKKwljYXNlIE9QX0dFOgkJCQkJCQlcCisJCW1hdGNoID0gKCphZGRyID49IHZhbCk7CQkJCQlcCisJCWJyZWFrOwkJCQkJCQlcCisJZGVmYXVsdDoJCQkJCQkJXAorCQlicmVhazsJCQkJCQkJXAorCX0JCQkJCQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gbWF0Y2g7CQkJCQkJCVwKK30KKworI2RlZmluZSBERUZJTkVfRVFVQUxJVFlfUFJFRChzaXplKQkJCQkJXAorc3RhdGljIGludCBmaWx0ZXJfcHJlZF8jI3NpemUoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLCB2b2lkICpldmVudCwJXAorCQkJICAgICAgaW50IHZhbDEsIGludCB2YWwyKQkJCVwKK3sJCQkJCQkJCQlcCisJdSMjc2l6ZSAqYWRkciA9ICh1IyNzaXplICopKGV2ZW50ICsgcHJlZC0+b2Zmc2V0KTsJCVwKKwl1IyNzaXplIHZhbCA9ICh1IyNzaXplKXByZWQtPnZhbDsJCQkJXAorCWludCBtYXRjaDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCW1hdGNoID0gKHZhbCA9PSAqYWRkcikgXiBwcmVkLT5ub3Q7CQkJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gbWF0Y2g7CQkJCQkJCVwKK30KKworZXh0ZXJuIHN0cnVjdCBtdXRleCBldmVudF9tdXRleDsKK2V4dGVybiBzdHJ1Y3QgbGlzdF9oZWFkIGZ0cmFjZV9ldmVudHM7CiAKIGV4dGVybiBjb25zdCBjaGFyICpfX3N0YXJ0X19fdHJhY2VfYnByaW50a19mbXRbXTsKIGV4dGVybiBjb25zdCBjaGFyICpfX3N0b3BfX190cmFjZV9icHJpbnRrX2ZtdFtdOwogCi0vKgotICogVGhlIGRvdWJsZSBfX2J1aWx0aW5fY29uc3RhbnRfcCBpcyBiZWNhdXNlIGdjYyB3aWxsIGdpdmUgdXMgYW4gZXJyb3IKLSAqIGlmIHdlIHRyeSB0byBhbGxvY2F0ZSB0aGUgc3RhdGljIHZhcmlhYmxlIHRvIGZtdCBpZiBpdCBpcyBub3QgYQotICogY29uc3RhbnQuIEV2ZW4gd2l0aCB0aGUgb3V0ZXIgaWYgc3RhdGVtZW50IG9wdGltaXppbmcgb3V0LgotICovCi0jZGVmaW5lIGV2ZW50X3RyYWNlX3ByaW50ayhpcCwgZm10LCBhcmdzLi4uKQkJCQlcCi1kbyB7CQkJCQkJCQkJXAotCV9fdHJhY2VfcHJpbnRrX2NoZWNrX2Zvcm1hdChmbXQsICMjYXJncyk7CQkJXAotCXRyYWNpbmdfcmVjb3JkX2NtZGxpbmUoY3VycmVudCk7CQkJCVwKLQlpZiAoX19idWlsdGluX2NvbnN0YW50X3AoZm10KSkgewkJCQlcCi0JCXN0YXRpYyBjb25zdCBjaGFyICp0cmFjZV9wcmludGtfZm10CQkJXAotCQkgIF9fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9fdHJhY2VfcHJpbnRrX2ZtdCIpKSkgPQlcCi0JCQlfX2J1aWx0aW5fY29uc3RhbnRfcChmbXQpID8gZm10IDogTlVMTDsJCVwKLQkJCQkJCQkJCVwKLQkJX190cmFjZV9icHJpbnRrKGlwLCB0cmFjZV9wcmludGtfZm10LCAjI2FyZ3MpOwkJXAotCX0gZWxzZQkJCQkJCQkJXAotCQlfX3RyYWNlX3ByaW50ayhpcCwgZm10LCAjI2FyZ3MpOwkJCVwKLX0gd2hpbGUgKDApCisjdW5kZWYgVFJBQ0VfRVZFTlRfRk9STUFUCisjZGVmaW5lIFRSQUNFX0VWRU5UX0ZPUk1BVChjYWxsLCBwcm90bywgYXJncywgZm10LCB0c3RydWN0LCB0cGZtdCkJXAorCWV4dGVybiBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgZXZlbnRfIyNjYWxsOworI3VuZGVmIFRSQUNFX0VWRU5UX0ZPUk1BVF9OT0ZJTFRFUgorI2RlZmluZSBUUkFDRV9FVkVOVF9GT1JNQVRfTk9GSUxURVIoY2FsbCwgcHJvdG8sIGFyZ3MsIGZtdCwgdHN0cnVjdCwgdHBmbXQpCisjaW5jbHVkZSAidHJhY2VfZXZlbnRfdHlwZXMuaCIKIAogI2VuZGlmIC8qIF9MSU5VWF9LRVJORUxfVFJBQ0VfSCAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2Jvb3QuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9ib290LmMKaW5kZXggN2EzMGZjNC4uYTI5ZWYyMyAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2Jvb3QuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfYm9vdC5jCkBAIC05LDYgKzksNyBAQAogI2luY2x1ZGUgPGxpbnV4L2RlYnVnZnMuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgorI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KIAogI2luY2x1ZGUgInRyYWNlLmgiCiAjaW5jbHVkZSAidHJhY2Vfb3V0cHV0LmgiCkBAIC02Nyw3ICs2OCw3IEBACiAJdHJhY2VfYXNzaWduX3R5cGUoZmllbGQsIGVudHJ5KTsKIAljYWxsID0gJmZpZWxkLT5ib290X2NhbGw7CiAJdHMgPSBpdGVyLT50czsKLQluc2VjX3JlbSA9IGRvX2Rpdih0cywgMTAwMDAwMDAwMCk7CisJbnNlY19yZW0gPSBkb19kaXYodHMsIE5TRUNfUEVSX1NFQyk7CiAKIAlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJbJTVsZC4lMDlsZF0gY2FsbGluZyAgJXMgQCAlaVxuIiwKIAkJCSh1bnNpZ25lZCBsb25nKXRzLCBuc2VjX3JlbSwgY2FsbC0+ZnVuYywgY2FsbC0+Y2FsbGVyKTsKQEAgLTkyLDcgKzkzLDcgQEAKIAl0cmFjZV9hc3NpZ25fdHlwZShmaWVsZCwgZW50cnkpOwogCWluaXRfcmV0ID0gJmZpZWxkLT5ib290X3JldDsKIAl0cyA9IGl0ZXItPnRzOwotCW5zZWNfcmVtID0gZG9fZGl2KHRzLCAxMDAwMDAwMDAwKTsKKwluc2VjX3JlbSA9IGRvX2Rpdih0cywgTlNFQ19QRVJfU0VDKTsKIAogCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlslNWxkLiUwOWxkXSBpbml0Y2FsbCAlcyAiCiAJCQkicmV0dXJuZWQgJWQgYWZ0ZXIgJWxsdSBtc2Vjc1xuIiwKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9icmFuY2guYyBiL2tlcm5lbC90cmFjZS90cmFjZV9icmFuY2guYwppbmRleCA4MzMzNzE1Li43YTdhOWZkIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfYnJhbmNoLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2JyYW5jaC5jCkBAIC0zMCw2ICszMCw3IEBACiBzdGF0aWMgdm9pZAogcHJvYmVfbGlrZWx5X2NvbmRpdGlvbihzdHJ1Y3QgZnRyYWNlX2JyYW5jaF9kYXRhICpmLCBpbnQgdmFsLCBpbnQgZXhwZWN0KQogeworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF9icmFuY2g7CiAJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IGJyYW5jaF90cmFjZXI7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgdHJhY2VfYnJhbmNoICplbnRyeTsKQEAgLTczLDcgKzc0LDggQEAKIAllbnRyeS0+bGluZSA9IGYtPmxpbmU7CiAJZW50cnktPmNvcnJlY3QgPSB2YWwgPT0gZXhwZWN0OwogCi0JcmluZ19idWZmZXJfdW5sb2NrX2NvbW1pdCh0ci0+YnVmZmVyLCBldmVudCk7CisJaWYgKCFmaWx0ZXJfY2hlY2tfZGlzY2FyZChjYWxsLCBlbnRyeSwgdHItPmJ1ZmZlciwgZXZlbnQpKQorCQlyaW5nX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLT5idWZmZXIsIGV2ZW50KTsKIAogIG91dDoKIAlhdG9taWNfZGVjKCZ0ci0+ZGF0YVtjcHVdLT5kaXNhYmxlZCk7CkBAIC0yNzEsNyArMjczLDcgQEAKIAlyZXR1cm4gMDsKIH0KIAotc3RhdGljIHZvaWQgKmFubm90YXRlZF9icmFuY2hfc3RhdF9zdGFydCh2b2lkKQorc3RhdGljIHZvaWQgKmFubm90YXRlZF9icmFuY2hfc3RhdF9zdGFydChzdHJ1Y3QgdHJhY2VyX3N0YXQgKnRyYWNlKQogewogCXJldHVybiBfX3N0YXJ0X2Fubm90YXRlZF9icmFuY2hfcHJvZmlsZTsKIH0KQEAgLTM0Niw3ICszNDgsNyBAQAogCXJldHVybiAwOwogfQogCi1zdGF0aWMgdm9pZCAqYWxsX2JyYW5jaF9zdGF0X3N0YXJ0KHZvaWQpCitzdGF0aWMgdm9pZCAqYWxsX2JyYW5jaF9zdGF0X3N0YXJ0KHN0cnVjdCB0cmFjZXJfc3RhdCAqdHJhY2UpCiB7CiAJcmV0dXJuIF9fc3RhcnRfYnJhbmNoX3Byb2ZpbGU7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfcHJvZmlsZS5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3Byb2ZpbGUuYwppbmRleCAyMmNiYTk5Li41YjU4OTVhIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfcHJvZmlsZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudF9wcm9maWxlLmMKQEAgLTEwLDIyICsxMCwzMCBAQAogaW50IGZ0cmFjZV9wcm9maWxlX2VuYWJsZShpbnQgZXZlbnRfaWQpCiB7CiAJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpldmVudDsKKwlpbnQgcmV0ID0gLUVJTlZBTDsKIAotCWZvcl9lYWNoX2V2ZW50KGV2ZW50KSB7Ci0JCWlmIChldmVudC0+aWQgPT0gZXZlbnRfaWQpCi0JCQlyZXR1cm4gZXZlbnQtPnByb2ZpbGVfZW5hYmxlKGV2ZW50KTsKKwltdXRleF9sb2NrKCZldmVudF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKwkJaWYgKGV2ZW50LT5pZCA9PSBldmVudF9pZCkgeworCQkJcmV0ID0gZXZlbnQtPnByb2ZpbGVfZW5hYmxlKGV2ZW50KTsKKwkJCWJyZWFrOworCQl9CiAJfQorCW11dGV4X3VubG9jaygmZXZlbnRfbXV0ZXgpOwogCi0JcmV0dXJuIC1FSU5WQUw7CisJcmV0dXJuIHJldDsKIH0KIAogdm9pZCBmdHJhY2VfcHJvZmlsZV9kaXNhYmxlKGludCBldmVudF9pZCkKIHsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmV2ZW50OwogCi0JZm9yX2VhY2hfZXZlbnQoZXZlbnQpIHsKLQkJaWYgKGV2ZW50LT5pZCA9PSBldmVudF9pZCkKLQkJCXJldHVybiBldmVudC0+cHJvZmlsZV9kaXNhYmxlKGV2ZW50KTsKKwltdXRleF9sb2NrKCZldmVudF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShldmVudCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKwkJaWYgKGV2ZW50LT5pZCA9PSBldmVudF9pZCkgeworCQkJZXZlbnQtPnByb2ZpbGVfZGlzYWJsZShldmVudCk7CisJCQlicmVhazsKKwkJfQogCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKIH0KLQpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmggYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaAppbmRleCBmZDc4YmVlLi41ZTMyZTM3IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaApAQCAtNTcsNyArNTcsNyBAQAogCVRQX1JBV19GTVQoIiV1OiV1OiV1ICA9PSsgJXU6JXU6JXUgWyUwM3VdIikKICk7CiAKLVRSQUNFX0VWRU5UX0ZPUk1BVChzcGVjaWFsLCBUUkFDRV9TUEVDSUFMLCBzcGVjaWFsX2VudHJ5LCBpZ25vcmUsCitUUkFDRV9FVkVOVF9GT1JNQVRfTk9GSUxURVIoc3BlY2lhbCwgVFJBQ0VfU1BFQ0lBTCwgc3BlY2lhbF9lbnRyeSwgaWdub3JlLAogCVRSQUNFX1NUUlVDVCgKIAkJVFJBQ0VfRklFTEQodW5zaWduZWQgbG9uZywgYXJnMSwgYXJnMSkKIAkJVFJBQ0VfRklFTEQodW5zaWduZWQgbG9uZywgYXJnMiwgYXJnMikKQEAgLTEyMiw4ICsxMjIsMTAgQEAKIFRSQUNFX0VWRU5UX0ZPUk1BVChicmFuY2gsIFRSQUNFX0JSQU5DSCwgdHJhY2VfYnJhbmNoLCBpZ25vcmUsCiAJVFJBQ0VfU1RSVUNUKAogCQlUUkFDRV9GSUVMRCh1bnNpZ25lZCBpbnQsIGxpbmUsIGxpbmUpCi0JCVRSQUNFX0ZJRUxEX1NQRUNJQUwoY2hhciBmdW5jW1RSQUNFX0ZVTkNfU0laRSsxXSwgZnVuYywgZnVuYykKLQkJVFJBQ0VfRklFTERfU1BFQ0lBTChjaGFyIGZpbGVbVFJBQ0VfRlVOQ19TSVpFKzFdLCBmaWxlLCBmaWxlKQorCQlUUkFDRV9GSUVMRF9TUEVDSUFMKGNoYXIgZnVuY1tUUkFDRV9GVU5DX1NJWkUrMV0sIGZ1bmMsCisJCQkJICAgIFRSQUNFX0ZVTkNfU0laRSsxLCBmdW5jKQorCQlUUkFDRV9GSUVMRF9TUEVDSUFMKGNoYXIgZmlsZVtUUkFDRV9GVU5DX1NJWkUrMV0sIGZpbGUsCisJCQkJICAgIFRSQUNFX0ZVTkNfU0laRSsxLCBmaWxlKQogCQlUUkFDRV9GSUVMRChjaGFyLCBjb3JyZWN0LCBjb3JyZWN0KQogCSksCiAJVFBfUkFXX0ZNVCgiJXU6JXM6JXMgKCV1KSIpCkBAIC0xMzksOCArMTQxLDggQEAKIAogVFJBQ0VfRVZFTlRfRk9STUFUKHBvd2VyLCBUUkFDRV9QT1dFUiwgdHJhY2VfcG93ZXIsIGlnbm9yZSwKIAlUUkFDRV9TVFJVQ1QoCi0JCVRSQUNFX0ZJRUxEKGt0aW1lX3QsIHN0YXRlX2RhdGEuc3RhbXAsIHN0YW1wKQotCQlUUkFDRV9GSUVMRChrdGltZV90LCBzdGF0ZV9kYXRhLmVuZCwgZW5kKQorCQlUUkFDRV9GSUVMRF9TSUdOKGt0aW1lX3QsIHN0YXRlX2RhdGEuc3RhbXAsIHN0YW1wLCAxKQorCQlUUkFDRV9GSUVMRF9TSUdOKGt0aW1lX3QsIHN0YXRlX2RhdGEuZW5kLCBlbmQsIDEpCiAJCVRSQUNFX0ZJRUxEKGludCwgc3RhdGVfZGF0YS50eXBlLCB0eXBlKQogCQlUUkFDRV9GSUVMRChpbnQsIHN0YXRlX2RhdGEuc3RhdGUsIHN0YXRlKQogCSksCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzLmMKaW5kZXggNTc2ZjRmYS4uYWEwOGJlNiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50cy5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHMuYwpAQCAtOCwxOSArOCwyNSBAQAogICoKICAqLwogCisjaW5jbHVkZSA8bGludXgvd29ya3F1ZXVlLmg+CisjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KKyNpbmNsdWRlIDxsaW51eC9rdGhyZWFkLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4KICNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgorI2luY2x1ZGUgPGxpbnV4L2RlbGF5Lmg+CiAKICNpbmNsdWRlICJ0cmFjZV9vdXRwdXQuaCIKIAogI2RlZmluZSBUUkFDRV9TWVNURU0gIlRSQUNFX1NZU1RFTSIKIAotc3RhdGljIERFRklORV9NVVRFWChldmVudF9tdXRleCk7CitERUZJTkVfTVVURVgoZXZlbnRfbXV0ZXgpOworCitMSVNUX0hFQUQoZnRyYWNlX2V2ZW50cyk7CiAKIGludCB0cmFjZV9kZWZpbmVfZmllbGQoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCBjaGFyICp0eXBlLAotCQkgICAgICAgY2hhciAqbmFtZSwgaW50IG9mZnNldCwgaW50IHNpemUpCisJCSAgICAgICBjaGFyICpuYW1lLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSwgaW50IGlzX3NpZ25lZCkKIHsKIAlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2ZpZWxkICpmaWVsZDsKIApAQCAtMzgsNiArNDQsNyBAQAogCiAJZmllbGQtPm9mZnNldCA9IG9mZnNldDsKIAlmaWVsZC0+c2l6ZSA9IHNpemU7CisJZmllbGQtPmlzX3NpZ25lZCA9IGlzX3NpZ25lZDsKIAlsaXN0X2FkZCgmZmllbGQtPmxpbmssICZjYWxsLT5maWVsZHMpOwogCiAJcmV0dXJuIDA7CkBAIC01MSw0NyArNTgsOTQgQEAKIAogCXJldHVybiAtRU5PTUVNOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2VfZGVmaW5lX2ZpZWxkKTsKIAotc3RhdGljIHZvaWQgZnRyYWNlX2NsZWFyX2V2ZW50cyh2b2lkKQorI2lmZGVmIENPTkZJR19NT0RVTEVTCisKK3N0YXRpYyB2b2lkIHRyYWNlX2Rlc3Ryb3lfZmllbGRzKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCkKIHsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAodm9pZCAqKV9fc3RhcnRfZnRyYWNlX2V2ZW50czsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2ZpZWxkICpmaWVsZCwgKm5leHQ7CiAKLQotCXdoaWxlICgodW5zaWduZWQgbG9uZyljYWxsIDwgKHVuc2lnbmVkIGxvbmcpX19zdG9wX2Z0cmFjZV9ldmVudHMpIHsKLQotCQlpZiAoY2FsbC0+ZW5hYmxlZCkgewotCQkJY2FsbC0+ZW5hYmxlZCA9IDA7Ci0JCQljYWxsLT51bnJlZ2Z1bmMoKTsKLQkJfQotCQljYWxsKys7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGZpZWxkLCBuZXh0LCAmY2FsbC0+ZmllbGRzLCBsaW5rKSB7CisJCWxpc3RfZGVsKCZmaWVsZC0+bGluayk7CisJCWtmcmVlKGZpZWxkLT50eXBlKTsKKwkJa2ZyZWUoZmllbGQtPm5hbWUpOworCQlrZnJlZShmaWVsZCk7CiAJfQogfQogCisjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KKwogc3RhdGljIHZvaWQgZnRyYWNlX2V2ZW50X2VuYWJsZV9kaXNhYmxlKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwKIAkJCQkJaW50IGVuYWJsZSkKIHsKLQogCXN3aXRjaCAoZW5hYmxlKSB7CiAJY2FzZSAwOgogCQlpZiAoY2FsbC0+ZW5hYmxlZCkgewogCQkJY2FsbC0+ZW5hYmxlZCA9IDA7CisJCQl0cmFjaW5nX3N0b3BfY21kbGluZV9yZWNvcmQoKTsKIAkJCWNhbGwtPnVucmVnZnVuYygpOwogCQl9CiAJCWJyZWFrOwogCWNhc2UgMToKIAkJaWYgKCFjYWxsLT5lbmFibGVkKSB7CiAJCQljYWxsLT5lbmFibGVkID0gMTsKKwkJCXRyYWNpbmdfc3RhcnRfY21kbGluZV9yZWNvcmQoKTsKIAkJCWNhbGwtPnJlZ2Z1bmMoKTsKIAkJfQogCQlicmVhazsKIAl9CiB9CiAKK3N0YXRpYyB2b2lkIGZ0cmFjZV9jbGVhcl9ldmVudHModm9pZCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGw7CisKKwltdXRleF9sb2NrKCZldmVudF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsLCAmZnRyYWNlX2V2ZW50cywgbGlzdCkgeworCQlmdHJhY2VfZXZlbnRfZW5hYmxlX2Rpc2FibGUoY2FsbCwgMCk7CisJfQorCW11dGV4X3VubG9jaygmZXZlbnRfbXV0ZXgpOworfQorCisvKgorICogX19mdHJhY2Vfc2V0X2Nscl9ldmVudChOVUxMLCBOVUxMLCBOVUxMLCBzZXQpIHdpbGwgc2V0L3Vuc2V0IGFsbCBldmVudHMuCisgKi8KK3N0YXRpYyBpbnQgX19mdHJhY2Vfc2V0X2Nscl9ldmVudChjb25zdCBjaGFyICptYXRjaCwgY29uc3QgY2hhciAqc3ViLAorCQkJCSAgY29uc3QgY2hhciAqZXZlbnQsIGludCBzZXQpCit7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsOworCWludCByZXQgPSAtRUlOVkFMOworCisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKworCQlpZiAoIWNhbGwtPm5hbWUgfHwgIWNhbGwtPnJlZ2Z1bmMpCisJCQljb250aW51ZTsKKworCQlpZiAobWF0Y2ggJiYKKwkJICAgIHN0cmNtcChtYXRjaCwgY2FsbC0+bmFtZSkgIT0gMCAmJgorCQkgICAgc3RyY21wKG1hdGNoLCBjYWxsLT5zeXN0ZW0pICE9IDApCisJCQljb250aW51ZTsKKworCQlpZiAoc3ViICYmIHN0cmNtcChzdWIsIGNhbGwtPnN5c3RlbSkgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChldmVudCAmJiBzdHJjbXAoZXZlbnQsIGNhbGwtPm5hbWUpICE9IDApCisJCQljb250aW51ZTsKKworCQlmdHJhY2VfZXZlbnRfZW5hYmxlX2Rpc2FibGUoY2FsbCwgc2V0KTsKKworCQlyZXQgPSAwOworCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKKworCXJldHVybiByZXQ7Cit9CisKIHN0YXRpYyBpbnQgZnRyYWNlX3NldF9jbHJfZXZlbnQoY2hhciAqYnVmLCBpbnQgc2V0KQogewotCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9IF9fc3RhcnRfZnRyYWNlX2V2ZW50czsKIAljaGFyICpldmVudCA9IE5VTEwsICpzdWIgPSBOVUxMLCAqbWF0Y2g7Ci0JaW50IHJldCA9IC1FSU5WQUw7CiAKIAkvKgogCSAqIFRoZSBidWYgZm9ybWF0IGNhbiBiZSA8c3Vic3lzdGVtPjo8ZXZlbnQtbmFtZT4KQEAgLTExNywzMCArMTcxLDI0IEBACiAJCQlldmVudCA9IE5VTEw7CiAJfQogCi0JbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOwotCWZvcl9lYWNoX2V2ZW50KGNhbGwpIHsKKwlyZXR1cm4gX19mdHJhY2Vfc2V0X2Nscl9ldmVudChtYXRjaCwgc3ViLCBldmVudCwgc2V0KTsKK30KIAotCQlpZiAoIWNhbGwtPm5hbWUgfHwgIWNhbGwtPnJlZ2Z1bmMpCi0JCQljb250aW51ZTsKLQotCQlpZiAobWF0Y2ggJiYKLQkJICAgIHN0cmNtcChtYXRjaCwgY2FsbC0+bmFtZSkgIT0gMCAmJgotCQkgICAgc3RyY21wKG1hdGNoLCBjYWxsLT5zeXN0ZW0pICE9IDApCi0JCQljb250aW51ZTsKLQotCQlpZiAoc3ViICYmIHN0cmNtcChzdWIsIGNhbGwtPnN5c3RlbSkgIT0gMCkKLQkJCWNvbnRpbnVlOwotCi0JCWlmIChldmVudCAmJiBzdHJjbXAoZXZlbnQsIGNhbGwtPm5hbWUpICE9IDApCi0JCQljb250aW51ZTsKLQotCQlmdHJhY2VfZXZlbnRfZW5hYmxlX2Rpc2FibGUoY2FsbCwgc2V0KTsKLQotCQlyZXQgPSAwOwotCX0KLQltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKLQotCXJldHVybiByZXQ7CisvKioKKyAqIHRyYWNlX3NldF9jbHJfZXZlbnQgLSBlbmFibGUgb3IgZGlzYWJsZSBhbiBldmVudAorICogQHN5c3RlbTogc3lzdGVtIG5hbWUgdG8gbWF0Y2ggKE5VTEwgZm9yIGFueSBzeXN0ZW0pCisgKiBAZXZlbnQ6IGV2ZW50IG5hbWUgdG8gbWF0Y2ggKE5VTEwgZm9yIGFsbCBldmVudHMsIHdpdGhpbiBzeXN0ZW0pCisgKiBAc2V0OiAxIHRvIGVuYWJsZSwgMCB0byBkaXNhYmxlCisgKgorICogVGhpcyBpcyBhIHdheSBmb3Igb3RoZXIgcGFydHMgb2YgdGhlIGtlcm5lbCB0byBlbmFibGUgb3IgZGlzYWJsZQorICogZXZlbnQgcmVjb3JkaW5nLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtRUlOVkFMIGlmIHRoZSBwYXJhbWV0ZXJzIGRvIG5vdCBtYXRjaCBhbnkKKyAqIHJlZ2lzdGVyZWQgZXZlbnRzLgorICovCitpbnQgdHJhY2Vfc2V0X2Nscl9ldmVudChjb25zdCBjaGFyICpzeXN0ZW0sIGNvbnN0IGNoYXIgKmV2ZW50LCBpbnQgc2V0KQoreworCXJldHVybiBfX2Z0cmFjZV9zZXRfY2xyX2V2ZW50KE5VTEwsIHN5c3RlbSwgZXZlbnQsIHNldCk7CiB9CiAKIC8qIDEyOCBzaG91bGQgYmUgbXVjaCBtb3JlIHRoYW4gZW5vdWdoICovCkBAIC0yMjQsMTUgKzI3MiwxNyBAQAogc3RhdGljIHZvaWQgKgogdF9uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gbS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKm5leHQgPSBjYWxsOworCXN0cnVjdCBsaXN0X2hlYWQgKmxpc3QgPSBtLT5wcml2YXRlOworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbDsKIAogCSgqcG9zKSsrOwogCiAJZm9yICg7OykgewotCQlpZiAoKHVuc2lnbmVkIGxvbmcpY2FsbCA+PSAodW5zaWduZWQgbG9uZylfX3N0b3BfZnRyYWNlX2V2ZW50cykKKwkJaWYgKGxpc3QgPT0gJmZ0cmFjZV9ldmVudHMpCiAJCQlyZXR1cm4gTlVMTDsKIAorCQljYWxsID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwsIGxpc3QpOworCiAJCS8qCiAJCSAqIFRoZSBmdHJhY2Ugc3Vic3lzdGVtIGlzIGZvciBzaG93aW5nIGZvcm1hdHMgb25seS4KIAkJICogVGhleSBjYW4gbm90IGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQgdmlhIHRoZSBldmVudCBmaWxlcy4KQEAgLTI0MCw0NSArMjkwLDUxIEBACiAJCWlmIChjYWxsLT5yZWdmdW5jKQogCQkJYnJlYWs7CiAKLQkJY2FsbCsrOwotCQluZXh0ID0gY2FsbDsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CiAJfQogCi0JbS0+cHJpdmF0ZSA9ICsrbmV4dDsKKwltLT5wcml2YXRlID0gbGlzdC0+bmV4dDsKIAogCXJldHVybiBjYWxsOwogfQogCiBzdGF0aWMgdm9pZCAqdF9zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogeworCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKKwlpZiAoKnBvcyA9PSAwKQorCQltLT5wcml2YXRlID0gZnRyYWNlX2V2ZW50cy5uZXh0OwogCXJldHVybiB0X25leHQobSwgTlVMTCwgcG9zKTsKIH0KIAogc3RhdGljIHZvaWQgKgogc19uZXh0KHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqdiwgbG9mZl90ICpwb3MpCiB7Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gbS0+cHJpdmF0ZTsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKm5leHQ7CisJc3RydWN0IGxpc3RfaGVhZCAqbGlzdCA9IG0tPnByaXZhdGU7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsOwogCiAJKCpwb3MpKys7CiAKICByZXRyeToKLQlpZiAoKHVuc2lnbmVkIGxvbmcpY2FsbCA+PSAodW5zaWduZWQgbG9uZylfX3N0b3BfZnRyYWNlX2V2ZW50cykKKwlpZiAobGlzdCA9PSAmZnRyYWNlX2V2ZW50cykKIAkJcmV0dXJuIE5VTEw7CiAKKwljYWxsID0gbGlzdF9lbnRyeShsaXN0LCBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwsIGxpc3QpOworCiAJaWYgKCFjYWxsLT5lbmFibGVkKSB7Ci0JCWNhbGwrKzsKKwkJbGlzdCA9IGxpc3QtPm5leHQ7CiAJCWdvdG8gcmV0cnk7CiAJfQogCi0JbmV4dCA9IGNhbGw7Ci0JbS0+cHJpdmF0ZSA9ICsrbmV4dDsKKwltLT5wcml2YXRlID0gbGlzdC0+bmV4dDsKIAogCXJldHVybiBjYWxsOwogfQogCiBzdGF0aWMgdm9pZCAqc19zdGFydChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIGxvZmZfdCAqcG9zKQogeworCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKKwlpZiAoKnBvcyA9PSAwKQorCQltLT5wcml2YXRlID0gZnRyYWNlX2V2ZW50cy5uZXh0OwogCXJldHVybiBzX25leHQobSwgTlVMTCwgcG9zKTsKIH0KIApAQCAtMjk1LDEyICszNTEsMTIgQEAKIAogc3RhdGljIHZvaWQgdF9zdG9wKHN0cnVjdCBzZXFfZmlsZSAqbSwgdm9pZCAqcCkKIHsKKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKIH0KIAogc3RhdGljIGludAogZnRyYWNlX2V2ZW50X3NlcV9vcGVuKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlKQogewotCWludCByZXQ7CiAJY29uc3Qgc3RydWN0IHNlcV9vcGVyYXRpb25zICpzZXFfb3BzOwogCiAJaWYgKChmaWxlLT5mX21vZGUgJiBGTU9ERV9XUklURSkgJiYKQEAgLTMwOCwxMyArMzY0LDcgQEAKIAkJZnRyYWNlX2NsZWFyX2V2ZW50cygpOwogCiAJc2VxX29wcyA9IGlub2RlLT5pX3ByaXZhdGU7Ci0JcmV0ID0gc2VxX29wZW4oZmlsZSwgc2VxX29wcyk7Ci0JaWYgKCFyZXQpIHsKLQkJc3RydWN0IHNlcV9maWxlICptID0gZmlsZS0+cHJpdmF0ZV9kYXRhOwotCi0JCW0tPnByaXZhdGUgPSBfX3N0YXJ0X2Z0cmFjZV9ldmVudHM7Ci0JfQotCXJldHVybiByZXQ7CisJcmV0dXJuIHNlcV9vcGVuKGZpbGUsIHNlcV9vcHMpOwogfQogCiBzdGF0aWMgc3NpemVfdApAQCAtMzc0LDggKzQyNCw5MyBAQAogCXJldHVybiBjbnQ7CiB9CiAKK3N0YXRpYyBzc2l6ZV90CitzeXN0ZW1fZW5hYmxlX3JlYWQoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY250LAorCQkgICBsb2ZmX3QgKnBwb3MpCit7CisJY29uc3QgY2hhciBzZXRfdG9fY2hhcls0XSA9IHsgJz8nLCAnMCcsICcxJywgJ1gnIH07CisJY29uc3QgY2hhciAqc3lzdGVtID0gZmlscC0+cHJpdmF0ZV9kYXRhOworCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbDsKKwljaGFyIGJ1ZlsyXTsKKwlpbnQgc2V0ID0gMDsKKwlpbnQgcmV0OworCisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKwkJaWYgKCFjYWxsLT5uYW1lIHx8ICFjYWxsLT5yZWdmdW5jKQorCQkJY29udGludWU7CisKKwkJaWYgKHN5c3RlbSAmJiBzdHJjbXAoY2FsbC0+c3lzdGVtLCBzeXN0ZW0pICE9IDApCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBXZSBuZWVkIHRvIGZpbmQgb3V0IGlmIGFsbCB0aGUgZXZlbnRzIGFyZSBzZXQKKwkJICogb3IgaWYgYWxsIGV2ZW50cyBvciBjbGVhcmVkLCBvciBpZiB3ZSBoYXZlCisJCSAqIGEgbWl4dHVyZS4KKwkJICovCisJCXNldCB8PSAoMSA8PCAhIWNhbGwtPmVuYWJsZWQpOworCisJCS8qCisJCSAqIElmIHdlIGhhdmUgYSBtaXh0dXJlLCBubyBuZWVkIHRvIGxvb2sgZnVydGhlci4KKwkJICovCisJCWlmIChzZXQgPT0gMykKKwkJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKKworCWJ1ZlswXSA9IHNldF90b19jaGFyW3NldF07CisJYnVmWzFdID0gJ1xuJzsKKworCXJldCA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNudCwgcHBvcywgYnVmLCAyKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzc2l6ZV90CitzeXN0ZW1fZW5hYmxlX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxwLCBjb25zdCBjaGFyIF9fdXNlciAqdWJ1Ziwgc2l6ZV90IGNudCwKKwkJICAgIGxvZmZfdCAqcHBvcykKK3sKKwljb25zdCBjaGFyICpzeXN0ZW0gPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJdW5zaWduZWQgbG9uZyB2YWw7CisJY2hhciBidWZbNjRdOworCXNzaXplX3QgcmV0OworCisJaWYgKGNudCA+PSBzaXplb2YoYnVmKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAoY29weV9mcm9tX3VzZXIoJmJ1ZiwgdWJ1ZiwgY250KSkKKwkJcmV0dXJuIC1FRkFVTFQ7CisKKwlidWZbY250XSA9IDA7CisKKwlyZXQgPSBzdHJpY3Rfc3RydG91bChidWYsIDEwLCAmdmFsKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCXJldCA9IHRyYWNpbmdfdXBkYXRlX2J1ZmZlcnMoKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCWlmICh2YWwgIT0gMCAmJiB2YWwgIT0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyZXQgPSBfX2Z0cmFjZV9zZXRfY2xyX2V2ZW50KE5VTEwsIHN5c3RlbSwgTlVMTCwgdmFsKTsKKwlpZiAocmV0KQorCQlnb3RvIG91dDsKKworCXJldCA9IGNudDsKKworb3V0OgorCSpwcG9zICs9IGNudDsKKworCXJldHVybiByZXQ7Cit9CisKK2V4dGVybiBjaGFyICpfX2JhZF90eXBlX3NpemUodm9pZCk7CisKICN1bmRlZiBGSUVMRAogI2RlZmluZSBGSUVMRCh0eXBlLCBuYW1lKQkJCQkJCVwKKwlzaXplb2YodHlwZSkgIT0gc2l6ZW9mKGZpZWxkLm5hbWUpID8gX19iYWRfdHlwZV9zaXplKCkgOglcCiAJI3R5cGUsICJjb21tb25fIiAjbmFtZSwgb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgbmFtZSksCQlcCiAJCXNpemVvZihmaWVsZC5uYW1lKQogCkBAIC0zOTEsNyArNTI2LDcgQEAKIAkJCQkiXHRmaWVsZDolcyAlcztcdG9mZnNldDolenU7XHRzaXplOiV6dTtcbiIKIAkJCQkiXHRmaWVsZDolcyAlcztcdG9mZnNldDolenU7XHRzaXplOiV6dTtcbiIKIAkJCQkiXG4iLAotCQkJCUZJRUxEKHVuc2lnbmVkIGNoYXIsIHR5cGUpLAorCQkJCUZJRUxEKHVuc2lnbmVkIHNob3J0LCB0eXBlKSwKIAkJCQlGSUVMRCh1bnNpZ25lZCBjaGFyLCBmbGFncyksCiAJCQkJRklFTEQodW5zaWduZWQgY2hhciwgcHJlZW1wdF9jb3VudCksCiAJCQkJRklFTEQoaW50LCBwaWQpLApAQCAtNDgxLDcgKzYxNiw3IEBACiAKIAl0cmFjZV9zZXFfaW5pdChzKTsKIAotCWZpbHRlcl9wcmludF9wcmVkcyhjYWxsLT5wcmVkcywgcyk7CisJcHJpbnRfZXZlbnRfZmlsdGVyKGNhbGwsIHMpOwogCXIgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjbnQsIHBwb3MsIHMtPmJ1ZmZlciwgcy0+bGVuKTsKIAogCWtmcmVlKHMpOwpAQCAtNDk0LDM4ICs2MjksMjYgQEAKIAkJICAgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls2NF0sICpwYnVmID0gYnVmOwotCXN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZDsKKwljaGFyICpidWY7CiAJaW50IGVycjsKIAotCWlmIChjbnQgPj0gc2l6ZW9mKGJ1ZikpCisJaWYgKGNudCA+PSBQQUdFX1NJWkUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIHVidWYsIGNudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWJ1ZltjbnRdID0gJ1wwJzsKLQotCXByZWQgPSBremFsbG9jKHNpemVvZigqcHJlZCksIEdGUF9LRVJORUwpOwotCWlmICghcHJlZCkKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfVEVNUE9SQVJZKTsKKwlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllcnIgPSBmaWx0ZXJfcGFyc2UoJnBidWYsIHByZWQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWZpbHRlcl9mcmVlX3ByZWQocHJlZCk7Ci0JCXJldHVybiBlcnI7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdWJ1ZiwgY250KSkgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7CisJCXJldHVybiAtRUZBVUxUOwogCX0KKwlidWZbY250XSA9ICdcMCc7CiAKLQlpZiAocHJlZC0+Y2xlYXIpIHsKLQkJZmlsdGVyX2ZyZWVfcHJlZHMoY2FsbCk7Ci0JCWZpbHRlcl9mcmVlX3ByZWQocHJlZCk7Ci0JCXJldHVybiBjbnQ7Ci0JfQotCi0JZXJyID0gZmlsdGVyX2FkZF9wcmVkKGNhbGwsIHByZWQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWZpbHRlcl9mcmVlX3ByZWQocHJlZCk7CisJZXJyID0gYXBwbHlfZXZlbnRfZmlsdGVyKGNhbGwsIGJ1Zik7CisJZnJlZV9wYWdlKCh1bnNpZ25lZCBsb25nKSBidWYpOworCWlmIChlcnIgPCAwKQogCQlyZXR1cm4gZXJyOwotCX0KIAogCSpwcG9zICs9IGNudDsKIApAQCAtNTQ5LDcgKzY3Miw3IEBACiAKIAl0cmFjZV9zZXFfaW5pdChzKTsKIAotCWZpbHRlcl9wcmludF9wcmVkcyhzeXN0ZW0tPnByZWRzLCBzKTsKKwlwcmludF9zdWJzeXN0ZW1fZXZlbnRfZmlsdGVyKHN5c3RlbSwgcyk7CiAJciA9IHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVidWYsIGNudCwgcHBvcywgcy0+YnVmZmVyLCBzLT5sZW4pOwogCiAJa2ZyZWUocyk7CkBAIC01NjIsNDUgKzY4NSw1NiBAQAogCQkgICAgICAgbG9mZl90ICpwcG9zKQogewogCXN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSA9IGZpbHAtPnByaXZhdGVfZGF0YTsKLQljaGFyIGJ1Zls2NF0sICpwYnVmID0gYnVmOwotCXN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZDsKKwljaGFyICpidWY7CiAJaW50IGVycjsKIAotCWlmIChjbnQgPj0gc2l6ZW9mKGJ1ZikpCisJaWYgKGNudCA+PSBQQUdFX1NJWkUpCiAJCXJldHVybiAtRUlOVkFMOwogCi0JaWYgKGNvcHlfZnJvbV91c2VyKCZidWYsIHVidWYsIGNudCkpCi0JCXJldHVybiAtRUZBVUxUOwotCWJ1ZltjbnRdID0gJ1wwJzsKLQotCXByZWQgPSBremFsbG9jKHNpemVvZigqcHJlZCksIEdGUF9LRVJORUwpOwotCWlmICghcHJlZCkKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfVEVNUE9SQVJZKTsKKwlpZiAoIWJ1ZikKIAkJcmV0dXJuIC1FTk9NRU07CiAKLQllcnIgPSBmaWx0ZXJfcGFyc2UoJnBidWYsIHByZWQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWZpbHRlcl9mcmVlX3ByZWQocHJlZCk7Ci0JCXJldHVybiBlcnI7CisJaWYgKGNvcHlfZnJvbV91c2VyKGJ1ZiwgdWJ1ZiwgY250KSkgeworCQlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7CisJCXJldHVybiAtRUZBVUxUOwogCX0KKwlidWZbY250XSA9ICdcMCc7CiAKLQlpZiAocHJlZC0+Y2xlYXIpIHsKLQkJZmlsdGVyX2ZyZWVfc3Vic3lzdGVtX3ByZWRzKHN5c3RlbSk7Ci0JCWZpbHRlcl9mcmVlX3ByZWQocHJlZCk7Ci0JCXJldHVybiBjbnQ7Ci0JfQotCi0JZXJyID0gZmlsdGVyX2FkZF9zdWJzeXN0ZW1fcHJlZChzeXN0ZW0sIHByZWQpOwotCWlmIChlcnIgPCAwKSB7Ci0JCWZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzeXN0ZW0pOwotCQlmaWx0ZXJfZnJlZV9wcmVkKHByZWQpOworCWVyciA9IGFwcGx5X3N1YnN5c3RlbV9ldmVudF9maWx0ZXIoc3lzdGVtLCBidWYpOworCWZyZWVfcGFnZSgodW5zaWduZWQgbG9uZykgYnVmKTsKKwlpZiAoZXJyIDwgMCkKIAkJcmV0dXJuIGVycjsKLQl9CiAKIAkqcHBvcyArPSBjbnQ7CiAKIAlyZXR1cm4gY250OwogfQogCitzdGF0aWMgc3NpemVfdAorc2hvd19oZWFkZXIoc3RydWN0IGZpbGUgKmZpbHAsIGNoYXIgX191c2VyICp1YnVmLCBzaXplX3QgY250LCBsb2ZmX3QgKnBwb3MpCit7CisJaW50ICgqZnVuYykoc3RydWN0IHRyYWNlX3NlcSAqcykgPSBmaWxwLT5wcml2YXRlX2RhdGE7CisJc3RydWN0IHRyYWNlX3NlcSAqczsKKwlpbnQgcjsKKworCWlmICgqcHBvcykKKwkJcmV0dXJuIDA7CisKKwlzID0ga21hbGxvYyhzaXplb2YoKnMpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXMpCisJCXJldHVybiAtRU5PTUVNOworCisJdHJhY2Vfc2VxX2luaXQocyk7CisKKwlmdW5jKHMpOworCXIgPSBzaW1wbGVfcmVhZF9mcm9tX2J1ZmZlcih1YnVmLCBjbnQsIHBwb3MsIHMtPmJ1ZmZlciwgcy0+bGVuKTsKKworCWtmcmVlKHMpOworCisJcmV0dXJuIHI7Cit9CisKIHN0YXRpYyBjb25zdCBzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgc2hvd19ldmVudF9zZXFfb3BzID0gewogCS5zdGFydCA9IHRfc3RhcnQsCiAJLm5leHQgPSB0X25leHQsCkBAIC02NTgsNiArNzkyLDE3IEBACiAJLndyaXRlID0gc3Vic3lzdGVtX2ZpbHRlcl93cml0ZSwKIH07CiAKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIGZ0cmFjZV9zeXN0ZW1fZW5hYmxlX2ZvcHMgPSB7CisJLm9wZW4gPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKKwkucmVhZCA9IHN5c3RlbV9lbmFibGVfcmVhZCwKKwkud3JpdGUgPSBzeXN0ZW1fZW5hYmxlX3dyaXRlLAorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgZnRyYWNlX3Nob3dfaGVhZGVyX2ZvcHMgPSB7CisJLm9wZW4gPSB0cmFjaW5nX29wZW5fZ2VuZXJpYywKKwkucmVhZCA9IHNob3dfaGVhZGVyLAorfTsKKwogc3RhdGljIHN0cnVjdCBkZW50cnkgKmV2ZW50X3RyYWNlX2V2ZW50c19kaXIodm9pZCkKIHsKIAlzdGF0aWMgc3RydWN0IGRlbnRyeSAqZF90cmFjZXI7CkBAIC02ODQsNiArODI5LDcgQEAKIGV2ZW50X3N1YnN5c3RlbV9kaXIoY29uc3QgY2hhciAqbmFtZSwgc3RydWN0IGRlbnRyeSAqZF9ldmVudHMpCiB7CiAJc3RydWN0IGV2ZW50X3N1YnN5c3RlbSAqc3lzdGVtOworCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCiAJLyogRmlyc3Qgc2VlIGlmIHdlIGRpZCBub3QgYWxyZWFkeSBjcmVhdGUgdGhpcyBkaXIgKi8KIAlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN5c3RlbSwgJmV2ZW50X3N1YnN5c3RlbXMsIGxpc3QpIHsKQEAgLTcwNywxNiArODUzLDQ2IEBACiAJCXJldHVybiBkX2V2ZW50czsKIAl9CiAKLQlzeXN0ZW0tPm5hbWUgPSBuYW1lOworCXN5c3RlbS0+bmFtZSA9IGtzdHJkdXAobmFtZSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFzeXN0ZW0tPm5hbWUpIHsKKwkJZGVidWdmc19yZW1vdmUoc3lzdGVtLT5lbnRyeSk7CisJCWtmcmVlKHN5c3RlbSk7CisJCXJldHVybiBkX2V2ZW50czsKKwl9CisKIAlsaXN0X2FkZCgmc3lzdGVtLT5saXN0LCAmZXZlbnRfc3Vic3lzdGVtcyk7CiAKLQlzeXN0ZW0tPnByZWRzID0gTlVMTDsKKwlzeXN0ZW0tPmZpbHRlciA9IE5VTEw7CisKKwlzeXN0ZW0tPmZpbHRlciA9IGt6YWxsb2Moc2l6ZW9mKHN0cnVjdCBldmVudF9maWx0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXN5c3RlbS0+ZmlsdGVyKSB7CisJCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBhbGxvY2F0ZSBmaWx0ZXIgZm9yIHN1YnN5c3RlbSAiCisJCQkgICAiJyVzJ1xuIiwgbmFtZSk7CisJCXJldHVybiBzeXN0ZW0tPmVudHJ5OworCX0KKworCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZmlsdGVyIiwgMDY0NCwgc3lzdGVtLT5lbnRyeSwgc3lzdGVtLAorCQkJCSAgICAmZnRyYWNlX3N1YnN5c3RlbV9maWx0ZXJfZm9wcyk7CisJaWYgKCFlbnRyeSkgeworCQlrZnJlZShzeXN0ZW0tPmZpbHRlcik7CisJCXN5c3RlbS0+ZmlsdGVyID0gTlVMTDsKKwkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKKwkJCSAgICInJXMvZmlsdGVyJyBlbnRyeVxuIiwgbmFtZSk7CisJfQorCisJZW50cnkgPSB0cmFjZV9jcmVhdGVfZmlsZSgiZW5hYmxlIiwgMDY0NCwgc3lzdGVtLT5lbnRyeSwKKwkJCQkgICh2b2lkICopc3lzdGVtLT5uYW1lLAorCQkJCSAgJmZ0cmFjZV9zeXN0ZW1fZW5hYmxlX2ZvcHMpOwogCiAJcmV0dXJuIHN5c3RlbS0+ZW50cnk7CiB9CiAKIHN0YXRpYyBpbnQKLWV2ZW50X2NyZWF0ZV9kaXIoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCBzdHJ1Y3QgZGVudHJ5ICpkX2V2ZW50cykKK2V2ZW50X2NyZWF0ZV9kaXIoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCBzdHJ1Y3QgZGVudHJ5ICpkX2V2ZW50cywKKwkJIGNvbnN0IHN0cnVjdCBmaWxlX29wZXJhdGlvbnMgKmlkLAorCQkgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZW5hYmxlLAorCQkgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZmlsdGVyLAorCQkgY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyAqZm9ybWF0KQogewogCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCWludCByZXQ7CkBAIC03MjUsNyArOTAxLDcgQEAKIAkgKiBJZiB0aGUgdHJhY2UgcG9pbnQgaGVhZGVyIGRpZCBub3QgZGVmaW5lIFRSQUNFX1NZU1RFTQogCSAqIHRoZW4gdGhlIHN5c3RlbSB3b3VsZCBiZSBjYWxsZWQgIlRSQUNFX1NZU1RFTSIuCiAJICovCi0JaWYgKHN0cmNtcChjYWxsLT5zeXN0ZW0sICJUUkFDRV9TWVNURU0iKSAhPSAwKQorCWlmIChzdHJjbXAoY2FsbC0+c3lzdGVtLCBUUkFDRV9TWVNURU0pICE9IDApCiAJCWRfZXZlbnRzID0gZXZlbnRfc3Vic3lzdGVtX2RpcihjYWxsLT5zeXN0ZW0sIGRfZXZlbnRzKTsKIAogCWlmIChjYWxsLT5yYXdfaW5pdCkgewpAQCAtNzQ0LDIxICs5MjAsMTMgQEAKIAkJcmV0dXJuIC0xOwogCX0KIAotCWlmIChjYWxsLT5yZWdmdW5jKSB7Ci0JCWVudHJ5ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZW5hYmxlIiwgMDY0NCwgY2FsbC0+ZGlyLCBjYWxsLAotCQkJCQkgICAgJmZ0cmFjZV9lbmFibGVfZm9wcyk7Ci0JCWlmICghZW50cnkpCi0JCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJCSAgICInJXMvZW5hYmxlJyBlbnRyeVxuIiwgY2FsbC0+bmFtZSk7Ci0JfQorCWlmIChjYWxsLT5yZWdmdW5jKQorCQllbnRyeSA9IHRyYWNlX2NyZWF0ZV9maWxlKCJlbmFibGUiLCAwNjQ0LCBjYWxsLT5kaXIsIGNhbGwsCisJCQkJCSAgZW5hYmxlKTsKIAotCWlmIChjYWxsLT5pZCkgewotCQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImlkIiwgMDQ0NCwgY2FsbC0+ZGlyLCBjYWxsLAotCQkJCSZmdHJhY2VfZXZlbnRfaWRfZm9wcyk7Ci0JCWlmICghZW50cnkpCi0JCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgJyVzL2lkJyBlbnRyeVxuIiwKLQkJCQkJY2FsbC0+bmFtZSk7Ci0JfQorCWlmIChjYWxsLT5pZCkKKwkJZW50cnkgPSB0cmFjZV9jcmVhdGVfZmlsZSgiaWQiLCAwNDQ0LCBjYWxsLT5kaXIsIGNhbGwsCisJCQkJCSAgaWQpOwogCiAJaWYgKGNhbGwtPmRlZmluZV9maWVsZHMpIHsKIAkJcmV0ID0gY2FsbC0+ZGVmaW5lX2ZpZWxkcygpOwpAQCAtNzY3LDMyICs5MzUsMTk1IEBACiAJCQkJICAgIiBldmVudHMvJXNcbiIsIGNhbGwtPm5hbWUpOwogCQkJcmV0dXJuIHJldDsKIAkJfQotCQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoImZpbHRlciIsIDA2NDQsIGNhbGwtPmRpciwgY2FsbCwKLQkJCQkJICAgICZmdHJhY2VfZXZlbnRfZmlsdGVyX2ZvcHMpOwotCQlpZiAoIWVudHJ5KQotCQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICIKLQkJCQkgICAiJyVzL2ZpbHRlcicgZW50cnlcbiIsIGNhbGwtPm5hbWUpOworCQllbnRyeSA9IHRyYWNlX2NyZWF0ZV9maWxlKCJmaWx0ZXIiLCAwNjQ0LCBjYWxsLT5kaXIsIGNhbGwsCisJCQkJCSAgZmlsdGVyKTsKIAl9CiAKIAkvKiBBIHRyYWNlIG1heSBub3Qgd2FudCB0byBleHBvcnQgaXRzIGZvcm1hdCAqLwogCWlmICghY2FsbC0+c2hvd19mb3JtYXQpCiAJCXJldHVybiAwOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJmb3JtYXQiLCAwNDQ0LCBjYWxsLT5kaXIsIGNhbGwsCi0JCQkJICAgICZmdHJhY2VfZXZlbnRfZm9ybWF0X2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAiCi0JCQkgICAiJyVzL2Zvcm1hdCcgZW50cnlcbiIsIGNhbGwtPm5hbWUpOworCWVudHJ5ID0gdHJhY2VfY3JlYXRlX2ZpbGUoImZvcm1hdCIsIDA0NDQsIGNhbGwtPmRpciwgY2FsbCwKKwkJCQkgIGZvcm1hdCk7CiAKIAlyZXR1cm4gMDsKIH0KIAorI2RlZmluZSBmb3JfZWFjaF9ldmVudChldmVudCwgc3RhcnQsIGVuZCkJCQlcCisJZm9yIChldmVudCA9IHN0YXJ0OwkJCQkJXAorCSAgICAgKHVuc2lnbmVkIGxvbmcpZXZlbnQgPCAodW5zaWduZWQgbG9uZyllbmQ7CQlcCisJICAgICBldmVudCsrKQorCisjaWZkZWYgQ09ORklHX01PRFVMRVMKKworc3RhdGljIExJU1RfSEVBRChmdHJhY2VfbW9kdWxlX2ZpbGVfbGlzdCk7CisKKy8qCisgKiBNb2R1bGVzIG11c3Qgb3duIHRoZWlyIGZpbGVfb3BlcmF0aW9ucyB0byBrZWVwIHVwIHdpdGgKKyAqIHJlZmVyZW5jZSBjb3VudGluZy4KKyAqLworc3RydWN0IGZ0cmFjZV9tb2R1bGVfZmlsZV9vcHMgeworCXN0cnVjdCBsaXN0X2hlYWQJCWxpc3Q7CisJc3RydWN0IG1vZHVsZQkJCSptb2Q7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkJaWQ7CisJc3RydWN0IGZpbGVfb3BlcmF0aW9ucwkJZW5hYmxlOworCXN0cnVjdCBmaWxlX29wZXJhdGlvbnMJCWZvcm1hdDsKKwlzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zCQlmaWx0ZXI7Cit9OworCitzdGF0aWMgc3RydWN0IGZ0cmFjZV9tb2R1bGVfZmlsZV9vcHMgKgordHJhY2VfY3JlYXRlX2ZpbGVfb3BzKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX21vZHVsZV9maWxlX29wcyAqZmlsZV9vcHM7CisKKwkvKgorCSAqIFRoaXMgaXMgYSBiaXQgb2YgYSBQSVRBLiBUbyBhbGxvdyBmb3IgY29ycmVjdCByZWZlcmVuY2UKKwkgKiBjb3VudGluZywgbW9kdWxlcyBtdXN0ICJvd24iIHRoZWlyIGZpbGVfb3BlcmF0aW9ucy4KKwkgKiBUbyBkbyB0aGlzLCB3ZSBhbGxvY2F0ZSB0aGUgZmlsZSBvcGVyYXRpb25zIHRoYXQgd2lsbCBiZQorCSAqIHVzZWQgaW4gdGhlIGV2ZW50IGRpcmVjdG9yeS4KKwkgKi8KKworCWZpbGVfb3BzID0ga21hbGxvYyhzaXplb2YoKmZpbGVfb3BzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFmaWxlX29wcykKKwkJcmV0dXJuIE5VTEw7CisKKwlmaWxlX29wcy0+bW9kID0gbW9kOworCisJZmlsZV9vcHMtPmlkID0gZnRyYWNlX2V2ZW50X2lkX2ZvcHM7CisJZmlsZV9vcHMtPmlkLm93bmVyID0gbW9kOworCisJZmlsZV9vcHMtPmVuYWJsZSA9IGZ0cmFjZV9lbmFibGVfZm9wczsKKwlmaWxlX29wcy0+ZW5hYmxlLm93bmVyID0gbW9kOworCisJZmlsZV9vcHMtPmZpbHRlciA9IGZ0cmFjZV9ldmVudF9maWx0ZXJfZm9wczsKKwlmaWxlX29wcy0+ZmlsdGVyLm93bmVyID0gbW9kOworCisJZmlsZV9vcHMtPmZvcm1hdCA9IGZ0cmFjZV9ldmVudF9mb3JtYXRfZm9wczsKKwlmaWxlX29wcy0+Zm9ybWF0Lm93bmVyID0gbW9kOworCisJbGlzdF9hZGQoJmZpbGVfb3BzLT5saXN0LCAmZnRyYWNlX21vZHVsZV9maWxlX2xpc3QpOworCisJcmV0dXJuIGZpbGVfb3BzOworfQorCitzdGF0aWMgdm9pZCB0cmFjZV9tb2R1bGVfYWRkX2V2ZW50cyhzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJc3RydWN0IGZ0cmFjZV9tb2R1bGVfZmlsZV9vcHMgKmZpbGVfb3BzID0gTlVMTDsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsICpzdGFydCwgKmVuZDsKKwlzdHJ1Y3QgZGVudHJ5ICpkX2V2ZW50czsKKworCXN0YXJ0ID0gbW9kLT50cmFjZV9ldmVudHM7CisJZW5kID0gbW9kLT50cmFjZV9ldmVudHMgKyBtb2QtPm51bV90cmFjZV9ldmVudHM7CisKKwlpZiAoc3RhcnQgPT0gZW5kKQorCQlyZXR1cm47CisKKwlkX2V2ZW50cyA9IGV2ZW50X3RyYWNlX2V2ZW50c19kaXIoKTsKKwlpZiAoIWRfZXZlbnRzKQorCQlyZXR1cm47CisKKwlmb3JfZWFjaF9ldmVudChjYWxsLCBzdGFydCwgZW5kKSB7CisJCS8qIFRoZSBsaW5rZXIgbWF5IGxlYXZlIGJsYW5rcyAqLworCQlpZiAoIWNhbGwtPm5hbWUpCisJCQljb250aW51ZTsKKworCQkvKgorCQkgKiBUaGlzIG1vZHVsZSBoYXMgZXZlbnRzLCBjcmVhdGUgZmlsZSBvcHMgZm9yIHRoaXMgbW9kdWxlCisJCSAqIGlmIG5vdCBhbHJlYWR5IGRvbmUuCisJCSAqLworCQlpZiAoIWZpbGVfb3BzKSB7CisJCQlmaWxlX29wcyA9IHRyYWNlX2NyZWF0ZV9maWxlX29wcyhtb2QpOworCQkJaWYgKCFmaWxlX29wcykKKwkJCQlyZXR1cm47CisJCX0KKwkJY2FsbC0+bW9kID0gbW9kOworCQlsaXN0X2FkZCgmY2FsbC0+bGlzdCwgJmZ0cmFjZV9ldmVudHMpOworCQlldmVudF9jcmVhdGVfZGlyKGNhbGwsIGRfZXZlbnRzLAorCQkJCSAmZmlsZV9vcHMtPmlkLCAmZmlsZV9vcHMtPmVuYWJsZSwKKwkJCQkgJmZpbGVfb3BzLT5maWx0ZXIsICZmaWxlX29wcy0+Zm9ybWF0KTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHRyYWNlX21vZHVsZV9yZW1vdmVfZXZlbnRzKHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX21vZHVsZV9maWxlX29wcyAqZmlsZV9vcHM7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCAqcDsKKwlib29sIGZvdW5kID0gZmFsc2U7CisKKwlkb3duX3dyaXRlKCZ0cmFjZV9ldmVudF9tdXRleCk7CisJbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKGNhbGwsIHAsICZmdHJhY2VfZXZlbnRzLCBsaXN0KSB7CisJCWlmIChjYWxsLT5tb2QgPT0gbW9kKSB7CisJCQlmb3VuZCA9IHRydWU7CisJCQlmdHJhY2VfZXZlbnRfZW5hYmxlX2Rpc2FibGUoY2FsbCwgMCk7CisJCQlpZiAoY2FsbC0+ZXZlbnQpCisJCQkJX191bnJlZ2lzdGVyX2Z0cmFjZV9ldmVudChjYWxsLT5ldmVudCk7CisJCQlkZWJ1Z2ZzX3JlbW92ZV9yZWN1cnNpdmUoY2FsbC0+ZGlyKTsKKwkJCWxpc3RfZGVsKCZjYWxsLT5saXN0KTsKKwkJCXRyYWNlX2Rlc3Ryb3lfZmllbGRzKGNhbGwpOworCQkJZGVzdHJveV9wcmVkcyhjYWxsKTsKKwkJfQorCX0KKworCS8qIE5vdyBmcmVlIHRoZSBmaWxlX29wZXJhdGlvbnMgKi8KKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KGZpbGVfb3BzLCAmZnRyYWNlX21vZHVsZV9maWxlX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGZpbGVfb3BzLT5tb2QgPT0gbW9kKQorCQkJYnJlYWs7CisJfQorCWlmICgmZmlsZV9vcHMtPmxpc3QgIT0gJmZ0cmFjZV9tb2R1bGVfZmlsZV9saXN0KSB7CisJCWxpc3RfZGVsKCZmaWxlX29wcy0+bGlzdCk7CisJCWtmcmVlKGZpbGVfb3BzKTsKKwl9CisKKwkvKgorCSAqIEl0IGlzIHNhZmVzdCB0byByZXNldCB0aGUgcmluZyBidWZmZXIgaWYgdGhlIG1vZHVsZSBiZWluZyB1bmxvYWRlZAorCSAqIHJlZ2lzdGVyZWQgYW55IGV2ZW50cy4KKwkgKi8KKwlpZiAoZm91bmQpCisJCXRyYWNpbmdfcmVzZXRfY3VycmVudF9vbmxpbmVfY3B1cygpOworCXVwX3dyaXRlKCZ0cmFjZV9ldmVudF9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgdHJhY2VfbW9kdWxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kID0gZGF0YTsKKworCW11dGV4X2xvY2soJmV2ZW50X211dGV4KTsKKwlzd2l0Y2ggKHZhbCkgeworCWNhc2UgTU9EVUxFX1NUQVRFX0NPTUlORzoKKwkJdHJhY2VfbW9kdWxlX2FkZF9ldmVudHMobW9kKTsKKwkJYnJlYWs7CisJY2FzZSBNT0RVTEVfU1RBVEVfR09JTkc6CisJCXRyYWNlX21vZHVsZV9yZW1vdmVfZXZlbnRzKG1vZCk7CisJCWJyZWFrOworCX0KKwltdXRleF91bmxvY2soJmV2ZW50X211dGV4KTsKKworCXJldHVybiAwOworfQorI2Vsc2UKK3N0YXRpYyBpbnQgdHJhY2VfbW9kdWxlX25vdGlmeShzdHJ1Y3Qgbm90aWZpZXJfYmxvY2sgKnNlbGYsCisJCQkgICAgICAgdW5zaWduZWQgbG9uZyB2YWwsIHZvaWQgKmRhdGEpCit7CisJcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogQ09ORklHX01PRFVMRVMgKi8KKworc3RydWN0IG5vdGlmaWVyX2Jsb2NrIHRyYWNlX21vZHVsZV9uYiA9IHsKKwkubm90aWZpZXJfY2FsbCA9IHRyYWNlX21vZHVsZV9ub3RpZnksCisJLnByaW9yaXR5ID0gMCwKK307CisKK2V4dGVybiBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX19zdGFydF9mdHJhY2VfZXZlbnRzW107CitleHRlcm4gc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fc3RvcF9mdHJhY2VfZXZlbnRzW107CisKIHN0YXRpYyBfX2luaXQgaW50IGV2ZW50X3RyYWNlX2luaXQodm9pZCkKIHsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSBfX3N0YXJ0X2Z0cmFjZV9ldmVudHM7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsOwogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwogCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCXN0cnVjdCBkZW50cnkgKmRfZXZlbnRzOworCWludCByZXQ7CiAKIAlkX3RyYWNlciA9IHRyYWNpbmdfaW5pdF9kZW50cnkoKTsKIAlpZiAoIWRfdHJhY2VyKQpAQCAtODE2LDEzICsxMTQ3LDI0MyBAQAogCWlmICghZF9ldmVudHMpCiAJCXJldHVybiAwOwogCi0JZm9yX2VhY2hfZXZlbnQoY2FsbCkgeworCS8qIHJpbmcgYnVmZmVyIGludGVybmFsIGZvcm1hdHMgKi8KKwl0cmFjZV9jcmVhdGVfZmlsZSgiaGVhZGVyX3BhZ2UiLCAwNDQ0LCBkX2V2ZW50cywKKwkJCSAgcmluZ19idWZmZXJfcHJpbnRfcGFnZV9oZWFkZXIsCisJCQkgICZmdHJhY2Vfc2hvd19oZWFkZXJfZm9wcyk7CisKKwl0cmFjZV9jcmVhdGVfZmlsZSgiaGVhZGVyX2V2ZW50IiwgMDQ0NCwgZF9ldmVudHMsCisJCQkgIHJpbmdfYnVmZmVyX3ByaW50X2VudHJ5X2hlYWRlciwKKwkJCSAgJmZ0cmFjZV9zaG93X2hlYWRlcl9mb3BzKTsKKworCXRyYWNlX2NyZWF0ZV9maWxlKCJlbmFibGUiLCAwNjQ0LCBkX2V2ZW50cywKKwkJCSAgTlVMTCwgJmZ0cmFjZV9zeXN0ZW1fZW5hYmxlX2ZvcHMpOworCisJZm9yX2VhY2hfZXZlbnQoY2FsbCwgX19zdGFydF9mdHJhY2VfZXZlbnRzLCBfX3N0b3BfZnRyYWNlX2V2ZW50cykgewogCQkvKiBUaGUgbGlua2VyIG1heSBsZWF2ZSBibGFua3MgKi8KIAkJaWYgKCFjYWxsLT5uYW1lKQogCQkJY29udGludWU7Ci0JCWV2ZW50X2NyZWF0ZV9kaXIoY2FsbCwgZF9ldmVudHMpOworCQlsaXN0X2FkZCgmY2FsbC0+bGlzdCwgJmZ0cmFjZV9ldmVudHMpOworCQlldmVudF9jcmVhdGVfZGlyKGNhbGwsIGRfZXZlbnRzLCAmZnRyYWNlX2V2ZW50X2lkX2ZvcHMsCisJCQkJICZmdHJhY2VfZW5hYmxlX2ZvcHMsICZmdHJhY2VfZXZlbnRfZmlsdGVyX2ZvcHMsCisJCQkJICZmdHJhY2VfZXZlbnRfZm9ybWF0X2ZvcHMpOwogCX0KIAorCXJldCA9IHJlZ2lzdGVyX21vZHVsZV9ub3RpZmllcigmdHJhY2VfbW9kdWxlX25iKTsKKwlpZiAocmV0KQorCQlwcl93YXJuaW5nKCJGYWlsZWQgdG8gcmVnaXN0ZXIgdHJhY2UgZXZlbnRzIG1vZHVsZSBub3RpZmllclxuIik7CisKIAlyZXR1cm4gMDsKIH0KIGZzX2luaXRjYWxsKGV2ZW50X3RyYWNlX2luaXQpOworCisjaWZkZWYgQ09ORklHX0ZUUkFDRV9TVEFSVFVQX1RFU1QKKworc3RhdGljIERFRklORV9TUElOTE9DSyh0ZXN0X3NwaW5sb2NrKTsKK3N0YXRpYyBERUZJTkVfU1BJTkxPQ0sodGVzdF9zcGlubG9ja19pcnEpOworc3RhdGljIERFRklORV9NVVRFWCh0ZXN0X211dGV4KTsKKworc3RhdGljIF9faW5pdCB2b2lkIHRlc3Rfd29yayhzdHJ1Y3Qgd29ya19zdHJ1Y3QgKmR1bW15KQoreworCXNwaW5fbG9jaygmdGVzdF9zcGlubG9jayk7CisJc3Bpbl9sb2NrX2lycSgmdGVzdF9zcGlubG9ja19pcnEpOworCXVkZWxheSgxKTsKKwlzcGluX3VubG9ja19pcnEoJnRlc3Rfc3BpbmxvY2tfaXJxKTsKKwlzcGluX3VubG9jaygmdGVzdF9zcGlubG9jayk7CisKKwltdXRleF9sb2NrKCZ0ZXN0X211dGV4KTsKKwltc2xlZXAoMSk7CisJbXV0ZXhfdW5sb2NrKCZ0ZXN0X211dGV4KTsKK30KKworc3RhdGljIF9faW5pdCBpbnQgZXZlbnRfdGVzdF90aHJlYWQodm9pZCAqdW51c2VkKQoreworCXZvaWQgKnRlc3RfbWFsbG9jOworCisJdGVzdF9tYWxsb2MgPSBrbWFsbG9jKDEyMzQsIEdGUF9LRVJORUwpOworCWlmICghdGVzdF9tYWxsb2MpCisJCXByX2luZm8oImZhaWxlZCB0byBrbWFsbG9jXG4iKTsKKworCXNjaGVkdWxlX29uX2VhY2hfY3B1KHRlc3Rfd29yayk7CisKKwlrZnJlZSh0ZXN0X21hbGxvYyk7CisKKwlzZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOworCXdoaWxlICgha3RocmVhZF9zaG91bGRfc3RvcCgpKQorCQlzY2hlZHVsZSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qCisgKiBEbyB2YXJpb3VzIHRoaW5ncyB0aGF0IG1heSB0cmlnZ2VyIGV2ZW50cy4KKyAqLworc3RhdGljIF9faW5pdCB2b2lkIGV2ZW50X3Rlc3Rfc3R1ZmYodm9pZCkKK3sKKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRlc3RfdGhyZWFkOworCisJdGVzdF90aHJlYWQgPSBrdGhyZWFkX3J1bihldmVudF90ZXN0X3RocmVhZCwgTlVMTCwgInRlc3QtZXZlbnRzIik7CisJbXNsZWVwKDEpOworCWt0aHJlYWRfc3RvcCh0ZXN0X3RocmVhZCk7Cit9CisKKy8qCisgKiBGb3IgZXZlcnkgdHJhY2UgZXZlbnQgZGVmaW5lZCwgd2Ugd2lsbCB0ZXN0IGVhY2ggdHJhY2UgcG9pbnQgc2VwYXJhdGVseSwKKyAqIGFuZCB0aGVuIGJ5IGdyb3VwcywgYW5kIGZpbmFsbHkgYWxsIHRyYWNlIHBvaW50cy4KKyAqLworc3RhdGljIF9faW5pdCB2b2lkIGV2ZW50X3RyYWNlX3NlbGZfdGVzdHModm9pZCkKK3sKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGw7CisJc3RydWN0IGV2ZW50X3N1YnN5c3RlbSAqc3lzdGVtOworCWludCByZXQ7CisKKwlwcl9pbmZvKCJSdW5uaW5nIHRlc3RzIG9uIHRyYWNlIGV2ZW50czpcbiIpOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShjYWxsLCAmZnRyYWNlX2V2ZW50cywgbGlzdCkgeworCisJCS8qIE9ubHkgdGVzdCB0aG9zZSB0aGF0IGhhdmUgYSByZWdmdW5jICovCisJCWlmICghY2FsbC0+cmVnZnVuYykKKwkJCWNvbnRpbnVlOworCisJCXByX2luZm8oIlRlc3RpbmcgZXZlbnQgJXM6ICIsIGNhbGwtPm5hbWUpOworCisJCS8qCisJCSAqIElmIGFuIGV2ZW50IGlzIGFscmVhZHkgZW5hYmxlZCwgc29tZW9uZSBpcyB1c2luZworCQkgKiBpdCBhbmQgdGhlIHNlbGYgdGVzdCBzaG91bGQgbm90IGJlIG9uLgorCQkgKi8KKwkJaWYgKGNhbGwtPmVuYWJsZWQpIHsKKwkJCXByX3dhcm5pbmcoIkVuYWJsZWQgZXZlbnQgZHVyaW5nIHNlbGYgdGVzdCFcbiIpOworCQkJV0FSTl9PTl9PTkNFKDEpOworCQkJY29udGludWU7CisJCX0KKworCQlmdHJhY2VfZXZlbnRfZW5hYmxlX2Rpc2FibGUoY2FsbCwgMSk7CisJCWV2ZW50X3Rlc3Rfc3R1ZmYoKTsKKwkJZnRyYWNlX2V2ZW50X2VuYWJsZV9kaXNhYmxlKGNhbGwsIDApOworCisJCXByX2NvbnQoIk9LXG4iKTsKKwl9CisKKwkvKiBOb3cgdGVzdCBhdCB0aGUgc3ViIHN5c3RlbSBsZXZlbCAqLworCisJcHJfaW5mbygiUnVubmluZyB0ZXN0cyBvbiB0cmFjZSBldmVudCBzeXN0ZW1zOlxuIik7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHN5c3RlbSwgJmV2ZW50X3N1YnN5c3RlbXMsIGxpc3QpIHsKKworCQkvKiB0aGUgZnRyYWNlIHN5c3RlbSBpcyBzcGVjaWFsLCBza2lwIGl0ICovCisJCWlmIChzdHJjbXAoc3lzdGVtLT5uYW1lLCAiZnRyYWNlIikgPT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXByX2luZm8oIlRlc3RpbmcgZXZlbnQgc3lzdGVtICVzOiAiLCBzeXN0ZW0tPm5hbWUpOworCisJCXJldCA9IF9fZnRyYWNlX3NldF9jbHJfZXZlbnQoTlVMTCwgc3lzdGVtLT5uYW1lLCBOVUxMLCAxKTsKKwkJaWYgKFdBUk5fT05fT05DRShyZXQpKSB7CisJCQlwcl93YXJuaW5nKCJlcnJvciBlbmFibGluZyBzeXN0ZW0gJXNcbiIsCisJCQkJICAgc3lzdGVtLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJZXZlbnRfdGVzdF9zdHVmZigpOworCisJCXJldCA9IF9fZnRyYWNlX3NldF9jbHJfZXZlbnQoTlVMTCwgc3lzdGVtLT5uYW1lLCBOVUxMLCAwKTsKKwkJaWYgKFdBUk5fT05fT05DRShyZXQpKQorCQkJcHJfd2FybmluZygiZXJyb3IgZGlzYWJsaW5nIHN5c3RlbSAlc1xuIiwKKwkJCQkgICBzeXN0ZW0tPm5hbWUpOworCisJCXByX2NvbnQoIk9LXG4iKTsKKwl9CisKKwkvKiBUZXN0IHdpdGggYWxsIGV2ZW50cyBlbmFibGVkICovCisKKwlwcl9pbmZvKCJSdW5uaW5nIHRlc3RzIG9uIGFsbCB0cmFjZSBldmVudHM6XG4iKTsKKwlwcl9pbmZvKCJUZXN0aW5nIGFsbCBldmVudHM6ICIpOworCisJcmV0ID0gX19mdHJhY2Vfc2V0X2Nscl9ldmVudChOVUxMLCBOVUxMLCBOVUxMLCAxKTsKKwlpZiAoV0FSTl9PTl9PTkNFKHJldCkpIHsKKwkJcHJfd2FybmluZygiZXJyb3IgZW5hYmxpbmcgYWxsIGV2ZW50c1xuIik7CisJCXJldHVybjsKKwl9CisKKwlldmVudF90ZXN0X3N0dWZmKCk7CisKKwkvKiByZXNldCBzeXNuYW1lICovCisJcmV0ID0gX19mdHJhY2Vfc2V0X2Nscl9ldmVudChOVUxMLCBOVUxMLCBOVUxMLCAwKTsKKwlpZiAoV0FSTl9PTl9PTkNFKHJldCkpIHsKKwkJcHJfd2FybmluZygiZXJyb3IgZGlzYWJsaW5nIGFsbCBldmVudHNcbiIpOworCQlyZXR1cm47CisJfQorCisJcHJfY29udCgiT0tcbiIpOworfQorCisjaWZkZWYgQ09ORklHX0ZVTkNUSU9OX1RSQUNFUgorCitzdGF0aWMgREVGSU5FX1BFUl9DUFUoYXRvbWljX3QsIHRlc3RfZXZlbnRfZGlzYWJsZSk7CisKK3N0YXRpYyB2b2lkCitmdW5jdGlvbl90ZXN0X2V2ZW50c19jYWxsKHVuc2lnbmVkIGxvbmcgaXAsIHVuc2lnbmVkIGxvbmcgcGFyZW50X2lwKQoreworCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CisJc3RydWN0IGZ0cmFjZV9lbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlsb25nIGRpc2FibGVkOworCWludCByZXNjaGVkOworCWludCBjcHU7CisJaW50IHBjOworCisJcGMgPSBwcmVlbXB0X2NvdW50KCk7CisJcmVzY2hlZCA9IGZ0cmFjZV9wcmVlbXB0X2Rpc2FibGUoKTsKKwljcHUgPSByYXdfc21wX3Byb2Nlc3Nvcl9pZCgpOworCWRpc2FibGVkID0gYXRvbWljX2luY19yZXR1cm4oJnBlcl9jcHUodGVzdF9ldmVudF9kaXNhYmxlLCBjcHUpKTsKKworCWlmIChkaXNhYmxlZCAhPSAxKQorCQlnb3RvIG91dDsKKworCWxvY2FsX3NhdmVfZmxhZ3MoZmxhZ3MpOworCisJZXZlbnQgPSB0cmFjZV9jdXJyZW50X2J1ZmZlcl9sb2NrX3Jlc2VydmUoVFJBQ0VfRk4sIHNpemVvZigqZW50cnkpLAorCQkJCQkJICBmbGFncywgcGMpOworCWlmICghZXZlbnQpCisJCWdvdG8gb3V0OworCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CisJZW50cnktPmlwCQkJPSBpcDsKKwllbnRyeS0+cGFyZW50X2lwCQk9IHBhcmVudF9pcDsKKworCXRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdChldmVudCwgZmxhZ3MsIHBjKTsKKworIG91dDoKKwlhdG9taWNfZGVjKCZwZXJfY3B1KHRlc3RfZXZlbnRfZGlzYWJsZSwgY3B1KSk7CisJZnRyYWNlX3ByZWVtcHRfZW5hYmxlKHJlc2NoZWQpOworfQorCitzdGF0aWMgc3RydWN0IGZ0cmFjZV9vcHMgdHJhY2Vfb3BzIF9faW5pdGRhdGEgID0KK3sKKwkuZnVuYyA9IGZ1bmN0aW9uX3Rlc3RfZXZlbnRzX2NhbGwsCit9OworCitzdGF0aWMgX19pbml0IHZvaWQgZXZlbnRfdHJhY2Vfc2VsZl90ZXN0X3dpdGhfZnVuY3Rpb24odm9pZCkKK3sKKwlyZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24oJnRyYWNlX29wcyk7CisJcHJfaW5mbygiUnVubmluZyB0ZXN0cyBhZ2FpbiwgYWxvbmcgd2l0aCB0aGUgZnVuY3Rpb24gdHJhY2VyXG4iKTsKKwlldmVudF90cmFjZV9zZWxmX3Rlc3RzKCk7CisJdW5yZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24oJnRyYWNlX29wcyk7Cit9CisjZWxzZQorc3RhdGljIF9faW5pdCB2b2lkIGV2ZW50X3RyYWNlX3NlbGZfdGVzdF93aXRoX2Z1bmN0aW9uKHZvaWQpCit7Cit9CisjZW5kaWYKKworc3RhdGljIF9faW5pdCBpbnQgZXZlbnRfdHJhY2Vfc2VsZl90ZXN0c19pbml0KHZvaWQpCit7CisKKwlldmVudF90cmFjZV9zZWxmX3Rlc3RzKCk7CisKKwlldmVudF90cmFjZV9zZWxmX3Rlc3Rfd2l0aF9mdW5jdGlvbigpOworCisJcmV0dXJuIDA7Cit9CisKK2xhdGVfaW5pdGNhbGwoZXZlbnRfdHJhY2Vfc2VsZl90ZXN0c19pbml0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jIGIva2VybmVsL3RyYWNlL3RyYWNlX2V2ZW50c19maWx0ZXIuYwppbmRleCBlMDNjYmYxLi5kYjZlNTRiIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX2ZpbHRlci5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfZmlsdGVyLmMKQEAgLTIyLDU1ICsyMiwxMzggQEAKICNpbmNsdWRlIDxsaW51eC91YWNjZXNzLmg+CiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KKyNpbmNsdWRlIDxsaW51eC9tdXRleC5oPgogCiAjaW5jbHVkZSAidHJhY2UuaCIKICNpbmNsdWRlICJ0cmFjZV9vdXRwdXQuaCIKIAotc3RhdGljIGludCBmaWx0ZXJfcHJlZF82NChzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQsIHZvaWQgKmV2ZW50KQorc3RhdGljIERFRklORV9NVVRFWChmaWx0ZXJfbXV0ZXgpOworCitlbnVtIGZpbHRlcl9vcF9pZHMKIHsKLQl1NjQgKmFkZHIgPSAodTY0ICopKGV2ZW50ICsgcHJlZC0+b2Zmc2V0KTsKLQl1NjQgdmFsID0gKHU2NClwcmVkLT52YWw7Ci0JaW50IG1hdGNoOworCU9QX09SLAorCU9QX0FORCwKKwlPUF9ORSwKKwlPUF9FUSwKKwlPUF9MVCwKKwlPUF9MRSwKKwlPUF9HVCwKKwlPUF9HRSwKKwlPUF9OT05FLAorCU9QX09QRU5fUEFSRU4sCit9OwogCi0JbWF0Y2ggPSAodmFsID09ICphZGRyKSBeIHByZWQtPm5vdDsKK3N0cnVjdCBmaWx0ZXJfb3AgeworCWludCBpZDsKKwljaGFyICpzdHJpbmc7CisJaW50IHByZWNlZGVuY2U7Cit9OwogCi0JcmV0dXJuIG1hdGNoOworc3RhdGljIHN0cnVjdCBmaWx0ZXJfb3AgZmlsdGVyX29wc1tdID0geworCXsgT1BfT1IsICJ8fCIsIDEgfSwKKwl7IE9QX0FORCwgIiYmIiwgMiB9LAorCXsgT1BfTkUsICIhPSIsIDQgfSwKKwl7IE9QX0VRLCAiPT0iLCA0IH0sCisJeyBPUF9MVCwgIjwiLCA1IH0sCisJeyBPUF9MRSwgIjw9IiwgNSB9LAorCXsgT1BfR1QsICI+IiwgNSB9LAorCXsgT1BfR0UsICI+PSIsIDUgfSwKKwl7IE9QX05PTkUsICJPUF9OT05FIiwgMCB9LAorCXsgT1BfT1BFTl9QQVJFTiwgIigiLCAwIH0sCit9OworCitlbnVtIHsKKwlGSUxUX0VSUl9OT05FLAorCUZJTFRfRVJSX0lOVkFMSURfT1AsCisJRklMVF9FUlJfVU5CQUxBTkNFRF9QQVJFTiwKKwlGSUxUX0VSUl9UT09fTUFOWV9PUEVSQU5EUywKKwlGSUxUX0VSUl9PUEVSQU5EX1RPT19MT05HLAorCUZJTFRfRVJSX0ZJRUxEX05PVF9GT1VORCwKKwlGSUxUX0VSUl9JTExFR0FMX0ZJRUxEX09QLAorCUZJTFRfRVJSX0lMTEVHQUxfSU5UVkFMLAorCUZJTFRfRVJSX0JBRF9TVUJTWVNfRklMVEVSLAorCUZJTFRfRVJSX1RPT19NQU5ZX1BSRURTLAorCUZJTFRfRVJSX01JU1NJTkdfRklFTEQsCisJRklMVF9FUlJfSU5WQUxJRF9GSUxURVIsCit9OworCitzdGF0aWMgY2hhciAqZXJyX3RleHRbXSA9IHsKKwkiTm8gZXJyb3IiLAorCSJJbnZhbGlkIG9wZXJhdG9yIiwKKwkiVW5iYWxhbmNlZCBwYXJlbnMiLAorCSJUb28gbWFueSBvcGVyYW5kcyIsCisJIk9wZXJhbmQgdG9vIGxvbmciLAorCSJGaWVsZCBub3QgZm91bmQiLAorCSJJbGxlZ2FsIG9wZXJhdGlvbiBmb3IgZmllbGQgdHlwZSIsCisJIklsbGVnYWwgaW50ZWdlciB2YWx1ZSIsCisJIkNvdWxkbid0IGZpbmQgb3Igc2V0IGZpZWxkIGluIG9uZSBvZiBhIHN1YnN5c3RlbSdzIGV2ZW50cyIsCisJIlRvbyBtYW55IHRlcm1zIGluIHByZWRpY2F0ZSBleHByZXNzaW9uIiwKKwkiTWlzc2luZyBmaWVsZCBuYW1lIGFuZC9vciB2YWx1ZSIsCisJIk1lYW5pbmdsZXNzIGZpbHRlciBleHByZXNzaW9uIiwKK307CisKK3N0cnVjdCBvcHN0YWNrX29wIHsKKwlpbnQgb3A7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworfTsKKworc3RydWN0IHBvc3RmaXhfZWx0IHsKKwlpbnQgb3A7CisJY2hhciAqb3BlcmFuZDsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7Cit9OworCitzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlIHsKKwlzdHJ1Y3QgZmlsdGVyX29wICpvcHM7CisJc3RydWN0IGxpc3RfaGVhZCBvcHN0YWNrOworCXN0cnVjdCBsaXN0X2hlYWQgcG9zdGZpeDsKKwlpbnQgbGFzdGVycjsKKwlpbnQgbGFzdGVycl9wb3M7CisKKwlzdHJ1Y3QgeworCQljaGFyICpzdHJpbmc7CisJCXVuc2lnbmVkIGludCBjbnQ7CisJCXVuc2lnbmVkIGludCB0YWlsOworCX0gaW5maXg7CisKKwlzdHJ1Y3QgeworCQljaGFyIHN0cmluZ1tNQVhfRklMVEVSX1NUUl9WQUxdOworCQlpbnQgcG9zOworCQl1bnNpZ25lZCBpbnQgdGFpbDsKKwl9IG9wZXJhbmQ7Cit9OworCitERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHM2NCk7CitERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHU2NCk7CitERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHMzMik7CitERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHUzMik7CitERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHMxNik7CitERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHUxNik7CitERUZJTkVfQ09NUEFSSVNPTl9QUkVEKHM4KTsKK0RFRklORV9DT01QQVJJU09OX1BSRUQodTgpOworCitERUZJTkVfRVFVQUxJVFlfUFJFRCg2NCk7CitERUZJTkVfRVFVQUxJVFlfUFJFRCgzMik7CitERUZJTkVfRVFVQUxJVFlfUFJFRCgxNik7CitERUZJTkVfRVFVQUxJVFlfUFJFRCg4KTsKKworc3RhdGljIGludCBmaWx0ZXJfcHJlZF9hbmQoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkIF9fYXR0cmlidXRlKCh1bnVzZWQpKSwKKwkJCSAgIHZvaWQgKmV2ZW50IF9fYXR0cmlidXRlKCh1bnVzZWQpKSwKKwkJCSAgIGludCB2YWwxLCBpbnQgdmFsMikKK3sKKwlyZXR1cm4gdmFsMSAmJiB2YWwyOwogfQogCi1zdGF0aWMgaW50IGZpbHRlcl9wcmVkXzMyKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQpCitzdGF0aWMgaW50IGZpbHRlcl9wcmVkX29yKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCBfX2F0dHJpYnV0ZSgodW51c2VkKSksCisJCQkgIHZvaWQgKmV2ZW50IF9fYXR0cmlidXRlKCh1bnVzZWQpKSwKKwkJCSAgaW50IHZhbDEsIGludCB2YWwyKQogewotCXUzMiAqYWRkciA9ICh1MzIgKikoZXZlbnQgKyBwcmVkLT5vZmZzZXQpOwotCXUzMiB2YWwgPSAodTMyKXByZWQtPnZhbDsKLQlpbnQgbWF0Y2g7Ci0KLQltYXRjaCA9ICh2YWwgPT0gKmFkZHIpIF4gcHJlZC0+bm90OwotCi0JcmV0dXJuIG1hdGNoOworCXJldHVybiB2YWwxIHx8IHZhbDI7CiB9CiAKLXN0YXRpYyBpbnQgZmlsdGVyX3ByZWRfMTYoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLCB2b2lkICpldmVudCkKLXsKLQl1MTYgKmFkZHIgPSAodTE2ICopKGV2ZW50ICsgcHJlZC0+b2Zmc2V0KTsKLQl1MTYgdmFsID0gKHUxNilwcmVkLT52YWw7Ci0JaW50IG1hdGNoOwotCi0JbWF0Y2ggPSAodmFsID09ICphZGRyKSBeIHByZWQtPm5vdDsKLQotCXJldHVybiBtYXRjaDsKLX0KLQotc3RhdGljIGludCBmaWx0ZXJfcHJlZF84KHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQpCi17Ci0JdTggKmFkZHIgPSAodTggKikoZXZlbnQgKyBwcmVkLT5vZmZzZXQpOwotCXU4IHZhbCA9ICh1OClwcmVkLT52YWw7Ci0JaW50IG1hdGNoOwotCi0JbWF0Y2ggPSAodmFsID09ICphZGRyKSBeIHByZWQtPm5vdDsKLQotCXJldHVybiBtYXRjaDsKLX0KLQotc3RhdGljIGludCBmaWx0ZXJfcHJlZF9zdHJpbmcoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLCB2b2lkICpldmVudCkKKy8qIEZpbHRlciBwcmVkaWNhdGUgZm9yIGZpeGVkIHNpemVkIGFycmF5cyBvZiBjaGFyYWN0ZXJzICovCitzdGF0aWMgaW50IGZpbHRlcl9wcmVkX3N0cmluZyhzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQsIHZvaWQgKmV2ZW50LAorCQkJICAgICAgaW50IHZhbDEsIGludCB2YWwyKQogewogCWNoYXIgKmFkZHIgPSAoY2hhciAqKShldmVudCArIHByZWQtPm9mZnNldCk7CiAJaW50IGNtcCwgbWF0Y2g7CkBAIC04Miw1OSArMTY1LDE1NCBAQAogCXJldHVybiBtYXRjaDsKIH0KIAorLyoKKyAqIEZpbHRlciBwcmVkaWNhdGUgZm9yIGR5bmFtaWMgc2l6ZWQgYXJyYXlzIG9mIGNoYXJhY3RlcnMuCisgKiBUaGVzZSBhcmUgaW1wbGVtZW50ZWQgdGhyb3VnaCBhIGxpc3Qgb2Ygc3RyaW5ncyBhdCB0aGUgZW5kCisgKiBvZiB0aGUgZW50cnkuCisgKiBBbHNvIGVhY2ggb2YgdGhlc2Ugc3RyaW5ncyBoYXZlIGEgZmllbGQgaW4gdGhlIGVudHJ5IHdoaWNoCisgKiBjb250YWlucyBpdHMgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgZW50cnkuCisgKiBXZSBoYXZlIHRoZW4gZmlyc3QgdG8gZ2V0IHRoaXMgZmllbGQsIGRlcmVmZXJlbmNlIGl0CisgKiBhbmQgYWRkIGl0IHRvIHRoZSBhZGRyZXNzIG9mIHRoZSBlbnRyeSwgYW5kIGF0IGxhc3Qgd2UgaGF2ZQorICogdGhlIGFkZHJlc3Mgb2YgdGhlIHN0cmluZy4KKyAqLworc3RhdGljIGludCBmaWx0ZXJfcHJlZF9zdHJsb2Moc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLCB2b2lkICpldmVudCwKKwkJCSAgICAgIGludCB2YWwxLCBpbnQgdmFsMikKK3sKKwlpbnQgc3RyX2xvYyA9ICooaW50ICopKGV2ZW50ICsgcHJlZC0+b2Zmc2V0KTsKKwljaGFyICphZGRyID0gKGNoYXIgKikoZXZlbnQgKyBzdHJfbG9jKTsKKwlpbnQgY21wLCBtYXRjaDsKKworCWNtcCA9IHN0cm5jbXAoYWRkciwgcHJlZC0+c3RyX3ZhbCwgcHJlZC0+c3RyX2xlbik7CisKKwltYXRjaCA9ICghY21wKSBeIHByZWQtPm5vdDsKKworCXJldHVybiBtYXRjaDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfcHJlZF9ub25lKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCwgdm9pZCAqZXZlbnQsCisJCQkgICAgaW50IHZhbDEsIGludCB2YWwyKQoreworCXJldHVybiAwOworfQorCiAvKiByZXR1cm4gMSBpZiBldmVudCBtYXRjaGVzLCAwIG90aGVyd2lzZSAoZGlzY2FyZCkgKi8KIGludCBmaWx0ZXJfbWF0Y2hfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCB2b2lkICpyZWMpCiB7Ci0JaW50IGksIG1hdGNoZWQsIGFuZF9mYWlsZWQgPSAwOwotCXN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZDsKLQotCWZvciAoaSA9IDA7IGkgPCBNQVhfRklMVEVSX1BSRUQ7IGkrKykgewotCQlpZiAoY2FsbC0+cHJlZHNbaV0pIHsKLQkJCXByZWQgPSBjYWxsLT5wcmVkc1tpXTsKLQkJCWlmIChhbmRfZmFpbGVkICYmICFwcmVkLT5vcikKLQkJCQljb250aW51ZTsKLQkJCW1hdGNoZWQgPSBwcmVkLT5mbihwcmVkLCByZWMpOwotCQkJaWYgKCFtYXRjaGVkICYmICFwcmVkLT5vcikgewotCQkJCWFuZF9mYWlsZWQgPSAxOwotCQkJCWNvbnRpbnVlOwotCQkJfSBlbHNlIGlmIChtYXRjaGVkICYmIHByZWQtPm9yKQotCQkJCXJldHVybiAxOwotCQl9IGVsc2UKLQkJCWJyZWFrOwotCX0KLQotCWlmIChhbmRfZmFpbGVkKQotCQlyZXR1cm4gMDsKLQotCXJldHVybiAxOwotfQotCi12b2lkIGZpbHRlcl9wcmludF9wcmVkcyhzdHJ1Y3QgZmlsdGVyX3ByZWQgKipwcmVkcywgc3RydWN0IHRyYWNlX3NlcSAqcykKLXsKLQljaGFyICpmaWVsZF9uYW1lOworCXN0cnVjdCBldmVudF9maWx0ZXIgKmZpbHRlciA9IGNhbGwtPmZpbHRlcjsKKwlpbnQgbWF0Y2gsIHRvcCA9IDAsIHZhbDEgPSAwLCB2YWwyID0gMDsKKwlpbnQgc3RhY2tbTUFYX0ZJTFRFUl9QUkVEXTsKIAlzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQ7CiAJaW50IGk7CiAKLQlpZiAoIXByZWRzKSB7Ci0JCXRyYWNlX3NlcV9wcmludGYocywgIm5vbmVcbiIpOwotCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bl9wcmVkczsgaSsrKSB7CisJCXByZWQgPSBmaWx0ZXItPnByZWRzW2ldOworCQlpZiAoIXByZWQtPnBvcF9uKSB7CisJCQltYXRjaCA9IHByZWQtPmZuKHByZWQsIHJlYywgdmFsMSwgdmFsMik7CisJCQlzdGFja1t0b3ArK10gPSBtYXRjaDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChwcmVkLT5wb3BfbiA+IHRvcCkgeworCQkJV0FSTl9PTl9PTkNFKDEpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJdmFsMSA9IHN0YWNrWy0tdG9wXTsKKwkJdmFsMiA9IHN0YWNrWy0tdG9wXTsKKwkJbWF0Y2ggPSBwcmVkLT5mbihwcmVkLCByZWMsIHZhbDEsIHZhbDIpOworCQlzdGFja1t0b3ArK10gPSBtYXRjaDsKIAl9CiAKLQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJTFRFUl9QUkVEOyBpKyspIHsKLQkJaWYgKHByZWRzW2ldKSB7Ci0JCQlwcmVkID0gcHJlZHNbaV07Ci0JCQlmaWVsZF9uYW1lID0gcHJlZC0+ZmllbGRfbmFtZTsKLQkJCWlmIChpKQotCQkJCXRyYWNlX3NlcV9wcmludGYocywgcHJlZC0+b3IgPyAifHwgIiA6ICImJiAiKTsKLQkJCXRyYWNlX3NlcV9wcmludGYocywgIiVzICIsIGZpZWxkX25hbWUpOwotCQkJdHJhY2Vfc2VxX3ByaW50ZihzLCBwcmVkLT5ub3QgPyAiIT0gIiA6ICI9PSAiKTsKLQkJCWlmIChwcmVkLT5zdHJfdmFsKQotCQkJCXRyYWNlX3NlcV9wcmludGYocywgIiVzXG4iLCBwcmVkLT5zdHJfdmFsKTsKLQkJCWVsc2UKLQkJCQl0cmFjZV9zZXFfcHJpbnRmKHMsICIlbGx1XG4iLCBwcmVkLT52YWwpOwotCQl9IGVsc2UKLQkJCWJyZWFrOwotCX0KKwlyZXR1cm4gc3RhY2tbLS10b3BdOworfQorRVhQT1JUX1NZTUJPTF9HUEwoZmlsdGVyX21hdGNoX3ByZWRzKTsKKworc3RhdGljIHZvaWQgcGFyc2VfZXJyb3Ioc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMsIGludCBlcnIsIGludCBwb3MpCit7CisJcHMtPmxhc3RlcnIgPSBlcnI7CisJcHMtPmxhc3RlcnJfcG9zID0gcG9zOworfQorCitzdGF0aWMgdm9pZCByZW1vdmVfZmlsdGVyX3N0cmluZyhzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIpCit7CisJa2ZyZWUoZmlsdGVyLT5maWx0ZXJfc3RyaW5nKTsKKwlmaWx0ZXItPmZpbHRlcl9zdHJpbmcgPSBOVUxMOworfQorCitzdGF0aWMgaW50IHJlcGxhY2VfZmlsdGVyX3N0cmluZyhzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIsCisJCQkJIGNoYXIgKmZpbHRlcl9zdHJpbmcpCit7CisJa2ZyZWUoZmlsdGVyLT5maWx0ZXJfc3RyaW5nKTsKKwlmaWx0ZXItPmZpbHRlcl9zdHJpbmcgPSBrc3RyZHVwKGZpbHRlcl9zdHJpbmcsIEdGUF9LRVJORUwpOworCWlmICghZmlsdGVyLT5maWx0ZXJfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFwcGVuZF9maWx0ZXJfc3RyaW5nKHN0cnVjdCBldmVudF9maWx0ZXIgKmZpbHRlciwKKwkJCQljaGFyICpzdHJpbmcpCit7CisJaW50IG5ld2xlbjsKKwljaGFyICpuZXdfZmlsdGVyX3N0cmluZzsKKworCUJVR19PTighZmlsdGVyLT5maWx0ZXJfc3RyaW5nKTsKKwluZXdsZW4gPSBzdHJsZW4oZmlsdGVyLT5maWx0ZXJfc3RyaW5nKSArIHN0cmxlbihzdHJpbmcpICsgMTsKKwluZXdfZmlsdGVyX3N0cmluZyA9IGttYWxsb2MobmV3bGVuLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW5ld19maWx0ZXJfc3RyaW5nKQorCQlyZXR1cm4gLUVOT01FTTsKKworCXN0cmNweShuZXdfZmlsdGVyX3N0cmluZywgZmlsdGVyLT5maWx0ZXJfc3RyaW5nKTsKKwlzdHJjYXQobmV3X2ZpbHRlcl9zdHJpbmcsIHN0cmluZyk7CisJa2ZyZWUoZmlsdGVyLT5maWx0ZXJfc3RyaW5nKTsKKwlmaWx0ZXItPmZpbHRlcl9zdHJpbmcgPSBuZXdfZmlsdGVyX3N0cmluZzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfZmlsdGVyX2VycihzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywKKwkJCSAgICAgIHN0cnVjdCBldmVudF9maWx0ZXIgKmZpbHRlcikKK3sKKwlpbnQgcG9zID0gcHMtPmxhc3RlcnJfcG9zOworCWNoYXIgKmJ1ZiwgKnBidWY7CisKKwlidWYgPSAoY2hhciAqKV9fZ2V0X2ZyZWVfcGFnZShHRlBfVEVNUE9SQVJZKTsKKwlpZiAoIWJ1ZikKKwkJcmV0dXJuOworCisJYXBwZW5kX2ZpbHRlcl9zdHJpbmcoZmlsdGVyLCAiXG4iKTsKKwltZW1zZXQoYnVmLCAnICcsIFBBR0VfU0laRSk7CisJaWYgKHBvcyA+IFBBR0VfU0laRSAtIDEyOCkKKwkJcG9zID0gMDsKKwlidWZbcG9zXSA9ICdeJzsKKwlwYnVmID0gJmJ1Zltwb3NdICsgMTsKKworCXNwcmludGYocGJ1ZiwgIlxucGFyc2VfZXJyb3I6ICVzXG4iLCBlcnJfdGV4dFtwcy0+bGFzdGVycl0pOworCWFwcGVuZF9maWx0ZXJfc3RyaW5nKGZpbHRlciwgYnVmKTsKKwlmcmVlX3BhZ2UoKHVuc2lnbmVkIGxvbmcpIGJ1Zik7Cit9CisKK3ZvaWQgcHJpbnRfZXZlbnRfZmlsdGVyKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgc3RydWN0IHRyYWNlX3NlcSAqcykKK3sKKwlzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIgPSBjYWxsLT5maWx0ZXI7CisKKwltdXRleF9sb2NrKCZmaWx0ZXJfbXV0ZXgpOworCWlmIChmaWx0ZXItPmZpbHRlcl9zdHJpbmcpCisJCXRyYWNlX3NlcV9wcmludGYocywgIiVzXG4iLCBmaWx0ZXItPmZpbHRlcl9zdHJpbmcpOworCWVsc2UKKwkJdHJhY2Vfc2VxX3ByaW50ZihzLCAibm9uZVxuIik7CisJbXV0ZXhfdW5sb2NrKCZmaWx0ZXJfbXV0ZXgpOworfQorCit2b2lkIHByaW50X3N1YnN5c3RlbV9ldmVudF9maWx0ZXIoc3RydWN0IGV2ZW50X3N1YnN5c3RlbSAqc3lzdGVtLAorCQkJCSAgc3RydWN0IHRyYWNlX3NlcSAqcykKK3sKKwlzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIgPSBzeXN0ZW0tPmZpbHRlcjsKKworCW11dGV4X2xvY2soJmZpbHRlcl9tdXRleCk7CisJaWYgKGZpbHRlci0+ZmlsdGVyX3N0cmluZykKKwkJdHJhY2Vfc2VxX3ByaW50ZihzLCAiJXNcbiIsIGZpbHRlci0+ZmlsdGVyX3N0cmluZyk7CisJZWxzZQorCQl0cmFjZV9zZXFfcHJpbnRmKHMsICJub25lXG4iKTsKKwltdXRleF91bmxvY2soJmZpbHRlcl9tdXRleCk7CiB9CiAKIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2ZpZWxkICoKQEAgLTE1MCwyODQgKzMyOCw4MjggQEAKIAlyZXR1cm4gTlVMTDsKIH0KIAotdm9pZCBmaWx0ZXJfZnJlZV9wcmVkKHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCkKK3N0YXRpYyB2b2lkIGZpbHRlcl9mcmVlX3ByZWQoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKQogewogCWlmICghcHJlZCkKIAkJcmV0dXJuOwogCiAJa2ZyZWUocHJlZC0+ZmllbGRfbmFtZSk7Ci0Ja2ZyZWUocHJlZC0+c3RyX3ZhbCk7CiAJa2ZyZWUocHJlZCk7CiB9CiAKLXZvaWQgZmlsdGVyX2ZyZWVfcHJlZHMoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsKQorc3RhdGljIHZvaWQgZmlsdGVyX2NsZWFyX3ByZWQoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKQogewotCWludCBpOwotCi0JaWYgKGNhbGwtPnByZWRzKSB7Ci0JCWZvciAoaSA9IDA7IGkgPCBNQVhfRklMVEVSX1BSRUQ7IGkrKykKLQkJCWZpbHRlcl9mcmVlX3ByZWQoY2FsbC0+cHJlZHNbaV0pOwotCQlrZnJlZShjYWxsLT5wcmVkcyk7Ci0JCWNhbGwtPnByZWRzID0gTlVMTDsKLQl9CisJa2ZyZWUocHJlZC0+ZmllbGRfbmFtZSk7CisJcHJlZC0+ZmllbGRfbmFtZSA9IE5VTEw7CisJcHJlZC0+c3RyX2xlbiA9IDA7CiB9CiAKLXZvaWQgZmlsdGVyX2ZyZWVfc3Vic3lzdGVtX3ByZWRzKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSkKK3N0YXRpYyBpbnQgZmlsdGVyX3NldF9wcmVkKHN0cnVjdCBmaWx0ZXJfcHJlZCAqZGVzdCwKKwkJCSAgIHN0cnVjdCBmaWx0ZXJfcHJlZCAqc3JjLAorCQkJICAgZmlsdGVyX3ByZWRfZm5fdCBmbikKIHsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSBfX3N0YXJ0X2Z0cmFjZV9ldmVudHM7Ci0JaW50IGk7Ci0KLQlpZiAoc3lzdGVtLT5wcmVkcykgewotCQlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJTFRFUl9QUkVEOyBpKyspCi0JCQlmaWx0ZXJfZnJlZV9wcmVkKHN5c3RlbS0+cHJlZHNbaV0pOwotCQlrZnJlZShzeXN0ZW0tPnByZWRzKTsKLQkJc3lzdGVtLT5wcmVkcyA9IE5VTEw7Ci0JfQotCi0JZXZlbnRzX2Zvcl9lYWNoKGNhbGwpIHsKLQkJaWYgKCFjYWxsLT5uYW1lIHx8ICFjYWxsLT5yZWdmdW5jKQotCQkJY29udGludWU7Ci0KLQkJaWYgKCFzdHJjbXAoY2FsbC0+c3lzdGVtLCBzeXN0ZW0tPm5hbWUpKQotCQkJZmlsdGVyX2ZyZWVfcHJlZHMoY2FsbCk7Ci0JfQotfQotCi1zdGF0aWMgaW50IF9fZmlsdGVyX2FkZF9wcmVkKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwKLQkJCSAgICAgc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKQotewotCWludCBpOwotCi0JaWYgKGNhbGwtPnByZWRzICYmICFwcmVkLT5jb21wb3VuZCkKLQkJZmlsdGVyX2ZyZWVfcHJlZHMoY2FsbCk7Ci0KLQlpZiAoIWNhbGwtPnByZWRzKSB7Ci0JCWNhbGwtPnByZWRzID0ga3phbGxvYyhNQVhfRklMVEVSX1BSRUQgKiBzaXplb2YocHJlZCksCi0JCQkJICAgICAgR0ZQX0tFUk5FTCk7Ci0JCWlmICghY2FsbC0+cHJlZHMpCisJKmRlc3QgPSAqc3JjOworCWlmIChzcmMtPmZpZWxkX25hbWUpIHsKKwkJZGVzdC0+ZmllbGRfbmFtZSA9IGtzdHJkdXAoc3JjLT5maWVsZF9uYW1lLCBHRlBfS0VSTkVMKTsKKwkJaWYgKCFkZXN0LT5maWVsZF9uYW1lKQogCQkJcmV0dXJuIC1FTk9NRU07CiAJfQotCi0JZm9yIChpID0gMDsgaSA8IE1BWF9GSUxURVJfUFJFRDsgaSsrKSB7Ci0JCWlmICghY2FsbC0+cHJlZHNbaV0pIHsKLQkJCWNhbGwtPnByZWRzW2ldID0gcHJlZDsKLQkJCXJldHVybiAwOwotCQl9Ci0JfQotCi0JcmV0dXJuIC1FTk9TUEM7Ci19Ci0KLXN0YXRpYyBpbnQgaXNfc3RyaW5nX2ZpZWxkKGNvbnN0IGNoYXIgKnR5cGUpCi17Ci0JaWYgKHN0cmNocih0eXBlLCAnWycpICYmIHN0cnN0cih0eXBlLCAiY2hhciIpKQotCQlyZXR1cm4gMTsKKwlkZXN0LT5mbiA9IGZuOwogCiAJcmV0dXJuIDA7CiB9CiAKLWludCBmaWx0ZXJfYWRkX3ByZWQoc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLCBzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQpCitzdGF0aWMgdm9pZCBmaWx0ZXJfZGlzYWJsZV9wcmVkcyhzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpCiB7Ci0Jc3RydWN0IGZ0cmFjZV9ldmVudF9maWVsZCAqZmllbGQ7Ci0KLQlmaWVsZCA9IGZpbmRfZXZlbnRfZmllbGQoY2FsbCwgcHJlZC0+ZmllbGRfbmFtZSk7Ci0JaWYgKCFmaWVsZCkKLQkJcmV0dXJuIC1FSU5WQUw7Ci0KLQlwcmVkLT5vZmZzZXQgPSBmaWVsZC0+b2Zmc2V0OwotCi0JaWYgKGlzX3N0cmluZ19maWVsZChmaWVsZC0+dHlwZSkpIHsKLQkJaWYgKCFwcmVkLT5zdHJfdmFsKQotCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCXByZWQtPmZuID0gZmlsdGVyX3ByZWRfc3RyaW5nOwotCQlwcmVkLT5zdHJfbGVuID0gZmllbGQtPnNpemU7Ci0JCXJldHVybiBfX2ZpbHRlcl9hZGRfcHJlZChjYWxsLCBwcmVkKTsKLQl9IGVsc2UgewotCQlpZiAocHJlZC0+c3RyX3ZhbCkKLQkJCXJldHVybiAtRUlOVkFMOwotCX0KLQotCXN3aXRjaCAoZmllbGQtPnNpemUpIHsKLQljYXNlIDg6Ci0JCXByZWQtPmZuID0gZmlsdGVyX3ByZWRfNjQ7Ci0JCWJyZWFrOwotCWNhc2UgNDoKLQkJcHJlZC0+Zm4gPSBmaWx0ZXJfcHJlZF8zMjsKLQkJYnJlYWs7Ci0JY2FzZSAyOgotCQlwcmVkLT5mbiA9IGZpbHRlcl9wcmVkXzE2OwotCQlicmVhazsKLQljYXNlIDE6Ci0JCXByZWQtPmZuID0gZmlsdGVyX3ByZWRfODsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJcmV0dXJuIC1FSU5WQUw7Ci0JfQotCi0JcmV0dXJuIF9fZmlsdGVyX2FkZF9wcmVkKGNhbGwsIHByZWQpOwotfQotCi1zdGF0aWMgc3RydWN0IGZpbHRlcl9wcmVkICpjb3B5X3ByZWQoc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkKQotewotCXN0cnVjdCBmaWx0ZXJfcHJlZCAqbmV3X3ByZWQgPSBrbWFsbG9jKHNpemVvZigqcHJlZCksIEdGUF9LRVJORUwpOwotCWlmICghbmV3X3ByZWQpCi0JCXJldHVybiBOVUxMOwotCi0JbWVtY3B5KG5ld19wcmVkLCBwcmVkLCBzaXplb2YoKnByZWQpKTsKLQotCWlmIChwcmVkLT5maWVsZF9uYW1lKSB7Ci0JCW5ld19wcmVkLT5maWVsZF9uYW1lID0ga3N0cmR1cChwcmVkLT5maWVsZF9uYW1lLCBHRlBfS0VSTkVMKTsKLQkJaWYgKCFuZXdfcHJlZC0+ZmllbGRfbmFtZSkgewotCQkJa2ZyZWUobmV3X3ByZWQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlpZiAocHJlZC0+c3RyX3ZhbCkgewotCQluZXdfcHJlZC0+c3RyX3ZhbCA9IGtzdHJkdXAocHJlZC0+c3RyX3ZhbCwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghbmV3X3ByZWQtPnN0cl92YWwpIHsKLQkJCWZpbHRlcl9mcmVlX3ByZWQobmV3X3ByZWQpOwotCQkJcmV0dXJuIE5VTEw7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4gbmV3X3ByZWQ7Ci19Ci0KLWludCBmaWx0ZXJfYWRkX3N1YnN5c3RlbV9wcmVkKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSwKLQkJCSAgICAgIHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCkKLXsKLQlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSBfX3N0YXJ0X2Z0cmFjZV9ldmVudHM7Ci0Jc3RydWN0IGZpbHRlcl9wcmVkICpldmVudF9wcmVkOworCXN0cnVjdCBldmVudF9maWx0ZXIgKmZpbHRlciA9IGNhbGwtPmZpbHRlcjsKIAlpbnQgaTsKIAotCWlmIChzeXN0ZW0tPnByZWRzICYmICFwcmVkLT5jb21wb3VuZCkKLQkJZmlsdGVyX2ZyZWVfc3Vic3lzdGVtX3ByZWRzKHN5c3RlbSk7CisJY2FsbC0+ZmlsdGVyX2FjdGl2ZSA9IDA7CisJZmlsdGVyLT5uX3ByZWRzID0gMDsKIAotCWlmICghc3lzdGVtLT5wcmVkcykgewotCQlzeXN0ZW0tPnByZWRzID0ga3phbGxvYyhNQVhfRklMVEVSX1BSRUQgKiBzaXplb2YocHJlZCksCi0JCQkJCUdGUF9LRVJORUwpOwotCQlpZiAoIXN5c3RlbS0+cHJlZHMpCi0JCQlyZXR1cm4gLUVOT01FTTsKLQl9CisJZm9yIChpID0gMDsgaSA8IE1BWF9GSUxURVJfUFJFRDsgaSsrKQorCQlmaWx0ZXItPnByZWRzW2ldLT5mbiA9IGZpbHRlcl9wcmVkX25vbmU7Cit9CisKK3ZvaWQgZGVzdHJveV9wcmVkcyhzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpCit7CisJc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyID0gY2FsbC0+ZmlsdGVyOworCWludCBpOwogCiAJZm9yIChpID0gMDsgaSA8IE1BWF9GSUxURVJfUFJFRDsgaSsrKSB7Ci0JCWlmICghc3lzdGVtLT5wcmVkc1tpXSkgewotCQkJc3lzdGVtLT5wcmVkc1tpXSA9IHByZWQ7Ci0JCQlicmVhazsKLQkJfQorCQlpZiAoZmlsdGVyLT5wcmVkc1tpXSkKKwkJCWZpbHRlcl9mcmVlX3ByZWQoZmlsdGVyLT5wcmVkc1tpXSk7CiAJfQorCWtmcmVlKGZpbHRlci0+cHJlZHMpOworCWtmcmVlKGZpbHRlcik7CisJY2FsbC0+ZmlsdGVyID0gTlVMTDsKK30KIAotCWlmIChpID09IE1BWF9GSUxURVJfUFJFRCkKLQkJcmV0dXJuIC1FTk9TUEM7CitpbnQgaW5pdF9wcmVkcyhzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpCit7CisJc3RydWN0IGV2ZW50X2ZpbHRlciAqZmlsdGVyOworCXN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZDsKKwlpbnQgaTsKIAotCWV2ZW50c19mb3JfZWFjaChjYWxsKSB7Ci0JCWludCBlcnI7CisJZmlsdGVyID0gY2FsbC0+ZmlsdGVyID0ga3phbGxvYyhzaXplb2YoKmZpbHRlciksIEdGUF9LRVJORUwpOworCWlmICghY2FsbC0+ZmlsdGVyKQorCQlyZXR1cm4gLUVOT01FTTsKIAotCQlpZiAoIWNhbGwtPm5hbWUgfHwgIWNhbGwtPnJlZ2Z1bmMpCi0JCQljb250aW51ZTsKKwljYWxsLT5maWx0ZXJfYWN0aXZlID0gMDsKKwlmaWx0ZXItPm5fcHJlZHMgPSAwOwogCi0JCWlmIChzdHJjbXAoY2FsbC0+c3lzdGVtLCBzeXN0ZW0tPm5hbWUpKQotCQkJY29udGludWU7CisJZmlsdGVyLT5wcmVkcyA9IGt6YWxsb2MoTUFYX0ZJTFRFUl9QUkVEICogc2l6ZW9mKHByZWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWZpbHRlci0+cHJlZHMpCisJCWdvdG8gb29tOwogCi0JCWlmICghZmluZF9ldmVudF9maWVsZChjYWxsLCBwcmVkLT5maWVsZF9uYW1lKSkKLQkJCWNvbnRpbnVlOwotCi0JCWV2ZW50X3ByZWQgPSBjb3B5X3ByZWQocHJlZCk7Ci0JCWlmICghZXZlbnRfcHJlZCkKKwlmb3IgKGkgPSAwOyBpIDwgTUFYX0ZJTFRFUl9QUkVEOyBpKyspIHsKKwkJcHJlZCA9IGt6YWxsb2Moc2l6ZW9mKCpwcmVkKSwgR0ZQX0tFUk5FTCk7CisJCWlmICghcHJlZCkKIAkJCWdvdG8gb29tOwotCi0JCWVyciA9IGZpbHRlcl9hZGRfcHJlZChjYWxsLCBldmVudF9wcmVkKTsKLQkJaWYgKGVycikKLQkJCWZpbHRlcl9mcmVlX3ByZWQoZXZlbnRfcHJlZCk7Ci0JCWlmIChlcnIgPT0gLUVOT01FTSkKLQkJCWdvdG8gb29tOworCQlwcmVkLT5mbiA9IGZpbHRlcl9wcmVkX25vbmU7CisJCWZpbHRlci0+cHJlZHNbaV0gPSBwcmVkOwogCX0KIAogCXJldHVybiAwOwogCiBvb206Ci0Jc3lzdGVtLT5wcmVkc1tpXSA9IE5VTEw7CisJZGVzdHJveV9wcmVkcyhjYWxsKTsKKwogCXJldHVybiAtRU5PTUVNOwogfQorRVhQT1JUX1NZTUJPTF9HUEwoaW5pdF9wcmVkcyk7CiAKLWludCBmaWx0ZXJfcGFyc2UoY2hhciAqKnBidWYsIHN0cnVjdCBmaWx0ZXJfcHJlZCAqcHJlZCkKK3N0YXRpYyB2b2lkIGZpbHRlcl9mcmVlX3N1YnN5c3RlbV9wcmVkcyhzdHJ1Y3QgZXZlbnRfc3Vic3lzdGVtICpzeXN0ZW0pCiB7Ci0JY2hhciAqdG1wLCAqdG9rLCAqdmFsX3N0ciA9IE5VTEw7Ci0JaW50IHRva19uID0gMDsKKwlzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIgPSBzeXN0ZW0tPmZpbHRlcjsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGw7CisJaW50IGk7CiAKLQkvKiBmaWVsZCA9PS8hPSBudW1iZXIsIG9yL2FuZCBmaWVsZCA9PS8hPSBudW1iZXIsIG51bWJlciAqLwotCXdoaWxlICgodG9rID0gc3Ryc2VwKHBidWYsICIgXG4iKSkpIHsKLQkJaWYgKHRva19uID09IDApIHsKLQkJCWlmICghc3RyY21wKHRvaywgIjAiKSkgewotCQkJCXByZWQtPmNsZWFyID0gMTsKLQkJCQlyZXR1cm4gMDsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2ssICImJiIpKSB7Ci0JCQkJcHJlZC0+b3IgPSAwOwotCQkJCXByZWQtPmNvbXBvdW5kID0gMTsKLQkJCX0gZWxzZSBpZiAoIXN0cmNtcCh0b2ssICJ8fCIpKSB7Ci0JCQkJcHJlZC0+b3IgPSAxOwotCQkJCXByZWQtPmNvbXBvdW5kID0gMTsKLQkJCX0gZWxzZQotCQkJCXByZWQtPmZpZWxkX25hbWUgPSB0b2s7Ci0JCQl0b2tfbiA9IDE7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAodG9rX24gPT0gMSkgewotCQkJaWYgKCFwcmVkLT5maWVsZF9uYW1lKQotCQkJCXByZWQtPmZpZWxkX25hbWUgPSB0b2s7Ci0JCQllbHNlIGlmICghc3RyY21wKHRvaywgIiE9IikpCi0JCQkJcHJlZC0+bm90ID0gMTsKLQkJCWVsc2UgaWYgKCFzdHJjbXAodG9rLCAiPT0iKSkKLQkJCQlwcmVkLT5ub3QgPSAwOwotCQkJZWxzZSB7Ci0JCQkJcHJlZC0+ZmllbGRfbmFtZSA9IE5VTEw7Ci0JCQkJcmV0dXJuIC1FSU5WQUw7Ci0JCQl9Ci0JCQl0b2tfbiA9IDI7Ci0JCQljb250aW51ZTsKLQkJfQotCQlpZiAodG9rX24gPT0gMikgewotCQkJaWYgKHByZWQtPmNvbXBvdW5kKSB7Ci0JCQkJaWYgKCFzdHJjbXAodG9rLCAiIT0iKSkKLQkJCQkJcHJlZC0+bm90ID0gMTsKLQkJCQllbHNlIGlmICghc3RyY21wKHRvaywgIj09IikpCi0JCQkJCXByZWQtPm5vdCA9IDA7Ci0JCQkJZWxzZSB7Ci0JCQkJCXByZWQtPmZpZWxkX25hbWUgPSBOVUxMOwotCQkJCQlyZXR1cm4gLUVJTlZBTDsKLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCXZhbF9zdHIgPSB0b2s7Ci0JCQkJYnJlYWs7IC8qIGRvbmUgKi8KLQkJCX0KLQkJCXRva19uID0gMzsKLQkJCWNvbnRpbnVlOwotCQl9Ci0JCWlmICh0b2tfbiA9PSAzKSB7Ci0JCQl2YWxfc3RyID0gdG9rOwotCQkJYnJlYWs7IC8qIGRvbmUgKi8KLQkJfQorCWlmIChmaWx0ZXItPm5fcHJlZHMpIHsKKwkJZm9yIChpID0gMDsgaSA8IGZpbHRlci0+bl9wcmVkczsgaSsrKQorCQkJZmlsdGVyX2ZyZWVfcHJlZChmaWx0ZXItPnByZWRzW2ldKTsKKwkJa2ZyZWUoZmlsdGVyLT5wcmVkcyk7CisJCWZpbHRlci0+cHJlZHMgPSBOVUxMOworCQlmaWx0ZXItPm5fcHJlZHMgPSAwOwogCX0KIAotCWlmICghdmFsX3N0cikgewotCQlwcmVkLT5maWVsZF9uYW1lID0gTlVMTDsKLQkJcmV0dXJuIC1FSU5WQUw7CisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKwkJaWYgKCFjYWxsLT5kZWZpbmVfZmllbGRzKQorCQkJY29udGludWU7CisKKwkJaWYgKCFzdHJjbXAoY2FsbC0+c3lzdGVtLCBzeXN0ZW0tPm5hbWUpKSB7CisJCQlmaWx0ZXJfZGlzYWJsZV9wcmVkcyhjYWxsKTsKKwkJCXJlbW92ZV9maWx0ZXJfc3RyaW5nKGNhbGwtPmZpbHRlcik7CisJCX0KKwl9CisJbXV0ZXhfdW5sb2NrKCZldmVudF9tdXRleCk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX2FkZF9wcmVkX2ZuKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLAorCQkJICAgICAgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsLAorCQkJICAgICAgc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLAorCQkJICAgICAgZmlsdGVyX3ByZWRfZm5fdCBmbikKK3sKKwlzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIgPSBjYWxsLT5maWx0ZXI7CisJaW50IGlkeCwgZXJyOworCisJaWYgKGZpbHRlci0+bl9wcmVkcyA9PSBNQVhfRklMVEVSX1BSRUQpIHsKKwkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX1RPT19NQU5ZX1BSRURTLCAwKTsKKwkJcmV0dXJuIC1FTk9TUEM7CiAJfQogCi0JcHJlZC0+ZmllbGRfbmFtZSA9IGtzdHJkdXAocHJlZC0+ZmllbGRfbmFtZSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwcmVkLT5maWVsZF9uYW1lKQotCQlyZXR1cm4gLUVOT01FTTsKKwlpZHggPSBmaWx0ZXItPm5fcHJlZHM7CisJZmlsdGVyX2NsZWFyX3ByZWQoZmlsdGVyLT5wcmVkc1tpZHhdKTsKKwllcnIgPSBmaWx0ZXJfc2V0X3ByZWQoZmlsdGVyLT5wcmVkc1tpZHhdLCBwcmVkLCBmbik7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKIAotCXByZWQtPnZhbCA9IHNpbXBsZV9zdHJ0b3VsbCh2YWxfc3RyLCAmdG1wLCAwKTsKLQlpZiAodG1wID09IHZhbF9zdHIpIHsKLQkJcHJlZC0+c3RyX3ZhbCA9IGtzdHJkdXAodmFsX3N0ciwgR0ZQX0tFUk5FTCk7Ci0JCWlmICghcHJlZC0+c3RyX3ZhbCkKLQkJCXJldHVybiAtRU5PTUVNOwotCX0gZWxzZSBpZiAoKnRtcCAhPSAnXDAnKQotCQlyZXR1cm4gLUVJTlZBTDsKKwlmaWx0ZXItPm5fcHJlZHMrKzsKKwljYWxsLT5maWx0ZXJfYWN0aXZlID0gMTsKIAogCXJldHVybiAwOwogfQogCitlbnVtIHsKKwlGSUxURVJfU1RBVElDX1NUUklORyA9IDEsCisJRklMVEVSX0RZTl9TVFJJTkcKK307CisKK3N0YXRpYyBpbnQgaXNfc3RyaW5nX2ZpZWxkKGNvbnN0IGNoYXIgKnR5cGUpCit7CisJaWYgKHN0cnN0cih0eXBlLCAiX19kYXRhX2xvYyIpICYmIHN0cnN0cih0eXBlLCAiY2hhciIpKQorCQlyZXR1cm4gRklMVEVSX0RZTl9TVFJJTkc7CisKKwlpZiAoc3RyY2hyKHR5cGUsICdbJykgJiYgc3Ryc3RyKHR5cGUsICJjaGFyIikpCisJCXJldHVybiBGSUxURVJfU1RBVElDX1NUUklORzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlzX2xlZ2FsX29wKHN0cnVjdCBmdHJhY2VfZXZlbnRfZmllbGQgKmZpZWxkLCBpbnQgb3ApCit7CisJaWYgKGlzX3N0cmluZ19maWVsZChmaWVsZC0+dHlwZSkgJiYgKG9wICE9IE9QX0VRICYmIG9wICE9IE9QX05FKSkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGZpbHRlcl9wcmVkX2ZuX3Qgc2VsZWN0X2NvbXBhcmlzb25fZm4oaW50IG9wLCBpbnQgZmllbGRfc2l6ZSwKKwkJCQkJICAgICBpbnQgZmllbGRfaXNfc2lnbmVkKQoreworCWZpbHRlcl9wcmVkX2ZuX3QgZm4gPSBOVUxMOworCisJc3dpdGNoIChmaWVsZF9zaXplKSB7CisJY2FzZSA4OgorCQlpZiAob3AgPT0gT1BfRVEgfHwgb3AgPT0gT1BfTkUpCisJCQlmbiA9IGZpbHRlcl9wcmVkXzY0OworCQllbHNlIGlmIChmaWVsZF9pc19zaWduZWQpCisJCQlmbiA9IGZpbHRlcl9wcmVkX3M2NDsKKwkJZWxzZQorCQkJZm4gPSBmaWx0ZXJfcHJlZF91NjQ7CisJCWJyZWFrOworCWNhc2UgNDoKKwkJaWYgKG9wID09IE9QX0VRIHx8IG9wID09IE9QX05FKQorCQkJZm4gPSBmaWx0ZXJfcHJlZF8zMjsKKwkJZWxzZSBpZiAoZmllbGRfaXNfc2lnbmVkKQorCQkJZm4gPSBmaWx0ZXJfcHJlZF9zMzI7CisJCWVsc2UKKwkJCWZuID0gZmlsdGVyX3ByZWRfdTMyOworCQlicmVhazsKKwljYXNlIDI6CisJCWlmIChvcCA9PSBPUF9FUSB8fCBvcCA9PSBPUF9ORSkKKwkJCWZuID0gZmlsdGVyX3ByZWRfMTY7CisJCWVsc2UgaWYgKGZpZWxkX2lzX3NpZ25lZCkKKwkJCWZuID0gZmlsdGVyX3ByZWRfczE2OworCQllbHNlCisJCQlmbiA9IGZpbHRlcl9wcmVkX3UxNjsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQlpZiAob3AgPT0gT1BfRVEgfHwgb3AgPT0gT1BfTkUpCisJCQlmbiA9IGZpbHRlcl9wcmVkXzg7CisJCWVsc2UgaWYgKGZpZWxkX2lzX3NpZ25lZCkKKwkJCWZuID0gZmlsdGVyX3ByZWRfczg7CisJCWVsc2UKKwkJCWZuID0gZmlsdGVyX3ByZWRfdTg7CisJCWJyZWFrOworCX0KKworCXJldHVybiBmbjsKK30KKworc3RhdGljIGludCBmaWx0ZXJfYWRkX3ByZWQoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMsCisJCQkgICBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCisJCQkgICBzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQpCit7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9maWVsZCAqZmllbGQ7CisJZmlsdGVyX3ByZWRfZm5fdCBmbjsKKwl1bnNpZ25lZCBsb25nIGxvbmcgdmFsOworCWludCBzdHJpbmdfdHlwZTsKKworCXByZWQtPmZuID0gZmlsdGVyX3ByZWRfbm9uZTsKKworCWlmIChwcmVkLT5vcCA9PSBPUF9BTkQpIHsKKwkJcHJlZC0+cG9wX24gPSAyOworCQlyZXR1cm4gZmlsdGVyX2FkZF9wcmVkX2ZuKHBzLCBjYWxsLCBwcmVkLCBmaWx0ZXJfcHJlZF9hbmQpOworCX0gZWxzZSBpZiAocHJlZC0+b3AgPT0gT1BfT1IpIHsKKwkJcHJlZC0+cG9wX24gPSAyOworCQlyZXR1cm4gZmlsdGVyX2FkZF9wcmVkX2ZuKHBzLCBjYWxsLCBwcmVkLCBmaWx0ZXJfcHJlZF9vcik7CisJfQorCisJZmllbGQgPSBmaW5kX2V2ZW50X2ZpZWxkKGNhbGwsIHByZWQtPmZpZWxkX25hbWUpOworCWlmICghZmllbGQpIHsKKwkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX0ZJRUxEX05PVF9GT1VORCwgMCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXByZWQtPm9mZnNldCA9IGZpZWxkLT5vZmZzZXQ7CisKKwlpZiAoIWlzX2xlZ2FsX29wKGZpZWxkLCBwcmVkLT5vcCkpIHsKKwkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX0lMTEVHQUxfRklFTERfT1AsIDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzdHJpbmdfdHlwZSA9IGlzX3N0cmluZ19maWVsZChmaWVsZC0+dHlwZSk7CisJaWYgKHN0cmluZ190eXBlKSB7CisJCWlmIChzdHJpbmdfdHlwZSA9PSBGSUxURVJfU1RBVElDX1NUUklORykKKwkJCWZuID0gZmlsdGVyX3ByZWRfc3RyaW5nOworCQllbHNlCisJCQlmbiA9IGZpbHRlcl9wcmVkX3N0cmxvYzsKKwkJcHJlZC0+c3RyX2xlbiA9IGZpZWxkLT5zaXplOworCQlpZiAocHJlZC0+b3AgPT0gT1BfTkUpCisJCQlwcmVkLT5ub3QgPSAxOworCQlyZXR1cm4gZmlsdGVyX2FkZF9wcmVkX2ZuKHBzLCBjYWxsLCBwcmVkLCBmbik7CisJfSBlbHNlIHsKKwkJaWYgKHN0cmljdF9zdHJ0b3VsbChwcmVkLT5zdHJfdmFsLCAwLCAmdmFsKSkgeworCQkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX0lMTEVHQUxfSU5UVkFMLCAwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXByZWQtPnZhbCA9IHZhbDsKKwl9CisKKwlmbiA9IHNlbGVjdF9jb21wYXJpc29uX2ZuKHByZWQtPm9wLCBmaWVsZC0+c2l6ZSwgZmllbGQtPmlzX3NpZ25lZCk7CisJaWYgKCFmbikgeworCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfSU5WQUxJRF9PUCwgMCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWlmIChwcmVkLT5vcCA9PSBPUF9ORSkKKwkJcHJlZC0+bm90ID0gMTsKKworCXJldHVybiBmaWx0ZXJfYWRkX3ByZWRfZm4ocHMsIGNhbGwsIHByZWQsIGZuKTsKK30KKworc3RhdGljIGludCBmaWx0ZXJfYWRkX3N1YnN5c3RlbV9wcmVkKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLAorCQkJCSAgICAgc3RydWN0IGV2ZW50X3N1YnN5c3RlbSAqc3lzdGVtLAorCQkJCSAgICAgc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkLAorCQkJCSAgICAgY2hhciAqZmlsdGVyX3N0cmluZykKK3sKKwlzdHJ1Y3QgZXZlbnRfZmlsdGVyICpmaWx0ZXIgPSBzeXN0ZW0tPmZpbHRlcjsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGw7CisJaW50IGVyciA9IDA7CisKKwlpZiAoIWZpbHRlci0+cHJlZHMpIHsKKwkJZmlsdGVyLT5wcmVkcyA9IGt6YWxsb2MoTUFYX0ZJTFRFUl9QUkVEICogc2l6ZW9mKHByZWQpLAorCQkJCQlHRlBfS0VSTkVMKTsKKworCQlpZiAoIWZpbHRlci0+cHJlZHMpCisJCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlpZiAoZmlsdGVyLT5uX3ByZWRzID09IE1BWF9GSUxURVJfUFJFRCkgeworCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfVE9PX01BTllfUFJFRFMsIDApOworCQlyZXR1cm4gLUVOT1NQQzsKKwl9CisKKwlmaWx0ZXItPnByZWRzW2ZpbHRlci0+bl9wcmVkc10gPSBwcmVkOworCWZpbHRlci0+bl9wcmVkcysrOworCisJbXV0ZXhfbG9jaygmZXZlbnRfbXV0ZXgpOworCWxpc3RfZm9yX2VhY2hfZW50cnkoY2FsbCwgJmZ0cmFjZV9ldmVudHMsIGxpc3QpIHsKKworCQlpZiAoIWNhbGwtPmRlZmluZV9maWVsZHMpCisJCQljb250aW51ZTsKKworCQlpZiAoc3RyY21wKGNhbGwtPnN5c3RlbSwgc3lzdGVtLT5uYW1lKSkKKwkJCWNvbnRpbnVlOworCisJCWVyciA9IGZpbHRlcl9hZGRfcHJlZChwcywgY2FsbCwgcHJlZCk7CisJCWlmIChlcnIpIHsKKwkJCW11dGV4X3VubG9jaygmZXZlbnRfbXV0ZXgpOworCQkJZmlsdGVyX2ZyZWVfc3Vic3lzdGVtX3ByZWRzKHN5c3RlbSk7CisJCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfQkFEX1NVQlNZU19GSUxURVIsIDApOworCQkJZ290byBvdXQ7CisJCX0KKwkJcmVwbGFjZV9maWx0ZXJfc3RyaW5nKGNhbGwtPmZpbHRlciwgZmlsdGVyX3N0cmluZyk7CisJfQorCW11dGV4X3VubG9jaygmZXZlbnRfbXV0ZXgpOworb3V0OgorCXJldHVybiBlcnI7Cit9CisKK3N0YXRpYyB2b2lkIHBhcnNlX2luaXQoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMsCisJCSAgICAgICBzdHJ1Y3QgZmlsdGVyX29wICpvcHMsCisJCSAgICAgICBjaGFyICppbmZpeF9zdHJpbmcpCit7CisJbWVtc2V0KHBzLCAnXDAnLCBzaXplb2YoKnBzKSk7CisKKwlwcy0+aW5maXguc3RyaW5nID0gaW5maXhfc3RyaW5nOworCXBzLT5pbmZpeC5jbnQgPSBzdHJsZW4oaW5maXhfc3RyaW5nKTsKKwlwcy0+b3BzID0gb3BzOworCisJSU5JVF9MSVNUX0hFQUQoJnBzLT5vcHN0YWNrKTsKKwlJTklUX0xJU1RfSEVBRCgmcHMtPnBvc3RmaXgpOworfQorCitzdGF0aWMgY2hhciBpbmZpeF9uZXh0KHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzKQoreworCXBzLT5pbmZpeC5jbnQtLTsKKworCXJldHVybiBwcy0+aW5maXguc3RyaW5nW3BzLT5pbmZpeC50YWlsKytdOworfQorCitzdGF0aWMgY2hhciBpbmZpeF9wZWVrKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzKQoreworCWlmIChwcy0+aW5maXgudGFpbCA9PSBzdHJsZW4ocHMtPmluZml4LnN0cmluZykpCisJCXJldHVybiAwOworCisJcmV0dXJuIHBzLT5pbmZpeC5zdHJpbmdbcHMtPmluZml4LnRhaWxdOworfQorCitzdGF0aWMgdm9pZCBpbmZpeF9hZHZhbmNlKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzKQoreworCXBzLT5pbmZpeC5jbnQtLTsKKwlwcy0+aW5maXgudGFpbCsrOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19wcmVjZWRlbmNlX2xvd2VyKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLAorCQkJCSAgICAgIGludCBhLCBpbnQgYikKK3sKKwlyZXR1cm4gcHMtPm9wc1thXS5wcmVjZWRlbmNlIDwgcHMtPm9wc1tiXS5wcmVjZWRlbmNlOworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19vcF9jaGFyKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLCBjaGFyIGMpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBzdHJjbXAocHMtPm9wc1tpXS5zdHJpbmcsICJPUF9OT05FIik7IGkrKykgeworCQlpZiAocHMtPm9wc1tpXS5zdHJpbmdbMF0gPT0gYykKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGluZml4X2dldF9vcChzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywgY2hhciBmaXJzdGMpCit7CisJY2hhciBuZXh0YyA9IGluZml4X3BlZWsocHMpOworCWNoYXIgb3BzdHJbM107CisJaW50IGk7CisKKwlvcHN0clswXSA9IGZpcnN0YzsKKwlvcHN0clsxXSA9IG5leHRjOworCW9wc3RyWzJdID0gJ1wwJzsKKworCWZvciAoaSA9IDA7IHN0cmNtcChwcy0+b3BzW2ldLnN0cmluZywgIk9QX05PTkUiKTsgaSsrKSB7CisJCWlmICghc3RyY21wKG9wc3RyLCBwcy0+b3BzW2ldLnN0cmluZykpIHsKKwkJCWluZml4X2FkdmFuY2UocHMpOworCQkJcmV0dXJuIHBzLT5vcHNbaV0uaWQ7CisJCX0KKwl9CisKKwlvcHN0clsxXSA9ICdcMCc7CisKKwlmb3IgKGkgPSAwOyBzdHJjbXAocHMtPm9wc1tpXS5zdHJpbmcsICJPUF9OT05FIik7IGkrKykgeworCQlpZiAoIXN0cmNtcChvcHN0ciwgcHMtPm9wc1tpXS5zdHJpbmcpKQorCQkJcmV0dXJuIHBzLT5vcHNbaV0uaWQ7CisJfQorCisJcmV0dXJuIE9QX05PTkU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbGVhcl9vcGVyYW5kX3N0cmluZyhzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwltZW1zZXQocHMtPm9wZXJhbmQuc3RyaW5nLCAnXDAnLCBNQVhfRklMVEVSX1NUUl9WQUwpOworCXBzLT5vcGVyYW5kLnRhaWwgPSAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBhcHBlbmRfb3BlcmFuZF9jaGFyKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLCBjaGFyIGMpCit7CisJaWYgKHBzLT5vcGVyYW5kLnRhaWwgPT0gTUFYX0ZJTFRFUl9TVFJfVkFMIC0gMSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwcy0+b3BlcmFuZC5zdHJpbmdbcHMtPm9wZXJhbmQudGFpbCsrXSA9IGM7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfb3BzdGFja19wdXNoKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzLCBpbnQgb3ApCit7CisJc3RydWN0IG9wc3RhY2tfb3AgKm9wc3RhY2tfb3A7CisKKwlvcHN0YWNrX29wID0ga21hbGxvYyhzaXplb2YoKm9wc3RhY2tfb3ApLCBHRlBfS0VSTkVMKTsKKwlpZiAoIW9wc3RhY2tfb3ApCisJCXJldHVybiAtRU5PTUVNOworCisJb3BzdGFja19vcC0+b3AgPSBvcDsKKwlsaXN0X2FkZCgmb3BzdGFja19vcC0+bGlzdCwgJnBzLT5vcHN0YWNrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGZpbHRlcl9vcHN0YWNrX2VtcHR5KHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzKQoreworCXJldHVybiBsaXN0X2VtcHR5KCZwcy0+b3BzdGFjayk7Cit9CisKK3N0YXRpYyBpbnQgZmlsdGVyX29wc3RhY2tfdG9wKHN0cnVjdCBmaWx0ZXJfcGFyc2Vfc3RhdGUgKnBzKQoreworCXN0cnVjdCBvcHN0YWNrX29wICpvcHN0YWNrX29wOworCisJaWYgKGZpbHRlcl9vcHN0YWNrX2VtcHR5KHBzKSkKKwkJcmV0dXJuIE9QX05PTkU7CisKKwlvcHN0YWNrX29wID0gbGlzdF9maXJzdF9lbnRyeSgmcHMtPm9wc3RhY2ssIHN0cnVjdCBvcHN0YWNrX29wLCBsaXN0KTsKKworCXJldHVybiBvcHN0YWNrX29wLT5vcDsKK30KKworc3RhdGljIGludCBmaWx0ZXJfb3BzdGFja19wb3Aoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMpCit7CisJc3RydWN0IG9wc3RhY2tfb3AgKm9wc3RhY2tfb3A7CisJaW50IG9wOworCisJaWYgKGZpbHRlcl9vcHN0YWNrX2VtcHR5KHBzKSkKKwkJcmV0dXJuIE9QX05PTkU7CisKKwlvcHN0YWNrX29wID0gbGlzdF9maXJzdF9lbnRyeSgmcHMtPm9wc3RhY2ssIHN0cnVjdCBvcHN0YWNrX29wLCBsaXN0KTsKKwlvcCA9IG9wc3RhY2tfb3AtPm9wOworCWxpc3RfZGVsKCZvcHN0YWNrX29wLT5saXN0KTsKKworCWtmcmVlKG9wc3RhY2tfb3ApOworCisJcmV0dXJuIG9wOworfQorCitzdGF0aWMgdm9pZCBmaWx0ZXJfb3BzdGFja19jbGVhcihzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwl3aGlsZSAoIWZpbHRlcl9vcHN0YWNrX2VtcHR5KHBzKSkKKwkJZmlsdGVyX29wc3RhY2tfcG9wKHBzKTsKK30KKworc3RhdGljIGNoYXIgKmN1cnJfb3BlcmFuZChzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwlyZXR1cm4gcHMtPm9wZXJhbmQuc3RyaW5nOworfQorCitzdGF0aWMgaW50IHBvc3RmaXhfYXBwZW5kX29wZXJhbmQoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMsIGNoYXIgKm9wZXJhbmQpCit7CisJc3RydWN0IHBvc3RmaXhfZWx0ICplbHQ7CisKKwllbHQgPSBrbWFsbG9jKHNpemVvZigqZWx0KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlbHQpCisJCXJldHVybiAtRU5PTUVNOworCisJZWx0LT5vcCA9IE9QX05PTkU7CisJZWx0LT5vcGVyYW5kID0ga3N0cmR1cChvcGVyYW5kLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWVsdC0+b3BlcmFuZCkgeworCQlrZnJlZShlbHQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlsaXN0X2FkZF90YWlsKCZlbHQtPmxpc3QsICZwcy0+cG9zdGZpeCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwb3N0Zml4X2FwcGVuZF9vcChzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcywgaW50IG9wKQoreworCXN0cnVjdCBwb3N0Zml4X2VsdCAqZWx0OworCisJZWx0ID0ga21hbGxvYyhzaXplb2YoKmVsdCksIEdGUF9LRVJORUwpOworCWlmICghZWx0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWVsdC0+b3AgPSBvcDsKKwllbHQtPm9wZXJhbmQgPSBOVUxMOworCisJbGlzdF9hZGRfdGFpbCgmZWx0LT5saXN0LCAmcHMtPnBvc3RmaXgpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBvc3RmaXhfY2xlYXIoc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMpCit7CisJc3RydWN0IHBvc3RmaXhfZWx0ICplbHQ7CisKKwl3aGlsZSAoIWxpc3RfZW1wdHkoJnBzLT5wb3N0Zml4KSkgeworCQllbHQgPSBsaXN0X2ZpcnN0X2VudHJ5KCZwcy0+cG9zdGZpeCwgc3RydWN0IHBvc3RmaXhfZWx0LCBsaXN0KTsKKwkJa2ZyZWUoZWx0LT5vcGVyYW5kKTsKKwkJbGlzdF9kZWwoJmVsdC0+bGlzdCk7CisJfQorfQorCitzdGF0aWMgaW50IGZpbHRlcl9wYXJzZShzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwlpbnQgaW5fc3RyaW5nID0gMDsKKwlpbnQgb3AsIHRvcF9vcDsKKwljaGFyIGNoOworCisJd2hpbGUgKChjaCA9IGluZml4X25leHQocHMpKSkgeworCQlpZiAoY2ggPT0gJyInKSB7CisJCQlpbl9zdHJpbmcgXj0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGluX3N0cmluZykKKwkJCWdvdG8gcGFyc2Vfb3BlcmFuZDsKKworCQlpZiAoaXNzcGFjZShjaCkpCisJCQljb250aW51ZTsKKworCQlpZiAoaXNfb3BfY2hhcihwcywgY2gpKSB7CisJCQlvcCA9IGluZml4X2dldF9vcChwcywgY2gpOworCQkJaWYgKG9wID09IE9QX05PTkUpIHsKKwkJCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfSU5WQUxJRF9PUCwgMCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisKKwkJCWlmIChzdHJsZW4oY3Vycl9vcGVyYW5kKHBzKSkpIHsKKwkJCQlwb3N0Zml4X2FwcGVuZF9vcGVyYW5kKHBzLCBjdXJyX29wZXJhbmQocHMpKTsKKwkJCQljbGVhcl9vcGVyYW5kX3N0cmluZyhwcyk7CisJCQl9CisKKwkJCXdoaWxlICghZmlsdGVyX29wc3RhY2tfZW1wdHkocHMpKSB7CisJCQkJdG9wX29wID0gZmlsdGVyX29wc3RhY2tfdG9wKHBzKTsKKwkJCQlpZiAoIWlzX3ByZWNlZGVuY2VfbG93ZXIocHMsIHRvcF9vcCwgb3ApKSB7CisJCQkJCXRvcF9vcCA9IGZpbHRlcl9vcHN0YWNrX3BvcChwcyk7CisJCQkJCXBvc3RmaXhfYXBwZW5kX29wKHBzLCB0b3Bfb3ApOworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWZpbHRlcl9vcHN0YWNrX3B1c2gocHMsIG9wKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGNoID09ICcoJykgeworCQkJZmlsdGVyX29wc3RhY2tfcHVzaChwcywgT1BfT1BFTl9QQVJFTik7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChjaCA9PSAnKScpIHsKKwkJCWlmIChzdHJsZW4oY3Vycl9vcGVyYW5kKHBzKSkpIHsKKwkJCQlwb3N0Zml4X2FwcGVuZF9vcGVyYW5kKHBzLCBjdXJyX29wZXJhbmQocHMpKTsKKwkJCQljbGVhcl9vcGVyYW5kX3N0cmluZyhwcyk7CisJCQl9CisKKwkJCXRvcF9vcCA9IGZpbHRlcl9vcHN0YWNrX3BvcChwcyk7CisJCQl3aGlsZSAodG9wX29wICE9IE9QX05PTkUpIHsKKwkJCQlpZiAodG9wX29wID09IE9QX09QRU5fUEFSRU4pCisJCQkJCWJyZWFrOworCQkJCXBvc3RmaXhfYXBwZW5kX29wKHBzLCB0b3Bfb3ApOworCQkJCXRvcF9vcCA9IGZpbHRlcl9vcHN0YWNrX3BvcChwcyk7CisJCQl9CisJCQlpZiAodG9wX29wID09IE9QX05PTkUpIHsKKwkJCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfVU5CQUxBTkNFRF9QQVJFTiwgMCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorcGFyc2Vfb3BlcmFuZDoKKwkJaWYgKGFwcGVuZF9vcGVyYW5kX2NoYXIocHMsIGNoKSkgeworCQkJcGFyc2VfZXJyb3IocHMsIEZJTFRfRVJSX09QRVJBTkRfVE9PX0xPTkcsIDApOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlpZiAoc3RybGVuKGN1cnJfb3BlcmFuZChwcykpKQorCQlwb3N0Zml4X2FwcGVuZF9vcGVyYW5kKHBzLCBjdXJyX29wZXJhbmQocHMpKTsKKworCXdoaWxlICghZmlsdGVyX29wc3RhY2tfZW1wdHkocHMpKSB7CisJCXRvcF9vcCA9IGZpbHRlcl9vcHN0YWNrX3BvcChwcyk7CisJCWlmICh0b3Bfb3AgPT0gT1BfTk9ORSkKKwkJCWJyZWFrOworCQlpZiAodG9wX29wID09IE9QX09QRU5fUEFSRU4pIHsKKwkJCXBhcnNlX2Vycm9yKHBzLCBGSUxUX0VSUl9VTkJBTEFOQ0VEX1BBUkVOLCAwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCXBvc3RmaXhfYXBwZW5kX29wKHBzLCB0b3Bfb3ApOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGZpbHRlcl9wcmVkICpjcmVhdGVfcHJlZChpbnQgb3AsIGNoYXIgKm9wZXJhbmQxLCBjaGFyICpvcGVyYW5kMikKK3sKKwlzdHJ1Y3QgZmlsdGVyX3ByZWQgKnByZWQ7CisKKwlwcmVkID0ga3phbGxvYyhzaXplb2YoKnByZWQpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIXByZWQpCisJCXJldHVybiBOVUxMOworCisJcHJlZC0+ZmllbGRfbmFtZSA9IGtzdHJkdXAob3BlcmFuZDEsIEdGUF9LRVJORUwpOworCWlmICghcHJlZC0+ZmllbGRfbmFtZSkgeworCQlrZnJlZShwcmVkKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc3RyY3B5KHByZWQtPnN0cl92YWwsIG9wZXJhbmQyKTsKKwlwcmVkLT5zdHJfbGVuID0gc3RybGVuKG9wZXJhbmQyKTsKKworCXByZWQtPm9wID0gb3A7CisKKwlyZXR1cm4gcHJlZDsKK30KKworc3RhdGljIHN0cnVjdCBmaWx0ZXJfcHJlZCAqY3JlYXRlX2xvZ2ljYWxfcHJlZChpbnQgb3ApCit7CisJc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkOworCisJcHJlZCA9IGt6YWxsb2Moc2l6ZW9mKCpwcmVkKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcmVkKQorCQlyZXR1cm4gTlVMTDsKKworCXByZWQtPm9wID0gb3A7CisKKwlyZXR1cm4gcHJlZDsKK30KKworc3RhdGljIGludCBjaGVja19wcmVkcyhzdHJ1Y3QgZmlsdGVyX3BhcnNlX3N0YXRlICpwcykKK3sKKwlpbnQgbl9ub3JtYWxfcHJlZHMgPSAwLCBuX2xvZ2ljYWxfcHJlZHMgPSAwOworCXN0cnVjdCBwb3N0Zml4X2VsdCAqZWx0OworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShlbHQsICZwcy0+cG9zdGZpeCwgbGlzdCkgeworCQlpZiAoZWx0LT5vcCA9PSBPUF9OT05FKQorCQkJY29udGludWU7CisKKwkJaWYgKGVsdC0+b3AgPT0gT1BfQU5EIHx8IGVsdC0+b3AgPT0gT1BfT1IpIHsKKwkJCW5fbG9naWNhbF9wcmVkcysrOworCQkJY29udGludWU7CisJCX0KKwkJbl9ub3JtYWxfcHJlZHMrKzsKKwl9CisKKwlpZiAoIW5fbm9ybWFsX3ByZWRzIHx8IG5fbG9naWNhbF9wcmVkcyA+PSBuX25vcm1hbF9wcmVkcykgeworCQlwYXJzZV9lcnJvcihwcywgRklMVF9FUlJfSU5WQUxJRF9GSUxURVIsIDApOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZXBsYWNlX3ByZWRzKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSwKKwkJCSBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwsCisJCQkgc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHMsCisJCQkgY2hhciAqZmlsdGVyX3N0cmluZykKK3sKKwljaGFyICpvcGVyYW5kMSA9IE5VTEwsICpvcGVyYW5kMiA9IE5VTEw7CisJc3RydWN0IGZpbHRlcl9wcmVkICpwcmVkOworCXN0cnVjdCBwb3N0Zml4X2VsdCAqZWx0OworCWludCBlcnI7CisKKwllcnIgPSBjaGVja19wcmVkcyhwcyk7CisJaWYgKGVycikKKwkJcmV0dXJuIGVycjsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoZWx0LCAmcHMtPnBvc3RmaXgsIGxpc3QpIHsKKwkJaWYgKGVsdC0+b3AgPT0gT1BfTk9ORSkgeworCQkJaWYgKCFvcGVyYW5kMSkKKwkJCQlvcGVyYW5kMSA9IGVsdC0+b3BlcmFuZDsKKwkJCWVsc2UgaWYgKCFvcGVyYW5kMikKKwkJCQlvcGVyYW5kMiA9IGVsdC0+b3BlcmFuZDsKKwkJCWVsc2UgeworCQkJCXBhcnNlX2Vycm9yKHBzLCBGSUxUX0VSUl9UT09fTUFOWV9PUEVSQU5EUywgMCk7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChlbHQtPm9wID09IE9QX0FORCB8fCBlbHQtPm9wID09IE9QX09SKSB7CisJCQlwcmVkID0gY3JlYXRlX2xvZ2ljYWxfcHJlZChlbHQtPm9wKTsKKwkJCWlmIChjYWxsKSB7CisJCQkJZXJyID0gZmlsdGVyX2FkZF9wcmVkKHBzLCBjYWxsLCBwcmVkKTsKKwkJCQlmaWx0ZXJfZnJlZV9wcmVkKHByZWQpOworCQkJfSBlbHNlCisJCQkJZXJyID0gZmlsdGVyX2FkZF9zdWJzeXN0ZW1fcHJlZChwcywgc3lzdGVtLAorCQkJCQkJCXByZWQsIGZpbHRlcl9zdHJpbmcpOworCQkJaWYgKGVycikKKwkJCQlyZXR1cm4gZXJyOworCisJCQlvcGVyYW5kMSA9IG9wZXJhbmQyID0gTlVMTDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFvcGVyYW5kMSB8fCAhb3BlcmFuZDIpIHsKKwkJCXBhcnNlX2Vycm9yKHBzLCBGSUxUX0VSUl9NSVNTSU5HX0ZJRUxELCAwKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJcHJlZCA9IGNyZWF0ZV9wcmVkKGVsdC0+b3AsIG9wZXJhbmQxLCBvcGVyYW5kMik7CisJCWlmIChjYWxsKSB7CisJCQllcnIgPSBmaWx0ZXJfYWRkX3ByZWQocHMsIGNhbGwsIHByZWQpOworCQkJZmlsdGVyX2ZyZWVfcHJlZChwcmVkKTsKKwkJfSBlbHNlCisJCQllcnIgPSBmaWx0ZXJfYWRkX3N1YnN5c3RlbV9wcmVkKHBzLCBzeXN0ZW0sIHByZWQsCisJCQkJCQkJZmlsdGVyX3N0cmluZyk7CisJCWlmIChlcnIpCisJCQlyZXR1cm4gZXJyOworCisJCW9wZXJhbmQxID0gb3BlcmFuZDIgPSBOVUxMOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgYXBwbHlfZXZlbnRfZmlsdGVyKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCwgY2hhciAqZmlsdGVyX3N0cmluZykKK3sKKwlpbnQgZXJyOworCisJc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHM7CisKKwltdXRleF9sb2NrKCZmaWx0ZXJfbXV0ZXgpOworCisJaWYgKCFzdHJjbXAoc3Ryc3RyaXAoZmlsdGVyX3N0cmluZyksICIwIikpIHsKKwkJZmlsdGVyX2Rpc2FibGVfcHJlZHMoY2FsbCk7CisJCXJlbW92ZV9maWx0ZXJfc3RyaW5nKGNhbGwtPmZpbHRlcik7CisJCW11dGV4X3VubG9jaygmZmlsdGVyX211dGV4KTsKKwkJcmV0dXJuIDA7CisJfQorCisJZXJyID0gLUVOT01FTTsKKwlwcyA9IGt6YWxsb2Moc2l6ZW9mKCpwcyksIEdGUF9LRVJORUwpOworCWlmICghcHMpCisJCWdvdG8gb3V0X3VubG9jazsKKworCWZpbHRlcl9kaXNhYmxlX3ByZWRzKGNhbGwpOworCXJlcGxhY2VfZmlsdGVyX3N0cmluZyhjYWxsLT5maWx0ZXIsIGZpbHRlcl9zdHJpbmcpOworCisJcGFyc2VfaW5pdChwcywgZmlsdGVyX29wcywgZmlsdGVyX3N0cmluZyk7CisJZXJyID0gZmlsdGVyX3BhcnNlKHBzKTsKKwlpZiAoZXJyKSB7CisJCWFwcGVuZF9maWx0ZXJfZXJyKHBzLCBjYWxsLT5maWx0ZXIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSByZXBsYWNlX3ByZWRzKE5VTEwsIGNhbGwsIHBzLCBmaWx0ZXJfc3RyaW5nKTsKKwlpZiAoZXJyKQorCQlhcHBlbmRfZmlsdGVyX2VycihwcywgY2FsbC0+ZmlsdGVyKTsKKworb3V0OgorCWZpbHRlcl9vcHN0YWNrX2NsZWFyKHBzKTsKKwlwb3N0Zml4X2NsZWFyKHBzKTsKKwlrZnJlZShwcyk7CitvdXRfdW5sb2NrOgorCW11dGV4X3VubG9jaygmZmlsdGVyX211dGV4KTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBhcHBseV9zdWJzeXN0ZW1fZXZlbnRfZmlsdGVyKHN0cnVjdCBldmVudF9zdWJzeXN0ZW0gKnN5c3RlbSwKKwkJCQkgY2hhciAqZmlsdGVyX3N0cmluZykKK3sKKwlpbnQgZXJyOworCisJc3RydWN0IGZpbHRlcl9wYXJzZV9zdGF0ZSAqcHM7CisKKwltdXRleF9sb2NrKCZmaWx0ZXJfbXV0ZXgpOworCisJaWYgKCFzdHJjbXAoc3Ryc3RyaXAoZmlsdGVyX3N0cmluZyksICIwIikpIHsKKwkJZmlsdGVyX2ZyZWVfc3Vic3lzdGVtX3ByZWRzKHN5c3RlbSk7CisJCXJlbW92ZV9maWx0ZXJfc3RyaW5nKHN5c3RlbS0+ZmlsdGVyKTsKKwkJbXV0ZXhfdW5sb2NrKCZmaWx0ZXJfbXV0ZXgpOworCQlyZXR1cm4gMDsKKwl9CisKKwllcnIgPSAtRU5PTUVNOworCXBzID0ga3phbGxvYyhzaXplb2YoKnBzKSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFwcykKKwkJZ290byBvdXRfdW5sb2NrOworCisJZmlsdGVyX2ZyZWVfc3Vic3lzdGVtX3ByZWRzKHN5c3RlbSk7CisJcmVwbGFjZV9maWx0ZXJfc3RyaW5nKHN5c3RlbS0+ZmlsdGVyLCBmaWx0ZXJfc3RyaW5nKTsKKworCXBhcnNlX2luaXQocHMsIGZpbHRlcl9vcHMsIGZpbHRlcl9zdHJpbmcpOworCWVyciA9IGZpbHRlcl9wYXJzZShwcyk7CisJaWYgKGVycikgeworCQlhcHBlbmRfZmlsdGVyX2Vycihwcywgc3lzdGVtLT5maWx0ZXIpOworCQlnb3RvIG91dDsKKwl9CisKKwllcnIgPSByZXBsYWNlX3ByZWRzKHN5c3RlbSwgTlVMTCwgcHMsIGZpbHRlcl9zdHJpbmcpOworCWlmIChlcnIpCisJCWFwcGVuZF9maWx0ZXJfZXJyKHBzLCBzeXN0ZW0tPmZpbHRlcik7CisKK291dDoKKwlmaWx0ZXJfb3BzdGFja19jbGVhcihwcyk7CisJcG9zdGZpeF9jbGVhcihwcyk7CisJa2ZyZWUocHMpOworb3V0X3VubG9jazoKKwltdXRleF91bmxvY2soJmZpbHRlcl9tdXRleCk7CisKKwlyZXR1cm4gZXJyOworfQogCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzEuaCBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfc3RhZ2VfMS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODk4NWY5Li4wMDAwMDAwCi0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfc3RhZ2VfMS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIFN0YWdlIDEgb2YgdGhlIHRyYWNlIGV2ZW50cy4KLSAqCi0gKiBPdmVycmlkZSB0aGUgbWFjcm9zIGluIDx0cmFjZS90cmFjZV9ldmVudF90eXBlcy5oPiB0byBpbmNsdWRlIHRoZSBmb2xsb3dpbmc6Ci0gKgotICogc3RydWN0IGZ0cmFjZV9yYXdfPGNhbGw+IHsKLSAqCXN0cnVjdCB0cmFjZV9lbnRyeQkJZW50OwotICoJPHR5cGU+CQkJCTxpdGVtPjsKLSAqCTx0eXBlMj4JCQkJPGl0ZW0yPls8bGVuPl07Ci0gKglbLi4uXQotICogfTsKLSAqCi0gKiBUaGUgPHR5cGU+IDxpdGVtPiBpcyBjcmVhdGVkIGJ5IHRoZSBfX2ZpZWxkKHR5cGUsIGl0ZW0pIG1hY3JvIG9yCi0gKiB0aGUgX19hcnJheSh0eXBlMiwgaXRlbTIsIGxlbikgbWFjcm8uCi0gKiBXZSBzaW1wbHkgZG8gInR5cGUgaXRlbTsiLCBhbmQgdGhhdCB3aWxsIGNyZWF0ZSB0aGUgZmllbGRzCi0gKiBpbiB0aGUgc3RydWN0dXJlLgotICovCi0KLSN1bmRlZiBUUkFDRV9GT1JNQVQKLSNkZWZpbmUgVFJBQ0VfRk9STUFUKGNhbGwsIHByb3RvLCBhcmdzLCBmbXQpCi0KLSN1bmRlZiBfX2FycmF5Ci0jZGVmaW5lIF9fYXJyYXkodHlwZSwgaXRlbSwgbGVuKQl0eXBlCWl0ZW1bbGVuXTsKLQotI3VuZGVmIF9fZmllbGQKLSNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKQkJdHlwZQlpdGVtOwotCi0jdW5kZWYgVFBfU1RSVUNUX19lbnRyeQotI2RlZmluZSBUUF9TVFJVQ1RfX2VudHJ5KGFyZ3MuLi4pIGFyZ3MKLQotI3VuZGVmIFRSQUNFX0VWRU5UCi0jZGVmaW5lIFRSQUNFX0VWRU5UKG5hbWUsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBhc3NpZ24sIHByaW50KQlcCi0Jc3RydWN0IGZ0cmFjZV9yYXdfIyNuYW1lIHsJCQkJXAotCQlzdHJ1Y3QgdHJhY2VfZW50cnkJZW50OwkJCVwKLQkJdHN0cnVjdAkJCQkJCVwKLQl9OwkJCQkJCQlcCi0Jc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBldmVudF8jI25hbWUKLQotI2luY2x1ZGUgPHRyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzIuaCBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfc3RhZ2VfMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzYzYzY2Li4wMDAwMDAwCi0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfc3RhZ2VfMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8qCi0gKiBTdGFnZSAyIG9mIHRoZSB0cmFjZSBldmVudHMuCi0gKgotICogT3ZlcnJpZGUgdGhlIG1hY3JvcyBpbiA8dHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaD4gdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nOgotICoKLSAqIGVudW0gcHJpbnRfbGluZV90Ci0gKiBmdHJhY2VfcmF3X291dHB1dF88Y2FsbD4oc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLCBpbnQgZmxhZ3MpCi0gKiB7Ci0gKglzdHJ1Y3QgdHJhY2Vfc2VxICpzID0gJml0ZXItPnNlcTsKLSAqCXN0cnVjdCBmdHJhY2VfcmF3XzxjYWxsPiAqZmllbGQ7IDwtLSBkZWZpbmVkIGluIHN0YWdlIDEKLSAqCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnk7Ci0gKglpbnQgcmV0OwotICoKLSAqCWVudHJ5ID0gaXRlci0+ZW50OwotICoKLSAqCWlmIChlbnRyeS0+dHlwZSAhPSBldmVudF88Y2FsbD4uaWQpIHsKLSAqCQlXQVJOX09OX09OQ0UoMSk7Ci0gKgkJcmV0dXJuIFRSQUNFX1RZUEVfVU5IQU5ETEVEOwotICoJfQotICoKLSAqCWZpZWxkID0gKHR5cGVvZihmaWVsZCkpZW50cnk7Ci0gKgotICoJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCA8VFBfcHJpbnRrPiAiXG4iKTsKLSAqCWlmICghcmV0KQotICoJCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsKLSAqCi0gKglyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwotICogfQotICoKLSAqIFRoaXMgaXMgdGhlIG1ldGhvZCB1c2VkIHRvIHByaW50IHRoZSByYXcgZXZlbnQgdG8gdGhlIHRyYWNlCi0gKiBvdXRwdXQgZm9ybWF0LiBOb3RlLCB0aGlzIGlzIG5vdCBuZWVkZWQgaWYgdGhlIGRhdGEgaXMgcmVhZAotICogaW4gYmluYXJ5LgotICovCi0KLSN1bmRlZiBfX2VudHJ5Ci0jZGVmaW5lIF9fZW50cnkgZmllbGQKLQotI3VuZGVmIFRQX3ByaW50awotI2RlZmluZSBUUF9wcmludGsoZm10LCBhcmdzLi4uKSBmbXQgIlxuIiwgYXJncwotCi0jdW5kZWYgVFJBQ0VfRVZFTlQKLSNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCQlcCi1lbnVtIHByaW50X2xpbmVfdAkJCQkJCQlcCi1mdHJhY2VfcmF3X291dHB1dF8jI2NhbGwoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyLCBpbnQgZmxhZ3MpCVwKLXsJCQkJCQkJCQlcCi0Jc3RydWN0IHRyYWNlX3NlcSAqcyA9ICZpdGVyLT5zZXE7CQkJCVwKLQlzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgKmZpZWxkOwkJCQlcCi0Jc3RydWN0IHRyYWNlX2VudHJ5ICplbnRyeTsJCQkJCVwKLQlpbnQgcmV0OwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JZW50cnkgPSBpdGVyLT5lbnQ7CQkJCQkJXAotCQkJCQkJCQkJXAotCWlmIChlbnRyeS0+dHlwZSAhPSBldmVudF8jI2NhbGwuaWQpIHsJCQkJXAotCQlXQVJOX09OX09OQ0UoMSk7CQkJCQlcCi0JCXJldHVybiBUUkFDRV9UWVBFX1VOSEFORExFRDsJCQkJXAotCX0JCQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlmaWVsZCA9ICh0eXBlb2YoZmllbGQpKWVudHJ5OwkJCQkJXAotCQkJCQkJCQkJXAotCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgI2NhbGwgIjogIiBwcmludCk7CQkJXAotCWlmICghcmV0KQkJCQkJCQlcCi0JCXJldHVybiBUUkFDRV9UWVBFX1BBUlRJQUxfTElORTsJCQkJXAotCQkJCQkJCQkJXAotCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7CQkJCQlcCi19Ci0JCi0jaW5jbHVkZSA8dHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaD4KLQotLyoKLSAqIFNldHVwIHRoZSBzaG93aW5nIGZvcm1hdCBvZiB0cmFjZSBwb2ludC4KLSAqCi0gKiBpbnQKLSAqIGZ0cmFjZV9mb3JtYXRfIyNjYWxsKHN0cnVjdCB0cmFjZV9zZXEgKnMpCi0gKiB7Ci0gKglzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgZmllbGQ7Ci0gKglpbnQgcmV0OwotICoKLSAqCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgI3R5cGUgIiAiICNpdGVtICI7IgotICoJCQkgICAgICAgIiBvZmZzZXQ6JXU7IHNpemU6JXU7XG4iLAotICoJCQkgICAgICAgb2Zmc2V0b2Yoc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsLCBpdGVtKSwKLSAqCQkJICAgICAgIHNpemVvZihmaWVsZC50eXBlKSk7Ci0gKgotICogfQotICovCi0KLSN1bmRlZiBUUF9TVFJVQ1RfX2VudHJ5Ci0jZGVmaW5lIFRQX1NUUlVDVF9fZW50cnkoYXJncy4uLikgYXJncwotCi0jdW5kZWYgX19maWVsZAotI2RlZmluZSBfX2ZpZWxkKHR5cGUsIGl0ZW0pCQkJCQlcCi0JcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZDoiICN0eXBlICIgIiAjaXRlbSAiO1x0IglcCi0JCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAkJXAotCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksIFwKLQkJCSAgICAgICAodW5zaWduZWQgaW50KXNpemVvZihmaWVsZC5pdGVtKSk7CVwKLQlpZiAoIXJldCkJCQkJCQkJXAotCQlyZXR1cm4gMDsKLQotI3VuZGVmIF9fYXJyYXkKLSNkZWZpbmUgX19hcnJheSh0eXBlLCBpdGVtLCBsZW4pCQkJCQkJXAotCXJldCA9IHRyYWNlX3NlcV9wcmludGYocywgIlx0ZmllbGQ6IiAjdHlwZSAiICIgI2l0ZW0gIlsiICNsZW4gIl07XHQiCVwKLQkJCSAgICAgICAib2Zmc2V0OiV1O1x0c2l6ZToldTtcbiIsCQlcCi0JCQkgICAgICAgKHVuc2lnbmVkIGludClvZmZzZXRvZih0eXBlb2YoZmllbGQpLCBpdGVtKSwgXAotCQkJICAgICAgICh1bnNpZ25lZCBpbnQpc2l6ZW9mKGZpZWxkLml0ZW0pKTsJXAotCWlmICghcmV0KQkJCQkJCQlcCi0JCXJldHVybiAwOwotCi0jdW5kZWYgX19lbnRyeQotI2RlZmluZSBfX2VudHJ5IFJFQwotCi0jdW5kZWYgVFBfcHJpbnRrCi0jZGVmaW5lIFRQX3ByaW50ayhmbXQsIGFyZ3MuLi4pICIlcywgJXNcbiIsICNmbXQsIF9fc3RyaW5naWZ5KGFyZ3MpCi0KLSN1bmRlZiBUUF9mYXN0X2Fzc2lnbgotI2RlZmluZSBUUF9mYXN0X2Fzc2lnbihhcmdzLi4uKSBhcmdzCi0KLSN1bmRlZiBUUkFDRV9FVkVOVAotI2RlZmluZSBUUkFDRV9FVkVOVChjYWxsLCBwcm90bywgYXJncywgdHN0cnVjdCwgZnVuYywgcHJpbnQpCQlcCi1zdGF0aWMgaW50CQkJCQkJCQlcCi1mdHJhY2VfZm9ybWF0XyMjY2FsbChzdHJ1Y3QgdHJhY2Vfc2VxICpzKQkJCQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCBmdHJhY2VfcmF3XyMjY2FsbCBmaWVsZDsJCQkJCVwKLQlpbnQgcmV0OwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JdHN0cnVjdDsJCQkJCQkJXAotCQkJCQkJCQkJXAotCXRyYWNlX3NlcV9wcmludGYocywgIlxucHJpbnQgZm10OiAiIHByaW50KTsJCQlcCi0JCQkJCQkJCQlcCi0JcmV0dXJuIHJldDsJCQkJCQkJXAotfQotCi0jaW5jbHVkZSA8dHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaD4KLQotI3VuZGVmIF9fZmllbGQKLSNkZWZpbmUgX19maWVsZCh0eXBlLCBpdGVtKQkJCQkJCVwKLQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgI3R5cGUsICNpdGVtLAkJXAotCQkJCSBvZmZzZXRvZih0eXBlb2YoZmllbGQpLCBpdGVtKSwJCVwKLQkJCQkgc2l6ZW9mKGZpZWxkLml0ZW0pKTsJCQlcCi0JaWYgKHJldCkJCQkJCQkJXAotCQlyZXR1cm4gcmV0OwotCi0jdW5kZWYgX19hcnJheQotI2RlZmluZSBfX2FycmF5KHR5cGUsIGl0ZW0sIGxlbikJCQkJCVwKLQlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgI3R5cGUgIlsiICNsZW4gIl0iLCAjaXRlbSwJXAotCQkJCSBvZmZzZXRvZih0eXBlb2YoZmllbGQpLCBpdGVtKSwJCVwKLQkJCQkgc2l6ZW9mKGZpZWxkLml0ZW0pKTsJCQlcCi0JaWYgKHJldCkJCQkJCQkJXAotCQlyZXR1cm4gcmV0OwotCi0jZGVmaW5lIF9fY29tbW9uX2ZpZWxkKHR5cGUsIGl0ZW0pCQkJCQlcCi0JcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsICN0eXBlLCAiY29tbW9uXyIgI2l0ZW0sCVwKLQkJCQkgb2Zmc2V0b2YodHlwZW9mKGZpZWxkLmVudCksIGl0ZW0pLAlcCi0JCQkJIHNpemVvZihmaWVsZC5lbnQuaXRlbSkpOwkJXAotCWlmIChyZXQpCQkJCQkJCVwKLQkJcmV0dXJuIHJldDsKLQotI3VuZGVmIFRSQUNFX0VWRU5UCi0jZGVmaW5lIFRSQUNFX0VWRU5UKGNhbGwsIHByb3RvLCBhcmdzLCB0c3RydWN0LCBmdW5jLCBwcmludCkJCVwKLWludAkJCQkJCQkJCVwKLWZ0cmFjZV9kZWZpbmVfZmllbGRzXyMjY2FsbCh2b2lkKQkJCQkJXAotewkJCQkJCQkJCVwKLQlzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgZmllbGQ7CQkJCQlcCi0Jc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpldmVudF9jYWxsID0gJmV2ZW50XyMjY2FsbDsJCVwKLQlpbnQgcmV0OwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JX19jb21tb25fZmllbGQodW5zaWduZWQgY2hhciwgdHlwZSk7CQkJCVwKLQlfX2NvbW1vbl9maWVsZCh1bnNpZ25lZCBjaGFyLCBmbGFncyk7CQkJCVwKLQlfX2NvbW1vbl9maWVsZCh1bnNpZ25lZCBjaGFyLCBwcmVlbXB0X2NvdW50KTsJCQlcCi0JX19jb21tb25fZmllbGQoaW50LCBwaWQpOwkJCQkJXAotCV9fY29tbW9uX2ZpZWxkKGludCwgdGdpZCk7CQkJCQlcCi0JCQkJCQkJCQlcCi0JdHN0cnVjdDsJCQkJCQkJXAotCQkJCQkJCQkJXAotCXJldHVybiByZXQ7CQkJCQkJCVwKLX0KLQotI2luY2x1ZGUgPHRyYWNlL3RyYWNlX2V2ZW50X3R5cGVzLmg+CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXZlbnRzX3N0YWdlXzMuaCBiL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfc3RhZ2VfMy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDJmYTc4Li4wMDAwMDAwCi0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9ldmVudHNfc3RhZ2VfMy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjgxICswLDAgQEAKLS8qCi0gKiBTdGFnZSAzIG9mIHRoZSB0cmFjZSBldmVudHMuCi0gKgotICogT3ZlcnJpZGUgdGhlIG1hY3JvcyBpbiA8dHJhY2UvdHJhY2VfZXZlbnRfdHlwZXMuaD4gdG8gaW5jbHVkZSB0aGUgZm9sbG93aW5nOgotICoKLSAqIHN0YXRpYyB2b2lkIGZ0cmFjZV9ldmVudF88Y2FsbD4ocHJvdG8pCi0gKiB7Ci0gKglldmVudF90cmFjZV9wcmludGsoX1JFVF9JUF8sICI8Y2FsbD46ICIgPGZtdD4pOwotICogfQotICoKLSAqIHN0YXRpYyBpbnQgZnRyYWNlX3JlZ19ldmVudF88Y2FsbD4odm9pZCkKLSAqIHsKLSAqCWludCByZXQ7Ci0gKgotICoJcmV0ID0gcmVnaXN0ZXJfdHJhY2VfPGNhbGw+KGZ0cmFjZV9ldmVudF88Y2FsbD4pOwotICoJaWYgKCFyZXQpCi0gKgkJcHJfaW5mbygiZXZlbnQgdHJhY2U6IENvdWxkIG5vdCBhY3RpdmF0ZSB0cmFjZSBwb2ludCAiCi0gKgkJCSJwcm9iZSB0byAgPGNhbGw+Iik7Ci0gKglyZXR1cm4gcmV0OwotICogfQotICoKLSAqIHN0YXRpYyB2b2lkIGZ0cmFjZV91bnJlZ19ldmVudF88Y2FsbD4odm9pZCkKLSAqIHsKLSAqCXVucmVnaXN0ZXJfdHJhY2VfPGNhbGw+KGZ0cmFjZV9ldmVudF88Y2FsbD4pOwotICogfQotICoKLSAqIEZvciB0aG9zZSBtYWNyb3MgZGVmaW5lZCB3aXRoIFRSQUNFX0ZPUk1BVDoKLSAqCi0gKiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIF9fdXNlZAotICogX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oNCkpKQotICogX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX2Z0cmFjZV9ldmVudHMiKSkpIGV2ZW50XzxjYWxsPiA9IHsKLSAqCS5uYW1lCQkJPSAiPGNhbGw+IiwKLSAqCS5yZWdmdW5jCQk9IGZ0cmFjZV9yZWdfZXZlbnRfPGNhbGw+LAotICoJLnVucmVnZnVuYwkJPSBmdHJhY2VfdW5yZWdfZXZlbnRfPGNhbGw+LAotICogfQotICoKLSAqCi0gKiBGb3IgdGhvc2UgbWFjcm9zIGRlZmluZWQgd2l0aCBUUkFDRV9FVkVOVDoKLSAqCi0gKiBzdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIGV2ZW50XzxjYWxsPjsKLSAqCi0gKiBzdGF0aWMgdm9pZCBmdHJhY2VfcmF3X2V2ZW50XzxjYWxsPihwcm90bykKLSAqIHsKLSAqCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7Ci0gKglzdHJ1Y3QgZnRyYWNlX3Jhd188Y2FsbD4gKmVudHJ5OyA8LS0gZGVmaW5lZCBpbiBzdGFnZSAxCi0gKgl1bnNpZ25lZCBsb25nIGlycV9mbGFnczsKLSAqCWludCBwYzsKLSAqCi0gKglsb2NhbF9zYXZlX2ZsYWdzKGlycV9mbGFncyk7Ci0gKglwYyA9IHByZWVtcHRfY291bnQoKTsKLSAqCi0gKglldmVudCA9IHRyYWNlX2N1cnJlbnRfYnVmZmVyX2xvY2tfcmVzZXJ2ZShldmVudF88Y2FsbD4uaWQsCi0gKgkJCQkgIHNpemVvZihzdHJ1Y3QgZnRyYWNlX3Jhd188Y2FsbD4pLAotICoJCQkJICBpcnFfZmxhZ3MsIHBjKTsKLSAqCWlmICghZXZlbnQpCi0gKgkJcmV0dXJuOwotICoJZW50cnkJPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsKLSAqCi0gKgk8YXNzaWduPjsgIDwtLSBIZXJlIHdlIGFzc2lnbiB0aGUgZW50cmllcyBieSB0aGUgX19maWVsZCBhbmQKLSAqCQkJX19hcnJheSBtYWNyb3MuCi0gKgotICoJdHJhY2VfY3VycmVudF9idWZmZXJfdW5sb2NrX2NvbW1pdChldmVudCwgaXJxX2ZsYWdzLCBwYyk7Ci0gKiB9Ci0gKgotICogc3RhdGljIGludCBmdHJhY2VfcmF3X3JlZ19ldmVudF88Y2FsbD4odm9pZCkKLSAqIHsKLSAqCWludCByZXQ7Ci0gKgotICoJcmV0ID0gcmVnaXN0ZXJfdHJhY2VfPGNhbGw+KGZ0cmFjZV9yYXdfZXZlbnRfPGNhbGw+KTsKLSAqCWlmICghcmV0KQotICoJCXByX2luZm8oImV2ZW50IHRyYWNlOiBDb3VsZCBub3QgYWN0aXZhdGUgdHJhY2UgcG9pbnQgIgotICoJCQkicHJvYmUgdG8gPGNhbGw+Iik7Ci0gKglyZXR1cm4gcmV0OwotICogfQotICoKLSAqIHN0YXRpYyB2b2lkIGZ0cmFjZV91bnJlZ19ldmVudF88Y2FsbD4odm9pZCkKLSAqIHsKLSAqCXVucmVnaXN0ZXJfdHJhY2VfPGNhbGw+KGZ0cmFjZV9yYXdfZXZlbnRfPGNhbGw+KTsKLSAqIH0KLSAqCi0gKiBzdGF0aWMgc3RydWN0IHRyYWNlX2V2ZW50IGZ0cmFjZV9ldmVudF90eXBlXzxjYWxsPiA9IHsKLSAqCS50cmFjZQkJCT0gZnRyYWNlX3Jhd19vdXRwdXRfPGNhbGw+LCA8LS0gc3RhZ2UgMgotICogfTsKLSAqCi0gKiBzdGF0aWMgaW50IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF88Y2FsbD4odm9pZCkKLSAqIHsKLSAqCWludCBpZDsKLSAqCi0gKglpZCA9IHJlZ2lzdGVyX2Z0cmFjZV9ldmVudCgmZnRyYWNlX2V2ZW50X3R5cGVfPGNhbGw+KTsKLSAqCWlmICghaWQpCi0gKgkJcmV0dXJuIC1FTk9ERVY7Ci0gKglldmVudF88Y2FsbD4uaWQgPSBpZDsKLSAqCXJldHVybiAwOwotICogfQotICoKLSAqIHN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX191c2VkCi0gKiBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg0KSkpCi0gKiBfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfZnRyYWNlX2V2ZW50cyIpKSkgZXZlbnRfPGNhbGw+ID0gewotICoJLm5hbWUJCQk9ICI8Y2FsbD4iLAotICoJLnN5c3RlbQkJCT0gIjxzeXN0ZW0+IiwKLSAqCS5yYXdfaW5pdAkJPSBmdHJhY2VfcmF3X2luaXRfZXZlbnRfPGNhbGw+LAotICoJLnJlZ2Z1bmMJCT0gZnRyYWNlX3JlZ19ldmVudF88Y2FsbD4sCi0gKgkudW5yZWdmdW5jCQk9IGZ0cmFjZV91bnJlZ19ldmVudF88Y2FsbD4sCi0gKgkuc2hvd19mb3JtYXQJCT0gZnRyYWNlX2Zvcm1hdF88Y2FsbD4sCi0gKiB9Ci0gKgotICovCi0KLSN1bmRlZiBUUF9GTVQKLSNkZWZpbmUgVFBfRk1UKGZtdCwgYXJncy4uLikJZm10ICJcbiIsICMjYXJncwotCi0jaWZkZWYgQ09ORklHX0VWRU5UX1BST0ZJTEUKLSNkZWZpbmUgX1RSQUNFX1BST0ZJTEUoY2FsbCwgcHJvdG8sIGFyZ3MpCQkJCVwKLXN0YXRpYyB2b2lkIGZ0cmFjZV9wcm9maWxlXyMjY2FsbChwcm90bykJCQkJXAotewkJCQkJCQkJCVwKLQlleHRlcm4gdm9pZCBwZXJmX3RwY291bnRlcl9ldmVudChpbnQpOwkJCQlcCi0JcGVyZl90cGNvdW50ZXJfZXZlbnQoZXZlbnRfIyNjYWxsLmlkKTsJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBpbnQgZnRyYWNlX3Byb2ZpbGVfZW5hYmxlXyMjY2FsbChzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwpIFwKLXsJCQkJCQkJCQlcCi0JaW50IHJldCA9IDA7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlpZiAoIWF0b21pY19pbmNfcmV0dXJuKCZjYWxsLT5wcm9maWxlX2NvdW50KSkJCQlcCi0JCXJldCA9IHJlZ2lzdGVyX3RyYWNlXyMjY2FsbChmdHJhY2VfcHJvZmlsZV8jI2NhbGwpOwlcCi0JCQkJCQkJCQlcCi0JcmV0dXJuIHJldDsJCQkJCQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyB2b2lkIGZ0cmFjZV9wcm9maWxlX2Rpc2FibGVfIyNjYWxsKHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCkgXAotewkJCQkJCQkJCVwKLQlpZiAoYXRvbWljX2FkZF9uZWdhdGl2ZSgtMSwgJmNhbGwtPnByb2ZpbGVfY291bnQpKQkJXAotCQl1bnJlZ2lzdGVyX3RyYWNlXyMjY2FsbChmdHJhY2VfcHJvZmlsZV8jI2NhbGwpOwkJXAotfQotCi0jZGVmaW5lIF9UUkFDRV9QUk9GSUxFX0lOSVQoY2FsbCkJCQkJCVwKLQkucHJvZmlsZV9jb3VudCA9IEFUT01JQ19JTklUKC0xKSwJCQkJXAotCS5wcm9maWxlX2VuYWJsZSA9IGZ0cmFjZV9wcm9maWxlX2VuYWJsZV8jI2NhbGwsCQkJXAotCS5wcm9maWxlX2Rpc2FibGUgPSBmdHJhY2VfcHJvZmlsZV9kaXNhYmxlXyMjY2FsbCwKLQotI2Vsc2UKLSNkZWZpbmUgX1RSQUNFX1BST0ZJTEUoY2FsbCwgcHJvdG8sIGFyZ3MpCi0jZGVmaW5lIF9UUkFDRV9QUk9GSUxFX0lOSVQoY2FsbCkKLSNlbmRpZgotCi0jZGVmaW5lIF9UUkFDRV9GT1JNQVQoY2FsbCwgcHJvdG8sIGFyZ3MsIGZtdCkJCQkJXAotc3RhdGljIHZvaWQgZnRyYWNlX2V2ZW50XyMjY2FsbChwcm90bykJCQkJCVwKLXsJCQkJCQkJCQlcCi0JZXZlbnRfdHJhY2VfcHJpbnRrKF9SRVRfSVBfLCAjY2FsbCAiOiAiIGZtdCk7CQkJXAotfQkJCQkJCQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyBpbnQgZnRyYWNlX3JlZ19ldmVudF8jI2NhbGwodm9pZCkJCQkJXAotewkJCQkJCQkJCVwKLQlpbnQgcmV0OwkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JcmV0ID0gcmVnaXN0ZXJfdHJhY2VfIyNjYWxsKGZ0cmFjZV9ldmVudF8jI2NhbGwpOwkJXAotCWlmIChyZXQpCQkJCQkJCVwKLQkJcHJfaW5mbygiZXZlbnQgdHJhY2U6IENvdWxkIG5vdCBhY3RpdmF0ZSB0cmFjZSBwb2ludCAiCVwKLQkJCSJwcm9iZSB0byAiICNjYWxsICJcbiIpOwkJCVwKLQlyZXR1cm4gcmV0OwkJCQkJCQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIHZvaWQgZnRyYWNlX3VucmVnX2V2ZW50XyMjY2FsbCh2b2lkKQkJCQlcCi17CQkJCQkJCQkJXAotCXVucmVnaXN0ZXJfdHJhY2VfIyNjYWxsKGZ0cmFjZV9ldmVudF8jI2NhbGwpOwkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdGF0aWMgc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsIGV2ZW50XyMjY2FsbDsJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIGludCBmdHJhY2VfaW5pdF9ldmVudF8jI2NhbGwodm9pZCkJCQkJXAotewkJCQkJCQkJCVwKLQlpbnQgaWQ7CQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JaWQgPSByZWdpc3Rlcl9mdHJhY2VfZXZlbnQoTlVMTCk7CQkJCVwKLQlpZiAoIWlkKQkJCQkJCQlcCi0JCXJldHVybiAtRU5PREVWOwkJCQkJCVwKLQlldmVudF8jI2NhbGwuaWQgPSBpZDsJCQkJCQlcCi0JcmV0dXJuIDA7CQkJCQkJCVwKLX0KLQotI3VuZGVmIFRSQUNFX0ZPUk1BVAotI2RlZmluZSBUUkFDRV9GT1JNQVQoY2FsbCwgcHJvdG8sIGFyZ3MsIGZtdCkJCQkJXAotX1RSQUNFX0ZPUk1BVChjYWxsLCBQQVJBTVMocHJvdG8pLCBQQVJBTVMoYXJncyksIFBBUkFNUyhmbXQpKQkJXAotX1RSQUNFX1BST0ZJTEUoY2FsbCwgUEFSQU1TKHByb3RvKSwgUEFSQU1TKGFyZ3MpKQkJCVwKLXN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX191c2VkCQkJCQlcCi1fX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg0KSkpCQkJCQkJXAotX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX2Z0cmFjZV9ldmVudHMiKSkpIGV2ZW50XyMjY2FsbCA9IHsJCVwKLQkubmFtZQkJCT0gI2NhbGwsCQkJCVwKLQkuc3lzdGVtCQkJPSBfX3N0cmluZ2lmeShUUkFDRV9TWVNURU0pLAkJXAotCS5yYXdfaW5pdAkJPSBmdHJhY2VfaW5pdF9ldmVudF8jI2NhbGwsCQlcCi0JLnJlZ2Z1bmMJCT0gZnRyYWNlX3JlZ19ldmVudF8jI2NhbGwsCQlcCi0JLnVucmVnZnVuYwkJPSBmdHJhY2VfdW5yZWdfZXZlbnRfIyNjYWxsLAkJXAotCV9UUkFDRV9QUk9GSUxFX0lOSVQoY2FsbCkJCQkJCVwKLX0KLQotI3VuZGVmIF9fZW50cnkKLSNkZWZpbmUgX19lbnRyeSBlbnRyeQotCi0jdW5kZWYgVFJBQ0VfRVZFTlQKLSNkZWZpbmUgVFJBQ0VfRVZFTlQoY2FsbCwgcHJvdG8sIGFyZ3MsIHRzdHJ1Y3QsIGFzc2lnbiwgcHJpbnQpCQlcCi1fVFJBQ0VfUFJPRklMRShjYWxsLCBQQVJBTVMocHJvdG8pLCBQQVJBTVMoYXJncykpCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBldmVudF8jI2NhbGw7CQkJCVwKLQkJCQkJCQkJCVwKLXN0YXRpYyB2b2lkIGZ0cmFjZV9yYXdfZXZlbnRfIyNjYWxsKHByb3RvKQkJCQlcCi17CQkJCQkJCQkJXAotCXN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCAqY2FsbCA9ICZldmVudF8jI2NhbGw7CQkJXAotCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CQkJCVwKLQlzdHJ1Y3QgZnRyYWNlX3Jhd18jI2NhbGwgKmVudHJ5OwkJCQlcCi0JdW5zaWduZWQgbG9uZyBpcnFfZmxhZ3M7CQkJCQlcCi0JaW50IHBjOwkJCQkJCQkJXAotCQkJCQkJCQkJXAotCWxvY2FsX3NhdmVfZmxhZ3MoaXJxX2ZsYWdzKTsJCQkJCVwKLQlwYyA9IHByZWVtcHRfY291bnQoKTsJCQkJCQlcCi0JCQkJCQkJCQlcCi0JZXZlbnQgPSB0cmFjZV9jdXJyZW50X2J1ZmZlcl9sb2NrX3Jlc2VydmUoZXZlbnRfIyNjYWxsLmlkLAlcCi0JCQkJICBzaXplb2Yoc3RydWN0IGZ0cmFjZV9yYXdfIyNjYWxsKSwJXAotCQkJCSAgaXJxX2ZsYWdzLCBwYyk7CQkJXAotCWlmICghZXZlbnQpCQkJCQkJCVwKLQkJcmV0dXJuOwkJCQkJCQlcCi0JZW50cnkJPSByaW5nX2J1ZmZlcl9ldmVudF9kYXRhKGV2ZW50KTsJCQlcCi0JCQkJCQkJCQlcCi0JYXNzaWduOwkJCQkJCQkJXAotCQkJCQkJCQkJXAotCWlmIChjYWxsLT5wcmVkcyAmJiAhZmlsdGVyX21hdGNoX3ByZWRzKGNhbGwsIGVudHJ5KSkJCVwKLQkJcmluZ19idWZmZXJfZXZlbnRfZGlzY2FyZChldmVudCk7CQkJXAotCQkJCQkJCQkJXAotCXRyYWNlX25vd2FrZV9idWZmZXJfdW5sb2NrX2NvbW1pdChldmVudCwgaXJxX2ZsYWdzLCBwYyk7CVwKLQkJCQkJCQkJCVwKLX0JCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdGF0aWMgaW50IGZ0cmFjZV9yYXdfcmVnX2V2ZW50XyMjY2FsbCh2b2lkKQkJCQlcCi17CQkJCQkJCQkJXAotCWludCByZXQ7CQkJCQkJCVwKLQkJCQkJCQkJCVwKLQlyZXQgPSByZWdpc3Rlcl90cmFjZV8jI2NhbGwoZnRyYWNlX3Jhd19ldmVudF8jI2NhbGwpOwkJXAotCWlmIChyZXQpCQkJCQkJCVwKLQkJcHJfaW5mbygiZXZlbnQgdHJhY2U6IENvdWxkIG5vdCBhY3RpdmF0ZSB0cmFjZSBwb2ludCAiCVwKLQkJCSJwcm9iZSB0byAiICNjYWxsICJcbiIpOwkJCVwKLQlyZXR1cm4gcmV0OwkJCQkJCQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIHZvaWQgZnRyYWNlX3Jhd191bnJlZ19ldmVudF8jI2NhbGwodm9pZCkJCQkJXAotewkJCQkJCQkJCVwKLQl1bnJlZ2lzdGVyX3RyYWNlXyMjY2FsbChmdHJhY2VfcmF3X2V2ZW50XyMjY2FsbCk7CQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIHN0cnVjdCB0cmFjZV9ldmVudCBmdHJhY2VfZXZlbnRfdHlwZV8jI2NhbGwgPSB7CQkJXAotCS50cmFjZQkJCT0gZnRyYWNlX3Jhd19vdXRwdXRfIyNjYWxsLAkJXAotfTsJCQkJCQkJCQlcCi0JCQkJCQkJCQlcCi1zdGF0aWMgaW50IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwodm9pZCkJCQkJXAotewkJCQkJCQkJCVwKLQlpbnQgaWQ7CQkJCQkJCQlcCi0JCQkJCQkJCQlcCi0JaWQgPSByZWdpc3Rlcl9mdHJhY2VfZXZlbnQoJmZ0cmFjZV9ldmVudF90eXBlXyMjY2FsbCk7CQlcCi0JaWYgKCFpZCkJCQkJCQkJXAotCQlyZXR1cm4gLUVOT0RFVjsJCQkJCQlcCi0JZXZlbnRfIyNjYWxsLmlkID0gaWQ7CQkJCQkJXAotCUlOSVRfTElTVF9IRUFEKCZldmVudF8jI2NhbGwuZmllbGRzKTsJCQkJXAotCXJldHVybiAwOwkJCQkJCQlcCi19CQkJCQkJCQkJXAotCQkJCQkJCQkJXAotc3RhdGljIHN0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3VzZWQJCQkJCVwKLV9fYXR0cmlidXRlX18oKF9fYWxpZ25lZF9fKDQpKSkJCQkJCQlcCi1fX2F0dHJpYnV0ZV9fKChzZWN0aW9uKCJfZnRyYWNlX2V2ZW50cyIpKSkgZXZlbnRfIyNjYWxsID0gewkJXAotCS5uYW1lCQkJPSAjY2FsbCwJCQkJXAotCS5zeXN0ZW0JCQk9IF9fc3RyaW5naWZ5KFRSQUNFX1NZU1RFTSksCQlcCi0JLnJhd19pbml0CQk9IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwsCQlcCi0JLnJlZ2Z1bmMJCT0gZnRyYWNlX3Jhd19yZWdfZXZlbnRfIyNjYWxsLAkJXAotCS51bnJlZ2Z1bmMJCT0gZnRyYWNlX3Jhd191bnJlZ19ldmVudF8jI2NhbGwsCVwKLQkuc2hvd19mb3JtYXQJCT0gZnRyYWNlX2Zvcm1hdF8jI2NhbGwsCQkJXAotCS5kZWZpbmVfZmllbGRzCQk9IGZ0cmFjZV9kZWZpbmVfZmllbGRzXyMjY2FsbCwJCVwKLQlfVFJBQ0VfUFJPRklMRV9JTklUKGNhbGwpCQkJCQlcCi19Ci0KLSNpbmNsdWRlIDx0cmFjZS90cmFjZV9ldmVudF90eXBlcy5oPgotCi0jdW5kZWYgX1RSQUNFX1BST0ZJTEUKLSN1bmRlZiBfVFJBQ0VfUFJPRklMRV9JTklUCi0KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYyBiL2tlcm5lbC90cmFjZS90cmFjZV9leHBvcnQuYwppbmRleCAwN2EyMmMzLi5kMDZjZjg5IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZXhwb3J0LmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2V4cG9ydC5jCkBAIC0xOSw4ICsxOSwxMiBAQAogI3VuZGVmIFRSQUNFX1NUUlVDVAogI2RlZmluZSBUUkFDRV9TVFJVQ1QoYXJncy4uLikgYXJncwogCitleHRlcm4gdm9pZCBfX2JhZF90eXBlX3NpemUodm9pZCk7CisKICN1bmRlZiBUUkFDRV9GSUVMRAogI2RlZmluZSBUUkFDRV9GSUVMRCh0eXBlLCBpdGVtLCBhc3NpZ24pCQkJCQlcCisJaWYgKHNpemVvZih0eXBlKSAhPSBzaXplb2YoZmllbGQuaXRlbSkpCQkJCVwKKwkJX19iYWRfdHlwZV9zaXplKCk7CQkJCQlcCiAJcmV0ID0gdHJhY2Vfc2VxX3ByaW50ZihzLCAiXHRmaWVsZDoiICN0eXBlICIgIiAjaXRlbSAiO1x0IglcCiAJCQkgICAgICAgIm9mZnNldDoldTtcdHNpemU6JXU7XG4iLAkJXAogCQkJICAgICAgICh1bnNpZ25lZCBpbnQpb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksIFwKQEAgLTMwLDcgKzM0LDcgQEAKIAogCiAjdW5kZWYgVFJBQ0VfRklFTERfU1BFQ0lBTAotI2RlZmluZSBUUkFDRV9GSUVMRF9TUEVDSUFMKHR5cGVfaXRlbSwgaXRlbSwgY21kKQkJCVwKKyNkZWZpbmUgVFJBQ0VfRklFTERfU1BFQ0lBTCh0eXBlX2l0ZW0sIGl0ZW0sIGxlbiwgY21kKQkJCVwKIAlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJcdGZpZWxkIHNwZWNpYWw6IiAjdHlwZV9pdGVtICI7XHQiCVwKIAkJCSAgICAgICAib2Zmc2V0OiV1O1x0c2l6ZToldTtcbiIsCQlcCiAJCQkgICAgICAgKHVuc2lnbmVkIGludClvZmZzZXRvZih0eXBlb2YoZmllbGQpLCBpdGVtKSwgXApAQCAtNDYsNiArNTAsOSBAQAogCWlmICghcmV0KQkJCQkJCQlcCiAJCXJldHVybiAwOwogCisjdW5kZWYgVFJBQ0VfRklFTERfU0lHTgorI2RlZmluZSBUUkFDRV9GSUVMRF9TSUdOKHR5cGUsIGl0ZW0sIGFzc2lnbiwgaXNfc2lnbmVkKQlcCisJVFJBQ0VfRklFTEQodHlwZSwgaXRlbSwgYXNzaWduKQogCiAjdW5kZWYgVFBfUkFXX0ZNVAogI2RlZmluZSBUUF9SQVdfRk1UKGFyZ3MuLi4pIGFyZ3MKQEAgLTY1LDYgKzcyLDIyIEBACiAJcmV0dXJuIHJldDsJCQkJCQkJXAogfQogCisjdW5kZWYgVFJBQ0VfRVZFTlRfRk9STUFUX05PRklMVEVSCisjZGVmaW5lIFRSQUNFX0VWRU5UX0ZPUk1BVF9OT0ZJTFRFUihjYWxsLCBwcm90bywgYXJncywgZm10LCB0c3RydWN0LAlcCisJCQkJICAgIHRwZm10KQkJCQlcCitzdGF0aWMgaW50CQkJCQkJCQlcCitmdHJhY2VfZm9ybWF0XyMjY2FsbChzdHJ1Y3QgdHJhY2Vfc2VxICpzKQkJCQlcCit7CQkJCQkJCQkJXAorCXN0cnVjdCBhcmdzIGZpZWxkOwkJCQkJCVwKKwlpbnQgcmV0OwkJCQkJCQlcCisJCQkJCQkJCQlcCisJdHN0cnVjdDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCXRyYWNlX3NlcV9wcmludGYocywgIlxucHJpbnQgZm10OiBcIiVzXCJcbiIsIHRwZm10KTsJCVwKKwkJCQkJCQkJCVwKKwlyZXR1cm4gcmV0OwkJCQkJCQlcCit9CisKICNpbmNsdWRlICJ0cmFjZV9ldmVudF90eXBlcy5oIgogCiAjdW5kZWYgVFJBQ0VfWkVST19DSEFSCkBAIC03OCw2ICsxMDEsMTAgQEAKICNkZWZpbmUgVFJBQ0VfRklFTEQodHlwZSwgaXRlbSwgYXNzaWduKVwKIAllbnRyeS0+aXRlbSA9IGFzc2lnbjsKIAorI3VuZGVmIFRSQUNFX0ZJRUxEX1NJR04KKyNkZWZpbmUgVFJBQ0VfRklFTERfU0lHTih0eXBlLCBpdGVtLCBhc3NpZ24sIGlzX3NpZ25lZCkJXAorCVRSQUNFX0ZJRUxEKHR5cGUsIGl0ZW0sIGFzc2lnbikKKwogI3VuZGVmIFRQX0NNRAogI2RlZmluZSBUUF9DTUQoY21kLi4uKQljbWQKIApAQCAtODUsMTggKzExMiw5NSBAQAogI2RlZmluZSBUUkFDRV9FTlRSWQllbnRyeQogCiAjdW5kZWYgVFJBQ0VfRklFTERfU1BFQ0lBTAotI2RlZmluZSBUUkFDRV9GSUVMRF9TUEVDSUFMKHR5cGVfaXRlbSwgaXRlbSwgY21kKSBcCisjZGVmaW5lIFRSQUNFX0ZJRUxEX1NQRUNJQUwodHlwZV9pdGVtLCBpdGVtLCBsZW4sIGNtZCkJXAogCWNtZDsKIAogI3VuZGVmIFRSQUNFX0VWRU5UX0ZPUk1BVAogI2RlZmluZSBUUkFDRV9FVkVOVF9GT1JNQVQoY2FsbCwgcHJvdG8sIGFyZ3MsIGZtdCwgdHN0cnVjdCwgdHBmbXQpCVwKK2ludCBmdHJhY2VfZGVmaW5lX2ZpZWxkc18jI2NhbGwodm9pZCk7CQkJCQlcCitzdGF0aWMgaW50IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwodm9pZCk7CQkJCVwKIAkJCQkJCQkJCVwKLXN0YXRpYyBzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX191c2VkCQkJCQlcCitzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgX191c2VkCQkJCQkJXAorX19hdHRyaWJ1dGVfXygoX19hbGlnbmVkX18oNCkpKQkJCQkJCVwKK19fYXR0cmlidXRlX18oKHNlY3Rpb24oIl9mdHJhY2VfZXZlbnRzIikpKSBldmVudF8jI2NhbGwgPSB7CQlcCisJLm5hbWUJCQk9ICNjYWxsLAkJCQlcCisJLmlkCQkJPSBwcm90bywJCQkJXAorCS5zeXN0ZW0JCQk9IF9fc3RyaW5naWZ5KFRSQUNFX1NZU1RFTSksCQlcCisJLnJhd19pbml0CQk9IGZ0cmFjZV9yYXdfaW5pdF9ldmVudF8jI2NhbGwsCQlcCisJLnNob3dfZm9ybWF0CQk9IGZ0cmFjZV9mb3JtYXRfIyNjYWxsLAkJCVwKKwkuZGVmaW5lX2ZpZWxkcwkJPSBmdHJhY2VfZGVmaW5lX2ZpZWxkc18jI2NhbGwsCQlcCit9OwkJCQkJCQkJCVwKK3N0YXRpYyBpbnQgZnRyYWNlX3Jhd19pbml0X2V2ZW50XyMjY2FsbCh2b2lkKQkJCQlcCit7CQkJCQkJCQkJXAorCUlOSVRfTElTVF9IRUFEKCZldmVudF8jI2NhbGwuZmllbGRzKTsJCQkJXAorCWluaXRfcHJlZHMoJmV2ZW50XyMjY2FsbCk7CQkJCQlcCisJcmV0dXJuIDA7CQkJCQkJCVwKK30JCQkJCQkJCQlcCisKKyN1bmRlZiBUUkFDRV9FVkVOVF9GT1JNQVRfTk9GSUxURVIKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRk9STUFUX05PRklMVEVSKGNhbGwsIHByb3RvLCBhcmdzLCBmbXQsIHRzdHJ1Y3QsCVwKKwkJCQkgICAgdHBmbXQpCQkJCVwKKwkJCQkJCQkJCVwKK3N0cnVjdCBmdHJhY2VfZXZlbnRfY2FsbCBfX3VzZWQJCQkJCQlcCiBfX2F0dHJpYnV0ZV9fKChfX2FsaWduZWRfXyg0KSkpCQkJCQkJXAogX19hdHRyaWJ1dGVfXygoc2VjdGlvbigiX2Z0cmFjZV9ldmVudHMiKSkpIGV2ZW50XyMjY2FsbCA9IHsJCVwKIAkubmFtZQkJCT0gI2NhbGwsCQkJCVwKIAkuaWQJCQk9IHByb3RvLAkJCQlcCiAJLnN5c3RlbQkJCT0gX19zdHJpbmdpZnkoVFJBQ0VfU1lTVEVNKSwJCVwKIAkuc2hvd19mb3JtYXQJCT0gZnRyYWNlX2Zvcm1hdF8jI2NhbGwsCQkJXAorfTsKKworI2luY2x1ZGUgInRyYWNlX2V2ZW50X3R5cGVzLmgiCisKKyN1bmRlZiBUUkFDRV9GSUVMRAorI2RlZmluZSBUUkFDRV9GSUVMRCh0eXBlLCBpdGVtLCBhc3NpZ24pCQkJCQlcCisJcmV0ID0gdHJhY2VfZGVmaW5lX2ZpZWxkKGV2ZW50X2NhbGwsICN0eXBlLCAjaXRlbSwJCVwKKwkJCQkgb2Zmc2V0b2YodHlwZW9mKGZpZWxkKSwgaXRlbSksCQlcCisJCQkJIHNpemVvZihmaWVsZC5pdGVtKSwgaXNfc2lnbmVkX3R5cGUodHlwZSkpOwlcCisJaWYgKHJldCkJCQkJCQkJXAorCQlyZXR1cm4gcmV0OworCisjdW5kZWYgVFJBQ0VfRklFTERfU1BFQ0lBTAorI2RlZmluZSBUUkFDRV9GSUVMRF9TUEVDSUFMKHR5cGUsIGl0ZW0sIGxlbiwgY21kKQkJCVwKKwlyZXQgPSB0cmFjZV9kZWZpbmVfZmllbGQoZXZlbnRfY2FsbCwgI3R5cGUgIlsiICNsZW4gIl0iLCAjaXRlbSwJXAorCQkJCSBvZmZzZXRvZih0eXBlb2YoZmllbGQpLCBpdGVtKSwJCVwKKwkJCQkgc2l6ZW9mKGZpZWxkLml0ZW0pLCAwKTsJCVwKKwlpZiAocmV0KQkJCQkJCQlcCisJCXJldHVybiByZXQ7CisKKyN1bmRlZiBUUkFDRV9GSUVMRF9TSUdOCisjZGVmaW5lIFRSQUNFX0ZJRUxEX1NJR04odHlwZSwgaXRlbSwgYXNzaWduLCBpc19zaWduZWQpCQkJXAorCXJldCA9IHRyYWNlX2RlZmluZV9maWVsZChldmVudF9jYWxsLCAjdHlwZSwgI2l0ZW0sCQlcCisJCQkJIG9mZnNldG9mKHR5cGVvZihmaWVsZCksIGl0ZW0pLAkJXAorCQkJCSBzaXplb2YoZmllbGQuaXRlbSksIGlzX3NpZ25lZCk7CVwKKwlpZiAocmV0KQkJCQkJCQlcCisJCXJldHVybiByZXQ7CisKKyN1bmRlZiBUUkFDRV9GSUVMRF9aRVJPX0NIQVIKKyNkZWZpbmUgVFJBQ0VfRklFTERfWkVST19DSEFSKGl0ZW0pCisKKyN1bmRlZiBUUkFDRV9FVkVOVF9GT1JNQVQKKyNkZWZpbmUgVFJBQ0VfRVZFTlRfRk9STUFUKGNhbGwsIHByb3RvLCBhcmdzLCBmbXQsIHRzdHJ1Y3QsIHRwZm10KQlcCitpbnQJCQkJCQkJCQlcCitmdHJhY2VfZGVmaW5lX2ZpZWxkc18jI2NhbGwodm9pZCkJCQkJCVwKK3sJCQkJCQkJCQlcCisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpldmVudF9jYWxsID0gJmV2ZW50XyMjY2FsbDsJCVwKKwlzdHJ1Y3QgYXJncyBmaWVsZDsJCQkJCQlcCisJaW50IHJldDsJCQkJCQkJXAorCQkJCQkJCQkJXAorCV9fY29tbW9uX2ZpZWxkKHVuc2lnbmVkIGNoYXIsIHR5cGUsIDApOwkJCQlcCisJX19jb21tb25fZmllbGQodW5zaWduZWQgY2hhciwgZmxhZ3MsIDApOwkJCVwKKwlfX2NvbW1vbl9maWVsZCh1bnNpZ25lZCBjaGFyLCBwcmVlbXB0X2NvdW50LCAwKTsJCVwKKwlfX2NvbW1vbl9maWVsZChpbnQsIHBpZCwgMSk7CQkJCQlcCisJX19jb21tb25fZmllbGQoaW50LCB0Z2lkLCAxKTsJCQkJCVwKKwkJCQkJCQkJCVwKKwl0c3RydWN0OwkJCQkJCQlcCisJCQkJCQkJCQlcCisJcmV0dXJuIHJldDsJCQkJCQkJXAogfQorCisjdW5kZWYgVFJBQ0VfRVZFTlRfRk9STUFUX05PRklMVEVSCisjZGVmaW5lIFRSQUNFX0VWRU5UX0ZPUk1BVF9OT0ZJTFRFUihjYWxsLCBwcm90bywgYXJncywgZm10LCB0c3RydWN0LAlcCisJCQkJICAgIHRwZm10KQorCiAjaW5jbHVkZSAidHJhY2VfZXZlbnRfdHlwZXMuaCIKZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYyBiL2tlcm5lbC90cmFjZS90cmFjZV9mdW5jdGlvbnNfZ3JhcGguYwppbmRleCBkMjg2ODdlLi44YjU5MjQxIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfZnVuY3Rpb25zX2dyYXBoLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX2Z1bmN0aW9uc19ncmFwaC5jCkBAIC02NSw2ICs2NSwxMiBAQAogCWlmICghY3VycmVudC0+cmV0X3N0YWNrKQogCQlyZXR1cm4gLUVCVVNZOwogCisJLyoKKwkgKiBXZSBtdXN0IG1ha2Ugc3VyZSB0aGUgcmV0X3N0YWNrIGlzIHRlc3RlZCBiZWZvcmUgd2UgcmVhZAorCSAqIGFueXRoaW5nIGVsc2UuCisJICovCisJc21wX3JtYigpOworCiAJLyogVGhlIHJldHVybiB0cmFjZSBzdGFjayBpcyBmdWxsICovCiAJaWYgKGN1cnJlbnQtPmN1cnJfcmV0X3N0YWNrID09IEZUUkFDRV9SRVRGVU5DX0RFUFRIIC0gMSkgewogCQlhdG9taWNfaW5jKCZjdXJyZW50LT50cmFjZV9vdmVycnVuKTsKQEAgLTc4LDEzICs4NCwxNCBAQAogCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0ucmV0ID0gcmV0OwogCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0uZnVuYyA9IGZ1bmM7CiAJY3VycmVudC0+cmV0X3N0YWNrW2luZGV4XS5jYWxsdGltZSA9IGNhbGx0aW1lOworCWN1cnJlbnQtPnJldF9zdGFja1tpbmRleF0uc3VidGltZSA9IDA7CiAJKmRlcHRoID0gaW5kZXg7CiAKIAlyZXR1cm4gMDsKIH0KIAogLyogUmV0cmlldmUgYSBmdW5jdGlvbiByZXR1cm4gYWRkcmVzcyB0byB0aGUgdHJhY2Ugc3RhY2sgb24gdGhyZWFkIGluZm8uKi8KLXZvaWQKK3N0YXRpYyB2b2lkCiBmdHJhY2VfcG9wX3JldHVybl90cmFjZShzdHJ1Y3QgZnRyYWNlX2dyYXBoX3JldCAqdHJhY2UsIHVuc2lnbmVkIGxvbmcgKnJldCkKIHsKIAlpbnQgaW5kZXg7CkBAIC0xMDQsOSArMTExLDYgQEAKIAl0cmFjZS0+Y2FsbHRpbWUgPSBjdXJyZW50LT5yZXRfc3RhY2tbaW5kZXhdLmNhbGx0aW1lOwogCXRyYWNlLT5vdmVycnVuID0gYXRvbWljX3JlYWQoJmN1cnJlbnQtPnRyYWNlX292ZXJydW4pOwogCXRyYWNlLT5kZXB0aCA9IGluZGV4OwotCWJhcnJpZXIoKTsKLQljdXJyZW50LT5jdXJyX3JldF9zdGFjay0tOwotCiB9CiAKIC8qCkBAIC0xMjEsNiArMTI1LDggQEAKIAlmdHJhY2VfcG9wX3JldHVybl90cmFjZSgmdHJhY2UsICZyZXQpOwogCXRyYWNlLnJldHRpbWUgPSB0cmFjZV9jbG9ja19sb2NhbCgpOwogCWZ0cmFjZV9ncmFwaF9yZXR1cm4oJnRyYWNlKTsKKwliYXJyaWVyKCk7CisJY3VycmVudC0+Y3Vycl9yZXRfc3RhY2stLTsKIAogCWlmICh1bmxpa2VseSghcmV0KSkgewogCQlmdHJhY2VfZ3JhcGhfc3RvcCgpOwpAQCAtNDI2LDggKzQzMiw4IEBACiAJcmV0dXJuIFRSQUNFX1RZUEVfSEFORExFRDsKIH0KIAotc3RhdGljIGVudW0gcHJpbnRfbGluZV90Ci1wcmludF9ncmFwaF9kdXJhdGlvbih1bnNpZ25lZCBsb25nIGxvbmcgZHVyYXRpb24sIHN0cnVjdCB0cmFjZV9zZXEgKnMpCitlbnVtIHByaW50X2xpbmVfdAordHJhY2VfcHJpbnRfZ3JhcGhfZHVyYXRpb24odW5zaWduZWQgbG9uZyBsb25nIGR1cmF0aW9uLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKQogewogCXVuc2lnbmVkIGxvbmcgbnNlY3NfcmVtID0gZG9fZGl2KGR1cmF0aW9uLCAxMDAwKTsKIAkvKiBsb2cxMChVTE9OR19NQVgpICsgJ1wwJyAqLwpAQCAtNDY0LDEyICs0NzAsMjMgQEAKIAkJaWYgKCFyZXQpCiAJCQlyZXR1cm4gVFJBQ0VfVFlQRV9QQVJUSUFMX0xJTkU7CiAJfQorCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7Cit9CisKK3N0YXRpYyBlbnVtIHByaW50X2xpbmVfdAorcHJpbnRfZ3JhcGhfZHVyYXRpb24odW5zaWduZWQgbG9uZyBsb25nIGR1cmF0aW9uLCBzdHJ1Y3QgdHJhY2Vfc2VxICpzKQoreworCWludCByZXQ7CisKKwlyZXQgPSB0cmFjZV9wcmludF9ncmFwaF9kdXJhdGlvbihkdXJhdGlvbiwgcyk7CisJaWYgKHJldCAhPSBUUkFDRV9UWVBFX0hBTkRMRUQpCisJCXJldHVybiByZXQ7CiAKIAlyZXQgPSB0cmFjZV9zZXFfcHJpbnRmKHMsICJ8ICAiKTsKIAlpZiAoIXJldCkKIAkJcmV0dXJuIFRSQUNFX1RZUEVfUEFSVElBTF9MSU5FOwotCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7CiAKKwlyZXR1cm4gVFJBQ0VfVFlQRV9IQU5ETEVEOwogfQogCiAvKiBDYXNlIG9mIGEgbGVhZiBmdW5jdGlvbiBvbiBpdHMgY2FsbCBlbnRyeSAqLwpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX2h3X2JyYW5jaGVzLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfaHdfYnJhbmNoZXMuYwppbmRleCA3YmZkZjRjLi5jYTdkN2M0IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfaHdfYnJhbmNoZXMuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfaHdfYnJhbmNoZXMuYwpAQCAtMSwxMCArMSw5IEBACiAvKgotICogaC93IGJyYW5jaCB0cmFjZXIgZm9yIHg4NiBiYXNlZCBvbiBidHMKKyAqIGgvdyBicmFuY2ggdHJhY2VyIGZvciB4ODYgYmFzZWQgb24gQlRTCiAgKgogICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgSW50ZWwgQ29ycG9yYXRpb24uCiAgKiBNYXJrdXMgTWV0emdlciA8bWFya3VzLnQubWV0emdlckBnbWFpbC5jb20+LCAyMDA4LTIwMDkKICAqLwotI2luY2x1ZGUgPGxpbnV4L3NwaW5sb2NrLmg+CiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CiAjaW5jbHVkZSA8bGludXgvZnRyYWNlLmg+CkBAIC0xNSwxMTAgKzE0LDExOSBAQAogCiAjaW5jbHVkZSA8YXNtL2RzLmg+CiAKLSNpbmNsdWRlICJ0cmFjZS5oIgogI2luY2x1ZGUgInRyYWNlX291dHB1dC5oIgorI2luY2x1ZGUgInRyYWNlLmgiCiAKIAotI2RlZmluZSBTSVpFT0ZfQlRTICgxIDw8IDEzKQorI2RlZmluZSBCVFNfQlVGRkVSX1NJWkUgKDEgPDwgMTMpCiAKLS8qCi0gKiBUaGUgdHJhY2VyIGxvY2sgcHJvdGVjdHMgdGhlIGJlbG93IHBlci1jcHUgdHJhY2VyIGFycmF5LgotICogSXQgbmVlZHMgdG8gYmUgaGVsZCB0bzoKLSAqIC0gc3RhcnQgdHJhY2luZyBvbiBhbGwgY3B1cwotICogLSBzdG9wIHRyYWNpbmcgb24gYWxsIGNwdXMKLSAqIC0gc3RhcnQgdHJhY2luZyBvbiBhIHNpbmdsZSBob3RwbHVnIGNwdQotICogLSBzdG9wIHRyYWNpbmcgb24gYSBzaW5nbGUgaG90cGx1ZyBjcHUKLSAqIC0gcmVhZCB0aGUgdHJhY2UgZnJvbSBhbGwgY3B1cwotICogLSByZWFkIHRoZSB0cmFjZSBmcm9tIGEgc2luZ2xlIGNwdQotICovCi1zdGF0aWMgREVGSU5FX1NQSU5MT0NLKGJ0c190cmFjZXJfbG9jayk7CiBzdGF0aWMgREVGSU5FX1BFUl9DUFUoc3RydWN0IGJ0c190cmFjZXIgKiwgdHJhY2VyKTsKLXN0YXRpYyBERUZJTkVfUEVSX0NQVSh1bnNpZ25lZCBjaGFyW1NJWkVPRl9CVFNdLCBidWZmZXIpOworc3RhdGljIERFRklORV9QRVJfQ1BVKHVuc2lnbmVkIGNoYXJbQlRTX0JVRkZFUl9TSVpFXSwgYnVmZmVyKTsKIAogI2RlZmluZSB0aGlzX3RyYWNlciBwZXJfY3B1KHRyYWNlciwgc21wX3Byb2Nlc3Nvcl9pZCgpKQotI2RlZmluZSB0aGlzX2J1ZmZlciBwZXJfY3B1KGJ1ZmZlciwgc21wX3Byb2Nlc3Nvcl9pZCgpKQogCi1zdGF0aWMgaW50IF9fcmVhZF9tb3N0bHkgdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZDsKK3N0YXRpYyBpbnQgdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZCBfX3JlYWRfbW9zdGx5Oworc3RhdGljIGludCB0cmFjZV9od19icmFuY2hlc19zdXNwZW5kZWQgX19yZWFkX21vc3RseTsKIHN0YXRpYyBzdHJ1Y3QgdHJhY2VfYXJyYXkgKmh3X2JyYW5jaF90cmFjZSBfX3JlYWRfbW9zdGx5OwogCiAKLS8qCi0gKiBTdGFydCB0cmFjaW5nIG9uIHRoZSBjdXJyZW50IGNwdS4KLSAqIFRoZSBhcmd1bWVudCBpcyBpZ25vcmVkLgotICoKLSAqIHByZTogYnRzX3RyYWNlcl9sb2NrIG11c3QgYmUgbG9ja2VkLgotICovCi1zdGF0aWMgdm9pZCBidHNfdHJhY2Vfc3RhcnRfY3B1KHZvaWQgKmFyZykKK3N0YXRpYyB2b2lkIGJ0c190cmFjZV9pbml0X2NwdShpbnQgY3B1KQogewotCWlmICh0aGlzX3RyYWNlcikKLQkJZHNfcmVsZWFzZV9idHModGhpc190cmFjZXIpOworCXBlcl9jcHUodHJhY2VyLCBjcHUpID0KKwkJZHNfcmVxdWVzdF9idHNfY3B1KGNwdSwgcGVyX2NwdShidWZmZXIsIGNwdSksIEJUU19CVUZGRVJfU0laRSwKKwkJCQkgICBOVUxMLCAoc2l6ZV90KS0xLCBCVFNfS0VSTkVMKTsKIAotCXRoaXNfdHJhY2VyID0KLQkJZHNfcmVxdWVzdF9idHMoLyogdGFzayA9ICovIE5VTEwsIHRoaXNfYnVmZmVyLCBTSVpFT0ZfQlRTLAotCQkJICAgICAgIC8qIG92ZmwgPSAqLyBOVUxMLCAvKiB0aCA9ICovIChzaXplX3QpLTEsCi0JCQkgICAgICAgQlRTX0tFUk5FTCk7Ci0JaWYgKElTX0VSUih0aGlzX3RyYWNlcikpIHsKLQkJdGhpc190cmFjZXIgPSBOVUxMOwotCQlyZXR1cm47CisJaWYgKElTX0VSUihwZXJfY3B1KHRyYWNlciwgY3B1KSkpCisJCXBlcl9jcHUodHJhY2VyLCBjcHUpID0gTlVMTDsKK30KKworc3RhdGljIGludCBidHNfdHJhY2VfaW5pdChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQoreworCWludCBjcHU7CisKKwlod19icmFuY2hfdHJhY2UgPSB0cjsKKwl0cmFjZV9od19icmFuY2hlc19lbmFibGVkID0gMDsKKworCWdldF9vbmxpbmVfY3B1cygpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KSB7CisJCWJ0c190cmFjZV9pbml0X2NwdShjcHUpOworCisJCWlmIChsaWtlbHkocGVyX2NwdSh0cmFjZXIsIGNwdSkpKQorCQkJdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZCA9IDE7CiAJfQorCXRyYWNlX2h3X2JyYW5jaGVzX3N1c3BlbmRlZCA9IDA7CisJcHV0X29ubGluZV9jcHVzKCk7CisKKwkvKiBJZiB3ZSBjb3VsZCBub3QgZW5hYmxlIHRyYWNpbmcgb24gYSBzaW5nbGUgY3B1LCB3ZSBmYWlsLiAqLworCXJldHVybiB0cmFjZV9od19icmFuY2hlc19lbmFibGVkID8gMCA6IC1FT1BOT1RTVVBQOworfQorCitzdGF0aWMgdm9pZCBidHNfdHJhY2VfcmVzZXQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKK3sKKwlpbnQgY3B1OworCisJZ2V0X29ubGluZV9jcHVzKCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpIHsKKwkJaWYgKGxpa2VseShwZXJfY3B1KHRyYWNlciwgY3B1KSkpIHsKKwkJCWRzX3JlbGVhc2VfYnRzKHBlcl9jcHUodHJhY2VyLCBjcHUpKTsKKwkJCXBlcl9jcHUodHJhY2VyLCBjcHUpID0gTlVMTDsKKwkJfQorCX0KKwl0cmFjZV9od19icmFuY2hlc19lbmFibGVkID0gMDsKKwl0cmFjZV9od19icmFuY2hlc19zdXNwZW5kZWQgPSAwOworCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCiBzdGF0aWMgdm9pZCBidHNfdHJhY2Vfc3RhcnQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKIHsKLQlzcGluX2xvY2soJmJ0c190cmFjZXJfbG9jayk7CisJaW50IGNwdTsKIAotCW9uX2VhY2hfY3B1KGJ0c190cmFjZV9zdGFydF9jcHUsIE5VTEwsIDEpOwotCXRyYWNlX2h3X2JyYW5jaGVzX2VuYWJsZWQgPSAxOwotCi0Jc3Bpbl91bmxvY2soJmJ0c190cmFjZXJfbG9jayk7Ci19Ci0KLS8qCi0gKiBTdG9wIHRyYWNpbmcgb24gdGhlIGN1cnJlbnQgY3B1LgotICogVGhlIGFyZ3VtZW50IGlzIGlnbm9yZWQuCi0gKgotICogcHJlOiBidHNfdHJhY2VyX2xvY2sgbXVzdCBiZSBsb2NrZWQuCi0gKi8KLXN0YXRpYyB2b2lkIGJ0c190cmFjZV9zdG9wX2NwdSh2b2lkICphcmcpCi17Ci0JaWYgKHRoaXNfdHJhY2VyKSB7Ci0JCWRzX3JlbGVhc2VfYnRzKHRoaXNfdHJhY2VyKTsKLQkJdGhpc190cmFjZXIgPSBOVUxMOwotCX0KKwlnZXRfb25saW5lX2NwdXMoKTsKKwlmb3JfZWFjaF9vbmxpbmVfY3B1KGNwdSkKKwkJaWYgKGxpa2VseShwZXJfY3B1KHRyYWNlciwgY3B1KSkpCisJCQlkc19yZXN1bWVfYnRzKHBlcl9jcHUodHJhY2VyLCBjcHUpKTsKKwl0cmFjZV9od19icmFuY2hlc19zdXNwZW5kZWQgPSAwOworCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCiBzdGF0aWMgdm9pZCBidHNfdHJhY2Vfc3RvcChzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQogewotCXNwaW5fbG9jaygmYnRzX3RyYWNlcl9sb2NrKTsKKwlpbnQgY3B1OwogCi0JdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZCA9IDA7Ci0Jb25fZWFjaF9jcHUoYnRzX3RyYWNlX3N0b3BfY3B1LCBOVUxMLCAxKTsKLQotCXNwaW5fdW5sb2NrKCZidHNfdHJhY2VyX2xvY2spOworCWdldF9vbmxpbmVfY3B1cygpOworCWZvcl9lYWNoX29ubGluZV9jcHUoY3B1KQorCQlpZiAobGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKKwkJCWRzX3N1c3BlbmRfYnRzKHBlcl9jcHUodHJhY2VyLCBjcHUpKTsKKwl0cmFjZV9od19icmFuY2hlc19zdXNwZW5kZWQgPSAxOworCXB1dF9vbmxpbmVfY3B1cygpOwogfQogCiBzdGF0aWMgaW50IF9fY3B1aW5pdCBidHNfaG90Y3B1X2hhbmRsZXIoc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuZmIsCiAJCQkJICAgICB1bnNpZ25lZCBsb25nIGFjdGlvbiwgdm9pZCAqaGNwdSkKIHsKLQl1bnNpZ25lZCBpbnQgY3B1ID0gKHVuc2lnbmVkIGxvbmcpaGNwdTsKLQotCXNwaW5fbG9jaygmYnRzX3RyYWNlcl9sb2NrKTsKLQotCWlmICghdHJhY2VfaHdfYnJhbmNoZXNfZW5hYmxlZCkKLQkJZ290byBvdXQ7CisJaW50IGNwdSA9IChsb25nKWhjcHU7CiAKIAlzd2l0Y2ggKGFjdGlvbikgewogCWNhc2UgQ1BVX09OTElORToKIAljYXNlIENQVV9ET1dOX0ZBSUxFRDoKLQkJc21wX2NhbGxfZnVuY3Rpb25fc2luZ2xlKGNwdSwgYnRzX3RyYWNlX3N0YXJ0X2NwdSwgTlVMTCwgMSk7CisJCS8qIFRoZSBub3RpZmljYXRpb24gaXMgc2VudCB3aXRoIGludGVycnVwdHMgZW5hYmxlZC4gKi8KKwkJaWYgKHRyYWNlX2h3X2JyYW5jaGVzX2VuYWJsZWQpIHsKKwkJCWJ0c190cmFjZV9pbml0X2NwdShjcHUpOworCisJCQlpZiAodHJhY2VfaHdfYnJhbmNoZXNfc3VzcGVuZGVkICYmCisJCQkgICAgbGlrZWx5KHBlcl9jcHUodHJhY2VyLCBjcHUpKSkKKwkJCQlkc19zdXNwZW5kX2J0cyhwZXJfY3B1KHRyYWNlciwgY3B1KSk7CisJCX0KIAkJYnJlYWs7CisKIAljYXNlIENQVV9ET1dOX1BSRVBBUkU6Ci0JCXNtcF9jYWxsX2Z1bmN0aW9uX3NpbmdsZShjcHUsIGJ0c190cmFjZV9zdG9wX2NwdSwgTlVMTCwgMSk7Ci0JCWJyZWFrOworCQkvKiBUaGUgbm90aWZpY2F0aW9uIGlzIHNlbnQgd2l0aCBpbnRlcnJ1cHRzIGVuYWJsZWQuICovCisJCWlmIChsaWtlbHkocGVyX2NwdSh0cmFjZXIsIGNwdSkpKSB7CisJCQlkc19yZWxlYXNlX2J0cyhwZXJfY3B1KHRyYWNlciwgY3B1KSk7CisJCQlwZXJfY3B1KHRyYWNlciwgY3B1KSA9IE5VTEw7CisJCX0KIAl9CiAKLSBvdXQ6Ci0Jc3Bpbl91bmxvY2soJmJ0c190cmFjZXJfbG9jayk7CiAJcmV0dXJuIE5PVElGWV9ET05FOwogfQogCkBAIC0xMjYsMjAgKzEzNCw2IEBACiAJLm5vdGlmaWVyX2NhbGwgPSBidHNfaG90Y3B1X2hhbmRsZXIKIH07CiAKLXN0YXRpYyBpbnQgYnRzX3RyYWNlX2luaXQoc3RydWN0IHRyYWNlX2FycmF5ICp0cikKLXsKLQlod19icmFuY2hfdHJhY2UgPSB0cjsKLQotCWJ0c190cmFjZV9zdGFydCh0cik7Ci0KLQlyZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgYnRzX3RyYWNlX3Jlc2V0KHN0cnVjdCB0cmFjZV9hcnJheSAqdHIpCi17Ci0JYnRzX3RyYWNlX3N0b3AodHIpOwotfQotCiBzdGF0aWMgdm9pZCBidHNfdHJhY2VfcHJpbnRfaGVhZGVyKHN0cnVjdCBzZXFfZmlsZSAqbSkKIHsKIAlzZXFfcHV0cyhtLCAiIyBDUFUjICAgICAgICBUTyAgPC0gIEZST01cbiIpOwpAQCAtMTQ3LDEwICsxNDEsMTAgQEAKIAogc3RhdGljIGVudW0gcHJpbnRfbGluZV90IGJ0c190cmFjZV9wcmludF9saW5lKHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKKwl1bnNpZ25lZCBsb25nIHN5bWZsYWdzID0gVFJBQ0VfSVRFUl9TWU1fT0ZGU0VUOwogCXN0cnVjdCB0cmFjZV9lbnRyeSAqZW50cnkgPSBpdGVyLT5lbnQ7CiAJc3RydWN0IHRyYWNlX3NlcSAqc2VxID0gJml0ZXItPnNlcTsKIAlzdHJ1Y3QgaHdfYnJhbmNoX2VudHJ5ICppdDsKLQl1bnNpZ25lZCBsb25nIHN5bWZsYWdzID0gVFJBQ0VfSVRFUl9TWU1fT0ZGU0VUOwogCiAJdHJhY2VfYXNzaWduX3R5cGUoaXQsIGVudHJ5KTsKIApAQCAtMTY4LDYgKzE2Miw3IEBACiAKIHZvaWQgdHJhY2VfaHdfYnJhbmNoKHU2NCBmcm9tLCB1NjQgdG8pCiB7CisJc3RydWN0IGZ0cmFjZV9ldmVudF9jYWxsICpjYWxsID0gJmV2ZW50X2h3X2JyYW5jaDsKIAlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyID0gaHdfYnJhbmNoX3RyYWNlOwogCXN0cnVjdCByaW5nX2J1ZmZlcl9ldmVudCAqZXZlbnQ7CiAJc3RydWN0IGh3X2JyYW5jaF9lbnRyeSAqZW50cnk7CkBAIC0xOTQsNyArMTg5LDggQEAKIAllbnRyeS0+ZW50LnR5cGUgPSBUUkFDRV9IV19CUkFOQ0hFUzsKIAllbnRyeS0+ZnJvbSA9IGZyb207CiAJZW50cnktPnRvICAgPSB0bzsKLQl0cmFjZV9idWZmZXJfdW5sb2NrX2NvbW1pdCh0ciwgZXZlbnQsIDAsIDApOworCWlmICghZmlsdGVyX2NoZWNrX2Rpc2NhcmQoY2FsbCwgZW50cnksIHRyLT5idWZmZXIsIGV2ZW50KSkKKwkJdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQodHIsIGV2ZW50LCAwLCAwKTsKIAogIG91dDoKIAlhdG9taWNfZGVjKCZ0ci0+ZGF0YVtjcHVdLT5kaXNhYmxlZCk7CkBAIC0yMjQsMTEgKzIyMCwxMSBAQAogLyoKICAqIENvbGxlY3QgdGhlIHRyYWNlIG9uIHRoZSBjdXJyZW50IGNwdSBhbmQgd3JpdGUgaXQgaW50byB0aGUgZnRyYWNlIGJ1ZmZlci4KICAqCi0gKiBwcmU6IGJ0c190cmFjZXJfbG9jayBtdXN0IGJlIGxvY2tlZAorICogcHJlOiB0cmFjaW5nIG11c3QgYmUgc3VzcGVuZGVkIG9uIHRoZSBjdXJyZW50IGNwdQogICovCiBzdGF0aWMgdm9pZCB0cmFjZV9idHNfY3B1KHZvaWQgKmFyZykKIHsKLQlzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyID0gKHN0cnVjdCB0cmFjZV9hcnJheSAqKSBhcmc7CisJc3RydWN0IHRyYWNlX2FycmF5ICp0ciA9IChzdHJ1Y3QgdHJhY2VfYXJyYXkgKilhcmc7CiAJY29uc3Qgc3RydWN0IGJ0c190cmFjZSAqdHJhY2U7CiAJdW5zaWduZWQgY2hhciAqYXQ7CiAKQEAgLTI0MSwxMCArMjM3LDkgQEAKIAlpZiAodW5saWtlbHkoIXRoaXNfdHJhY2VyKSkKIAkJcmV0dXJuOwogCi0JZHNfc3VzcGVuZF9idHModGhpc190cmFjZXIpOwogCXRyYWNlID0gZHNfcmVhZF9idHModGhpc190cmFjZXIpOwogCWlmICghdHJhY2UpCi0JCWdvdG8gb3V0OworCQlyZXR1cm47CiAKIAlmb3IgKGF0ID0gdHJhY2UtPmRzLnRvcDsgKHZvaWQgKilhdCA8IHRyYWNlLT5kcy5lbmQ7CiAJICAgICBhdCArPSB0cmFjZS0+ZHMuc2l6ZSkKQEAgLTI1MywxOCArMjQ4LDI3IEBACiAJZm9yIChhdCA9IHRyYWNlLT5kcy5iZWdpbjsgKHZvaWQgKilhdCA8IHRyYWNlLT5kcy50b3A7CiAJICAgICBhdCArPSB0cmFjZS0+ZHMuc2l6ZSkKIAkJdHJhY2VfYnRzX2F0KHRyYWNlLCBhdCk7Ci0KLW91dDoKLQlkc19yZXN1bWVfYnRzKHRoaXNfdHJhY2VyKTsKIH0KIAogc3RhdGljIHZvaWQgdHJhY2VfYnRzX3ByZXBhcmUoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKQogewotCXNwaW5fbG9jaygmYnRzX3RyYWNlcl9sb2NrKTsKKwlpbnQgY3B1OwogCisJZ2V0X29ubGluZV9jcHVzKCk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWlmIChsaWtlbHkocGVyX2NwdSh0cmFjZXIsIGNwdSkpKQorCQkJZHNfc3VzcGVuZF9idHMocGVyX2NwdSh0cmFjZXIsIGNwdSkpOworCS8qCisJICogV2UgbmVlZCB0byBjb2xsZWN0IHRoZSB0cmFjZSBvbiB0aGUgcmVzcGVjdGl2ZSBjcHUgc2luY2UgZnRyYWNlCisJICogaW1wbGljaXRseSBhZGRzIHRoZSByZWNvcmQgZm9yIHRoZSBjdXJyZW50IGNwdS4KKwkgKiBPbmNlIHRoYXQgaXMgbW9yZSBmbGV4aWJsZSwgd2UgY291bGQgY29sbGVjdCB0aGUgZGF0YSBmcm9tIGFueSBjcHUuCisJICovCiAJb25fZWFjaF9jcHUodHJhY2VfYnRzX2NwdSwgaXRlci0+dHIsIDEpOwogCi0Jc3Bpbl91bmxvY2soJmJ0c190cmFjZXJfbG9jayk7CisJZm9yX2VhY2hfb25saW5lX2NwdShjcHUpCisJCWlmIChsaWtlbHkocGVyX2NwdSh0cmFjZXIsIGNwdSkpKQorCQkJZHNfcmVzdW1lX2J0cyhwZXJfY3B1KHRyYWNlciwgY3B1KSk7CisJcHV0X29ubGluZV9jcHVzKCk7CiB9CiAKIHN0YXRpYyB2b2lkIHRyYWNlX2J0c19jbG9zZShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpCkBAIC0yNzQsMTEgKzI3OCwxMSBAQAogCiB2b2lkIHRyYWNlX2h3X2JyYW5jaF9vb3BzKHZvaWQpCiB7Ci0Jc3Bpbl9sb2NrKCZidHNfdHJhY2VyX2xvY2spOwotCi0JdHJhY2VfYnRzX2NwdShod19icmFuY2hfdHJhY2UpOwotCi0Jc3Bpbl91bmxvY2soJmJ0c190cmFjZXJfbG9jayk7CisJaWYgKHRoaXNfdHJhY2VyKSB7CisJCWRzX3N1c3BlbmRfYnRzX25vaXJxKHRoaXNfdHJhY2VyKTsKKwkJdHJhY2VfYnRzX2NwdShod19icmFuY2hfdHJhY2UpOworCQlkc19yZXN1bWVfYnRzX25vaXJxKHRoaXNfdHJhY2VyKTsKKwl9CiB9CiAKIHN0cnVjdCB0cmFjZXIgYnRzX3RyYWNlciBfX3JlYWRfbW9zdGx5ID0KQEAgLTI5MSw3ICsyOTUsMTAgQEAKIAkuc3RhcnQJCT0gYnRzX3RyYWNlX3N0YXJ0LAogCS5zdG9wCQk9IGJ0c190cmFjZV9zdG9wLAogCS5vcGVuCQk9IHRyYWNlX2J0c19wcmVwYXJlLAotCS5jbG9zZQkJPSB0cmFjZV9idHNfY2xvc2UKKwkuY2xvc2UJCT0gdHJhY2VfYnRzX2Nsb3NlLAorI2lmZGVmIENPTkZJR19GVFJBQ0VfU0VMRlRFU1QKKwkuc2VsZnRlc3QJPSB0cmFjZV9zZWxmdGVzdF9zdGFydHVwX2h3X2JyYW5jaGVzLAorI2VuZGlmIC8qIENPTkZJR19GVFJBQ0VfU0VMRlRFU1QgKi8KIH07CiAKIF9faW5pdCBzdGF0aWMgaW50IGluaXRfYnRzX3RyYWNlKHZvaWQpCmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfbW1pb3RyYWNlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfbW1pb3RyYWNlLmMKaW5kZXggOGUzN2ZjZC4uZDUzYjQ1ZSAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX21taW90cmFjZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9tbWlvdHJhY2UuYwpAQCAtOSw2ICs5LDggQEAKICNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KICNpbmNsdWRlIDxsaW51eC9tbWlvdHJhY2UuaD4KICNpbmNsdWRlIDxsaW51eC9wY2kuaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+CisKICNpbmNsdWRlIDxhc20vYXRvbWljLmg+CiAKICNpbmNsdWRlICJ0cmFjZS5oIgpAQCAtMTc0LDcgKzE3Niw3IEBACiAJc3RydWN0IG1taW90cmFjZV9ydyAqcnc7CiAJc3RydWN0IHRyYWNlX3NlcSAqcwk9ICZpdGVyLT5zZXE7CiAJdW5zaWduZWQgbG9uZyBsb25nIHQJPSBuczJ1c2VjcyhpdGVyLT50cyk7Ci0JdW5zaWduZWQgbG9uZyB1c2VjX3JlbQk9IGRvX2Rpdih0LCAxMDAwMDAwVUxMKTsKKwl1bnNpZ25lZCBsb25nIHVzZWNfcmVtCT0gZG9fZGl2KHQsIFVTRUNfUEVSX1NFQyk7CiAJdW5zaWduZWQgc2VjcwkJPSAodW5zaWduZWQgbG9uZyl0OwogCWludCByZXQgPSAxOwogCkBAIC0yMjEsNyArMjIzLDcgQEAKIAlzdHJ1Y3QgbW1pb3RyYWNlX21hcCAqbTsKIAlzdHJ1Y3QgdHJhY2Vfc2VxICpzCT0gJml0ZXItPnNlcTsKIAl1bnNpZ25lZCBsb25nIGxvbmcgdAk9IG5zMnVzZWNzKGl0ZXItPnRzKTsKLQl1bnNpZ25lZCBsb25nIHVzZWNfcmVtCT0gZG9fZGl2KHQsIDEwMDAwMDBVTEwpOworCXVuc2lnbmVkIGxvbmcgdXNlY19yZW0JPSBkb19kaXYodCwgVVNFQ19QRVJfU0VDKTsKIAl1bnNpZ25lZCBzZWNzCQk9ICh1bnNpZ25lZCBsb25nKXQ7CiAJaW50IHJldDsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5jCmluZGV4IDY0YjU0YTUuLjc5MzhmM2EgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmMKQEAgLTE0LDExICsxNCwyNSBAQAogLyogbXVzdCBiZSBhIHBvd2VyIG9mIDIgKi8KICNkZWZpbmUgRVZFTlRfSEFTSFNJWkUJMTI4CiAKLXN0YXRpYyBERUZJTkVfTVVURVgodHJhY2VfZXZlbnRfbXV0ZXgpOworREVDTEFSRV9SV1NFTSh0cmFjZV9ldmVudF9tdXRleCk7CisKK0RFRklORV9QRVJfQ1BVKHN0cnVjdCB0cmFjZV9zZXEsIGZ0cmFjZV9ldmVudF9zZXEpOworRVhQT1JUX1BFUl9DUFVfU1lNQk9MKGZ0cmFjZV9ldmVudF9zZXEpOworCiBzdGF0aWMgc3RydWN0IGhsaXN0X2hlYWQgZXZlbnRfaGFzaFtFVkVOVF9IQVNIU0laRV0gX19yZWFkX21vc3RseTsKIAogc3RhdGljIGludCBuZXh0X2V2ZW50X3R5cGUgPSBfX1RSQUNFX0xBU1RfVFlQRSArIDE7CiAKK3ZvaWQgdHJhY2VfcHJpbnRfc2VxKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IHRyYWNlX3NlcSAqcykKK3sKKwlpbnQgbGVuID0gcy0+bGVuID49IFBBR0VfU0laRSA/IFBBR0VfU0laRSAtIDEgOiBzLT5sZW47CisKKwlzLT5idWZmZXJbbGVuXSA9IDA7CisJc2VxX3B1dHMobSwgcy0+YnVmZmVyKTsKKworCXRyYWNlX3NlcV9pbml0KHMpOworfQorCiBlbnVtIHByaW50X2xpbmVfdCB0cmFjZV9wcmludF9icHJpbnRrX21zZ19vbmx5KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcikKIHsKIAlzdHJ1Y3QgdHJhY2Vfc2VxICpzID0gJml0ZXItPnNlcTsKQEAgLTg0LDYgKzk4LDM5IEBACiAKIAlyZXR1cm4gbGVuOwogfQorRVhQT1JUX1NZTUJPTF9HUEwodHJhY2Vfc2VxX3ByaW50Zik7CisKKy8qKgorICogdHJhY2Vfc2VxX3ZwcmludGYgLSBzZXF1ZW5jZSBwcmludGluZyBvZiB0cmFjZSBpbmZvcm1hdGlvbgorICogQHM6IHRyYWNlIHNlcXVlbmNlIGRlc2NyaXB0b3IKKyAqIEBmbXQ6IHByaW50ZiBmb3JtYXQgc3RyaW5nCisgKgorICogVGhlIHRyYWNlciBtYXkgdXNlIGVpdGhlciBzZXF1ZW5jZSBvcGVyYXRpb25zIG9yIGl0cyBvd24KKyAqIGNvcHkgdG8gdXNlciByb3V0aW5lcy4gVG8gc2ltcGxpZnkgZm9ybWF0aW5nIG9mIGEgdHJhY2UKKyAqIHRyYWNlX3NlcV9wcmludGYgaXMgdXNlZCB0byBzdG9yZSBzdHJpbmdzIGludG8gYSBzcGVjaWFsCisgKiBidWZmZXIgKEBzKS4gVGhlbiB0aGUgb3V0cHV0IG1heSBiZSBlaXRoZXIgdXNlZCBieQorICogdGhlIHNlcXVlbmNlciBvciBwdWxsZWQgaW50byBhbm90aGVyIGJ1ZmZlci4KKyAqLworaW50Cit0cmFjZV9zZXFfdnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwlpbnQgbGVuID0gKFBBR0VfU0laRSAtIDEpIC0gcy0+bGVuOworCWludCByZXQ7CisKKwlpZiAoIWxlbikKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSB2c25wcmludGYocy0+YnVmZmVyICsgcy0+bGVuLCBsZW4sIGZtdCwgYXJncyk7CisKKwkvKiBJZiB3ZSBjYW4ndCB3cml0ZSBpdCBhbGwsIGRvbid0IGJvdGhlciB3cml0aW5nIGFueXRoaW5nICovCisJaWYgKHJldCA+PSBsZW4pCisJCXJldHVybiAwOworCisJcy0+bGVuICs9IHJldDsKKworCXJldHVybiBsZW47Cit9CitFWFBPUlRfU1lNQk9MX0dQTCh0cmFjZV9zZXFfdnByaW50Zik7CiAKIGludCB0cmFjZV9zZXFfYnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHUzMiAqYmluYXJ5KQogewpAQCAtMjAxLDYgKzI0OCw2NyBAQAogCXJldHVybiAwOwogfQogCitjb25zdCBjaGFyICoKK2Z0cmFjZV9wcmludF9mbGFnc19zZXEoc3RydWN0IHRyYWNlX3NlcSAqcCwgY29uc3QgY2hhciAqZGVsaW0sCisJCSAgICAgICB1bnNpZ25lZCBsb25nIGZsYWdzLAorCQkgICAgICAgY29uc3Qgc3RydWN0IHRyYWNlX3ByaW50X2ZsYWdzICpmbGFnX2FycmF5KQoreworCXVuc2lnbmVkIGxvbmcgbWFzazsKKwljb25zdCBjaGFyICpzdHI7CisJY29uc3QgY2hhciAqcmV0ID0gcC0+YnVmZmVyICsgcC0+bGVuOworCWludCBpOworCisJZm9yIChpID0gMDsgIGZsYWdfYXJyYXlbaV0ubmFtZSAmJiBmbGFnczsgaSsrKSB7CisKKwkJbWFzayA9IGZsYWdfYXJyYXlbaV0ubWFzazsKKwkJaWYgKChmbGFncyAmIG1hc2spICE9IG1hc2spCisJCQljb250aW51ZTsKKworCQlzdHIgPSBmbGFnX2FycmF5W2ldLm5hbWU7CisJCWZsYWdzICY9IH5tYXNrOworCQlpZiAocC0+bGVuICYmIGRlbGltKQorCQkJdHJhY2Vfc2VxX3B1dHMocCwgZGVsaW0pOworCQl0cmFjZV9zZXFfcHV0cyhwLCBzdHIpOworCX0KKworCS8qIGNoZWNrIGZvciBsZWZ0IG92ZXIgZmxhZ3MgKi8KKwlpZiAoZmxhZ3MpIHsKKwkJaWYgKHAtPmxlbiAmJiBkZWxpbSkKKwkJCXRyYWNlX3NlcV9wdXRzKHAsIGRlbGltKTsKKwkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiMHglbHgiLCBmbGFncyk7CisJfQorCisJdHJhY2Vfc2VxX3B1dGMocCwgMCk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChmdHJhY2VfcHJpbnRfZmxhZ3Nfc2VxKTsKKworY29uc3QgY2hhciAqCitmdHJhY2VfcHJpbnRfc3ltYm9sc19zZXEoc3RydWN0IHRyYWNlX3NlcSAqcCwgdW5zaWduZWQgbG9uZyB2YWwsCisJCQkgY29uc3Qgc3RydWN0IHRyYWNlX3ByaW50X2ZsYWdzICpzeW1ib2xfYXJyYXkpCit7CisJaW50IGk7CisJY29uc3QgY2hhciAqcmV0ID0gcC0+YnVmZmVyICsgcC0+bGVuOworCisJZm9yIChpID0gMDsgIHN5bWJvbF9hcnJheVtpXS5uYW1lOyBpKyspIHsKKworCQlpZiAodmFsICE9IHN5bWJvbF9hcnJheVtpXS5tYXNrKQorCQkJY29udGludWU7CisKKwkJdHJhY2Vfc2VxX3B1dHMocCwgc3ltYm9sX2FycmF5W2ldLm5hbWUpOworCQlicmVhazsKKwl9CisKKwlpZiAoIXAtPmxlbikKKwkJdHJhY2Vfc2VxX3ByaW50ZihwLCAiMHglbHgiLCB2YWwpOworCQkKKwl0cmFjZV9zZXFfcHV0YyhwLCAwKTsKKworCXJldHVybiByZXQ7Cit9CitFWFBPUlRfU1lNQk9MKGZ0cmFjZV9wcmludF9zeW1ib2xzX3NlcSk7CisKICNpZmRlZiBDT05GSUdfS1JFVFBST0JFUwogc3RhdGljIGlubGluZSBjb25zdCBjaGFyICprcmV0cHJvYmVkKGNvbnN0IGNoYXIgKm5hbWUpCiB7CkBAIC0zMTEsMTcgKzQxOSwyMCBAQAogCiAJCWlmIChpcCA9PSBVTE9OR19NQVggfHwgIXJldCkKIAkJCWJyZWFrOwotCQlpZiAoaSAmJiByZXQpCi0JCQlyZXQgPSB0cmFjZV9zZXFfcHV0cyhzLCAiIDwtICIpOworCQlpZiAocmV0KQorCQkJcmV0ID0gdHJhY2Vfc2VxX3B1dHMocywgIiA9PiAiKTsKIAkJaWYgKCFpcCkgewogCQkJaWYgKHJldCkKIAkJCQlyZXQgPSB0cmFjZV9zZXFfcHV0cyhzLCAiPz8iKTsKKwkJCWlmIChyZXQpCisJCQkJcmV0ID0gdHJhY2Vfc2VxX3B1dHMocywgIlxuIik7CiAJCQljb250aW51ZTsKIAkJfQogCQlpZiAoIXJldCkKIAkJCWJyZWFrOwogCQlpZiAocmV0KQogCQkJcmV0ID0gc2VxX3ByaW50X3VzZXJfaXAocywgbW0sIGlwLCBzeW1fZmxhZ3MpOworCQlyZXQgPSB0cmFjZV9zZXFfcHV0cyhzLCAiXG4iKTsKIAl9CiAKIAlpZiAobW0pCkBAIC00NTUsNiArNTY2LDcgQEAKICAqIEB0eXBlOiB0aGUgdHlwZSBvZiBldmVudCB0byBsb29rIGZvcgogICoKICAqIFJldHVybnMgYW4gZXZlbnQgb2YgdHlwZSBAdHlwZSBvdGhlcndpc2UgTlVMTAorICogQ2FsbGVkIHdpdGggdHJhY2VfZXZlbnRfcmVhZF9sb2NrKCkgaGVsZC4KICAqLwogc3RydWN0IHRyYWNlX2V2ZW50ICpmdHJhY2VfZmluZF9ldmVudChpbnQgdHlwZSkKIHsKQEAgLTQ2NCw3ICs1NzYsNyBAQAogCiAJa2V5ID0gdHlwZSAmIChFVkVOVF9IQVNIU0laRSAtIDEpOwogCi0JaGxpc3RfZm9yX2VhY2hfZW50cnlfcmN1KGV2ZW50LCBuLCAmZXZlbnRfaGFzaFtrZXldLCBub2RlKSB7CisJaGxpc3RfZm9yX2VhY2hfZW50cnkoZXZlbnQsIG4sICZldmVudF9oYXNoW2tleV0sIG5vZGUpIHsKIAkJaWYgKGV2ZW50LT50eXBlID09IHR5cGUpCiAJCQlyZXR1cm4gZXZlbnQ7CiAJfQpAQCAtNDcyLDYgKzU4NCw0NiBAQAogCXJldHVybiBOVUxMOwogfQogCitzdGF0aWMgTElTVF9IRUFEKGZ0cmFjZV9ldmVudF9saXN0KTsKKworc3RhdGljIGludCB0cmFjZV9zZWFyY2hfbGlzdChzdHJ1Y3QgbGlzdF9oZWFkICoqbGlzdCkKK3sKKwlzdHJ1Y3QgdHJhY2VfZXZlbnQgKmU7CisJaW50IGxhc3QgPSBfX1RSQUNFX0xBU1RfVFlQRTsKKworCWlmIChsaXN0X2VtcHR5KCZmdHJhY2VfZXZlbnRfbGlzdCkpIHsKKwkJKmxpc3QgPSAmZnRyYWNlX2V2ZW50X2xpc3Q7CisJCXJldHVybiBsYXN0ICsgMTsKKwl9CisKKwkvKgorCSAqIFdlIHVzZWQgdXAgYWxsIHBvc3NpYmxlIG1heCBldmVudHMsCisJICogbGV0cyBzZWUgaWYgc29tZWJvZHkgZnJlZWQgb25lLgorCSAqLworCWxpc3RfZm9yX2VhY2hfZW50cnkoZSwgJmZ0cmFjZV9ldmVudF9saXN0LCBsaXN0KSB7CisJCWlmIChlLT50eXBlICE9IGxhc3QgKyAxKQorCQkJYnJlYWs7CisJCWxhc3QrKzsKKwl9CisKKwkvKiBEaWQgd2UgdXNlZCB1cCBhbGwgNjUgdGhvdXNhbmQgZXZlbnRzPz8/ICovCisJaWYgKChsYXN0ICsgMSkgPiBGVFJBQ0VfTUFYX0VWRU5UKQorCQlyZXR1cm4gMDsKKworCSpsaXN0ID0gJmUtPmxpc3Q7CisJcmV0dXJuIGxhc3QgKyAxOworfQorCit2b2lkIHRyYWNlX2V2ZW50X3JlYWRfbG9jayh2b2lkKQoreworCWRvd25fcmVhZCgmdHJhY2VfZXZlbnRfbXV0ZXgpOworfQorCit2b2lkIHRyYWNlX2V2ZW50X3JlYWRfdW5sb2NrKHZvaWQpCit7CisJdXBfcmVhZCgmdHJhY2VfZXZlbnRfbXV0ZXgpOworfQorCiAvKioKICAqIHJlZ2lzdGVyX2Z0cmFjZV9ldmVudCAtIHJlZ2lzdGVyIG91dHB1dCBmb3IgYW4gZXZlbnQgdHlwZQogICogQGV2ZW50OiB0aGUgZXZlbnQgdHlwZSB0byByZWdpc3RlcgpAQCAtNDkyLDIyICs2NDQsNDIgQEAKIAl1bnNpZ25lZCBrZXk7CiAJaW50IHJldCA9IDA7CiAKLQltdXRleF9sb2NrKCZ0cmFjZV9ldmVudF9tdXRleCk7CisJZG93bl93cml0ZSgmdHJhY2VfZXZlbnRfbXV0ZXgpOwogCi0JaWYgKCFldmVudCkgewotCQlyZXQgPSBuZXh0X2V2ZW50X3R5cGUrKzsKKwlpZiAoV0FSTl9PTighZXZlbnQpKQogCQlnb3RvIG91dDsKLQl9CiAKLQlpZiAoIWV2ZW50LT50eXBlKQotCQlldmVudC0+dHlwZSA9IG5leHRfZXZlbnRfdHlwZSsrOwotCWVsc2UgaWYgKGV2ZW50LT50eXBlID4gX19UUkFDRV9MQVNUX1RZUEUpIHsKKwlJTklUX0xJU1RfSEVBRCgmZXZlbnQtPmxpc3QpOworCisJaWYgKCFldmVudC0+dHlwZSkgeworCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0ID0gTlVMTDsKKworCQlpZiAobmV4dF9ldmVudF90eXBlID4gRlRSQUNFX01BWF9FVkVOVCkgeworCisJCQlldmVudC0+dHlwZSA9IHRyYWNlX3NlYXJjaF9saXN0KCZsaXN0KTsKKwkJCWlmICghZXZlbnQtPnR5cGUpCisJCQkJZ290byBvdXQ7CisKKwkJfSBlbHNlIHsKKwkJCQorCQkJZXZlbnQtPnR5cGUgPSBuZXh0X2V2ZW50X3R5cGUrKzsKKwkJCWxpc3QgPSAmZnRyYWNlX2V2ZW50X2xpc3Q7CisJCX0KKworCQlpZiAoV0FSTl9PTihmdHJhY2VfZmluZF9ldmVudChldmVudC0+dHlwZSkpKQorCQkJZ290byBvdXQ7CisKKwkJbGlzdF9hZGRfdGFpbCgmZXZlbnQtPmxpc3QsIGxpc3QpOworCisJfSBlbHNlIGlmIChldmVudC0+dHlwZSA+IF9fVFJBQ0VfTEFTVF9UWVBFKSB7CiAJCXByaW50ayhLRVJOX1dBUk5JTkcgIk5lZWQgdG8gYWRkIHR5cGUgdG8gdHJhY2UuaFxuIik7CiAJCVdBUk5fT04oMSk7Ci0JfQotCi0JaWYgKGZ0cmFjZV9maW5kX2V2ZW50KGV2ZW50LT50eXBlKSkKIAkJZ290byBvdXQ7CisJfSBlbHNlIHsKKwkJLyogSXMgdGhpcyBldmVudCBhbHJlYWR5IHVzZWQgKi8KKwkJaWYgKGZ0cmFjZV9maW5kX2V2ZW50KGV2ZW50LT50eXBlKSkKKwkJCWdvdG8gb3V0OworCX0KIAogCWlmIChldmVudC0+dHJhY2UgPT0gTlVMTCkKIAkJZXZlbnQtPnRyYWNlID0gdHJhY2Vfbm9wX3ByaW50OwpAQCAtNTIwLDE0ICs2OTIsMjUgQEAKIAogCWtleSA9IGV2ZW50LT50eXBlICYgKEVWRU5UX0hBU0hTSVpFIC0gMSk7CiAKLQlobGlzdF9hZGRfaGVhZF9yY3UoJmV2ZW50LT5ub2RlLCAmZXZlbnRfaGFzaFtrZXldKTsKKwlobGlzdF9hZGRfaGVhZCgmZXZlbnQtPm5vZGUsICZldmVudF9oYXNoW2tleV0pOwogCiAJcmV0ID0gZXZlbnQtPnR5cGU7CiAgb3V0OgotCW11dGV4X3VubG9jaygmdHJhY2VfZXZlbnRfbXV0ZXgpOworCXVwX3dyaXRlKCZ0cmFjZV9ldmVudF9tdXRleCk7CiAKIAlyZXR1cm4gcmV0OwogfQorRVhQT1JUX1NZTUJPTF9HUEwocmVnaXN0ZXJfZnRyYWNlX2V2ZW50KTsKKworLyoKKyAqIFVzZWQgYnkgbW9kdWxlIGNvZGUgd2l0aCB0aGUgdHJhY2VfZXZlbnRfbXV0ZXggaGVsZCBmb3Igd3JpdGUuCisgKi8KK2ludCBfX3VucmVnaXN0ZXJfZnRyYWNlX2V2ZW50KHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpCit7CisJaGxpc3RfZGVsKCZldmVudC0+bm9kZSk7CisJbGlzdF9kZWwoJmV2ZW50LT5saXN0KTsKKwlyZXR1cm4gMDsKK30KIAogLyoqCiAgKiB1bnJlZ2lzdGVyX2Z0cmFjZV9ldmVudCAtIHJlbW92ZSBhIG5vIGxvbmdlciB1c2VkIGV2ZW50CkBAIC01MzUsMTIgKzcxOCwxMyBAQAogICovCiBpbnQgdW5yZWdpc3Rlcl9mdHJhY2VfZXZlbnQoc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCkKIHsKLQltdXRleF9sb2NrKCZ0cmFjZV9ldmVudF9tdXRleCk7Ci0JaGxpc3RfZGVsKCZldmVudC0+bm9kZSk7Ci0JbXV0ZXhfdW5sb2NrKCZ0cmFjZV9ldmVudF9tdXRleCk7CisJZG93bl93cml0ZSgmdHJhY2VfZXZlbnRfbXV0ZXgpOworCV9fdW5yZWdpc3Rlcl9mdHJhY2VfZXZlbnQoZXZlbnQpOworCXVwX3dyaXRlKCZ0cmFjZV9ldmVudF9tdXRleCk7CiAKIAlyZXR1cm4gMDsKIH0KK0VYUE9SVF9TWU1CT0xfR1BMKHVucmVnaXN0ZXJfZnRyYWNlX2V2ZW50KTsKIAogLyoKICAqIFN0YW5kYXJkIGV2ZW50cwpAQCAtODMzLDE0ICsxMDE3LDE2IEBACiAKIAl0cmFjZV9hc3NpZ25fdHlwZShmaWVsZCwgaXRlci0+ZW50KTsKIAorCWlmICghdHJhY2Vfc2VxX3B1dHMocywgIjxzdGFjayB0cmFjZT5cbiIpKQorCQlnb3RvIHBhcnRpYWw7CiAJZm9yIChpID0gMDsgaSA8IEZUUkFDRV9TVEFDS19FTlRSSUVTOyBpKyspIHsKLQkJaWYgKGkpIHsKLQkJCWlmICghdHJhY2Vfc2VxX3B1dHMocywgIiA8PSAiKSkKLQkJCQlnb3RvIHBhcnRpYWw7CisJCWlmICghZmllbGQtPmNhbGxlcltpXSB8fCAoZmllbGQtPmNhbGxlcltpXSA9PSBVTE9OR19NQVgpKQorCQkJYnJlYWs7CisJCWlmICghdHJhY2Vfc2VxX3B1dHMocywgIiA9PiAiKSkKKwkJCWdvdG8gcGFydGlhbDsKIAotCQkJaWYgKCFzZXFfcHJpbnRfaXBfc3ltKHMsIGZpZWxkLT5jYWxsZXJbaV0sIGZsYWdzKSkKLQkJCQlnb3RvIHBhcnRpYWw7Ci0JCX0KKwkJaWYgKCFzZXFfcHJpbnRfaXBfc3ltKHMsIGZpZWxkLT5jYWxsZXJbaV0sIGZsYWdzKSkKKwkJCWdvdG8gcGFydGlhbDsKIAkJaWYgKCF0cmFjZV9zZXFfcHV0cyhzLCAiXG4iKSkKIAkJCWdvdG8gcGFydGlhbDsKIAl9CkBAIC04NjgsMTAgKzEwNTQsMTAgQEAKIAogCXRyYWNlX2Fzc2lnbl90eXBlKGZpZWxkLCBpdGVyLT5lbnQpOwogCi0JaWYgKCFzZXFfcHJpbnRfdXNlcmlwX29ianMoZmllbGQsIHMsIGZsYWdzKSkKKwlpZiAoIXRyYWNlX3NlcV9wdXRzKHMsICI8dXNlciBzdGFjayB0cmFjZT5cbiIpKQogCQlnb3RvIHBhcnRpYWw7CiAKLQlpZiAoIXRyYWNlX3NlcV9wdXRjKHMsICdcbicpKQorCWlmICghc2VxX3ByaW50X3VzZXJpcF9vYmpzKGZpZWxkLCBzLCBmbGFncykpCiAJCWdvdG8gcGFydGlhbDsKIAogCXJldHVybiBUUkFDRV9UWVBFX0hBTkRMRUQ7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmggYi9rZXJuZWwvdHJhY2UvdHJhY2Vfb3V0cHV0LmgKaW5kZXggZTBiZGUzOS4uZDM4YmVjNCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX291dHB1dC5oCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9vdXRwdXQuaApAQCAtMSw0MSArMSwxNyBAQAogI2lmbmRlZiBfX1RSQUNFX0VWRU5UU19ICiAjZGVmaW5lIF9fVFJBQ0VfRVZFTlRTX0gKIAorI2luY2x1ZGUgPGxpbnV4L3RyYWNlX3NlcS5oPgogI2luY2x1ZGUgInRyYWNlLmgiCiAKLXR5cGVkZWYgZW51bSBwcmludF9saW5lX3QgKCp0cmFjZV9wcmludF9mdW5jKShzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsCi0JCQkJCSAgICAgIGludCBmbGFncyk7Ci0KLXN0cnVjdCB0cmFjZV9ldmVudCB7Ci0Jc3RydWN0IGhsaXN0X25vZGUJbm9kZTsKLQlpbnQJCQl0eXBlOwotCXRyYWNlX3ByaW50X2Z1bmMJdHJhY2U7Ci0JdHJhY2VfcHJpbnRfZnVuYwlyYXc7Ci0JdHJhY2VfcHJpbnRfZnVuYwloZXg7Ci0JdHJhY2VfcHJpbnRfZnVuYwliaW5hcnk7Ci19OwotCiBleHRlcm4gZW51bSBwcmludF9saW5lX3QKIHRyYWNlX3ByaW50X2JwcmludGtfbXNnX29ubHkoc3RydWN0IHRyYWNlX2l0ZXJhdG9yICppdGVyKTsKIGV4dGVybiBlbnVtIHByaW50X2xpbmVfdAogdHJhY2VfcHJpbnRfcHJpbnRrX21zZ19vbmx5KHN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcik7CiAKLWV4dGVybiBpbnQgdHJhY2Vfc2VxX3ByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIC4uLikKLQlfX2F0dHJpYnV0ZV9fICgoZm9ybWF0IChwcmludGYsIDIsIDMpKSk7Ci1leHRlcm4gaW50Ci10cmFjZV9zZXFfYnByaW50ZihzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpmbXQsIGNvbnN0IHUzMiAqYmluYXJ5KTsKIGV4dGVybiBpbnQKIHNlcV9wcmludF9pcF9zeW0oc3RydWN0IHRyYWNlX3NlcSAqcywgdW5zaWduZWQgbG9uZyBpcCwKIAkJdW5zaWduZWQgbG9uZyBzeW1fZmxhZ3MpOwotZXh0ZXJuIHNzaXplX3QgdHJhY2Vfc2VxX3RvX3VzZXIoc3RydWN0IHRyYWNlX3NlcSAqcywgY2hhciBfX3VzZXIgKnVidWYsCi0JCQkJIHNpemVfdCBjbnQpOwotZXh0ZXJuIGludCB0cmFjZV9zZXFfcHV0cyhzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBjb25zdCBjaGFyICpzdHIpOwotZXh0ZXJuIGludCB0cmFjZV9zZXFfcHV0YyhzdHJ1Y3QgdHJhY2Vfc2VxICpzLCB1bnNpZ25lZCBjaGFyIGMpOwotZXh0ZXJuIGludCB0cmFjZV9zZXFfcHV0bWVtKHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IHZvaWQgKm1lbSwgc2l6ZV90IGxlbik7Ci1leHRlcm4gaW50IHRyYWNlX3NlcV9wdXRtZW1faGV4KHN0cnVjdCB0cmFjZV9zZXEgKnMsIGNvbnN0IHZvaWQgKm1lbSwKLQkJCQlzaXplX3QgbGVuKTsKLWV4dGVybiB2b2lkICp0cmFjZV9zZXFfcmVzZXJ2ZShzdHJ1Y3QgdHJhY2Vfc2VxICpzLCBzaXplX3QgbGVuKTsKLWV4dGVybiBpbnQgdHJhY2Vfc2VxX3BhdGgoc3RydWN0IHRyYWNlX3NlcSAqcywgc3RydWN0IHBhdGggKnBhdGgpOwogZXh0ZXJuIGludCBzZXFfcHJpbnRfdXNlcmlwX29ianMoY29uc3Qgc3RydWN0IHVzZXJzdGFja19lbnRyeSAqZW50cnksCiAJCQkJIHN0cnVjdCB0cmFjZV9zZXEgKnMsIHVuc2lnbmVkIGxvbmcgc3ltX2ZsYWdzKTsKIGV4dGVybiBpbnQgc2VxX3ByaW50X3VzZXJfaXAoc3RydWN0IHRyYWNlX3NlcSAqcywgc3RydWN0IG1tX3N0cnVjdCAqbW0sCkBAIC00NCwxMyArMjAsMTcgQEAKIGV4dGVybiBpbnQgdHJhY2VfcHJpbnRfY29udGV4dChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogZXh0ZXJuIGludCB0cmFjZV9wcmludF9sYXRfY29udGV4dChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIpOwogCitleHRlcm4gdm9pZCB0cmFjZV9ldmVudF9yZWFkX2xvY2sodm9pZCk7CitleHRlcm4gdm9pZCB0cmFjZV9ldmVudF9yZWFkX3VubG9jayh2b2lkKTsKIGV4dGVybiBzdHJ1Y3QgdHJhY2VfZXZlbnQgKmZ0cmFjZV9maW5kX2V2ZW50KGludCB0eXBlKTsKLWV4dGVybiBpbnQgcmVnaXN0ZXJfZnRyYWNlX2V2ZW50KHN0cnVjdCB0cmFjZV9ldmVudCAqZXZlbnQpOwotZXh0ZXJuIGludCB1bnJlZ2lzdGVyX2Z0cmFjZV9ldmVudChzdHJ1Y3QgdHJhY2VfZXZlbnQgKmV2ZW50KTsKIAogZXh0ZXJuIGVudW0gcHJpbnRfbGluZV90IHRyYWNlX25vcF9wcmludChzdHJ1Y3QgdHJhY2VfaXRlcmF0b3IgKml0ZXIsCiAJCQkJCSBpbnQgZmxhZ3MpOwogCisvKiB1c2VkIGJ5IG1vZHVsZSB1bnJlZ2lzdGVyaW5nICovCitleHRlcm4gaW50IF9fdW5yZWdpc3Rlcl9mdHJhY2VfZXZlbnQoc3RydWN0IHRyYWNlX2V2ZW50ICpldmVudCk7CitleHRlcm4gc3RydWN0IHJ3X3NlbWFwaG9yZSB0cmFjZV9ldmVudF9tdXRleDsKKwogI2RlZmluZSBNQVhfTUVNSEVYX0JZVEVTCTgKICNkZWZpbmUgSEVYX0NIQVJTCQkoTUFYX01FTUhFWF9CWVRFUyoyICsgMSkKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3Bvd2VyLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcG93ZXIuYwppbmRleCAxMTg0Mzk3Li44YTMwZDk4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2VfcG93ZXIuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcG93ZXIuYwpAQCAtMzYsNiArMzYsNyBAQAogCiBzdGF0aWMgdm9pZCBwcm9iZV9wb3dlcl9lbmQoc3RydWN0IHBvd2VyX3RyYWNlICppdCkKIHsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfcG93ZXI7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgdHJhY2VfcG93ZXIgKmVudHJ5OwogCXN0cnVjdCB0cmFjZV9hcnJheV9jcHUgKmRhdGE7CkBAIC01NCw3ICs1NSw4IEBACiAJCWdvdG8gb3V0OwogCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CiAJZW50cnktPnN0YXRlX2RhdGEgPSAqaXQ7Ci0JdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQodHIsIGV2ZW50LCAwLCAwKTsKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXRyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLCBldmVudCwgMCwgMCk7CiAgb3V0OgogCXByZWVtcHRfZW5hYmxlKCk7CiB9CkBAIC02Miw2ICs2NCw3IEBACiBzdGF0aWMgdm9pZCBwcm9iZV9wb3dlcl9tYXJrKHN0cnVjdCBwb3dlcl90cmFjZSAqaXQsIHVuc2lnbmVkIGludCB0eXBlLAogCQkJCXVuc2lnbmVkIGludCBsZXZlbCkKIHsKKwlzdHJ1Y3QgZnRyYWNlX2V2ZW50X2NhbGwgKmNhbGwgPSAmZXZlbnRfcG93ZXI7CiAJc3RydWN0IHJpbmdfYnVmZmVyX2V2ZW50ICpldmVudDsKIAlzdHJ1Y3QgdHJhY2VfcG93ZXIgKmVudHJ5OwogCXN0cnVjdCB0cmFjZV9hcnJheV9jcHUgKmRhdGE7CkBAIC04NCw3ICs4Nyw4IEBACiAJCWdvdG8gb3V0OwogCWVudHJ5CT0gcmluZ19idWZmZXJfZXZlbnRfZGF0YShldmVudCk7CiAJZW50cnktPnN0YXRlX2RhdGEgPSAqaXQ7Ci0JdHJhY2VfYnVmZmVyX3VubG9ja19jb21taXQodHIsIGV2ZW50LCAwLCAwKTsKKwlpZiAoIWZpbHRlcl9jaGVja19kaXNjYXJkKGNhbGwsIGVudHJ5LCB0ci0+YnVmZmVyLCBldmVudCkpCisJCXRyYWNlX2J1ZmZlcl91bmxvY2tfY29tbWl0KHRyLCBldmVudCwgMCwgMCk7CiAgb3V0OgogCXByZWVtcHRfZW5hYmxlKCk7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2VfcHJpbnRrLmMKaW5kZXggZWI4MTU1Ni4uOWJlY2U5NiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3ByaW50ay5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9wcmludGsuYwpAQCAtMjQ1LDE3ICsyNDUsMTMgQEAKIHN0YXRpYyBfX2luaXQgaW50IGluaXRfdHJhY2VfcHJpbnRrX2Z1bmN0aW9uX2V4cG9ydCh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwotCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCiAJZF90cmFjZXIgPSB0cmFjaW5nX2luaXRfZGVudHJ5KCk7CiAJaWYgKCFkX3RyYWNlcikKIAkJcmV0dXJuIDA7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInByaW50a19mb3JtYXRzIiwgMDQ0NCwgZF90cmFjZXIsCisJdHJhY2VfY3JlYXRlX2ZpbGUoInByaW50a19mb3JtYXRzIiwgMDQ0NCwgZF90cmFjZXIsCiAJCQkJICAgIE5VTEwsICZmdHJhY2VfZm9ybWF0c19mb3BzKTsKLQlpZiAoIWVudHJ5KQotCQlwcl93YXJuaW5nKCJDb3VsZCBub3QgY3JlYXRlIGRlYnVnZnMgIgotCQkJICAgIidwcmludGtfZm9ybWF0cycgZW50cnlcbiIpOwogCiAJcmV0dXJuIDA7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfc3dpdGNoLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfc3dpdGNoLmMKaW5kZXggOTExN2NlYS4uYTk4MTA2ZCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3NjaGVkX3N3aXRjaC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF9zd2l0Y2guYwpAQCAtMTAsNyArMTAsNyBAQAogI2luY2x1ZGUgPGxpbnV4L2thbGxzeW1zLmg+CiAjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2Z0cmFjZS5oPgotI2luY2x1ZGUgPHRyYWNlL3NjaGVkLmg+CisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL3NjaGVkLmg+CiAKICNpbmNsdWRlICJ0cmFjZS5oIgogCkBAIC0yOSwxMyArMjksMTMgQEAKIAlpbnQgY3B1OwogCWludCBwYzsKIAotCWlmICghc2NoZWRfcmVmIHx8IHNjaGVkX3N0b3BwZWQpCisJaWYgKHVubGlrZWx5KCFzY2hlZF9yZWYpKQogCQlyZXR1cm47CiAKIAl0cmFjaW5nX3JlY29yZF9jbWRsaW5lKHByZXYpOwogCXRyYWNpbmdfcmVjb3JkX2NtZGxpbmUobmV4dCk7CiAKLQlpZiAoIXRyYWNlcl9lbmFibGVkKQorCWlmICghdHJhY2VyX2VuYWJsZWQgfHwgc2NoZWRfc3RvcHBlZCkKIAkJcmV0dXJuOwogCiAJcGMgPSBwcmVlbXB0X2NvdW50KCk7CkBAIC01NiwxNSArNTYsMTUgQEAKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCWludCBjcHUsIHBjOwogCi0JaWYgKCFsaWtlbHkodHJhY2VyX2VuYWJsZWQpKQorCWlmICh1bmxpa2VseSghc2NoZWRfcmVmKSkKKwkJcmV0dXJuOworCisJdHJhY2luZ19yZWNvcmRfY21kbGluZShjdXJyZW50KTsKKworCWlmICghdHJhY2VyX2VuYWJsZWQgfHwgc2NoZWRfc3RvcHBlZCkKIAkJcmV0dXJuOwogCiAJcGMgPSBwcmVlbXB0X2NvdW50KCk7Ci0JdHJhY2luZ19yZWNvcmRfY21kbGluZShjdXJyZW50KTsKLQotCWlmIChzY2hlZF9zdG9wcGVkKQotCQlyZXR1cm47Ci0KIAlsb2NhbF9pcnFfc2F2ZShmbGFncyk7CiAJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlkYXRhID0gY3R4X3RyYWNlLT5kYXRhW2NwdV07CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMKaW5kZXggNWJjMDBlOGYuLmVhY2IyNzIgMTAwNjQ0Ci0tLSBhL2tlcm5lbC90cmFjZS90cmFjZV9zY2hlZF93YWtldXAuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2NoZWRfd2FrZXVwLmMKQEAgLTE1LDcgKzE1LDcgQEAKICNpbmNsdWRlIDxsaW51eC9rYWxsc3ltcy5oPgogI2luY2x1ZGUgPGxpbnV4L3VhY2Nlc3MuaD4KICNpbmNsdWRlIDxsaW51eC9mdHJhY2UuaD4KLSNpbmNsdWRlIDx0cmFjZS9zY2hlZC5oPgorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9zY2hlZC5oPgogCiAjaW5jbHVkZSAidHJhY2UuaCIKIApAQCAtMTM4LDkgKzEzOCw2IEBACiAKIAlwYyA9IHByZWVtcHRfY291bnQoKTsKIAotCS8qIFRoZSB0YXNrIHdlIGFyZSB3YWl0aW5nIGZvciBpcyB3YWtpbmcgdXAgKi8KLQlkYXRhID0gd2FrZXVwX3RyYWNlLT5kYXRhW3dha2V1cF9jcHVdOwotCiAJLyogZGlzYWJsZSBsb2NhbCBkYXRhLCBub3Qgd2FrZXVwX2NwdSBkYXRhICovCiAJY3B1ID0gcmF3X3NtcF9wcm9jZXNzb3JfaWQoKTsKIAlkaXNhYmxlZCA9IGF0b21pY19pbmNfcmV0dXJuKCZ3YWtldXBfdHJhY2UtPmRhdGFbY3B1XS0+ZGlzYWJsZWQpOwpAQCAtMTU0LDYgKzE1MSw5IEBACiAJaWYgKHVubGlrZWx5KCF0cmFjZXJfZW5hYmxlZCB8fCBuZXh0ICE9IHdha2V1cF90YXNrKSkKIAkJZ290byBvdXRfdW5sb2NrOwogCisJLyogVGhlIHRhc2sgd2UgYXJlIHdhaXRpbmcgZm9yIGlzIHdha2luZyB1cCAqLworCWRhdGEgPSB3YWtldXBfdHJhY2UtPmRhdGFbd2FrZXVwX2NwdV07CisKIAl0cmFjZV9mdW5jdGlvbih3YWtldXBfdHJhY2UsIENBTExFUl9BRERSMCwgQ0FMTEVSX0FERFIxLCBmbGFncywgcGMpOwogCXRyYWNpbmdfc2NoZWRfc3dpdGNoX3RyYWNlKHdha2V1cF90cmFjZSwgcHJldiwgbmV4dCwgZmxhZ3MsIHBjKTsKIApkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3NlbGZ0ZXN0LmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2VsZnRlc3QuYwppbmRleCAwOGY0ZWIyLi4wMGRkNjQ4IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc2VsZnRlc3QuYworKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc2VsZnRlc3QuYwpAQCAtMTYsNiArMTYsNyBAQAogCWNhc2UgVFJBQ0VfQlJBTkNIOgogCWNhc2UgVFJBQ0VfR1JBUEhfRU5UOgogCWNhc2UgVFJBQ0VfR1JBUEhfUkVUOgorCWNhc2UgVFJBQ0VfSFdfQlJBTkNIRVM6CiAJCXJldHVybiAxOwogCX0KIAlyZXR1cm4gMDsKQEAgLTE4OCw2ICsxODksNyBAQAogI2Vsc2UKICMgZGVmaW5lIHRyYWNlX3NlbGZ0ZXN0X3N0YXJ0dXBfZHluYW1pY190cmFjaW5nKHRyYWNlLCB0ciwgZnVuYykgKHsgMDsgfSkKICNlbmRpZiAvKiBDT05GSUdfRFlOQU1JQ19GVFJBQ0UgKi8KKwogLyoKICAqIFNpbXBsZSB2ZXJpZmljYXRpb24gdGVzdCBvZiBmdHJhY2UgZnVuY3Rpb24gdHJhY2VyLgogICogRW5hYmxlIGZ0cmFjZSwgc2xlZXAgMS8xMCBzZWNvbmQsIGFuZCB0aGVuIHJlYWQgdGhlIHRyYWNlCkBAIC03NDksMyArNzUxLDU5IEBACiAJcmV0dXJuIHJldDsKIH0KICNlbmRpZiAvKiBDT05GSUdfQlJBTkNIX1RSQUNFUiAqLworCisjaWZkZWYgQ09ORklHX0hXX0JSQU5DSF9UUkFDRVIKK2ludAordHJhY2Vfc2VsZnRlc3Rfc3RhcnR1cF9od19icmFuY2hlcyhzdHJ1Y3QgdHJhY2VyICp0cmFjZSwKKwkJCQkgICBzdHJ1Y3QgdHJhY2VfYXJyYXkgKnRyKQoreworCXN0cnVjdCB0cmFjZV9pdGVyYXRvciAqaXRlcjsKKwlzdHJ1Y3QgdHJhY2VyIHRyYWNlcjsKKwl1bnNpZ25lZCBsb25nIGNvdW50OworCWludCByZXQ7CisKKwlpZiAoIXRyYWNlLT5vcGVuKSB7CisJCXByaW50ayhLRVJOX0NPTlQgIm1pc3Npbmcgb3BlbiBmdW5jdGlvbi4uLiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0ID0gdHJhY2VyX2luaXQodHJhY2UsIHRyKTsKKwlpZiAocmV0KSB7CisJCXdhcm5fZmFpbGVkX2luaXRfdHJhY2VyKHRyYWNlLCByZXQpOworCQlyZXR1cm4gcmV0OworCX0KKworCS8qCisJICogVGhlIGh3LWJyYW5jaCB0cmFjZXIgbmVlZHMgdG8gY29sbGVjdCB0aGUgdHJhY2UgZnJvbSB0aGUgdmFyaW91cworCSAqIGNwdSB0cmFjZSBidWZmZXJzIC0gYmVmb3JlIHRyYWNpbmcgaXMgc3RvcHBlZC4KKwkgKi8KKwlpdGVyID0ga3phbGxvYyhzaXplb2YoKml0ZXIpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWl0ZXIpCisJCXJldHVybiAtRU5PTUVNOworCisJbWVtY3B5KCZ0cmFjZXIsIHRyYWNlLCBzaXplb2YodHJhY2VyKSk7CisKKwlpdGVyLT50cmFjZSA9ICZ0cmFjZXI7CisJaXRlci0+dHIgPSB0cjsKKwlpdGVyLT5wb3MgPSAtMTsKKwltdXRleF9pbml0KCZpdGVyLT5tdXRleCk7CisKKwl0cmFjZS0+b3BlbihpdGVyKTsKKworCW11dGV4X2Rlc3Ryb3koJml0ZXItPm11dGV4KTsKKwlrZnJlZShpdGVyKTsKKworCXRyYWNpbmdfc3RvcCgpOworCisJcmV0ID0gdHJhY2VfdGVzdF9idWZmZXIodHIsICZjb3VudCk7CisJdHJhY2UtPnJlc2V0KHRyKTsKKwl0cmFjaW5nX3N0YXJ0KCk7CisKKwlpZiAoIXJldCAmJiAhY291bnQpIHsKKwkJcHJpbnRrKEtFUk5fQ09OVCAibm8gZW50cmllcyBmb3VuZC4uIik7CisJCXJldCA9IC0xOworCX0KKworCXJldHVybiByZXQ7Cit9CisjZW5kaWYgLyogQ09ORklHX0hXX0JSQU5DSF9UUkFDRVIgKi8KZGlmZiAtLWdpdCBhL2tlcm5lbC90cmFjZS90cmFjZV9zdGFjay5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3N0YWNrLmMKaW5kZXggYzc1MGY2NS4uMmQ3YWViZCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YWNrLmMKKysrIGIva2VybmVsL3RyYWNlL3RyYWNlX3N0YWNrLmMKQEAgLTI2NSw3ICsyNjUsNyBAQAogCQlzZXFfcHJpbnRmKG0sICIgICAgICAgIERlcHRoICAgIFNpemUgICBMb2NhdGlvbiIKIAkJCSAgICIgICAgKCVkIGVudHJpZXMpXG4iCiAJCQkgICAiICAgICAgICAtLS0tLSAgICAtLS0tICAgLS0tLS0tLS1cbiIsCi0JCQkgICBtYXhfc3RhY2tfdHJhY2UubnJfZW50cmllcyk7CisJCQkgICBtYXhfc3RhY2tfdHJhY2UubnJfZW50cmllcyAtIDEpOwogCiAJCWlmICghc3RhY2tfdHJhY2VyX2VuYWJsZWQgJiYgIW1heF9zdGFja19zaXplKQogCQkJcHJpbnRfZGlzYWJsZWQobSk7CkBAIC0zNTIsMTkgKzM1MiwxNCBAQAogc3RhdGljIF9faW5pdCBpbnQgc3RhY2tfdHJhY2VfaW5pdCh2b2lkKQogewogCXN0cnVjdCBkZW50cnkgKmRfdHJhY2VyOwotCXN0cnVjdCBkZW50cnkgKmVudHJ5OwogCiAJZF90cmFjZXIgPSB0cmFjaW5nX2luaXRfZGVudHJ5KCk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN0YWNrX21heF9zaXplIiwgMDY0NCwgZF90cmFjZXIsCi0JCQkJICAgICZtYXhfc3RhY2tfc2l6ZSwgJnN0YWNrX21heF9zaXplX2ZvcHMpOwotCWlmICghZW50cnkpCi0JCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnc3RhY2tfbWF4X3NpemUnIGVudHJ5XG4iKTsKKwl0cmFjZV9jcmVhdGVfZmlsZSgic3RhY2tfbWF4X3NpemUiLCAwNjQ0LCBkX3RyYWNlciwKKwkJCSZtYXhfc3RhY2tfc2l6ZSwgJnN0YWNrX21heF9zaXplX2ZvcHMpOwogCi0JZW50cnkgPSBkZWJ1Z2ZzX2NyZWF0ZV9maWxlKCJzdGFja190cmFjZSIsIDA0NDQsIGRfdHJhY2VyLAotCQkJCSAgICBOVUxMLCAmc3RhY2tfdHJhY2VfZm9wcyk7Ci0JaWYgKCFlbnRyeSkKLQkJcHJfd2FybmluZygiQ291bGQgbm90IGNyZWF0ZSBkZWJ1Z2ZzICdzdGFja190cmFjZScgZW50cnlcbiIpOworCXRyYWNlX2NyZWF0ZV9maWxlKCJzdGFja190cmFjZSIsIDA0NDQsIGRfdHJhY2VyLAorCQkJTlVMTCwgJnN0YWNrX3RyYWNlX2ZvcHMpOwogCiAJaWYgKHN0YWNrX3RyYWNlcl9lbmFibGVkKQogCQlyZWdpc3Rlcl9mdHJhY2VfZnVuY3Rpb24oJnRyYWNlX29wcyk7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhdC5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3N0YXQuYwppbmRleCBhY2RlYmQ3Li5jMDA2NDM3IDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhdC5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zdGF0LmMKQEAgLTEsNyArMSw3IEBACiAvKgogICogSW5mcmFzdHJ1Y3R1cmUgZm9yIHN0YXRpc3RpYyB0cmFjaW5nIChoaXN0b2dyYW0gb3V0cHV0KS4KICAqCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggRnJlZGVyaWMgV2Vpc2JlY2tlciA8ZndlaXNiZWNAZ21haWwuY29tPgorICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMDkgRnJlZGVyaWMgV2Vpc2JlY2tlciA8ZndlaXNiZWNAZ21haWwuY29tPgogICoKICAqIEJhc2VkIG9uIHRoZSBjb2RlIGZyb20gdHJhY2VfYnJhbmNoLmMgd2hpY2ggaXMKICAqIENvcHlyaWdodCAoQykgMjAwOCBTdGV2ZW4gUm9zdGVkdCA8c3Jvc3RlZHRAcmVkaGF0LmNvbT4KQEAgLTEwLDIyICsxMCwyNyBAQAogCiAKICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+CisjaW5jbHVkZSA8bGludXgvcmJ0cmVlLmg+CiAjaW5jbHVkZSA8bGludXgvZGVidWdmcy5oPgogI2luY2x1ZGUgInRyYWNlX3N0YXQuaCIKICNpbmNsdWRlICJ0cmFjZS5oIgogCiAKLS8qIExpc3Qgb2Ygc3RhdCBlbnRyaWVzIGZyb20gYSB0cmFjZXIgKi8KLXN0cnVjdCB0cmFjZV9zdGF0X2xpc3QgewotCXN0cnVjdCBsaXN0X2hlYWQJbGlzdDsKKy8qCisgKiBMaXN0IG9mIHN0YXQgcmVkLWJsYWNrIG5vZGVzIGZyb20gYSB0cmFjZXIKKyAqIFdlIHVzZSBhIHN1Y2ggdHJlZSB0byBzb3J0IHF1aWNrbHkgdGhlIHN0YXQKKyAqIGVudHJpZXMgZnJvbSB0aGUgdHJhY2VyLgorICovCitzdHJ1Y3Qgc3RhdF9ub2RlIHsKKwlzdHJ1Y3QgcmJfbm9kZQkJbm9kZTsKIAl2b2lkCQkJKnN0YXQ7CiB9OwogCiAvKiBBIHN0YXQgc2Vzc2lvbiBpcyB0aGUgc3RhdHMgb3V0cHV0IGluIG9uZSBmaWxlICovCi1zdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiB7CitzdHJ1Y3Qgc3RhdF9zZXNzaW9uIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCXNlc3Npb25fbGlzdDsKIAlzdHJ1Y3QgdHJhY2VyX3N0YXQJKnRzOwotCXN0cnVjdCBsaXN0X2hlYWQJc3RhdF9saXN0OworCXN0cnVjdCByYl9yb290CQlzdGF0X3Jvb3Q7CiAJc3RydWN0IG11dGV4CQlzdGF0X211dGV4OwogCXN0cnVjdCBkZW50cnkJCSpmaWxlOwogfTsKQEAgLTM3LDE4ICs0Miw0OCBAQAogLyogVGhlIHJvb3QgZGlyZWN0b3J5IGZvciBhbGwgc3RhdCBmaWxlcyAqLwogc3RhdGljIHN0cnVjdCBkZW50cnkJCSpzdGF0X2RpcjsKIAotCi1zdGF0aWMgdm9pZCByZXNldF9zdGF0X3Nlc3Npb24oc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24pCisvKgorICogSXRlcmF0ZSB0aHJvdWdoIHRoZSByYnRyZWUgdXNpbmcgYSBwb3N0IG9yZGVyIHRyYXZlcnNhbCBwYXRoCisgKiB0byByZWxlYXNlIHRoZSBuZXh0IG5vZGUuCisgKiBJdCB3b24ndCBuZWNlc3NhcnkgcmVsZWFzZSBvbmUgYXQgZWFjaCBpdGVyYXRpb24KKyAqIGJ1dCBpdCB3aWxsIGF0IGxlYXN0IGFkdmFuY2UgY2xvc2VyIHRvIHRoZSBuZXh0IG9uZQorICogdG8gYmUgcmVsZWFzZWQuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcmJfbm9kZSAqcmVsZWFzZV9uZXh0KHN0cnVjdCByYl9ub2RlICpub2RlKQogewotCXN0cnVjdCB0cmFjZV9zdGF0X2xpc3QgKm5vZGUsICpuZXh0OworCXN0cnVjdCBzdGF0X25vZGUgKnNub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSByYl9wYXJlbnQobm9kZSk7CiAKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgbmV4dCwgJnNlc3Npb24tPnN0YXRfbGlzdCwgbGlzdCkKLQkJa2ZyZWUobm9kZSk7CisJaWYgKG5vZGUtPnJiX2xlZnQpCisJCXJldHVybiBub2RlLT5yYl9sZWZ0OworCWVsc2UgaWYgKG5vZGUtPnJiX3JpZ2h0KQorCQlyZXR1cm4gbm9kZS0+cmJfcmlnaHQ7CisJZWxzZSB7CisJCWlmICghcGFyZW50KQorCQkJOworCQllbHNlIGlmIChwYXJlbnQtPnJiX2xlZnQgPT0gbm9kZSkKKwkJCXBhcmVudC0+cmJfbGVmdCA9IE5VTEw7CisJCWVsc2UKKwkJCXBhcmVudC0+cmJfcmlnaHQgPSBOVUxMOwogCi0JSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPnN0YXRfbGlzdCk7CisJCXNub2RlID0gY29udGFpbmVyX29mKG5vZGUsIHN0cnVjdCBzdGF0X25vZGUsIG5vZGUpOworCQlrZnJlZShzbm9kZSk7CisKKwkJcmV0dXJuIHBhcmVudDsKKwl9CiB9CiAKLXN0YXRpYyB2b2lkIGRlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiAqc2Vzc2lvbikKK3N0YXRpYyB2b2lkIHJlc2V0X3N0YXRfc2Vzc2lvbihzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uKQoreworCXN0cnVjdCByYl9ub2RlICpub2RlID0gc2Vzc2lvbi0+c3RhdF9yb290LnJiX25vZGU7CisKKwl3aGlsZSAobm9kZSkKKwkJbm9kZSA9IHJlbGVhc2VfbmV4dChub2RlKTsKKworCXNlc3Npb24tPnN0YXRfcm9vdCA9IFJCX1JPT1Q7Cit9CisKK3N0YXRpYyB2b2lkIGRlc3Ryb3lfc2Vzc2lvbihzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uKQogewogCWRlYnVnZnNfcmVtb3ZlKHNlc3Npb24tPmZpbGUpOwogCXJlc2V0X3N0YXRfc2Vzc2lvbihzZXNzaW9uKTsKQEAgLTU2LDI1ICs5MSw2MCBAQAogCWtmcmVlKHNlc3Npb24pOwogfQogCi0vKgotICogRm9yIHRyYWNlcnMgdGhhdCBkb24ndCBwcm92aWRlIGEgc3RhdF9jbXAgY2FsbGJhY2suCi0gKiBUaGlzIG9uZSB3aWxsIGZvcmNlIGFuIGltbWVkaWF0ZSBpbnNlcnRpb24gb24gdGFpbCBvZgotICogdGhlIGxpc3QuCi0gKi8KLXN0YXRpYyBpbnQgZHVtbXlfY21wKHZvaWQgKnAxLCB2b2lkICpwMikKK3R5cGVkZWYgaW50ICgqY21wX3N0YXRfdCkodm9pZCAqLCB2b2lkICopOworCitzdGF0aWMgaW50IGluc2VydF9zdGF0KHN0cnVjdCByYl9yb290ICpyb290LCB2b2lkICpzdGF0LCBjbXBfc3RhdF90IGNtcCkKIHsKLQlyZXR1cm4gMTsKKwlzdHJ1Y3QgcmJfbm9kZSAqKm5ldyA9ICYocm9vdC0+cmJfbm9kZSksICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBzdGF0X25vZGUgKmRhdGE7CisKKwlkYXRhID0ga3phbGxvYyhzaXplb2YoKmRhdGEpLCBHRlBfS0VSTkVMKTsKKwlpZiAoIWRhdGEpCisJCXJldHVybiAtRU5PTUVNOworCWRhdGEtPnN0YXQgPSBzdGF0OworCisJLyoKKwkgKiBGaWd1cmUgb3V0IHdoZXJlIHRvIHB1dCBuZXcgbm9kZQorCSAqIFRoaXMgaXMgYSBkZXNjZW5kZW50IHNvcnRpbmcKKwkgKi8KKwl3aGlsZSAoKm5ldykgeworCQlzdHJ1Y3Qgc3RhdF9ub2RlICp0aGlzOworCQlpbnQgcmVzdWx0OworCisJCXRoaXMgPSBjb250YWluZXJfb2YoKm5ldywgc3RydWN0IHN0YXRfbm9kZSwgbm9kZSk7CisJCXJlc3VsdCA9IGNtcChkYXRhLT5zdGF0LCB0aGlzLT5zdGF0KTsKKworCQlwYXJlbnQgPSAqbmV3OworCQlpZiAocmVzdWx0ID49IDApCisJCQluZXcgPSAmKCgqbmV3KS0+cmJfbGVmdCk7CisJCWVsc2UKKwkJCW5ldyA9ICYoKCpuZXcpLT5yYl9yaWdodCk7CisJfQorCisJcmJfbGlua19ub2RlKCZkYXRhLT5ub2RlLCBwYXJlbnQsIG5ldyk7CisJcmJfaW5zZXJ0X2NvbG9yKCZkYXRhLT5ub2RlLCByb290KTsKKwlyZXR1cm4gMDsKIH0KIAogLyoKLSAqIEluaXRpYWxpemUgdGhlIHN0YXQgbGlzdCBhdCBlYWNoIHRyYWNlX3N0YXQgZmlsZSBvcGVuaW5nLgorICogRm9yIHRyYWNlcnMgdGhhdCBkb24ndCBwcm92aWRlIGEgc3RhdF9jbXAgY2FsbGJhY2suCisgKiBUaGlzIG9uZSB3aWxsIGZvcmNlIGFuIGluc2VydGlvbiBhcyByaWdodC1tb3N0IG5vZGUKKyAqIGluIHRoZSByYnRyZWUuCisgKi8KK3N0YXRpYyBpbnQgZHVtbXlfY21wKHZvaWQgKnAxLCB2b2lkICpwMikKK3sKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBJbml0aWFsaXplIHRoZSBzdGF0IHJidHJlZSBhdCBlYWNoIHRyYWNlX3N0YXQgZmlsZSBvcGVuaW5nLgogICogQWxsIG9mIHRoZXNlIGNvcGllcyBhbmQgc29ydGluZyBhcmUgcmVxdWlyZWQgb24gYWxsIG9wZW5pbmcKICAqIHNpbmNlIHRoZSBzdGF0cyBjb3VsZCBoYXZlIGNoYW5nZWQgYmV0d2VlbiB0d28gZmlsZSBzZXNzaW9ucy4KICAqLwotc3RhdGljIGludCBzdGF0X3NlcV9pbml0KHN0cnVjdCB0cmFjZXJfc3RhdF9zZXNzaW9uICpzZXNzaW9uKQorc3RhdGljIGludCBzdGF0X3NlcV9pbml0KHN0cnVjdCBzdGF0X3Nlc3Npb24gKnNlc3Npb24pCiB7Ci0Jc3RydWN0IHRyYWNlX3N0YXRfbGlzdCAqaXRlcl9lbnRyeSwgKm5ld19lbnRyeTsKIAlzdHJ1Y3QgdHJhY2VyX3N0YXQgKnRzID0gc2Vzc2lvbi0+dHM7CisJc3RydWN0IHJiX3Jvb3QgKnJvb3QgPSAmc2Vzc2lvbi0+c3RhdF9yb290OwogCXZvaWQgKnN0YXQ7CiAJaW50IHJldCA9IDA7CiAJaW50IGk7CkBAIC04NSwyOSArMTU1LDE2IEBACiAJaWYgKCF0cy0+c3RhdF9jbXApCiAJCXRzLT5zdGF0X2NtcCA9IGR1bW15X2NtcDsKIAotCXN0YXQgPSB0cy0+c3RhdF9zdGFydCgpOworCXN0YXQgPSB0cy0+c3RhdF9zdGFydCh0cyk7CiAJaWYgKCFzdGF0KQogCQlnb3RvIGV4aXQ7CiAKLQkvKgotCSAqIFRoZSBmaXJzdCBlbnRyeS4gQWN0dWFsbHkgdGhpcyBpcyB0aGUgc2Vjb25kLCBidXQgdGhlIGZpcnN0Ci0JICogb25lICh0aGUgc3RhdF9saXN0IGhlYWQpIGlzIHBvaW50bGVzcy4KLQkgKi8KLQluZXdfZW50cnkgPSBrbWFsbG9jKHNpemVvZihzdHJ1Y3QgdHJhY2Vfc3RhdF9saXN0KSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFuZXdfZW50cnkpIHsKLQkJcmV0ID0gLUVOT01FTTsKKwlyZXQgPSBpbnNlcnRfc3RhdChyb290LCBzdGF0LCB0cy0+c3RhdF9jbXApOworCWlmIChyZXQpCiAJCWdvdG8gZXhpdDsKLQl9Ci0KLQlJTklUX0xJU1RfSEVBRCgmbmV3X2VudHJ5LT5saXN0KTsKLQotCWxpc3RfYWRkKCZuZXdfZW50cnktPmxpc3QsICZzZXNzaW9uLT5zdGF0X2xpc3QpOwotCi0JbmV3X2VudHJ5LT5zdGF0ID0gc3RhdDsKIAogCS8qCi0JICogSXRlcmF0ZSBvdmVyIHRoZSB0cmFjZXIgc3RhdCBlbnRyaWVzIGFuZCBzdG9yZSB0aGVtIGluIGEgc29ydGVkCi0JICogbGlzdC4KKwkgKiBJdGVyYXRlIG92ZXIgdGhlIHRyYWNlciBzdGF0IGVudHJpZXMgYW5kIHN0b3JlIHRoZW0gaW4gYW4gcmJ0cmVlLgogCSAqLwogCWZvciAoaSA9IDE7IDsgaSsrKSB7CiAJCXN0YXQgPSB0cy0+c3RhdF9uZXh0KHN0YXQsIGkpOwpAQCAtMTE2LDM2ICsxNzMsMTYgQEAKIAkJaWYgKCFzdGF0KQogCQkJYnJlYWs7CiAKLQkJbmV3X2VudHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IHRyYWNlX3N0YXRfbGlzdCksIEdGUF9LRVJORUwpOwotCQlpZiAoIW5ld19lbnRyeSkgewotCQkJcmV0ID0gLUVOT01FTTsKLQkJCWdvdG8gZXhpdF9mcmVlX2xpc3Q7Ci0JCX0KLQotCQlJTklUX0xJU1RfSEVBRCgmbmV3X2VudHJ5LT5saXN0KTsKLQkJbmV3X2VudHJ5LT5zdGF0ID0gc3RhdDsKLQotCQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UoaXRlcl9lbnRyeSwgJnNlc3Npb24tPnN0YXRfbGlzdCwKLQkJCQlsaXN0KSB7Ci0KLQkJCS8qIEluc2VydGlvbiB3aXRoIGEgZGVzY2VuZGVudCBzb3J0aW5nICovCi0JCQlpZiAodHMtPnN0YXRfY21wKGl0ZXJfZW50cnktPnN0YXQsCi0JCQkJCW5ld19lbnRyeS0+c3RhdCkgPj0gMCkgewotCi0JCQkJbGlzdF9hZGQoJm5ld19lbnRyeS0+bGlzdCwgJml0ZXJfZW50cnktPmxpc3QpOwotCQkJCWJyZWFrOwotCQkJfQotCQl9Ci0KLQkJLyogVGhlIGN1cnJlbnQgbGFyZ2VyIHZhbHVlICovCi0JCWlmIChsaXN0X2VtcHR5KCZuZXdfZW50cnktPmxpc3QpKQotCQkJbGlzdF9hZGQoJm5ld19lbnRyeS0+bGlzdCwgJnNlc3Npb24tPnN0YXRfbGlzdCk7CisJCXJldCA9IGluc2VydF9zdGF0KHJvb3QsIHN0YXQsIHRzLT5zdGF0X2NtcCk7CisJCWlmIChyZXQpCisJCQlnb3RvIGV4aXRfZnJlZV9yYnRyZWU7CiAJfQorCiBleGl0OgogCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+c3RhdF9tdXRleCk7CiAJcmV0dXJuIHJldDsKIAotZXhpdF9mcmVlX2xpc3Q6CitleGl0X2ZyZWVfcmJ0cmVlOgogCXJlc2V0X3N0YXRfc2Vzc2lvbihzZXNzaW9uKTsKIAltdXRleF91bmxvY2soJnNlc3Npb24tPnN0YXRfbXV0ZXgpOwogCXJldHVybiByZXQ7CkBAIC0xNTQsMzggKzE5MSw1MSBAQAogCiBzdGF0aWMgdm9pZCAqc3RhdF9zZXFfc3RhcnQoc3RydWN0IHNlcV9maWxlICpzLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiAqc2Vzc2lvbiA9IHMtPnByaXZhdGU7CisJc3RydWN0IHN0YXRfc2Vzc2lvbiAqc2Vzc2lvbiA9IHMtPnByaXZhdGU7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJaW50IGk7CiAKLQkvKiBQcmV2ZW50IGZyb20gdHJhY2VyIHN3aXRjaCBvciBzdGF0X2xpc3QgbW9kaWZpY2F0aW9uICovCisJLyogUHJldmVudCBmcm9tIHRyYWNlciBzd2l0Y2ggb3IgcmJ0cmVlIG1vZGlmaWNhdGlvbiAqLwogCW11dGV4X2xvY2soJnNlc3Npb24tPnN0YXRfbXV0ZXgpOwogCiAJLyogSWYgd2UgYXJlIGluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUsIHByaW50IHRoZSBoZWFkZXJzICovCi0JaWYgKCEqcG9zICYmIHNlc3Npb24tPnRzLT5zdGF0X2hlYWRlcnMpCisJaWYgKCEqcG9zICYmIHNlc3Npb24tPnRzLT5zdGF0X2hlYWRlcnMpIHsKKwkJKCpwb3MpKys7CiAJCXJldHVybiBTRVFfU1RBUlRfVE9LRU47CisJfQogCi0JcmV0dXJuIHNlcV9saXN0X3N0YXJ0KCZzZXNzaW9uLT5zdGF0X2xpc3QsICpwb3MpOworCW5vZGUgPSByYl9maXJzdCgmc2Vzc2lvbi0+c3RhdF9yb290KTsKKwlmb3IgKGkgPSAwOyBub2RlICYmIGkgPCAqcG9zOyBpKyspCisJCW5vZGUgPSByYl9uZXh0KG5vZGUpOworCisJKCpwb3MpKys7CisKKwlyZXR1cm4gbm9kZTsKIH0KIAogc3RhdGljIHZvaWQgKnN0YXRfc2VxX25leHQoc3RydWN0IHNlcV9maWxlICpzLCB2b2lkICpwLCBsb2ZmX3QgKnBvcykKIHsKLQlzdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiAqc2Vzc2lvbiA9IHMtPnByaXZhdGU7CisJc3RydWN0IHN0YXRfc2Vzc2lvbiAqc2Vzc2lvbiA9IHMtPnByaXZhdGU7CisJc3RydWN0IHJiX25vZGUgKm5vZGUgPSBwOworCisJKCpwb3MpKys7CiAKIAlpZiAocCA9PSBTRVFfU1RBUlRfVE9LRU4pCi0JCXJldHVybiBzZXFfbGlzdF9zdGFydCgmc2Vzc2lvbi0+c3RhdF9saXN0LCAqcG9zKTsKKwkJcmV0dXJuIHJiX2ZpcnN0KCZzZXNzaW9uLT5zdGF0X3Jvb3QpOwogCi0JcmV0dXJuIHNlcV9saXN0X25leHQocCwgJnNlc3Npb24tPnN0YXRfbGlzdCwgcG9zKTsKKwlyZXR1cm4gcmJfbmV4dChub2RlKTsKIH0KIAogc3RhdGljIHZvaWQgc3RhdF9zZXFfc3RvcChzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7Ci0Jc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBzLT5wcml2YXRlOworCXN0cnVjdCBzdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBzLT5wcml2YXRlOwogCW11dGV4X3VubG9jaygmc2Vzc2lvbi0+c3RhdF9tdXRleCk7CiB9CiAKIHN0YXRpYyBpbnQgc3RhdF9zZXFfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnYpCiB7Ci0Jc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBzLT5wcml2YXRlOwotCXN0cnVjdCB0cmFjZV9zdGF0X2xpc3QgKmwgPSBsaXN0X2VudHJ5KHYsIHN0cnVjdCB0cmFjZV9zdGF0X2xpc3QsIGxpc3QpOworCXN0cnVjdCBzdGF0X3Nlc3Npb24gKnNlc3Npb24gPSBzLT5wcml2YXRlOworCXN0cnVjdCBzdGF0X25vZGUgKmwgPSBjb250YWluZXJfb2Yodiwgc3RydWN0IHN0YXRfbm9kZSwgbm9kZSk7CiAKIAlpZiAodiA9PSBTRVFfU1RBUlRfVE9LRU4pCiAJCXJldHVybiBzZXNzaW9uLT50cy0+c3RhdF9oZWFkZXJzKHMpOwpAQCAtMjA1LDcgKzI1NSw3IEBACiB7CiAJaW50IHJldDsKIAotCXN0cnVjdCB0cmFjZXJfc3RhdF9zZXNzaW9uICpzZXNzaW9uID0gaW5vZGUtPmlfcHJpdmF0ZTsKKwlzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uID0gaW5vZGUtPmlfcHJpdmF0ZTsKIAogCXJldCA9IHNlcV9vcGVuKGZpbGUsICZ0cmFjZV9zdGF0X3NlcV9vcHMpOwogCWlmICghcmV0KSB7CkBAIC0yMTgsMTEgKzI2OCwxMSBAQAogfQogCiAvKgotICogQXZvaWQgY29uc3VtaW5nIG1lbW9yeSB3aXRoIG91ciBub3cgdXNlbGVzcyBsaXN0LgorICogQXZvaWQgY29uc3VtaW5nIG1lbW9yeSB3aXRoIG91ciBub3cgdXNlbGVzcyByYnRyZWUuCiAgKi8KIHN0YXRpYyBpbnQgdHJhY2luZ19zdGF0X3JlbGVhc2Uoc3RydWN0IGlub2RlICppLCBzdHJ1Y3QgZmlsZSAqZikKIHsKLQlzdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiAqc2Vzc2lvbiA9IGktPmlfcHJpdmF0ZTsKKwlzdHJ1Y3Qgc3RhdF9zZXNzaW9uICpzZXNzaW9uID0gaS0+aV9wcml2YXRlOwogCiAJbXV0ZXhfbG9jaygmc2Vzc2lvbi0+c3RhdF9tdXRleCk7CiAJcmVzZXRfc3RhdF9zZXNzaW9uKHNlc3Npb24pOwpAQCAtMjUxLDcgKzMwMSw3IEBACiAJcmV0dXJuIDA7CiB9CiAKLXN0YXRpYyBpbnQgaW5pdF9zdGF0X2ZpbGUoc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKnNlc3Npb24pCitzdGF0aWMgaW50IGluaXRfc3RhdF9maWxlKHN0cnVjdCBzdGF0X3Nlc3Npb24gKnNlc3Npb24pCiB7CiAJaWYgKCFzdGF0X2RpciAmJiB0cmFjaW5nX3N0YXRfaW5pdCgpKQogCQlyZXR1cm4gLUVOT0RFVjsKQEAgLTI2Niw3ICszMTYsNyBAQAogCiBpbnQgcmVnaXN0ZXJfc3RhdF90cmFjZXIoc3RydWN0IHRyYWNlcl9zdGF0ICp0cmFjZSkKIHsKLQlzdHJ1Y3QgdHJhY2VyX3N0YXRfc2Vzc2lvbiAqc2Vzc2lvbiwgKm5vZGUsICp0bXA7CisJc3RydWN0IHN0YXRfc2Vzc2lvbiAqc2Vzc2lvbiwgKm5vZGU7CiAJaW50IHJldDsKIAogCWlmICghdHJhY2UpCkBAIC0yNzcsNyArMzI3LDcgQEAKIAogCS8qIEFscmVhZHkgcmVnaXN0ZXJlZD8gKi8KIAltdXRleF9sb2NrKCZhbGxfc3RhdF9zZXNzaW9uc19tdXRleCk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIHRtcCwgJmFsbF9zdGF0X3Nlc3Npb25zLCBzZXNzaW9uX2xpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZhbGxfc3RhdF9zZXNzaW9ucywgc2Vzc2lvbl9saXN0KSB7CiAJCWlmIChub2RlLT50cyA9PSB0cmFjZSkgewogCQkJbXV0ZXhfdW5sb2NrKCZhbGxfc3RhdF9zZXNzaW9uc19tdXRleCk7CiAJCQlyZXR1cm4gLUVJTlZBTDsKQEAgLTI4NiwxNSArMzM2LDEzIEBACiAJbXV0ZXhfdW5sb2NrKCZhbGxfc3RhdF9zZXNzaW9uc19tdXRleCk7CiAKIAkvKiBJbml0IHRoZSBzZXNzaW9uICovCi0Jc2Vzc2lvbiA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCB0cmFjZXJfc3RhdF9zZXNzaW9uKSwgR0ZQX0tFUk5FTCk7CisJc2Vzc2lvbiA9IGt6YWxsb2Moc2l6ZW9mKCpzZXNzaW9uKSwgR0ZQX0tFUk5FTCk7CiAJaWYgKCFzZXNzaW9uKQogCQlyZXR1cm4gLUVOT01FTTsKIAogCXNlc3Npb24tPnRzID0gdHJhY2U7CiAJSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPnNlc3Npb25fbGlzdCk7Ci0JSU5JVF9MSVNUX0hFQUQoJnNlc3Npb24tPnN0YXRfbGlzdCk7CiAJbXV0ZXhfaW5pdCgmc2Vzc2lvbi0+c3RhdF9tdXRleCk7Ci0Jc2Vzc2lvbi0+ZmlsZSA9IE5VTEw7CiAKIAlyZXQgPSBpbml0X3N0YXRfZmlsZShzZXNzaW9uKTsKIAlpZiAocmV0KSB7CkBAIC0zMTIsNyArMzYwLDcgQEAKIAogdm9pZCB1bnJlZ2lzdGVyX3N0YXRfdHJhY2VyKHN0cnVjdCB0cmFjZXJfc3RhdCAqdHJhY2UpCiB7Ci0Jc3RydWN0IHRyYWNlcl9zdGF0X3Nlc3Npb24gKm5vZGUsICp0bXA7CisJc3RydWN0IHN0YXRfc2Vzc2lvbiAqbm9kZSwgKnRtcDsKIAogCW11dGV4X2xvY2soJmFsbF9zdGF0X3Nlc3Npb25zX211dGV4KTsKIAlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgdG1wLCAmYWxsX3N0YXRfc2Vzc2lvbnMsIHNlc3Npb25fbGlzdCkgewpkaWZmIC0tZ2l0IGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YXQuaCBiL2tlcm5lbC90cmFjZS90cmFjZV9zdGF0LmgKaW5kZXggMjAyMjc0Yy4uZjM1NDZhMiAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3N0YXQuaAorKysgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfc3RhdC5oCkBAIC0xMiw3ICsxMiw3IEBACiAJLyogVGhlIG5hbWUgb2YgeW91ciBzdGF0IGZpbGUgKi8KIAljb25zdCBjaGFyCQkqbmFtZTsKIAkvKiBJdGVyYXRpb24gb3ZlciBzdGF0aXN0aWMgZW50cmllcyAqLwotCXZvaWQJCQkqKCpzdGF0X3N0YXJ0KSh2b2lkKTsKKwl2b2lkCQkJKigqc3RhdF9zdGFydCkoc3RydWN0IHRyYWNlcl9zdGF0ICp0cmFjZSk7CiAJdm9pZAkJCSooKnN0YXRfbmV4dCkodm9pZCAqcHJldiwgaW50IGlkeCk7CiAJLyogQ29tcGFyZSB0d28gZW50cmllcyBmb3Igc3RhdHMgc29ydGluZyAqLwogCWludAkJCSgqc3RhdF9jbXApKHZvaWQgKnAxLCB2b2lkICpwMik7CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzcHJvZi5jIGIva2VybmVsL3RyYWNlL3RyYWNlX3N5c3Byb2YuYwppbmRleCA5MWZkMTljLi5lMDRiNzZjIDEwMDY0NAotLS0gYS9rZXJuZWwvdHJhY2UvdHJhY2Vfc3lzcHJvZi5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV9zeXNwcm9mLmMKQEAgLTMyMSwxMSArMzIxLDcgQEAKIAogdm9pZCBpbml0X3RyYWNlcl9zeXNwcm9mX2RlYnVnZnMoc3RydWN0IGRlbnRyeSAqZF90cmFjZXIpCiB7Ci0Jc3RydWN0IGRlbnRyeSAqZW50cnk7CiAKLQllbnRyeSA9IGRlYnVnZnNfY3JlYXRlX2ZpbGUoInN5c3Byb2Zfc2FtcGxlX3BlcmlvZCIsIDA2NDQsCisJdHJhY2VfY3JlYXRlX2ZpbGUoInN5c3Byb2Zfc2FtcGxlX3BlcmlvZCIsIDA2NDQsCiAJCQlkX3RyYWNlciwgTlVMTCwgJnN5c3Byb2Zfc2FtcGxlX2ZvcHMpOwotCWlmIChlbnRyeSkKLQkJcmV0dXJuOwotCXByX3dhcm5pbmcoIkNvdWxkIG5vdCBjcmVhdGUgZGVidWdmcyAnc3lzcHJvZl9zYW1wbGVfcGVyaW9kJyBlbnRyeVxuIik7CiB9CmRpZmYgLS1naXQgYS9rZXJuZWwvdHJhY2UvdHJhY2Vfd29ya3F1ZXVlLmMgYi9rZXJuZWwvdHJhY2UvdHJhY2Vfd29ya3F1ZXVlLmMKaW5kZXggNzk3MjAxZS4uOTdmY2VhNCAxMDA2NDQKLS0tIGEva2VybmVsL3RyYWNlL3RyYWNlX3dvcmtxdWV1ZS5jCisrKyBiL2tlcm5lbC90cmFjZS90cmFjZV93b3JrcXVldWUuYwpAQCAtNiw3ICs2LDcgQEAKICAqLwogCiAKLSNpbmNsdWRlIDx0cmFjZS93b3JrcXVldWUuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvd29ya3F1ZXVlLmg+CiAjaW5jbHVkZSA8bGludXgvbGlzdC5oPgogI2luY2x1ZGUgPGxpbnV4L3BlcmNwdS5oPgogI2luY2x1ZGUgInRyYWNlX3N0YXQuaCIKQEAgLTE2LDggKzE2LDYgQEAKIC8qIEEgY3B1IHdvcmtxdWV1ZSB0aHJlYWQgKi8KIHN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0YXRzIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkICAgICAgICAgICAgbGlzdDsKLS8qIFVzZWZ1bCB0byBrbm93IGlmIHdlIHByaW50IHRoZSBjcHUgaGVhZGVycyAqLwotCWJvb2wJCSAgICAgICAgICAgIGZpcnN0X2VudHJ5OwogCWludAkJICAgICAgICAgICAgY3B1OwogCXBpZF90CQkJICAgIHBpZDsKIC8qIENhbiBiZSBpbnNlcnRlZCBmcm9tIGludGVycnVwdCBvciB1c2VyIGNvbnRleHQsIG5lZWQgdG8gYmUgYXRvbWljICovCkBAIC00NywxMiArNDUsMTEgQEAKIAkJCSAgc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKQogewogCWludCBjcHUgPSBjcHVtYXNrX2ZpcnN0KCZ3cV90aHJlYWQtPmNwdXNfYWxsb3dlZCk7Ci0Jc3RydWN0IGNwdV93b3JrcXVldWVfc3RhdHMgKm5vZGUsICpuZXh0OworCXN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0YXRzICpub2RlOwogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlzcGluX2xvY2tfaXJxc2F2ZSgmd29ya3F1ZXVlX2NwdV9zdGF0KGNwdSktPmxvY2ssIGZsYWdzKTsKLQlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobm9kZSwgbmV4dCwgJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5saXN0LAotCQkJCQkJCWxpc3QpIHsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KG5vZGUsICZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bGlzdCwgbGlzdCkgewogCQlpZiAobm9kZS0+cGlkID09IHdxX3RocmVhZC0+cGlkKSB7CiAJCQlhdG9taWNfaW5jKCZub2RlLT5pbnNlcnRlZCk7CiAJCQlnb3RvIGZvdW5kOwpAQCAtNjksMTIgKzY2LDExIEBACiAJCQkgIHN0cnVjdCB3b3JrX3N0cnVjdCAqd29yaykKIHsKIAlpbnQgY3B1ID0gY3B1bWFza19maXJzdCgmd3FfdGhyZWFkLT5jcHVzX2FsbG93ZWQpOwotCXN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0YXRzICpub2RlLCAqbmV4dDsKKwlzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdGF0cyAqbm9kZTsKIAl1bnNpZ25lZCBsb25nIGZsYWdzOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5sb2NrLCBmbGFncyk7Ci0JbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG5vZGUsIG5leHQsICZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bGlzdCwKLQkJCQkJCQlsaXN0KSB7CisJbGlzdF9mb3JfZWFjaF9lbnRyeShub2RlLCAmd29ya3F1ZXVlX2NwdV9zdGF0KGNwdSktPmxpc3QsIGxpc3QpIHsKIAkJaWYgKG5vZGUtPnBpZCA9PSB3cV90aHJlYWQtPnBpZCkgewogCQkJbm9kZS0+ZXhlY3V0ZWQrKzsKIAkJCWdvdG8gZm91bmQ7CkBAIC0xMDUsOCArMTAxLDYgQEAKIAljd3MtPnBpZCA9IHdxX3RocmVhZC0+cGlkOwogCiAJc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5sb2NrLCBmbGFncyk7Ci0JaWYgKGxpc3RfZW1wdHkoJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5saXN0KSkKLQkJY3dzLT5maXJzdF9lbnRyeSA9IHRydWU7CiAJbGlzdF9hZGRfdGFpbCgmY3dzLT5saXN0LCAmd29ya3F1ZXVlX2NwdV9zdGF0KGNwdSktPmxpc3QpOwogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5sb2NrLCBmbGFncyk7CiB9CkBAIC0xNTIsNyArMTQ2LDcgQEAKIAlyZXR1cm4gcmV0OwogfQogCi1zdGF0aWMgdm9pZCAqd29ya3F1ZXVlX3N0YXRfc3RhcnQodm9pZCkKK3N0YXRpYyB2b2lkICp3b3JrcXVldWVfc3RhdF9zdGFydChzdHJ1Y3QgdHJhY2VyX3N0YXQgKnRyYWNlKQogewogCWludCBjcHU7CiAJdm9pZCAqcmV0ID0gTlVMTDsKQEAgLTE5MSwxNiArMTg1LDkgQEAKIHN0YXRpYyBpbnQgd29ya3F1ZXVlX3N0YXRfc2hvdyhzdHJ1Y3Qgc2VxX2ZpbGUgKnMsIHZvaWQgKnApCiB7CiAJc3RydWN0IGNwdV93b3JrcXVldWVfc3RhdHMgKmN3cyA9IHA7Ci0JdW5zaWduZWQgbG9uZyBmbGFnczsKLQlpbnQgY3B1ID0gY3dzLT5jcHU7CiAJc3RydWN0IHBpZCAqcGlkOwogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdHNrOwogCi0Jc3Bpbl9sb2NrX2lycXNhdmUoJndvcmtxdWV1ZV9jcHVfc3RhdChjcHUpLT5sb2NrLCBmbGFncyk7Ci0JaWYgKCZjd3MtPmxpc3QgPT0gd29ya3F1ZXVlX2NwdV9zdGF0KGNwdSktPmxpc3QubmV4dCkKLQkJc2VxX3ByaW50ZihzLCAiXG4iKTsKLQlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZ3b3JrcXVldWVfY3B1X3N0YXQoY3B1KS0+bG9jaywgZmxhZ3MpOwotCiAJcGlkID0gZmluZF9nZXRfcGlkKGN3cy0+cGlkKTsKIAlpZiAocGlkKSB7CiAJCXRzayA9IGdldF9waWRfdGFzayhwaWQsIFBJRFRZUEVfUElEKTsKZGlmZiAtLWdpdCBhL2tlcm5lbC93YWl0LmMgYi9rZXJuZWwvd2FpdC5jCmluZGV4IDQyYTJkYmMuLmVhN2MzYjQgMTAwNjQ0Ci0tLSBhL2tlcm5lbC93YWl0LmMKKysrIGIva2VybmVsL3dhaXQuYwpAQCAtMTU0LDcgKzE1NCw3IEBACiAJaWYgKCFsaXN0X2VtcHR5KCZ3YWl0LT50YXNrX2xpc3QpKQogCQlsaXN0X2RlbF9pbml0KCZ3YWl0LT50YXNrX2xpc3QpOwogCWVsc2UgaWYgKHdhaXRxdWV1ZV9hY3RpdmUocSkpCi0JCV9fd2FrZV91cF9jb21tb24ocSwgbW9kZSwgMSwgMCwga2V5KTsKKwkJX193YWtlX3VwX2xvY2tlZF9rZXkocSwgbW9kZSwga2V5KTsKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZxLT5sb2NrLCBmbGFncyk7CiB9CiBFWFBPUlRfU1lNQk9MKGFib3J0X2V4Y2x1c2l2ZV93YWl0KTsKZGlmZiAtLWdpdCBhL2tlcm5lbC93b3JrcXVldWUuYyBiL2tlcm5lbC93b3JrcXVldWUuYwppbmRleCBmNzFmYjJhLi4wNjY4Nzk1IDEwMDY0NAotLS0gYS9rZXJuZWwvd29ya3F1ZXVlLmMKKysrIGIva2VybmVsL3dvcmtxdWV1ZS5jCkBAIC0zMyw3ICszMyw4IEBACiAjaW5jbHVkZSA8bGludXgva2FsbHN5bXMuaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z19sb2Nrcy5oPgogI2luY2x1ZGUgPGxpbnV4L2xvY2tkZXAuaD4KLSNpbmNsdWRlIDx0cmFjZS93b3JrcXVldWUuaD4KKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy93b3JrcXVldWUuaD4KIAogLyoKICAqIFRoZSBwZXItQ1BVIHdvcmtxdWV1ZSAoaWYgc2luZ2xlIHRocmVhZCwgd2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QKQEAgLTEyNCw4ICsxMjUsNiBAQAogCXJldHVybiAodm9pZCAqKSAoYXRvbWljX2xvbmdfcmVhZCgmd29yay0+ZGF0YSkgJiBXT1JLX1NUUlVDVF9XUV9EQVRBX01BU0spOwogfQogCi1ERUZJTkVfVFJBQ0Uod29ya3F1ZXVlX2luc2VydGlvbik7Ci0KIHN0YXRpYyB2b2lkIGluc2VydF93b3JrKHN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCAqY3dxLAogCQkJc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrLCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQogewpAQCAtMjYyLDggKzI2MSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChxdWV1ZV9kZWxheWVkX3dvcmtfb24pOwogCi1ERUZJTkVfVFJBQ0Uod29ya3F1ZXVlX2V4ZWN1dGlvbik7Ci0KIHN0YXRpYyB2b2lkIHJ1bl93b3JrcXVldWUoc3RydWN0IGNwdV93b3JrcXVldWVfc3RydWN0ICpjd3EpCiB7CiAJc3Bpbl9sb2NrX2lycSgmY3dxLT5sb2NrKTsKQEAgLTc1Myw4ICs3NTAsNiBAQAogCXJldHVybiBjd3E7CiB9CiAKLURFRklORV9UUkFDRSh3b3JrcXVldWVfY3JlYXRpb24pOwotCiBzdGF0aWMgaW50IGNyZWF0ZV93b3JrcXVldWVfdGhyZWFkKHN0cnVjdCBjcHVfd29ya3F1ZXVlX3N0cnVjdCAqY3dxLCBpbnQgY3B1KQogewogCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbSA9IHsgLnNjaGVkX3ByaW9yaXR5ID0gTUFYX1JUX1BSSU8tMSB9OwpAQCAtODYwLDggKzg1NSw2IEBACiB9CiBFWFBPUlRfU1lNQk9MX0dQTChfX2NyZWF0ZV93b3JrcXVldWVfa2V5KTsKIAotREVGSU5FX1RSQUNFKHdvcmtxdWV1ZV9kZXN0cnVjdGlvbik7Ci0KIHN0YXRpYyB2b2lkIGNsZWFudXBfd29ya3F1ZXVlX3RocmVhZChzdHJ1Y3QgY3B1X3dvcmtxdWV1ZV9zdHJ1Y3QgKmN3cSkKIHsKIAkvKgpkaWZmIC0tZ2l0IGEvbGliL2RtYS1kZWJ1Zy5jIGIvbGliL2RtYS1kZWJ1Zy5jCmluZGV4IDY5ZGEwOWEuLmFkNjVmYzAgMTAwNjQ0Ci0tLSBhL2xpYi9kbWEtZGVidWcuYworKysgYi9saWIvZG1hLWRlYnVnLmMKQEAgLTIzLDkgKzIzLDExIEBACiAjaW5jbHVkZSA8bGludXgvZG1hLWRlYnVnLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC9kZWJ1Z2ZzLmg+CisjaW5jbHVkZSA8bGludXgvdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGxpbnV4L2RldmljZS5oPgogI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KKyNpbmNsdWRlIDxsaW51eC9jdHlwZS5oPgogI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAKQEAgLTg1LDYgKzg3LDcgQEAKIAogc3RhdGljIHUzMiBudW1fZnJlZV9lbnRyaWVzOwogc3RhdGljIHUzMiBtaW5fZnJlZV9lbnRyaWVzOworc3RhdGljIHUzMiBucl90b3RhbF9lbnRyaWVzOwogCiAvKiBudW1iZXIgb2YgcHJlYWxsb2NhdGVkIGVudHJpZXMgcmVxdWVzdGVkIGJ5IGtlcm5lbCBjbWRsaW5lICovCiBzdGF0aWMgdTMyIHJlcV9lbnRyaWVzOwpAQCAtOTcsNiArMTAwLDE2IEBACiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqc2hvd19udW1fZXJyb3JzX2RlbnQgIF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbnVtX2ZyZWVfZW50cmllc19kZW50IF9fcmVhZF9tb3N0bHk7CiBzdGF0aWMgc3RydWN0IGRlbnRyeSAqbWluX2ZyZWVfZW50cmllc19kZW50IF9fcmVhZF9tb3N0bHk7CitzdGF0aWMgc3RydWN0IGRlbnRyeSAqZmlsdGVyX2RlbnQgICAgICAgICAgIF9fcmVhZF9tb3N0bHk7CisKKy8qIHBlci1kcml2ZXIgZmlsdGVyIHJlbGF0ZWQgc3RhdGUgKi8KKworI2RlZmluZSBOQU1FX01BWF9MRU4JNjQKKworc3RhdGljIGNoYXIgICAgICAgICAgICAgICAgICBjdXJyZW50X2RyaXZlcl9uYW1lW05BTUVfTUFYX0xFTl0gX19yZWFkX21vc3RseTsKK3N0YXRpYyBzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqY3VycmVudF9kcml2ZXIgICAgICAgICAgICAgICAgICAgIF9fcmVhZF9tb3N0bHk7CisKK3N0YXRpYyBERUZJTkVfUldMT0NLKGRyaXZlcl9uYW1lX2xvY2spOwogCiBzdGF0aWMgY29uc3QgY2hhciAqdHlwZTJuYW1lWzRdID0geyAic2luZ2xlIiwgInBhZ2UiLAogCQkJCSAgICAic2NhdGhlci1nYXRoZXIiLCAiY29oZXJlbnQiIH07CkBAIC0xMDQsNiArMTE3LDExIEBACiBzdGF0aWMgY29uc3QgY2hhciAqZGlyMm5hbWVbNF0gPSB7ICJETUFfQklESVJFQ1RJT05BTCIsICJETUFfVE9fREVWSUNFIiwKIAkJCQkgICAiRE1BX0ZST01fREVWSUNFIiwgIkRNQV9OT05FIiB9OwogCisvKiBsaXR0bGUgbWVyZ2UgaGVscGVyIC0gcmVtb3ZlIGl0IGFmdGVyIHRoZSBtZXJnZSB3aW5kb3cgKi8KKyNpZm5kZWYgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUgorI2RlZmluZSBCVVNfTk9USUZZX1VOQk9VTkRfRFJJVkVSIDB4MDAwNQorI2VuZGlmCisKIC8qCiAgKiBUaGUgYWNjZXNzIHRvIHNvbWUgdmFyaWFibGVzIGluIHRoaXMgbWFjcm8gaXMgcmFjeS4gV2UgY2FuJ3QgdXNlIGF0b21pY190CiAgKiBoZXJlIGJlY2F1c2UgYWxsIHRoZXNlIHZhcmlhYmxlcyBhcmUgZXhwb3J0ZWQgdG8gZGVidWdmcy4gU29tZSBvZiB0aGVtIGV2ZW4KQEAgLTEyMSwxNSArMTM5LDU0IEBACiB7CiAjaWZkZWYgQ09ORklHX1NUQUNLVFJBQ0UKIAlpZiAoZW50cnkpIHsKLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiTWFwcGVkIGF0OlxuIik7CisJCXByX3dhcm5pbmcoIk1hcHBlZCBhdDpcbiIpOwogCQlwcmludF9zdGFja190cmFjZSgmZW50cnktPnN0YWNrdHJhY2UsIDApOwogCX0KICNlbmRpZgogfQogCitzdGF0aWMgYm9vbCBkcml2ZXJfZmlsdGVyKHN0cnVjdCBkZXZpY2UgKmRldikKK3sKKwlzdHJ1Y3QgZGV2aWNlX2RyaXZlciAqZHJ2OworCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CisJYm9vbCByZXQ7CisKKwkvKiBkcml2ZXIgZmlsdGVyIG9mZiAqLworCWlmIChsaWtlbHkoIWN1cnJlbnRfZHJpdmVyX25hbWVbMF0pKQorCQlyZXR1cm4gdHJ1ZTsKKworCS8qIGRyaXZlciBmaWx0ZXIgb24gYW5kIGluaXRpYWxpemVkICovCisJaWYgKGN1cnJlbnRfZHJpdmVyICYmIGRldi0+ZHJpdmVyID09IGN1cnJlbnRfZHJpdmVyKQorCQlyZXR1cm4gdHJ1ZTsKKworCWlmIChjdXJyZW50X2RyaXZlciB8fCAhY3VycmVudF9kcml2ZXJfbmFtZVswXSkKKwkJcmV0dXJuIGZhbHNlOworCisJLyogZHJpdmVyIGZpbHRlciBvbiBidXQgbm90IHlldCBpbml0aWFsaXplZCAqLworCWRydiA9IGdldF9kcml2ZXIoZGV2LT5kcml2ZXIpOworCWlmICghZHJ2KQorCQlyZXR1cm4gZmFsc2U7CisKKwkvKiBsb2NrIHRvIHByb3RlY3QgYWdhaW5zdCBjaGFuZ2Ugb2YgY3VycmVudF9kcml2ZXJfbmFtZSAqLworCXJlYWRfbG9ja19pcnFzYXZlKCZkcml2ZXJfbmFtZV9sb2NrLCBmbGFncyk7CisKKwlyZXQgPSBmYWxzZTsKKwlpZiAoZHJ2LT5uYW1lICYmCisJICAgIHN0cm5jbXAoY3VycmVudF9kcml2ZXJfbmFtZSwgZHJ2LT5uYW1lLCBOQU1FX01BWF9MRU4gLSAxKSA9PSAwKSB7CisJCWN1cnJlbnRfZHJpdmVyID0gZHJ2OworCQlyZXQgPSB0cnVlOworCX0KKworCXJlYWRfdW5sb2NrX2lycXJlc3RvcmUoJmRyaXZlcl9uYW1lX2xvY2ssIGZsYWdzKTsKKwlwdXRfZHJpdmVyKGRydik7CisKKwlyZXR1cm4gcmV0OworfQorCiAjZGVmaW5lIGVycl9wcmludGsoZGV2LCBlbnRyeSwgZm9ybWF0LCBhcmcuLi4pIGRvIHsJCVwKIAkJZXJyb3JfY291bnQgKz0gMTsJCQkJXAotCQlpZiAoc2hvd19hbGxfZXJyb3JzIHx8IHNob3dfbnVtX2Vycm9ycyA+IDApIHsJXAorCQlpZiAoZHJpdmVyX2ZpbHRlcihkZXYpICYmCQkJXAorCQkgICAgKHNob3dfYWxsX2Vycm9ycyB8fCBzaG93X251bV9lcnJvcnMgPiAwKSkgewlcCiAJCQlXQVJOKDEsICIlcyAlczogIiBmb3JtYXQsCQlcCiAJCQkgICAgIGRldl9kcml2ZXJfc3RyaW5nKGRldiksCQlcCiAJCQkgICAgIGRldl9uYW1lKGRldikgLCAjIyBhcmcpOwkJXApAQCAtMTg1LDE1ICsyNDIsNTAgQEAKIHN0YXRpYyBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICpoYXNoX2J1Y2tldF9maW5kKHN0cnVjdCBoYXNoX2J1Y2tldCAqYnVja2V0LAogCQkJCQkJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqcmVmKQogewotCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5OworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5LCAqcmV0ID0gTlVMTDsKKwlpbnQgbWF0Y2hlcyA9IDAsIG1hdGNoX2x2bCwgbGFzdF9sdmwgPSAwOwogCiAJbGlzdF9mb3JfZWFjaF9lbnRyeShlbnRyeSwgJmJ1Y2tldC0+bGlzdCwgbGlzdCkgewotCQlpZiAoKGVudHJ5LT5kZXZfYWRkciA9PSByZWYtPmRldl9hZGRyKSAmJgotCQkgICAgKGVudHJ5LT5kZXYgPT0gcmVmLT5kZXYpKQorCQlpZiAoKGVudHJ5LT5kZXZfYWRkciAhPSByZWYtPmRldl9hZGRyKSB8fAorCQkgICAgKGVudHJ5LT5kZXYgIT0gcmVmLT5kZXYpKQorCQkJY29udGludWU7CisKKwkJLyoKKwkJICogU29tZSBkcml2ZXJzIG1hcCB0aGUgc2FtZSBwaHlzaWNhbCBhZGRyZXNzIG11bHRpcGxlCisJCSAqIHRpbWVzLiBXaXRob3V0IGEgaGFyZHdhcmUgSU9NTVUgdGhpcyByZXN1bHRzIGluIHRoZQorCQkgKiBzYW1lIGRldmljZSBhZGRyZXNzZXMgYmVpbmcgcHV0IGludG8gdGhlIGRtYS1kZWJ1ZworCQkgKiBoYXNoIG11bHRpcGxlIHRpbWVzIHRvby4gVGhpcyBjYW4gcmVzdWx0IGluIGZhbHNlCisJCSAqIHBvc2l0aXZlcyBiZWluZyByZXBvcnRlZC4gVGhlcmZvcmUgd2UgaW1wbGVtZW50IGEKKwkJICogYmVzdC1maXQgYWxnb3JpdGhtIGhlcmUgd2hpY2ggcmV0dXJucyB0aGUgZW50cnkgZnJvbQorCQkgKiB0aGUgaGFzaCB3aGljaCBmaXRzIGJlc3QgdG8gdGhlIHJlZmVyZW5jZSB2YWx1ZQorCQkgKiBpbnN0ZWFkIG9mIHRoZSBmaXJzdC1maXQuCisJCSAqLworCQltYXRjaGVzICs9IDE7CisJCW1hdGNoX2x2bCA9IDA7CisJCWVudHJ5LT5zaXplICAgICAgPT0gcmVmLT5zaXplICAgICAgPyArK21hdGNoX2x2bCA6IG1hdGNoX2x2bDsKKwkJZW50cnktPnR5cGUgICAgICA9PSByZWYtPnR5cGUgICAgICA/ICsrbWF0Y2hfbHZsIDogbWF0Y2hfbHZsOworCQllbnRyeS0+ZGlyZWN0aW9uID09IHJlZi0+ZGlyZWN0aW9uID8gKyttYXRjaF9sdmwgOiBtYXRjaF9sdmw7CisKKwkJaWYgKG1hdGNoX2x2bCA9PSAzKSB7CisJCQkvKiBwZXJmZWN0LWZpdCAtIHJldHVybiB0aGUgcmVzdWx0ICovCiAJCQlyZXR1cm4gZW50cnk7CisJCX0gZWxzZSBpZiAobWF0Y2hfbHZsID4gbGFzdF9sdmwpIHsKKwkJCS8qCisJCQkgKiBXZSBmb3VuZCBhbiBlbnRyeSB0aGF0IGZpdHMgYmV0dGVyIHRoZW4gdGhlCisJCQkgKiBwcmV2aW91cyBvbmUKKwkJCSAqLworCQkJbGFzdF9sdmwgPSBtYXRjaF9sdmw7CisJCQlyZXQgICAgICA9IGVudHJ5OworCQl9CiAJfQogCi0JcmV0dXJuIE5VTEw7CisJLyoKKwkgKiBJZiB3ZSBoYXZlIG11bHRpcGxlIG1hdGNoZXMgYnV0IG5vIHBlcmZlY3QtZml0LCBqdXN0IHJldHVybgorCSAqIE5VTEwuCisJICovCisJcmV0ID0gKG1hdGNoZXMgPT0gMSkgPyByZXQgOiBOVUxMOworCisJcmV0dXJuIHJldDsKIH0KIAogLyoKQEAgLTI1Nyw2ICszNDksMjEgQEAKIAlwdXRfaGFzaF9idWNrZXQoYnVja2V0LCAmZmxhZ3MpOwogfQogCitzdGF0aWMgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqX19kbWFfZW50cnlfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5ICplbnRyeTsKKworCWVudHJ5ID0gbGlzdF9lbnRyeShmcmVlX2VudHJpZXMubmV4dCwgc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSwgbGlzdCk7CisJbGlzdF9kZWwoJmVudHJ5LT5saXN0KTsKKwltZW1zZXQoZW50cnksIDAsIHNpemVvZigqZW50cnkpKTsKKworCW51bV9mcmVlX2VudHJpZXMgLT0gMTsKKwlpZiAobnVtX2ZyZWVfZW50cmllcyA8IG1pbl9mcmVlX2VudHJpZXMpCisJCW1pbl9mcmVlX2VudHJpZXMgPSBudW1fZnJlZV9lbnRyaWVzOworCisJcmV0dXJuIGVudHJ5OworfQorCiAvKiBzdHJ1Y3QgZG1hX2VudHJ5IGFsbG9jYXRvcgogICoKICAqIFRoZSBuZXh0IHR3byBmdW5jdGlvbnMgaW1wbGVtZW50IHRoZSBhbGxvY2F0b3IgZm9yCkBAIC0yNzAsMTUgKzM3NywxMiBAQAogCXNwaW5fbG9ja19pcnFzYXZlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOwogCiAJaWYgKGxpc3RfZW1wdHkoJmZyZWVfZW50cmllcykpIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJETUEtQVBJOiBkZWJ1Z2dpbmcgb3V0IG9mIG1lbW9yeSAiCi0JCQkJIi0gZGlzYWJsaW5nXG4iKTsKKwkJcHJfZXJyKCJETUEtQVBJOiBkZWJ1Z2dpbmcgb3V0IG9mIG1lbW9yeSAtIGRpc2FibGluZ1xuIik7CiAJCWdsb2JhbF9kaXNhYmxlID0gdHJ1ZTsKIAkJZ290byBvdXQ7CiAJfQogCi0JZW50cnkgPSBsaXN0X2VudHJ5KGZyZWVfZW50cmllcy5uZXh0LCBzdHJ1Y3QgZG1hX2RlYnVnX2VudHJ5LCBsaXN0KTsKLQlsaXN0X2RlbCgmZW50cnktPmxpc3QpOwotCW1lbXNldChlbnRyeSwgMCwgc2l6ZW9mKCplbnRyeSkpOworCWVudHJ5ID0gX19kbWFfZW50cnlfYWxsb2MoKTsKIAogI2lmZGVmIENPTkZJR19TVEFDS1RSQUNFCiAJZW50cnktPnN0YWNrdHJhY2UubWF4X2VudHJpZXMgPSBETUFfREVCVUdfU1RBQ0tUUkFDRV9FTlRSSUVTOwpAQCAtMjg2LDkgKzM5MCw2IEBACiAJZW50cnktPnN0YWNrdHJhY2Uuc2tpcCA9IDI7CiAJc2F2ZV9zdGFja190cmFjZSgmZW50cnktPnN0YWNrdHJhY2UpOwogI2VuZGlmCi0JbnVtX2ZyZWVfZW50cmllcyAtPSAxOwotCWlmIChudW1fZnJlZV9lbnRyaWVzIDwgbWluX2ZyZWVfZW50cmllcykKLQkJbWluX2ZyZWVfZW50cmllcyA9IG51bV9mcmVlX2VudHJpZXM7CiAKIG91dDoKIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZmcmVlX2VudHJpZXNfbG9jaywgZmxhZ3MpOwpAQCAtMzEwLDYgKzQxMSw1MyBAQAogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyZWVfZW50cmllc19sb2NrLCBmbGFncyk7CiB9CiAKK2ludCBkbWFfZGVidWdfcmVzaXplX2VudHJpZXModTMyIG51bV9lbnRyaWVzKQoreworCWludCBpLCBkZWx0YSwgcmV0ID0gMDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5OworCUxJU1RfSEVBRCh0bXApOworCisJc3Bpbl9sb2NrX2lycXNhdmUoJmZyZWVfZW50cmllc19sb2NrLCBmbGFncyk7CisKKwlpZiAobnJfdG90YWxfZW50cmllcyA8IG51bV9lbnRyaWVzKSB7CisJCWRlbHRhID0gbnVtX2VudHJpZXMgLSBucl90b3RhbF9lbnRyaWVzOworCisJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyZWVfZW50cmllc19sb2NrLCBmbGFncyk7CisKKwkJZm9yIChpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKKwkJCWVudHJ5ID0ga3phbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7CisJCQlpZiAoIWVudHJ5KQorCQkJCWJyZWFrOworCisJCQlsaXN0X2FkZF90YWlsKCZlbnRyeS0+bGlzdCwgJnRtcCk7CisJCX0KKworCQlzcGluX2xvY2tfaXJxc2F2ZSgmZnJlZV9lbnRyaWVzX2xvY2ssIGZsYWdzKTsKKworCQlsaXN0X3NwbGljZSgmdG1wLCAmZnJlZV9lbnRyaWVzKTsKKwkJbnJfdG90YWxfZW50cmllcyArPSBpOworCQludW1fZnJlZV9lbnRyaWVzICs9IGk7CisJfSBlbHNlIHsKKwkJZGVsdGEgPSBucl90b3RhbF9lbnRyaWVzIC0gbnVtX2VudHJpZXM7CisKKwkJZm9yIChpID0gMDsgaSA8IGRlbHRhICYmICFsaXN0X2VtcHR5KCZmcmVlX2VudHJpZXMpOyBpKyspIHsKKwkJCWVudHJ5ID0gX19kbWFfZW50cnlfYWxsb2MoKTsKKwkJCWtmcmVlKGVudHJ5KTsKKwkJfQorCisJCW5yX3RvdGFsX2VudHJpZXMgLT0gaTsKKwl9CisKKwlpZiAobnJfdG90YWxfZW50cmllcyAhPSBudW1fZW50cmllcykKKwkJcmV0ID0gMTsKKworCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmZyZWVfZW50cmllc19sb2NrLCBmbGFncyk7CisKKwlyZXR1cm4gcmV0OworfQorRVhQT1JUX1NZTUJPTChkbWFfZGVidWdfcmVzaXplX2VudHJpZXMpOworCiAvKgogICogRE1BLUFQSSBkZWJ1Z2dpbmcgaW5pdCBjb2RlCiAgKgpAQCAtMzM0LDggKzQ4Miw3IEBACiAJbnVtX2ZyZWVfZW50cmllcyA9IG51bV9lbnRyaWVzOwogCW1pbl9mcmVlX2VudHJpZXMgPSBudW1fZW50cmllczsKIAotCXByaW50ayhLRVJOX0lORk8gIkRNQS1BUEk6IHByZWFsbG9jYXRlZCAlZCBkZWJ1ZyBlbnRyaWVzXG4iLAotCQkJbnVtX2VudHJpZXMpOworCXByX2luZm8oIkRNQS1BUEk6IHByZWFsbG9jYXRlZCAlZCBkZWJ1ZyBlbnRyaWVzXG4iLCBudW1fZW50cmllcyk7CiAKIAlyZXR1cm4gMDsKIApAQCAtMzQ5LDExICs0OTYsMTAyIEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKK3N0YXRpYyBzc2l6ZV90IGZpbHRlcl9yZWFkKHN0cnVjdCBmaWxlICpmaWxlLCBjaGFyIF9fdXNlciAqdXNlcl9idWYsCisJCQkgICBzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykKK3sKKwljaGFyIGJ1ZltOQU1FX01BWF9MRU4gKyAxXTsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBsZW47CisKKwlpZiAoIWN1cnJlbnRfZHJpdmVyX25hbWVbMF0pCisJCXJldHVybiAwOworCisJLyoKKwkgKiBXZSBjYW4ndCBjb3B5IHRvIHVzZXJzcGFjZSBkaXJlY3RseSBiZWNhdXNlIGN1cnJlbnRfZHJpdmVyX25hbWUgY2FuCisJICogb25seSBiZSByZWFkIHVuZGVyIHRoZSBkcml2ZXJfbmFtZV9sb2NrIHdpdGggaXJxcyBkaXNhYmxlZC4gU28KKwkgKiBjcmVhdGUgYSB0ZW1wb3JhcnkgY29weSBmaXJzdC4KKwkgKi8KKwlyZWFkX2xvY2tfaXJxc2F2ZSgmZHJpdmVyX25hbWVfbG9jaywgZmxhZ3MpOworCWxlbiA9IHNjbnByaW50ZihidWYsIE5BTUVfTUFYX0xFTiArIDEsICIlc1xuIiwgY3VycmVudF9kcml2ZXJfbmFtZSk7CisJcmVhZF91bmxvY2tfaXJxcmVzdG9yZSgmZHJpdmVyX25hbWVfbG9jaywgZmxhZ3MpOworCisJcmV0dXJuIHNpbXBsZV9yZWFkX2Zyb21fYnVmZmVyKHVzZXJfYnVmLCBjb3VudCwgcHBvcywgYnVmLCBsZW4pOworfQorCitzdGF0aWMgc3NpemVfdCBmaWx0ZXJfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191c2VyICp1c2VyYnVmLAorCQkJICAgIHNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9zKQoreworCWNoYXIgYnVmW05BTUVfTUFYX0xFTl07CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlzaXplX3QgbGVuOworCWludCBpOworCisJLyoKKwkgKiBXZSBjYW4ndCBjb3B5IGZyb20gdXNlcnNwYWNlIGRpcmVjdGx5LiBBY2Nlc3MgdG8KKwkgKiBjdXJyZW50X2RyaXZlcl9uYW1lIGlzIHByb3RlY3RlZCB3aXRoIGEgd3JpdGVfbG9jayB3aXRoIGlycXMKKwkgKiBkaXNhYmxlZC4gU2luY2UgY29weV9mcm9tX3VzZXIgY2FuIGZhdWx0IGFuZCBtYXkgc2xlZXAgd2UKKwkgKiBuZWVkIHRvIGNvcHkgdG8gdGVtcG9yYXJ5IGJ1ZmZlciBmaXJzdAorCSAqLworCWxlbiA9IG1pbihjb3VudCwgKHNpemVfdCkoTkFNRV9NQVhfTEVOIC0gMSkpOworCWlmIChjb3B5X2Zyb21fdXNlcihidWYsIHVzZXJidWYsIGxlbikpCisJCXJldHVybiAtRUZBVUxUOworCisJYnVmW2xlbl0gPSAwOworCisJd3JpdGVfbG9ja19pcnFzYXZlKCZkcml2ZXJfbmFtZV9sb2NrLCBmbGFncyk7CisKKwkvKgorCSAqIE5vdyBoYW5kbGUgdGhlIHN0cmluZyB3ZSBnb3QgZnJvbSB1c2Vyc3BhY2UgdmVyeSBjYXJlZnVsbHkuCisJICogVGhlIHJ1bGVzIGFyZToKKwkgKiAgICAgICAgIC0gb25seSB1c2UgdGhlIGZpcnN0IHRva2VuIHdlIGdvdAorCSAqICAgICAgICAgLSB0b2tlbiBkZWxpbWl0ZXIgaXMgZXZlcnl0aGluZyBsb29raW5nIGxpa2UgYSBzcGFjZQorCSAqICAgICAgICAgICBjaGFyYWN0ZXIgKCcgJywgJ1xuJywgJ1x0JyAuLi4pCisJICoKKwkgKi8KKwlpZiAoIWlzYWxudW0oYnVmWzBdKSkgeworCQkvKgorCQkgKiBJZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHVzZXJzcGFjZSBnYXZlIHVzIGlzIG5vdAorCQkgKiBhbHBoYW51bWVyaWNhbCB0aGVuIGFzc3VtZSB0aGUgZmlsdGVyIHNob3VsZCBiZQorCQkgKiBzd2l0Y2hlZCBvZmYuCisJCSAqLworCQlpZiAoY3VycmVudF9kcml2ZXJfbmFtZVswXSkKKwkJCXByX2luZm8oIkRNQS1BUEk6IHN3aXRjaGluZyBvZmYgZG1hLWRlYnVnIGRyaXZlciBmaWx0ZXJcbiIpOworCQljdXJyZW50X2RyaXZlcl9uYW1lWzBdID0gMDsKKwkJY3VycmVudF9kcml2ZXIgPSBOVUxMOworCQlnb3RvIG91dF91bmxvY2s7CisJfQorCisJLyoKKwkgKiBOb3cgcGFyc2Ugb3V0IHRoZSBmaXJzdCB0b2tlbiBhbmQgdXNlIGl0IGFzIHRoZSBuYW1lIGZvciB0aGUKKwkgKiBkcml2ZXIgdG8gZmlsdGVyIGZvci4KKwkgKi8KKwlmb3IgKGkgPSAwOyBpIDwgTkFNRV9NQVhfTEVOOyArK2kpIHsKKwkJY3VycmVudF9kcml2ZXJfbmFtZVtpXSA9IGJ1ZltpXTsKKwkJaWYgKGlzc3BhY2UoYnVmW2ldKSB8fCBidWZbaV0gPT0gJyAnIHx8IGJ1ZltpXSA9PSAwKQorCQkJYnJlYWs7CisJfQorCWN1cnJlbnRfZHJpdmVyX25hbWVbaV0gPSAwOworCWN1cnJlbnRfZHJpdmVyID0gTlVMTDsKKworCXByX2luZm8oIkRNQS1BUEk6IGVuYWJsZSBkcml2ZXIgZmlsdGVyIGZvciBkcml2ZXIgWyVzXVxuIiwKKwkJY3VycmVudF9kcml2ZXJfbmFtZSk7CisKK291dF91bmxvY2s6CisJd3JpdGVfdW5sb2NrX2lycXJlc3RvcmUoJmRyaXZlcl9uYW1lX2xvY2ssIGZsYWdzKTsKKworCXJldHVybiBjb3VudDsKK30KKworY29uc3Qgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBmaWx0ZXJfZm9wcyA9IHsKKwkucmVhZCAgPSBmaWx0ZXJfcmVhZCwKKwkud3JpdGUgPSBmaWx0ZXJfd3JpdGUsCit9OworCiBzdGF0aWMgaW50IGRtYV9kZWJ1Z19mc19pbml0KHZvaWQpCiB7CiAJZG1hX2RlYnVnX2RlbnQgPSBkZWJ1Z2ZzX2NyZWF0ZV9kaXIoImRtYS1hcGkiLCBOVUxMKTsKIAlpZiAoIWRtYV9kZWJ1Z19kZW50KSB7Ci0JCXByaW50ayhLRVJOX0VSUiAiRE1BLUFQSTogY2FuIG5vdCBjcmVhdGUgZGVidWdmcyBkaXJlY3RvcnlcbiIpOworCQlwcl9lcnIoIkRNQS1BUEk6IGNhbiBub3QgY3JlYXRlIGRlYnVnZnMgZGlyZWN0b3J5XG4iKTsKIAkJcmV0dXJuIC1FTk9NRU07CiAJfQogCkBAIC0zOTIsNiArNjMwLDExIEBACiAJaWYgKCFtaW5fZnJlZV9lbnRyaWVzX2RlbnQpCiAJCWdvdG8gb3V0X2VycjsKIAorCWZpbHRlcl9kZW50ID0gZGVidWdmc19jcmVhdGVfZmlsZSgiZHJpdmVyX2ZpbHRlciIsIDA2NDQsCisJCQkJCSAgZG1hX2RlYnVnX2RlbnQsIE5VTEwsICZmaWx0ZXJfZm9wcyk7CisJaWYgKCFmaWx0ZXJfZGVudCkKKwkJZ290byBvdXRfZXJyOworCiAJcmV0dXJuIDA7CiAKIG91dF9lcnI6CkBAIC00MDAsOSArNjQzLDY0IEBACiAJcmV0dXJuIC1FTk9NRU07CiB9CiAKK3N0YXRpYyBpbnQgZGV2aWNlX2RtYV9hbGxvY2F0aW9ucyhzdHJ1Y3QgZGV2aWNlICpkZXYpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnk7CisJdW5zaWduZWQgbG9uZyBmbGFnczsKKwlpbnQgY291bnQgPSAwLCBpOworCisJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOworCisJZm9yIChpID0gMDsgaSA8IEhBU0hfU0laRTsgKytpKSB7CisJCXNwaW5fbG9jaygmZG1hX2VudHJ5X2hhc2hbaV0ubG9jayk7CisJCWxpc3RfZm9yX2VhY2hfZW50cnkoZW50cnksICZkbWFfZW50cnlfaGFzaFtpXS5saXN0LCBsaXN0KSB7CisJCQlpZiAoZW50cnktPmRldiA9PSBkZXYpCisJCQkJY291bnQgKz0gMTsKKwkJfQorCQlzcGluX3VubG9jaygmZG1hX2VudHJ5X2hhc2hbaV0ubG9jayk7CisJfQorCisJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOworCisJcmV0dXJuIGNvdW50OworfQorCitzdGF0aWMgaW50IGRtYV9kZWJ1Z19kZXZpY2VfY2hhbmdlKHN0cnVjdCBub3RpZmllcl9ibG9jayAqbmIsCisJCQkJICAgIHVuc2lnbmVkIGxvbmcgYWN0aW9uLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBkZXZpY2UgKmRldiA9IGRhdGE7CisJaW50IGNvdW50OworCisKKwlzd2l0Y2ggKGFjdGlvbikgeworCWNhc2UgQlVTX05PVElGWV9VTkJPVU5EX0RSSVZFUjoKKwkJY291bnQgPSBkZXZpY2VfZG1hX2FsbG9jYXRpb25zKGRldik7CisJCWlmIChjb3VudCA9PSAwKQorCQkJYnJlYWs7CisJCWVycl9wcmludGsoZGV2LCBOVUxMLCAiRE1BLUFQSTogZGV2aWNlIGRyaXZlciBoYXMgcGVuZGluZyAiCisJCQkJIkRNQSBhbGxvY2F0aW9ucyB3aGlsZSByZWxlYXNlZCBmcm9tIGRldmljZSAiCisJCQkJIltjb3VudD0lZF1cbiIsIGNvdW50KTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKIHZvaWQgZG1hX2RlYnVnX2FkZF9idXMoc3RydWN0IGJ1c190eXBlICpidXMpCiB7Ci0JLyogRklYTUU6IHJlZ2lzdGVyIG5vdGlmaWVyICovCisJc3RydWN0IG5vdGlmaWVyX2Jsb2NrICpuYjsKKworCW5iID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IG5vdGlmaWVyX2Jsb2NrKSwgR0ZQX0tFUk5FTCk7CisJaWYgKG5iID09IE5VTEwpIHsKKwkJcHJfZXJyKCJkbWFfZGVidWdfYWRkX2J1czogb3V0IG9mIG1lbW9yeVxuIik7CisJCXJldHVybjsKKwl9CisKKwluYi0+bm90aWZpZXJfY2FsbCA9IGRtYV9kZWJ1Z19kZXZpY2VfY2hhbmdlOworCisJYnVzX3JlZ2lzdGVyX25vdGlmaWVyKGJ1cywgbmIpOwogfQogCiAvKgpAQCAtNDIxLDggKzcxOSw3IEBACiAJfQogCiAJaWYgKGRtYV9kZWJ1Z19mc19pbml0KCkgIT0gMCkgewotCQlwcmludGsoS0VSTl9FUlIgIkRNQS1BUEk6IGVycm9yIGNyZWF0aW5nIGRlYnVnZnMgZW50cmllcyAiCi0JCQkJIi0gZGlzYWJsaW5nXG4iKTsKKwkJcHJfZXJyKCJETUEtQVBJOiBlcnJvciBjcmVhdGluZyBkZWJ1Z2ZzIGVudHJpZXMgLSBkaXNhYmxpbmdcbiIpOwogCQlnbG9iYWxfZGlzYWJsZSA9IHRydWU7CiAKIAkJcmV0dXJuOwpAQCAtNDMyLDE0ICs3MjksMTUgQEAKIAkJbnVtX2VudHJpZXMgPSByZXFfZW50cmllczsKIAogCWlmIChwcmVhbGxvY19tZW1vcnkobnVtX2VudHJpZXMpICE9IDApIHsKLQkJcHJpbnRrKEtFUk5fRVJSICJETUEtQVBJOiBkZWJ1Z2dpbmcgb3V0IG9mIG1lbW9yeSBlcnJvciAiCi0JCQkJIi0gZGlzYWJsZWRcbiIpOworCQlwcl9lcnIoIkRNQS1BUEk6IGRlYnVnZ2luZyBvdXQgb2YgbWVtb3J5IGVycm9yIC0gZGlzYWJsZWRcbiIpOwogCQlnbG9iYWxfZGlzYWJsZSA9IHRydWU7CiAKIAkJcmV0dXJuOwogCX0KIAotCXByaW50ayhLRVJOX0lORk8gIkRNQS1BUEk6IGRlYnVnZ2luZyBlbmFibGVkIGJ5IGtlcm5lbCBjb25maWdcbiIpOworCW5yX3RvdGFsX2VudHJpZXMgPSBudW1fZnJlZV9lbnRyaWVzOworCisJcHJfaW5mbygiRE1BLUFQSTogZGVidWdnaW5nIGVuYWJsZWQgYnkga2VybmVsIGNvbmZpZ1xuIik7CiB9CiAKIHN0YXRpYyBfX2luaXQgaW50IGRtYV9kZWJ1Z19jbWRsaW5lKGNoYXIgKnN0cikKQEAgLTQ0OCw4ICs3NDYsNyBAQAogCQlyZXR1cm4gLUVJTlZBTDsKIAogCWlmIChzdHJuY21wKHN0ciwgIm9mZiIsIDMpID09IDApIHsKLQkJcHJpbnRrKEtFUk5fSU5GTyAiRE1BLUFQSTogZGVidWdnaW5nIGRpc2FibGVkIG9uIGtlcm5lbCAiCi0JCQkJICJjb21tYW5kIGxpbmVcbiIpOworCQlwcl9pbmZvKCJETUEtQVBJOiBkZWJ1Z2dpbmcgZGlzYWJsZWQgb24ga2VybmVsIGNvbW1hbmQgbGluZVxuIik7CiAJCWdsb2JhbF9kaXNhYmxlID0gdHJ1ZTsKIAl9CiAKQEAgLTcyMywxNSArMTAyMCwxNSBAQAogCQllbnRyeS0+dHlwZSAgICAgICAgICAgPSBkbWFfZGVidWdfc2c7CiAJCWVudHJ5LT5kZXYgICAgICAgICAgICA9IGRldjsKIAkJZW50cnktPnBhZGRyICAgICAgICAgID0gc2dfcGh5cyhzKTsKLQkJZW50cnktPnNpemUgICAgICAgICAgID0gcy0+bGVuZ3RoOwotCQllbnRyeS0+ZGV2X2FkZHIgICAgICAgPSBzLT5kbWFfYWRkcmVzczsKKwkJZW50cnktPnNpemUgICAgICAgICAgID0gc2dfZG1hX2xlbihzKTsKKwkJZW50cnktPmRldl9hZGRyICAgICAgID0gc2dfZG1hX2FkZHJlc3Mocyk7CiAJCWVudHJ5LT5kaXJlY3Rpb24gICAgICA9IGRpcmVjdGlvbjsKIAkJZW50cnktPnNnX2NhbGxfZW50cyAgID0gbmVudHM7CiAJCWVudHJ5LT5zZ19tYXBwZWRfZW50cyA9IG1hcHBlZF9lbnRzOwogCiAJCWlmICghUGFnZUhpZ2hNZW0oc2dfcGFnZShzKSkpIHsKIAkJCWNoZWNrX2Zvcl9zdGFjayhkZXYsIHNnX3ZpcnQocykpOwotCQkJY2hlY2tfZm9yX2lsbGVnYWxfYXJlYShkZXYsIHNnX3ZpcnQocyksIHMtPmxlbmd0aCk7CisJCQljaGVja19mb3JfaWxsZWdhbF9hcmVhKGRldiwgc2dfdmlydChzKSwgc2dfZG1hX2xlbihzKSk7CiAJCX0KIAogCQlhZGRfZG1hX2VudHJ5KGVudHJ5KTsKQEAgLTczOSwxMyArMTAzNiwzMyBAQAogfQogRVhQT1JUX1NZTUJPTChkZWJ1Z19kbWFfbWFwX3NnKTsKIAorc3RhdGljIGludCBnZXRfbnJfbWFwcGVkX2VudHJpZXMoc3RydWN0IGRldmljZSAqZGV2LCBzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnMpCit7CisJc3RydWN0IGRtYV9kZWJ1Z19lbnRyeSAqZW50cnksIHJlZjsKKwlzdHJ1Y3QgaGFzaF9idWNrZXQgKmJ1Y2tldDsKKwl1bnNpZ25lZCBsb25nIGZsYWdzOworCWludCBtYXBwZWRfZW50czsKKworCXJlZi5kZXYgICAgICA9IGRldjsKKwlyZWYuZGV2X2FkZHIgPSBzZ19kbWFfYWRkcmVzcyhzKTsKKwlyZWYuc2l6ZSAgICAgPSBzZ19kbWFfbGVuKHMpLAorCisJYnVja2V0ICAgICAgID0gZ2V0X2hhc2hfYnVja2V0KCZyZWYsICZmbGFncyk7CisJZW50cnkgICAgICAgID0gaGFzaF9idWNrZXRfZmluZChidWNrZXQsICZyZWYpOworCW1hcHBlZF9lbnRzICA9IDA7CisKKwlpZiAoZW50cnkpCisJCW1hcHBlZF9lbnRzID0gZW50cnktPnNnX21hcHBlZF9lbnRzOworCXB1dF9oYXNoX2J1Y2tldChidWNrZXQsICZmbGFncyk7CisKKwlyZXR1cm4gbWFwcGVkX2VudHM7Cit9CisKIHZvaWQgZGVidWdfZG1hX3VubWFwX3NnKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2xpc3QsCiAJCQlpbnQgbmVsZW1zLCBpbnQgZGlyKQogewotCXN0cnVjdCBkbWFfZGVidWdfZW50cnkgKmVudHJ5OwogCXN0cnVjdCBzY2F0dGVybGlzdCAqczsKIAlpbnQgbWFwcGVkX2VudHMgPSAwLCBpOwotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAlpZiAodW5saWtlbHkoZ2xvYmFsX2Rpc2FibGUpKQogCQlyZXR1cm47CkBAIC03NTYsOCArMTA3Myw4IEBACiAJCQkudHlwZSAgICAgICAgICAgPSBkbWFfZGVidWdfc2csCiAJCQkuZGV2ICAgICAgICAgICAgPSBkZXYsCiAJCQkucGFkZHIgICAgICAgICAgPSBzZ19waHlzKHMpLAotCQkJLmRldl9hZGRyICAgICAgID0gcy0+ZG1hX2FkZHJlc3MsCi0JCQkuc2l6ZSAgICAgICAgICAgPSBzLT5sZW5ndGgsCisJCQkuZGV2X2FkZHIgICAgICAgPSBzZ19kbWFfYWRkcmVzcyhzKSwKKwkJCS5zaXplICAgICAgICAgICA9IHNnX2RtYV9sZW4ocyksCiAJCQkuZGlyZWN0aW9uICAgICAgPSBkaXIsCiAJCQkuc2dfY2FsbF9lbnRzICAgPSAwLAogCQl9OwpAQCAtNzY1LDE0ICsxMDgyLDkgQEAKIAkJaWYgKG1hcHBlZF9lbnRzICYmIGkgPj0gbWFwcGVkX2VudHMpCiAJCQlicmVhazsKIAotCQlpZiAobWFwcGVkX2VudHMgPT0gMCkgewotCQkJc3RydWN0IGhhc2hfYnVja2V0ICpidWNrZXQ7CisJCWlmICghaSkgewogCQkJcmVmLnNnX2NhbGxfZW50cyA9IG5lbGVtczsKLQkJCWJ1Y2tldCA9IGdldF9oYXNoX2J1Y2tldCgmcmVmLCAmZmxhZ3MpOwotCQkJZW50cnkgPSBoYXNoX2J1Y2tldF9maW5kKGJ1Y2tldCwgJnJlZik7Ci0JCQlpZiAoZW50cnkpCi0JCQkJbWFwcGVkX2VudHMgPSBlbnRyeS0+c2dfbWFwcGVkX2VudHM7Ci0JCQlwdXRfaGFzaF9idWNrZXQoYnVja2V0LCAmZmxhZ3MpOworCQkJbWFwcGVkX2VudHMgPSBnZXRfbnJfbWFwcGVkX2VudHJpZXMoZGV2LCBzKTsKIAkJfQogCiAJCWNoZWNrX3VubWFwKCZyZWYpOwpAQCAtODc0LDE0ICsxMTg2LDIwIEBACiAJCQkgICAgICAgaW50IG5lbGVtcywgaW50IGRpcmVjdGlvbikKIHsKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnM7Ci0JaW50IGk7CisJaW50IG1hcHBlZF9lbnRzID0gMCwgaTsKIAogCWlmICh1bmxpa2VseShnbG9iYWxfZGlzYWJsZSkpCiAJCXJldHVybjsKIAogCWZvcl9lYWNoX3NnKHNnLCBzLCBuZWxlbXMsIGkpIHsKLQkJY2hlY2tfc3luYyhkZXYsIHMtPmRtYV9hZGRyZXNzLCBzLT5kbWFfbGVuZ3RoLCAwLAotCQkJCWRpcmVjdGlvbiwgdHJ1ZSk7CisJCWlmICghaSkKKwkJCW1hcHBlZF9lbnRzID0gZ2V0X25yX21hcHBlZF9lbnRyaWVzKGRldiwgcyk7CisKKwkJaWYgKGkgPj0gbWFwcGVkX2VudHMpCisJCQlicmVhazsKKworCQljaGVja19zeW5jKGRldiwgc2dfZG1hX2FkZHJlc3MocyksIHNnX2RtYV9sZW4ocyksIDAsCisJCQkgICBkaXJlY3Rpb24sIHRydWUpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woZGVidWdfZG1hX3N5bmNfc2dfZm9yX2NwdSk7CkBAIC04OTAsMTUgKzEyMDgsMzkgQEAKIAkJCQkgIGludCBuZWxlbXMsIGludCBkaXJlY3Rpb24pCiB7CiAJc3RydWN0IHNjYXR0ZXJsaXN0ICpzOwotCWludCBpOworCWludCBtYXBwZWRfZW50cyA9IDAsIGk7CiAKIAlpZiAodW5saWtlbHkoZ2xvYmFsX2Rpc2FibGUpKQogCQlyZXR1cm47CiAKIAlmb3JfZWFjaF9zZyhzZywgcywgbmVsZW1zLCBpKSB7Ci0JCWNoZWNrX3N5bmMoZGV2LCBzLT5kbWFfYWRkcmVzcywgcy0+ZG1hX2xlbmd0aCwgMCwKLQkJCQlkaXJlY3Rpb24sIGZhbHNlKTsKKwkJaWYgKCFpKQorCQkJbWFwcGVkX2VudHMgPSBnZXRfbnJfbWFwcGVkX2VudHJpZXMoZGV2LCBzKTsKKworCQlpZiAoaSA+PSBtYXBwZWRfZW50cykKKwkJCWJyZWFrOworCisJCWNoZWNrX3N5bmMoZGV2LCBzZ19kbWFfYWRkcmVzcyhzKSwgc2dfZG1hX2xlbihzKSwgMCwKKwkJCSAgIGRpcmVjdGlvbiwgZmFsc2UpOwogCX0KIH0KIEVYUE9SVF9TWU1CT0woZGVidWdfZG1hX3N5bmNfc2dfZm9yX2RldmljZSk7CiAKK3N0YXRpYyBpbnQgX19pbml0IGRtYV9kZWJ1Z19kcml2ZXJfc2V0dXAoY2hhciAqc3RyKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IE5BTUVfTUFYX0xFTiAtIDE7ICsraSwgKytzdHIpIHsKKwkJY3VycmVudF9kcml2ZXJfbmFtZVtpXSA9ICpzdHI7CisJCWlmICgqc3RyID09IDApCisJCQlicmVhazsKKwl9CisKKwlpZiAoY3VycmVudF9kcml2ZXJfbmFtZVswXSkKKwkJcHJfaW5mbygiRE1BLUFQSTogZW5hYmxlIGRyaXZlciBmaWx0ZXIgZm9yIGRyaXZlciBbJXNdXG4iLAorCQkJY3VycmVudF9kcml2ZXJfbmFtZSk7CisKKworCXJldHVybiAxOworfQorX19zZXR1cCgiZG1hX2RlYnVnX2RyaXZlcj0iLCBkbWFfZGVidWdfZHJpdmVyX3NldHVwKTsKZGlmZiAtLWdpdCBhL2xpYi9zd2lvdGxiLmMgYi9saWIvc3dpb3RsYi5jCmluZGV4IDJiMGI1YTcuLmJmZmU2ZDcgMTAwNjQ0Ci0tLSBhL2xpYi9zd2lvdGxiLmMKKysrIGIvbGliL3N3aW90bGIuYwpAQCAtNjAsOCArNjAsOCBAQAogaW50IHN3aW90bGJfZm9yY2U7CiAKIC8qCi0gKiBVc2VkIHRvIGRvIGEgcXVpY2sgcmFuZ2UgY2hlY2sgaW4gc3dpb3RsYl91bm1hcF9zaW5nbGUgYW5kCi0gKiBzd2lvdGxiX3N5bmNfc2luZ2xlXyosIHRvIHNlZSBpZiB0aGUgbWVtb3J5IHdhcyBpbiBmYWN0IGFsbG9jYXRlZCBieSB0aGlzCisgKiBVc2VkIHRvIGRvIGEgcXVpY2sgcmFuZ2UgY2hlY2sgaW4gdW5tYXBfc2luZ2xlIGFuZAorICogc3luY19zaW5nbGVfKiwgdG8gc2VlIGlmIHRoZSBtZW1vcnkgd2FzIGluIGZhY3QgYWxsb2NhdGVkIGJ5IHRoaXMKICAqIEFQSS4KICAqLwogc3RhdGljIGNoYXIgKmlvX3RsYl9zdGFydCwgKmlvX3RsYl9lbmQ7CkBAIC0xMjksNyArMTI5LDcgQEAKIAlyZXR1cm4gcGFkZHI7CiB9CiAKLXBoeXNfYWRkcl90IF9fd2VhayBzd2lvdGxiX2J1c190b19waHlzKGRtYV9hZGRyX3QgYmFkZHIpCitwaHlzX2FkZHJfdCBfX3dlYWsgc3dpb3RsYl9idXNfdG9fcGh5cyhzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBiYWRkcikKIHsKIAlyZXR1cm4gYmFkZHI7CiB9CkBAIC0xNDAsOSArMTQwLDE1IEBACiAJcmV0dXJuIHN3aW90bGJfcGh5c190b19idXMoaHdkZXYsIHZpcnRfdG9fcGh5cyhhZGRyZXNzKSk7CiB9CiAKLXN0YXRpYyB2b2lkICpzd2lvdGxiX2J1c190b192aXJ0KGRtYV9hZGRyX3QgYWRkcmVzcykKK3ZvaWQgKiBfX3dlYWsgc3dpb3RsYl9idXNfdG9fdmlydChzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBhZGRyZXNzKQogewotCXJldHVybiBwaHlzX3RvX3ZpcnQoc3dpb3RsYl9idXNfdG9fcGh5cyhhZGRyZXNzKSk7CisJcmV0dXJuIHBoeXNfdG9fdmlydChzd2lvdGxiX2J1c190b19waHlzKGh3ZGV2LCBhZGRyZXNzKSk7Cit9CisKK2ludCBfX3dlYWsgc3dpb3RsYl9hcmNoX2FkZHJlc3NfbmVlZHNfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlICpod2RldiwKKwkJCQkJICAgICAgIGRtYV9hZGRyX3QgYWRkciwgc2l6ZV90IHNpemUpCit7CisJcmV0dXJuICFpc19idWZmZXJfZG1hX2NhcGFibGUoZG1hX2dldF9tYXNrKGh3ZGV2KSwgYWRkciwgc2l6ZSk7CiB9CiAKIGludCBfX3dlYWsgc3dpb3RsYl9hcmNoX3JhbmdlX25lZWRzX21hcHBpbmcocGh5c19hZGRyX3QgcGFkZHIsIHNpemVfdCBzaXplKQpAQCAtMzA5LDEwICszMTUsMTAgQEAKIAlyZXR1cm4gLUVOT01FTTsKIH0KIAotc3RhdGljIGludAorc3RhdGljIGlubGluZSBpbnQKIGFkZHJlc3NfbmVlZHNfbWFwcGluZyhzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBhZGRyLCBzaXplX3Qgc2l6ZSkKIHsKLQlyZXR1cm4gIWlzX2J1ZmZlcl9kbWFfY2FwYWJsZShkbWFfZ2V0X21hc2soaHdkZXYpLCBhZGRyLCBzaXplKTsKKwlyZXR1cm4gc3dpb3RsYl9hcmNoX2FkZHJlc3NfbmVlZHNfbWFwcGluZyhod2RldiwgYWRkciwgc2l6ZSk7CiB9CiAKIHN0YXRpYyBpbmxpbmUgaW50IHJhbmdlX25lZWRzX21hcHBpbmcocGh5c19hZGRyX3QgcGFkZHIsIHNpemVfdCBzaXplKQpAQCAtMzQxLDcgKzM0Nyw3IEBACiAJCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAKIAkJd2hpbGUgKHNpemUpIHsKLQkJCXN6ID0gbWluKFBBR0VfU0laRSAtIG9mZnNldCwgc2l6ZSk7CisJCQlzeiA9IG1pbl90KHNpemVfdCwgUEFHRV9TSVpFIC0gb2Zmc2V0LCBzaXplKTsKIAogCQkJbG9jYWxfaXJxX3NhdmUoZmxhZ3MpOwogCQkJYnVmZmVyID0ga21hcF9hdG9taWMocGZuX3RvX3BhZ2UocGZuKSwKQEAgLTQ3Niw3ICs0ODIsNyBAQAogICogZG1hX2FkZHIgaXMgdGhlIGtlcm5lbCB2aXJ0dWFsIGFkZHJlc3Mgb2YgdGhlIGJvdW5jZSBidWZmZXIgdG8gdW5tYXAuCiAgKi8KIHN0YXRpYyB2b2lkCi11bm1hcF9zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGNoYXIgKmRtYV9hZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGRpcikKK2RvX3VubWFwX3NpbmdsZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgY2hhciAqZG1hX2FkZHIsIHNpemVfdCBzaXplLCBpbnQgZGlyKQogewogCXVuc2lnbmVkIGxvbmcgZmxhZ3M7CiAJaW50IGksIGNvdW50LCBuc2xvdHMgPSBBTElHTihzaXplLCAxIDw8IElPX1RMQl9TSElGVCkgPj4gSU9fVExCX1NISUZUOwpAQCAtNTYwLDcgKzU2Niw2IEBACiAJCQkJICAgc2l6ZSkpIHsKIAkJLyoKIAkJICogVGhlIGFsbG9jYXRlZCBtZW1vcnkgaXNuJ3QgcmVhY2hhYmxlIGJ5IHRoZSBkZXZpY2UuCi0JCSAqIEZhbGwgYmFjayBvbiBzd2lvdGxiX21hcF9zaW5nbGUoKS4KIAkJICovCiAJCWZyZWVfcGFnZXMoKHVuc2lnbmVkIGxvbmcpIHJldCwgb3JkZXIpOwogCQlyZXQgPSBOVUxMOwpAQCAtNTY4LDkgKzU3Myw4IEBACiAJaWYgKCFyZXQpIHsKIAkJLyoKIAkJICogV2UgYXJlIGVpdGhlciBvdXQgb2YgbWVtb3J5IG9yIHRoZSBkZXZpY2UgY2FuJ3QgRE1BCi0JCSAqIHRvIEdGUF9ETUEgbWVtb3J5OyBmYWxsIGJhY2sgb24KLQkJICogc3dpb3RsYl9tYXBfc2luZ2xlKCksIHdoaWNoIHdpbGwgZ3JhYiBtZW1vcnkgZnJvbQotCQkgKiB0aGUgbG93ZXN0IGF2YWlsYWJsZSBhZGRyZXNzIHJhbmdlLgorCQkgKiB0byBHRlBfRE1BIG1lbW9yeTsgZmFsbCBiYWNrIG9uIG1hcF9zaW5nbGUoKSwgd2hpY2gKKwkJICogd2lsbCBncmFiIG1lbW9yeSBmcm9tIHRoZSBsb3dlc3QgYXZhaWxhYmxlIGFkZHJlc3MgcmFuZ2UuCiAJCSAqLwogCQlyZXQgPSBtYXBfc2luZ2xlKGh3ZGV2LCAwLCBzaXplLCBETUFfRlJPTV9ERVZJQ0UpOwogCQlpZiAoIXJldCkKQEAgLTU4Nyw3ICs1OTEsNyBAQAogCQkgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylkZXZfYWRkcik7CiAKIAkJLyogRE1BX1RPX0RFVklDRSB0byBhdm9pZCBtZW1jcHkgaW4gdW5tYXBfc2luZ2xlICovCi0JCXVubWFwX3NpbmdsZShod2RldiwgcmV0LCBzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJZG9fdW5tYXBfc2luZ2xlKGh3ZGV2LCByZXQsIHNpemUsIERNQV9UT19ERVZJQ0UpOwogCQlyZXR1cm4gTlVMTDsKIAl9CiAJKmRtYV9oYW5kbGUgPSBkZXZfYWRkcjsKQEAgLTYwNCw3ICs2MDgsNyBAQAogCQlmcmVlX3BhZ2VzKCh1bnNpZ25lZCBsb25nKSB2YWRkciwgZ2V0X29yZGVyKHNpemUpKTsKIAllbHNlCiAJCS8qIERNQV9UT19ERVZJQ0UgdG8gYXZvaWQgbWVtY3B5IGluIHVubWFwX3NpbmdsZSAqLwotCQl1bm1hcF9zaW5nbGUoaHdkZXYsIHZhZGRyLCBzaXplLCBETUFfVE9fREVWSUNFKTsKKwkJZG9fdW5tYXBfc2luZ2xlKGh3ZGV2LCB2YWRkciwgc2l6ZSwgRE1BX1RPX0RFVklDRSk7CiB9CiBFWFBPUlRfU1lNQk9MKHN3aW90bGJfZnJlZV9jb2hlcmVudCk7CiAKQEAgLTYzNCw3ICs2MzgsNyBAQAogICogcGh5c2ljYWwgYWRkcmVzcyB0byB1c2UgaXMgcmV0dXJuZWQuCiAgKgogICogT25jZSB0aGUgZGV2aWNlIGlzIGdpdmVuIHRoZSBkbWEgYWRkcmVzcywgdGhlIGRldmljZSBvd25zIHRoaXMgbWVtb3J5IHVudGlsCi0gKiBlaXRoZXIgc3dpb3RsYl91bm1hcF9zaW5nbGUgb3Igc3dpb3RsYl9kbWFfc3luY19zaW5nbGUgaXMgcGVyZm9ybWVkLgorICogZWl0aGVyIHN3aW90bGJfdW5tYXBfcGFnZSBvciBzd2lvdGxiX2RtYV9zeW5jX3NpbmdsZSBpcyBwZXJmb3JtZWQuCiAgKi8KIGRtYV9hZGRyX3Qgc3dpb3RsYl9tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBwYWdlICpwYWdlLAogCQkJICAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwKQEAgLTY0MiwxOCArNjQ2LDE3IEBACiAJCQkgICAgc3RydWN0IGRtYV9hdHRycyAqYXR0cnMpCiB7CiAJcGh5c19hZGRyX3QgcGh5cyA9IHBhZ2VfdG9fcGh5cyhwYWdlKSArIG9mZnNldDsKLQl2b2lkICpwdHIgPSBwYWdlX2FkZHJlc3MocGFnZSkgKyBvZmZzZXQ7CiAJZG1hX2FkZHJfdCBkZXZfYWRkciA9IHN3aW90bGJfcGh5c190b19idXMoZGV2LCBwaHlzKTsKIAl2b2lkICptYXA7CiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAkvKgotCSAqIElmIHRoZSBwb2ludGVyIHBhc3NlZCBpbiBoYXBwZW5zIHRvIGJlIGluIHRoZSBkZXZpY2UncyBETUEgd2luZG93LAorCSAqIElmIHRoZSBhZGRyZXNzIGhhcHBlbnMgdG8gYmUgaW4gdGhlIGRldmljZSdzIERNQSB3aW5kb3csCiAJICogd2UgY2FuIHNhZmVseSByZXR1cm4gdGhlIGRldmljZSBhZGRyIGFuZCBub3Qgd29ycnkgYWJvdXQgYm91bmNlCiAJICogYnVmZmVyaW5nIGl0LgogCSAqLwogCWlmICghYWRkcmVzc19uZWVkc19tYXBwaW5nKGRldiwgZGV2X2FkZHIsIHNpemUpICYmCi0JICAgICFyYW5nZV9uZWVkc19tYXBwaW5nKHZpcnRfdG9fcGh5cyhwdHIpLCBzaXplKSkKKwkgICAgIXJhbmdlX25lZWRzX21hcHBpbmcocGh5cywgc2l6ZSkpCiAJCXJldHVybiBkZXZfYWRkcjsKIAogCS8qCkBAIC02NzksMjMgKzY4MiwzNSBAQAogCiAvKgogICogVW5tYXAgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uLiAgVGhlIGRtYV9hZGRyIGFuZCBzaXplIG11c3QKLSAqIG1hdGNoIHdoYXQgd2FzIHByb3ZpZGVkIGZvciBpbiBhIHByZXZpb3VzIHN3aW90bGJfbWFwX3NpbmdsZSBjYWxsLiAgQWxsCisgKiBtYXRjaCB3aGF0IHdhcyBwcm92aWRlZCBmb3IgaW4gYSBwcmV2aW91cyBzd2lvdGxiX21hcF9wYWdlIGNhbGwuICBBbGwKICAqIG90aGVyIHVzYWdlcyBhcmUgdW5kZWZpbmVkLgogICoKICAqIEFmdGVyIHRoaXMgY2FsbCwgcmVhZHMgYnkgdGhlIGNwdSB0byB0aGUgYnVmZmVyIGFyZSBndWFyYW50ZWVkIHRvIHNlZQogICogd2hhdGV2ZXIgdGhlIGRldmljZSB3cm90ZSB0aGVyZS4KICAqLworc3RhdGljIHZvaWQgdW5tYXBfc2luZ2xlKHN0cnVjdCBkZXZpY2UgKmh3ZGV2LCBkbWFfYWRkcl90IGRldl9hZGRyLAorCQkJIHNpemVfdCBzaXplLCBpbnQgZGlyKQoreworCWNoYXIgKmRtYV9hZGRyID0gc3dpb3RsYl9idXNfdG9fdmlydChod2RldiwgZGV2X2FkZHIpOworCisJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7CisKKwlpZiAoaXNfc3dpb3RsYl9idWZmZXIoZG1hX2FkZHIpKSB7CisJCWRvX3VubWFwX3NpbmdsZShod2RldiwgZG1hX2FkZHIsIHNpemUsIGRpcik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoZGlyICE9IERNQV9GUk9NX0RFVklDRSkKKwkJcmV0dXJuOworCisJZG1hX21hcmtfY2xlYW4oZG1hX2FkZHIsIHNpemUpOworfQorCiB2b2lkIHN3aW90bGJfdW5tYXBfcGFnZShzdHJ1Y3QgZGV2aWNlICpod2RldiwgZG1hX2FkZHJfdCBkZXZfYWRkciwKIAkJCXNpemVfdCBzaXplLCBlbnVtIGRtYV9kYXRhX2RpcmVjdGlvbiBkaXIsCiAJCQlzdHJ1Y3QgZG1hX2F0dHJzICphdHRycykKIHsKLQljaGFyICpkbWFfYWRkciA9IHN3aW90bGJfYnVzX3RvX3ZpcnQoZGV2X2FkZHIpOwotCi0JQlVHX09OKGRpciA9PSBETUFfTk9ORSk7Ci0JaWYgKGlzX3N3aW90bGJfYnVmZmVyKGRtYV9hZGRyKSkKLQkJdW5tYXBfc2luZ2xlKGh3ZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyKTsKLQllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQotCQlkbWFfbWFya19jbGVhbihkbWFfYWRkciwgc2l6ZSk7CisJdW5tYXBfc2luZ2xlKGh3ZGV2LCBkZXZfYWRkciwgc2l6ZSwgZGlyKTsKIH0KIEVYUE9SVF9TWU1CT0xfR1BMKHN3aW90bGJfdW5tYXBfcGFnZSk7CiAKQEAgLTcwMyw3ICs3MTgsNyBAQAogICogTWFrZSBwaHlzaWNhbCBtZW1vcnkgY29uc2lzdGVudCBmb3IgYSBzaW5nbGUgc3RyZWFtaW5nIG1vZGUgRE1BIHRyYW5zbGF0aW9uCiAgKiBhZnRlciBhIHRyYW5zZmVyLgogICoKLSAqIElmIHlvdSBwZXJmb3JtIGEgc3dpb3RsYl9tYXBfc2luZ2xlKCkgYnV0IHdpc2ggdG8gaW50ZXJyb2dhdGUgdGhlIGJ1ZmZlcgorICogSWYgeW91IHBlcmZvcm0gYSBzd2lvdGxiX21hcF9wYWdlKCkgYnV0IHdpc2ggdG8gaW50ZXJyb2dhdGUgdGhlIGJ1ZmZlcgogICogdXNpbmcgdGhlIGNwdSwgeWV0IGRvIG5vdCB3aXNoIHRvIHRlYXJkb3duIHRoZSBkbWEgbWFwcGluZywgeW91IG11c3QKICAqIGNhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgZG9pbmcgc28uICBBdCB0aGUgbmV4dCBwb2ludCB5b3UgZ2l2ZSB0aGUgZG1hCiAgKiBhZGRyZXNzIGJhY2sgdG8gdGhlIGNhcmQsIHlvdSBtdXN0IGZpcnN0IHBlcmZvcm0gYQpAQCAtNzEzLDEzICs3MjgsMTkgQEAKIHN3aW90bGJfc3luY19zaW5nbGUoc3RydWN0IGRldmljZSAqaHdkZXYsIGRtYV9hZGRyX3QgZGV2X2FkZHIsCiAJCSAgICBzaXplX3Qgc2l6ZSwgaW50IGRpciwgaW50IHRhcmdldCkKIHsKLQljaGFyICpkbWFfYWRkciA9IHN3aW90bGJfYnVzX3RvX3ZpcnQoZGV2X2FkZHIpOworCWNoYXIgKmRtYV9hZGRyID0gc3dpb3RsYl9idXNfdG9fdmlydChod2RldiwgZGV2X2FkZHIpOwogCiAJQlVHX09OKGRpciA9PSBETUFfTk9ORSk7Ci0JaWYgKGlzX3N3aW90bGJfYnVmZmVyKGRtYV9hZGRyKSkKKworCWlmIChpc19zd2lvdGxiX2J1ZmZlcihkbWFfYWRkcikpIHsKIAkJc3luY19zaW5nbGUoaHdkZXYsIGRtYV9hZGRyLCBzaXplLCBkaXIsIHRhcmdldCk7Ci0JZWxzZSBpZiAoZGlyID09IERNQV9GUk9NX0RFVklDRSkKLQkJZG1hX21hcmtfY2xlYW4oZG1hX2FkZHIsIHNpemUpOworCQlyZXR1cm47CisJfQorCisJaWYgKGRpciAhPSBETUFfRlJPTV9ERVZJQ0UpCisJCXJldHVybjsKKworCWRtYV9tYXJrX2NsZWFuKGRtYV9hZGRyLCBzaXplKTsKIH0KIAogdm9pZApAQCAtNzQ2LDEzICs3NjcsNyBAQAogCQkJICB1bnNpZ25lZCBsb25nIG9mZnNldCwgc2l6ZV90IHNpemUsCiAJCQkgIGludCBkaXIsIGludCB0YXJnZXQpCiB7Ci0JY2hhciAqZG1hX2FkZHIgPSBzd2lvdGxiX2J1c190b192aXJ0KGRldl9hZGRyKSArIG9mZnNldDsKLQotCUJVR19PTihkaXIgPT0gRE1BX05PTkUpOwotCWlmIChpc19zd2lvdGxiX2J1ZmZlcihkbWFfYWRkcikpCi0JCXN5bmNfc2luZ2xlKGh3ZGV2LCBkbWFfYWRkciwgc2l6ZSwgZGlyLCB0YXJnZXQpOwotCWVsc2UgaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCi0JCWRtYV9tYXJrX2NsZWFuKGRtYV9hZGRyLCBzaXplKTsKKwlzd2lvdGxiX3N5bmNfc2luZ2xlKGh3ZGV2LCBkZXZfYWRkciArIG9mZnNldCwgc2l6ZSwgZGlyLCB0YXJnZXQpOwogfQogCiB2b2lkCkBAIC03NzcsNyArNzkyLDcgQEAKIAogLyoKICAqIE1hcCBhIHNldCBvZiBidWZmZXJzIGRlc2NyaWJlZCBieSBzY2F0dGVybGlzdCBpbiBzdHJlYW1pbmcgbW9kZSBmb3IgRE1BLgotICogVGhpcyBpcyB0aGUgc2NhdHRlci1nYXRoZXIgdmVyc2lvbiBvZiB0aGUgYWJvdmUgc3dpb3RsYl9tYXBfc2luZ2xlCisgKiBUaGlzIGlzIHRoZSBzY2F0dGVyLWdhdGhlciB2ZXJzaW9uIG9mIHRoZSBhYm92ZSBzd2lvdGxiX21hcF9wYWdlCiAgKiBpbnRlcmZhY2UuICBIZXJlIHRoZSBzY2F0dGVyIGdhdGhlciBsaXN0IGVsZW1lbnRzIGFyZSBlYWNoIHRhZ2dlZCB3aXRoIHRoZQogICogYXBwcm9wcmlhdGUgZG1hIGFkZHJlc3MgYW5kIGxlbmd0aC4gIFRoZXkgYXJlIG9idGFpbmVkIHZpYQogICogc2dfZG1hX3thZGRyZXNzLGxlbmd0aH0oU0cpLgpAQCAtNzg4LDcgKzgwMyw3IEBACiAgKiAgICAgICBUaGUgcm91dGluZSByZXR1cm5zIHRoZSBudW1iZXIgb2YgYWRkci9sZW5ndGggcGFpcnMgYWN0dWFsbHkKICAqICAgICAgIHVzZWQsIGF0IG1vc3QgbmVudHMuCiAgKgotICogRGV2aWNlIG93bmVyc2hpcCBpc3N1ZXMgYXMgbWVudGlvbmVkIGFib3ZlIGZvciBzd2lvdGxiX21hcF9zaW5nbGUgYXJlIHRoZQorICogRGV2aWNlIG93bmVyc2hpcCBpc3N1ZXMgYXMgbWVudGlvbmVkIGFib3ZlIGZvciBzd2lvdGxiX21hcF9wYWdlIGFyZSB0aGUKICAqIHNhbWUgaGVyZS4KICAqLwogaW50CkBAIC04MzYsNyArODUxLDcgQEAKIAogLyoKICAqIFVubWFwIGEgc2V0IG9mIHN0cmVhbWluZyBtb2RlIERNQSB0cmFuc2xhdGlvbnMuICBBZ2FpbiwgY3B1IHJlYWQgcnVsZXMKLSAqIGNvbmNlcm5pbmcgY2FsbHMgaGVyZSBhcmUgdGhlIHNhbWUgYXMgZm9yIHN3aW90bGJfdW5tYXBfc2luZ2xlKCkgYWJvdmUuCisgKiBjb25jZXJuaW5nIGNhbGxzIGhlcmUgYXJlIHRoZSBzYW1lIGFzIGZvciBzd2lvdGxiX3VubWFwX3BhZ2UoKSBhYm92ZS4KICAqLwogdm9pZAogc3dpb3RsYl91bm1hcF9zZ19hdHRycyhzdHJ1Y3QgZGV2aWNlICpod2Rldiwgc3RydWN0IHNjYXR0ZXJsaXN0ICpzZ2wsCkBAIC04NDcsMTMgKzg2Miw5IEBACiAKIAlCVUdfT04oZGlyID09IERNQV9OT05FKTsKIAotCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkgewotCQlpZiAoc2ctPmRtYV9hZGRyZXNzICE9IHN3aW90bGJfcGh5c190b19idXMoaHdkZXYsIHNnX3BoeXMoc2cpKSkKLQkJCXVubWFwX3NpbmdsZShod2Rldiwgc3dpb3RsYl9idXNfdG9fdmlydChzZy0+ZG1hX2FkZHJlc3MpLAotCQkJCSAgICAgc2ctPmRtYV9sZW5ndGgsIGRpcik7Ci0JCWVsc2UgaWYgKGRpciA9PSBETUFfRlJPTV9ERVZJQ0UpCi0JCQlkbWFfbWFya19jbGVhbihzd2lvdGxiX2J1c190b192aXJ0KHNnLT5kbWFfYWRkcmVzcyksIHNnLT5kbWFfbGVuZ3RoKTsKLQl9CisJZm9yX2VhY2hfc2coc2dsLCBzZywgbmVsZW1zLCBpKQorCQl1bm1hcF9zaW5nbGUoaHdkZXYsIHNnLT5kbWFfYWRkcmVzcywgc2ctPmRtYV9sZW5ndGgsIGRpcik7CisKIH0KIEVYUE9SVF9TWU1CT0woc3dpb3RsYl91bm1hcF9zZ19hdHRycyk7CiAKQEAgLTg3OSwxNSArODkwLDkgQEAKIAlzdHJ1Y3Qgc2NhdHRlcmxpc3QgKnNnOwogCWludCBpOwogCi0JQlVHX09OKGRpciA9PSBETUFfTk9ORSk7Ci0KLQlmb3JfZWFjaF9zZyhzZ2wsIHNnLCBuZWxlbXMsIGkpIHsKLQkJaWYgKHNnLT5kbWFfYWRkcmVzcyAhPSBzd2lvdGxiX3BoeXNfdG9fYnVzKGh3ZGV2LCBzZ19waHlzKHNnKSkpCi0JCQlzeW5jX3NpbmdsZShod2Rldiwgc3dpb3RsYl9idXNfdG9fdmlydChzZy0+ZG1hX2FkZHJlc3MpLAorCWZvcl9lYWNoX3NnKHNnbCwgc2csIG5lbGVtcywgaSkKKwkJc3dpb3RsYl9zeW5jX3NpbmdsZShod2Rldiwgc2ctPmRtYV9hZGRyZXNzLAogCQkJCSAgICBzZy0+ZG1hX2xlbmd0aCwgZGlyLCB0YXJnZXQpOwotCQllbHNlIGlmIChkaXIgPT0gRE1BX0ZST01fREVWSUNFKQotCQkJZG1hX21hcmtfY2xlYW4oc3dpb3RsYl9idXNfdG9fdmlydChzZy0+ZG1hX2FkZHJlc3MpLCBzZy0+ZG1hX2xlbmd0aCk7Ci0JfQogfQogCiB2b2lkCmRpZmYgLS1naXQgYS9saWIvdnNwcmludGYuYyBiL2xpYi92c3ByaW50Zi5jCmluZGV4IDc1MzZhY2UuLjc1NmNjYWYgMTAwNjQ0Ci0tLSBhL2xpYi92c3ByaW50Zi5jCisrKyBiL2xpYi92c3ByaW50Zi5jCkBAIC00MDgsNiArNDA4LDggQEAKIAlGT1JNQVRfVFlQRV9MT05HX0xPTkcsCiAJRk9STUFUX1RZUEVfVUxPTkcsCiAJRk9STUFUX1RZUEVfTE9ORywKKwlGT1JNQVRfVFlQRV9VQllURSwKKwlGT1JNQVRfVFlQRV9CWVRFLAogCUZPUk1BVF9UWVBFX1VTSE9SVCwKIAlGT1JNQVRfVFlQRV9TSE9SVCwKIAlGT1JNQVRfVFlQRV9VSU5ULApAQCAtNTczLDEyICs1NzUsMTUgQEAKIH0KIAogc3RhdGljIGNoYXIgKnN5bWJvbF9zdHJpbmcoY2hhciAqYnVmLCBjaGFyICplbmQsIHZvaWQgKnB0ciwKLQkJCQlzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYykKKwkJCQlzdHJ1Y3QgcHJpbnRmX3NwZWMgc3BlYywgY2hhciBleHQpCiB7CiAJdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICh1bnNpZ25lZCBsb25nKSBwdHI7CiAjaWZkZWYgQ09ORklHX0tBTExTWU1TCiAJY2hhciBzeW1bS1NZTV9TWU1CT0xfTEVOXTsKLQlzcHJpbnRfc3ltYm9sKHN5bSwgdmFsdWUpOworCWlmIChleHQgIT0gJ2YnKQorCQlzcHJpbnRfc3ltYm9sKHN5bSwgdmFsdWUpOworCWVsc2UKKwkJa2FsbHN5bXNfbG9va3VwKHZhbHVlLCBOVUxMLCBOVUxMLCBOVUxMLCBzeW0pOwogCXJldHVybiBzdHJpbmcoYnVmLCBlbmQsIHN5bSwgc3BlYyk7CiAjZWxzZQogCXNwZWMuZmllbGRfd2lkdGggPSAyKnNpemVvZih2b2lkICopOwpAQCAtNjkwLDcgKzY5NSw4IEBACiAgKgogICogUmlnaHQgbm93IHdlIGhhbmRsZToKICAqCi0gKiAtICdGJyBGb3Igc3ltYm9saWMgZnVuY3Rpb24gZGVzY3JpcHRvciBwb2ludGVycworICogLSAnRicgRm9yIHN5bWJvbGljIGZ1bmN0aW9uIGRlc2NyaXB0b3IgcG9pbnRlcnMgd2l0aCBvZmZzZXQKKyAqIC0gJ2YnIEZvciBzaW1wbGUgc3ltYm9saWMgZnVuY3Rpb24gbmFtZXMgd2l0aG91dCBvZmZzZXQKICAqIC0gJ1MnIEZvciBzeW1ib2xpYyBkaXJlY3QgcG9pbnRlcnMKICAqIC0gJ1InIEZvciBhIHN0cnVjdCByZXNvdXJjZSBwb2ludGVyLCBpdCBwcmludHMgdGhlIHJhbmdlIG9mCiAgKiAgICAgICBhZGRyZXNzZXMgKG5vdCB0aGUgbmFtZSBub3IgdGhlIGZsYWdzKQpAQCAtNzEzLDEwICs3MTksMTEgQEAKIAogCXN3aXRjaCAoKmZtdCkgewogCWNhc2UgJ0YnOgorCWNhc2UgJ2YnOgogCQlwdHIgPSBkZXJlZmVyZW5jZV9mdW5jdGlvbl9kZXNjcmlwdG9yKHB0cik7CiAJCS8qIEZhbGx0aHJvdWdoICovCiAJY2FzZSAnUyc6Ci0JCXJldHVybiBzeW1ib2xfc3RyaW5nKGJ1ZiwgZW5kLCBwdHIsIHNwZWMpOworCQlyZXR1cm4gc3ltYm9sX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjLCAqZm10KTsKIAljYXNlICdSJzoKIAkJcmV0dXJuIHJlc291cmNlX3N0cmluZyhidWYsIGVuZCwgcHRyLCBzcGVjKTsKIAljYXNlICdtJzoKQEAgLTg1MywxMSArODYwLDE1IEBACiAJc3BlYy0+cXVhbGlmaWVyID0gLTE7CiAJaWYgKCpmbXQgPT0gJ2gnIHx8ICpmbXQgPT0gJ2wnIHx8ICpmbXQgPT0gJ0wnIHx8CiAJICAgICpmbXQgPT0gJ1onIHx8ICpmbXQgPT0gJ3onIHx8ICpmbXQgPT0gJ3QnKSB7Ci0JCXNwZWMtPnF1YWxpZmllciA9ICpmbXQ7Ci0JCSsrZm10OwotCQlpZiAoc3BlYy0+cXVhbGlmaWVyID09ICdsJyAmJiAqZm10ID09ICdsJykgewotCQkJc3BlYy0+cXVhbGlmaWVyID0gJ0wnOwotCQkJKytmbXQ7CisJCXNwZWMtPnF1YWxpZmllciA9ICpmbXQrKzsKKwkJaWYgKHVubGlrZWx5KHNwZWMtPnF1YWxpZmllciA9PSAqZm10KSkgeworCQkJaWYgKHNwZWMtPnF1YWxpZmllciA9PSAnbCcpIHsKKwkJCQlzcGVjLT5xdWFsaWZpZXIgPSAnTCc7CisJCQkJKytmbXQ7CisJCQl9IGVsc2UgaWYgKHNwZWMtPnF1YWxpZmllciA9PSAnaCcpIHsKKwkJCQlzcGVjLT5xdWFsaWZpZXIgPSAnSCc7CisJCQkJKytmbXQ7CisJCQl9CiAJCX0KIAl9CiAKQEAgLTkxOSw2ICs5MzAsMTEgQEAKIAkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1NJWkVfVDsKIAl9IGVsc2UgaWYgKHNwZWMtPnF1YWxpZmllciA9PSAndCcpIHsKIAkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1BUUkRJRkY7CisJfSBlbHNlIGlmIChzcGVjLT5xdWFsaWZpZXIgPT0gJ0gnKSB7CisJCWlmIChzcGVjLT5mbGFncyAmIFNJR04pCisJCQlzcGVjLT50eXBlID0gRk9STUFUX1RZUEVfQllURTsKKwkJZWxzZQorCQkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1VCWVRFOwogCX0gZWxzZSBpZiAoc3BlYy0+cXVhbGlmaWVyID09ICdoJykgewogCQlpZiAoc3BlYy0+ZmxhZ3MgJiBTSUdOKQogCQkJc3BlYy0+dHlwZSA9IEZPUk1BVF9UWVBFX1NIT1JUOwpAQCAtOTQzLDcgKzk1OSw4IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiBmb2xsb3dzIEM5OSB2c25wcmludGYsIGJ1dCBoYXMgc29tZSBleHRlbnNpb25zOgogICogJXBTIG91dHB1dCB0aGUgbmFtZSBvZiBhIHRleHQgc3ltYm9sCi0gKiAlcEYgb3V0cHV0IHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gcG9pbnRlcgorICogJXBGIG91dHB1dCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBpdHMgb2Zmc2V0CisgKiAlcGYgb3V0cHV0IHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gcG9pbnRlciB3aXRob3V0IGl0cyBvZmZzZXQKICAqICVwUiBvdXRwdXQgdGhlIGFkZHJlc3MgcmFuZ2UgaW4gYSBzdHJ1Y3QgcmVzb3VyY2UKICAqCiAgKiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3aGljaCB3b3VsZApAQCAtMTA4Nyw2ICsxMTA0LDEyIEBACiAJCQljYXNlIEZPUk1BVF9UWVBFX1BUUkRJRkY6CiAJCQkJbnVtID0gdmFfYXJnKGFyZ3MsIHB0cmRpZmZfdCk7CiAJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX1VCWVRFOgorCQkJCW51bSA9ICh1bnNpZ25lZCBjaGFyKSB2YV9hcmcoYXJncywgaW50KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRk9STUFUX1RZUEVfQllURToKKwkJCQludW0gPSAoc2lnbmVkIGNoYXIpIHZhX2FyZyhhcmdzLCBpbnQpOworCQkJCWJyZWFrOwogCQkJY2FzZSBGT1JNQVRfVFlQRV9VU0hPUlQ6CiAJCQkJbnVtID0gKHVuc2lnbmVkIHNob3J0KSB2YV9hcmcoYXJncywgaW50KTsKIAkJCQlicmVhazsKQEAgLTEzNjMsNiArMTM4NiwxMCBAQAogCQkJY2FzZSBGT1JNQVRfVFlQRV9QVFJESUZGOgogCQkJCXNhdmVfYXJnKHB0cmRpZmZfdCk7CiAJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX1VCWVRFOgorCQkJY2FzZSBGT1JNQVRfVFlQRV9CWVRFOgorCQkJCXNhdmVfYXJnKGNoYXIpOworCQkJCWJyZWFrOwogCQkJY2FzZSBGT1JNQVRfVFlQRV9VU0hPUlQ6CiAJCQljYXNlIEZPUk1BVF9UWVBFX1NIT1JUOgogCQkJCXNhdmVfYXJnKHNob3J0KTsKQEAgLTEzOTEsNyArMTQxOCw4IEBACiAgKgogICogVGhlIGZvcm1hdCBmb2xsb3dzIEM5OSB2c25wcmludGYsIGJ1dCBoYXMgc29tZSBleHRlbnNpb25zOgogICogJXBTIG91dHB1dCB0aGUgbmFtZSBvZiBhIHRleHQgc3ltYm9sCi0gKiAlcEYgb3V0cHV0IHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gcG9pbnRlcgorICogJXBGIG91dHB1dCB0aGUgbmFtZSBvZiBhIGZ1bmN0aW9uIHBvaW50ZXIgd2l0aCBpdHMgb2Zmc2V0CisgKiAlcGYgb3V0cHV0IHRoZSBuYW1lIG9mIGEgZnVuY3Rpb24gcG9pbnRlciB3aXRob3V0IGl0cyBvZmZzZXQKICAqICVwUiBvdXRwdXQgdGhlIGFkZHJlc3MgcmFuZ2UgaW4gYSBzdHJ1Y3QgcmVzb3VyY2UKICAqICVuIGlzIGlnbm9yZWQKICAqCkBAIC0xNTM4LDYgKzE1NjYsMTIgQEAKIAkJCWNhc2UgRk9STUFUX1RZUEVfUFRSRElGRjoKIAkJCQludW0gPSBnZXRfYXJnKHB0cmRpZmZfdCk7CiAJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX1VCWVRFOgorCQkJCW51bSA9IGdldF9hcmcodW5zaWduZWQgY2hhcik7CisJCQkJYnJlYWs7CisJCQljYXNlIEZPUk1BVF9UWVBFX0JZVEU6CisJCQkJbnVtID0gZ2V0X2FyZyhzaWduZWQgY2hhcik7CisJCQkJYnJlYWs7CiAJCQljYXNlIEZPUk1BVF9UWVBFX1VTSE9SVDoKIAkJCQludW0gPSBnZXRfYXJnKHVuc2lnbmVkIHNob3J0KTsKIAkJCQlicmVhazsKZGlmZiAtLWdpdCBhL21tL2JvdW5jZS5jIGIvbW0vYm91bmNlLmMKaW5kZXggZTU5MDI3Mi4uNjVmNWUxNyAxMDA2NDQKLS0tIGEvbW0vYm91bmNlLmMKKysrIGIvbW0vYm91bmNlLmMKQEAgLTE0LDE2ICsxNCwxNSBAQAogI2luY2x1ZGUgPGxpbnV4L2hhc2guaD4KICNpbmNsdWRlIDxsaW51eC9oaWdobWVtLmg+CiAjaW5jbHVkZSA8bGludXgvYmxrdHJhY2VfYXBpLmg+Ci0jaW5jbHVkZSA8dHJhY2UvYmxvY2suaD4KICNpbmNsdWRlIDxhc20vdGxiZmx1c2guaD4KIAorI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9ibG9jay5oPgorCiAjZGVmaW5lIFBPT0xfU0laRQk2NAogI2RlZmluZSBJU0FfUE9PTF9TSVpFCTE2CiAKIHN0YXRpYyBtZW1wb29sX3QgKnBhZ2VfcG9vbCwgKmlzYV9wYWdlX3Bvb2w7CiAKLURFRklORV9UUkFDRShibG9ja19iaW9fYm91bmNlKTsKLQogI2lmZGVmIENPTkZJR19ISUdITUVNCiBzdGF0aWMgX19pbml0IGludCBpbml0X2VtZXJnZW5jeV9wb29sKHZvaWQpCiB7CmRpZmYgLS1naXQgYS9tbS9tbG9jay5jIGIvbW0vbWxvY2suYwppbmRleCBjYmU5ZTA1Li5hYzEzMDQzIDEwMDY0NAotLS0gYS9tbS9tbG9jay5jCisrKyBiL21tL21sb2NrLmMKQEAgLTYyOSw1MiArNjI5LDQzIEBACiAJZnJlZV91aWQodXNlcik7CiB9CiAKLXZvaWQgKmFsbG9jX2xvY2tlZF9idWZmZXIoc2l6ZV90IHNpemUpCitpbnQgYWNjb3VudF9sb2NrZWRfbWVtb3J5KHN0cnVjdCBtbV9zdHJ1Y3QgKm1tLCBzdHJ1Y3QgcmxpbWl0ICpybGltLAorCQkJICBzaXplX3Qgc2l6ZSkKIHsKLQl1bnNpZ25lZCBsb25nIHJsaW0sIHZtLCBwZ3N6OwotCXZvaWQgKmJ1ZmZlciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBsaW0sIHZtLCBwZ3N6OworCWludCBlcnJvciA9IC1FTk9NRU07CiAKIAlwZ3N6ID0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCi0JcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfQVNdLnJsaW1fY3VyID4+IFBBR0VfU0hJRlQ7Ci0Jdm0gICA9IGN1cnJlbnQtPm1tLT50b3RhbF92bSArIHBnc3o7Ci0JaWYgKHJsaW0gPCB2bSkKKwlsaW0gPSBybGltW1JMSU1JVF9BU10ucmxpbV9jdXIgPj4gUEFHRV9TSElGVDsKKwl2bSAgID0gbW0tPnRvdGFsX3ZtICsgcGdzejsKKwlpZiAobGltIDwgdm0pCiAJCWdvdG8gb3V0OwogCi0JcmxpbSA9IGN1cnJlbnQtPnNpZ25hbC0+cmxpbVtSTElNSVRfTUVNTE9DS10ucmxpbV9jdXIgPj4gUEFHRV9TSElGVDsKLQl2bSAgID0gY3VycmVudC0+bW0tPmxvY2tlZF92bSArIHBnc3o7Ci0JaWYgKHJsaW0gPCB2bSkKKwlsaW0gPSBybGltW1JMSU1JVF9NRU1MT0NLXS5ybGltX2N1ciA+PiBQQUdFX1NISUZUOworCXZtICAgPSBtbS0+bG9ja2VkX3ZtICsgcGdzejsKKwlpZiAobGltIDwgdm0pCiAJCWdvdG8gb3V0OwogCi0JYnVmZmVyID0ga3phbGxvYyhzaXplLCBHRlBfS0VSTkVMKTsKLQlpZiAoIWJ1ZmZlcikKLQkJZ290byBvdXQ7CisJbW0tPnRvdGFsX3ZtICArPSBwZ3N6OworCW1tLT5sb2NrZWRfdm0gKz0gcGdzejsKIAotCWN1cnJlbnQtPm1tLT50b3RhbF92bSAgKz0gcGdzejsKLQljdXJyZW50LT5tbS0+bG9ja2VkX3ZtICs9IHBnc3o7Ci0KKwllcnJvciA9IDA7CiAgb3V0OgotCXVwX3dyaXRlKCZjdXJyZW50LT5tbS0+bW1hcF9zZW0pOwotCXJldHVybiBidWZmZXI7CisJdXBfd3JpdGUoJm1tLT5tbWFwX3NlbSk7CisJcmV0dXJuIGVycm9yOwogfQogCi12b2lkIHJlbGVhc2VfbG9ja2VkX2J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKQordm9pZCByZWZ1bmRfbG9ja2VkX21lbW9yeShzdHJ1Y3QgbW1fc3RydWN0ICptbSwgc2l6ZV90IHNpemUpCiB7CiAJdW5zaWduZWQgbG9uZyBwZ3N6ID0gUEFHRV9BTElHTihzaXplKSA+PiBQQUdFX1NISUZUOwogCi0JZG93bl93cml0ZSgmY3VycmVudC0+bW0tPm1tYXBfc2VtKTsKKwlkb3duX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogCi0JY3VycmVudC0+bW0tPnRvdGFsX3ZtICAtPSBwZ3N6OwotCWN1cnJlbnQtPm1tLT5sb2NrZWRfdm0gLT0gcGdzejsKKwltbS0+dG90YWxfdm0gIC09IHBnc3o7CisJbW0tPmxvY2tlZF92bSAtPSBwZ3N6OwogCi0JdXBfd3JpdGUoJmN1cnJlbnQtPm1tLT5tbWFwX3NlbSk7Ci19Ci0KLXZvaWQgZnJlZV9sb2NrZWRfYnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpCi17Ci0JcmVsZWFzZV9sb2NrZWRfYnVmZmVyKGJ1ZmZlciwgc2l6ZSk7Ci0KLQlrZnJlZShidWZmZXIpOworCXVwX3dyaXRlKCZtbS0+bW1hcF9zZW0pOwogfQpkaWZmIC0tZ2l0IGEvbW0vbW1hcC5jIGIvbW0vbW1hcC5jCmluZGV4IDZiN2IxYTkuLjgxMDFkZTQgMTAwNjQ0Ci0tLSBhL21tL21tYXAuYworKysgYi9tbS9tbWFwLmMKQEAgLTI4LDYgKzI4LDcgQEAKICNpbmNsdWRlIDxsaW51eC9tZW1wb2xpY3kuaD4KICNpbmNsdWRlIDxsaW51eC9ybWFwLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CisjaW5jbHVkZSA8bGludXgvcGVyZl9jb3VudGVyLmg+CiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9jYWNoZWZsdXNoLmg+CkBAIC0xMjE5LDYgKzEyMjAsOCBAQAogCWlmIChjb3JyZWN0X3djb3VudCkKIAkJYXRvbWljX2luYygmaW5vZGUtPmlfd3JpdGVjb3VudCk7CiBvdXQ6CisJcGVyZl9jb3VudGVyX21tYXAodm1hKTsKKwogCW1tLT50b3RhbF92bSArPSBsZW4gPj4gUEFHRV9TSElGVDsKIAl2bV9zdGF0X2FjY291bnQobW0sIHZtX2ZsYWdzLCBmaWxlLCBsZW4gPj4gUEFHRV9TSElGVCk7CiAJaWYgKHZtX2ZsYWdzICYgVk1fTE9DS0VEKSB7CkBAIC0yMzA1LDYgKzIzMDgsOCBAQAogCiAJbW0tPnRvdGFsX3ZtICs9IGxlbiA+PiBQQUdFX1NISUZUOwogCisJcGVyZl9jb3VudGVyX21tYXAodm1hKTsKKwogCXJldHVybiAwOwogfQogCmRpZmYgLS1naXQgYS9tbS9tcHJvdGVjdC5jIGIvbW0vbXByb3RlY3QuYwppbmRleCAyNTgxOTdiLi5kODAzMTFiIDEwMDY0NAotLS0gYS9tbS9tcHJvdGVjdC5jCisrKyBiL21tL21wcm90ZWN0LmMKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9zd2Fwb3BzLmg+CiAjaW5jbHVkZSA8bGludXgvbW11X25vdGlmaWVyLmg+CiAjaW5jbHVkZSA8bGludXgvbWlncmF0ZS5oPgorI2luY2x1ZGUgPGxpbnV4L3BlcmZfY291bnRlci5oPgogI2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+CiAjaW5jbHVkZSA8YXNtL3BndGFibGUuaD4KICNpbmNsdWRlIDxhc20vY2FjaGVmbHVzaC5oPgpAQCAtMjk5LDYgKzMwMCw3IEBACiAJCWVycm9yID0gbXByb3RlY3RfZml4dXAodm1hLCAmcHJldiwgbnN0YXJ0LCB0bXAsIG5ld2ZsYWdzKTsKIAkJaWYgKGVycm9yKQogCQkJZ290byBvdXQ7CisJCXBlcmZfY291bnRlcl9tbWFwKHZtYSk7CiAJCW5zdGFydCA9IHRtcDsKIAogCQlpZiAobnN0YXJ0IDwgcHJldi0+dm1fZW5kKQpkaWZmIC0tZ2l0IGEvbW0vcGFnZV9hbGxvYy5jIGIvbW0vcGFnZV9hbGxvYy5jCmluZGV4IGZlNzUzZWMuLjQ3NGM3ZTkgMTAwNjQ0Ci0tLSBhL21tL3BhZ2VfYWxsb2MuYworKysgYi9tbS9wYWdlX2FsbG9jLmMKQEAgLTE0OSwxMCArMTQ5LDYgQEAKICAgc3RhdGljIGludCBfX21lbWluaXRkYXRhIG5yX25vZGVtYXBfZW50cmllczsKICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBhcmNoX3pvbmVfbG93ZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOwogICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX21lbWluaXRkYXRhIGFyY2hfem9uZV9oaWdoZXN0X3Bvc3NpYmxlX3BmbltNQVhfTlJfWk9ORVNdOwotI2lmZGVmIENPTkZJR19NRU1PUllfSE9UUExVR19SRVNFUlZFCi0gIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgbm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bTUFYX05VTU5PREVTXTsKLSAgc3RhdGljIHVuc2lnbmVkIGxvbmcgX19tZW1pbml0ZGF0YSBub2RlX2JvdW5kYXJ5X2VuZF9wZm5bTUFYX05VTU5PREVTXTsKLSNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfUkVTRVJWRSAqLwogICBzdGF0aWMgdW5zaWduZWQgbG9uZyBfX2luaXRkYXRhIHJlcXVpcmVkX2tlcm5lbGNvcmU7CiAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9faW5pdGRhdGEgcmVxdWlyZWRfbW92YWJsZWNvcmU7CiAgIHN0YXRpYyB1bnNpZ25lZCBsb25nIF9fbWVtaW5pdGRhdGEgem9uZV9tb3ZhYmxlX3BmbltNQVhfTlVNTk9ERVNdOwpAQCAtMzEwMyw2NCArMzA5OSw2IEBACiB9CiAKIC8qKgotICogcHVzaF9ub2RlX2JvdW5kYXJpZXMgLSBQdXNoIG5vZGUgYm91bmRhcmllcyB0byBhdCBsZWFzdCB0aGUgcmVxdWVzdGVkIGJvdW5kYXJ5Ci0gKiBAbmlkOiBUaGUgbmlkIG9mIHRoZSBub2RlIHRvIHB1c2ggdGhlIGJvdW5kYXJ5IGZvcgotICogQHN0YXJ0X3BmbjogVGhlIHN0YXJ0IHBmbiBvZiB0aGUgbm9kZQotICogQGVuZF9wZm46IFRoZSBlbmQgcGZuIG9mIHRoZSBub2RlCi0gKgotICogSW4gcmVzZXJ2ZS1iYXNlZCBob3QtYWRkLCBtZW1fbWFwIGlzIGFsbG9jYXRlZCB0aGF0IGlzIHVudXNlZCB1bnRpbCBob3RhZGQKLSAqIHRpbWUuIFNwZWNpZmljYWxseSwgb24geDg2XzY0LCBTUkFUIHdpbGwgcmVwb3J0IHJhbmdlcyB0aGF0IGNhbiBwb3RlbnRpYWxseQotICogYmUgaG90cGx1Z2dlZCBldmVuIHRob3VnaCBubyBwaHlzaWNhbCBtZW1vcnkgZXhpc3RzLiBUaGlzIGZ1bmN0aW9uIGFsbG93cwotICogYW4gYXJjaCB0byBwdXNoIG91dCB0aGUgbm9kZSBib3VuZGFyaWVzIHNvIG1lbV9tYXAgaXMgYWxsb2NhdGVkIHRoYXQgY2FuCi0gKiBiZSB1c2VkIGxhdGVyLgotICovCi0jaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHX1JFU0VSVkUKLXZvaWQgX19pbml0IHB1c2hfbm9kZV9ib3VuZGFyaWVzKHVuc2lnbmVkIGludCBuaWQsCi0JCXVuc2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIGVuZF9wZm4pCi17Ci0JbW1pbml0X2RwcmludGsoTU1JTklUX1RSQUNFLCAiem9uZWJvdW5kYXJ5IiwKLQkJCSJFbnRlcmluZyBwdXNoX25vZGVfYm91bmRhcmllcygldSwgJWx1LCAlbHUpXG4iLAotCQkJbmlkLCBzdGFydF9wZm4sIGVuZF9wZm4pOwotCi0JLyogSW5pdGlhbGlzZSB0aGUgYm91bmRhcnkgZm9yIHRoaXMgbm9kZSBpZiBuZWNlc3NhcnkgKi8KLQlpZiAobm9kZV9ib3VuZGFyeV9lbmRfcGZuW25pZF0gPT0gMCkKLQkJbm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bbmlkXSA9IC0xVUw7Ci0KLQkvKiBVcGRhdGUgdGhlIGJvdW5kYXJpZXMgKi8KLQlpZiAobm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bbmlkXSA+IHN0YXJ0X3BmbikKLQkJbm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bbmlkXSA9IHN0YXJ0X3BmbjsKLQlpZiAobm9kZV9ib3VuZGFyeV9lbmRfcGZuW25pZF0gPCBlbmRfcGZuKQotCQlub2RlX2JvdW5kYXJ5X2VuZF9wZm5bbmlkXSA9IGVuZF9wZm47Ci19Ci0KLS8qIElmIG5lY2Vzc2FyeSwgcHVzaCB0aGUgbm9kZSBib3VuZGFyeSBvdXQgZm9yIHJlc2VydmUgaG90YWRkICovCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgYWNjb3VudF9ub2RlX2JvdW5kYXJ5KHVuc2lnbmVkIGludCBuaWQsCi0JCXVuc2lnbmVkIGxvbmcgKnN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyAqZW5kX3BmbikKLXsKLQltbWluaXRfZHByaW50ayhNTUlOSVRfVFJBQ0UsICJ6b25lYm91bmRhcnkiLAotCQkJIkVudGVyaW5nIGFjY291bnRfbm9kZV9ib3VuZGFyeSgldSwgJWx1LCAlbHUpXG4iLAotCQkJbmlkLCAqc3RhcnRfcGZuLCAqZW5kX3Bmbik7Ci0KLQkvKiBSZXR1cm4gaWYgYm91bmRhcnkgaW5mb3JtYXRpb24gaGFzIG5vdCBiZWVuIHByb3ZpZGVkICovCi0JaWYgKG5vZGVfYm91bmRhcnlfZW5kX3BmbltuaWRdID09IDApCi0JCXJldHVybjsKLQotCS8qIENoZWNrIHRoZSBib3VuZGFyaWVzIGFuZCB1cGRhdGUgaWYgbmVjZXNzYXJ5ICovCi0JaWYgKG5vZGVfYm91bmRhcnlfc3RhcnRfcGZuW25pZF0gPCAqc3RhcnRfcGZuKQotCQkqc3RhcnRfcGZuID0gbm9kZV9ib3VuZGFyeV9zdGFydF9wZm5bbmlkXTsKLQlpZiAobm9kZV9ib3VuZGFyeV9lbmRfcGZuW25pZF0gPiAqZW5kX3BmbikKLQkJKmVuZF9wZm4gPSBub2RlX2JvdW5kYXJ5X2VuZF9wZm5bbmlkXTsKLX0KLSNlbHNlCi12b2lkIF9faW5pdCBwdXNoX25vZGVfYm91bmRhcmllcyh1bnNpZ25lZCBpbnQgbmlkLAotCQl1bnNpZ25lZCBsb25nIHN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyBlbmRfcGZuKSB7fQotCi1zdGF0aWMgdm9pZCBfX21lbWluaXQgYWNjb3VudF9ub2RlX2JvdW5kYXJ5KHVuc2lnbmVkIGludCBuaWQsCi0JCXVuc2lnbmVkIGxvbmcgKnN0YXJ0X3BmbiwgdW5zaWduZWQgbG9uZyAqZW5kX3Bmbikge30KLSNlbmRpZgotCi0KLS8qKgogICogZ2V0X3Bmbl9yYW5nZV9mb3JfbmlkIC0gUmV0dXJuIHRoZSBzdGFydCBhbmQgZW5kIHBhZ2UgZnJhbWVzIGZvciBhIG5vZGUKICAqIEBuaWQ6IFRoZSBuaWQgdG8gcmV0dXJuIHRoZSByYW5nZSBmb3IuIElmIE1BWF9OVU1OT0RFUywgdGhlIG1pbiBhbmQgbWF4IFBGTiBhcmUgcmV0dXJuZWQuCiAgKiBAc3RhcnRfcGZuOiBQYXNzZWQgYnkgcmVmZXJlbmNlLiBPbiByZXR1cm4sIGl0IHdpbGwgaGF2ZSB0aGUgbm9kZSBzdGFydF9wZm4uCkBAIC0zMTg1LDkgKzMxMjMsNiBAQAogCiAJaWYgKCpzdGFydF9wZm4gPT0gLTFVTCkKIAkJKnN0YXJ0X3BmbiA9IDA7Ci0KLQkvKiBQdXNoIHRoZSBub2RlIGJvdW5kYXJpZXMgb3V0IGlmIHJlcXVlc3RlZCAqLwotCWFjY291bnRfbm9kZV9ib3VuZGFyeShuaWQsIHN0YXJ0X3BmbiwgZW5kX3Bmbik7CiB9CiAKIC8qCkBAIC0zNzkzLDEwICszNzI4LDYgQEAKIHsKIAltZW1zZXQoZWFybHlfbm9kZV9tYXAsIDAsIHNpemVvZihlYXJseV9ub2RlX21hcCkpOwogCW5yX25vZGVtYXBfZW50cmllcyA9IDA7Ci0jaWZkZWYgQ09ORklHX01FTU9SWV9IT1RQTFVHX1JFU0VSVkUKLQltZW1zZXQobm9kZV9ib3VuZGFyeV9zdGFydF9wZm4sIDAsIHNpemVvZihub2RlX2JvdW5kYXJ5X3N0YXJ0X3BmbikpOwotCW1lbXNldChub2RlX2JvdW5kYXJ5X2VuZF9wZm4sIDAsIHNpemVvZihub2RlX2JvdW5kYXJ5X2VuZF9wZm4pKTsKLSNlbmRpZiAvKiBDT05GSUdfTUVNT1JZX0hPVFBMVUdfUkVTRVJWRSAqLwogfQogCiAvKiBDb21wYXJlIHR3byBhY3RpdmUgbm9kZV9hY3RpdmVfcmVnaW9ucyAqLwpkaWZmIC0tZ2l0IGEvbW0vcGVyY3B1LmMgYi9tbS9wZXJjcHUuYwppbmRleCAxYWE1ZDhmLi5jMGIyYzFhIDEwMDY0NAotLS0gYS9tbS9wZXJjcHUuYworKysgYi9tbS9wZXJjcHUuYwpAQCAtMjMsNyArMjMsNyBAQAogICogQWxsb2NhdGlvbiBpcyBkb25lIGluIG9mZnNldC1zaXplIGFyZWFzIG9mIHNpbmdsZSB1bml0IHNwYWNlLiAgSWUsCiAgKiBhbiBhcmVhIG9mIDUxMiBieXRlcyBhdCA2ayBpbiBjMSBvY2N1cGllcyA1MTIgYnl0ZXMgYXQgNmsgb2YgYzE6dTAsCiAgKiBjMTp1MSwgYzE6dTIgYW5kIGMxOnUzLiAgUGVyY3B1IGFjY2VzcyBjYW4gYmUgZG9uZSBieSBjb25maWd1cmluZwotICogcGVyY3B1IGJhc2UgcmVnaXN0ZXJzIFVOSVRfU0laRSBhcGFydC4KKyAqIHBlcmNwdSBiYXNlIHJlZ2lzdGVycyBwY3B1X3VuaXRfc2l6ZSBhcGFydC4KICAqCiAgKiBUaGVyZSBhcmUgdXN1YWxseSBtYW55IHNtYWxsIHBlcmNwdSBhbGxvY2F0aW9ucyBtYW55IG9mIHRoZW0gYXMKICAqIHNtYWxsIGFzIDQgYnl0ZXMuICBUaGUgYWxsb2NhdG9yIG9yZ2FuaXplcyBjaHVua3MgaW50byBsaXN0cwpAQCAtMzgsOCArMzgsOCBAQAogICogcmVnaW9uIGFuZCBuZWdhdGl2ZSBhbGxvY2F0ZWQuICBBbGxvY2F0aW9uIGluc2lkZSBhIGNodW5rIGlzIGRvbmUKICAqIGJ5IHNjYW5uaW5nIHRoaXMgbWFwIHNlcXVlbnRpYWxseSBhbmQgc2VydmluZyB0aGUgZmlyc3QgbWF0Y2hpbmcKICAqIGVudHJ5LiAgVGhpcyBpcyBtb3N0bHkgY29waWVkIGZyb20gdGhlIHBlcmNwdV9tb2RhbGxvYygpIGFsbG9jYXRvci4KLSAqIENodW5rcyBhcmUgYWxzbyBsaW5rZWQgaW50byBhIHJiIHRyZWUgdG8gZWFzZSBhZGRyZXNzIHRvIGNodW5rCi0gKiBtYXBwaW5nIGR1cmluZyBmcmVlLgorICogQ2h1bmtzIGNhbiBiZSBkZXRlcm1pbmVkIGZyb20gdGhlIGFkZHJlc3MgdXNpbmcgdGhlIGluZGV4IGZpZWxkCisgKiBpbiB0aGUgcGFnZSBzdHJ1Y3QuIFRoZSBpbmRleCBmaWVsZCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIGNodW5rLgogICoKICAqIFRvIHVzZSB0aGlzIGFsbG9jYXRvciwgYXJjaCBjb2RlIHNob3VsZCBkbyB0aGUgZm9sbG93aW5ncy4KICAqCkBAIC02MSw3ICs2MSw2IEBACiAjaW5jbHVkZSA8bGludXgvbXV0ZXguaD4KICNpbmNsdWRlIDxsaW51eC9wZXJjcHUuaD4KICNpbmNsdWRlIDxsaW51eC9wZm4uaD4KLSNpbmNsdWRlIDxsaW51eC9yYnRyZWUuaD4KICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4KICNpbmNsdWRlIDxsaW51eC92bWFsbG9jLmg+CkBAIC04OCw3ICs4Nyw2IEBACiAKIHN0cnVjdCBwY3B1X2NodW5rIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkCWxpc3Q7CQkvKiBsaW5rZWQgdG8gcGNwdV9zbG90IGxpc3RzICovCi0Jc3RydWN0IHJiX25vZGUJCXJiX25vZGU7CS8qIGtleSBpcyBjaHVuay0+dm0tPmFkZHIgKi8KIAlpbnQJCQlmcmVlX3NpemU7CS8qIGZyZWUgYnl0ZXMgaW4gdGhlIGNodW5rICovCiAJaW50CQkJY29udGlnX2hpbnQ7CS8qIG1heCBjb250aWd1b3VzIHNpemUgaGludCAqLwogCXN0cnVjdCB2bV9zdHJ1Y3QJKnZtOwkJLyogbWFwcGVkIHZtYWxsb2MgcmVnaW9uICovCkBAIC0xMTAsOSArMTA4LDIxIEBACiB2b2lkICpwY3B1X2Jhc2VfYWRkciBfX3JlYWRfbW9zdGx5OwogRVhQT1JUX1NZTUJPTF9HUEwocGNwdV9iYXNlX2FkZHIpOwogCi0vKiBvcHRpb25hbCByZXNlcnZlZCBjaHVuaywgb25seSBhY2Nlc3NpYmxlIGZvciByZXNlcnZlZCBhbGxvY2F0aW9ucyAqLworLyoKKyAqIFRoZSBmaXJzdCBjaHVuayB3aGljaCBhbHdheXMgZXhpc3RzLiAgTm90ZSB0aGF0IHVubGlrZSBvdGhlcgorICogY2h1bmtzLCB0aGlzIG9uZSBjYW4gYmUgYWxsb2NhdGVkIGFuZCBtYXBwZWQgaW4gc2V2ZXJhbCBkaWZmZXJlbnQKKyAqIHdheXMgYW5kIHRodXMgb2Z0ZW4gZG9lc24ndCBsaXZlIGluIHRoZSB2bWFsbG9jIGFyZWEuCisgKi8KK3N0YXRpYyBzdHJ1Y3QgcGNwdV9jaHVuayAqcGNwdV9maXJzdF9jaHVuazsKKworLyoKKyAqIE9wdGlvbmFsIHJlc2VydmVkIGNodW5rLiAgVGhpcyBjaHVuayByZXNlcnZlcyBwYXJ0IG9mIHRoZSBmaXJzdAorICogY2h1bmsgYW5kIHNlcnZlcyBpdCBmb3IgcmVzZXJ2ZWQgYWxsb2NhdGlvbnMuICBUaGUgYW1vdW50IG9mCisgKiByZXNlcnZlZCBvZmZzZXQgaXMgaW4gcGNwdV9yZXNlcnZlZF9jaHVua19saW1pdC4gIFdoZW4gcmVzZXJ2ZWQKKyAqIGFyZWEgZG9lc24ndCBleGlzdCwgdGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgY29udGFpbiBOVUxMIGFuZCAwCisgKiByZXNwZWN0aXZlbHkuCisgKi8KIHN0YXRpYyBzdHJ1Y3QgcGNwdV9jaHVuayAqcGNwdV9yZXNlcnZlZF9jaHVuazsKLS8qIG9mZnNldCBsaW1pdCBvZiB0aGUgcmVzZXJ2ZWQgY2h1bmsgKi8KIHN0YXRpYyBpbnQgcGNwdV9yZXNlcnZlZF9jaHVua19saW1pdDsKIAogLyoKQEAgLTEyMSw3ICsxMzEsNyBAQAogICogVGhlcmUgYXJlIHR3byBsb2NrcyAtIHBjcHVfYWxsb2NfbXV0ZXggYW5kIHBjcHVfbG9jay4gIFRoZSBmb3JtZXIKICAqIHByb3RlY3RzIGFsbG9jYXRpb24vcmVjbGFpbSBwYXRocywgY2h1bmtzIGFuZCBjaHVuay0+cGFnZSBhcnJheXMuCiAgKiBUaGUgbGF0dGVyIGlzIGEgc3BpbmxvY2sgYW5kIHByb3RlY3RzIHRoZSBpbmRleCBkYXRhIHN0cnVjdHVyZXMgLQotICogY2h1bmsgc2xvdHMsIHJidHJlZSwgY2h1bmtzIGFuZCBhcmVhIG1hcHMgaW4gY2h1bmtzLgorICogY2h1bmsgc2xvdHMsIGNodW5rcyBhbmQgYXJlYSBtYXBzIGluIGNodW5rcy4KICAqCiAgKiBEdXJpbmcgYWxsb2NhdGlvbiwgcGNwdV9hbGxvY19tdXRleCBpcyBrZXB0IGxvY2tlZCBhbGwgdGhlIHRpbWUgYW5kCiAgKiBwY3B1X2xvY2sgaXMgZ3JhYmJlZCBhbmQgcmVsZWFzZWQgYXMgbmVjZXNzYXJ5LiAgQWxsIGFjdHVhbCBtZW1vcnkKQEAgLTE0MCw3ICsxNTAsNiBAQAogc3RhdGljIERFRklORV9TUElOTE9DSyhwY3B1X2xvY2spOwkvKiBwcm90ZWN0cyBpbmRleCBkYXRhIHN0cnVjdHVyZXMgKi8KIAogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgKnBjcHVfc2xvdCBfX3JlYWRfbW9zdGx5OyAvKiBjaHVuayBsaXN0IHNsb3RzICovCi1zdGF0aWMgc3RydWN0IHJiX3Jvb3QgcGNwdV9hZGRyX3Jvb3QgPSBSQl9ST09UOwkvKiBjaHVua3MgYnkgYWRkcmVzcyAqLwogCiAvKiByZWNsYWltIHdvcmsgdG8gcmVsZWFzZSBmdWxseSBmcmVlIGNodW5rcywgc2NoZWR1bGVkIGZyb20gZnJlZSBwYXRoICovCiBzdGF0aWMgdm9pZCBwY3B1X3JlY2xhaW0oc3RydWN0IHdvcmtfc3RydWN0ICp3b3JrKTsKQEAgLTE5MSw2ICsyMDAsMTggQEAKIAlyZXR1cm4gKnBjcHVfY2h1bmtfcGFnZXAoY2h1bmssIDAsIHBhZ2VfaWR4KSAhPSBOVUxMOwogfQogCisvKiBzZXQgdGhlIHBvaW50ZXIgdG8gYSBjaHVuayBpbiBhIHBhZ2Ugc3RydWN0ICovCitzdGF0aWMgdm9pZCBwY3B1X3NldF9wYWdlX2NodW5rKHN0cnVjdCBwYWdlICpwYWdlLCBzdHJ1Y3QgcGNwdV9jaHVuayAqcGNwdSkKK3sKKwlwYWdlLT5pbmRleCA9ICh1bnNpZ25lZCBsb25nKXBjcHU7Cit9CisKKy8qIG9idGFpbiBwb2ludGVyIHRvIGEgY2h1bmsgZnJvbSBhIHBhZ2Ugc3RydWN0ICovCitzdGF0aWMgc3RydWN0IHBjcHVfY2h1bmsgKnBjcHVfZ2V0X3BhZ2VfY2h1bmsoc3RydWN0IHBhZ2UgKnBhZ2UpCit7CisJcmV0dXJuIChzdHJ1Y3QgcGNwdV9jaHVuayAqKXBhZ2UtPmluZGV4OworfQorCiAvKioKICAqIHBjcHVfbWVtX2FsbG9jIC0gYWxsb2NhdGUgbWVtb3J5CiAgKiBAc2l6ZTogYnl0ZXMgdG8gYWxsb2NhdGUKQEAgLTI1Nyw5MyArMjc4LDI2IEBACiAJfQogfQogCi1zdGF0aWMgc3RydWN0IHJiX25vZGUgKipwY3B1X2NodW5rX3JiX3NlYXJjaCh2b2lkICphZGRyLAotCQkJCQkgICAgIHN0cnVjdCByYl9ub2RlICoqcGFyZW50cCkKLXsKLQlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmcGNwdV9hZGRyX3Jvb3QucmJfbm9kZTsKLQlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKLQlzdHJ1Y3QgcGNwdV9jaHVuayAqY2h1bms7Ci0KLQl3aGlsZSAoKnApIHsKLQkJcGFyZW50ID0gKnA7Ci0JCWNodW5rID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgcGNwdV9jaHVuaywgcmJfbm9kZSk7Ci0KLQkJaWYgKGFkZHIgPCBjaHVuay0+dm0tPmFkZHIpCi0JCQlwID0gJigqcCktPnJiX2xlZnQ7Ci0JCWVsc2UgaWYgKGFkZHIgPiBjaHVuay0+dm0tPmFkZHIpCi0JCQlwID0gJigqcCktPnJiX3JpZ2h0OwotCQllbHNlCi0JCQlicmVhazsKLQl9Ci0KLQlpZiAocGFyZW50cCkKLQkJKnBhcmVudHAgPSBwYXJlbnQ7Ci0JcmV0dXJuIHA7Ci19Ci0KIC8qKgotICogcGNwdV9jaHVua19hZGRyX3NlYXJjaCAtIHNlYXJjaCBmb3IgY2h1bmsgY29udGFpbmluZyBzcGVjaWZpZWQgYWRkcmVzcwotICogQGFkZHI6IGFkZHJlc3MgdG8gc2VhcmNoIGZvcgotICoKLSAqIExvb2sgZm9yIGNodW5rIHdoaWNoIG1pZ2h0IGNvbnRhaW4gQGFkZHIuICBNb3JlIHNwZWNpZmljYWxseSwgaXQKLSAqIHNlYXJjaHMgZm9yIHRoZSBjaHVuayB3aXRoIHRoZSBoaWdoZXN0IHN0YXJ0IGFkZHJlc3Mgd2hpY2ggaXNuJ3QKLSAqIGJleW9uZCBAYWRkci4KLSAqCi0gKiBDT05URVhUOgotICogcGNwdV9sb2NrLgorICogcGNwdV9jaHVua19hZGRyX3NlYXJjaCAtIGRldGVybWluZSBjaHVuayBjb250YWluaW5nIHNwZWNpZmllZCBhZGRyZXNzCisgKiBAYWRkcjogYWRkcmVzcyBmb3Igd2hpY2ggdGhlIGNodW5rIG5lZWRzIHRvIGJlIGRldGVybWluZWQuCiAgKgogICogUkVUVVJOUzoKICAqIFRoZSBhZGRyZXNzIG9mIHRoZSBmb3VuZCBjaHVuay4KICAqLwogc3RhdGljIHN0cnVjdCBwY3B1X2NodW5rICpwY3B1X2NodW5rX2FkZHJfc2VhcmNoKHZvaWQgKmFkZHIpCiB7Ci0Jc3RydWN0IHJiX25vZGUgKm4sICpwYXJlbnQ7Ci0Jc3RydWN0IHBjcHVfY2h1bmsgKmNodW5rOworCXZvaWQgKmZpcnN0X3N0YXJ0ID0gcGNwdV9maXJzdF9jaHVuay0+dm0tPmFkZHI7CiAKLQkvKiBpcyBpdCBpbiB0aGUgcmVzZXJ2ZWQgY2h1bms/ICovCi0JaWYgKHBjcHVfcmVzZXJ2ZWRfY2h1bmspIHsKLQkJdm9pZCAqc3RhcnQgPSBwY3B1X3Jlc2VydmVkX2NodW5rLT52bS0+YWRkcjsKLQotCQlpZiAoYWRkciA+PSBzdGFydCAmJiBhZGRyIDwgc3RhcnQgKyBwY3B1X3Jlc2VydmVkX2NodW5rX2xpbWl0KQorCS8qIGlzIGl0IGluIHRoZSBmaXJzdCBjaHVuaz8gKi8KKwlpZiAoYWRkciA+PSBmaXJzdF9zdGFydCAmJiBhZGRyIDwgZmlyc3Rfc3RhcnQgKyBwY3B1X2NodW5rX3NpemUpIHsKKwkJLyogaXMgaXQgaW4gdGhlIHJlc2VydmVkIGFyZWE/ICovCisJCWlmIChhZGRyIDwgZmlyc3Rfc3RhcnQgKyBwY3B1X3Jlc2VydmVkX2NodW5rX2xpbWl0KQogCQkJcmV0dXJuIHBjcHVfcmVzZXJ2ZWRfY2h1bms7CisJCXJldHVybiBwY3B1X2ZpcnN0X2NodW5rOwogCX0KIAotCS8qIG5haC4uLiBzZWFyY2ggdGhlIHJlZ3VsYXIgb25lcyAqLwotCW4gPSAqcGNwdV9jaHVua19yYl9zZWFyY2goYWRkciwgJnBhcmVudCk7Ci0JaWYgKCFuKSB7Ci0JCS8qIG5vIGV4YWN0bHkgbWF0Y2hpbmcgY2h1bmssIHRoZSBwYXJlbnQgaXMgdGhlIGNsb3Nlc3QgKi8KLQkJbiA9IHBhcmVudDsKLQkJQlVHX09OKCFuKTsKLQl9Ci0JY2h1bmsgPSByYl9lbnRyeShuLCBzdHJ1Y3QgcGNwdV9jaHVuaywgcmJfbm9kZSk7Ci0KLQlpZiAoYWRkciA8IGNodW5rLT52bS0+YWRkcikgewotCQkvKiB0aGUgcGFyZW50IHdhcyB0aGUgbmV4dCBvbmUsIGxvb2sgZm9yIHRoZSBwcmV2aW91cyBvbmUgKi8KLQkJbiA9IHJiX3ByZXYobik7Ci0JCUJVR19PTighbik7Ci0JCWNodW5rID0gcmJfZW50cnkobiwgc3RydWN0IHBjcHVfY2h1bmssIHJiX25vZGUpOwotCX0KLQotCXJldHVybiBjaHVuazsKLX0KLQotLyoqCi0gKiBwY3B1X2NodW5rX2FkZHJfaW5zZXJ0IC0gaW5zZXJ0IGNodW5rIGludG8gYWRkcmVzcyByYiB0cmVlCi0gKiBAbmV3OiBjaHVuayB0byBpbnNlcnQKLSAqCi0gKiBJbnNlcnQgQG5ldyBpbnRvIGFkZHJlc3MgcmIgdHJlZS4KLSAqCi0gKiBDT05URVhUOgotICogcGNwdV9sb2NrLgotICovCi1zdGF0aWMgdm9pZCBwY3B1X2NodW5rX2FkZHJfaW5zZXJ0KHN0cnVjdCBwY3B1X2NodW5rICpuZXcpCi17Ci0Jc3RydWN0IHJiX25vZGUgKipwLCAqcGFyZW50OwotCi0JcCA9IHBjcHVfY2h1bmtfcmJfc2VhcmNoKG5ldy0+dm0tPmFkZHIsICZwYXJlbnQpOwotCUJVR19PTigqcCk7Ci0JcmJfbGlua19ub2RlKCZuZXctPnJiX25vZGUsIHBhcmVudCwgcCk7Ci0JcmJfaW5zZXJ0X2NvbG9yKCZuZXctPnJiX25vZGUsICZwY3B1X2FkZHJfcm9vdCk7CisJcmV0dXJuIHBjcHVfZ2V0X3BhZ2VfY2h1bmsodm1hbGxvY190b19wYWdlKGFkZHIpKTsKIH0KIAogLyoqCkBAIC03NTUsNiArNzA5LDcgQEAKIAkJCQkJCSAgYWxsb2NfbWFzaywgMCk7CiAJCQlpZiAoISpwYWdlcCkKIAkJCQlnb3RvIGVycjsKKwkJCXBjcHVfc2V0X3BhZ2VfY2h1bmsoKnBhZ2VwLCBjaHVuayk7CiAJCX0KIAl9CiAKQEAgLTg3OSw3ICs4MzQsNiBAQAogCiAJc3Bpbl9sb2NrX2lycSgmcGNwdV9sb2NrKTsKIAlwY3B1X2NodW5rX3JlbG9jYXRlKGNodW5rLCAtMSk7Ci0JcGNwdV9jaHVua19hZGRyX2luc2VydChjaHVuayk7CiAJZ290byByZXN0YXJ0OwogCiBhcmVhX2ZvdW5kOgpAQCAtOTY4LDcgKzkyMiw2IEBACiAJCWlmIChjaHVuayA9PSBsaXN0X2ZpcnN0X2VudHJ5KGhlYWQsIHN0cnVjdCBwY3B1X2NodW5rLCBsaXN0KSkKIAkJCWNvbnRpbnVlOwogCi0JCXJiX2VyYXNlKCZjaHVuay0+cmJfbm9kZSwgJnBjcHVfYWRkcl9yb290KTsKIAkJbGlzdF9tb3ZlKCZjaHVuay0+bGlzdCwgJnRvZG8pOwogCX0KIApAQCAtMTE0Nyw3ICsxMTAwLDggQEAKIAogCWlmIChyZXNlcnZlZF9zaXplKSB7CiAJCXNjaHVuay0+ZnJlZV9zaXplID0gcmVzZXJ2ZWRfc2l6ZTsKLQkJcGNwdV9yZXNlcnZlZF9jaHVuayA9IHNjaHVuazsJLyogbm90IGZvciBkeW5hbWljIGFsbG9jICovCisJCXBjcHVfcmVzZXJ2ZWRfY2h1bmsgPSBzY2h1bms7CisJCXBjcHVfcmVzZXJ2ZWRfY2h1bmtfbGltaXQgPSBzdGF0aWNfc2l6ZSArIHJlc2VydmVkX3NpemU7CiAJfSBlbHNlIHsKIAkJc2NodW5rLT5mcmVlX3NpemUgPSBkeW5fc2l6ZTsKIAkJZHluX3NpemUgPSAwOwkJCS8qIGR5bmFtaWMgYXJlYSBjb3ZlcmVkICovCkBAIC0xMTU4LDggKzExMTIsNiBAQAogCWlmIChzY2h1bmstPmZyZWVfc2l6ZSkKIAkJc2NodW5rLT5tYXBbc2NodW5rLT5tYXBfdXNlZCsrXSA9IHNjaHVuay0+ZnJlZV9zaXplOwogCi0JcGNwdV9yZXNlcnZlZF9jaHVua19saW1pdCA9IHN0YXRpY19zaXplICsgc2NodW5rLT5mcmVlX3NpemU7Ci0KIAkvKiBpbml0IGR5bmFtaWMgY2h1bmsgaWYgbmVjZXNzYXJ5ICovCiAJaWYgKGR5bl9zaXplKSB7CiAJCWRjaHVuayA9IGFsbG9jX2Jvb3RtZW0oc2l6ZW9mKHN0cnVjdCBwY3B1X2NodW5rKSk7CkBAIC0xMjI2LDEzICsxMTc4LDggQEAKIAl9CiAKIAkvKiBsaW5rIHRoZSBmaXJzdCBjaHVuayBpbiAqLwotCWlmICghZGNodW5rKSB7Ci0JCXBjcHVfY2h1bmtfcmVsb2NhdGUoc2NodW5rLCAtMSk7Ci0JCXBjcHVfY2h1bmtfYWRkcl9pbnNlcnQoc2NodW5rKTsKLQl9IGVsc2UgewotCQlwY3B1X2NodW5rX3JlbG9jYXRlKGRjaHVuaywgLTEpOwotCQlwY3B1X2NodW5rX2FkZHJfaW5zZXJ0KGRjaHVuayk7Ci0JfQorCXBjcHVfZmlyc3RfY2h1bmsgPSBkY2h1bmsgPzogc2NodW5rOworCXBjcHVfY2h1bmtfcmVsb2NhdGUocGNwdV9maXJzdF9jaHVuaywgLTEpOwogCiAJLyogd2UncmUgZG9uZSAqLwogCXBjcHVfYmFzZV9hZGRyID0gKHZvaWQgKilwY3B1X2NodW5rX2FkZHIoc2NodW5rLCAwLCAwKTsKZGlmZiAtLWdpdCBhL21tL3NsYWIuYyBiL21tL3NsYWIuYwppbmRleCA5YTkwYjAwLi5mODU4MzFkIDEwMDY0NAotLS0gYS9tbS9zbGFiLmMKKysrIGIvbW0vc2xhYi5jCkBAIC0xMDIsNyArMTAyLDcgQEAKICNpbmNsdWRlCTxsaW51eC9jcHUuaD4KICNpbmNsdWRlCTxsaW51eC9zeXNjdGwuaD4KICNpbmNsdWRlCTxsaW51eC9tb2R1bGUuaD4KLSNpbmNsdWRlCTx0cmFjZS9rbWVtdHJhY2UuaD4KKyNpbmNsdWRlCTxsaW51eC9rbWVtdHJhY2UuaD4KICNpbmNsdWRlCTxsaW51eC9yY3VwZGF0ZS5oPgogI2luY2x1ZGUJPGxpbnV4L3N0cmluZy5oPgogI2luY2x1ZGUJPGxpbnV4L3VhY2Nlc3MuaD4KZGlmZiAtLWdpdCBhL21tL3Nsb2IuYyBiL21tL3Nsb2IuYwppbmRleCBmOTJlNjZkLi45YjE3MzdiIDEwMDY0NAotLS0gYS9tbS9zbG9iLmMKKysrIGIvbW0vc2xvYi5jCkBAIC02Niw3ICs2Niw3IEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4KICNpbmNsdWRlIDxsaW51eC9saXN0Lmg+Ci0jaW5jbHVkZSA8dHJhY2Uva21lbXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8YXNtL2F0b21pYy5oPgogCiAvKgpkaWZmIC0tZ2l0IGEvbW0vc2x1Yi5jIGIvbW0vc2x1Yi5jCmluZGV4IDY1ZmZkYTUuLjVlODA1YTYgMTAwNjQ0Ci0tLSBhL21tL3NsdWIuYworKysgYi9tbS9zbHViLmMKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiAjaW5jbHVkZSA8bGludXgvcHJvY19mcy5oPgogI2luY2x1ZGUgPGxpbnV4L3NlcV9maWxlLmg+Ci0jaW5jbHVkZSA8dHJhY2Uva21lbXRyYWNlLmg+CisjaW5jbHVkZSA8bGludXgva21lbXRyYWNlLmg+CiAjaW5jbHVkZSA8bGludXgvY3B1Lmg+CiAjaW5jbHVkZSA8bGludXgvY3B1c2V0Lmg+CiAjaW5jbHVkZSA8bGludXgvbWVtcG9saWN5Lmg+CmRpZmYgLS1naXQgYS9tbS91dGlsLmMgYi9tbS91dGlsLmMKaW5kZXggNTViZWYxNi4uYWJjNjVhYSAxMDA2NDQKLS0tIGEvbW0vdXRpbC5jCisrKyBiL21tL3V0aWwuYwpAQCAtNCw5ICs0LDExIEBACiAjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiAjaW5jbHVkZSA8bGludXgvZXJyLmg+CiAjaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KLSNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CiAjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KIAorI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTCisjaW5jbHVkZSA8dHJhY2UvZXZlbnRzL2ttZW0uaD4KKwogLyoqCiAgKiBrc3RyZHVwIC0gYWxsb2NhdGUgc3BhY2UgZm9yIGFuZCBjb3B5IGFuIGV4aXN0aW5nIHN0cmluZwogICogQHM6IHRoZSBzdHJpbmcgdG8gZHVwbGljYXRlCkBAIC0yNTUsMTMgKzI1Nyw2IEBACiBFWFBPUlRfU1lNQk9MX0dQTChnZXRfdXNlcl9wYWdlc19mYXN0KTsKIAogLyogVHJhY2Vwb2ludHMgZGVmaW5pdGlvbnMuICovCi1ERUZJTkVfVFJBQ0Uoa21hbGxvYyk7Ci1ERUZJTkVfVFJBQ0Uoa21lbV9jYWNoZV9hbGxvYyk7Ci1ERUZJTkVfVFJBQ0Uoa21hbGxvY19ub2RlKTsKLURFRklORV9UUkFDRShrbWVtX2NhY2hlX2FsbG9jX25vZGUpOwotREVGSU5FX1RSQUNFKGtmcmVlKTsKLURFRklORV9UUkFDRShrbWVtX2NhY2hlX2ZyZWUpOwotCiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woa21hbGxvYyk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woa21lbV9jYWNoZV9hbGxvYyk7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0woa21hbGxvY19ub2RlKTsKZGlmZiAtLWdpdCBhL25ldC9jb3JlL2Ryb3BfbW9uaXRvci5jIGIvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKaW5kZXggOWZkMGRjMy4uYjc1YjZjZSAxMDA2NDQKLS0tIGEvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKKysrIGIvbmV0L2NvcmUvZHJvcF9tb25pdG9yLmMKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxsaW51eC9iaXRvcHMuaD4KICNpbmNsdWRlIDxuZXQvZ2VuZXRsaW5rLmg+CiAKLSNpbmNsdWRlIDx0cmFjZS9za2IuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2tiLmg+CiAKICNpbmNsdWRlIDxhc20vdW5hbGlnbmVkLmg+CiAKZGlmZiAtLWdpdCBhL25ldC9jb3JlL25ldC10cmFjZXMuYyBiL25ldC9jb3JlL25ldC10cmFjZXMuYwppbmRleCBjOGZiNDU2Li40OTlhNjdlIDEwMDY0NAotLS0gYS9uZXQvY29yZS9uZXQtdHJhY2VzLmMKKysrIGIvbmV0L2NvcmUvbmV0LXRyYWNlcy5jCkBAIC0xOSwxMSArMTksMTEgQEAKICNpbmNsdWRlIDxsaW51eC93b3JrcXVldWUuaD4KICNpbmNsdWRlIDxsaW51eC9uZXRsaW5rLmg+CiAjaW5jbHVkZSA8bGludXgvbmV0X2Ryb3Btb24uaD4KLSNpbmNsdWRlIDx0cmFjZS9za2IuaD4KIAogI2luY2x1ZGUgPGFzbS91bmFsaWduZWQuaD4KICNpbmNsdWRlIDxhc20vYml0b3BzLmg+CiAKKyNkZWZpbmUgQ1JFQVRFX1RSQUNFX1BPSU5UUworI2luY2x1ZGUgPHRyYWNlL2V2ZW50cy9za2IuaD4KIAotREVGSU5FX1RSQUNFKGtmcmVlX3NrYik7CiBFWFBPUlRfVFJBQ0VQT0lOVF9TWU1CT0xfR1BMKGtmcmVlX3NrYik7CmRpZmYgLS1naXQgYS9uZXQvY29yZS9za2J1ZmYuYyBiL25ldC9jb3JlL3NrYnVmZi5jCmluZGV4IGU1MDViNTMuLmMyZTRmYjggMTAwNjQ0Ci0tLSBhL25ldC9jb3JlL3NrYnVmZi5jCisrKyBiL25ldC9jb3JlL3NrYnVmZi5jCkBAIC02NSw3ICs2NSw3IEBACiAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KLSNpbmNsdWRlIDx0cmFjZS9za2IuaD4KKyNpbmNsdWRlIDx0cmFjZS9ldmVudHMvc2tiLmg+CiAKICNpbmNsdWRlICJrbWFwX3NrYi5oIgogCmRpZmYgLS1naXQgYS9zYW1wbGVzL0tjb25maWcgYi9zYW1wbGVzL0tjb25maWcKaW5kZXggNGIwMmY1YS4uYjc1ZDI4YyAxMDA2NDQKLS0tIGEvc2FtcGxlcy9LY29uZmlnCisrKyBiL3NhbXBsZXMvS2NvbmZpZwpAQCAtMTksNiArMTksMTIgQEAKIAloZWxwCiAJICBUaGlzIGJ1aWxkIHRyYWNlcG9pbnRzIGV4YW1wbGUgbW9kdWxlcy4KIAorY29uZmlnIFNBTVBMRV9UUkFDRV9FVkVOVFMKKwl0cmlzdGF0ZSAiQnVpbGQgdHJhY2VfZXZlbnRzIGV4YW1wbGVzIC0tIGxvYWRhYmxlIG1vZHVsZXMgb25seSIKKwlkZXBlbmRzIG9uIEVWRU5UX1RSQUNJTkcgJiYgbQorCWhlbHAKKwkgIFRoaXMgYnVpbGQgdHJhY2UgZXZlbnQgZXhhbXBsZSBtb2R1bGVzLgorCiBjb25maWcgU0FNUExFX0tPQkpFQ1QKIAl0cmlzdGF0ZSAiQnVpbGQga29iamVjdCBleGFtcGxlcyIKIAloZWxwCmRpZmYgLS1naXQgYS9zYW1wbGVzL01ha2VmaWxlIGIvc2FtcGxlcy9NYWtlZmlsZQppbmRleCAxMGVhY2E4Li4xM2U0YjQ3IDEwMDY0NAotLS0gYS9zYW1wbGVzL01ha2VmaWxlCisrKyBiL3NhbXBsZXMvTWFrZWZpbGUKQEAgLTEsMyArMSwzIEBACiAjIE1ha2VmaWxlIGZvciBMaW51eCBzYW1wbGVzIGNvZGUKIAotb2JqLSQoQ09ORklHX1NBTVBMRVMpCSs9IG1hcmtlcnMvIGtvYmplY3QvIGtwcm9iZXMvIHRyYWNlcG9pbnRzLworb2JqLSQoQ09ORklHX1NBTVBMRVMpCSs9IG1hcmtlcnMvIGtvYmplY3QvIGtwcm9iZXMvIHRyYWNlcG9pbnRzLyB0cmFjZV9ldmVudHMvCmRpZmYgLS1naXQgYS9zYW1wbGVzL3RyYWNlX2V2ZW50cy9NYWtlZmlsZSBiL3NhbXBsZXMvdHJhY2VfZXZlbnRzL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkNDI4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3RyYWNlX2V2ZW50cy9NYWtlZmlsZQpAQCAtMCwwICsxLDYgQEAKKyMgYnVpbGRzIHRoZSB0cmFjZSBldmVudHMgZXhhbXBsZSBrZXJuZWwgbW9kdWxlczsKKyMgdGhlbiB0byB1c2Ugb25lIChhcyByb290KTogIGluc21vZCA8bW9kdWxlX25hbWUua28+CisKK0NGTEFHU190cmFjZS1ldmVudHMtc2FtcGxlLm8gOj0gLUkkKHNyYykKKworb2JqLSQoQ09ORklHX1NBTVBMRV9UUkFDRV9FVkVOVFMpICs9IHRyYWNlLWV2ZW50cy1zYW1wbGUubwpkaWZmIC0tZ2l0IGEvc2FtcGxlcy90cmFjZV9ldmVudHMvdHJhY2UtZXZlbnRzLXNhbXBsZS5jIGIvc2FtcGxlcy90cmFjZV9ldmVudHMvdHJhY2UtZXZlbnRzLXNhbXBsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhYmM0ZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zYW1wbGVzL3RyYWNlX2V2ZW50cy90cmFjZS1ldmVudHMtc2FtcGxlLmMKQEAgLTAsMCArMSw1MiBAQAorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2luY2x1ZGUgPGxpbnV4L2t0aHJlYWQuaD4KKworLyoKKyAqIEFueSBmaWxlIHRoYXQgdXNlcyB0cmFjZSBwb2ludHMsIG11c3QgaW5jbHVkZSB0aGUgaGVhZGVyLgorICogQnV0IG9ubHkgb25lIGZpbGUsIG11c3QgaW5jbHVkZSB0aGUgaGVhZGVyIGJ5IGRlZmluaW5nCisgKiBDUkVBVEVfVFJBQ0VfUE9JTlRTIGZpcnN0LiAgVGhpcyB3aWxsIG1ha2UgdGhlIEMgY29kZSB0aGF0CisgKiBjcmVhdGVzIHRoZSBoYW5kbGVzIGZvciB0aGUgdHJhY2UgcG9pbnRzLgorICovCisjZGVmaW5lIENSRUFURV9UUkFDRV9QT0lOVFMKKyNpbmNsdWRlICJ0cmFjZS1ldmVudHMtc2FtcGxlLmgiCisKKworc3RhdGljIHZvaWQgc2ltcGxlX3RocmVhZF9mdW5jKGludCBjbnQpCit7CisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJQkxFKTsKKwlzY2hlZHVsZV90aW1lb3V0KEhaKTsKKwl0cmFjZV9mb29fYmFyKCJoZWxsbyIsIGNudCk7Cit9CisKK3N0YXRpYyBpbnQgc2ltcGxlX3RocmVhZCh2b2lkICphcmcpCit7CisJaW50IGNudCA9IDA7CisKKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkKKwkJc2ltcGxlX3RocmVhZF9mdW5jKGNudCsrKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRhc2tfc3RydWN0ICpzaW1wbGVfdHNrOworCitzdGF0aWMgaW50IF9faW5pdCB0cmFjZV9ldmVudF9pbml0KHZvaWQpCit7CisJc2ltcGxlX3RzayA9IGt0aHJlYWRfcnVuKHNpbXBsZV90aHJlYWQsIE5VTEwsICJldmVudC1zYW1wbGUiKTsKKwlpZiAoSVNfRVJSKHNpbXBsZV90c2spKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHRyYWNlX2V2ZW50X2V4aXQodm9pZCkKK3sKKwlrdGhyZWFkX3N0b3Aoc2ltcGxlX3Rzayk7Cit9CisKK21vZHVsZV9pbml0KHRyYWNlX2V2ZW50X2luaXQpOworbW9kdWxlX2V4aXQodHJhY2VfZXZlbnRfZXhpdCk7CisKK01PRFVMRV9BVVRIT1IoIlN0ZXZlbiBSb3N0ZWR0Iik7CitNT0RVTEVfREVTQ1JJUFRJT04oInRyYWNlLWV2ZW50cy1zYW1wbGUiKTsKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKZGlmZiAtLWdpdCBhL3NhbXBsZXMvdHJhY2VfZXZlbnRzL3RyYWNlLWV2ZW50cy1zYW1wbGUuaCBiL3NhbXBsZXMvdHJhY2VfZXZlbnRzL3RyYWNlLWV2ZW50cy1zYW1wbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjhhODk3Ci0tLSAvZGV2L251bGwKKysrIGIvc2FtcGxlcy90cmFjZV9ldmVudHMvdHJhY2UtZXZlbnRzLXNhbXBsZS5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogTm90aWNlIHRoYXQgdGhpcyBmaWxlIGlzIG5vdCBwcm90ZWN0ZWQgbGlrZSBhIG5vcm1hbCBoZWFkZXIuCisgKiBXZSBhbHNvIG11c3QgYWxsb3cgZm9yIHJlcmVhZGluZyBvZiB0aGlzIGZpbGUuIFRoZQorICoKKyAqICB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9SRUFEKQorICoKKyAqIHNlcnZlcyB0aGlzIHB1cnBvc2UuCisgKi8KKyNpZiAhZGVmaW5lZChfVFJBQ0VfRVZFTlRfU0FNUExFX0gpIHx8IGRlZmluZWQoVFJBQ0VfSEVBREVSX01VTFRJX1JFQUQpCisjZGVmaW5lIF9UUkFDRV9FVkVOVF9TQU1QTEVfSAorCisvKgorICogQWxsIHRyYWNlIGhlYWRlcnMgc2hvdWxkIGluY2x1ZGUgdHJhY2Vwb2ludC5oLCB1bnRpbCB3ZSBmaW5hbGx5CisgKiBtYWtlIGl0IGludG8gYSBzdGFuZGFyZCBoZWFkZXIuCisgKi8KKyNpbmNsdWRlIDxsaW51eC90cmFjZXBvaW50Lmg+CisKKy8qCisgKiBJZiBUUkFDRV9TWVNURU0gaXMgZGVmaW5lZCwgdGhhdCB3aWxsIGJlIHRoZSBkaXJlY3RvcnkgY3JlYXRlZAorICogaW4gdGhlIGZ0cmFjZSBkaXJlY3RvcnkgdW5kZXIgL2RlYnVnZnMvdHJhY2luZy9ldmVudHMvPHN5c3RlbT4KKyAqCisgKiBUaGUgZGVmaW5lX3RyYWNlLmggYmVsb3dlIHdpbGwgYWxzbyBsb29rIGZvciBhIGZpbGUgbmFtZSBvZgorICogVFJBQ0VfU1lTVEVNLmggd2hlcmUgVFJBQ0VfU1lTVEVNIGlzIHdoYXQgaXMgZGVmaW5lZCBoZXJlLgorICoKKyAqIElmIHlvdSB3YW50IGEgZGlmZmVyZW50IHN5c3RlbSB0aGFuIGZpbGUgbmFtZSwgeW91IGNhbiBvdmVycmlkZQorICogdGhlIGhlYWRlciBuYW1lIGJ5IGRlZmluaW5nIFRSQUNFX0lOQ0xVREVfRklMRQorICoKKyAqIElmIHRoaXMgZmlsZSB3YXMgY2FsbGVkLCBnb29meS5oLCB0aGVuIHdlIHdvdWxkIGRlZmluZToKKyAqCisgKiAjZGVmaW5lIFRSQUNFX0lOQ0xVREVfRklMRSBnb29meQorICoKKyAqLworI3VuZGVmIFRSQUNFX1NZU1RFTQorI2RlZmluZSBUUkFDRV9TWVNURU0gc2FtcGxlCisKKy8qCisgKiBUaGUgVFJBQ0VfRVZFTlQgbWFjcm8gaXMgYnJva2VuIHVwIGludG8gNSBwYXJ0cy4KKyAqCisgKiBuYW1lOiBuYW1lIG9mIHRoZSB0cmFjZSBwb2ludC4gVGhpcyBpcyBhbHNvIGhvdyB0byBlbmFibGUgdGhlIHRyYWNlcG9pbnQuCisgKiAgIEEgZnVuY3Rpb24gY2FsbGVkIHRyYWNlX2Zvb19iYXIoKSB3aWxsIGJlIGNyZWF0ZWQuCisgKgorICogcHJvdG86IHRoZSBwcm90b3R5cGUgb2YgdGhlIGZ1bmN0aW9uIHRyYWNlX2Zvb19iYXIoKQorICogICBIZXJlIGl0IGlzIHRyYWNlX2Zvb19iYXIoY2hhciAqZm9vLCBpbnQgYmFyKS4KKyAqCisgKiBhcmdzOiAgbXVzdCBtYXRjaCB0aGUgYXJndW1lbnRzIGluIHRoZSBwcm90b3R5cGUuCisgKiAgICBIZXJlIGl0IGlzIHNpbXBseSAiZm9vLCBiYXIiLgorICoKKyAqIHN0cnVjdDogIFRoaXMgZGVmaW5lcyB0aGUgd2F5IHRoZSBkYXRhIHdpbGwgYmUgc3RvcmVkIGluIHRoZSByaW5nIGJ1ZmZlci4KKyAqICAgIFRoZXJlIGFyZSBjdXJyZW50bHkgdHdvIHR5cGVzIG9mIGVsZW1lbnRzLiBfX2ZpZWxkIGFuZCBfX2FycmF5LgorICogICAgYSBfX2ZpZWxkIGlzIGJyb2tlbiB1cCBpbnRvICh0eXBlLCBuYW1lKS4gV2hlcmUgdHlwZSBjYW4gYmUgYW55CisgKiAgICB0eXBlIGJ1dCBhbiBhcnJheS4KKyAqICAgIEZvciBhbiBhcnJheS4gdGhlcmUgYXJlIHRocmVlIGZpZWxkcy4gKHR5cGUsIG5hbWUsIHNpemUpLiBUaGUKKyAqICAgIHR5cGUgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LCB0aGUgbmFtZSBvZiB0aGUgZmllbGQgYW5kIHRoZSBzaXplCisgKiAgICBvZiB0aGUgYXJyYXkuCisgKgorICogICAgX19hcnJheSggY2hhciwgZm9vLCAxMCkgaXMgdGhlIHNhbWUgYXMgc2F5aW5nICAgY2hhciBmb29bMTBdLgorICoKKyAqIGZhc3RfYXNzaWduOiBUaGlzIGlzIGEgQyBsaWtlIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBzdG9yZSB0aGUgaXRlbXMKKyAqICAgIGludG8gdGhlIHJpbmcgYnVmZmVyLgorICoKKyAqIHByaW50azogVGhpcyBpcyBhIHdheSB0byBwcmludCBvdXQgdGhlIGRhdGEgaW4gcHJldHR5IHByaW50LiBUaGlzIGlzCisgKiAgICB1c2VmdWwgaWYgdGhlIHN5c3RlbSBjcmFzaGVzIGFuZCB5b3UgYXJlIGxvZ2dpbmcgdmlhIGEgc2VyaWFsIGxpbmUsCisgKiAgICB0aGUgZGF0YSBjYW4gYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSB1c2luZyB0aGlzICJwcmludGsiIG1ldGhvZC4KKyAqCisgKiBOb3RlLCB0aGF0IGZvciBib3RoIHRoZSBhc3NpZ24gYW5kIHRoZSBwcmludGssIF9fZW50cnkgaXMgdGhlIGhhbmRsZXIKKyAqIHRvIHRoZSBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgcmluZyBidWZmZXIsIGFuZCBpcyBkZWZpbmVkIGJ5IHRoZQorICogVFBfU1RSVUNUX19lbnRyeS4KKyAqLworVFJBQ0VfRVZFTlQoZm9vX2JhciwKKworCVRQX1BST1RPKGNoYXIgKmZvbywgaW50IGJhciksCisKKwlUUF9BUkdTKGZvbywgYmFyKSwKKworCVRQX1NUUlVDVF9fZW50cnkoCisJCV9fYXJyYXkoCWNoYXIsCWZvbywgICAgMTAJCSkKKwkJX19maWVsZCgJaW50LAliYXIJCQkpCisJKSwKKworCVRQX2Zhc3RfYXNzaWduKAorCQlzdHJuY3B5KF9fZW50cnktPmZvbywgZm9vLCAxMCk7CisJCV9fZW50cnktPmJhcgk9IGJhcjsKKwkpLAorCisJVFBfcHJpbnRrKCJmb28gJXMgJWQiLCBfX2VudHJ5LT5mb28sIF9fZW50cnktPmJhcikKKyk7CisjZW5kaWYKKworLyoqKioqIE5PVElDRSEgVGhlICNpZiBwcm90ZWN0aW9uIGVuZHMgaGVyZS4gKioqKiovCisKKworLyoKKyAqIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgSSBjb3VsZCBoYXZlIGRvbmUgdGhpcy4gSWYgSSBsZWZ0IG91dCB0aGUKKyAqIFRSQUNFX0lOQ0xVREVfUEFUSCwgdGhlbiBpdCB3b3VsZCBkZWZhdWx0IHRvIHRoZSBrZXJuZWwgc291cmNlCisgKiBpbmNsdWRlL3RyYWNlL2V2ZW50cyBkaXJlY3RvcnkuCisgKgorICogSSBjb3VsZCBzcGVjaWZ5IGEgcGF0aCBmcm9tIHRoZSBkZWZpbmVfdHJhY2UuaCBmaWxlIGJhY2sgdG8gdGhpcworICogZmlsZS4KKyAqCisgKiAjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuLi8uLi9zYW1wbGVzL3RyYWNlX2V2ZW50cworICoKKyAqIEJ1dCBJIGNob3NlIHRvIHNpbXBseSBtYWtlIGl0IHVzZSB0aGUgY3VycmVudCBkaXJlY3RvcnkgYW5kIHRoZW4gaW4KKyAqIHRoZSBNYWtlZmlsZSBJIGFkZGVkOgorICoKKyAqIENGTEFHU190cmFjZS1ldmVudHMtc2FtcGxlLm8gOj0gLUkkKFBXRCkvc2FtcGxlcy90cmFjZV9ldmVudHMvCisgKgorICogVGhpcyB3aWxsIG1ha2Ugc3VyZSB0aGUgY3VycmVudCBwYXRoIGlzIHBhcnQgb2YgdGhlIGluY2x1ZGUKKyAqIHN0cnVjdHVyZSBmb3Igb3VyIGZpbGUgc28gdGhhdCB3ZSBjYW4gZmluZCBpdC4KKyAqCisgKiBJIGNvdWxkIGhhdmUgbWFkZSBvbmx5IHRoZSB0b3AgbGV2ZWwgZGlyZWN0b3J5IHRoZSBpbmNsdWRlOgorICoKKyAqIENGTEFHU190cmFjZS1ldmVudHMtc2FtcGxlLm8gOj0gLUkkKFBXRCkKKyAqCisgKiBBbmQgdGhlbiBsZXQgdGhlIHBhdGggdG8gdGhpcyBkaXJlY3RvcnkgYmUgdGhlIFRSQUNFX0lOQ0xVREVfUEFUSDoKKyAqCisgKiAjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCBzYW1wbGVzL3RyYWNlX2V2ZW50cworICoKKyAqIEJ1dCB0aGVuIGlmIHNvbWV0aGluZyBkZWZpbmVzICJzYW1wbGVzIiBvciAidHJhY2VfZXZlbnRzIiB0aGVuIHdlCisgKiBjb3VsZCByaXNrIHRoYXQgYmVpbmcgY29udmVydGVkIHRvbywgYW5kIGdpdmUgdXMgYW4gdW5leHBlY3RlZAorICogcmVzdWx0LgorICovCisjdW5kZWYgVFJBQ0VfSU5DTFVERV9QQVRICisjdW5kZWYgVFJBQ0VfSU5DTFVERV9GSUxFCisjZGVmaW5lIFRSQUNFX0lOQ0xVREVfUEFUSCAuCisvKgorICogVFJBQ0VfSU5DTFVERV9GSUxFIGlzIG5vdCBuZWVkZWQgaWYgdGhlIGZpbGVuYW1lIGFuZCBUUkFDRV9TWVNURU0gYXJlIGVxdWFsCisgKi8KKyNkZWZpbmUgVFJBQ0VfSU5DTFVERV9GSUxFIHRyYWNlLWV2ZW50cy1zYW1wbGUKKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJhY2UuaD4KZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUubGliIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKaW5kZXggY2JhNjFjYS4uMmI3MDY2MSAxMDA2NDQKLS0tIGEvc2NyaXB0cy9NYWtlZmlsZS5saWIKKysrIGIvc2NyaXB0cy9NYWtlZmlsZS5saWIKQEAgLTE4OCwyMCArMTg4LDM0IEBACiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBxdWlldF9jbWRfZ3ppcCA9IEdaSVAgICAgJEAKLWNtZF9nemlwID0gZ3ppcCAtZiAtOSA8ICQ8ID4gJEAKK2NtZF9nemlwID0gKGNhdCAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pIHwgZ3ppcCAtZiAtOSA+ICRAKSB8fCBcCisJKHJtIC1mICRAIDsgZmFsc2UpCiAKIAogIyBCemlwMgogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotIyBCemlwMiBkb2VzIG5vdCBpbmNsdWRlIHNpemUgaW4gZmlsZS4uLiBzbyB3ZSBoYXZlIHRvIGZha2UgdGhhdAotc2l6ZV9hcHBlbmQ9JChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9iaW5fc2l6ZQorIyBCemlwMiBhbmQgTFpNQSBkbyBub3QgaW5jbHVkZSBzaXplIGluIGZpbGUuLi4gc28gd2UgaGF2ZSB0byBmYWtlIHRoYXQ7CisjIGFwcGVuZCB0aGUgc2l6ZSBhcyBhIDMyLWJpdCBsaXR0bGVlbmRpYW4gbnVtYmVyIGFzIGd6aXAgZG9lcy4KK3NpemVfYXBwZW5kID0gZWNobyAtbmUgJChzaGVsbAkJCQkJCVwKK2RlY19zaXplPTA7CQkJCQkJCQlcCitmb3IgRiBpbiAkMTsgZG8JCQkJCQkJCVwKKwlmc2l6ZT0kJChzdGF0IC1jICIlcyIgJCRGKTsJCQkJCVwKKwlkZWNfc2l6ZT0kJChleHByICQkZGVjX3NpemUgKyAkJGZzaXplKTsJCQkJXAorZG9uZTsJCQkJCQkJCQlcCitwcmludGYgIiUwOHgiICQkZGVjX3NpemUgfAkJCQkJCVwKKwlzZWQgJ3MvXCguLlwpXCguLlwpXCguLlwpXCguLlwpL1xcXFx4XDRcXFxceFwzXFxcXHhcMlxcXFx4XDEvZycJXAorKQogCi1xdWlldF9jbWRfYnppcDIgPSBCWklQMiAgICAkQAotY21kX2J6aXAyID0gKGJ6aXAyIC05IDwgJDwgJiYgJChzaXplX2FwcGVuZCkgJDwpID4gJEAgfHwgKHJtIC1mICRAIDsgZmFsc2UpCitxdWlldF9jbWRfYnppcDIgPSBCWklQMiAgICRACitjbWRfYnppcDIgPSAoY2F0ICQoZmlsdGVyLW91dCBGT1JDRSwkXikgfCBcCisJYnppcDIgLTkgJiYgJChjYWxsIHNpemVfYXBwZW5kLCAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pKSkgPiAkQCB8fCBcCisJKHJtIC1mICRAIDsgZmFsc2UpCiAKICMgTHptYQogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogcXVpZXRfY21kX2x6bWEgPSBMWk1BICAgICRACi1jbWRfbHptYSA9IChsem1hIC05IC1jICQ8ICYmICQoc2l6ZV9hcHBlbmQpICQ8KSA+JEAgfHwgKHJtIC1mICRAIDsgZmFsc2UpCitjbWRfbHptYSA9IChjYXQgJChmaWx0ZXItb3V0IEZPUkNFLCReKSB8IFwKKwlsem1hIC05ICYmICQoY2FsbCBzaXplX2FwcGVuZCwgJChmaWx0ZXItb3V0IEZPUkNFLCReKSkpID4gJEAgfHwgXAorCShybSAtZiAkQCA7IGZhbHNlKQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iaW5fc2l6ZSBiL3NjcmlwdHMvYmluX3NpemUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZTFiMzYuLjAwMDAwMDAKLS0tIGEvc2NyaXB0cy9iaW5fc2l6ZQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLSMhL2Jpbi9zaAotCi1pZiBbICQjID0gMCBdIDsgdGhlbgotICAgZWNobyBVc2FnZTogJDAgZmlsZQotZmkKLQotc2l6ZV9kZWM9YHN0YXQgLWMgIiVzIiAkMWAKLXNpemVfaGV4X2VjaG9fc3RyaW5nPWBwcmludGYgIiUwOHgiICRzaXplX2RlYyB8Ci0gICAgIHNlZCAncy9cKC4uXClcKC4uXClcKC4uXClcKC4uXCkvXFxcXHhcNFxcXFx4XDNcXFxceFwyXFxcXHhcMS9nJ2AKLS9iaW4vZWNobyAtbmUgJHNpemVfaGV4X2VjaG9fc3RyaW5nCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tlcm5lbC1kb2MgYi9zY3JpcHRzL2tlcm5lbC1kb2MKaW5kZXggMzIwOGEzYS4uYWNkOGM0YSAxMDA3NTUKLS0tIGEvc2NyaXB0cy9rZXJuZWwtZG9jCisrKyBiL3NjcmlwdHMva2VybmVsLWRvYwpAQCAtMTgyOCw2ICsxODI4LDI1IEBACiAgICAgJHN0YXRlID0gMDsKIH0KIAorc3ViIHRyYWNlcG9pbnRfbXVuZ2UoJCkgeworCW15ICRmaWxlID0gc2hpZnQ7CisJbXkgJHRyYWNlcG9pbnRuYW1lID0gMDsKKwlteSAkdHJhY2Vwb2ludGFyZ3MgPSAwOworCisJaWYoJHByb3RvdHlwZSA9fiBtL1RSQUNFX0VWRU5UXCgoLio/KSwvKSB7CisJCSR0cmFjZXBvaW50bmFtZSA9ICQxOworCX0KKwlpZigkcHJvdG90eXBlID1+IG0vVFBfUFJPVE9cKCguKj8pXCkvKSB7CisJCSR0cmFjZXBvaW50YXJncyA9ICQxOworCX0KKwlpZiAoKCR0cmFjZXBvaW50bmFtZSBlcSAwKSB8fCAoJHRyYWNlcG9pbnRhcmdzIGVxIDApKSB7CisJCXByaW50IFNUREVSUiAiV2FybmluZygke2ZpbGV9OiQuKTogVW5yZWNvZ25pemVkIHRyYWNlcG9pbnQgZm9ybWF0OiBcbiIuCisJCQkgICAgICIkcHJvdG90eXBlXG4iOworCX0gZWxzZSB7CisJCSRwcm90b3R5cGUgPSAic3RhdGljIGlubGluZSB2b2lkIHRyYWNlXyR0cmFjZXBvaW50bmFtZSgkdHJhY2Vwb2ludGFyZ3MpIjsKKwl9Cit9CisKIHN1YiBzeXNjYWxsX211bmdlKCkgewogCW15ICR2b2lkID0gMDsKIApAQCAtMTg4Miw2ICsxOTAxLDkgQEAKIAlpZiAoJHByb3RvdHlwZSA9fiAvU1lTQ0FMTF9ERUZJTkUvKSB7CiAJCXN5c2NhbGxfbXVuZ2UoKTsKIAl9CisJaWYgKCRwcm90b3R5cGUgPX4gL1RSQUNFX0VWRU5ULykgeworCQl0cmFjZXBvaW50X211bmdlKCRmaWxlKTsKKwl9CiAJZHVtcF9mdW5jdGlvbigkcHJvdG90eXBlLCAkZmlsZSk7CiAJcmVzZXRfc3RhdGUoKTsKICAgICB9CmRpZmYgLS1naXQgYS9zY3JpcHRzL3JlY29yZG1jb3VudC5wbCBiL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsCmluZGV4IDQwOTU5NmUuLjBmYWU3ZGEgMTAwNzU1Ci0tLSBhL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsCisrKyBiL3NjcmlwdHMvcmVjb3JkbWNvdW50LnBsCkBAIC0yNiw3ICsyNiw3IEBACiAjIHdoaWNoIHdpbGwgYWxzbyBiZSB0aGUgbG9jYXRpb24gb2YgdGhhdCBzZWN0aW9uIGFmdGVyIGZpbmFsIGxpbmsuCiAjIGUuZy4KICMKLSMgIC5zZWN0aW9uICIudGV4dC5zY2hlZCIKKyMgIC5zZWN0aW9uICIuc2NoZWQudGV4dCIsICJheCIKICMgIC5nbG9ibCBteV9mdW5jCiAjICBteV9mdW5jOgogIyAgICAgICAgWy4uLl0KQEAgLTM5LDcgKzM5LDcgQEAKICMgICAgICAgIFsuLi5dCiAjCiAjIEJvdGggcmVsb2NhdGlvbiBvZmZzZXRzIGZvciB0aGUgbWNvdW50cyBpbiB0aGUgYWJvdmUgZXhhbXBsZSB3aWxsIGJlCi0jIG9mZnNldCBmcm9tIC50ZXh0LnNjaGVkLiBJZiB3ZSBtYWtlIGFub3RoZXIgZmlsZSBjYWxsZWQgdG1wLnMgd2l0aDoKKyMgb2Zmc2V0IGZyb20gLnNjaGVkLnRleHQuIElmIHdlIG1ha2UgYW5vdGhlciBmaWxlIGNhbGxlZCB0bXAucyB3aXRoOgogIwogIyAgLnNlY3Rpb24gX19tY291bnRfbG9jCiAjICAucXVhZCAgbXlfZnVuYyArIDB4NQpAQCAtNTEsNyArNTEsNyBAQAogIyBCdXQgdGhpcyBnZXRzIGhhcmQgaWYgbXlfZnVuYyBpcyBub3QgZ2xvYmwgKGEgc3RhdGljIGZ1bmN0aW9uKS4KICMgSW4gc3VjaCBhIGNhc2Ugd2UgaGF2ZToKICMKLSMgIC5zZWN0aW9uICIudGV4dC5zY2hlZCIKKyMgIC5zZWN0aW9uICIuc2NoZWQudGV4dCIsICJheCIKICMgIG15X2Z1bmM6CiAjICAgICAgICBbLi4uXQogIyAgICAgICAgY2FsbCBtY291bnQgIChvZmZzZXQ6IDB4NSkKZGlmZiAtLWdpdCBhL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2ZzLmMgYi9zZWN1cml0eS9pbnRlZ3JpdHkvaW1hL2ltYV9mcy5jCmluZGV4IGZmYmUyNTkuLjUxMDE4NmYgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L2ludGVncml0eS9pbWEvaW1hX2ZzLmMKKysrIGIvc2VjdXJpdHkvaW50ZWdyaXR5L2ltYS9pbWFfZnMuYwpAQCAtODQsOCArODQsOCBAQAogCSAqIGFnYWluc3QgY29uY3VycmVudCBsaXN0LWV4dGVuc2lvbgogCSAqLwogCXJjdV9yZWFkX2xvY2soKTsKLQlxZSA9IGxpc3RfZW50cnkocmN1X2RlcmVmZXJlbmNlKHFlLT5sYXRlci5uZXh0KSwKLQkJCXN0cnVjdCBpbWFfcXVldWVfZW50cnksIGxhdGVyKTsKKwlxZSA9IGxpc3RfZW50cnlfcmN1KHFlLT5sYXRlci5uZXh0LAorCQkJICAgIHN0cnVjdCBpbWFfcXVldWVfZW50cnksIGxhdGVyKTsKIAlyY3VfcmVhZF91bmxvY2soKTsKIAkoKnBvcykrKzsKIApkaWZmIC0tZ2l0IGEvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jIGIvc2VjdXJpdHkvc21hY2svc21hY2tmcy5jCmluZGV4IGUwM2E3ZTEuLjExZDJjYjEgMTAwNjQ0Ci0tLSBhL3NlY3VyaXR5L3NtYWNrL3NtYWNrZnMuYworKysgYi9zZWN1cml0eS9zbWFjay9zbWFja2ZzLmMKQEAgLTczNCw4ICs3MzQsOCBAQAogCQlyZXR1cm47CiAJfQogCi0JbSA9IGxpc3RfZW50cnkocmN1X2RlcmVmZXJlbmNlKHNta19uZXRsYmxhZGRyX2xpc3QubmV4dCksCi0JCQkgc3RydWN0IHNta19uZXRsYmxhZGRyLCBsaXN0KTsKKwltID0gbGlzdF9lbnRyeV9yY3Uoc21rX25ldGxibGFkZHJfbGlzdC5uZXh0LAorCQkJICAgc3RydWN0IHNta19uZXRsYmxhZGRyLCBsaXN0KTsKIAogCS8qIHRoZSBjb21wYXJpc29uICc+JyBpcyBhIGJpdCBoYWNreSwgYnV0IHdvcmtzICovCiAJaWYgKG5ldy0+c21rX21hc2suc19hZGRyID4gbS0+c21rX21hc2suc19hZGRyKSB7CkBAIC03NDgsOCArNzQ4LDggQEAKIAkJCWxpc3RfYWRkX3JjdSgmbmV3LT5saXN0LCAmbS0+bGlzdCk7CiAJCQlyZXR1cm47CiAJCX0KLQkJbV9uZXh0ID0gbGlzdF9lbnRyeShyY3VfZGVyZWZlcmVuY2UobS0+bGlzdC5uZXh0KSwKLQkJCQkgc3RydWN0IHNta19uZXRsYmxhZGRyLCBsaXN0KTsKKwkJbV9uZXh0ID0gbGlzdF9lbnRyeV9yY3UobS0+bGlzdC5uZXh0LAorCQkJCQlzdHJ1Y3Qgc21rX25ldGxibGFkZHIsIGxpc3QpOwogCQlpZiAobmV3LT5zbWtfbWFzay5zX2FkZHIgPiBtX25leHQtPnNta19tYXNrLnNfYWRkcikgewogCQkJbGlzdF9hZGRfcmN1KCZuZXctPmxpc3QsICZtLT5saXN0KTsKIAkJCXJldHVybjsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvLmdpdGlnbm9yZSBiL3Rvb2xzL3BlcmYvLmdpdGlnbm9yZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjlhNzU5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi8uZ2l0aWdub3JlCkBAIC0wLDAgKzEsMTYgQEAKK1BFUkYtQlVJTEQtT1BUSU9OUworUEVSRi1DRkxBR1MKK1BFUkYtR1VJLVZBUlMKK1BFUkYtVkVSU0lPTi1GSUxFCitwZXJmCitwZXJmLWhlbHAKK3BlcmYtcmVjb3JkCitwZXJmLXJlcG9ydAorcGVyZi1zdGF0CitwZXJmLXRvcAorcGVyZiouMQorcGVyZioueG1sCitjb21tb24tY21kcy5oCit0YWdzCitUQUdTCitjc2NvcGUqCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vTWFrZWZpbGUgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1NzE5MgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9NYWtlZmlsZQpAQCAtMCwwICsxLDMwMCBAQAorTUFOMV9UWFQ9IFwKKwkkKGZpbHRlci1vdXQgJChhZGRzdWZmaXggLnR4dCwgJChBUlRJQ0xFUykgJChTUF9BUlRJQ0xFUykpLCBcCisJCSQod2lsZGNhcmQgcGVyZi0qLnR4dCkpIFwKKwlwZXJmLnR4dAorTUFONV9UWFQ9CitNQU43X1RYVD0KKworTUFOX1RYVCA9ICQoTUFOMV9UWFQpICQoTUFONV9UWFQpICQoTUFON19UWFQpCitNQU5fWE1MPSQocGF0c3Vic3QgJS50eHQsJS54bWwsJChNQU5fVFhUKSkKK01BTl9IVE1MPSQocGF0c3Vic3QgJS50eHQsJS5odG1sLCQoTUFOX1RYVCkpCisKK0RPQ19IVE1MPSQoTUFOX0hUTUwpCisKK0FSVElDTEVTID0KKyMgd2l0aCB0aGVpciBvd24gZm9ybWF0dGluZyBydWxlcy4KK1NQX0FSVElDTEVTID0KK0FQSV9ET0NTID0gJChwYXRzdWJzdCAlLnR4dCwlLCQoZmlsdGVyLW91dCB0ZWNobmljYWwvYXBpLWluZGV4LXNrZWwudHh0IHRlY2huaWNhbC9hcGktaW5kZXgudHh0LCAkKHdpbGRjYXJkIHRlY2huaWNhbC9hcGktKi50eHQpKSkKK1NQX0FSVElDTEVTICs9ICQoQVBJX0RPQ1MpCitTUF9BUlRJQ0xFUyArPSB0ZWNobmljYWwvYXBpLWluZGV4CisKK0RPQ19IVE1MICs9ICQocGF0c3Vic3QgJSwlLmh0bWwsJChBUlRJQ0xFUykgJChTUF9BUlRJQ0xFUykpCisKK0RPQ19NQU4xPSQocGF0c3Vic3QgJS50eHQsJS4xLCQoTUFOMV9UWFQpKQorRE9DX01BTjU9JChwYXRzdWJzdCAlLnR4dCwlLjUsJChNQU41X1RYVCkpCitET0NfTUFONz0kKHBhdHN1YnN0ICUudHh0LCUuNywkKE1BTjdfVFhUKSkKKworcHJlZml4Pz0kKEhPTUUpCitiaW5kaXI/PSQocHJlZml4KS9iaW4KK2h0bWxkaXI/PSQocHJlZml4KS9zaGFyZS9kb2MvcGVyZi1kb2MKK3BkZmRpcj89JChwcmVmaXgpL3NoYXJlL2RvYy9wZXJmLWRvYworbWFuZGlyPz0kKHByZWZpeCkvc2hhcmUvbWFuCittYW4xZGlyPSQobWFuZGlyKS9tYW4xCittYW41ZGlyPSQobWFuZGlyKS9tYW41CittYW43ZGlyPSQobWFuZGlyKS9tYW43CisjIERFU1RESVI9CisKK0FTQ0lJRE9DPWFzY2lpZG9jCitBU0NJSURPQ19FWFRSQSA9CitNQU5QQUdFX1hTTCA9IG1hbnBhZ2Utbm9ybWFsLnhzbAorWE1MVE9fRVhUUkEgPQorSU5TVEFMTD89aW5zdGFsbAorUk0gPz0gcm0gLWYKK0RPQ19SRUYgPSBvcmlnaW4vbWFuCitIVE1MX1JFRiA9IG9yaWdpbi9odG1sCisKK2luZm9kaXI/PSQocHJlZml4KS9zaGFyZS9pbmZvCitNQUtFSU5GTz1tYWtlaW5mbworSU5TVEFMTF9JTkZPPWluc3RhbGwtaW5mbworRE9DQk9PSzJYX1RFWEk9ZG9jYm9vazJ4LXRleGkKK0RCTEFURVg9ZGJsYXRleAoraWZuZGVmIFBFUkxfUEFUSAorCVBFUkxfUEFUSCA9IC91c3IvYmluL3BlcmwKK2VuZGlmCisKKy1pbmNsdWRlIC4uL2NvbmZpZy5tYWsuYXV0b2dlbgorLWluY2x1ZGUgLi4vY29uZmlnLm1haworCisjCisjIEZvciBhc2NpaWRvYyAuLi4KKyMJLTcuMS4yLAlubyBleHRyYSBzZXR0aW5ncyBhcmUgbmVlZGVkLgorIwk4LjAtLAlzZXQgQVNDSUlET0M4LgorIworCisjCisjIEZvciBkb2Nib29rLXhzbCAuLi4KKyMJLTEuNjguMSwJc2V0IEFTQ0lJRE9DX05PX1JPRkY/IChiYXNlZCBvbiBjaGFuZ2Vsb2cgZnJvbSAxLjczLjApCisjCTEuNjkuMCwJCW5vIGV4dHJhIHNldHRpbmdzIGFyZSBuZWVkZWQ/CisjCTEuNjkuMS0xLjcxLjAsCXNldCBET0NCT09LX1NVUFBSRVNTX1NQPworIwkxLjcxLjEsCQlubyBleHRyYSBzZXR0aW5ncyBhcmUgbmVlZGVkPworIwkxLjcyLjAsCQlzZXQgRE9DQk9PS19YU0xfMTcyLgorIwkxLjczLjAtLAlzZXQgQVNDSUlET0NfTk9fUk9GRgorIworCisjCisjIElmIHlvdSBoYWQgYmVlbiB1c2luZyBET0NCT09LX1hTTF8xNzIgaW4gYW4gYXR0ZW1wdCB0byBnZXQgcmlkCisjIG9mICd0aGUgIi5mdCBDIiBwcm9ibGVtJyBpbiB5b3VyIGdlbmVyYXRlZCBtYW5wYWdlcywgYW5kIHlvdQorIyBpbnN0ZWFkIGVuZGVkIHVwIHdpdGggd2VpcmQgY2hhcmFjdGVycyBhcm91bmQgY2FsbG91dHMsIHRyeQorIyB1c2luZyBBU0NJSURPQ19OT19ST0ZGIGluc3RlYWQgKGl0IHdvcmtzIGZpbmUgd2l0aCBBU0NJSURPQzgpLgorIworCitpZmRlZiBBU0NJSURPQzgKK0FTQ0lJRE9DX0VYVFJBICs9IC1hIGFzY2lpZG9jN2NvbXBhdGlibGUKK2VuZGlmCitpZmRlZiBET0NCT09LX1hTTF8xNzIKK0FTQ0lJRE9DX0VYVFJBICs9IC1hIHBlcmYtYXNjaWlkb2Mtbm8tcm9mZgorTUFOUEFHRV9YU0wgPSBtYW5wYWdlLTEuNzIueHNsCitlbHNlCisJaWZkZWYgQVNDSUlET0NfTk9fUk9GRgorCSMgZG9jYm9vay14c2wgYWZ0ZXIgMS43MiBuZWVkcyB0aGUgcmVndWxhciBYU0wsIGJ1dCB3aWxsIG5vdAorCSMgcGFzcy10aHJ1IHJhdyByb2ZmIGNvZGVzIGZyb20gYXNjaWlkb2MuY29uZiwgc28gdHVybiB0aGVtIG9mZi4KKwlBU0NJSURPQ19FWFRSQSArPSAtYSBwZXJmLWFzY2lpZG9jLW5vLXJvZmYKKwllbmRpZgorZW5kaWYKK2lmZGVmIE1BTl9CT0xEX0xJVEVSQUwKK1hNTFRPX0VYVFJBICs9IC1tIG1hbnBhZ2UtYm9sZC1saXRlcmFsLnhzbAorZW5kaWYKK2lmZGVmIERPQ0JPT0tfU1VQUFJFU1NfU1AKK1hNTFRPX0VYVFJBICs9IC1tIG1hbnBhZ2Utc3VwcHJlc3Mtc3AueHNsCitlbmRpZgorCitTSEVMTF9QQVRIID89ICQoU0hFTEwpCisjIFNoZWxsIHF1b3RlOworU0hFTExfUEFUSF9TUSA9ICQoc3Vic3QgJywnXCcnLCQoU0hFTExfUEFUSCkpCisKKyMKKyMgUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSBpcyBhIG1pbm9yIGJ1ZyBpbiBhc2NpaWRvYy4KKyMgVGhlIHZlcnNpb24gYWZ0ZXIgNi4wLjMgX3dpbGxfIGluY2x1ZGUgdGhlIHBhdGNoIGZvdW5kIGhlcmU6CisjICAgaHR0cDovL21hcmMudGhlYWltc2dyb3VwLmNvbS8/bD1wZXJmJm09MTExNTU4NzU3MjAyMjQzJnc9MgorIworIyBVbnRpbCB0aGF0IHZlcnNpb24gaXMgcmVsZWFzZWQgeW91IG1heSBoYXZlIHRvIGFwcGx5IHRoZSBwYXRjaAorIyB5b3Vyc2VsZiAtIHllcywgYWxsIDYgY2hhcmFjdGVycyBvZiBpdCEKKyMKKworUVVJRVRfU1VCRElSMCAgPSArJChNQUtFKSAtQyAjIHNwYWNlIHRvIHNlcGFyYXRlIC1DIGFuZCBzdWJkaXIKK1FVSUVUX1NVQkRJUjEgID0KKworaWZuZXEgKCQoZmluZHN0cmluZyAkKE1BS0VGTEFHUyksdyksdykKK1BSSU5UX0RJUiA9IC0tbm8tcHJpbnQtZGlyZWN0b3J5CitlbHNlICMgIm1ha2UgLXciCitOT19TVUJESVIgPSA6CitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nICQoTUFLRUZMQUdTKSxzKSxzKQoraWZuZGVmIFYKKwlRVUlFVF9BU0NJSURPQwk9IEBlY2hvICcgICAnIEFTQ0lJRE9DICRAOworCVFVSUVUX1hNTFRPCT0gQGVjaG8gJyAgICcgWE1MVE8gJEA7CisJUVVJRVRfREIyVEVYSQk9IEBlY2hvICcgICAnIERCMlRFWEkgJEA7CisJUVVJRVRfTUFLRUlORk8JPSBAZWNobyAnICAgJyBNQUtFSU5GTyAkQDsKKwlRVUlFVF9EQkxBVEVYCT0gQGVjaG8gJyAgICcgREJMQVRFWCAkQDsKKwlRVUlFVF9YU0xUUFJPQwk9IEBlY2hvICcgICAnIFhTTFRQUk9DICRAOworCVFVSUVUX0dFTgk9IEBlY2hvICcgICAnIEdFTiAkQDsKKwlRVUlFVF9TVERFUlIJPSAyPiAvZGV2L251bGwKKwlRVUlFVF9TVUJESVIwCT0gK0BzdWJkaXI9CisJUVVJRVRfU1VCRElSMQk9IDskKE5PX1NVQkRJUikgZWNobyAnICAgJyBTVUJESVIgJCRzdWJkaXI7IFwKKwkJCSAgJChNQUtFKSAkKFBSSU5UX0RJUikgLUMgJCRzdWJkaXIKKwlleHBvcnQgVgorZW5kaWYKK2VuZGlmCisKK2FsbDogaHRtbCBtYW4KKworaHRtbDogJChET0NfSFRNTCkKKworJChET0NfSFRNTCkgJChET0NfTUFOMSkgJChET0NfTUFONSkgJChET0NfTUFONyk6IGFzY2lpZG9jLmNvbmYKKworbWFuOiBtYW4xIG1hbjUgbWFuNworbWFuMTogJChET0NfTUFOMSkKK21hbjU6ICQoRE9DX01BTjUpCittYW43OiAkKERPQ19NQU43KQorCitpbmZvOiBwZXJmLmluZm8gcGVyZm1hbi5pbmZvCisKK3BkZjogdXNlci1tYW51YWwucGRmCisKK2luc3RhbGw6IGluc3RhbGwtbWFuCisKK2luc3RhbGwtbWFuOiBtYW4KKwkkKElOU1RBTEwpIC1kIC1tIDc1NSAkKERFU1RESVIpJChtYW4xZGlyKQorIwkkKElOU1RBTEwpIC1kIC1tIDc1NSAkKERFU1RESVIpJChtYW41ZGlyKQorIwkkKElOU1RBTEwpIC1kIC1tIDc1NSAkKERFU1RESVIpJChtYW43ZGlyKQorCSQoSU5TVEFMTCkgLW0gNjQ0ICQoRE9DX01BTjEpICQoREVTVERJUikkKG1hbjFkaXIpCisjCSQoSU5TVEFMTCkgLW0gNjQ0ICQoRE9DX01BTjUpICQoREVTVERJUikkKG1hbjVkaXIpCisjCSQoSU5TVEFMTCkgLW0gNjQ0ICQoRE9DX01BTjcpICQoREVTVERJUikkKG1hbjdkaXIpCisKK2luc3RhbGwtaW5mbzogaW5mbworCSQoSU5TVEFMTCkgLWQgLW0gNzU1ICQoREVTVERJUikkKGluZm9kaXIpCisJJChJTlNUQUxMKSAtbSA2NDQgcGVyZi5pbmZvIHBlcmZtYW4uaW5mbyAkKERFU1RESVIpJChpbmZvZGlyKQorCWlmIHRlc3QgLXIgJChERVNURElSKSQoaW5mb2RpcikvZGlyOyB0aGVuIFwKKwkgICQoSU5TVEFMTF9JTkZPKSAtLWluZm8tZGlyPSQoREVTVERJUikkKGluZm9kaXIpIHBlcmYuaW5mbyA7XAorCSAgJChJTlNUQUxMX0lORk8pIC0taW5mby1kaXI9JChERVNURElSKSQoaW5mb2RpcikgcGVyZm1hbi5pbmZvIDtcCisJZWxzZSBcCisJICBlY2hvICJObyBkaXJlY3RvcnkgZm91bmQgaW4gJChERVNURElSKSQoaW5mb2RpcikiID4mMiA7IFwKKwlmaQorCitpbnN0YWxsLXBkZjogcGRmCisJJChJTlNUQUxMKSAtZCAtbSA3NTUgJChERVNURElSKSQocGRmZGlyKQorCSQoSU5TVEFMTCkgLW0gNjQ0IHVzZXItbWFudWFsLnBkZiAkKERFU1RESVIpJChwZGZkaXIpCisKK2luc3RhbGwtaHRtbDogaHRtbAorCSckKFNIRUxMX1BBVEhfU1EpJyAuL2luc3RhbGwtd2ViZG9jLnNoICQoREVTVERJUikkKGh0bWxkaXIpCisKKy4uL1BFUkYtVkVSU0lPTi1GSUxFOiAuRk9SQ0UtUEVSRi1WRVJTSU9OLUZJTEUKKwkkKFFVSUVUX1NVQkRJUjApLi4vICQoUVVJRVRfU1VCRElSMSkgUEVSRi1WRVJTSU9OLUZJTEUKKworLWluY2x1ZGUgLi4vUEVSRi1WRVJTSU9OLUZJTEUKKworIworIyBEZXRlcm1pbmUgImluY2x1ZGU6OiIgZmlsZSByZWZlcmVuY2VzIGluIGFzY2lpZG9jIGZpbGVzLgorIworZG9jLmRlcCA6ICQod2lsZGNhcmQgKi50eHQpIGJ1aWxkLWRvY2RlcC5wZXJsCisJJChRVUlFVF9HRU4pJChSTSkgJEArICRAICYmIFwKKwkkKFBFUkxfUEFUSCkgLi9idWlsZC1kb2NkZXAucGVybCA+JEArICQoUVVJRVRfU1RERVJSKSAmJiBcCisJbXYgJEArICRACisKKy1pbmNsdWRlIGRvYy5kZXAKKworY21kc190eHQgPSBjbWRzLWFuY2lsbGFyeWludGVycm9nYXRvcnMudHh0IFwKKwljbWRzLWFuY2lsbGFyeW1hbmlwdWxhdG9ycy50eHQgXAorCWNtZHMtbWFpbnBvcmNlbGFpbi50eHQgXAorCWNtZHMtcGx1bWJpbmdpbnRlcnJvZ2F0b3JzLnR4dCBcCisJY21kcy1wbHVtYmluZ21hbmlwdWxhdG9ycy50eHQgXAorCWNtZHMtc3luY2hpbmdyZXBvc2l0b3JpZXMudHh0IFwKKwljbWRzLXN5bmNoZWxwZXJzLnR4dCBcCisJY21kcy1wdXJlaGVscGVycy50eHQgXAorCWNtZHMtZm9yZWlnbnNjbWludGVyZmFjZS50eHQKKworJChjbWRzX3R4dCk6IGNtZC1saXN0Lm1hZGUKKworY21kLWxpc3QubWFkZTogY21kLWxpc3QucGVybCAuLi9jb21tYW5kLWxpc3QudHh0ICQoTUFOMV9UWFQpCisJJChRVUlFVF9HRU4pJChSTSkgJEAgJiYgXAorCSQoUEVSTF9QQVRIKSAuL2NtZC1saXN0LnBlcmwgLi4vY29tbWFuZC1saXN0LnR4dCAkKFFVSUVUX1NUREVSUikgJiYgXAorCWRhdGUgPiRACisKK2NsZWFuOgorCSQoUk0pICoueG1sICoueG1sKyAqLmh0bWwgKi5odG1sKyAqLjEgKi41ICouNworCSQoUk0pICoudGV4aSAqLnRleGkrICoudGV4aSsrIHBlcmYuaW5mbyBwZXJmbWFuLmluZm8KKwkkKFJNKSBob3d0by1pbmRleC50eHQgaG93dG8vKi5odG1sIGRvYy5kZXAKKwkkKFJNKSB0ZWNobmljYWwvYXBpLSouaHRtbCB0ZWNobmljYWwvYXBpLWluZGV4LnR4dAorCSQoUk0pICQoY21kc190eHQpICoubWFkZQorCiskKE1BTl9IVE1MKTogJS5odG1sIDogJS50eHQKKwkkKFFVSUVUX0FTQ0lJRE9DKSQoUk0pICRAKyAkQCAmJiBcCisJJChBU0NJSURPQykgLWIgeGh0bWwxMSAtZCBtYW5wYWdlIC1mIGFzY2lpZG9jLmNvbmYgXAorCQkkKEFTQ0lJRE9DX0VYVFJBKSAtYXBlcmZfdmVyc2lvbj0kKFBFUkZfVkVSU0lPTikgLW8gJEArICQ8ICYmIFwKKwltdiAkQCsgJEAKKworJS4xICUuNSAlLjcgOiAlLnhtbAorCSQoUVVJRVRfWE1MVE8pJChSTSkgJEAgJiYgXAorCXhtbHRvIC1tICQoTUFOUEFHRV9YU0wpICQoWE1MVE9fRVhUUkEpIG1hbiAkPAorCislLnhtbCA6ICUudHh0CisJJChRVUlFVF9BU0NJSURPQykkKFJNKSAkQCsgJEAgJiYgXAorCSQoQVNDSUlET0MpIC1iIGRvY2Jvb2sgLWQgbWFucGFnZSAtZiBhc2NpaWRvYy5jb25mIFwKKwkJJChBU0NJSURPQ19FWFRSQSkgLWFwZXJmX3ZlcnNpb249JChQRVJGX1ZFUlNJT04pIC1vICRAKyAkPCAmJiBcCisJbXYgJEArICRACisKK1hTTFQgPSBkb2Nib29rLnhzbAorWFNMVE9QVFMgPSAtLXhpbmNsdWRlIC0tc3RyaW5ncGFyYW0gaHRtbC5zdHlsZXNoZWV0IGRvY2Jvb2steHNsLmNzcworCit1c2VyLW1hbnVhbC5odG1sOiB1c2VyLW1hbnVhbC54bWwKKwkkKFFVSUVUX1hTTFRQUk9DKXhzbHRwcm9jICQoWFNMVE9QVFMpIC1vICRAICQoWFNMVCkgJDwKKworcGVyZi5pbmZvOiB1c2VyLW1hbnVhbC50ZXhpCisJJChRVUlFVF9NQUtFSU5GTykkKE1BS0VJTkZPKSAtLW5vLXNwbGl0IC1vICRAIHVzZXItbWFudWFsLnRleGkKKwordXNlci1tYW51YWwudGV4aTogdXNlci1tYW51YWwueG1sCisJJChRVUlFVF9EQjJURVhJKSQoUk0pICRAKyAkQCAmJiBcCisJJChET0NCT09LMlhfVEVYSSkgdXNlci1tYW51YWwueG1sIC0tZW5jb2Rpbmc9VVRGLTggLS10by1zdGRvdXQgPiRAKysgJiYgXAorCSQoUEVSTF9QQVRIKSBmaXgtdGV4aS5wZXJsIDwkQCsrID4kQCsgJiYgXAorCXJtICRAKysgJiYgXAorCW12ICRAKyAkQAorCit1c2VyLW1hbnVhbC5wZGY6IHVzZXItbWFudWFsLnhtbAorCSQoUVVJRVRfREJMQVRFWCkkKFJNKSAkQCsgJEAgJiYgXAorCSQoREJMQVRFWCkgLW8gJEArIC1wIC9ldGMvYXNjaWlkb2MvZGJsYXRleC9hc2NpaWRvYy1kYmxhdGV4LnhzbCAtcyAvZXRjL2FzY2lpZG9jL2RibGF0ZXgvYXNjaWlkb2MtZGJsYXRleC5zdHkgJDwgJiYgXAorCW12ICRAKyAkQAorCitwZXJmbWFuLnRleGk6ICQoTUFOX1hNTCkgY2F0LXRleGkucGVybAorCSQoUVVJRVRfREIyVEVYSSkkKFJNKSAkQCsgJEAgJiYgXAorCSgkKGZvcmVhY2ggeG1sLCQoTUFOX1hNTCksJChET0NCT09LMlhfVEVYSSkgLS1lbmNvZGluZz1VVEYtOCBcCisJCS0tdG8tc3Rkb3V0ICQoeG1sKSAmJikgdHJ1ZSkgPiAkQCsrICYmIFwKKwkkKFBFUkxfUEFUSCkgY2F0LXRleGkucGVybCAkQCA8JEArKyA+JEArICYmIFwKKwlybSAkQCsrICYmIFwKKwltdiAkQCsgJEAKKworcGVyZm1hbi5pbmZvOiBwZXJmbWFuLnRleGkKKwkkKFFVSUVUX01BS0VJTkZPKSQoTUFLRUlORk8pIC0tbm8tc3BsaXQgLS1uby12YWxpZGF0ZSAkKi50ZXhpCisKKyQocGF0c3Vic3QgJS50eHQsJS50ZXhpLCQoTUFOX1RYVCkpOiAlLnRleGkgOiAlLnhtbAorCSQoUVVJRVRfREIyVEVYSSkkKFJNKSAkQCsgJEAgJiYgXAorCSQoRE9DQk9PSzJYX1RFWEkpIC0tdG8tc3Rkb3V0ICQqLnhtbCA+JEArICYmIFwKKwltdiAkQCsgJEAKKworaG93dG8taW5kZXgudHh0OiBob3d0by1pbmRleC5zaCAkKHdpbGRjYXJkIGhvd3RvLyoudHh0KQorCSQoUVVJRVRfR0VOKSQoUk0pICRAKyAkQCAmJiBcCisJJyQoU0hFTExfUEFUSF9TUSknIC4vaG93dG8taW5kZXguc2ggJCh3aWxkY2FyZCBob3d0by8qLnR4dCkgPiRAKyAmJiBcCisJbXYgJEArICRACisKKyQocGF0c3Vic3QgJSwlLmh0bWwsJChBUlRJQ0xFUykpIDogJS5odG1sIDogJS50eHQKKwkkKFFVSUVUX0FTQ0lJRE9DKSQoQVNDSUlET0MpIC1iIHhodG1sMTEgJCoudHh0CisKK1dFQkRPQ19ERVNUID0gL3B1Yi9zb2Z0d2FyZS90b29scy9wZXJmL2RvY3MKKworJChwYXRzdWJzdCAlLnR4dCwlLmh0bWwsJCh3aWxkY2FyZCBob3d0by8qLnR4dCkpOiAlLmh0bWwgOiAlLnR4dAorCSQoUVVJRVRfQVNDSUlET0MpJChSTSkgJEArICRAICYmIFwKKwlzZWQgLWUgJzEsL14kJC9kJyAkPCB8ICQoQVNDSUlET0MpIC1iIHhodG1sMTEgLSA+JEArICYmIFwKKwltdiAkQCsgJEAKKworaW5zdGFsbC13ZWJkb2MgOiBodG1sCisJJyQoU0hFTExfUEFUSF9TUSknIC4vaW5zdGFsbC13ZWJkb2Muc2ggJChXRUJET0NfREVTVCkKKworcXVpY2staW5zdGFsbDogcXVpY2staW5zdGFsbC1tYW4KKworcXVpY2staW5zdGFsbC1tYW46CisJJyQoU0hFTExfUEFUSF9TUSknIC4vaW5zdGFsbC1kb2MtcXVpY2suc2ggJChET0NfUkVGKSAkKERFU1RESVIpJChtYW5kaXIpCisKK3F1aWNrLWluc3RhbGwtaHRtbDoKKwknJChTSEVMTF9QQVRIX1NRKScgLi9pbnN0YWxsLWRvYy1xdWljay5zaCAkKEhUTUxfUkVGKSAkKERFU1RESVIpJChodG1sZGlyKQorCisuUEhPTlk6IC5GT1JDRS1QRVJGLVZFUlNJT04tRklMRQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vYXNjaWlkb2MuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTZiMjNhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL2FzY2lpZG9jLmNvbmYKQEAgLTAsMCArMSw5MSBAQAorIyMgbGlua3BlcmY6IG1hY3JvCisjCisjIFVzYWdlOiBsaW5rcGVyZjpjb21tYW5kW21hbnBhZ2Utc2VjdGlvbl0KKyMKKyMgTm90ZSwgezB9IGlzIHRoZSBtYW5wYWdlIHNlY3Rpb24sIHdoaWxlIHt0YXJnZXR9IGlzIHRoZSBjb21tYW5kLgorIworIyBTaG93IFBFUkYgbGluayBhczogPGNvbW1hbmQ+KDxzZWN0aW9uPik7IGlmIHNlY3Rpb24gaXMgZGVmaW5lZCwgZWxzZSBqdXN0IHNob3cKKyMgdGhlIGNvbW1hbmQuCisKK1ttYWNyb3NdCisoP3N1KVtcXF0/KD9QPG5hbWU+bGlua3BlcmYpOig/UDx0YXJnZXQ+XFMqPylcWyg/UDxhdHRybGlzdD4uKj8pXF09CisKK1thdHRyaWJ1dGVzXQorYXN0ZXJpc2s9JiM0MjsKK3BsdXM9JiM0MzsKK2NhcmV0PSYjOTQ7CitzdGFydHNiPSYjOTE7CitlbmRzYj0mIzkzOwordGlsZGU9JiMxMjY7CisKK2lmZGVmOjpiYWNrZW5kLWRvY2Jvb2tbXQorW2xpbmtwZXJmLWlubGluZW1hY3JvXQorezAle3RhcmdldH19Cit7MCM8Y2l0ZXJlZmVudHJ5Pn0KK3swIzxyZWZlbnRyeXRpdGxlPnt0YXJnZXR9PC9yZWZlbnRyeXRpdGxlPjxtYW52b2xudW0+ezB9PC9tYW52b2xudW0+fQorezAjPC9jaXRlcmVmZW50cnk+fQorZW5kaWY6OmJhY2tlbmQtZG9jYm9va1tdCisKK2lmZGVmOjpiYWNrZW5kLWRvY2Jvb2tbXQoraWZuZGVmOjpwZXJmLWFzY2lpZG9jLW5vLXJvZmZbXQorIyAidW5icmVhayIgZG9jYm9vay14c2wgdjEuNjggZm9yIG1hbnBhZ2VzLiB2MS42OSB3b3JrcyB3aXRoIG9yIHdpdGhvdXQgdGhpcy4KKyMgdjEuNzIgYnJlYWtzIHdpdGggdGhpcyBiZWNhdXNlIGl0IHJlcGxhY2VzIGRvdHMgbm90IGluIHJvZmYgcmVxdWVzdHMuCitbbGlzdGluZ2Jsb2NrXQorPGV4YW1wbGU+PHRpdGxlPnt0aXRsZX08L3RpdGxlPgorPGxpdGVyYWxsYXlvdXQ+CitpZmRlZjo6ZG9jdHlwZS1tYW5wYWdlW10KKyYjMTA7LmZ0IEMmIzEwOworZW5kaWY6OmRvY3R5cGUtbWFucGFnZVtdCit8CitpZmRlZjo6ZG9jdHlwZS1tYW5wYWdlW10KKyYjMTA7LmZ0JiMxMDsKK2VuZGlmOjpkb2N0eXBlLW1hbnBhZ2VbXQorPC9saXRlcmFsbGF5b3V0Pgore3RpdGxlI308L2V4YW1wbGU+CitlbmRpZjo6cGVyZi1hc2NpaWRvYy1uby1yb2ZmW10KKworaWZkZWY6OnBlcmYtYXNjaWlkb2Mtbm8tcm9mZltdCitpZmRlZjo6ZG9jdHlwZS1tYW5wYWdlW10KKyMgVGhlIGZvbGxvd2luZyB0d28gc21hbGwgd29ya2Fyb3VuZHMgaW5zZXJ0IGEgc2ltcGxlIHBhcmFncmFwaCBhZnRlciBzY3JlZW4KK1tsaXN0aW5nYmxvY2tdCis8ZXhhbXBsZT48dGl0bGU+e3RpdGxlfTwvdGl0bGU+Cis8bGl0ZXJhbGxheW91dD4KK3wKKzwvbGl0ZXJhbGxheW91dD48c2ltcGFyYT48L3NpbXBhcmE+Cit7dGl0bGUjfTwvZXhhbXBsZT4KKworW3ZlcnNlYmxvY2tdCis8Zm9ybWFscGFyYXtpZD8gaWQ9IntpZH0ifT48dGl0bGU+e3RpdGxlfTwvdGl0bGU+PHBhcmE+Cit7dGl0bGUlfTxsaXRlcmFsbGF5b3V0e2lkPyBpZD0ie2lkfSJ9Pgore3RpdGxlI308bGl0ZXJhbGxheW91dD4KK3wKKzwvbGl0ZXJhbGxheW91dD4KK3t0aXRsZSN9PC9wYXJhPjwvZm9ybWFscGFyYT4KK3t0aXRsZSV9PHNpbXBhcmE+PC9zaW1wYXJhPgorZW5kaWY6OmRvY3R5cGUtbWFucGFnZVtdCitlbmRpZjo6cGVyZi1hc2NpaWRvYy1uby1yb2ZmW10KK2VuZGlmOjpiYWNrZW5kLWRvY2Jvb2tbXQorCitpZmRlZjo6ZG9jdHlwZS1tYW5wYWdlW10KK2lmZGVmOjpiYWNrZW5kLWRvY2Jvb2tbXQorW2hlYWRlcl0KK3RlbXBsYXRlOjpbaGVhZGVyLWRlY2xhcmF0aW9uc10KKzxyZWZlbnRyeT4KKzxyZWZtZXRhPgorPHJlZmVudHJ5dGl0bGU+e21hbnRpdGxlfTwvcmVmZW50cnl0aXRsZT4KKzxtYW52b2xudW0+e21hbnZvbG51bX08L21hbnZvbG51bT4KKzxyZWZtaXNjaW5mbyBjbGFzcz0ic291cmNlIj5wZXJmPC9yZWZtaXNjaW5mbz4KKzxyZWZtaXNjaW5mbyBjbGFzcz0idmVyc2lvbiI+e3BlcmZfdmVyc2lvbn08L3JlZm1pc2NpbmZvPgorPHJlZm1pc2NpbmZvIGNsYXNzPSJtYW51YWwiPnBlcmYgTWFudWFsPC9yZWZtaXNjaW5mbz4KKzwvcmVmbWV0YT4KKzxyZWZuYW1lZGl2PgorICA8cmVmbmFtZT57bWFubmFtZX08L3JlZm5hbWU+CisgIDxyZWZwdXJwb3NlPnttYW5wdXJwb3NlfTwvcmVmcHVycG9zZT4KKzwvcmVmbmFtZWRpdj4KK2VuZGlmOjpiYWNrZW5kLWRvY2Jvb2tbXQorZW5kaWY6OmRvY3R5cGUtbWFucGFnZVtdCisKK2lmZGVmOjpiYWNrZW5kLXhodG1sMTFbXQorW2xpbmtwZXJmLWlubGluZW1hY3JvXQorPGEgaHJlZj0ie3RhcmdldH0uaHRtbCI+e3RhcmdldH17MD8oezB9KX08L2E+CitlbmRpZjo6YmFja2VuZC14aHRtbDExW10KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLTEuNzIueHNsIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2UtMS43Mi54c2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRkMzE1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLTEuNzIueHNsCkBAIC0wLDAgKzEsMTQgQEAKKzwhLS0gbWFucGFnZS0xLjcyLnhzbDoKKyAgICAgc3BlY2lhbCBzZXR0aW5ncyBmb3IgbWFucGFnZXMgcmVuZGVyZWQgZnJvbSBhc2NpaWRvYytkb2Nib29rCisgICAgIGhhbmRsZXMgcGVjdWxpYXJpdGllcyBpbiBkb2Nib29rLXhzbCAxLjcyLjAgLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisJCXZlcnNpb249IjEuMCI+CisKKzx4c2w6aW1wb3J0IGhyZWY9Im1hbnBhZ2UtYmFzZS54c2wiLz4KKworPCEtLSB0aGVzZSBhcmUgdGhlIHNwZWNpYWwgdmFsdWVzIGZvciB0aGUgcm9mZiBjb250cm9sIGNoYXJhY3RlcnMKKyAgICAgbmVlZGVkIGZvciBkb2Nib29rLXhzbCAxLjcyLjAgLS0+Cis8eHNsOnBhcmFtIG5hbWU9ImdpdC5kb2Nib29rLmJhY2tzbGFzaCI+JiN4MjU5Mzs8L3hzbDpwYXJhbT4KKzx4c2w6cGFyYW0gbmFtZT0iZ2l0LmRvY2Jvb2suZG90IiAgICAgID4mI3gyMzAyOzwveHNsOnBhcmFtPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2UtYmFzZS54c2wgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS1iYXNlLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjY0ZmE2MQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLWJhc2UueHNsCkBAIC0wLDAgKzEsMzUgQEAKKzwhLS0gbWFucGFnZS1iYXNlLnhzbDoKKyAgICAgc3BlY2lhbCBmb3JtYXR0aW5nIGZvciBtYW5wYWdlcyByZW5kZXJlZCBmcm9tIGFzY2lpZG9jK2RvY2Jvb2sgLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisJCXZlcnNpb249IjEuMCI+CisKKzwhLS0gdGhlc2UgcGFyYW1zIHNpbGVuY2Ugc29tZSBvdXRwdXQgZnJvbSB4bWx0byAtLT4KKzx4c2w6cGFyYW0gbmFtZT0ibWFuLm91dHB1dC5xdWlldGx5IiBzZWxlY3Q9IjEiLz4KKzx4c2w6cGFyYW0gbmFtZT0icmVmZW50cnkubWV0YS5nZXQucXVpZXRseSIgc2VsZWN0PSIxIi8+CisKKzwhLS0gY29udmVydCBhc2NpaWRvYyBjYWxsb3V0cyB0byBtYW4gcGFnZSBmb3JtYXQ7CisgICAgIGdpdC5kb2Nib29rLmJhY2tzbGFzaCBhbmQgZ2l0LmRvY2Jvb2suZG90IHBhcmFtcworICAgICBtdXN0IGJlIHN1cHBsaWVkIGJ5IGFub3RoZXIgWFNMIGZpbGUgb3Igb3RoZXIgbWVhbnMgLS0+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjbyI+CisJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImNvbmNhdCgKKwkJCSAgICAgICRnaXQuZG9jYm9vay5iYWNrc2xhc2gsJ2ZCKCcsCisJCQkgICAgICBzdWJzdHJpbmctYWZ0ZXIoQGlkLCctJyksJyknLAorCQkJICAgICAgJGdpdC5kb2Nib29rLmJhY2tzbGFzaCwnZlInKSIvPgorPC94c2w6dGVtcGxhdGU+Cis8eHNsOnRlbXBsYXRlIG1hdGNoPSJjYWxsb3V0bGlzdCI+CisJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnaXQuZG9jYm9vay5kb3QiLz4KKwk8eHNsOnRleHQ+c3AmIzEwOzwveHNsOnRleHQ+CisJPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorCTx4c2w6dGV4dD4mIzEwOzwveHNsOnRleHQ+Cis8L3hzbDp0ZW1wbGF0ZT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImNhbGxvdXQiPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJjb25jYXQoCisJCQkgICAgICAkZ2l0LmRvY2Jvb2suYmFja3NsYXNoLCdmQicsCisJCQkgICAgICBzdWJzdHJpbmctYWZ0ZXIoQGFyZWFyZWZzLCctJyksCisJCQkgICAgICAnLiAnLCRnaXQuZG9jYm9vay5iYWNrc2xhc2gsJ2ZSJykiLz4KKwk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnaXQuZG9jYm9vay5kb3QiLz4KKwk8eHNsOnRleHQ+YnImIzEwOzwveHNsOnRleHQ+Cis8L3hzbDp0ZW1wbGF0ZT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLWJvbGQtbGl0ZXJhbC54c2wgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS1ib2xkLWxpdGVyYWwueHNsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwOGViNWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS1ib2xkLWxpdGVyYWwueHNsCkBAIC0wLDAgKzEsMTcgQEAKKzwhLS0gbWFucGFnZS1ib2xkLWxpdGVyYWwueHNsOgorICAgICBzcGVjaWFsIGZvcm1hdHRpbmcgZm9yIG1hbnBhZ2VzIHJlbmRlcmVkIGZyb20gYXNjaWlkb2MrZG9jYm9vayAtLT4KKzx4c2w6c3R5bGVzaGVldCB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIKKwkJdmVyc2lvbj0iMS4wIj4KKworPCEtLSByZW5kZXIgbGl0ZXJhbCB0ZXh0IGFzIGJvbGQgKGluc3RlYWQgb2YgcGxhaW4gb3IgbW9ub3NwYWNlKTsKKyAgICAgdGhpcyBtYWtlcyBsaXRlcmFsIHRleHQgZWFzaWVyIHRvIGRpc3Rpbmd1aXNoIGluIG1hbnBhZ2VzCisgICAgIHZpZXdlZCBvbiBhIHR0eSAtLT4KKzx4c2w6dGVtcGxhdGUgbWF0Y2g9ImxpdGVyYWwiPgorCTx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIkZ2l0LmRvY2Jvb2suYmFja3NsYXNoIi8+CisJPHhzbDp0ZXh0PmZCPC94c2w6dGV4dD4KKwk8eHNsOmFwcGx5LXRlbXBsYXRlcy8+CisJPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IiRnaXQuZG9jYm9vay5iYWNrc2xhc2giLz4KKwk8eHNsOnRleHQ+ZlI8L3hzbDp0ZXh0PgorPC94c2w6dGVtcGxhdGU+CisKKzwveHNsOnN0eWxlc2hlZXQ+CmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vbWFucGFnZS1ub3JtYWwueHNsIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2Utbm9ybWFsLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDhmNWIxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2Utbm9ybWFsLnhzbApAQCAtMCwwICsxLDEzIEBACis8IS0tIG1hbnBhZ2Utbm9ybWFsLnhzbDoKKyAgICAgc3BlY2lhbCBzZXR0aW5ncyBmb3IgbWFucGFnZXMgcmVuZGVyZWQgZnJvbSBhc2NpaWRvYytkb2Nib29rCisgICAgIGhhbmRsZXMgYW55dGhpbmcgd2Ugd2FudCB0byBrZWVwIGF3YXkgZnJvbSBkb2Nib29rLXhzbCAxLjcyLjAgLS0+Cis8eHNsOnN0eWxlc2hlZXQgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iCisJCXZlcnNpb249IjEuMCI+CisKKzx4c2w6aW1wb3J0IGhyZWY9Im1hbnBhZ2UtYmFzZS54c2wiLz4KKworPCEtLSB0aGVzZSBhcmUgdGhlIG5vcm1hbCB2YWx1ZXMgZm9yIHRoZSByb2ZmIGNvbnRyb2wgY2hhcmFjdGVycyAtLT4KKzx4c2w6cGFyYW0gbmFtZT0iZ2l0LmRvY2Jvb2suYmFja3NsYXNoIj5cPC94c2w6cGFyYW0+Cis8eHNsOnBhcmFtIG5hbWU9ImdpdC5kb2Nib29rLmRvdCIJPi48L3hzbDpwYXJhbT4KKworPC94c2w6c3R5bGVzaGVldD4KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLXN1cHByZXNzLXNwLnhzbCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9tYW5wYWdlLXN1cHByZXNzLXNwLnhzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNjNjNzYzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL21hbnBhZ2Utc3VwcHJlc3Mtc3AueHNsCkBAIC0wLDAgKzEsMjEgQEAKKzwhLS0gbWFucGFnZS1zdXBwcmVzcy1zcC54c2w6CisgICAgIHNwZWNpYWwgc2V0dGluZ3MgZm9yIG1hbnBhZ2VzIHJlbmRlcmVkIGZyb20gYXNjaWlkb2MrZG9jYm9vaworICAgICBoYW5kbGVzIGVycm9uZW91cywgaW5saW5lIC5zcCBpbiBtYW5wYWdlIG91dHB1dCBvZiBzb21lCisgICAgIHZlcnNpb25zIG9mIGRvY2Jvb2steHNsIC0tPgorPHhzbDpzdHlsZXNoZWV0IHhtbG5zOnhzbD0iaHR0cDovL3d3dy53My5vcmcvMTk5OS9YU0wvVHJhbnNmb3JtIgorCQl2ZXJzaW9uPSIxLjAiPgorCis8IS0tIGF0dGVtcHQgdG8gd29yayBhcm91bmQgc3B1cmlvdXMgLnNwIGF0IHRoZSB0YWlsIG9mIHRoZSBsaW5lCisgICAgIHRoYXQgc29tZSB2ZXJzaW9ucyBvZiBkb2Nib29rIHN0eWxlc2hlZXRzIHNlZW0gdG8gYWRkIC0tPgorPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ic2ltcGFyYSI+CisgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29udGVudCI+CisgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgorICA8L3hzbDp2YXJpYWJsZT4KKyAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9Im5vcm1hbGl6ZS1zcGFjZSgkY29udGVudCkiLz4KKyAgPHhzbDppZiB0ZXN0PSJub3QoYW5jZXN0b3I6OmF1dGhvcmJsdXJiKSBhbmQKKyAgICAgICAgICAgICAgICBub3QoYW5jZXN0b3I6OnBlcnNvbmJsdXJiKSI+CisgICAgPHhzbDp0ZXh0PiYjMTA7JiMxMDs8L3hzbDp0ZXh0PgorICA8L3hzbDppZj4KKzwveHNsOnRlbXBsYXRlPgorCis8L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYW5ub3RhdGUudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtYW5ub3RhdGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZGNhZGUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1hbm5vdGF0ZS50eHQKQEAgLTAsMCArMSwyOSBAQAorcGVyZi1hbm5vdGF0ZSgxKQorPT09PT09PT09PT09PT0KKworTkFNRQorLS0tLQorcGVyZi1hbm5vdGF0ZSAtIFJlYWQgcGVyZi5kYXRhIChjcmVhdGVkIGJ5IHBlcmYgcmVjb3JkKSBhbmQgZGlzcGxheSBhbm5vdGF0ZWQgY29kZQorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydwZXJmIGFubm90YXRlJyBbLWkgPGZpbGU+IHwgLS1pbnB1dD1maWxlXSBzeW1ib2xfbmFtZQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgY29tbWFuZCByZWFkcyB0aGUgaW5wdXQgZmlsZSBhbmQgZGlzcGxheXMgYW4gYW5ub3RhdGVkIHZlcnNpb24gb2YgdGhlCitjb2RlLiBJZiB0aGUgb2JqZWN0IGZpbGUgaGFzIGRlYnVnIHN5bWJvbHMgdGhlbiB0aGUgc291cmNlIGNvZGUgd2lsbCBiZQorZGlzcGxheWVkIGFsb25nc2lkZSBhc3NlbWJseSBjb2RlLgorCitJZiB0aGVyZSBpcyBubyBkZWJ1ZyBpbmZvIGluIHRoZSBvYmplY3QsIHRoZW4gYW5ub3RhdGVkIGFzc2VtYmx5IGlzIGRpc3BsYXllZC4KKworT1BUSU9OUworLS0tLS0tLQorLWk6OgorLS1pbnB1dD06OgorICAgICAgICBJbnB1dCBmaWxlIG5hbWUuIChkZWZhdWx0OiBwZXJmLmRhdGEpCisKK1NFRSBBTFNPCistLS0tLS0tLQorbGlua3BlcmY6cGVyZi1yZWNvcmRbMV0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWhlbHAudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtaGVscC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE0MzkxOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWhlbHAudHh0CkBAIC0wLDAgKzEsMzggQEAKK3BlcmYtaGVscCgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK3BlcmYtaGVscCAtIGRpc3BsYXkgaGVscCBpbmZvcm1hdGlvbiBhYm91dCBwZXJmCisKK1NZTk9QU0lTCistLS0tLS0tLQorJ3BlcmYgaGVscCcgWy1hfC0tYWxsXSBbQ09NTUFORF0KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCisKK1dpdGggbm8gb3B0aW9ucyBhbmQgbm8gQ09NTUFORCBnaXZlbiwgdGhlIHN5bm9wc2lzIG9mIHRoZSAncGVyZicKK2NvbW1hbmQgYW5kIGEgbGlzdCBvZiB0aGUgbW9zdCBjb21tb25seSB1c2VkIHBlcmYgY29tbWFuZHMgYXJlIHByaW50ZWQKK29uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKK0lmIHRoZSBvcHRpb24gJy0tYWxsJyBvciAnLWEnIGlzIGdpdmVuLCB0aGVuIGFsbCBhdmFpbGFibGUgY29tbWFuZHMgYXJlCitwcmludGVkIG9uIHRoZSBzdGFuZGFyZCBvdXRwdXQuCisKK0lmIGEgcGVyZiBjb21tYW5kIGlzIG5hbWVkLCBhIG1hbnVhbCBwYWdlIGZvciB0aGF0IGNvbW1hbmQgaXMgYnJvdWdodAordXAuIFRoZSAnbWFuJyBwcm9ncmFtIGlzIHVzZWQgYnkgZGVmYXVsdCBmb3IgdGhpcyBwdXJwb3NlLCBidXQgdGhpcworY2FuIGJlIG92ZXJyaWRkZW4gYnkgb3RoZXIgb3B0aW9ucyBvciBjb25maWd1cmF0aW9uIHZhcmlhYmxlcy4KKworTm90ZSB0aGF0IGBwZXJmIC0taGVscCAuLi5gIGlzIGlkZW50aWNhbCB0byBgcGVyZiBoZWxwIC4uLmAgYmVjYXVzZSB0aGUKK2Zvcm1lciBpcyBpbnRlcm5hbGx5IGNvbnZlcnRlZCBpbnRvIHRoZSBsYXR0ZXIuCisKK09QVElPTlMKKy0tLS0tLS0KKy1hOjoKKy0tYWxsOjoKKwlQcmludHMgYWxsIHRoZSBhdmFpbGFibGUgY29tbWFuZHMgb24gdGhlIHN0YW5kYXJkIG91dHB1dC4gVGhpcworCW9wdGlvbiBzdXBlcnNlZGVzIGFueSBvdGhlciBvcHRpb24uCisKK1BFUkYKKy0tLS0KK1BhcnQgb2YgdGhlIGxpbmtwZXJmOnBlcmZbMV0gc3VpdGUKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWxpc3QudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtbGlzdC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5MGI5NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLWxpc3QudHh0CkBAIC0wLDAgKzEsMjUgQEAKK3BlcmYtbGlzdCgxKQorPT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK3BlcmYtbGlzdCAtIExpc3QgYWxsIHN5bWJvbGljIGV2ZW50IHR5cGVzCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ3BlcmYgbGlzdCcKKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgZGlzcGxheXMgdGhlIHN5bWJvbGljIGV2ZW50IHR5cGVzIHdoaWNoIGNhbiBiZSBzZWxlY3RlZCBpbiB0aGUKK3ZhcmlvdXMgcGVyZiBjb21tYW5kcyB3aXRoIHRoZSAtZSBvcHRpb24uCisKK09QVElPTlMKKy0tLS0tLS0KK05vbmUKKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rcGVyZjpwZXJmLXN0YXRbMV0sIGxpbmtwZXJmOnBlcmYtdG9wWzFdLAorbGlua3BlcmY6cGVyZi1yZWNvcmRbMV0KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlY29yZC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYmMxZWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1yZWNvcmQudHh0CkBAIC0wLDAgKzEsNDIgQEAKK3BlcmYtcmVjb3JkKDEpCis9PT09PT09PT09PT09PQorCitOQU1FCistLS0tCitwZXJmLXJlY29yZCAtIFJ1biBhIGNvbW1hbmQgYW5kIHJlY29yZCBpdHMgcHJvZmlsZSBpbnRvIHBlcmYuZGF0YQorCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydwZXJmIHJlY29yZCcgWy1lIDxFVkVOVD4gfCAtLWV2ZW50PUVWRU5UXSBbLWxdIFstYV0gPGNvbW1hbmQ+CisncGVyZiByZWNvcmQnIFstZSA8RVZFTlQ+IHwgLS1ldmVudD1FVkVOVF0gWy1sXSBbLWFdIC0tIDxjb21tYW5kPiBbPG9wdGlvbnM+XQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgY29tbWFuZCBydW5zIGEgY29tbWFuZCBhbmQgZ2F0aGVycyBhIHBlcmZvcm1hbmNlIGNvdW50ZXIgcHJvZmlsZQorZnJvbSBpdCwgaW50byBwZXJmLmRhdGEgLSB3aXRob3V0IGRpc3BsYXlpbmcgYW55dGhpbmcuCisKK1RoaXMgZmlsZSBjYW4gdGhlbiBiZSBpbnNwZWN0ZWQgbGF0ZXIgb24sIHVzaW5nICdwZXJmIHJlcG9ydCcuCisKKworT1BUSU9OUworLS0tLS0tLQorPGNvbW1hbmQ+Li4uOjoKKwlBbnkgY29tbWFuZCB5b3UgY2FuIHNwZWNpZnkgaW4gYSBzaGVsbC4KKworLWU6OgorLS1ldmVudD06OgorCVNlbGVjdCB0aGUgUE1VIGV2ZW50LiBTZWxlY3Rpb24gY2FuIGJlIGEgc3ltYm9saWMgZXZlbnQgbmFtZQorCSh1c2UgJ3BlcmYgbGlzdCcgdG8gbGlzdCBhbGwgZXZlbnRzKSBvciBhIHJhdyBQTVUKKwlldmVudCAoZXZlbnRzZWwrdW1hc2spIGluIHRoZSBmb3JtIG9mIHJOTk4gd2hlcmUgTk5OIGlzIGEKKwkgaGV4YWRlY2ltYWwgZXZlbnQgZGVzY3JpcHRvci4KKworLWE6OgorICAgICAgICBzeXN0ZW0td2lkZSBjb2xsZWN0aW9uCisKKy1sOjoKKyAgICAgICAgc2NhbGUgY291bnRlciB2YWx1ZXMKKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rcGVyZjpwZXJmLXN0YXRbMV0sIGxpbmtwZXJmOnBlcmYtbGlzdFsxXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtcmVwb3J0LnR4dCBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlcG9ydC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkM2ZjNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvRG9jdW1lbnRhdGlvbi9wZXJmLXJlcG9ydC50eHQKQEAgLTAsMCArMSwyNiBAQAorcGVyZi1yZXBvcnQoMSkKKz09PT09PT09PT09PT09CisKK05BTUUKKy0tLS0KK3BlcmYtcmVwb3J0IC0gUmVhZCBwZXJmLmRhdGEgKGNyZWF0ZWQgYnkgcGVyZiByZWNvcmQpIGFuZCBkaXNwbGF5IHRoZSBwcm9maWxlCisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ3BlcmYgcmVwb3J0JyBbLWkgPGZpbGU+IHwgLS1pbnB1dD1maWxlXQorCitERVNDUklQVElPTgorLS0tLS0tLS0tLS0KK1RoaXMgY29tbWFuZCBkaXNwbGF5cyB0aGUgcGVyZm9ybWFuY2UgY291bnRlciBwcm9maWxlIGluZm9ybWF0aW9uIHJlY29yZGVkCit2aWEgcGVyZiByZXBvcnQuCisKK09QVElPTlMKKy0tLS0tLS0KKy1pOjoKKy0taW5wdXQ9OjoKKyAgICAgICAgSW5wdXQgZmlsZSBuYW1lLiAoZGVmYXVsdDogcGVyZi5kYXRhKQorCitTRUUgQUxTTworLS0tLS0tLS0KK2xpbmtwZXJmOnBlcmYtc3RhdFsxXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc3RhdC50eHQgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi1zdGF0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzY4YTcyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtc3RhdC50eHQKQEAgLTAsMCArMSw2NiBAQAorcGVyZi1zdGF0KDEpCis9PT09PT09PT09PT0KKworTkFNRQorLS0tLQorcGVyZi1zdGF0IC0gUnVuIGEgY29tbWFuZCBhbmQgZ2F0aGVyIHBlcmZvcm1hbmNlIGNvdW50ZXIgc3RhdGlzdGljcworCitTWU5PUFNJUworLS0tLS0tLS0KK1t2ZXJzZV0KKydwZXJmIHN0YXQnIFstZSA8RVZFTlQ+IHwgLS1ldmVudD1FVkVOVF0gWy1sXSBbLWFdIDxjb21tYW5kPgorJ3BlcmYgc3RhdCcgWy1lIDxFVkVOVD4gfCAtLWV2ZW50PUVWRU5UXSBbLWxdIFstYV0gLS0gPGNvbW1hbmQ+IFs8b3B0aW9ucz5dCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorVGhpcyBjb21tYW5kIHJ1bnMgYSBjb21tYW5kIGFuZCBnYXRoZXJzIHBlcmZvcm1hbmNlIGNvdW50ZXIgc3RhdGlzdGljcworZnJvbSBpdC4KKworCitPUFRJT05TCistLS0tLS0tCis8Y29tbWFuZD4uLi46OgorCUFueSBjb21tYW5kIHlvdSBjYW4gc3BlY2lmeSBpbiBhIHNoZWxsLgorCisKKy1lOjoKKy0tZXZlbnQ9OjoKKwlTZWxlY3QgdGhlIFBNVSBldmVudC4gU2VsZWN0aW9uIGNhbiBiZSBhIHN5bWJvbGljIGV2ZW50IG5hbWUKKwkodXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYWxsIGV2ZW50cykgb3IgYSByYXcgUE1VCisJZXZlbnQgKGV2ZW50c2VsK3VtYXNrKSBpbiB0aGUgZm9ybSBvZiByTk5OIHdoZXJlIE5OTiBpcyBhCisJIGhleGFkZWNpbWFsIGV2ZW50IGRlc2NyaXB0b3IuCisKKy1pOjoKKy0taW5oZXJpdDo6CisgICAgICAgIGNoaWxkIHRhc2tzIGluaGVyaXQgY291bnRlcnMKKy1wOjoKKy0tcGlkPTxwaWQ+OjoKKyAgICAgICAgc3RhdCBldmVudHMgb24gZXhpc3RpbmcgcGlkCisKKy1hOjoKKyAgICAgICAgc3lzdGVtLXdpZGUgY29sbGVjdGlvbgorCistbDo6CisgICAgICAgIHNjYWxlIGNvdW50ZXIgdmFsdWVzCisKK0VYQU1QTEVTCistLS0tLS0tLQorCiskIHBlcmYgc3RhdCAtLSBtYWtlIC1qCisKKyBQZXJmb3JtYW5jZSBjb3VudGVyIHN0YXRzIGZvciAnbWFrZSAtaic6CisKKyAgICA4MTE3LjM3MDI1NiAgdGFzayBjbG9jayB0aWNrcyAgICAgIyAgICAgIDExLjI4MSBDUFUgdXRpbGl6YXRpb24gZmFjdG9yCisgICAgICAgICAgICA2NzggIGNvbnRleHQgc3dpdGNoZXMgICAgICMgICAgICAgMC4wMDAgTS9zZWMKKyAgICAgICAgICAgIDEzMyAgQ1BVIG1pZ3JhdGlvbnMgICAgICAgIyAgICAgICAwLjAwMCBNL3NlYworICAgICAgICAgMjM1NzI0ICBwYWdlZmF1bHRzICAgICAgICAgICAjICAgICAgIDAuMDI5IE0vc2VjCisgICAgMjQ4MjExNjI1MjYgIENQVSBjeWNsZXMgICAgICAgICAgICMgICAgMzA1Ny43ODQgTS9zZWMKKyAgICAxODY4NzMwMzQ1NyAgaW5zdHJ1Y3Rpb25zICAgICAgICAgIyAgICAyMzAyLjEzOCBNL3NlYworICAgICAgMTcyMTU4ODk1ICBjYWNoZSByZWZlcmVuY2VzICAgICAjICAgICAgMjEuMjA5IE0vc2VjCisgICAgICAgMjcwNzUyNTkgIGNhY2hlIG1pc3NlcyAgICAgICAgICMgICAgICAgMy4zMzUgTS9zZWMKKworIFdhbGwtY2xvY2sgdGltZSBlbGFwc2VkOiAgIDcxOS41NTQzNTIgbXNlY3MKKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rcGVyZjpwZXJmLXRvcFsxXSwgbGlua3BlcmY6cGVyZi1saXN0WzFdCmRpZmYgLS1naXQgYS90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi10b3AudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdG9wLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzlkMDEyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYtdG9wLnR4dApAQCAtMCwwICsxLDM5IEBACitwZXJmLXRvcCgxKQorPT09PT09PT09PT0KKworTkFNRQorLS0tLQorcGVyZi10b3AgLSBSdW4gYSBjb21tYW5kIGFuZCBwcm9maWxlIGl0CisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ3BlcmYgdG9wJyBbLWUgPEVWRU5UPiB8IC0tZXZlbnQ9RVZFTlRdIFstbF0gWy1hXSA8Y29tbWFuZD4KKworREVTQ1JJUFRJT04KKy0tLS0tLS0tLS0tCitUaGlzIGNvbW1hbmQgcnVucyBhIGNvbW1hbmQgYW5kIGdhdGhlcnMgYSBwZXJmb3JtYW5jZSBjb3VudGVyIHByb2ZpbGUKK2Zyb20gaXQuCisKKworT1BUSU9OUworLS0tLS0tLQorPGNvbW1hbmQ+Li4uOjoKKwlBbnkgY29tbWFuZCB5b3UgY2FuIHNwZWNpZnkgaW4gYSBzaGVsbC4KKworLWU6OgorLS1ldmVudD06OgorCVNlbGVjdCB0aGUgUE1VIGV2ZW50LiBTZWxlY3Rpb24gY2FuIGJlIGEgc3ltYm9saWMgZXZlbnQgbmFtZQorCSh1c2UgJ3BlcmYgbGlzdCcgdG8gbGlzdCBhbGwgZXZlbnRzKSBvciBhIHJhdyBQTVUKKwlldmVudCAoZXZlbnRzZWwrdW1hc2spIGluIHRoZSBmb3JtIG9mIHJOTk4gd2hlcmUgTk5OIGlzIGEKKwkgaGV4YWRlY2ltYWwgZXZlbnQgZGVzY3JpcHRvci4KKworLWE6OgorICAgICAgICBzeXN0ZW0td2lkZSBjb2xsZWN0aW9uCisKKy1sOjoKKyAgICAgICAgc2NhbGUgY291bnRlciB2YWx1ZXMKKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rcGVyZjpwZXJmLXN0YXRbMV0sIGxpbmtwZXJmOnBlcmYtbGlzdFsxXQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYudHh0IGIvdG9vbHMvcGVyZi9Eb2N1bWVudGF0aW9uL3BlcmYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YzgzMjUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL0RvY3VtZW50YXRpb24vcGVyZi50eHQKQEAgLTAsMCArMSwyNCBAQAorcGVyZigxKQorPT09PT09PQorCitOQU1FCistLS0tCitwZXJmIC0gUGVyZm9ybWFuY2UgYW5hbHlzaXMgdG9vbHMgZm9yIExpbnV4CisKK1NZTk9QU0lTCistLS0tLS0tLQorW3ZlcnNlXQorJ3BlcmYnIFstLXZlcnNpb25dIFstLWhlbHBdIENPTU1BTkQgW0FSR1NdCisKK0RFU0NSSVBUSU9OCistLS0tLS0tLS0tLQorUGVyZm9ybWFuY2UgY291bnRlcnMgZm9yIExpbnV4IGFyZSBhcmUgYSBuZXcga2VybmVsLWJhc2VkIHN1YnN5c3RlbQordGhhdCBwcm92aWRlIGEgZnJhbWV3b3JrIGZvciBhbGwgdGhpbmdzIHBlcmZvcm1hbmNlIGFuYWx5c2lzLiBJdAorY292ZXJzIGhhcmR3YXJlIGxldmVsIChDUFUvUE1VLCBQZXJmb3JtYW5jZSBNb25pdG9yaW5nIFVuaXQpIGZlYXR1cmVzCithbmQgc29mdHdhcmUgZmVhdHVyZXMgKHNvZnR3YXJlIGNvdW50ZXJzLCB0cmFjZXBvaW50cykgYXMgd2VsbC4KKworU0VFIEFMU08KKy0tLS0tLS0tCitsaW5rcGVyZjpwZXJmLXN0YXRbMV0sIGxpbmtwZXJmOnBlcmYtdG9wWzFdLAorbGlua3BlcmY6cGVyZi1yZWNvcmRbMV0sIGxpbmtwZXJmOnBlcmYtcmVwb3J0WzFdLAorbGlua3BlcmY6cGVyZi1saXN0WzFdCmRpZmYgLS1naXQgYS90b29scy9wZXJmL01ha2VmaWxlIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2JkNWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9NYWtlZmlsZQpAQCAtMCwwICsxLDkyOSBAQAorIyBUaGUgZGVmYXVsdCB0YXJnZXQgb2YgdGhpcyBNYWtlZmlsZSBpcy4uLgorYWxsOjoKKworIyBEZWZpbmUgVj0xIHRvIGhhdmUgYSBtb3JlIHZlcmJvc2UgY29tcGlsZS4KKyMKKyMgRGVmaW5lIFNOUFJJTlRGX1JFVFVSTlNfQk9HVVMgaWYgeW91ciBhcmUgb24gYSBzeXN0ZW0gd2hpY2ggc25wcmludGYoKQorIyBvciB2c25wcmludGYoKSByZXR1cm4gLTEgaW5zdGVhZCBvZiBudW1iZXIgb2YgY2hhcmFjdGVycyB3aGljaCB3b3VsZAorIyBoYXZlIGJlZW4gd3JpdHRlbiB0byB0aGUgZmluYWwgc3RyaW5nIGlmIGVub3VnaCBzcGFjZSBoYWQgYmVlbiBhdmFpbGFibGUuCisjCisjIERlZmluZSBGUkVBRF9SRUFEU19ESVJFQ1RPUklFUyBpZiB5b3VyIGFyZSBvbiBhIHN5c3RlbSB3aGljaCBzdWNjZWVkcworIyB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCBmcm9tIGFuIGZvcGVuJ2VkIGRpcmVjdG9yeS4KKyMKKyMgRGVmaW5lIE5PX09QRU5TU0wgZW52aXJvbm1lbnQgdmFyaWFibGUgaWYgeW91IGRvIG5vdCBoYXZlIE9wZW5TU0wuCisjIFRoaXMgYWxzbyBpbXBsaWVzIE1PWklMTEFfU0hBMS4KKyMKKyMgRGVmaW5lIENVUkxESVI9L2Zvby9iYXIgaWYgeW91ciBjdXJsIGhlYWRlciBhbmQgbGlicmFyeSBmaWxlcyBhcmUgaW4KKyMgL2Zvby9iYXIvaW5jbHVkZSBhbmQgL2Zvby9iYXIvbGliIGRpcmVjdG9yaWVzLgorIworIyBEZWZpbmUgRVhQQVRESVI9L2Zvby9iYXIgaWYgeW91ciBleHBhdCBoZWFkZXIgYW5kIGxpYnJhcnkgZmlsZXMgYXJlIGluCisjIC9mb28vYmFyL2luY2x1ZGUgYW5kIC9mb28vYmFyL2xpYiBkaXJlY3Rvcmllcy4KKyMKKyMgRGVmaW5lIE5PX0RfSU5PX0lOX0RJUkVOVCBpZiB5b3UgZG9uJ3QgaGF2ZSBkX2lubyBpbiB5b3VyIHN0cnVjdCBkaXJlbnQuCisjCisjIERlZmluZSBOT19EX1RZUEVfSU5fRElSRU5UIGlmIHlvdXIgcGxhdGZvcm0gZGVmaW5lcyBEVF9VTktOT1dOIGJ1dCBsYWNrcworIyBkX3R5cGUgaW4gc3RydWN0IGRpcmVudCAobGF0ZXN0IEN5Z3dpbiAtLSB3aWxsIGJlIGZpeGVkIHNvb25pc2gpLgorIworIyBEZWZpbmUgTk9fQzk5X0ZPUk1BVCBpZiB5b3VyIGZvcm1hdHRlZCBJTyBmdW5jdGlvbnMgKHByaW50Zi9zY2FuZiBldC5hbC4pCisjIGRvIG5vdCBzdXBwb3J0IHRoZSAnc2l6ZSBzcGVjaWZpZXJzJyBpbnRyb2R1Y2VkIGJ5IEM5OSwgbmFtZWx5IGxsLCBoaCwKKyMgaiwgeiwgdC4gKHJlcHJlc2VudGluZyBsb25nIGxvbmcgaW50LCBjaGFyLCBpbnRtYXhfdCwgc2l6ZV90LCBwdHJkaWZmX3QpLgorIyBzb21lIEMgY29tcGlsZXJzIHN1cHBvcnRlZCB0aGVzZSBzcGVjaWZpZXJzIHByaW9yIHRvIEM5OSBhcyBhbiBleHRlbnNpb24uCisjCisjIERlZmluZSBOT19TVFJDQVNFU1RSIGlmIHlvdSBkb24ndCBoYXZlIHN0cmNhc2VzdHIuCisjCisjIERlZmluZSBOT19NRU1NRU0gaWYgeW91IGRvbid0IGhhdmUgbWVtbWVtLgorIworIyBEZWZpbmUgTk9fU1RSVE9VTUFYIGlmIHlvdSBkb24ndCBoYXZlIHN0cnRvdW1heCBpbiB0aGUgQyBsaWJyYXJ5LgorIyBJZiB5b3VyIGNvbXBpbGVyIGFsc28gZG9lcyBub3Qgc3VwcG9ydCBsb25nIGxvbmcgb3IgZG9lcyBub3QgaGF2ZQorIyBzdHJ0b3VsbCwgZGVmaW5lIE5PX1NUUlRPVUxMLgorIworIyBEZWZpbmUgTk9fU0VURU5WIGlmIHlvdSBkb24ndCBoYXZlIHNldGVudiBpbiB0aGUgQyBsaWJyYXJ5LgorIworIyBEZWZpbmUgTk9fVU5TRVRFTlYgaWYgeW91IGRvbid0IGhhdmUgdW5zZXRlbnYgaW4gdGhlIEMgbGlicmFyeS4KKyMKKyMgRGVmaW5lIE5PX01LRFRFTVAgaWYgeW91IGRvbid0IGhhdmUgbWtkdGVtcCBpbiB0aGUgQyBsaWJyYXJ5LgorIworIyBEZWZpbmUgTk9fU1lTX1NFTEVDVF9IIGlmIHlvdSBkb24ndCBoYXZlIHN5cy9zZWxlY3QuaC4KKyMKKyMgRGVmaW5lIE5PX1NZTUxJTktfSEVBRCBpZiB5b3UgbmV2ZXIgd2FudCAucGVyZi9IRUFEIHRvIGJlIGEgc3ltYm9saWMgbGluay4KKyMgRW5hYmxlIGl0IG9uIFdpbmRvd3MuICBCeSBkZWZhdWx0LCBzeW1yZWZzIGFyZSBzdGlsbCB1c2VkLgorIworIyBEZWZpbmUgTk9fU1ZOX1RFU1RTIGlmIHlvdSB3YW50IHRvIHNraXAgdGltZS1jb25zdW1pbmcgU1ZOIGludGVyb3BlcmFiaWxpdHkKKyMgdGVzdHMuICBUaGVzZSB0ZXN0cyB0YWtlIHVwIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIHRoZSB0b3RhbCB0ZXN0IHRpbWUKKyMgYnV0IGFyZSBub3QgbmVlZGVkIHVubGVzcyB5b3UgcGxhbiB0byB0YWxrIHRvIFNWTiByZXBvcy4KKyMKKyMgRGVmaW5lIE5PX0ZJTksgaWYgeW91IGFyZSBidWlsZGluZyBvbiBEYXJ3aW4vTWFjIE9TIFgsIGhhdmUgRmluaworIyBpbnN0YWxsZWQgaW4gL3N3LCBidXQgZG9uJ3Qgd2FudCBQRVJGIHRvIGxpbmsgYWdhaW5zdCBhbnkgbGlicmFyaWVzCisjIGluc3RhbGxlZCB0aGVyZS4gIElmIGRlZmluZWQgeW91IG1heSBzcGVjaWZ5IHlvdXIgb3duIChvciBGaW5rJ3MpCisjIGluY2x1ZGUgZGlyZWN0b3JpZXMgYW5kIGxpYnJhcnkgZGlyZWN0b3JpZXMgYnkgZGVmaW5pbmcgQ0ZMQUdTCisjIGFuZCBMREZMQUdTIGFwcHJvcHJpYXRlbHkuCisjCisjIERlZmluZSBOT19EQVJXSU5fUE9SVFMgaWYgeW91IGFyZSBidWlsZGluZyBvbiBEYXJ3aW4vTWFjIE9TIFgsCisjIGhhdmUgRGFyd2luUG9ydHMgaW5zdGFsbGVkIGluIC9vcHQvbG9jYWwsIGJ1dCBkb24ndCB3YW50IFBFUkYgdG8KKyMgbGluayBhZ2FpbnN0IGFueSBsaWJyYXJpZXMgaW5zdGFsbGVkIHRoZXJlLiAgSWYgZGVmaW5lZCB5b3UgbWF5CisjIHNwZWNpZnkgeW91ciBvd24gKG9yIERhcndpblBvcnQncykgaW5jbHVkZSBkaXJlY3RvcmllcyBhbmQKKyMgbGlicmFyeSBkaXJlY3RvcmllcyBieSBkZWZpbmluZyBDRkxBR1MgYW5kIExERkxBR1MgYXBwcm9wcmlhdGVseS4KKyMKKyMgRGVmaW5lIFBQQ19TSEExIGVudmlyb25tZW50IHZhcmlhYmxlIHdoZW4gcnVubmluZyBtYWtlIHRvIG1ha2UgdXNlIG9mCisjIGEgYnVuZGxlZCBTSEExIHJvdXRpbmUgb3B0aW1pemVkIGZvciBQb3dlclBDLgorIworIyBEZWZpbmUgQVJNX1NIQTEgZW52aXJvbm1lbnQgdmFyaWFibGUgd2hlbiBydW5uaW5nIG1ha2UgdG8gbWFrZSB1c2Ugb2YKKyMgYSBidW5kbGVkIFNIQTEgcm91dGluZSBvcHRpbWl6ZWQgZm9yIEFSTS4KKyMKKyMgRGVmaW5lIE1PWklMTEFfU0hBMSBlbnZpcm9ubWVudCB2YXJpYWJsZSB3aGVuIHJ1bm5pbmcgbWFrZSB0byBtYWtlIHVzZSBvZgorIyBhIGJ1bmRsZWQgU0hBMSByb3V0aW5lIGNvbWluZyBmcm9tIE1vemlsbGEuIEl0IGlzIEdQTCdkIGFuZCBzaG91bGQgYmUgZmFzdAorIyBvbiBub24teDg2IGFyY2hpdGVjdHVyZXMgKGUuZy4gUG93ZXJQQyksIHdoaWxlIHRoZSBPcGVuU1NMIHZlcnNpb24gKGRlZmF1bHQKKyMgY2hvaWNlKSBoYXMgdmVyeSBmYXN0IHZlcnNpb24gb3B0aW1pemVkIGZvciBpNTg2LgorIworIyBEZWZpbmUgTkVFRFNfU1NMX1dJVEhfQ1JZUFRPIGlmIHlvdSBuZWVkIC1sY3J5cHRvIHdpdGggLWxzc2wgKERhcndpbikuCisjCisjIERlZmluZSBORUVEU19MSUJJQ09OViBpZiBsaW5raW5nIHdpdGggbGliYyBpcyBub3QgZW5vdWdoIChEYXJ3aW4pLgorIworIyBEZWZpbmUgTkVFRFNfU09DS0VUIGlmIGxpbmtpbmcgd2l0aCBsaWJjIGlzIG5vdCBlbm91Z2ggKFN1bk9TLAorIyBQYXRyaWNrIE1hdXJpdHopLgorIworIyBEZWZpbmUgTk9fTU1BUCBpZiB5b3Ugd2FudCB0byBhdm9pZCBtbWFwLgorIworIyBEZWZpbmUgTk9fUFRIUkVBRFMgaWYgeW91IGRvIG5vdCBoYXZlIG9yIGRvIG5vdCB3YW50IHRvIHVzZSBQdGhyZWFkcy4KKyMKKyMgRGVmaW5lIE5PX1BSRUFEIGlmIHlvdSBoYXZlIGEgcHJvYmxlbSB3aXRoIHByZWFkKCkgc3lzdGVtIGNhbGwgKGUuZy4KKyMgY3lnd2luLmRsbCBiZWZvcmUgdjEuNS4yMikuCisjCisjIERlZmluZSBOT19GQVNUX1dPUktJTkdfRElSRUNUT1JZIGlmIGFjY2Vzc2luZyBvYmplY3RzIGluIHBhY2sgZmlsZXMgaXMKKyMgZ2VuZXJhbGx5IGZhc3RlciBvbiB5b3VyIHBsYXRmb3JtIHRoYW4gYWNjZXNzaW5nIHRoZSB3b3JraW5nIGRpcmVjdG9yeS4KKyMKKyMgRGVmaW5lIE5PX1RSVVNUQUJMRV9GSUxFTU9ERSBpZiB5b3VyIGZpbGVzeXN0ZW0gbWF5IGNsYWltIHRvIHN1cHBvcnQKKyMgdGhlIGV4ZWN1dGFibGUgbW9kZSBiaXQsIGJ1dCBkb2Vzbid0IHJlYWxseSBkbyBzby4KKyMKKyMgRGVmaW5lIE5PX0lQVjYgaWYgeW91IGxhY2sgSVB2NiBzdXBwb3J0IGFuZCBnZXRhZGRyaW5mbygpLgorIworIyBEZWZpbmUgTk9fU09DS0FERFJfU1RPUkFHRSBpZiB5b3VyIHBsYXRmb3JtIGRvZXMgbm90IGhhdmUgc3RydWN0CisjIHNvY2thZGRyX3N0b3JhZ2UuCisjCisjIERlZmluZSBOT19JQ09OViBpZiB5b3VyIGxpYmMgZG9lcyBub3QgcHJvcGVybHkgc3VwcG9ydCBpY29udi4KKyMKKyMgRGVmaW5lIE9MRF9JQ09OViBpZiB5b3VyIGxpYnJhcnkgaGFzIGFuIG9sZCBpY29udigpLCB3aGVyZSB0aGUgc2Vjb25kCisjIChpbnB1dCBidWZmZXIgcG9pbnRlcikgcGFyYW1ldGVyIGlzIGRlY2xhcmVkIHdpdGggdHlwZSAoY29uc3QgY2hhciAqKikuCisjCisjIERlZmluZSBOT19ERUZMQVRFX0JPVU5EIGlmIHlvdXIgemxpYiBkb2VzIG5vdCBoYXZlIGRlZmxhdGVCb3VuZC4KKyMKKyMgRGVmaW5lIE5PX1JfVE9fR0NDX0xJTktFUiBpZiB5b3VyIGdjYyBkb2VzIG5vdCBsaWtlICItUi9wYXRoL2xpYiIKKyMgdGhhdCB0ZWxscyBydW50aW1lIHBhdGhzIHRvIGR5bmFtaWMgbGlicmFyaWVzOworIyAiLVdsLC1ycGF0aD0vcGF0aC9saWIiIGlzIHVzZWQgaW5zdGVhZC4KKyMKKyMgRGVmaW5lIFVTRV9OU0VDIGJlbG93IGlmIHlvdSB3YW50IHBlcmYgdG8gY2FyZSBhYm91dCBzdWItc2Vjb25kIGZpbGUgbXRpbWVzCisjIGFuZCBjdGltZXMuIE5vdGUgdGhhdCB5b3UgbmVlZCByZWNlbnQgZ2xpYmMgKGF0IGxlYXN0IDIuMi40KSBmb3IgdGhpcywgYW5kCisjIGl0IHdpbGwgQlJFQUsgWU9VUiBMT0NBTCBESUZGUyEgc2hvdy1kaWZmIGFuZCBhbnl0aGluZyB1c2luZyBpdCB3aWxsIGxpa2VseQorIyByYW5kb21seSBicmVhayB1bmxlc3MgeW91ciB1bmRlcmx5aW5nIGZpbGVzeXN0ZW0gc3VwcG9ydHMgdGhvc2Ugc3ViLXNlY29uZAorIyB0aW1lcyAobXkgZXh0MyBkb2Vzbid0KS4KKyMKKyMgRGVmaW5lIFVTRV9TVF9USU1FU1BFQyBpZiB5b3VyICJzdHJ1Y3Qgc3RhdCIgdXNlcyAic3RfY3RpbWVzcGVjIiBpbnN0ZWFkIG9mCisjICJzdF9jdGltIgorIworIyBEZWZpbmUgTk9fTlNFQyBpZiB5b3VyICJzdHJ1Y3Qgc3RhdCIgZG9lcyBub3QgaGF2ZSAic3RfY3RpbS50dl9uc2VjIgorIyBhdmFpbGFibGUuICBUaGlzIGF1dG9tYXRpY2FsbHkgdHVybnMgVVNFX05TRUMgb2ZmLgorIworIyBEZWZpbmUgVVNFX1NUREVWIGJlbG93IGlmIHlvdSB3YW50IHBlcmYgdG8gY2FyZSBhYm91dCB0aGUgdW5kZXJseWluZyBkZXZpY2UKKyMgY2hhbmdlIGJlaW5nIGNvbnNpZGVyZWQgYW4gaW5vZGUgY2hhbmdlIGZyb20gdGhlIHVwZGF0ZS1pbmRleCBwZXJzcGVjdGl2ZS4KKyMKKyMgRGVmaW5lIE5PX1NUX0JMT0NLU19JTl9TVFJVQ1RfU1RBVCBpZiB5b3VyIHBsYXRmb3JtIGRvZXMgbm90IGhhdmUgc3RfYmxvY2tzCisjIGZpZWxkIHRoYXQgY291bnRzIHRoZSBvbi1kaXNrIGZvb3RwcmludCBpbiA1MTItYnl0ZSBibG9ja3MuCisjCisjIERlZmluZSBBU0NJSURPQzggaWYgeW91IHdhbnQgdG8gZm9ybWF0IGRvY3VtZW50YXRpb24gd2l0aCBBc2NpaURvYyA4CisjCisjIERlZmluZSBET0NCT09LX1hTTF8xNzIgaWYgeW91IHdhbnQgdG8gZm9ybWF0IG1hbiBwYWdlcyB3aXRoIERvY0Jvb2sgWFNMIHYxLjcyLgorIworIyBEZWZpbmUgTk9fUEVSTF9NQUtFTUFLRVIgaWYgeW91IGNhbm5vdCB1c2UgTWFrZWZpbGVzIGdlbmVyYXRlZCBieSBwZXJsJ3MKKyMgTWFrZU1ha2VyIChlLmcuIHVzaW5nIEFjdGl2ZVN0YXRlIHVuZGVyIEN5Z3dpbikuCisjCisjIERlZmluZSBOT19QRVJMIGlmIHlvdSBkbyBub3Qgd2FudCBQZXJsIHNjcmlwdHMgb3IgbGlicmFyaWVzIGF0IGFsbC4KKyMKKyMgRGVmaW5lIElOVEVSTkFMX1FTT1JUIHRvIHVzZSBHaXQncyBpbXBsZW1lbnRhdGlvbiBvZiBxc29ydCgpLCB3aGljaAorIyBpcyBhIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiB0aGUgbWVyZ2Ugc29ydCB1c2VkIGluIGdsaWJjLiBUaGlzIGlzCisjIHJlY29tbWVuZGVkIGlmIEdpdCB0cmlnZ2VycyBPKG5eMikgYmVoYXZpb3IgaW4geW91ciBwbGF0Zm9ybSdzIHFzb3J0KCkuCisjCisjIERlZmluZSBOT19FWFRFUk5BTF9HUkVQIGlmIHlvdSBkb24ndCB3YW50ICJwZXJmIGdyZXAiIHRvIGV2ZXIgY2FsbAorIyB5b3VyIGV4dGVybmFsIGdyZXAgKGUuZy4sIGlmIHlvdXIgc3lzdGVtIGxhY2tzIGdyZXAsIGlmIGl0cyBncmVwIGlzCisjIGJyb2tlbiwgb3Igc3Bhd25pbmcgZXh0ZXJuYWwgcHJvY2VzcyBpcyBzbG93ZXIgdGhhbiBidWlsdC1pbiBncmVwIHBlcmYgaGFzKS4KKworUEVSRi1WRVJTSU9OLUZJTEU6IC5GT1JDRS1QRVJGLVZFUlNJT04tRklMRQorCUAkKFNIRUxMX1BBVEgpIHV0aWwvUEVSRi1WRVJTSU9OLUdFTgorLWluY2x1ZGUgUEVSRi1WRVJTSU9OLUZJTEUKKwordW5hbWVfUyA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtcyAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9NIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1tIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX08gOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLW8gMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQordW5hbWVfUiA6PSAkKHNoZWxsIHNoIC1jICd1bmFtZSAtciAyPi9kZXYvbnVsbCB8fCBlY2hvIG5vdCcpCit1bmFtZV9QIDo9ICQoc2hlbGwgc2ggLWMgJ3VuYW1lIC1wIDI+L2Rldi9udWxsIHx8IGVjaG8gbm90JykKK3VuYW1lX1YgOj0gJChzaGVsbCBzaCAtYyAndW5hbWUgLXYgMj4vZGV2L251bGwgfHwgZWNobyBub3QnKQorCisjIENGTEFHUyBhbmQgTERGTEFHUyBhcmUgZm9yIHRoZSB1c2VycyB0byBvdmVycmlkZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCisKK0NGTEFHUyA9IC1nZ2RiMyAtV2FsbCAtV2Vycm9yIC1Xc3RyaWN0LXByb3RvdHlwZXMgLVdtaXNzaW5nLWRlY2xhcmF0aW9ucyAtV21pc3NpbmctcHJvdG90eXBlcyAtc3RkPWdudTk5IC1XZGVjbGFyYXRpb24tYWZ0ZXItc3RhdGVtZW50IC1PNgorTERGTEFHUyA9IC1scHRocmVhZCAtbHJ0IC1sZWxmCitBTExfQ0ZMQUdTID0gJChDRkxBR1MpCitBTExfTERGTEFHUyA9ICQoTERGTEFHUykKK1NUUklQID89IHN0cmlwCisKKyMgQW1vbmcgdGhlIHZhcmlhYmxlcyBiZWxvdywgdGhlc2U6CisjICAgcGVyZmV4ZWNkaXIKKyMgICB0ZW1wbGF0ZV9kaXIKKyMgICBtYW5kaXIKKyMgICBpbmZvZGlyCisjICAgaHRtbGRpcgorIyAgIEVUQ19QRVJGQ09ORklHIChidXQgbm90IHN5c2NvbmZkaXIpCisjIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSByZWxhdGl2ZSBwYXRoIHNvbWUvd2hlcmUvZWxzZTsKKyMgdGhpcyBpcyBpbnRlcnByZXRlZCBhcyByZWxhdGl2ZSB0byAkKHByZWZpeCkgYW5kICJwZXJmIiBhdAorIyBydW50aW1lIGZpZ3VyZXMgb3V0IHdoZXJlIHRoZXkgYXJlIGJhc2VkIG9uIHRoZSBwYXRoIHRvIHRoZSBleGVjdXRhYmxlLgorIyBUaGlzIGNhbiBoZWxwIGluc3RhbGxpbmcgdGhlIHN1aXRlIGluIGEgcmVsb2NhdGFibGUgd2F5LgorCitwcmVmaXggPSAkKEhPTUUpCitiaW5kaXJfcmVsYXRpdmUgPSBiaW4KK2JpbmRpciA9ICQocHJlZml4KS8kKGJpbmRpcl9yZWxhdGl2ZSkKK21hbmRpciA9IHNoYXJlL21hbgoraW5mb2RpciA9IHNoYXJlL2luZm8KK3BlcmZleGVjZGlyID0gbGliZXhlYy9wZXJmLWNvcmUKK3NoYXJlZGlyID0gJChwcmVmaXgpL3NoYXJlCit0ZW1wbGF0ZV9kaXIgPSBzaGFyZS9wZXJmLWNvcmUvdGVtcGxhdGVzCitodG1sZGlyID0gc2hhcmUvZG9jL3BlcmYtZG9jCitpZmVxICgkKHByZWZpeCksL3VzcikKK3N5c2NvbmZkaXIgPSAvZXRjCitFVENfUEVSRkNPTkZJRyA9ICQoc3lzY29uZmRpcikvcGVyZmNvbmZpZworZWxzZQorc3lzY29uZmRpciA9ICQocHJlZml4KS9ldGMKK0VUQ19QRVJGQ09ORklHID0gZXRjL3BlcmZjb25maWcKK2VuZGlmCitsaWIgPSBsaWIKKyMgREVTVERJUj0KKworZXhwb3J0IHByZWZpeCBiaW5kaXIgc2hhcmVkaXIgc3lzY29uZmRpcgorCitDQyA9IGdjYworQVIgPSBhcgorUk0gPSBybSAtZgorVEFSID0gdGFyCitGSU5EID0gZmluZAorSU5TVEFMTCA9IGluc3RhbGwKK1JQTUJVSUxEID0gcnBtYnVpbGQKK1BUSFJFQURfTElCUyA9IC1scHRocmVhZAorCisjIHNwYXJzZSBpcyBhcmNoaXRlY3R1cmUtbmV1dHJhbCwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIHRlbGwgaXQKKyMgZXhwbGljaXRseSB3aGF0IGFyY2hpdGVjdHVyZSB0byBjaGVjayBmb3IuIEZpeCB0aGlzIHVwIGZvciB5b3Vycy4uCitTUEFSU0VfRkxBR1MgPSAtRF9fQklHX0VORElBTl9fIC1EX19wb3dlcnBjX18KKworCisKKyMjIyAtLS0gRU5EIENPTkZJR1VSQVRJT04gU0VDVElPTiAtLS0KKworIyBUaG9zZSBtdXN0IG5vdCBiZSBHTlUtc3BlY2lmaWM7IHRoZXkgYXJlIHNoYXJlZCB3aXRoIHBlcmwvIHdoaWNoIG1heQorIyBiZSBidWlsdCBieSBhIGRpZmZlcmVudCBjb21waWxlci4gKE5vdGUgdGhhdCB0aGlzIGlzIGFuIGFydGlmYWN0IG5vdworIyBidXQgaXQgc3RpbGwgbWlnaHQgYmUgbmljZSB0byBrZWVwIHRoYXQgZGlzdGluY3Rpb24uKQorQkFTSUNfQ0ZMQUdTID0KK0JBU0lDX0xERkxBR1MgPQorCisjIEd1YXJkIGFnYWluc3QgZW52aXJvbm1lbnQgdmFyaWFibGVzCitCVUlMVElOX09CSlMgPQorQlVJTFRfSU5TID0KK0NPTVBBVF9DRkxBR1MgPQorQ09NUEFUX09CSlMgPQorTElCX0ggPQorTElCX09CSlMgPQorU0NSSVBUX1BFUkwgPQorU0NSSVBUX1NIID0KK1RFU1RfUFJPR1JBTVMgPQorCisjCisjIE5vIHNjcmlwdHMgcmlnaHQgbm93OgorIworCisjIFNDUklQVF9TSCArPSBwZXJmLWFtLnNoCisKKyMKKyMgTm8gUGVybCBzY3JpcHRzIHJpZ2h0IG5vdzoKKyMKKworIyBTQ1JJUFRfUEVSTCArPSBwZXJmLWFkZC0taW50ZXJhY3RpdmUucGVybAorCitTQ1JJUFRTID0gJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKSBcCisJICAkKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKQorCisjIEVtcHR5Li4uCitFWFRSQV9QUk9HUkFNUyA9CisKKyMgLi4uIGFuZCBhbGwgdGhlIHJlc3QgdGhhdCBjb3VsZCBiZSBtb3ZlZCBvdXQgb2YgYmluZGlyIHRvIHBlcmZleGVjZGlyCitQUk9HUkFNUyArPSAkKEVYVFJBX1BST0dSQU1TKQorCisjCisjIFNpbmdsZSAncGVyZicgYmluYXJ5IHJpZ2h0IG5vdzoKKyMKK1BST0dSQU1TICs9IHBlcmYKKworIyBMaXN0IGJ1aWx0LWluIGNvbW1hbmQgJEMgd2hvc2UgaW1wbGVtZW50YXRpb24gY21kXyRDKCkgaXMgbm90IGluCisjIGJ1aWx0aW4tJEMubyBidXQgaXMgbGlua2VkIGluIGFzIHBhcnQgb2Ygc29tZSBvdGhlciBjb21tYW5kLgorIworIyBOb25lIHJpZ2h0IG5vdzoKKyMKKyMgQlVJTFRfSU5TICs9IHBlcmYtaW5pdCAkWAorCisjIHdoYXQgJ2FsbCcgd2lsbCBidWlsZCBhbmQgJ2luc3RhbGwnIHdpbGwgaW5zdGFsbCwgaW4gcGVyZmV4ZWNkaXIKK0FMTF9QUk9HUkFNUyA9ICQoUFJPR1JBTVMpICQoU0NSSVBUUykKKworIyB3aGF0ICdhbGwnIHdpbGwgYnVpbGQgYnV0IG5vdCBpbnN0YWxsIGluIHBlcmZleGVjZGlyCitPVEhFUl9QUk9HUkFNUyA9IHBlcmYkWAorCisjIFNldCBwYXRocyB0byB0b29scyBlYXJseSBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgZm9yIHZlcnNpb24gdGVzdHMuCitpZm5kZWYgU0hFTExfUEFUSAorCVNIRUxMX1BBVEggPSAvYmluL3NoCitlbmRpZgoraWZuZGVmIFBFUkxfUEFUSAorCVBFUkxfUEFUSCA9IC91c3IvYmluL3BlcmwKK2VuZGlmCisKK2V4cG9ydCBQRVJMX1BBVEgKKworTElCX0ZJTEU9bGlicGVyZi5hCisKK0xJQl9IICs9IC4uLy4uL2luY2x1ZGUvbGludXgvcGVyZl9jb3VudGVyLmgKK0xJQl9IICs9IHBlcmYuaAorTElCX0ggKz0gdXRpbC9saXN0LmgKK0xJQl9IICs9IHV0aWwvcmJ0cmVlLmgKK0xJQl9IICs9IHV0aWwvbGV2ZW5zaHRlaW4uaAorTElCX0ggKz0gdXRpbC9wYXJzZS1vcHRpb25zLmgKK0xJQl9IICs9IHV0aWwvcGFyc2UtZXZlbnRzLmgKK0xJQl9IICs9IHV0aWwvcXVvdGUuaAorTElCX0ggKz0gdXRpbC91dGlsLmgKK0xJQl9IICs9IHV0aWwvaGVscC5oCitMSUJfSCArPSB1dGlsL3N0cmJ1Zi5oCitMSUJfSCArPSB1dGlsL3N0cmluZy5oCitMSUJfSCArPSB1dGlsL3J1bi1jb21tYW5kLmgKK0xJQl9IICs9IHV0aWwvc2lnY2hhaW4uaAorTElCX0ggKz0gdXRpbC9zeW1ib2wuaAorTElCX0ggKz0gdXRpbC9jb2xvci5oCisKK0xJQl9PQkpTICs9IHV0aWwvYWJzcGF0aC5vCitMSUJfT0JKUyArPSB1dGlsL2FsaWFzLm8KK0xJQl9PQkpTICs9IHV0aWwvY29uZmlnLm8KK0xJQl9PQkpTICs9IHV0aWwvY3R5cGUubworTElCX09CSlMgKz0gdXRpbC9lbnZpcm9ubWVudC5vCitMSUJfT0JKUyArPSB1dGlsL2V4ZWNfY21kLm8KK0xJQl9PQkpTICs9IHV0aWwvaGVscC5vCitMSUJfT0JKUyArPSB1dGlsL2xldmVuc2h0ZWluLm8KK0xJQl9PQkpTICs9IHV0aWwvcGFyc2Utb3B0aW9ucy5vCitMSUJfT0JKUyArPSB1dGlsL3BhcnNlLWV2ZW50cy5vCitMSUJfT0JKUyArPSB1dGlsL3BhdGgubworTElCX09CSlMgKz0gdXRpbC9yYnRyZWUubworTElCX09CSlMgKz0gdXRpbC9ydW4tY29tbWFuZC5vCitMSUJfT0JKUyArPSB1dGlsL3F1b3RlLm8KK0xJQl9PQkpTICs9IHV0aWwvc3RyYnVmLm8KK0xJQl9PQkpTICs9IHV0aWwvc3RyaW5nLm8KK0xJQl9PQkpTICs9IHV0aWwvdXNhZ2UubworTElCX09CSlMgKz0gdXRpbC93cmFwcGVyLm8KK0xJQl9PQkpTICs9IHV0aWwvc2lnY2hhaW4ubworTElCX09CSlMgKz0gdXRpbC9zeW1ib2wubworTElCX09CSlMgKz0gdXRpbC9jb2xvci5vCitMSUJfT0JKUyArPSB1dGlsL3BhZ2VyLm8KKworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tYW5ub3RhdGUubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4taGVscC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1saXN0Lm8KK0JVSUxUSU5fT0JKUyArPSBidWlsdGluLXJlY29yZC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi1yZXBvcnQubworQlVJTFRJTl9PQkpTICs9IGJ1aWx0aW4tc3RhdC5vCitCVUlMVElOX09CSlMgKz0gYnVpbHRpbi10b3AubworCitQRVJGTElCUyA9ICQoTElCX0ZJTEUpCitFWFRMSUJTID0KKworIworIyBQbGF0Zm9ybSBzcGVjaWZpYyB0d2Vha3MKKyMKKworIyBXZSBjaG9vc2UgdG8gYXZvaWQgImlmIC4uIGVsc2UgaWYgLi4gZWxzZSAuLiBlbmRpZiBlbmRpZiIKKyMgYmVjYXVzZSBtYWludGFpbmluZyB0aGUgbmVzdGluZyB0byBtYXRjaCBpcyBhIHBhaW4uICBJZgorIyB3ZSBoYWQgImVsaWYiIHRoaW5ncyB3b3VsZCBoYXZlIGJlZW4gbXVjaCBuaWNlci4uLgorCistaW5jbHVkZSBjb25maWcubWFrLmF1dG9nZW4KKy1pbmNsdWRlIGNvbmZpZy5tYWsKKworaWZlcSAoJCh1bmFtZV9TKSxEYXJ3aW4pCisJaWZuZGVmIE5PX0ZJTksKKwkJaWZlcSAoJChzaGVsbCB0ZXN0IC1kIC9zdy9saWIgJiYgZWNobyB5KSx5KQorCQkJQkFTSUNfQ0ZMQUdTICs9IC1JL3N3L2luY2x1ZGUKKwkJCUJBU0lDX0xERkxBR1MgKz0gLUwvc3cvbGliCisJCWVuZGlmCisJZW5kaWYKKwlpZm5kZWYgTk9fREFSV0lOX1BPUlRTCisJCWlmZXEgKCQoc2hlbGwgdGVzdCAtZCAvb3B0L2xvY2FsL2xpYiAmJiBlY2hvIHkpLHkpCisJCQlCQVNJQ19DRkxBR1MgKz0gLUkvb3B0L2xvY2FsL2luY2x1ZGUKKwkJCUJBU0lDX0xERkxBR1MgKz0gLUwvb3B0L2xvY2FsL2xpYgorCQllbmRpZgorCWVuZGlmCisJUFRIUkVBRF9MSUJTID0KK2VuZGlmCisKK2lmbmRlZiBDQ19MRF9EWU5QQVRICisJaWZkZWYgTk9fUl9UT19HQ0NfTElOS0VSCisJCSMgU29tZSBnY2MgZG9lcyBub3QgYWNjZXB0IGFuZCBwYXNzIC1SIHRvIHRoZSBsaW5rZXIgdG8gc3BlY2lmeQorCQkjIHRoZSBydW50aW1lIGR5bmFtaWMgbGlicmFyeSBwYXRoLgorCQlDQ19MRF9EWU5QQVRIID0gLVdsLC1ycGF0aCwKKwllbHNlCisJCUNDX0xEX0RZTlBBVEggPSAtUgorCWVuZGlmCitlbmRpZgorCitpZmRlZiBaTElCX1BBVEgKKwlCQVNJQ19DRkxBR1MgKz0gLUkkKFpMSUJfUEFUSCkvaW5jbHVkZQorCUVYVExJQlMgKz0gLUwkKFpMSUJfUEFUSCkvJChsaWIpICQoQ0NfTERfRFlOUEFUSCkkKFpMSUJfUEFUSCkvJChsaWIpCitlbmRpZgorRVhUTElCUyArPSAtbHoKKworaWZkZWYgTkVFRFNfU09DS0VUCisJRVhUTElCUyArPSAtbHNvY2tldAorZW5kaWYKK2lmZGVmIE5FRURTX05TTAorCUVYVExJQlMgKz0gLWxuc2wKK2VuZGlmCitpZmRlZiBOT19EX1RZUEVfSU5fRElSRU5UCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fRF9UWVBFX0lOX0RJUkVOVAorZW5kaWYKK2lmZGVmIE5PX0RfSU5PX0lOX0RJUkVOVAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0RfSU5PX0lOX0RJUkVOVAorZW5kaWYKK2lmZGVmIE5PX1NUX0JMT0NLU19JTl9TVFJVQ1RfU1RBVAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX1NUX0JMT0NLU19JTl9TVFJVQ1RfU1RBVAorZW5kaWYKK2lmZGVmIFVTRV9OU0VDCisJQkFTSUNfQ0ZMQUdTICs9IC1EVVNFX05TRUMKK2VuZGlmCitpZmRlZiBVU0VfU1RfVElNRVNQRUMKKwlCQVNJQ19DRkxBR1MgKz0gLURVU0VfU1RfVElNRVNQRUMKK2VuZGlmCitpZmRlZiBOT19OU0VDCisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fTlNFQworZW5kaWYKK2lmZGVmIE5PX0M5OV9GT1JNQVQKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19DOTlfRk9STUFUCitlbmRpZgoraWZkZWYgU05QUklOVEZfUkVUVVJOU19CT0dVUworCUNPTVBBVF9DRkxBR1MgKz0gLURTTlBSSU5URl9SRVRVUk5TX0JPR1VTCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3NucHJpbnRmLm8KK2VuZGlmCitpZmRlZiBGUkVBRF9SRUFEU19ESVJFQ1RPUklFUworCUNPTVBBVF9DRkxBR1MgKz0gLURGUkVBRF9SRUFEU19ESVJFQ1RPUklFUworCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9mb3Blbi5vCitlbmRpZgoraWZkZWYgTk9fU1lNTElOS19IRUFECisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fU1lNTElOS19IRUFECitlbmRpZgoraWZkZWYgTk9fU1RSQ0FTRVNUUgorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJDQVNFU1RSCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3N0cmNhc2VzdHIubworZW5kaWYKK2lmZGVmIE5PX1NUUlRPVU1BWAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJUT1VNQVgKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc3RydG91bWF4Lm8KK2VuZGlmCitpZmRlZiBOT19TVFJUT1VMTAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TVFJUT1VMTAorZW5kaWYKK2lmZGVmIE5PX1NFVEVOVgorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19TRVRFTlYKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvc2V0ZW52Lm8KK2VuZGlmCitpZmRlZiBOT19NS0RURU1QCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX01LRFRFTVAKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvbWtkdGVtcC5vCitlbmRpZgoraWZkZWYgTk9fVU5TRVRFTlYKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fVU5TRVRFTlYKKwlDT01QQVRfT0JKUyArPSBjb21wYXQvdW5zZXRlbnYubworZW5kaWYKK2lmZGVmIE5PX1NZU19TRUxFQ1RfSAorCUJBU0lDX0NGTEFHUyArPSAtRE5PX1NZU19TRUxFQ1RfSAorZW5kaWYKK2lmZGVmIE5PX01NQVAKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fTU1BUAorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9tbWFwLm8KK2Vsc2UKKwlpZmRlZiBVU0VfV0lOMzJfTU1BUAorCQlDT01QQVRfQ0ZMQUdTICs9IC1EVVNFX1dJTjMyX01NQVAKKwkJQ09NUEFUX09CSlMgKz0gY29tcGF0L3dpbjMybW1hcC5vCisJZW5kaWYKK2VuZGlmCitpZmRlZiBOT19QUkVBRAorCUNPTVBBVF9DRkxBR1MgKz0gLUROT19QUkVBRAorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9wcmVhZC5vCitlbmRpZgoraWZkZWYgTk9fRkFTVF9XT1JLSU5HX0RJUkVDVE9SWQorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0ZBU1RfV09SS0lOR19ESVJFQ1RPUlkKK2VuZGlmCitpZmRlZiBOT19UUlVTVEFCTEVfRklMRU1PREUKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19UUlVTVEFCTEVfRklMRU1PREUKK2VuZGlmCitpZmRlZiBOT19JUFY2CisJQkFTSUNfQ0ZMQUdTICs9IC1ETk9fSVBWNgorZW5kaWYKK2lmZGVmIE5PX1VJTlRNQVhfVAorCUJBU0lDX0NGTEFHUyArPSAtRHVpbnRtYXhfdD11aW50MzJfdAorZW5kaWYKK2lmZGVmIE5PX1NPQ0tBRERSX1NUT1JBR0UKK2lmZGVmIE5PX0lQVjYKKwlCQVNJQ19DRkxBR1MgKz0gLURzb2NrYWRkcl9zdG9yYWdlPXNvY2thZGRyX2luCitlbHNlCisJQkFTSUNfQ0ZMQUdTICs9IC1Ec29ja2FkZHJfc3RvcmFnZT1zb2NrYWRkcl9pbjYKK2VuZGlmCitlbmRpZgoraWZkZWYgTk9fSU5FVF9OVE9QCisJTElCX09CSlMgKz0gY29tcGF0L2luZXRfbnRvcC5vCitlbmRpZgoraWZkZWYgTk9fSU5FVF9QVE9OCisJTElCX09CSlMgKz0gY29tcGF0L2luZXRfcHRvbi5vCitlbmRpZgorCitpZmRlZiBOT19JQ09OVgorCUJBU0lDX0NGTEFHUyArPSAtRE5PX0lDT05WCitlbmRpZgorCitpZmRlZiBPTERfSUNPTlYKKwlCQVNJQ19DRkxBR1MgKz0gLURPTERfSUNPTlYKK2VuZGlmCisKK2lmZGVmIE5PX0RFRkxBVEVfQk9VTkQKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19ERUZMQVRFX0JPVU5ECitlbmRpZgorCitpZmRlZiBQUENfU0hBMQorCVNIQTFfSEVBREVSID0gInBwYy9zaGExLmgiCisJTElCX09CSlMgKz0gcHBjL3NoYTEubyBwcGMvc2hhMXBwYy5vCitlbHNlCitpZmRlZiBBUk1fU0hBMQorCVNIQTFfSEVBREVSID0gImFybS9zaGExLmgiCisJTElCX09CSlMgKz0gYXJtL3NoYTEubyBhcm0vc2hhMV9hcm0ubworZWxzZQoraWZkZWYgTU9aSUxMQV9TSEExCisJU0hBMV9IRUFERVIgPSAibW96aWxsYS1zaGExL3NoYTEuaCIKKwlMSUJfT0JKUyArPSBtb3ppbGxhLXNoYTEvc2hhMS5vCitlbHNlCisJU0hBMV9IRUFERVIgPSA8b3BlbnNzbC9zaGEuaD4KKwlFWFRMSUJTICs9ICQoTElCXzRfQ1JZUFRPKQorZW5kaWYKK2VuZGlmCitlbmRpZgoraWZkZWYgTk9fUEVSTF9NQUtFTUFLRVIKKwlleHBvcnQgTk9fUEVSTF9NQUtFTUFLRVIKK2VuZGlmCitpZmRlZiBOT19IU1RSRVJST1IKKwlDT01QQVRfQ0ZMQUdTICs9IC1ETk9fSFNUUkVSUk9SCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L2hzdHJlcnJvci5vCitlbmRpZgoraWZkZWYgTk9fTUVNTUVNCisJQ09NUEFUX0NGTEFHUyArPSAtRE5PX01FTU1FTQorCUNPTVBBVF9PQkpTICs9IGNvbXBhdC9tZW1tZW0ubworZW5kaWYKK2lmZGVmIElOVEVSTkFMX1FTT1JUCisJQ09NUEFUX0NGTEFHUyArPSAtRElOVEVSTkFMX1FTT1JUCisJQ09NUEFUX09CSlMgKz0gY29tcGF0L3Fzb3J0Lm8KK2VuZGlmCitpZmRlZiBSVU5USU1FX1BSRUZJWAorCUNPTVBBVF9DRkxBR1MgKz0gLURSVU5USU1FX1BSRUZJWAorZW5kaWYKKworaWZkZWYgRElSX0hBU19CU0RfR1JPVVBfU0VNQU5USUNTCisJQ09NUEFUX0NGTEFHUyArPSAtRERJUl9IQVNfQlNEX0dST1VQX1NFTUFOVElDUworZW5kaWYKK2lmZGVmIE5PX0VYVEVSTkFMX0dSRVAKKwlCQVNJQ19DRkxBR1MgKz0gLUROT19FWFRFUk5BTF9HUkVQCitlbmRpZgorCitpZmVxICgkKFBFUkxfUEFUSCksKQorTk9fUEVSTD1Ob1RoYW5rcworZW5kaWYKKworUVVJRVRfU1VCRElSMCAgPSArJChNQUtFKSAtQyAjIHNwYWNlIHRvIHNlcGFyYXRlIC1DIGFuZCBzdWJkaXIKK1FVSUVUX1NVQkRJUjEgID0KKworaWZuZXEgKCQoZmluZHN0cmluZyAkKE1BS0VGTEFHUyksdyksdykKK1BSSU5UX0RJUiA9IC0tbm8tcHJpbnQtZGlyZWN0b3J5CitlbHNlICMgIm1ha2UgLXciCitOT19TVUJESVIgPSA6CitlbmRpZgorCitpZm5lcSAoJChmaW5kc3RyaW5nICQoTUFLRUZMQUdTKSxzKSxzKQoraWZuZGVmIFYKKwlRVUlFVF9DQyAgICAgICA9IEBlY2hvICcgICAnIENDICRAOworCVFVSUVUX0FSICAgICAgID0gQGVjaG8gJyAgICcgQVIgJEA7CisJUVVJRVRfTElOSyAgICAgPSBAZWNobyAnICAgJyBMSU5LICRAOworCVFVSUVUX0JVSUxUX0lOID0gQGVjaG8gJyAgICcgQlVJTFRJTiAkQDsKKwlRVUlFVF9HRU4gICAgICA9IEBlY2hvICcgICAnIEdFTiAkQDsKKwlRVUlFVF9TVUJESVIwICA9ICtAc3ViZGlyPQorCVFVSUVUX1NVQkRJUjEgID0gOyQoTk9fU1VCRElSKSBlY2hvICcgICAnIFNVQkRJUiAkJHN1YmRpcjsgXAorCQkJICQoTUFLRSkgJChQUklOVF9ESVIpIC1DICQkc3ViZGlyCisJZXhwb3J0IFYKKwlleHBvcnQgUVVJRVRfR0VOCisJZXhwb3J0IFFVSUVUX0JVSUxUX0lOCitlbmRpZgorZW5kaWYKKworaWZkZWYgQVNDSUlET0M4CisJZXhwb3J0IEFTQ0lJRE9DOAorZW5kaWYKKworIyBTaGVsbCBxdW90ZSAoZG8gbm90IHVzZSAkKGNhbGwpIHRvIGFjY29tbW9kYXRlIGFuY2llbnQgc2V0dXBzKTsKKworU0hBMV9IRUFERVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIQTFfSEVBREVSKSkKK0VUQ19QRVJGQ09ORklHX1NRID0gJChzdWJzdCAnLCdcJycsJChFVENfUEVSRkNPTkZJRykpCisKK0RFU1RESVJfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKERFU1RESVIpKQorYmluZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJChiaW5kaXIpKQorYmluZGlyX3JlbGF0aXZlX1NRID0gJChzdWJzdCAnLCdcJycsJChiaW5kaXJfcmVsYXRpdmUpKQorbWFuZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJChtYW5kaXIpKQoraW5mb2Rpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoaW5mb2RpcikpCitwZXJmZXhlY2Rpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQocGVyZmV4ZWNkaXIpKQordGVtcGxhdGVfZGlyX1NRID0gJChzdWJzdCAnLCdcJycsJCh0ZW1wbGF0ZV9kaXIpKQoraHRtbGRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQoaHRtbGRpcikpCitwcmVmaXhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKHByZWZpeCkpCisKK1NIRUxMX1BBVEhfU1EgPSAkKHN1YnN0ICcsJ1wnJywkKFNIRUxMX1BBVEgpKQorUEVSTF9QQVRIX1NRID0gJChzdWJzdCAnLCdcJycsJChQRVJMX1BBVEgpKQorCitMSUJTID0gJChQRVJGTElCUykgJChFWFRMSUJTKQorCitCQVNJQ19DRkxBR1MgKz0gLURTSEExX0hFQURFUj0nJChTSEExX0hFQURFUl9TUSknIFwKKwkkKENPTVBBVF9DRkxBR1MpCitMSUJfT0JKUyArPSAkKENPTVBBVF9PQkpTKQorCitBTExfQ0ZMQUdTICs9ICQoQkFTSUNfQ0ZMQUdTKQorQUxMX0xERkxBR1MgKz0gJChCQVNJQ19MREZMQUdTKQorCitleHBvcnQgVEFSIElOU1RBTEwgREVTVERJUiBTSEVMTF9QQVRICisKKworIyMjIEJ1aWxkIHJ1bGVzCisKK1NIRUxMID0gJChTSEVMTF9QQVRIKQorCithbGw6OiBzaGVsbF9jb21wYXRpYmlsaXR5X3Rlc3QgJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSAkKE9USEVSX1BST0dSQU1TKSBQRVJGLUJVSUxELU9QVElPTlMKK2lmbmVxICgsJFgpCisJJChmb3JlYWNoIHAsJChwYXRzdWJzdCAlJFgsJSwkKGZpbHRlciAlJFgsJChBTExfUFJPR1JBTVMpICQoQlVJTFRfSU5TKSBwZXJmJFgpKSwgdGVzdCAnJHAnIC1lZiAnJHAkWCcgfHwgJChSTSkgJyRwJzspCitlbmRpZgorCithbGw6OgorCitwbGVhc2Vfc2V0X1NIRUxMX1BBVEhfdG9fYV9tb3JlX21vZGVybl9zaGVsbDoKKwlAJCQoOikKKworc2hlbGxfY29tcGF0aWJpbGl0eV90ZXN0OiBwbGVhc2Vfc2V0X1NIRUxMX1BBVEhfdG9fYV9tb3JlX21vZGVybl9zaGVsbAorCitzdHJpcDogJChQUk9HUkFNUykgcGVyZiRYCisJJChTVFJJUCkgJChTVFJJUF9PUFRTKSAkKFBST0dSQU1TKSBwZXJmJFgKKworcGVyZi5vOiBwZXJmLmMgY29tbW9uLWNtZHMuaCBQRVJGLUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLURQRVJGX1ZFUlNJT049JyIkKFBFUkZfVkVSU0lPTikiJyBcCisJCSctRFBFUkZfSFRNTF9QQVRIPSIkKGh0bWxkaXJfU1EpIicgXAorCQkkKEFMTF9DRkxBR1MpIC1jICQoZmlsdGVyICUuYywkXikKKworcGVyZiRYOiBwZXJmLm8gJChCVUlMVElOX09CSlMpICQoUEVSRkxJQlMpCisJJChRVUlFVF9MSU5LKSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgcGVyZi5vIFwKKwkJJChCVUlMVElOX09CSlMpICQoQUxMX0xERkxBR1MpICQoTElCUykKKworYnVpbHRpbi1oZWxwLm86IGJ1aWx0aW4taGVscC5jIGNvbW1vbi1jbWRzLmggUEVSRi1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSBcCisJCSctRFBFUkZfSFRNTF9QQVRIPSIkKGh0bWxkaXJfU1EpIicgXAorCQknLURQRVJGX01BTl9QQVRIPSIkKG1hbmRpcl9TUSkiJyBcCisJCSctRFBFUkZfSU5GT19QQVRIPSIkKGluZm9kaXJfU1EpIicgJDwKKworJChCVUlMVF9JTlMpOiBwZXJmJFgKKwkkKFFVSUVUX0JVSUxUX0lOKSQoUk0pICRAICYmIFwKKwlsbiBwZXJmJFggJEAgMj4vZGV2L251bGwgfHwgXAorCWxuIC1zIHBlcmYkWCAkQCAyPi9kZXYvbnVsbCB8fCBcCisJY3AgcGVyZiRYICRACisKK2NvbW1vbi1jbWRzLmg6IHV0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaCBjb21tYW5kLWxpc3QudHh0CisKK2NvbW1vbi1jbWRzLmg6ICQod2lsZGNhcmQgRG9jdW1lbnRhdGlvbi9wZXJmLSoudHh0KQorCSQoUVVJRVRfR0VOKXV0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaCA+ICRAKyAmJiBtdiAkQCsgJEAKKworJChwYXRzdWJzdCAlLnNoLCUsJChTQ1JJUFRfU0gpKSA6ICUgOiAlLnNoCisJJChRVUlFVF9HRU4pJChSTSkgJEAgJEArICYmIFwKKwlzZWQgLWUgJzFzfCMhLiovc2h8IyEkKFNIRUxMX1BBVEhfU1EpfCcgXAorCSAgICAtZSAnc3xAU0hFTExfUEFUSEB8JChTSEVMTF9QQVRIX1NRKXwnIFwKKwkgICAgLWUgJ3N8QEBQRVJMQEB8JChQRVJMX1BBVEhfU1EpfGcnIFwKKwkgICAgLWUgJ3MvQEBQRVJGX1ZFUlNJT05AQC8kKFBFUkZfVkVSU0lPTikvZycgXAorCSAgICAtZSAncy9AQE5PX0NVUkxAQC8kKE5PX0NVUkwpL2cnIFwKKwkgICAgJEAuc2ggPiRAKyAmJiBcCisJY2htb2QgK3ggJEArICYmIFwKKwltdiAkQCsgJEAKKworY29uZmlndXJlOiBjb25maWd1cmUuYWMKKwkkKFFVSUVUX0dFTikkKFJNKSAkQCAkPCsgJiYgXAorCXNlZCAtZSAncy9AQFBFUkZfVkVSU0lPTkBALyQoUEVSRl9WRVJTSU9OKS9nJyBcCisJICAgICQ8ID4gJDwrICYmIFwKKwlhdXRvY29uZiAtbyAkQCAkPCsgJiYgXAorCSQoUk0pICQ8KworCisjIFRoZXNlIGNhbiByZWNvcmQgUEVSRl9WRVJTSU9OCitwZXJmLm8gcGVyZi5zcGVjIFwKKwkkKHBhdHN1YnN0ICUuc2gsJSwkKFNDUklQVF9TSCkpIFwKKwkkKHBhdHN1YnN0ICUucGVybCwlLCQoU0NSSVBUX1BFUkwpKSBcCisJOiBQRVJGLVZFUlNJT04tRklMRQorCislLm86ICUuYyBQRVJGLUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpICQ8CislLnM6ICUuYyBQRVJGLUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLVMgJChBTExfQ0ZMQUdTKSAkPAorJS5vOiAlLlMKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAkPAorCit1dGlsL2V4ZWNfY21kLm86IHV0aWwvZXhlY19jbWQuYyBQRVJGLUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpIFwKKwkJJy1EUEVSRl9FWEVDX1BBVEg9IiQocGVyZmV4ZWNkaXJfU1EpIicgXAorCQknLURCSU5ESVI9IiQoYmluZGlyX3JlbGF0aXZlX1NRKSInIFwKKwkJJy1EUFJFRklYPSIkKHByZWZpeF9TUSkiJyBcCisJCSQ8CisKK2J1aWx0aW4taW5pdC1kYi5vOiBidWlsdGluLWluaXQtZGIuYyBQRVJGLUNGTEFHUworCSQoUVVJRVRfQ0MpJChDQykgLW8gJCoubyAtYyAkKEFMTF9DRkxBR1MpIC1EREVGQVVMVF9QRVJGX1RFTVBMQVRFX0RJUj0nIiQodGVtcGxhdGVfZGlyX1NRKSInICQ8CisKK3V0aWwvY29uZmlnLm86IHV0aWwvY29uZmlnLmMgUEVSRi1DRkxBR1MKKwkkKFFVSUVUX0NDKSQoQ0MpIC1vICQqLm8gLWMgJChBTExfQ0ZMQUdTKSAtREVUQ19QRVJGQ09ORklHPSciJChFVENfUEVSRkNPTkZJR19TUSkiJyAkPAorCitwZXJmLSUkWDogJS5vICQoUEVSRkxJQlMpCisJJChRVUlFVF9MSU5LKSQoQ0MpICQoQUxMX0NGTEFHUykgLW8gJEAgJChBTExfTERGTEFHUykgJChmaWx0ZXIgJS5vLCReKSAkKExJQlMpCisKKyQoTElCX09CSlMpICQoQlVJTFRJTl9PQkpTKTogJChMSUJfSCkKKyQocGF0c3Vic3QgcGVyZi0lJFgsJS5vLCQoUFJPR1JBTVMpKTogJChMSUJfSCkgJCh3aWxkY2FyZCAqLyouaCkKK2J1aWx0aW4tcmV2ZXJ0Lm8gd3Qtc3RhdHVzLm86IHd0LXN0YXR1cy5oCisKKyQoTElCX0ZJTEUpOiAkKExJQl9PQkpTKQorCSQoUVVJRVRfQVIpJChSTSkgJEAgJiYgJChBUikgcmNzICRAICQoTElCX09CSlMpCisKK2RvYzoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gYWxsCisKK21hbjoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gbWFuCisKK2h0bWw6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGh0bWwKKworaW5mbzoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gaW5mbworCitwZGY6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIHBkZgorCitUQUdTOgorCSQoUk0pIFRBR1MKKwkkKEZJTkQpIC4gLW5hbWUgJyouW2hjU10nIC1wcmludCB8IHhhcmdzIGV0YWdzIC1hCisKK3RhZ3M6CisJJChSTSkgdGFncworCSQoRklORCkgLiAtbmFtZSAnKi5baGNTXScgLXByaW50IHwgeGFyZ3MgY3RhZ3MgLWEKKworY3Njb3BlOgorCSQoUk0pIGNzY29wZSoKKwkkKEZJTkQpIC4gLW5hbWUgJyouW2hjU10nIC1wcmludCB8IHhhcmdzIGNzY29wZSAtYgorCisjIyMgRGV0ZWN0IHByZWZpeCBjaGFuZ2VzCitUUkFDS19DRkxBR1MgPSAkKHN1YnN0ICcsJ1wnJywkKEFMTF9DRkxBR1MpKTpcCisgICAgICAgICAgICAgJChiaW5kaXJfU1EpOiQocGVyZmV4ZWNkaXJfU1EpOiQodGVtcGxhdGVfZGlyX1NRKTokKHByZWZpeF9TUSkKKworUEVSRi1DRkxBR1M6IC5GT1JDRS1QRVJGLUNGTEFHUworCUBGTEFHUz0nJChUUkFDS19DRkxBR1MpJzsgXAorCSAgICBpZiB0ZXN0IHgiJCRGTEFHUyIgIT0geCJgY2F0IFBFUkYtQ0ZMQUdTIDI+L2Rldi9udWxsYCIgOyB0aGVuIFwKKwkJZWNobyAxPiYyICIgICAgKiBuZXcgYnVpbGQgZmxhZ3Mgb3IgcHJlZml4IjsgXAorCQllY2hvICIkJEZMQUdTIiA+UEVSRi1DRkxBR1M7IFwKKyAgICAgICAgICAgIGZpCisKKyMgV2UgbmVlZCB0byBhcHBseSBzcSB0d2ljZSwgb25jZSB0byBwcm90ZWN0IGZyb20gdGhlIHNoZWxsCisjIHRoYXQgcnVucyBQRVJGLUJVSUxELU9QVElPTlMsIGFuZCB0aGVuIGFnYWluIHRvIHByb3RlY3QgaXQKKyMgYW5kIHRoZSBmaXJzdCBsZXZlbCBxdW90aW5nIGZyb20gdGhlIHNoZWxsIHRoYXQgcnVucyAiZWNobyIuCitQRVJGLUJVSUxELU9QVElPTlM6IC5GT1JDRS1QRVJGLUJVSUxELU9QVElPTlMKKwlAZWNobyBTSEVMTF9QQVRIPVwnJyQoc3Vic3QgJywnXCcnLCQoU0hFTExfUEFUSF9TUSkpJ1wnID4kQAorCUBlY2hvIFRBUj1cJyckKHN1YnN0ICcsJ1wnJywkKHN1YnN0ICcsJ1wnJywkKFRBUikpKSdcJyA+PiRACisJQGVjaG8gTk9fQ1VSTD1cJyckKHN1YnN0ICcsJ1wnJywkKHN1YnN0ICcsJ1wnJywkKE5PX0NVUkwpKSknXCcgPj4kQAorCUBlY2hvIE5PX1BFUkw9XCcnJChzdWJzdCAnLCdcJycsJChzdWJzdCAnLCdcJycsJChOT19QRVJMKSkpJ1wnID4+JEAKKworIyMjIFRlc3RpbmcgcnVsZXMKKworIworIyBOb25lIHJpZ2h0IG5vdzoKKyMKKyMgVEVTVF9QUk9HUkFNUyArPSB0ZXN0LXNvbWV0aGluZyRYCisKK2FsbDo6ICQoVEVTVF9QUk9HUkFNUykKKworIyBHTlUgbWFrZSBzdXBwb3J0cyBleHBvcnRpbmcgYWxsIHZhcmlhYmxlcyBieSAiZXhwb3J0IiB3aXRob3V0IHBhcmFtZXRlcnMuCisjIEhvd2V2ZXIsIHRoZSBlbnZpcm9ubWVudCBnZXRzIHF1aXRlIGJpZywgYW5kIHNvbWUgcHJvZ3JhbXMgaGF2ZSBwcm9ibGVtcworIyB3aXRoIHRoYXQuCisKK2V4cG9ydCBOT19TVk5fVEVTVFMKKworY2hlY2s6IGNvbW1vbi1jbWRzLmgKKwlpZiBzcGFyc2U7IFwKKwl0aGVuIFwKKwkJZm9yIGkgaW4gKi5jICovKi5jOyBcCisJCWRvIFwKKwkJCXNwYXJzZSAkKEFMTF9DRkxBR1MpICQoU1BBUlNFX0ZMQUdTKSAkJGkgfHwgZXhpdDsgXAorCQlkb25lOyBcCisJZWxzZSBcCisJCWVjaG8gMj4mMSAiRGlkIHlvdSBtZWFuICdtYWtlIHRlc3QnPyI7IFwKKwkJZXhpdCAxOyBcCisJZmkKKworcmVtb3ZlLWRhc2hlczoKKwkuL2ZpeHVwLWJ1aWx0aW5zICQoQlVJTFRfSU5TKSAkKFBST0dSQU1TKSAkKFNDUklQVFMpCisKKyMjIyBJbnN0YWxsYXRpb24gcnVsZXMKKworaWZuZXEgKCQoZmlsdGVyIC8lLCQoZmlyc3R3b3JkICQodGVtcGxhdGVfZGlyKSkpLCkKK3RlbXBsYXRlX2luc3RkaXIgPSAkKHRlbXBsYXRlX2RpcikKK2Vsc2UKK3RlbXBsYXRlX2luc3RkaXIgPSAkKHByZWZpeCkvJCh0ZW1wbGF0ZV9kaXIpCitlbmRpZgorZXhwb3J0IHRlbXBsYXRlX2luc3RkaXIKKworaWZuZXEgKCQoZmlsdGVyIC8lLCQoZmlyc3R3b3JkICQocGVyZmV4ZWNkaXIpKSksKQorcGVyZmV4ZWNfaW5zdGRpciA9ICQocGVyZmV4ZWNkaXIpCitlbHNlCitwZXJmZXhlY19pbnN0ZGlyID0gJChwcmVmaXgpLyQocGVyZmV4ZWNkaXIpCitlbmRpZgorcGVyZmV4ZWNfaW5zdGRpcl9TUSA9ICQoc3Vic3QgJywnXCcnLCQocGVyZmV4ZWNfaW5zdGRpcikpCitleHBvcnQgcGVyZmV4ZWNfaW5zdGRpcgorCitpbnN0YWxsOiBhbGwKKwkkKElOU1RBTEwpIC1kIC1tIDc1NSAnJChERVNURElSX1NRKSQoYmluZGlyX1NRKScKKwkkKElOU1RBTEwpIHBlcmYkWCAnJChERVNURElSX1NRKSQoYmluZGlyX1NRKScKK2lmZGVmIEJVSUxUX0lOUworCSQoSU5TVEFMTCkgLWQgLW0gNzU1ICckKERFU1RESVJfU1EpJChwZXJmZXhlY19pbnN0ZGlyX1NRKScKKwkkKElOU1RBTEwpICQoQlVJTFRfSU5TKSAnJChERVNURElSX1NRKSQocGVyZmV4ZWNfaW5zdGRpcl9TUSknCitpZm5lcSAoLCRYKQorCSQoZm9yZWFjaCBwLCQocGF0c3Vic3QgJSRYLCUsJChmaWx0ZXIgJSRYLCQoQUxMX1BST0dSQU1TKSAkKEJVSUxUX0lOUykgcGVyZiRYKSksICQoUk0pICckKERFU1RESVJfU1EpJChwZXJmZXhlY19pbnN0ZGlyX1NRKS8kcCc7KQorZW5kaWYKK2VuZGlmCisKK2luc3RhbGwtZG9jOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBpbnN0YWxsCisKK2luc3RhbGwtbWFuOgorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbiBpbnN0YWxsLW1hbgorCitpbnN0YWxsLWh0bWw6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGluc3RhbGwtaHRtbAorCitpbnN0YWxsLWluZm86CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIGluc3RhbGwtaW5mbworCitpbnN0YWxsLXBkZjoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gaW5zdGFsbC1wZGYKKworcXVpY2staW5zdGFsbC1kb2M6CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIHF1aWNrLWluc3RhbGwKKworcXVpY2staW5zdGFsbC1tYW46CisJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIHF1aWNrLWluc3RhbGwtbWFuCisKK3F1aWNrLWluc3RhbGwtaHRtbDoKKwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gcXVpY2staW5zdGFsbC1odG1sCisKKworIyMjIE1haW50YWluZXIncyBkaXN0IHJ1bGVzCisjCisjIE5vbmUgcmlnaHQgbm93CisjCisjCisjIHBlcmYuc3BlYzogcGVyZi5zcGVjLmluCisjCXNlZCAtZSAncy9AQFZFUlNJT05AQC8kKFBFUkZfVkVSU0lPTikvZycgPCAkPCA+ICRAKworIwltdiAkQCsgJEAKKyMKKyMgUEVSRl9UQVJOQU1FPXBlcmYtJChQRVJGX1ZFUlNJT04pCisjIGRpc3Q6IHBlcmYuc3BlYyBwZXJmLWFyY2hpdmUkKFgpIGNvbmZpZ3VyZQorIwkuL3BlcmYtYXJjaGl2ZSAtLWZvcm1hdD10YXIgXAorIwkJLS1wcmVmaXg9JChQRVJGX1RBUk5BTUUpLyBIRUFEXnt0cmVlfSA+ICQoUEVSRl9UQVJOQU1FKS50YXIKKyMJQG1rZGlyIC1wICQoUEVSRl9UQVJOQU1FKQorIwlAY3AgcGVyZi5zcGVjIGNvbmZpZ3VyZSAkKFBFUkZfVEFSTkFNRSkKKyMJQGVjaG8gJChQRVJGX1ZFUlNJT04pID4gJChQRVJGX1RBUk5BTUUpL3ZlcnNpb24KKyMJJChUQVIpIHJmICQoUEVSRl9UQVJOQU1FKS50YXIgXAorIwkJJChQRVJGX1RBUk5BTUUpL3BlcmYuc3BlYyBcCisjCQkkKFBFUkZfVEFSTkFNRSkvY29uZmlndXJlIFwKKyMJCSQoUEVSRl9UQVJOQU1FKS92ZXJzaW9uCisjCUAkKFJNKSAtciAkKFBFUkZfVEFSTkFNRSkKKyMJZ3ppcCAtZiAtOSAkKFBFUkZfVEFSTkFNRSkudGFyCisjCisjIGh0bWxkb2NzID0gcGVyZi1odG1sZG9jcy0kKFBFUkZfVkVSU0lPTikKKyMgbWFucGFnZXMgPSBwZXJmLW1hbnBhZ2VzLSQoUEVSRl9WRVJTSU9OKQorIyBkaXN0LWRvYzoKKyMJJChSTSkgLXIgLmRvYy10bXAtZGlyCisjCW1rZGlyIC5kb2MtdG1wLWRpcgorIwkkKE1BS0UpIC1DIERvY3VtZW50YXRpb24gV0VCRE9DX0RFU1Q9Li4vLmRvYy10bXAtZGlyIGluc3RhbGwtd2ViZG9jCisjCWNkIC5kb2MtdG1wLWRpciAmJiAkKFRBUikgY2YgLi4vJChodG1sZG9jcykudGFyIC4KKyMJZ3ppcCAtbiAtOSAtZiAkKGh0bWxkb2NzKS50YXIKKyMJOgorIwkkKFJNKSAtciAuZG9jLXRtcC1kaXIKKyMJbWtkaXIgLXAgLmRvYy10bXAtZGlyL21hbjEgLmRvYy10bXAtZGlyL21hbjUgLmRvYy10bXAtZGlyL21hbjcKKyMJJChNQUtFKSAtQyBEb2N1bWVudGF0aW9uIERFU1RESVI9Li8gXAorIwkJbWFuMWRpcj0uLi8uZG9jLXRtcC1kaXIvbWFuMSBcCisjCQltYW41ZGlyPS4uLy5kb2MtdG1wLWRpci9tYW41IFwKKyMJCW1hbjdkaXI9Li4vLmRvYy10bXAtZGlyL21hbjcgXAorIwkJaW5zdGFsbAorIwljZCAuZG9jLXRtcC1kaXIgJiYgJChUQVIpIGNmIC4uLyQobWFucGFnZXMpLnRhciAuCisjCWd6aXAgLW4gLTkgLWYgJChtYW5wYWdlcykudGFyCisjCSQoUk0pIC1yIC5kb2MtdG1wLWRpcgorIworIyBycG06IGRpc3QKKyMJJChSUE1CVUlMRCkgLXRhICQoUEVSRl9UQVJOQU1FKS50YXIuZ3oKKworIyMjIENsZWFuaW5nIHJ1bGVzCisKK2Rpc3RjbGVhbjogY2xlYW4KKyMJJChSTSkgY29uZmlndXJlCisKK2NsZWFuOgorCSQoUk0pICoubyAqLyoubyAkKExJQl9GSUxFKQorCSQoUk0pICQoQUxMX1BST0dSQU1TKSAkKEJVSUxUX0lOUykgcGVyZiRYCisJJChSTSkgJChURVNUX1BST0dSQU1TKQorCSQoUk0pICouc3BlYyAqLnB5YyAqLnB5byAqLyoucHljICovKi5weW8gY29tbW9uLWNtZHMuaCBUQUdTIHRhZ3MgY3Njb3BlKgorCSQoUk0pIC1yIGF1dG9tNHRlLmNhY2hlCisJJChSTSkgY29uZmlnLmxvZyBjb25maWcubWFrLmF1dG9nZW4gY29uZmlnLm1hay5hcHBlbmQgY29uZmlnLnN0YXR1cyBjb25maWcuY2FjaGUKKwkkKFJNKSAtciAkKFBFUkZfVEFSTkFNRSkgLmRvYy10bXAtZGlyCisJJChSTSkgJChQRVJGX1RBUk5BTUUpLnRhci5neiBwZXJmLWNvcmVfJChQRVJGX1ZFUlNJT04pLSoudGFyLmd6CisJJChSTSkgJChodG1sZG9jcykudGFyLmd6ICQobWFucGFnZXMpLnRhci5negorCSQoTUFLRSkgLUMgRG9jdW1lbnRhdGlvbi8gY2xlYW4KKwkkKFJNKSBQRVJGLVZFUlNJT04tRklMRSBQRVJGLUNGTEFHUyBQRVJGLUJVSUxELU9QVElPTlMKKworLlBIT05ZOiBhbGwgaW5zdGFsbCBjbGVhbiBzdHJpcAorLlBIT05ZOiBzaGVsbF9jb21wYXRpYmlsaXR5X3Rlc3QgcGxlYXNlX3NldF9TSEVMTF9QQVRIX3RvX2FfbW9yZV9tb2Rlcm5fc2hlbGwKKy5QSE9OWTogLkZPUkNFLVBFUkYtVkVSU0lPTi1GSUxFIFRBR1MgdGFncyBjc2NvcGUgLkZPUkNFLVBFUkYtQ0ZMQUdTCisuUEhPTlk6IC5GT1JDRS1QRVJGLUJVSUxELU9QVElPTlMKKworIyMjIE1ha2Ugc3VyZSBidWlsdC1pbnMgZG8gbm90IGhhdmUgZHVwcyBhbmQgbGlzdGVkIGluIHBlcmYuYworIworY2hlY2stYnVpbHRpbnM6OgorCS4vY2hlY2stYnVpbHRpbnMuc2gKKworIyMjIFRlc3Qgc3VpdGUgY292ZXJhZ2UgdGVzdGluZworIworIyBOb25lIHJpZ2h0IG5vdworIworIyAuUEhPTlk6IGNvdmVyYWdlIGNvdmVyYWdlLWNsZWFuIGNvdmVyYWdlLWJ1aWxkIGNvdmVyYWdlLXJlcG9ydAorIworIyBjb3ZlcmFnZToKKyMJJChNQUtFKSBjb3ZlcmFnZS1idWlsZAorIwkkKE1BS0UpIGNvdmVyYWdlLXJlcG9ydAorIworIyBjb3ZlcmFnZS1jbGVhbjoKKyMJcm0gLWYgKi5nY2RhICouZ2NubworIworIyBDT1ZFUkFHRV9DRkxBR1MgPSAkKENGTEFHUykgLU8wIC1mdGVzdC1jb3ZlcmFnZSAtZnByb2ZpbGUtYXJjcworIyBDT1ZFUkFHRV9MREZMQUdTID0gJChDRkxBR1MpICAtTzAgLWxnY292CisjCisjIGNvdmVyYWdlLWJ1aWxkOiBjb3ZlcmFnZS1jbGVhbgorIwkkKE1BS0UpIENGTEFHUz0iJChDT1ZFUkFHRV9DRkxBR1MpIiBMREZMQUdTPSIkKENPVkVSQUdFX0xERkxBR1MpIiBhbGwKKyMJJChNQUtFKSBDRkxBR1M9IiQoQ09WRVJBR0VfQ0ZMQUdTKSIgTERGTEFHUz0iJChDT1ZFUkFHRV9MREZMQUdTKSIgXAorIwkJLWoxIHRlc3QKKyMKKyMgY292ZXJhZ2UtcmVwb3J0OgorIwlnY292IC1iICouYyAqLyouYworIwlncmVwICdeZnVuY3Rpb24uKmNhbGxlZCAwICcgKi5jLmdjb3YgKi8qLmMuZ2NvdiBcCisjCQl8IHNlZCAtZSAncy9cKFteOl0qXClcLmdjb3Y6ICpmdW5jdGlvbiBcKFteIF0qXCkgY2FsbGVkLiovXDE6IFwyLycgXAorIwkJfCB0ZWUgY292ZXJhZ2UtdW50ZXN0ZWQtZnVuY3Rpb25zCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1hbm5vdGF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZWQ1ZjcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4tYW5ub3RhdGUuYwpAQCAtMCwwICsxLDEzNTYgQEAKKy8qCisgKiBidWlsdGluLWFubm90YXRlLmMKKyAqCisgKiBCdWlsdGluIGFubm90YXRlIGNvbW1hbmQ6IEFuYWx5emUgdGhlIHBlcmYuZGF0YSBpbnB1dCBmaWxlLAorICogbG9vayB1cCBhbmQgcmVhZCBEU09zIGFuZCBzeW1ib2wgaW5mb3JtYXRpb24gYW5kIGRpc3BsYXkKKyAqIGEgaGlzdG9ncmFtIG9mIHJlc3VsdHMsIGFsb25nIHZhcmlvdXMgc29ydGluZyBrZXlzLgorICovCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjaW5jbHVkZSAidXRpbC91dGlsLmgiCisKKyNpbmNsdWRlICJ1dGlsL2NvbG9yLmgiCisjaW5jbHVkZSAidXRpbC9saXN0LmgiCisjaW5jbHVkZSAidXRpbC9jYWNoZS5oIgorI2luY2x1ZGUgInV0aWwvcmJ0cmVlLmgiCisjaW5jbHVkZSAidXRpbC9zeW1ib2wuaCIKKyNpbmNsdWRlICJ1dGlsL3N0cmluZy5oIgorCisjaW5jbHVkZSAicGVyZi5oIgorCisjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAidXRpbC9wYXJzZS1ldmVudHMuaCIKKworI2RlZmluZSBTSE9XX0tFUk5FTAkxCisjZGVmaW5lIFNIT1dfVVNFUgkyCisjZGVmaW5lIFNIT1dfSFYJCTQKKworc3RhdGljIGNoYXIJCWNvbnN0ICppbnB1dF9uYW1lID0gInBlcmYuZGF0YSI7CitzdGF0aWMgY2hhcgkJKnZtbGludXggPSAidm1saW51eCI7CisKK3N0YXRpYyBjaGFyCQlkZWZhdWx0X3NvcnRfb3JkZXJbXSA9ICJjb21tLHN5bWJvbCI7CitzdGF0aWMgY2hhcgkJKnNvcnRfb3JkZXIgPSBkZWZhdWx0X3NvcnRfb3JkZXI7CisKK3N0YXRpYyBpbnQJCWlucHV0Oworc3RhdGljIGludAkJc2hvd19tYXNrID0gU0hPV19LRVJORUwgfCBTSE9XX1VTRVIgfCBTSE9XX0hWOworCitzdGF0aWMgaW50CQlkdW1wX3RyYWNlID0gMDsKKyNkZWZpbmUgZHByaW50Zih4Li4uKQlkbyB7IGlmIChkdW1wX3RyYWNlKSBwcmludGYoeCk7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQJCXZlcmJvc2U7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCXBhZ2Vfc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBsb25nCW1tYXBfd2luZG93ID0gMzI7CisKK3N0cnVjdCBpcF9ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwlfX3U2NCBpcDsKKwlfX3UzMiBwaWQsIHRpZDsKK307CisKK3N0cnVjdCBtbWFwX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCV9fdTMyIHBpZCwgdGlkOworCV9fdTY0IHN0YXJ0OworCV9fdTY0IGxlbjsKKwlfX3U2NCBwZ29mZjsKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKK307CisKK3N0cnVjdCBjb21tX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCV9fdTMyIHBpZCwgdGlkOworCWNoYXIgY29tbVsxNl07Cit9OworCitzdHJ1Y3QgZm9ya19ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwlfX3UzMiBwaWQsIHBwaWQ7Cit9OworCitzdHJ1Y3QgcGVyaW9kX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCV9fdTY0IHRpbWU7CisJX191NjQgaWQ7CisJX191NjQgc2FtcGxlX3BlcmlvZDsKK307CisKK3R5cGVkZWYgdW5pb24gZXZlbnRfdW5pb24geworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlcgloZWFkZXI7CisJc3RydWN0IGlwX2V2ZW50CQkJaXA7CisJc3RydWN0IG1tYXBfZXZlbnQJCW1tYXA7CisJc3RydWN0IGNvbW1fZXZlbnQJCWNvbW07CisJc3RydWN0IGZvcmtfZXZlbnQJCWZvcms7CisJc3RydWN0IHBlcmlvZF9ldmVudAkJcGVyaW9kOworfSBldmVudF90OworCitzdGF0aWMgTElTVF9IRUFEKGRzb3MpOworc3RhdGljIHN0cnVjdCBkc28gKmtlcm5lbF9kc287CitzdGF0aWMgc3RydWN0IGRzbyAqdmRzbzsKKworCitzdGF0aWMgdm9pZCBkc29zX19hZGQoc3RydWN0IGRzbyAqZHNvKQoreworCWxpc3RfYWRkX3RhaWwoJmRzby0+bm9kZSwgJmRzb3MpOworfQorCitzdGF0aWMgc3RydWN0IGRzbyAqZHNvc19fZmluZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkc28gKnBvczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmZHNvcywgbm9kZSkKKwkJaWYgKHN0cmNtcChwb3MtPm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gcG9zOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRzbyAqZHNvc19fZmluZG5ldyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkc28gKmRzbyA9IGRzb3NfX2ZpbmQobmFtZSk7CisJaW50IG5yOworCisJaWYgKGRzbykKKwkJcmV0dXJuIGRzbzsKKworCWRzbyA9IGRzb19fbmV3KG5hbWUsIDApOworCWlmICghZHNvKQorCQlnb3RvIG91dF9kZWxldGVfZHNvOworCisJbnIgPSBkc29fX2xvYWQoZHNvLCBOVUxMLCB2ZXJib3NlKTsKKwlpZiAobnIgPCAwKSB7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbjogJXNcbiIsIG5hbWUpOworCQlnb3RvIG91dF9kZWxldGVfZHNvOworCX0KKwlpZiAoIW5yICYmIHZlcmJvc2UpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCSJObyBzeW1ib2xzIGZvdW5kIGluOiAlcywgbWF5YmUgaW5zdGFsbCBhIGRlYnVnIHBhY2thZ2U/XG4iLAorCQkJCW5hbWUpOworCX0KKworCWRzb3NfX2FkZChkc28pOworCisJcmV0dXJuIGRzbzsKKworb3V0X2RlbGV0ZV9kc286CisJZHNvX19kZWxldGUoZHNvKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZHNvc19fZnByaW50ZihGSUxFICpmcCkKK3sKKwlzdHJ1Y3QgZHNvICpwb3M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmRzb3MsIG5vZGUpCisJCWRzb19fZnByaW50Zihwb3MsIGZwKTsKK30KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnZkc29fX2ZpbmRfc3ltYm9sKHN0cnVjdCBkc28gKmRzbywgX191NjQgaXApCit7CisJcmV0dXJuIGRzb19fZmluZF9zeW1ib2woa2VybmVsX2RzbywgaXApOworfQorCitzdGF0aWMgaW50IGxvYWRfa2VybmVsKHZvaWQpCit7CisJaW50IGVycjsKKworCWtlcm5lbF9kc28gPSBkc29fX25ldygiW2tlcm5lbF0iLCAwKTsKKwlpZiAoIWtlcm5lbF9kc28pCisJCXJldHVybiAtMTsKKworCWVyciA9IGRzb19fbG9hZF9rZXJuZWwoa2VybmVsX2Rzbywgdm1saW51eCwgTlVMTCwgdmVyYm9zZSk7CisJaWYgKGVycikgeworCQlkc29fX2RlbGV0ZShrZXJuZWxfZHNvKTsKKwkJa2VybmVsX2RzbyA9IE5VTEw7CisJfSBlbHNlCisJCWRzb3NfX2FkZChrZXJuZWxfZHNvKTsKKworCXZkc28gPSBkc29fX25ldygiW3Zkc29dIiwgMCk7CisJaWYgKCF2ZHNvKQorCQlyZXR1cm4gLTE7CisKKwl2ZHNvLT5maW5kX3N5bWJvbCA9IHZkc29fX2ZpbmRfc3ltYm9sOworCisJZHNvc19fYWRkKHZkc28pOworCisJcmV0dXJuIGVycjsKK30KKworc3RydWN0IG1hcCB7CisJc3RydWN0IGxpc3RfaGVhZCBub2RlOworCV9fdTY0CSBzdGFydDsKKwlfX3U2NAkgZW5kOworCV9fdTY0CSBwZ29mZjsKKwlfX3U2NAkgKCptYXBfaXApKHN0cnVjdCBtYXAgKiwgX191NjQpOworCXN0cnVjdCBkc28JICpkc287Cit9OworCitzdGF0aWMgX191NjQgbWFwX19tYXBfaXAoc3RydWN0IG1hcCAqbWFwLCBfX3U2NCBpcCkKK3sKKwlyZXR1cm4gaXAgLSBtYXAtPnN0YXJ0ICsgbWFwLT5wZ29mZjsKK30KKworc3RhdGljIF9fdTY0IHZkc29fX21hcF9pcChzdHJ1Y3QgbWFwICptYXAsIF9fdTY0IGlwKQoreworCXJldHVybiBpcDsKK30KKworc3RhdGljIHN0cnVjdCBtYXAgKm1hcF9fbmV3KHN0cnVjdCBtbWFwX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgbWFwICpzZWxmID0gbWFsbG9jKHNpemVvZigqc2VsZikpOworCisJaWYgKHNlbGYgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICpmaWxlbmFtZSA9IGV2ZW50LT5maWxlbmFtZTsKKworCQlzZWxmLT5zdGFydCA9IGV2ZW50LT5zdGFydDsKKwkJc2VsZi0+ZW5kICAgPSBldmVudC0+c3RhcnQgKyBldmVudC0+bGVuOworCQlzZWxmLT5wZ29mZiA9IGV2ZW50LT5wZ29mZjsKKworCQlzZWxmLT5kc28gPSBkc29zX19maW5kbmV3KGZpbGVuYW1lKTsKKwkJaWYgKHNlbGYtPmRzbyA9PSBOVUxMKQorCQkJZ290byBvdXRfZGVsZXRlOworCisJCWlmIChzZWxmLT5kc28gPT0gdmRzbykKKwkJCXNlbGYtPm1hcF9pcCA9IHZkc29fX21hcF9pcDsKKwkJZWxzZQorCQkJc2VsZi0+bWFwX2lwID0gbWFwX19tYXBfaXA7CisJfQorCXJldHVybiBzZWxmOworb3V0X2RlbGV0ZToKKwlmcmVlKHNlbGYpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1hcCAqbWFwX19jbG9uZShzdHJ1Y3QgbWFwICpzZWxmKQoreworCXN0cnVjdCBtYXAgKm1hcCA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKKworCWlmICghbWFwKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweShtYXAsIHNlbGYsIHNpemVvZigqc2VsZikpOworCisJcmV0dXJuIG1hcDsKK30KKworc3RhdGljIGludCBtYXBfX292ZXJsYXAoc3RydWN0IG1hcCAqbCwgc3RydWN0IG1hcCAqcikKK3sKKwlpZiAobC0+c3RhcnQgPiByLT5zdGFydCkgeworCQlzdHJ1Y3QgbWFwICp0ID0gbDsKKwkJbCA9IHI7CisJCXIgPSB0OworCX0KKworCWlmIChsLT5lbmQgPiByLT5zdGFydCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCBtYXBfX2ZwcmludGYoc3RydWN0IG1hcCAqc2VsZiwgRklMRSAqZnApCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIgJUx4LSVMeCAlTHggJXNcbiIsCisJCSAgICAgICBzZWxmLT5zdGFydCwgc2VsZi0+ZW5kLCBzZWxmLT5wZ29mZiwgc2VsZi0+ZHNvLT5uYW1lKTsKK30KKworCitzdHJ1Y3QgdGhyZWFkIHsKKwlzdHJ1Y3QgcmJfbm9kZQkgcmJfbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hcHM7CisJcGlkX3QJCSBwaWQ7CisJY2hhcgkJICpjb21tOworfTsKKworc3RhdGljIHN0cnVjdCB0aHJlYWQgKnRocmVhZF9fbmV3KHBpZF90IHBpZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkICpzZWxmID0gbWFsbG9jKHNpemVvZigqc2VsZikpOworCisJaWYgKHNlbGYgIT0gTlVMTCkgeworCQlzZWxmLT5waWQgPSBwaWQ7CisJCXNlbGYtPmNvbW0gPSBtYWxsb2MoMzIpOworCQlpZiAoc2VsZi0+Y29tbSkKKwkJCXNucHJpbnRmKHNlbGYtPmNvbW0sIDMyLCAiOiVkIiwgc2VsZi0+cGlkKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnNlbGYtPm1hcHMpOworCX0KKworCXJldHVybiBzZWxmOworfQorCitzdGF0aWMgaW50IHRocmVhZF9fc2V0X2NvbW0oc3RydWN0IHRocmVhZCAqc2VsZiwgY29uc3QgY2hhciAqY29tbSkKK3sKKwlpZiAoc2VsZi0+Y29tbSkKKwkJZnJlZShzZWxmLT5jb21tKTsKKwlzZWxmLT5jb21tID0gc3RyZHVwKGNvbW0pOworCXJldHVybiBzZWxmLT5jb21tID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyBzaXplX3QgdGhyZWFkX19mcHJpbnRmKHN0cnVjdCB0aHJlYWQgKnNlbGYsIEZJTEUgKmZwKQoreworCXN0cnVjdCBtYXAgKnBvczsKKwlzaXplX3QgcmV0ID0gZnByaW50ZihmcCwgIlRocmVhZCAlZCAlc1xuIiwgc2VsZi0+cGlkLCBzZWxmLT5jb21tKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmc2VsZi0+bWFwcywgbm9kZSkKKwkJcmV0ICs9IG1hcF9fZnByaW50Zihwb3MsIGZwKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCByYl9yb290IHRocmVhZHM7CitzdGF0aWMgc3RydWN0IHRocmVhZCAqbGFzdF9tYXRjaDsKKworc3RhdGljIHN0cnVjdCB0aHJlYWQgKnRocmVhZHNfX2ZpbmRuZXcocGlkX3QgcGlkKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZ0aHJlYWRzLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHRocmVhZCAqdGg7CisKKwkvKgorCSAqIEZvbnQtZW5kIGNhY2hlIC0gUElEIGxvb2t1cHMgY29tZSBpbiBibG9ja3MsCisJICogc28gbW9zdCBvZiB0aGUgdGltZSB3ZSBkb250IGhhdmUgdG8gbG9vayB1cAorCSAqIHRoZSBmdWxsIHJidHJlZToKKwkgKi8KKwlpZiAobGFzdF9tYXRjaCAmJiBsYXN0X21hdGNoLT5waWQgPT0gcGlkKQorCQlyZXR1cm4gbGFzdF9tYXRjaDsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQl0aCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHRocmVhZCwgcmJfbm9kZSk7CisKKwkJaWYgKHRoLT5waWQgPT0gcGlkKSB7CisJCQlsYXN0X21hdGNoID0gdGg7CisJCQlyZXR1cm4gdGg7CisJCX0KKworCQlpZiAocGlkIDwgdGgtPnBpZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwl0aCA9IHRocmVhZF9fbmV3KHBpZCk7CisJaWYgKHRoICE9IE5VTEwpIHsKKwkJcmJfbGlua19ub2RlKCZ0aC0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZ0aC0+cmJfbm9kZSwgJnRocmVhZHMpOworCQlsYXN0X21hdGNoID0gdGg7CisJfQorCisJcmV0dXJuIHRoOworfQorCitzdGF0aWMgdm9pZCB0aHJlYWRfX2luc2VydF9tYXAoc3RydWN0IHRocmVhZCAqc2VsZiwgc3RydWN0IG1hcCAqbWFwKQoreworCXN0cnVjdCBtYXAgKnBvcywgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIHRtcCwgJnNlbGYtPm1hcHMsIG5vZGUpIHsKKwkJaWYgKG1hcF9fb3ZlcmxhcChwb3MsIG1hcCkpIHsKKwkJCWxpc3RfZGVsX2luaXQoJnBvcy0+bm9kZSk7CisJCQkvKiBYWFggbGVha3MgZHNvcyAqLworCQkJZnJlZShwb3MpOworCQl9CisJfQorCisJbGlzdF9hZGRfdGFpbCgmbWFwLT5ub2RlLCAmc2VsZi0+bWFwcyk7Cit9CisKK3N0YXRpYyBpbnQgdGhyZWFkX19mb3JrKHN0cnVjdCB0aHJlYWQgKnNlbGYsIHN0cnVjdCB0aHJlYWQgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgbWFwICptYXA7CisKKwlpZiAoc2VsZi0+Y29tbSkKKwkJZnJlZShzZWxmLT5jb21tKTsKKwlzZWxmLT5jb21tID0gc3RyZHVwKHBhcmVudC0+Y29tbSk7CisJaWYgKCFzZWxmLT5jb21tKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmcGFyZW50LT5tYXBzLCBub2RlKSB7CisJCXN0cnVjdCBtYXAgKm5ldyA9IG1hcF9fY2xvbmUobWFwKTsKKwkJaWYgKCFuZXcpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJdGhyZWFkX19pbnNlcnRfbWFwKHNlbGYsIG5ldyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwICp0aHJlYWRfX2ZpbmRfbWFwKHN0cnVjdCB0aHJlYWQgKnNlbGYsIF9fdTY0IGlwKQoreworCXN0cnVjdCBtYXAgKnBvczsKKworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZzZWxmLT5tYXBzLCBub2RlKQorCQlpZiAoaXAgPj0gcG9zLT5zdGFydCAmJiBpcCA8PSBwb3MtPmVuZCkKKwkJCXJldHVybiBwb3M7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHNpemVfdCB0aHJlYWRzX19mcHJpbnRmKEZJTEUgKmZwKQoreworCXNpemVfdCByZXQgPSAwOworCXN0cnVjdCByYl9ub2RlICpuZDsKKworCWZvciAobmQgPSByYl9maXJzdCgmdGhyZWFkcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCB0aHJlYWQgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgdGhyZWFkLCByYl9ub2RlKTsKKworCQlyZXQgKz0gdGhyZWFkX19mcHJpbnRmKHBvcywgZnApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBoaXN0b2dyYW0sIHNvcnRlZCBvbiBpdGVtLCBjb2xsZWN0cyBjb3VudHMKKyAqLworCitzdGF0aWMgc3RydWN0IHJiX3Jvb3QgaGlzdDsKKworc3RydWN0IGhpc3RfZW50cnkgeworCXN0cnVjdCByYl9ub2RlCSByYl9ub2RlOworCisJc3RydWN0IHRocmVhZAkgKnRocmVhZDsKKwlzdHJ1Y3QgbWFwCSAqbWFwOworCXN0cnVjdCBkc28JICpkc287CisJc3RydWN0IHN5bWJvbAkgKnN5bTsKKwlfX3U2NAkgaXA7CisJY2hhcgkJIGxldmVsOworCisJdWludDMyX3QJIGNvdW50OworfTsKKworLyoKKyAqIGNvbmZpZ3VyYWJsZSBzb3J0aW5nIGJpdHMKKyAqLworCitzdHJ1Y3Qgc29ydF9lbnRyeSB7CisJc3RydWN0IGxpc3RfaGVhZCBsaXN0OworCisJY2hhciAqaGVhZGVyOworCisJaW50NjRfdCAoKmNtcCkoc3RydWN0IGhpc3RfZW50cnkgKiwgc3RydWN0IGhpc3RfZW50cnkgKik7CisJaW50NjRfdCAoKmNvbGxhcHNlKShzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKKwlzaXplX3QJKCpwcmludCkoRklMRSAqZnAsIHN0cnVjdCBoaXN0X2VudHJ5ICopOworfTsKKworLyogLS1zb3J0IHBpZCAqLworCitzdGF0aWMgaW50NjRfdAorc29ydF9fdGhyZWFkX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCXJldHVybiByaWdodC0+dGhyZWFkLT5waWQgLSBsZWZ0LT50aHJlYWQtPnBpZDsKK30KKworc3RhdGljIHNpemVfdAorc29ydF9fdGhyZWFkX3ByaW50KEZJTEUgKmZwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZikKK3sKKwlyZXR1cm4gZnByaW50ZihmcCwgIiUxNnM6JTVkIiwgc2VsZi0+dGhyZWFkLT5jb21tID86ICIiLCBzZWxmLT50aHJlYWQtPnBpZCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X3RocmVhZCA9IHsKKwkuaGVhZGVyID0gIiAgICAgICAgIENvbW1hbmQ6ICBQaWQiLAorCS5jbXAJPSBzb3J0X190aHJlYWRfY21wLAorCS5wcmludAk9IHNvcnRfX3RocmVhZF9wcmludCwKK307CisKKy8qIC0tc29ydCBjb21tICovCisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X19jb21tX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCXJldHVybiByaWdodC0+dGhyZWFkLT5waWQgLSBsZWZ0LT50aHJlYWQtPnBpZDsKK30KKworc3RhdGljIGludDY0X3QKK3NvcnRfX2NvbW1fY29sbGFwc2Uoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwljaGFyICpjb21tX2wgPSBsZWZ0LT50aHJlYWQtPmNvbW07CisJY2hhciAqY29tbV9yID0gcmlnaHQtPnRocmVhZC0+Y29tbTsKKworCWlmICghY29tbV9sIHx8ICFjb21tX3IpIHsKKwkJaWYgKCFjb21tX2wgJiYgIWNvbW1fcikKKwkJCXJldHVybiAwOworCQllbHNlIGlmICghY29tbV9sKQorCQkJcmV0dXJuIC0xOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gc3RyY21wKGNvbW1fbCwgY29tbV9yKTsKK30KKworc3RhdGljIHNpemVfdAorc29ydF9fY29tbV9wcmludChGSUxFICpmcCwgc3RydWN0IGhpc3RfZW50cnkgKnNlbGYpCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIlMTZzIiwgc2VsZi0+dGhyZWFkLT5jb21tKTsKK30KKworc3RhdGljIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfY29tbSA9IHsKKwkuaGVhZGVyCQk9ICIgICAgICAgICBDb21tYW5kIiwKKwkuY21wCQk9IHNvcnRfX2NvbW1fY21wLAorCS5jb2xsYXBzZQk9IHNvcnRfX2NvbW1fY29sbGFwc2UsCisJLnByaW50CQk9IHNvcnRfX2NvbW1fcHJpbnQsCit9OworCisvKiAtLXNvcnQgZHNvICovCisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X19kc29fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJc3RydWN0IGRzbyAqZHNvX2wgPSBsZWZ0LT5kc287CisJc3RydWN0IGRzbyAqZHNvX3IgPSByaWdodC0+ZHNvOworCisJaWYgKCFkc29fbCB8fCAhZHNvX3IpIHsKKwkJaWYgKCFkc29fbCAmJiAhZHNvX3IpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoIWRzb19sKQorCQkJcmV0dXJuIC0xOworCQllbHNlCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gc3RyY21wKGRzb19sLT5uYW1lLCBkc29fci0+bmFtZSk7Cit9CisKK3N0YXRpYyBzaXplX3QKK3NvcnRfX2Rzb19wcmludChGSUxFICpmcCwgc3RydWN0IGhpc3RfZW50cnkgKnNlbGYpCit7CisJaWYgKHNlbGYtPmRzbykKKwkJcmV0dXJuIGZwcmludGYoZnAsICIlLTI1cyIsIHNlbGYtPmRzby0+bmFtZSk7CisKKwlyZXR1cm4gZnByaW50ZihmcCwgIiUwMTZsbHggICAgICAgICAiLCAoX191NjQpc2VsZi0+aXApOworfQorCitzdGF0aWMgc3RydWN0IHNvcnRfZW50cnkgc29ydF9kc28gPSB7CisJLmhlYWRlciA9ICJTaGFyZWQgT2JqZWN0ICAgICAgICAgICAgIiwKKwkuY21wCT0gc29ydF9fZHNvX2NtcCwKKwkucHJpbnQJPSBzb3J0X19kc29fcHJpbnQsCit9OworCisvKiAtLXNvcnQgc3ltYm9sICovCisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X19zeW1fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJX191NjQgaXBfbCwgaXBfcjsKKworCWlmIChsZWZ0LT5zeW0gPT0gcmlnaHQtPnN5bSkKKwkJcmV0dXJuIDA7CisKKwlpcF9sID0gbGVmdC0+c3ltID8gbGVmdC0+c3ltLT5zdGFydCA6IGxlZnQtPmlwOworCWlwX3IgPSByaWdodC0+c3ltID8gcmlnaHQtPnN5bS0+c3RhcnQgOiByaWdodC0+aXA7CisKKwlyZXR1cm4gKGludDY0X3QpKGlwX3IgLSBpcF9sKTsKK30KKworc3RhdGljIHNpemVfdAorc29ydF9fc3ltX3ByaW50KEZJTEUgKmZwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZikKK3sKKwlzaXplX3QgcmV0ID0gMDsKKworCWlmICh2ZXJib3NlKQorCQlyZXQgKz0gZnByaW50ZihmcCwgIiUjMDE4bGx4ICAiLCAoX191NjQpc2VsZi0+aXApOworCisJaWYgKHNlbGYtPnN5bSkgeworCQlyZXQgKz0gZnByaW50ZihmcCwgIlslY10gJXMiLAorCQkJc2VsZi0+ZHNvID09IGtlcm5lbF9kc28gPyAnaycgOiAnLicsIHNlbGYtPnN5bS0+bmFtZSk7CisJfSBlbHNlIHsKKwkJcmV0ICs9IGZwcmludGYoZnAsICIlIzAxNmxseCIsIChfX3U2NClzZWxmLT5pcCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfc3ltID0geworCS5oZWFkZXIgPSAiU3ltYm9sIiwKKwkuY21wCT0gc29ydF9fc3ltX2NtcCwKKwkucHJpbnQJPSBzb3J0X19zeW1fcHJpbnQsCit9OworCitzdGF0aWMgaW50IHNvcnRfX25lZWRfY29sbGFwc2UgPSAwOworCitzdHJ1Y3Qgc29ydF9kaW1lbnNpb24geworCWNoYXIJCQkqbmFtZTsKKwlzdHJ1Y3Qgc29ydF9lbnRyeQkqZW50cnk7CisJaW50CQkJdGFrZW47Cit9OworCitzdGF0aWMgc3RydWN0IHNvcnRfZGltZW5zaW9uIHNvcnRfZGltZW5zaW9uc1tdID0geworCXsgLm5hbWUgPSAicGlkIiwJLmVudHJ5ID0gJnNvcnRfdGhyZWFkLAl9LAorCXsgLm5hbWUgPSAiY29tbSIsCS5lbnRyeSA9ICZzb3J0X2NvbW0sCX0sCisJeyAubmFtZSA9ICJkc28iLAkuZW50cnkgPSAmc29ydF9kc28sCX0sCisJeyAubmFtZSA9ICJzeW1ib2wiLAkuZW50cnkgPSAmc29ydF9zeW0sCX0sCit9OworCitzdGF0aWMgTElTVF9IRUFEKGhpc3RfZW50cnlfX3NvcnRfbGlzdCk7CisKK3N0YXRpYyBpbnQgc29ydF9kaW1lbnNpb25fX2FkZChjaGFyICp0b2spCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShzb3J0X2RpbWVuc2lvbnMpOyBpKyspIHsKKwkJc3RydWN0IHNvcnRfZGltZW5zaW9uICpzZCA9ICZzb3J0X2RpbWVuc2lvbnNbaV07CisKKwkJaWYgKHNkLT50YWtlbikKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdHJuY2FzZWNtcCh0b2ssIHNkLT5uYW1lLCBzdHJsZW4odG9rKSkpCisJCQljb250aW51ZTsKKworCQlpZiAoc2QtPmVudHJ5LT5jb2xsYXBzZSkKKwkJCXNvcnRfX25lZWRfY29sbGFwc2UgPSAxOworCisJCWxpc3RfYWRkX3RhaWwoJnNkLT5lbnRyeS0+bGlzdCwgJmhpc3RfZW50cnlfX3NvcnRfbGlzdCk7CisJCXNkLT50YWtlbiA9IDE7CisKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIC1FU1JDSDsKK30KKworc3RhdGljIGludDY0X3QKK2hpc3RfZW50cnlfX2NtcChzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCXN0cnVjdCBzb3J0X2VudHJ5ICpzZTsKKwlpbnQ2NF90IGNtcCA9IDA7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmaGlzdF9lbnRyeV9fc29ydF9saXN0LCBsaXN0KSB7CisJCWNtcCA9IHNlLT5jbXAobGVmdCwgcmlnaHQpOworCQlpZiAoY21wKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNtcDsKK30KKworc3RhdGljIGludDY0X3QKK2hpc3RfZW50cnlfX2NvbGxhcHNlKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJc3RydWN0IHNvcnRfZW50cnkgKnNlOworCWludDY0X3QgY21wID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2UsICZoaXN0X2VudHJ5X19zb3J0X2xpc3QsIGxpc3QpIHsKKwkJaW50NjRfdCAoKmYpKHN0cnVjdCBoaXN0X2VudHJ5ICosIHN0cnVjdCBoaXN0X2VudHJ5ICopOworCisJCWYgPSBzZS0+Y29sbGFwc2UgPzogc2UtPmNtcDsKKworCQljbXAgPSBmKGxlZnQsIHJpZ2h0KTsKKwkJaWYgKGNtcCkKKwkJCWJyZWFrOworCX0KKworCXJldHVybiBjbXA7Cit9CisKKy8qCisgKiBjb2xsZWN0IGhpc3RvZ3JhbSBjb3VudHMKKyAqLworc3RhdGljIHZvaWQgaGlzdF9oaXQoc3RydWN0IGhpc3RfZW50cnkgKmhlLCBfX3U2NCBpcCkKK3sKKwl1bnNpZ25lZCBpbnQgc3ltX3NpemUsIG9mZnNldDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBoZS0+c3ltOworCisJaGUtPmNvdW50Kys7CisKKwlpZiAoIXN5bSB8fCAhc3ltLT5oaXN0KQorCQlyZXR1cm47CisKKwlzeW1fc2l6ZSA9IHN5bS0+ZW5kIC0gc3ltLT5zdGFydDsKKwlvZmZzZXQgPSBpcCAtIHN5bS0+c3RhcnQ7CisKKwlpZiAob2Zmc2V0ID49IHN5bV9zaXplKQorCQlyZXR1cm47CisKKwlzeW0tPmhpc3Rfc3VtKys7CisJc3ltLT5oaXN0W29mZnNldF0rKzsKKworCWlmICh2ZXJib3NlID49IDMpCisJCXByaW50ZigiJXAgJXM6IGNvdW50KysgW2lwOiAlcCwgJTA4THhdID0+ICVMZFxuIiwKKwkJCSh2b2lkICopKHVuc2lnbmVkIGxvbmcpaGUtPnN5bS0+c3RhcnQsCisJCQloZS0+c3ltLT5uYW1lLAorCQkJKHZvaWQgKikodW5zaWduZWQgbG9uZylpcCwgaXAgLSBoZS0+c3ltLT5zdGFydCwKKwkJCXN5bS0+aGlzdFtvZmZzZXRdKTsKK30KKworc3RhdGljIGludAoraGlzdF9lbnRyeV9fYWRkKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3QgZHNvICpkc28sCisJCXN0cnVjdCBzeW1ib2wgKnN5bSwgX191NjQgaXAsIGNoYXIgbGV2ZWwpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmhpc3QucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaGU7CisJc3RydWN0IGhpc3RfZW50cnkgZW50cnkgPSB7CisJCS50aHJlYWQJPSB0aHJlYWQsCisJCS5tYXAJPSBtYXAsCisJCS5kc28JPSBkc28sCisJCS5zeW0JPSBzeW0sCisJCS5pcAk9IGlwLAorCQkubGV2ZWwJPSBsZXZlbCwKKwkJLmNvdW50CT0gMSwKKwl9OworCWludCBjbXA7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJaGUgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKworCQljbXAgPSBoaXN0X2VudHJ5X19jbXAoJmVudHJ5LCBoZSk7CisKKwkJaWYgKCFjbXApIHsKKwkJCWhpc3RfaGl0KGhlLCBpcCk7CisKKwkJCXJldHVybiAwOworCQl9CisKKwkJaWYgKGNtcCA8IDApCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJaGUgPSBtYWxsb2Moc2l6ZW9mKCpoZSkpOworCWlmICghaGUpCisJCXJldHVybiAtRU5PTUVNOworCSpoZSA9IGVudHJ5OworCXJiX2xpbmtfbm9kZSgmaGUtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZoZS0+cmJfbm9kZSwgJmhpc3QpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGhpc3RfZW50cnlfX2ZyZWUoc3RydWN0IGhpc3RfZW50cnkgKmhlKQoreworCWZyZWUoaGUpOworfQorCisvKgorICogY29sbGFwc2UgdGhlIGhpc3RvZ3JhbQorICovCisKK3N0YXRpYyBzdHJ1Y3QgcmJfcm9vdCBjb2xsYXBzZV9oaXN0czsKKworc3RhdGljIHZvaWQgY29sbGFwc2VfX2luc2VydF9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJmNvbGxhcHNlX2hpc3RzLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGhpc3RfZW50cnkgKml0ZXI7CisJaW50NjRfdCBjbXA7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJaXRlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCisJCWNtcCA9IGhpc3RfZW50cnlfX2NvbGxhcHNlKGl0ZXIsIGhlKTsKKworCQlpZiAoIWNtcCkgeworCQkJaXRlci0+Y291bnQgKz0gaGUtPmNvdW50OworCQkJaGlzdF9lbnRyeV9fZnJlZShoZSk7CisJCQlyZXR1cm47CisJCX0KKworCQlpZiAoY21wIDwgMCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwlyYl9saW5rX25vZGUoJmhlLT5yYl9ub2RlLCBwYXJlbnQsIHApOworCXJiX2luc2VydF9jb2xvcigmaGUtPnJiX25vZGUsICZjb2xsYXBzZV9oaXN0cyk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbGxhcHNlX19yZXNvcnQodm9pZCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqbjsKKworCWlmICghc29ydF9fbmVlZF9jb2xsYXBzZSkKKwkJcmV0dXJuOworCisJbmV4dCA9IHJiX2ZpcnN0KCZoaXN0KTsKKwl3aGlsZSAobmV4dCkgeworCQluID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCQluZXh0ID0gcmJfbmV4dCgmbi0+cmJfbm9kZSk7CisKKwkJcmJfZXJhc2UoJm4tPnJiX25vZGUsICZoaXN0KTsKKwkJY29sbGFwc2VfX2luc2VydF9lbnRyeShuKTsKKwl9Cit9CisKKy8qCisgKiByZXZlcnNlIHRoZSBtYXAsIHNvcnQgb24gY291bnQuCisgKi8KKworc3RhdGljIHN0cnVjdCByYl9yb290IG91dHB1dF9oaXN0czsKKworc3RhdGljIHZvaWQgb3V0cHV0X19pbnNlcnRfZW50cnkoc3RydWN0IGhpc3RfZW50cnkgKmhlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZvdXRwdXRfaGlzdHMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaXRlcjsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQlpdGVyID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisKKwkJaWYgKGhlLT5jb3VudCA+IGl0ZXItPmNvdW50KQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCX0KKworCXJiX2xpbmtfbm9kZSgmaGUtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZoZS0+cmJfbm9kZSwgJm91dHB1dF9oaXN0cyk7Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF9fcmVzb3J0KHZvaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5leHQ7CisJc3RydWN0IGhpc3RfZW50cnkgKm47CisJc3RydWN0IHJiX3Jvb3QgKnRyZWUgPSAmaGlzdDsKKworCWlmIChzb3J0X19uZWVkX2NvbGxhcHNlKQorCQl0cmVlID0gJmNvbGxhcHNlX2hpc3RzOworCisJbmV4dCA9IHJiX2ZpcnN0KHRyZWUpOworCisJd2hpbGUgKG5leHQpIHsKKwkJbiA9IHJiX2VudHJ5KG5leHQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJbmV4dCA9IHJiX25leHQoJm4tPnJiX25vZGUpOworCisJCXJiX2VyYXNlKCZuLT5yYl9ub2RlLCB0cmVlKTsKKwkJb3V0cHV0X19pbnNlcnRfZW50cnkobik7CisJfQorfQorCitzdGF0aWMgdm9pZCByZWdpc3Rlcl9pZGxlX3RocmVhZCh2b2lkKQoreworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoMCk7CisKKwlpZiAodGhyZWFkID09IE5VTEwgfHwKKwkJCXRocmVhZF9fc2V0X2NvbW0odGhyZWFkLCAiW2lkbGVdIikpIHsKKwkJZnByaW50ZihzdGRlcnIsICJwcm9ibGVtIGluc2VydGluZyBpZGxlIHRhc2suXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorfQorCitzdGF0aWMgdW5zaWduZWQgbG9uZyB0b3RhbCA9IDAsCisJCSAgICAgdG90YWxfbW1hcCA9IDAsCisJCSAgICAgdG90YWxfY29tbSA9IDAsCisJCSAgICAgdG90YWxfZm9yayA9IDAsCisJCSAgICAgdG90YWxfdW5rbm93biA9IDA7CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3Nfb3ZlcmZsb3dfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJY2hhciBsZXZlbDsKKwlpbnQgc2hvdyA9IDA7CisJc3RydWN0IGRzbyAqZHNvID0gTlVMTDsKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5pcC5waWQpOworCV9fdTY0IGlwID0gZXZlbnQtPmlwLmlwOworCXN0cnVjdCBtYXAgKm1hcCA9IE5VTEw7CisKKwlkcHJpbnRmKCIlcCBbJXBdOiBQRVJGX0VWRU5UIChJUCwgJWQpOiAlZDogJXBcbiIsCisJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkodm9pZCAqKShsb25nKShldmVudC0+aGVhZGVyLnNpemUpLAorCQlldmVudC0+aGVhZGVyLm1pc2MsCisJCWV2ZW50LT5pcC5waWQsCisJCSh2b2lkICopKGxvbmcpaXApOworCisJZHByaW50ZigiIC4uLiB0aHJlYWQ6ICVzOiVkXG4iLCB0aHJlYWQtPmNvbW0sIHRocmVhZC0+cGlkKTsKKworCWlmICh0aHJlYWQgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInByb2JsZW0gcHJvY2Vzc2luZyAlZCBldmVudCwgc2tpcHBpbmcgaXQuXG4iLAorCQkJZXZlbnQtPmhlYWRlci50eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX0VWRU5UX01JU0NfS0VSTkVMKSB7CisJCXNob3cgPSBTSE9XX0tFUk5FTDsKKwkJbGV2ZWwgPSAnayc7CisKKwkJZHNvID0ga2VybmVsX2RzbzsKKworCQlkcHJpbnRmKCIgLi4uLi4uIGRzbzogJXNcbiIsIGRzby0+bmFtZSk7CisKKwl9IGVsc2UgaWYgKGV2ZW50LT5oZWFkZXIubWlzYyAmIFBFUkZfRVZFTlRfTUlTQ19VU0VSKSB7CisKKwkJc2hvdyA9IFNIT1dfVVNFUjsKKwkJbGV2ZWwgPSAnLic7CisKKwkJbWFwID0gdGhyZWFkX19maW5kX21hcCh0aHJlYWQsIGlwKTsKKwkJaWYgKG1hcCAhPSBOVUxMKSB7CisJCQlpcCA9IG1hcC0+bWFwX2lwKG1hcCwgaXApOworCQkJZHNvID0gbWFwLT5kc287CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBpcyBvdXRzaWRlIG9mIGFsbCBrbm93biBtYXBzLAorCQkJICogYW5kIGlzIGEgbmVnYXRpdmUgYWRkcmVzcywgdHJ5IHRvIGxvb2sgaXQKKwkJCSAqIHVwIGluIHRoZSBrZXJuZWwgZHNvLCBhcyBpdCBtaWdodCBiZSBhCisJCQkgKiB2c3lzY2FsbCAod2hpY2ggZXhlY3V0ZXMgaW4gdXNlci1tb2RlKToKKwkJCSAqLworCQkJaWYgKChsb25nIGxvbmcpaXAgPCAwKQorCQkJCWRzbyA9IGtlcm5lbF9kc287CisJCX0KKwkJZHByaW50ZigiIC4uLi4uLiBkc286ICVzXG4iLCBkc28gPyBkc28tPm5hbWUgOiAiPG5vdCBmb3VuZD4iKTsKKworCX0gZWxzZSB7CisJCXNob3cgPSBTSE9XX0hWOworCQlsZXZlbCA9ICdIJzsKKwkJZHByaW50ZigiIC4uLi4uLiBkc286IFtoeXBlcnZpc29yXVxuIik7CisJfQorCisJaWYgKHNob3cgJiBzaG93X21hc2spIHsKKwkJc3RydWN0IHN5bWJvbCAqc3ltID0gTlVMTDsKKworCQlpZiAoZHNvKQorCQkJc3ltID0gZHNvLT5maW5kX3N5bWJvbChkc28sIGlwKTsKKworCQlpZiAoaGlzdF9lbnRyeV9fYWRkKHRocmVhZCwgbWFwLCBkc28sIHN5bSwgaXAsIGxldmVsKSkgeworCQkJZnByaW50ZihzdGRlcnIsCisJCSJwcm9ibGVtIGluY3JlbWVudGluZyBzeW1ib2wgY291bnQsIHNraXBwaW5nIGV2ZW50XG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKwl0b3RhbCsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfbW1hcF9ldmVudChldmVudF90ICpldmVudCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5tbWFwLnBpZCk7CisJc3RydWN0IG1hcCAqbWFwID0gbWFwX19uZXcoJmV2ZW50LT5tbWFwKTsKKworCWRwcmludGYoIiVwIFslcF06IFBFUkZfRVZFTlRfTU1BUCAlZDogWyVwKCVwKSBAICVwXTogJXNcbiIsCisJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkodm9pZCAqKShsb25nKShldmVudC0+aGVhZGVyLnNpemUpLAorCQlldmVudC0+bW1hcC5waWQsCisJCSh2b2lkICopKGxvbmcpZXZlbnQtPm1tYXAuc3RhcnQsCisJCSh2b2lkICopKGxvbmcpZXZlbnQtPm1tYXAubGVuLAorCQkodm9pZCAqKShsb25nKWV2ZW50LT5tbWFwLnBnb2ZmLAorCQlldmVudC0+bW1hcC5maWxlbmFtZSk7CisKKwlpZiAodGhyZWFkID09IE5VTEwgfHwgbWFwID09IE5VTEwpIHsKKwkJZHByaW50ZigicHJvYmxlbSBwcm9jZXNzaW5nIFBFUkZfRVZFTlRfTU1BUCwgc2tpcHBpbmcgZXZlbnQuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJdGhyZWFkX19pbnNlcnRfbWFwKHRocmVhZCwgbWFwKTsKKwl0b3RhbF9tbWFwKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19jb21tX2V2ZW50KGV2ZW50X3QgKmV2ZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmNvbW0ucGlkKTsKKworCWRwcmludGYoIiVwIFslcF06IFBFUkZfRVZFTlRfQ09NTTogJXM6JWRcbiIsCisJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkodm9pZCAqKShsb25nKShldmVudC0+aGVhZGVyLnNpemUpLAorCQlldmVudC0+Y29tbS5jb21tLCBldmVudC0+Y29tbS5waWQpOworCisJaWYgKHRocmVhZCA9PSBOVUxMIHx8CisJICAgIHRocmVhZF9fc2V0X2NvbW0odGhyZWFkLCBldmVudC0+Y29tbS5jb21tKSkgeworCQlkcHJpbnRmKCJwcm9ibGVtIHByb2Nlc3NpbmcgUEVSRl9FVkVOVF9DT01NLCBza2lwcGluZyBldmVudC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXRvdGFsX2NvbW0rKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX2ZvcmtfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+Zm9yay5waWQpOworCXN0cnVjdCB0aHJlYWQgKnBhcmVudCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmZvcmsucHBpZCk7CisKKwlkcHJpbnRmKCIlcCBbJXBdOiBQRVJGX0VWRU5UX0ZPUks6ICVkOiVkXG4iLAorCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJZXZlbnQtPmZvcmsucGlkLCBldmVudC0+Zm9yay5wcGlkKTsKKworCWlmICghdGhyZWFkIHx8ICFwYXJlbnQgfHwgdGhyZWFkX19mb3JrKHRocmVhZCwgcGFyZW50KSkgeworCQlkcHJpbnRmKCJwcm9ibGVtIHByb2Nlc3NpbmcgUEVSRl9FVkVOVF9GT1JLLCBza2lwcGluZyBldmVudC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCXRvdGFsX2ZvcmsrKzsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX3BlcmlvZF9ldmVudChldmVudF90ICpldmVudCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlkcHJpbnRmKCIlcCBbJXBdOiBQRVJGX0VWRU5UX1BFUklPRDogdGltZTolTGQsIGlkOiVMZDogcGVyaW9kOiVMZFxuIiwKKwkJKHZvaWQgKikob2Zmc2V0ICsgaGVhZCksCisJCSh2b2lkICopKGxvbmcpKGV2ZW50LT5oZWFkZXIuc2l6ZSksCisJCWV2ZW50LT5wZXJpb2QudGltZSwKKwkJZXZlbnQtPnBlcmlvZC5pZCwKKwkJZXZlbnQtPnBlcmlvZC5zYW1wbGVfcGVyaW9kKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX2V2ZW50KGV2ZW50X3QgKmV2ZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCWlmIChldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX0VWRU5UX01JU0NfT1ZFUkZMT1cpCisJCXJldHVybiBwcm9jZXNzX292ZXJmbG93X2V2ZW50KGV2ZW50LCBvZmZzZXQsIGhlYWQpOworCisJc3dpdGNoIChldmVudC0+aGVhZGVyLnR5cGUpIHsKKwljYXNlIFBFUkZfRVZFTlRfTU1BUDoKKwkJcmV0dXJuIHByb2Nlc3NfbW1hcF9ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKTsKKworCWNhc2UgUEVSRl9FVkVOVF9DT01NOgorCQlyZXR1cm4gcHJvY2Vzc19jb21tX2V2ZW50KGV2ZW50LCBvZmZzZXQsIGhlYWQpOworCisJY2FzZSBQRVJGX0VWRU5UX0ZPUks6CisJCXJldHVybiBwcm9jZXNzX2ZvcmtfZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCk7CisKKwljYXNlIFBFUkZfRVZFTlRfUEVSSU9EOgorCQlyZXR1cm4gcHJvY2Vzc19wZXJpb2RfZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCk7CisJLyoKKwkgKiBXZSBkb250IHByb2Nlc3MgdGhlbSByaWdodCBub3cgYnV0IHRoZXkgYXJlIGZpbmU6CisJICovCisKKwljYXNlIFBFUkZfRVZFTlRfVEhST1RUTEU6CisJY2FzZSBQRVJGX0VWRU5UX1VOVEhST1RUTEU6CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitwYXJzZV9saW5lKEZJTEUgKmZpbGUsIHN0cnVjdCBzeW1ib2wgKnN5bSwgX191NjQgc3RhcnQsIF9fdTY0IGxlbikKK3sKKwljaGFyICpsaW5lID0gTlVMTCwgKnRtcCwgKnRtcDI7CisJdW5zaWduZWQgaW50IG9mZnNldDsKKwlzaXplX3QgbGluZV9sZW47CisJX191NjQgbGluZV9pcDsKKwlpbnQgcmV0OworCWNoYXIgKmM7CisKKwlpZiAoZ2V0bGluZSgmbGluZSwgJmxpbmVfbGVuLCBmaWxlKSA8IDApCisJCXJldHVybiAtMTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtMTsKKworCWMgPSBzdHJjaHIobGluZSwgJ1xuJyk7CisJaWYgKGMpCisJCSpjID0gMDsKKworCWxpbmVfaXAgPSAtMTsKKwlvZmZzZXQgPSAwOworCXJldCA9IC0yOworCisJLyoKKwkgKiBTdHJpcCBsZWFkaW5nIHNwYWNlczoKKwkgKi8KKwl0bXAgPSBsaW5lOworCXdoaWxlICgqdG1wKSB7CisJCWlmICgqdG1wICE9ICcgJykKKwkJCWJyZWFrOworCQl0bXArKzsKKwl9CisKKwlpZiAoKnRtcCkgeworCQkvKgorCQkgKiBQYXJzZSBoZXhhIGFkZHJlc3NlcyBmb2xsb3dlZCBieSAnOicKKwkJICovCisJCWxpbmVfaXAgPSBzdHJ0b3VsbCh0bXAsICZ0bXAyLCAxNik7CisJCWlmICgqdG1wMiAhPSAnOicpCisJCQlsaW5lX2lwID0gLTE7CisJfQorCisJaWYgKGxpbmVfaXAgIT0gLTEpIHsKKwkJdW5zaWduZWQgaW50IGhpdHMgPSAwOworCQlkb3VibGUgcGVyY2VudCA9IDAuMDsKKwkJY2hhciAqY29sb3IgPSBQRVJGX0NPTE9SX05PUk1BTDsKKworCQlvZmZzZXQgPSBsaW5lX2lwIC0gc3RhcnQ7CisJCWlmIChvZmZzZXQgPCBsZW4pCisJCQloaXRzID0gc3ltLT5oaXN0W29mZnNldF07CisKKwkJaWYgKHN5bS0+aGlzdF9zdW0pCisJCQlwZXJjZW50ID0gMTAwLjAgKiBoaXRzIC8gc3ltLT5oaXN0X3N1bTsKKworCQkvKgorCQkgKiBXZSBjb2xvciBoaWdoLW92ZXJoZWFkIGVudHJpZXMgaW4gcmVkLCBtaWQtb3ZlcmhlYWQKKwkJICogZW50cmllcyBpbiBncmVlbiAtIGFuZCBrZWVwIHRoZSBsb3cgb3ZlcmhlYWQgcGxhY2VzCisJCSAqIG5vcm1hbDoKKwkJICovCisJCWlmIChwZXJjZW50ID49IDUuMCkKKwkJCWNvbG9yID0gUEVSRl9DT0xPUl9SRUQ7CisJCWVsc2UgeworCQkJaWYgKHBlcmNlbnQgPiAwLjUpCisJCQkJY29sb3IgPSBQRVJGX0NPTE9SX0dSRUVOOworCQl9CisKKwkJY29sb3JfZnByaW50ZihzdGRvdXQsIGNvbG9yLCAiICU3LjJmIiwgcGVyY2VudCk7CisJCXByaW50ZigiIDoJIik7CisJCWNvbG9yX2ZwcmludGYoc3Rkb3V0LCBQRVJGX0NPTE9SX0JMVUUsICIlc1xuIiwgbGluZSk7CisJfSBlbHNlIHsKKwkJaWYgKCEqbGluZSkKKwkJCXByaW50ZigiICAgICAgICAgOlxuIik7CisJCWVsc2UKKwkJCXByaW50ZigiICAgICAgICAgOgklc1xuIiwgbGluZSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGFubm90YXRlX3N5bShzdHJ1Y3QgZHNvICpkc28sIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwljaGFyICpmaWxlbmFtZSA9IGRzby0+bmFtZTsKKwlfX3U2NCBzdGFydCwgZW5kLCBsZW47CisJY2hhciBjb21tYW5kW1BBVEhfTUFYKjJdOworCUZJTEUgKmZpbGU7CisKKwlpZiAoIWZpbGVuYW1lKQorCQlyZXR1cm47CisJaWYgKGRzbyA9PSBrZXJuZWxfZHNvKQorCQlmaWxlbmFtZSA9IHZtbGludXg7CisKKwlwcmludGYoIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKwlwcmludGYoIiBQZXJjZW50IHwJU291cmNlIGNvZGUgJiBEaXNhc3NlbWJseSBvZiAlc1xuIiwgZmlsZW5hbWUpOworCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKworCWlmICh2ZXJib3NlID49IDIpCisJCXByaW50ZigiYW5ub3RhdGluZyBbJXBdICUzMHMgOiBbJXBdICUzMHNcbiIsIGRzbywgZHNvLT5uYW1lLCBzeW0sIHN5bS0+bmFtZSk7CisKKwlzdGFydCA9IHN5bS0+b2JqX3N0YXJ0OworCWlmICghc3RhcnQpCisJCXN0YXJ0ID0gc3ltLT5zdGFydDsKKworCWVuZCA9IHN0YXJ0ICsgc3ltLT5lbmQgLSBzeW0tPnN0YXJ0ICsgMTsKKwlsZW4gPSBzeW0tPmVuZCAtIHN5bS0+c3RhcnQ7CisKKwlzcHJpbnRmKGNvbW1hbmQsICJvYmpkdW1wIC0tc3RhcnQtYWRkcmVzcz0weCUwMTZMeCAtLXN0b3AtYWRkcmVzcz0weCUwMTZMeCAtZFMgJXMiLCAoX191NjQpc3RhcnQsIChfX3U2NCllbmQsIGZpbGVuYW1lKTsKKworCWlmICh2ZXJib3NlID49IDMpCisJCXByaW50ZigiZG9pbmc6ICVzXG4iLCBjb21tYW5kKTsKKworCWZpbGUgPSBwb3Blbihjb21tYW5kLCAiciIpOworCWlmICghZmlsZSkKKwkJcmV0dXJuOworCisJd2hpbGUgKCFmZW9mKGZpbGUpKSB7CisJCWlmIChwYXJzZV9saW5lKGZpbGUsIHN5bSwgc3RhcnQsIGxlbikgPCAwKQorCQkJYnJlYWs7CisJfQorCisJcGNsb3NlKGZpbGUpOworfQorCitzdGF0aWMgdm9pZCBmaW5kX2Fubm90YXRpb25zKHZvaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5kOworCXN0cnVjdCBkc28gKmRzbzsKKwlpbnQgY291bnQgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShkc28sICZkc29zLCBub2RlKSB7CisKKwkJZm9yIChuZCA9IHJiX2ZpcnN0KCZkc28tPnN5bXMpOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQkJc3RydWN0IHN5bWJvbCAqc3ltID0gcmJfZW50cnkobmQsIHN0cnVjdCBzeW1ib2wsIHJiX25vZGUpOworCisJCQlpZiAoc3ltLT5oaXN0KSB7CisJCQkJYW5ub3RhdGVfc3ltKGRzbywgc3ltKTsKKwkJCQljb3VudCsrOworCQkJfQorCQl9CisJfQorCisJaWYgKCFjb3VudCkKKwkJcHJpbnRmKCIgRXJyb3I6IHN5bWJvbCAnJXMnIG5vdCBwcmVzZW50IGFtb25nc3QgdGhlIHNhbXBsZXMuXG4iLCBzeW1faGlzdF9maWx0ZXIpOworfQorCitzdGF0aWMgaW50IF9fY21kX2Fubm90YXRlKHZvaWQpCit7CisJaW50IHJldCwgcmMgPSBFWElUX0ZBSUxVUkU7CisJdW5zaWduZWQgbG9uZyBvZmZzZXQgPSAwOworCXVuc2lnbmVkIGxvbmcgaGVhZCA9IDA7CisJc3RydWN0IHN0YXQgc3RhdDsKKwlldmVudF90ICpldmVudDsKKwl1aW50MzJfdCBzaXplOworCWNoYXIgKmJ1ZjsKKworCXJlZ2lzdGVyX2lkbGVfdGhyZWFkKCk7CisKKwlpbnB1dCA9IG9wZW4oaW5wdXRfbmFtZSwgT19SRE9OTFkpOworCWlmIChpbnB1dCA8IDApIHsKKwkJcGVycm9yKCJmYWlsZWQgdG8gb3BlbiBmaWxlIik7CisJCWV4aXQoLTEpOworCX0KKworCXJldCA9IGZzdGF0KGlucHV0LCAmc3RhdCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJmYWlsZWQgdG8gc3RhdCBmaWxlIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmICghc3RhdC5zdF9zaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiemVyby1zaXplZCBmaWxlLCBub3RoaW5nIHRvIGRvIVxuIik7CisJCWV4aXQoMCk7CisJfQorCisJaWYgKGxvYWRfa2VybmVsKCkgPCAwKSB7CisJCXBlcnJvcigiZmFpbGVkIHRvIGxvYWQga2VybmVsIHN5bWJvbHMiKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKK3JlbWFwOgorCWJ1ZiA9IChjaGFyICopbW1hcChOVUxMLCBwYWdlX3NpemUgKiBtbWFwX3dpbmRvdywgUFJPVF9SRUFELAorCQkJICAgTUFQX1NIQVJFRCwgaW5wdXQsIG9mZnNldCk7CisJaWYgKGJ1ZiA9PSBNQVBfRkFJTEVEKSB7CisJCXBlcnJvcigiZmFpbGVkIHRvIG1tYXAgZmlsZSIpOworCQlleGl0KC0xKTsKKwl9CisKK21vcmU6CisJZXZlbnQgPSAoZXZlbnRfdCAqKShidWYgKyBoZWFkKTsKKworCXNpemUgPSBldmVudC0+aGVhZGVyLnNpemU7CisJaWYgKCFzaXplKQorCQlzaXplID0gODsKKworCWlmIChoZWFkICsgZXZlbnQtPmhlYWRlci5zaXplID49IHBhZ2Vfc2l6ZSAqIG1tYXBfd2luZG93KSB7CisJCXVuc2lnbmVkIGxvbmcgc2hpZnQgPSBwYWdlX3NpemUgKiAoaGVhZCAvIHBhZ2Vfc2l6ZSk7CisJCWludCByZXQ7CisKKwkJcmV0ID0gbXVubWFwKGJ1ZiwgcGFnZV9zaXplICogbW1hcF93aW5kb3cpOworCQlhc3NlcnQocmV0ID09IDApOworCisJCW9mZnNldCArPSBzaGlmdDsKKwkJaGVhZCAtPSBzaGlmdDsKKwkJZ290byByZW1hcDsKKwl9CisKKwlzaXplID0gZXZlbnQtPmhlYWRlci5zaXplOworCisJZHByaW50ZigiJXAgWyVwXTogZXZlbnQ6ICVkXG4iLAorCQkJKHZvaWQgKikob2Zmc2V0ICsgaGVhZCksCisJCQkodm9pZCAqKShsb25nKWV2ZW50LT5oZWFkZXIuc2l6ZSwKKwkJCWV2ZW50LT5oZWFkZXIudHlwZSk7CisKKwlpZiAoIXNpemUgfHwgcHJvY2Vzc19ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKSA8IDApIHsKKworCQlkcHJpbnRmKCIlcCBbJXBdOiBza2lwcGluZyB1bmtub3duIGhlYWRlciB0eXBlOiAlZFxuIiwKKwkJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJCWV2ZW50LT5oZWFkZXIudHlwZSk7CisKKwkJdG90YWxfdW5rbm93bisrOworCisJCS8qCisJCSAqIGFzc3VtZSB3ZSBsb3N0IHRyYWNrIG9mIHRoZSBzdHJlYW0sIGNoZWNrIGFsaWdubWVudCwgYW5kCisJCSAqIGluY3JlbWVudCBhIHNpbmdsZSB1NjQgaW4gdGhlIGhvcGUgdG8gY2F0Y2ggb24gYWdhaW4gJ3Nvb24nLgorCQkgKi8KKworCQlpZiAodW5saWtlbHkoaGVhZCAmIDcpKQorCQkJaGVhZCAmPSB+N1VMTDsKKworCQlzaXplID0gODsKKwl9CisKKwloZWFkICs9IHNpemU7CisKKwlpZiAob2Zmc2V0ICsgaGVhZCA8IHN0YXQuc3Rfc2l6ZSkKKwkJZ290byBtb3JlOworCisJcmMgPSBFWElUX1NVQ0NFU1M7CisJY2xvc2UoaW5wdXQpOworCisJZHByaW50ZigiICAgICAgSVAgZXZlbnRzOiAlMTBsZFxuIiwgdG90YWwpOworCWRwcmludGYoIiAgICBtbWFwIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsX21tYXApOworCWRwcmludGYoIiAgICBjb21tIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsX2NvbW0pOworCWRwcmludGYoIiAgICBmb3JrIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsX2ZvcmspOworCWRwcmludGYoIiB1bmtub3duIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsX3Vua25vd24pOworCisJaWYgKGR1bXBfdHJhY2UpCisJCXJldHVybiAwOworCisJaWYgKHZlcmJvc2UgPj0gMykKKwkJdGhyZWFkc19fZnByaW50ZihzdGRvdXQpOworCisJaWYgKHZlcmJvc2UgPj0gMikKKwkJZHNvc19fZnByaW50ZihzdGRvdXQpOworCisJY29sbGFwc2VfX3Jlc29ydCgpOworCW91dHB1dF9fcmVzb3J0KCk7CisKKwlmaW5kX2Fubm90YXRpb25zKCk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYW5ub3RhdGVfdXNhZ2VbXSA9IHsKKwkicGVyZiBhbm5vdGF0ZSBbPG9wdGlvbnM+XSA8Y29tbWFuZD4iLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwlPUFRfU1RSSU5HKCdpJywgImlucHV0IiwgJmlucHV0X25hbWUsICJmaWxlIiwKKwkJICAgICJpbnB1dCBmaWxlIG5hbWUiKSwKKwlPUFRfU1RSSU5HKCdzJywgInN5bWJvbCIsICZzeW1faGlzdF9maWx0ZXIsICJzeW1ib2wiLAorCQkgICAgInN5bWJvbCB0byBhbm5vdGF0ZSIpLAorCU9QVF9CT09MRUFOKCd2JywgInZlcmJvc2UiLCAmdmVyYm9zZSwKKwkJICAgICJiZSBtb3JlIHZlcmJvc2UgKHNob3cgc3ltYm9sIGFkZHJlc3MsIGV0YykiKSwKKwlPUFRfQk9PTEVBTignRCcsICJkdW1wLXJhdy10cmFjZSIsICZkdW1wX3RyYWNlLAorCQkgICAgImR1bXAgcmF3IHRyYWNlIGluIEFTQ0lJIiksCisJT1BUX1NUUklORygnaycsICJ2bWxpbnV4IiwgJnZtbGludXgsICJmaWxlIiwgInZtbGludXggcGF0aG5hbWUiKSwKKwlPUFRfRU5EKCkKK307CisKK3N0YXRpYyB2b2lkIHNldHVwX3NvcnRpbmcodm9pZCkKK3sKKwljaGFyICp0bXAsICp0b2ssICpzdHIgPSBzdHJkdXAoc29ydF9vcmRlcik7CisKKwlmb3IgKHRvayA9IHN0cnRva19yKHN0ciwgIiwgIiwgJnRtcCk7CisJCQl0b2s7IHRvayA9IHN0cnRva19yKE5VTEwsICIsICIsICZ0bXApKSB7CisJCWlmIChzb3J0X2RpbWVuc2lvbl9fYWRkKHRvaykgPCAwKSB7CisJCQllcnJvcigiVW5rbm93biAtLXNvcnQga2V5OiBgJXMnIiwgdG9rKTsKKwkJCXVzYWdlX3dpdGhfb3B0aW9ucyhhbm5vdGF0ZV91c2FnZSwgb3B0aW9ucyk7CisJCX0KKwl9CisKKwlmcmVlKHN0cik7Cit9CisKK2ludCBjbWRfYW5ub3RhdGUoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJc3ltYm9sX19pbml0KCk7CisKKwlwYWdlX3NpemUgPSBnZXRwYWdlc2l6ZSgpOworCisJYXJnYyA9IHBhcnNlX29wdGlvbnMoYXJnYywgYXJndiwgb3B0aW9ucywgYW5ub3RhdGVfdXNhZ2UsIDApOworCisJc2V0dXBfc29ydGluZygpOworCisJaWYgKGFyZ2MpIHsKKwkJLyoKKwkJICogU3BlY2lhbCBjYXNlOiBpZiB0aGVyZSdzIGFuIGFyZ3VtZW50IGxlZnQgdGhlbiBhc3N1bWUgdGhhCisJCSAqIGl0J3MgYSBzeW1ib2wgZmlsdGVyOgorCQkgKi8KKwkJaWYgKGFyZ2MgPiAxKQorCQkJdXNhZ2Vfd2l0aF9vcHRpb25zKGFubm90YXRlX3VzYWdlLCBvcHRpb25zKTsKKworCQlzeW1faGlzdF9maWx0ZXIgPSBhcmd2WzBdOworCX0KKworCWlmICghc3ltX2hpc3RfZmlsdGVyKQorCQl1c2FnZV93aXRoX29wdGlvbnMoYW5ub3RhdGVfdXNhZ2UsIG9wdGlvbnMpOworCisJc2V0dXBfcGFnZXIoKTsKKworCXJldHVybiBfX2NtZF9hbm5vdGF0ZSgpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWhlbHAuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1oZWxwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYzMmRjMwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1oZWxwLmMKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBidWlsdGluLWhlbHAuYworICoKKyAqIEJ1aWx0aW4gaGVscCBjb21tYW5kCisgKi8KKyNpbmNsdWRlICJ1dGlsL2NhY2hlLmgiCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorI2luY2x1ZGUgInV0aWwvZXhlY19jbWQuaCIKKyNpbmNsdWRlICJjb21tb24tY21kcy5oIgorI2luY2x1ZGUgInV0aWwvcGFyc2Utb3B0aW9ucy5oIgorI2luY2x1ZGUgInV0aWwvcnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJ1dGlsL2hlbHAuaCIKKworc3RhdGljIHN0cnVjdCBtYW5fdmlld2VyX2xpc3QgeworCXN0cnVjdCBtYW5fdmlld2VyX2xpc3QgKm5leHQ7CisJY2hhciBuYW1lW0ZMRVhfQVJSQVldOworfSAqbWFuX3ZpZXdlcl9saXN0OworCitzdGF0aWMgc3RydWN0IG1hbl92aWV3ZXJfaW5mb19saXN0IHsKKwlzdHJ1Y3QgbWFuX3ZpZXdlcl9pbmZvX2xpc3QgKm5leHQ7CisJY29uc3QgY2hhciAqaW5mbzsKKwljaGFyIG5hbWVbRkxFWF9BUlJBWV07Cit9ICptYW5fdmlld2VyX2luZm9fbGlzdDsKKworZW51bSBoZWxwX2Zvcm1hdCB7CisJSEVMUF9GT1JNQVRfTUFOLAorCUhFTFBfRk9STUFUX0lORk8sCisJSEVMUF9GT1JNQVRfV0VCLAorfTsKKworc3RhdGljIGludCBzaG93X2FsbCA9IDA7CitzdGF0aWMgZW51bSBoZWxwX2Zvcm1hdCBoZWxwX2Zvcm1hdCA9IEhFTFBfRk9STUFUX01BTjsKK3N0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGJ1aWx0aW5faGVscF9vcHRpb25zW10gPSB7CisJT1BUX0JPT0xFQU4oJ2EnLCAiYWxsIiwgJnNob3dfYWxsLCAicHJpbnQgYWxsIGF2YWlsYWJsZSBjb21tYW5kcyIpLAorCU9QVF9TRVRfSU5UKCdtJywgIm1hbiIsICZoZWxwX2Zvcm1hdCwgInNob3cgbWFuIHBhZ2UiLCBIRUxQX0ZPUk1BVF9NQU4pLAorCU9QVF9TRVRfSU5UKCd3JywgIndlYiIsICZoZWxwX2Zvcm1hdCwgInNob3cgbWFudWFsIGluIHdlYiBicm93c2VyIiwKKwkJCUhFTFBfRk9STUFUX1dFQiksCisJT1BUX1NFVF9JTlQoJ2knLCAiaW5mbyIsICZoZWxwX2Zvcm1hdCwgInNob3cgaW5mbyBwYWdlIiwKKwkJCUhFTFBfRk9STUFUX0lORk8pLAorCU9QVF9FTkQoKSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgYnVpbHRpbl9oZWxwX3VzYWdlW10gPSB7CisJInBlcmYgaGVscCBbLS1hbGxdIFstLW1hbnwtLXdlYnwtLWluZm9dIFtjb21tYW5kXSIsCisJTlVMTAorfTsKKworc3RhdGljIGVudW0gaGVscF9mb3JtYXQgcGFyc2VfaGVscF9mb3JtYXQoY29uc3QgY2hhciAqZm9ybWF0KQoreworCWlmICghc3RyY21wKGZvcm1hdCwgIm1hbiIpKQorCQlyZXR1cm4gSEVMUF9GT1JNQVRfTUFOOworCWlmICghc3RyY21wKGZvcm1hdCwgImluZm8iKSkKKwkJcmV0dXJuIEhFTFBfRk9STUFUX0lORk87CisJaWYgKCFzdHJjbXAoZm9ybWF0LCAid2ViIikgfHwgIXN0cmNtcChmb3JtYXQsICJodG1sIikpCisJCXJldHVybiBIRUxQX0ZPUk1BVF9XRUI7CisJZGllKCJ1bnJlY29nbml6ZWQgaGVscCBmb3JtYXQgJyVzJyIsIGZvcm1hdCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnZXRfbWFuX3ZpZXdlcl9pbmZvKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IG1hbl92aWV3ZXJfaW5mb19saXN0ICp2aWV3ZXI7CisKKwlmb3IgKHZpZXdlciA9IG1hbl92aWV3ZXJfaW5mb19saXN0OyB2aWV3ZXI7IHZpZXdlciA9IHZpZXdlci0+bmV4dCkKKwl7CisJCWlmICghc3RyY2FzZWNtcChuYW1lLCB2aWV3ZXItPm5hbWUpKQorCQkJcmV0dXJuIHZpZXdlci0+aW5mbzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZW1hY3NjbGllbnRfdmVyc2lvbih2b2lkKQoreworCXN0cnVjdCBzdHJidWYgYnVmZmVyID0gU1RSQlVGX0lOSVQ7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgZWNfcHJvY2VzczsKKwljb25zdCBjaGFyICphcmd2X2VjW10gPSB7ICJlbWFjc2NsaWVudCIsICItLXZlcnNpb24iLCBOVUxMIH07CisJaW50IHZlcnNpb247CisKKwkvKiBlbWFjc2NsaWVudCBwcmludHMgaXRzIHZlcnNpb24gbnVtYmVyIG9uIHN0ZGVyciAqLworCW1lbXNldCgmZWNfcHJvY2VzcywgMCwgc2l6ZW9mKGVjX3Byb2Nlc3MpKTsKKwllY19wcm9jZXNzLmFyZ3YgPSBhcmd2X2VjOworCWVjX3Byb2Nlc3MuZXJyID0gLTE7CisJZWNfcHJvY2Vzcy5zdGRvdXRfdG9fc3RkZXJyID0gMTsKKwlpZiAoc3RhcnRfY29tbWFuZCgmZWNfcHJvY2VzcykpIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gc3RhcnQgZW1hY3NjbGllbnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlzdHJidWZfcmVhZCgmYnVmZmVyLCBlY19wcm9jZXNzLmVyciwgMjApOworCWNsb3NlKGVjX3Byb2Nlc3MuZXJyKTsKKworCS8qCisJICogRG9uJ3QgYm90aGVyIGNoZWNraW5nIHJldHVybiB2YWx1ZSwgYmVjYXVzZSAiZW1hY3NjbGllbnQgLS12ZXJzaW9uIgorCSAqIHNlZW1zIHRvIGFsd2F5cyBleGl0cyB3aXRoIGNvZGUgMS4KKwkgKi8KKwlmaW5pc2hfY29tbWFuZCgmZWNfcHJvY2Vzcyk7CisKKwlpZiAocHJlZml4Y21wKGJ1ZmZlci5idWYsICJlbWFjc2NsaWVudCIpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIGVtYWNzY2xpZW50IHZlcnNpb24uXG4iKTsKKwkJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJidWZfcmVtb3ZlKCZidWZmZXIsIDAsIHN0cmxlbigiZW1hY3NjbGllbnQiKSk7CisJdmVyc2lvbiA9IGF0b2koYnVmZmVyLmJ1Zik7CisKKwlpZiAodmVyc2lvbiA8IDIyKSB7CisJCWZwcmludGYoc3RkZXJyLAorCQkJImVtYWNzY2xpZW50IHZlcnNpb24gJyVkJyB0b28gb2xkICg8IDIyKS5cbiIsCisJCQl2ZXJzaW9uKTsKKwkJc3RyYnVmX3JlbGVhc2UoJmJ1ZmZlcik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzdHJidWZfcmVsZWFzZSgmYnVmZmVyKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZXhlY193b21hbl9lbWFjcyhjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyICpwYWdlKQoreworCWlmICghY2hlY2tfZW1hY3NjbGllbnRfdmVyc2lvbigpKSB7CisJCS8qIFRoaXMgd29ya3Mgb25seSB3aXRoIGVtYWNzY2xpZW50IHZlcnNpb24gPj0gMjIuICovCisJCXN0cnVjdCBzdHJidWYgbWFuX3BhZ2UgPSBTVFJCVUZfSU5JVDsKKworCQlpZiAoIXBhdGgpCisJCQlwYXRoID0gImVtYWNzY2xpZW50IjsKKwkJc3RyYnVmX2FkZGYoJm1hbl9wYWdlLCAiKHdvbWFuIFwiJXNcIikiLCBwYWdlKTsKKwkJZXhlY2xwKHBhdGgsICJlbWFjc2NsaWVudCIsICItZSIsIG1hbl9wYWdlLmJ1ZiwgTlVMTCk7CisJCXdhcm5pbmcoImZhaWxlZCB0byBleGVjICclcyc6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWNfbWFuX2tvbnF1ZXJvcihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyICpwYWdlKQoreworCWNvbnN0IGNoYXIgKmRpc3BsYXkgPSBnZXRlbnYoIkRJU1BMQVkiKTsKKwlpZiAoZGlzcGxheSAmJiAqZGlzcGxheSkgeworCQlzdHJ1Y3Qgc3RyYnVmIG1hbl9wYWdlID0gU1RSQlVGX0lOSVQ7CisJCWNvbnN0IGNoYXIgKmZpbGVuYW1lID0gImtmbWNsaWVudCI7CisKKwkJLyogSXQncyBzaW1wbGVyIHRvIGxhdW5jaCBrb25xdWVyb3IgdXNpbmcga2ZtY2xpZW50LiAqLworCQlpZiAocGF0aCkgeworCQkJY29uc3QgY2hhciAqZmlsZSA9IHN0cnJjaHIocGF0aCwgJy8nKTsKKwkJCWlmIChmaWxlICYmICFzdHJjbXAoZmlsZSArIDEsICJrb25xdWVyb3IiKSkgeworCQkJCWNoYXIgKm5ldyA9IHN0cmR1cChwYXRoKTsKKwkJCQljaGFyICpkZXN0ID0gc3RycmNocihuZXcsICcvJyk7CisKKwkJCQkvKiBzdHJsZW4oImtvbnF1ZXJvciIpID09IHN0cmxlbigia2ZtY2xpZW50IikgKi8KKwkJCQlzdHJjcHkoZGVzdCArIDEsICJrZm1jbGllbnQiKTsKKwkJCQlwYXRoID0gbmV3OworCQkJfQorCQkJaWYgKGZpbGUpCisJCQkJZmlsZW5hbWUgPSBmaWxlOworCQl9IGVsc2UKKwkJCXBhdGggPSAia2ZtY2xpZW50IjsKKwkJc3RyYnVmX2FkZGYoJm1hbl9wYWdlLCAibWFuOiVzKDEpIiwgcGFnZSk7CisJCWV4ZWNscChwYXRoLCBmaWxlbmFtZSwgIm5ld1RhYiIsIG1hbl9wYWdlLmJ1ZiwgTlVMTCk7CisJCXdhcm5pbmcoImZhaWxlZCB0byBleGVjICclcyc6ICVzIiwgcGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIGV4ZWNfbWFuX21hbihjb25zdCBjaGFyKiBwYXRoLCBjb25zdCBjaGFyICpwYWdlKQoreworCWlmICghcGF0aCkKKwkJcGF0aCA9ICJtYW4iOworCWV4ZWNscChwYXRoLCAibWFuIiwgcGFnZSwgTlVMTCk7CisJd2FybmluZygiZmFpbGVkIHRvIGV4ZWMgJyVzJzogJXMiLCBwYXRoLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdGF0aWMgdm9pZCBleGVjX21hbl9jbWQoY29uc3QgY2hhciAqY21kLCBjb25zdCBjaGFyICpwYWdlKQoreworCXN0cnVjdCBzdHJidWYgc2hlbGxfY21kID0gU1RSQlVGX0lOSVQ7CisJc3RyYnVmX2FkZGYoJnNoZWxsX2NtZCwgIiVzICVzIiwgY21kLCBwYWdlKTsKKwlleGVjbCgiL2Jpbi9zaCIsICJzaCIsICItYyIsIHNoZWxsX2NtZC5idWYsIE5VTEwpOworCXdhcm5pbmcoImZhaWxlZCB0byBleGVjICclcyc6ICVzIiwgY21kLCBzdHJlcnJvcihlcnJubykpOworfQorCitzdGF0aWMgdm9pZCBhZGRfbWFuX3ZpZXdlcihjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBtYW5fdmlld2VyX2xpc3QgKipwID0gJm1hbl92aWV3ZXJfbGlzdDsKKwlzaXplX3QgbGVuID0gc3RybGVuKG5hbWUpOworCisJd2hpbGUgKCpwKQorCQlwID0gJigoKnApLT5uZXh0KTsKKwkqcCA9IGNhbGxvYygxLCAoc2l6ZW9mKCoqcCkgKyBsZW4gKyAxKSk7CisJc3RybmNweSgoKnApLT5uYW1lLCBuYW1lLCBsZW4pOworfQorCitzdGF0aWMgaW50IHN1cHBvcnRlZF9tYW5fdmlld2VyKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pCit7CisJcmV0dXJuICghc3RybmNhc2VjbXAoIm1hbiIsIG5hbWUsIGxlbikgfHwKKwkJIXN0cm5jYXNlY21wKCJ3b21hbiIsIG5hbWUsIGxlbikgfHwKKwkJIXN0cm5jYXNlY21wKCJrb25xdWVyb3IiLCBuYW1lLCBsZW4pKTsKK30KKworc3RhdGljIHZvaWQgZG9fYWRkX21hbl92aWV3ZXJfaW5mbyhjb25zdCBjaGFyICpuYW1lLAorCQkJCSAgIHNpemVfdCBsZW4sCisJCQkJICAgY29uc3QgY2hhciAqdmFsdWUpCit7CisJc3RydWN0IG1hbl92aWV3ZXJfaW5mb19saXN0ICpuZXcgPSBjYWxsb2MoMSwgc2l6ZW9mKCpuZXcpICsgbGVuICsgMSk7CisKKwlzdHJuY3B5KG5ldy0+bmFtZSwgbmFtZSwgbGVuKTsKKwluZXctPmluZm8gPSBzdHJkdXAodmFsdWUpOworCW5ldy0+bmV4dCA9IG1hbl92aWV3ZXJfaW5mb19saXN0OworCW1hbl92aWV3ZXJfaW5mb19saXN0ID0gbmV3OworfQorCitzdGF0aWMgaW50IGFkZF9tYW5fdmlld2VyX3BhdGgoY29uc3QgY2hhciAqbmFtZSwKKwkJCSAgICAgICBzaXplX3QgbGVuLAorCQkJICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmIChzdXBwb3J0ZWRfbWFuX3ZpZXdlcihuYW1lLCBsZW4pKQorCQlkb19hZGRfbWFuX3ZpZXdlcl9pbmZvKG5hbWUsIGxlbiwgdmFsdWUpOworCWVsc2UKKwkJd2FybmluZygiJyVzJzogcGF0aCBmb3IgdW5zdXBwb3J0ZWQgbWFuIHZpZXdlci5cbiIKKwkJCSJQbGVhc2UgY29uc2lkZXIgdXNpbmcgJ21hbi48dG9vbD4uY21kJyBpbnN0ZWFkLiIsCisJCQluYW1lKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFkZF9tYW5fdmlld2VyX2NtZChjb25zdCBjaGFyICpuYW1lLAorCQkJICAgICAgc2l6ZV90IGxlbiwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmIChzdXBwb3J0ZWRfbWFuX3ZpZXdlcihuYW1lLCBsZW4pKQorCQl3YXJuaW5nKCInJXMnOiBjbWQgZm9yIHN1cHBvcnRlZCBtYW4gdmlld2VyLlxuIgorCQkJIlBsZWFzZSBjb25zaWRlciB1c2luZyAnbWFuLjx0b29sPi5wYXRoJyBpbnN0ZWFkLiIsCisJCQluYW1lKTsKKwllbHNlCisJCWRvX2FkZF9tYW5fdmlld2VyX2luZm8obmFtZSwgbGVuLCB2YWx1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhZGRfbWFuX3ZpZXdlcl9pbmZvKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJY29uc3QgY2hhciAqbmFtZSA9IHZhciArIDQ7CisJY29uc3QgY2hhciAqc3Via2V5ID0gc3RycmNocihuYW1lLCAnLicpOworCisJaWYgKCFzdWJrZXkpCisJCXJldHVybiBlcnJvcigiQ29uZmlnIHdpdGggbm8ga2V5IGZvciBtYW4gdmlld2VyOiAlcyIsIG5hbWUpOworCisJaWYgKCFzdHJjbXAoc3Via2V5LCAiLnBhdGgiKSkgeworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKHZhcik7CisJCXJldHVybiBhZGRfbWFuX3ZpZXdlcl9wYXRoKG5hbWUsIHN1YmtleSAtIG5hbWUsIHZhbHVlKTsKKwl9CisJaWYgKCFzdHJjbXAoc3Via2V5LCAiLmNtZCIpKSB7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJcmV0dXJuIGFkZF9tYW5fdmlld2VyX2NtZChuYW1lLCBzdWJrZXkgLSBuYW1lLCB2YWx1ZSk7CisJfQorCisJd2FybmluZygiJyVzJzogdW5zdXBwb3J0ZWQgbWFuIHZpZXdlciBzdWIga2V5LiIsIHN1YmtleSk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVyZl9oZWxwX2NvbmZpZyhjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlLCB2b2lkICpjYikKK3sKKwlpZiAoIXN0cmNtcCh2YXIsICJoZWxwLmZvcm1hdCIpKSB7CisJCWlmICghdmFsdWUpCisJCQlyZXR1cm4gY29uZmlnX2Vycm9yX25vbmJvb2wodmFyKTsKKwkJaGVscF9mb3JtYXQgPSBwYXJzZV9oZWxwX2Zvcm1hdCh2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXN0cmNtcCh2YXIsICJtYW4udmlld2VyIikpIHsKKwkJaWYgKCF2YWx1ZSkKKwkJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCQlhZGRfbWFuX3ZpZXdlcih2YWx1ZSk7CisJCXJldHVybiAwOworCX0KKwlpZiAoIXByZWZpeGNtcCh2YXIsICJtYW4uIikpCisJCXJldHVybiBhZGRfbWFuX3ZpZXdlcl9pbmZvKHZhciwgdmFsdWUpOworCisJcmV0dXJuIHBlcmZfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSwgY2IpOworfQorCitzdGF0aWMgc3RydWN0IGNtZG5hbWVzIG1haW5fY21kcywgb3RoZXJfY21kczsKKwordm9pZCBsaXN0X2NvbW1vbl9jbWRzX2hlbHAodm9pZCkKK3sKKwlpbnQgaSwgbG9uZ2VzdCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tb25fY21kcyk7IGkrKykgeworCQlpZiAobG9uZ2VzdCA8IHN0cmxlbihjb21tb25fY21kc1tpXS5uYW1lKSkKKwkJCWxvbmdlc3QgPSBzdHJsZW4oY29tbW9uX2NtZHNbaV0ubmFtZSk7CisJfQorCisJcHV0cygiIFRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgcGVyZiBjb21tYW5kcyBhcmU6Iik7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29tbW9uX2NtZHMpOyBpKyspIHsKKwkJcHJpbnRmKCIgICAlcyAgICIsIGNvbW1vbl9jbWRzW2ldLm5hbWUpOworCQltcHV0X2NoYXIoJyAnLCBsb25nZXN0IC0gc3RybGVuKGNvbW1vbl9jbWRzW2ldLm5hbWUpKTsKKwkJcHV0cyhjb21tb25fY21kc1tpXS5oZWxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaXNfcGVyZl9jb21tYW5kKGNvbnN0IGNoYXIgKnMpCit7CisJcmV0dXJuIGlzX2luX2NtZGxpc3QoJm1haW5fY21kcywgcykgfHwKKwkJaXNfaW5fY21kbGlzdCgmb3RoZXJfY21kcywgcyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcmVwZW5kKGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqY21kKQoreworCXNpemVfdCBwcmVfbGVuID0gc3RybGVuKHByZWZpeCk7CisJc2l6ZV90IGNtZF9sZW4gPSBzdHJsZW4oY21kKTsKKwljaGFyICpwID0gbWFsbG9jKHByZV9sZW4gKyBjbWRfbGVuICsgMSk7CisJbWVtY3B5KHAsIHByZWZpeCwgcHJlX2xlbik7CisJc3RyY3B5KHAgKyBwcmVfbGVuLCBjbWQpOworCXJldHVybiBwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY21kX3RvX3BhZ2UoY29uc3QgY2hhciAqcGVyZl9jbWQpCit7CisJaWYgKCFwZXJmX2NtZCkKKwkJcmV0dXJuICJwZXJmIjsKKwllbHNlIGlmICghcHJlZml4Y21wKHBlcmZfY21kLCAicGVyZiIpKQorCQlyZXR1cm4gcGVyZl9jbWQ7CisJZWxzZSBpZiAoaXNfcGVyZl9jb21tYW5kKHBlcmZfY21kKSkKKwkJcmV0dXJuIHByZXBlbmQoInBlcmYtIiwgcGVyZl9jbWQpOworCWVsc2UKKwkJcmV0dXJuIHByZXBlbmQoInBlcmYtIiwgcGVyZl9jbWQpOworfQorCitzdGF0aWMgdm9pZCBzZXR1cF9tYW5fcGF0aCh2b2lkKQoreworCXN0cnVjdCBzdHJidWYgbmV3X3BhdGggPSBTVFJCVUZfSU5JVDsKKwljb25zdCBjaGFyICpvbGRfcGF0aCA9IGdldGVudigiTUFOUEFUSCIpOworCisJLyogV2Ugc2hvdWxkIGFsd2F5cyBwdXQgJzonIGFmdGVyIG91ciBwYXRoLiBJZiB0aGVyZSBpcyBubworCSAqIG9sZF9wYXRoLCB0aGUgJzonIGF0IHRoZSBlbmQgd2lsbCBsZXQgJ21hbicgdG8gdHJ5CisJICogc3lzdGVtLXdpZGUgcGF0aHMgYWZ0ZXIgb3VycyB0byBmaW5kIHRoZSBtYW51YWwgcGFnZS4gSWYKKwkgKiB0aGVyZSBpcyBvbGRfcGF0aCwgd2UgbmVlZCAnOicgYXMgZGVsaW1pdGVyLiAqLworCXN0cmJ1Zl9hZGRzdHIoJm5ld19wYXRoLCBzeXN0ZW1fcGF0aChQRVJGX01BTl9QQVRIKSk7CisJc3RyYnVmX2FkZGNoKCZuZXdfcGF0aCwgJzonKTsKKwlpZiAob2xkX3BhdGgpCisJCXN0cmJ1Zl9hZGRzdHIoJm5ld19wYXRoLCBvbGRfcGF0aCk7CisKKwlzZXRlbnYoIk1BTlBBVEgiLCBuZXdfcGF0aC5idWYsIDEpOworCisJc3RyYnVmX3JlbGVhc2UoJm5ld19wYXRoKTsKK30KKworc3RhdGljIHZvaWQgZXhlY192aWV3ZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqcGFnZSkKK3sKKwljb25zdCBjaGFyICppbmZvID0gZ2V0X21hbl92aWV3ZXJfaW5mbyhuYW1lKTsKKworCWlmICghc3RyY2FzZWNtcChuYW1lLCAibWFuIikpCisJCWV4ZWNfbWFuX21hbihpbmZvLCBwYWdlKTsKKwllbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAid29tYW4iKSkKKwkJZXhlY193b21hbl9lbWFjcyhpbmZvLCBwYWdlKTsKKwllbHNlIGlmICghc3RyY2FzZWNtcChuYW1lLCAia29ucXVlcm9yIikpCisJCWV4ZWNfbWFuX2tvbnF1ZXJvcihpbmZvLCBwYWdlKTsKKwllbHNlIGlmIChpbmZvKQorCQlleGVjX21hbl9jbWQoaW5mbywgcGFnZSk7CisJZWxzZQorCQl3YXJuaW5nKCInJXMnOiB1bmtub3duIG1hbiB2aWV3ZXIuIiwgbmFtZSk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfbWFuX3BhZ2UoY29uc3QgY2hhciAqcGVyZl9jbWQpCit7CisJc3RydWN0IG1hbl92aWV3ZXJfbGlzdCAqdmlld2VyOworCWNvbnN0IGNoYXIgKnBhZ2UgPSBjbWRfdG9fcGFnZShwZXJmX2NtZCk7CisJY29uc3QgY2hhciAqZmFsbGJhY2sgPSBnZXRlbnYoIlBFUkZfTUFOX1ZJRVdFUiIpOworCisJc2V0dXBfbWFuX3BhdGgoKTsKKwlmb3IgKHZpZXdlciA9IG1hbl92aWV3ZXJfbGlzdDsgdmlld2VyOyB2aWV3ZXIgPSB2aWV3ZXItPm5leHQpCisJeworCQlleGVjX3ZpZXdlcih2aWV3ZXItPm5hbWUsIHBhZ2UpOyAvKiB3aWxsIHJldHVybiB3aGVuIHVuYWJsZSAqLworCX0KKwlpZiAoZmFsbGJhY2spCisJCWV4ZWNfdmlld2VyKGZhbGxiYWNrLCBwYWdlKTsKKwlleGVjX3ZpZXdlcigibWFuIiwgcGFnZSk7CisJZGllKCJubyBtYW4gdmlld2VyIGhhbmRsZWQgdGhlIHJlcXVlc3QiKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19pbmZvX3BhZ2UoY29uc3QgY2hhciAqcGVyZl9jbWQpCit7CisJY29uc3QgY2hhciAqcGFnZSA9IGNtZF90b19wYWdlKHBlcmZfY21kKTsKKwlzZXRlbnYoIklORk9QQVRIIiwgc3lzdGVtX3BhdGgoUEVSRl9JTkZPX1BBVEgpLCAxKTsKKwlleGVjbHAoImluZm8iLCAiaW5mbyIsICJwZXJmbWFuIiwgcGFnZSwgTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9odG1sX3BhZ2VfcGF0aChzdHJ1Y3Qgc3RyYnVmICpwYWdlX3BhdGgsIGNvbnN0IGNoYXIgKnBhZ2UpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJY29uc3QgY2hhciAqaHRtbF9wYXRoID0gc3lzdGVtX3BhdGgoUEVSRl9IVE1MX1BBVEgpOworCisJLyogQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgcGVyZiBkb2N1bWVudGF0aW9uIGRpcmVjdG9yeS4gKi8KKwlpZiAoc3RhdChta3BhdGgoIiVzL3BlcmYuaHRtbCIsIGh0bWxfcGF0aCksICZzdCkKKwkgICAgfHwgIVNfSVNSRUcoc3Quc3RfbW9kZSkpCisJCWRpZSgiJyVzJzogbm90IGEgZG9jdW1lbnRhdGlvbiBkaXJlY3RvcnkuIiwgaHRtbF9wYXRoKTsKKworCXN0cmJ1Zl9pbml0KHBhZ2VfcGF0aCwgMCk7CisJc3RyYnVmX2FkZGYocGFnZV9wYXRoLCAiJXMvJXMuaHRtbCIsIGh0bWxfcGF0aCwgcGFnZSk7Cit9CisKKy8qCisgKiBJZiBvcGVuX2h0bWwgaXMgbm90IGRlZmluZWQgaW4gYSBwbGF0Zm9ybS1zcGVjaWZpYyB3YXkgKHNlZSBmb3IKKyAqIGV4YW1wbGUgY29tcGF0L21pbmd3LmgpLCB3ZSB1c2UgdGhlIHNjcmlwdCB3ZWItLWJyb3dzZSB0byBkaXNwbGF5CisgKiBIVE1MLgorICovCisjaWZuZGVmIG9wZW5faHRtbAorc3RhdGljIHZvaWQgb3Blbl9odG1sKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJZXhlY2xfcGVyZl9jbWQoIndlYi0tYnJvd3NlIiwgIi1jIiwgImhlbHAuYnJvd3NlciIsIHBhdGgsIE5VTEwpOworfQorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHNob3dfaHRtbF9wYWdlKGNvbnN0IGNoYXIgKnBlcmZfY21kKQoreworCWNvbnN0IGNoYXIgKnBhZ2UgPSBjbWRfdG9fcGFnZShwZXJmX2NtZCk7CisJc3RydWN0IHN0cmJ1ZiBwYWdlX3BhdGg7IC8qIGl0IGxlYWtzIGJ1dCB3ZSBleGVjIGJlbGxvdyAqLworCisJZ2V0X2h0bWxfcGFnZV9wYXRoKCZwYWdlX3BhdGgsIHBhZ2UpOworCisJb3Blbl9odG1sKHBhZ2VfcGF0aC5idWYpOworfQorCitpbnQgY21kX2hlbHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJY29uc3QgY2hhciAqYWxpYXM7CisJbG9hZF9jb21tYW5kX2xpc3QoInBlcmYtIiwgJm1haW5fY21kcywgJm90aGVyX2NtZHMpOworCisJcGVyZl9jb25maWcocGVyZl9oZWxwX2NvbmZpZywgTlVMTCk7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBidWlsdGluX2hlbHBfb3B0aW9ucywKKwkJCWJ1aWx0aW5faGVscF91c2FnZSwgMCk7CisKKwlpZiAoc2hvd19hbGwpIHsKKwkJcHJpbnRmKCJcbiB1c2FnZTogJXNcblxuIiwgcGVyZl91c2FnZV9zdHJpbmcpOworCQlsaXN0X2NvbW1hbmRzKCJwZXJmIGNvbW1hbmRzIiwgJm1haW5fY21kcywgJm90aGVyX2NtZHMpOworCQlwcmludGYoIiAlc1xuXG4iLCBwZXJmX21vcmVfaW5mb19zdHJpbmcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAoIWFyZ3ZbMF0pIHsKKwkJcHJpbnRmKCJcbiB1c2FnZTogJXNcblxuIiwgcGVyZl91c2FnZV9zdHJpbmcpOworCQlsaXN0X2NvbW1vbl9jbWRzX2hlbHAoKTsKKwkJcHJpbnRmKCJcbiAlc1xuXG4iLCBwZXJmX21vcmVfaW5mb19zdHJpbmcpOworCQlyZXR1cm4gMDsKKwl9CisKKwlhbGlhcyA9IGFsaWFzX2xvb2t1cChhcmd2WzBdKTsKKwlpZiAoYWxpYXMgJiYgIWlzX3BlcmZfY29tbWFuZChhcmd2WzBdKSkgeworCQlwcmludGYoImBwZXJmICVzJyBpcyBhbGlhc2VkIHRvIGAlcydcbiIsIGFyZ3ZbMF0sIGFsaWFzKTsKKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChoZWxwX2Zvcm1hdCkgeworCWNhc2UgSEVMUF9GT1JNQVRfTUFOOgorCQlzaG93X21hbl9wYWdlKGFyZ3ZbMF0pOworCQlicmVhazsKKwljYXNlIEhFTFBfRk9STUFUX0lORk86CisJCXNob3dfaW5mb19wYWdlKGFyZ3ZbMF0pOworCQlicmVhazsKKwljYXNlIEhFTFBfRk9STUFUX1dFQjoKKwkJc2hvd19odG1sX3BhZ2UoYXJndlswXSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9idWlsdGluLWxpc3QuYyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1saXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU2MGUzNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1saXN0LmMKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIGJ1aWx0aW4tbGlzdC5jCisgKgorICogQnVpbHRpbiBsaXN0IGNvbW1hbmQ6IGxpc3QgYWxsIGV2ZW50IHR5cGVzCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5LCBUaG9tYXMgR2xlaXhuZXIgPHRnbHhAbGludXRyb25peC5kZT4KKyAqIENvcHlyaWdodCAoQykgMjAwOC0yMDA5LCBSZWQgSGF0IEluYywgSW5nbyBNb2xuYXIgPG1pbmdvQHJlZGhhdC5jb20+CisgKi8KKyNpbmNsdWRlICJidWlsdGluLmgiCisKKyNpbmNsdWRlICJwZXJmLmgiCisKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLWV2ZW50cy5oIgorCitpbnQgY21kX2xpc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcHJpbnRfZXZlbnRzKCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVjb3JkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkyNTllNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZWNvcmQuYwpAQCAtMCwwICsxLDU4MiBAQAorLyoKKyAqIGJ1aWx0aW4tcmVjb3JkLmMKKyAqCisgKiBCdWlsdGluIHJlY29yZCBjb21tYW5kOiBSZWNvcmQgdGhlIHByb2ZpbGUgb2YgYSB3b3JrbG9hZAorICogKG9yIGEgQ1BVLCBvciBhIFBJRCkgaW50byB0aGUgcGVyZi5kYXRhIG91dHB1dCBmaWxlIC0gZm9yCisgKiBsYXRlciBhbmFseXNpcyB2aWEgcGVyZiByZXBvcnQuCisgKi8KKyNpbmNsdWRlICJidWlsdGluLmgiCisKKyNpbmNsdWRlICJwZXJmLmgiCisKKyNpbmNsdWRlICJ1dGlsL3V0aWwuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLWV2ZW50cy5oIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nLmgiCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorCisjZGVmaW5lIEFMSUdOKHgsIGEpCQlfX0FMSUdOX01BU0soeCwgKHR5cGVvZih4KSkoYSktMSkKKyNkZWZpbmUgX19BTElHTl9NQVNLKHgsIG1hc2spCSgoKHgpKyhtYXNrKSkmfihtYXNrKSkKKworc3RhdGljIGludAkJCWZkW01BWF9OUl9DUFVTXVtNQVhfQ09VTlRFUlNdOworCitzdGF0aWMgbG9uZwkJCWRlZmF1bHRfaW50ZXJ2YWwJCT0gMTAwMDAwOworCitzdGF0aWMgaW50CQkJbnJfY3B1cwkJCQk9IDA7CitzdGF0aWMgdW5zaWduZWQgaW50CQlwYWdlX3NpemU7CitzdGF0aWMgdW5zaWduZWQgaW50CQltbWFwX3BhZ2VzCQkJPSAxMjg7CitzdGF0aWMgaW50CQkJZnJlcQkJCQk9IDA7CitzdGF0aWMgaW50CQkJb3V0cHV0Oworc3RhdGljIGNvbnN0IGNoYXIJCSpvdXRwdXRfbmFtZQkJCT0gInBlcmYuZGF0YSI7CitzdGF0aWMgaW50CQkJZ3JvdXAJCQkJPSAwOworc3RhdGljIHVuc2lnbmVkIGludAkJcmVhbHRpbWVfcHJpbwkJCT0gMDsKK3N0YXRpYyBpbnQJCQlzeXN0ZW1fd2lkZQkJCT0gMDsKK3N0YXRpYyBwaWRfdAkJCXRhcmdldF9waWQJCQk9IC0xOworc3RhdGljIGludAkJCWluaGVyaXQJCQkJPSAxOworc3RhdGljIGludAkJCWZvcmNlCQkJCT0gMDsKK3N0YXRpYyBpbnQJCQlhcHBlbmRfZmlsZQkJCT0gMDsKK3N0YXRpYyBpbnQJCQl2ZXJib3NlCQkJCT0gMDsKKworc3RhdGljIGxvbmcJCQlzYW1wbGVzOworc3RhdGljIHN0cnVjdCB0aW1ldmFsCQlsYXN0X3JlYWQ7CitzdGF0aWMgc3RydWN0IHRpbWV2YWwJCXRoaXNfcmVhZDsKKworc3RhdGljIF9fdTY0CQkJYnl0ZXNfd3JpdHRlbjsKKworc3RhdGljIHN0cnVjdCBwb2xsZmQJCWV2ZW50X2FycmF5W01BWF9OUl9DUFVTICogTUFYX0NPVU5URVJTXTsKKworc3RhdGljIGludAkJCW5yX3BvbGw7CitzdGF0aWMgaW50CQkJbnJfY3B1OworCitzdHJ1Y3QgbW1hcF9ldmVudCB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwlfX3UzMgkJCQlwaWQ7CisJX191MzIJCQkJdGlkOworCV9fdTY0CQkJCXN0YXJ0OworCV9fdTY0CQkJCWxlbjsKKwlfX3U2NAkJCQlwZ29mZjsKKwljaGFyCQkJCWZpbGVuYW1lW1BBVEhfTUFYXTsKK307CisKK3N0cnVjdCBjb21tX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIJaGVhZGVyOworCV9fdTMyCQkJCXBpZDsKKwlfX3UzMgkJCQl0aWQ7CisJY2hhcgkJCQljb21tWzE2XTsKK307CisKKworc3RydWN0IG1tYXBfZGF0YSB7CisJaW50CQkJY291bnRlcjsKKwl2b2lkCQkJKmJhc2U7CisJdW5zaWduZWQgaW50CQltYXNrOworCXVuc2lnbmVkIGludAkJcHJldjsKK307CisKK3N0YXRpYyBzdHJ1Y3QgbW1hcF9kYXRhCQltbWFwX2FycmF5W01BWF9OUl9DUFVTXVtNQVhfQ09VTlRFUlNdOworCitzdGF0aWMgdW5zaWduZWQgaW50IG1tYXBfcmVhZF9oZWFkKHN0cnVjdCBtbWFwX2RhdGEgKm1kKQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfbW1hcF9wYWdlICpwYyA9IG1kLT5iYXNlOworCWludCBoZWFkOworCisJaGVhZCA9IHBjLT5kYXRhX2hlYWQ7CisJcm1iKCk7CisKKwlyZXR1cm4gaGVhZDsKK30KKworc3RhdGljIHZvaWQgbW1hcF9yZWFkKHN0cnVjdCBtbWFwX2RhdGEgKm1kKQoreworCXVuc2lnbmVkIGludCBoZWFkID0gbW1hcF9yZWFkX2hlYWQobWQpOworCXVuc2lnbmVkIGludCBvbGQgPSBtZC0+cHJldjsKKwl1bnNpZ25lZCBjaGFyICpkYXRhID0gbWQtPmJhc2UgKyBwYWdlX3NpemU7CisJdW5zaWduZWQgbG9uZyBzaXplOworCXZvaWQgKmJ1ZjsKKwlpbnQgZGlmZjsKKworCWdldHRpbWVvZmRheSgmdGhpc19yZWFkLCBOVUxMKTsKKworCS8qCisJICogSWYgd2UncmUgZnVydGhlciBiZWhpbmQgdGhhbiBoYWxmIHRoZSBidWZmZXIsIHRoZXJlJ3MgYSBjaGFuY2UKKwkgKiB0aGUgd3JpdGVyIHdpbGwgYml0ZSBvdXIgdGFpbCBhbmQgbWVzcyB1cCB0aGUgc2FtcGxlcyB1bmRlciB1cy4KKwkgKgorCSAqIElmIHdlIHNvbWVob3cgZW5kZWQgdXAgYWhlYWQgb2YgdGhlIGhlYWQsIHdlIGdvdCBtZXNzZWQgdXAuCisJICoKKwkgKiBJbiBlaXRoZXIgY2FzZSwgdHJ1bmNhdGUgYW5kIHJlc3RhcnQgYXQgaGVhZC4KKwkgKi8KKwlkaWZmID0gaGVhZCAtIG9sZDsKKwlpZiAoZGlmZiA+IG1kLT5tYXNrIC8gMiB8fCBkaWZmIDwgMCkgeworCQlzdHJ1Y3QgdGltZXZhbCBpdjsKKwkJdW5zaWduZWQgbG9uZyBtc2VjczsKKworCQl0aW1lcnN1YigmdGhpc19yZWFkLCAmbGFzdF9yZWFkLCAmaXYpOworCQltc2VjcyA9IGl2LnR2X3NlYyoxMDAwICsgaXYudHZfdXNlYy8xMDAwOworCisJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogZmFpbGVkIHRvIGtlZXAgdXAgd2l0aCBtbWFwIGRhdGEuIgorCQkJCSIgIExhc3QgcmVhZCAlbHUgbXNlY3MgYWdvLlxuIiwgbXNlY3MpOworCisJCS8qCisJCSAqIGhlYWQgcG9pbnRzIHRvIGEga25vd24gZ29vZCBlbnRyeSwgc3RhcnQgdGhlcmUuCisJCSAqLworCQlvbGQgPSBoZWFkOworCX0KKworCWxhc3RfcmVhZCA9IHRoaXNfcmVhZDsKKworCWlmIChvbGQgIT0gaGVhZCkKKwkJc2FtcGxlcysrOworCisJc2l6ZSA9IGhlYWQgLSBvbGQ7CisKKwlpZiAoKG9sZCAmIG1kLT5tYXNrKSArIHNpemUgIT0gKGhlYWQgJiBtZC0+bWFzaykpIHsKKwkJYnVmID0gJmRhdGFbb2xkICYgbWQtPm1hc2tdOworCQlzaXplID0gbWQtPm1hc2sgKyAxIC0gKG9sZCAmIG1kLT5tYXNrKTsKKwkJb2xkICs9IHNpemU7CisKKwkJd2hpbGUgKHNpemUpIHsKKwkJCWludCByZXQgPSB3cml0ZShvdXRwdXQsIGJ1Ziwgc2l6ZSk7CisKKwkJCWlmIChyZXQgPCAwKQorCQkJCWRpZSgiZmFpbGVkIHRvIHdyaXRlIik7CisKKwkJCXNpemUgLT0gcmV0OworCQkJYnVmICs9IHJldDsKKworCQkJYnl0ZXNfd3JpdHRlbiArPSByZXQ7CisJCX0KKwl9CisKKwlidWYgPSAmZGF0YVtvbGQgJiBtZC0+bWFza107CisJc2l6ZSA9IGhlYWQgLSBvbGQ7CisJb2xkICs9IHNpemU7CisKKwl3aGlsZSAoc2l6ZSkgeworCQlpbnQgcmV0ID0gd3JpdGUob3V0cHV0LCBidWYsIHNpemUpOworCisJCWlmIChyZXQgPCAwKQorCQkJZGllKCJmYWlsZWQgdG8gd3JpdGUiKTsKKworCQlzaXplIC09IHJldDsKKwkJYnVmICs9IHJldDsKKworCQlieXRlc193cml0dGVuICs9IHJldDsKKwl9CisKKwltZC0+cHJldiA9IG9sZDsKK30KKworc3RhdGljIHZvbGF0aWxlIGludCBkb25lID0gMDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgc2lnbnIgPSAtMTsKKworc3RhdGljIHZvaWQgc2lnX2hhbmRsZXIoaW50IHNpZykKK3sKKwlkb25lID0gMTsKKwlzaWduciA9IHNpZzsKK30KKworc3RhdGljIHZvaWQgc2lnX2F0ZXhpdCh2b2lkKQoreworCWlmIChzaWduciA9PSAtMSkKKwkJcmV0dXJuOworCisJc2lnbmFsKHNpZ25yLCBTSUdfREZMKTsKKwlraWxsKGdldHBpZCgpLCBzaWducik7Cit9CisKK3N0YXRpYyB2b2lkIHBpZF9zeW50aGVzaXplX2NvbW1fZXZlbnQocGlkX3QgcGlkLCBpbnQgZnVsbCkKK3sKKwlzdHJ1Y3QgY29tbV9ldmVudCBjb21tX2V2OworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworCWNoYXIgYmZbQlVGU0laXTsKKwlpbnQgZmQsIHJldDsKKwlzaXplX3Qgc2l6ZTsKKwljaGFyICpmaWVsZCwgKnNlcDsKKwlESVIgKnRhc2tzOworCXN0cnVjdCBkaXJlbnQgZGlyZW50LCAqbmV4dDsKKworCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiL3Byb2MvJWQvc3RhdCIsIHBpZCk7CisKKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCWlmIChyZWFkKGZkLCBiZiwgc2l6ZW9mKGJmKSkgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgcmVhZCAlc1xuIiwgZmlsZW5hbWUpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCWNsb3NlKGZkKTsKKworCS8qIDkwMjcgKGNhdCkgUiA2NzQ3IDkwMjcgNjc0NyAzNDgxNiA5MDI3IC4uLiAqLworCW1lbXNldCgmY29tbV9ldiwgMCwgc2l6ZW9mKGNvbW1fZXYpKTsKKwlmaWVsZCA9IHN0cmNocihiZiwgJygnKTsKKwlpZiAoZmllbGQgPT0gTlVMTCkKKwkJZ290byBvdXRfZmFpbHVyZTsKKwlzZXAgPSBzdHJjaHIoKytmaWVsZCwgJyknKTsKKwlpZiAoc2VwID09IE5VTEwpCisJCWdvdG8gb3V0X2ZhaWx1cmU7CisJc2l6ZSA9IHNlcCAtIGZpZWxkOworCW1lbWNweShjb21tX2V2LmNvbW0sIGZpZWxkLCBzaXplKyspOworCisJY29tbV9ldi5waWQgPSBwaWQ7CisJY29tbV9ldi5oZWFkZXIudHlwZSA9IFBFUkZfRVZFTlRfQ09NTTsKKwlzaXplID0gQUxJR04oc2l6ZSwgc2l6ZW9mKF9fdTY0KSk7CisJY29tbV9ldi5oZWFkZXIuc2l6ZSA9IHNpemVvZihjb21tX2V2KSAtIChzaXplb2YoY29tbV9ldi5jb21tKSAtIHNpemUpOworCisJaWYgKCFmdWxsKSB7CisJCWNvbW1fZXYudGlkID0gcGlkOworCisJCXJldCA9IHdyaXRlKG91dHB1dCwgJmNvbW1fZXYsIGNvbW1fZXYuaGVhZGVyLnNpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJcGVycm9yKCJmYWlsZWQgdG8gd3JpdGUiKTsKKwkJCWV4aXQoLTEpOworCQl9CisJCXJldHVybjsKKwl9CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgIi9wcm9jLyVkL3Rhc2siLCBwaWQpOworCisJdGFza3MgPSBvcGVuZGlyKGZpbGVuYW1lKTsKKwl3aGlsZSAoIXJlYWRkaXJfcih0YXNrcywgJmRpcmVudCwgJm5leHQpICYmIG5leHQpIHsKKwkJY2hhciAqZW5kOworCQlwaWQgPSBzdHJ0b2woZGlyZW50LmRfbmFtZSwgJmVuZCwgMTApOworCQlpZiAoKmVuZCkKKwkJCWNvbnRpbnVlOworCisJCWNvbW1fZXYudGlkID0gcGlkOworCisJCXJldCA9IHdyaXRlKG91dHB1dCwgJmNvbW1fZXYsIGNvbW1fZXYuaGVhZGVyLnNpemUpOworCQlpZiAocmV0IDwgMCkgeworCQkJcGVycm9yKCJmYWlsZWQgdG8gd3JpdGUiKTsKKwkJCWV4aXQoLTEpOworCQl9CisJfQorCWNsb3NlZGlyKHRhc2tzKTsKKwlyZXR1cm47CisKK291dF9mYWlsdXJlOgorCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3QgZ2V0IENPTU0gYW5kIHBnaWQsIG1hbGZvcm1lZCAlc1xuIiwKKwkJZmlsZW5hbWUpOworCWV4aXQoRVhJVF9GQUlMVVJFKTsKK30KKworc3RhdGljIHZvaWQgcGlkX3N5bnRoZXNpemVfbW1hcF9zYW1wbGVzKHBpZF90IHBpZCkKK3sKKwljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwlGSUxFICpmcDsKKworCXNucHJpbnRmKGZpbGVuYW1lLCBzaXplb2YoZmlsZW5hbWUpLCAiL3Byb2MvJWQvbWFwcyIsIHBpZCk7CisKKwlmcCA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCWlmIChmcCA9PSBOVUxMKSB7CisJCWZwcmludGYoc3RkZXJyLCAiY291bGRuJ3Qgb3BlbiAlc1xuIiwgZmlsZW5hbWUpOworCQlleGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCXdoaWxlICgxKSB7CisJCWNoYXIgYmZbQlVGU0laXSwgKnBiZiA9IGJmOworCQlzdHJ1Y3QgbW1hcF9ldmVudCBtbWFwX2V2ID0geworCQkJLmhlYWRlci50eXBlID0gUEVSRl9FVkVOVF9NTUFQLAorCQl9OworCQlpbnQgbjsKKwkJc2l6ZV90IHNpemU7CisJCWlmIChmZ2V0cyhiZiwgc2l6ZW9mKGJmKSwgZnApID09IE5VTEwpCisJCQlicmVhazsKKworCQkvKiAwMDQwMDAwMC0wMDQwYzAwMCByLXhwIDAwMDAwMDAwIGZkOjAxIDQxMDM4ICAvYmluL2NhdCAqLworCQluID0gaGV4MnU2NChwYmYsICZtbWFwX2V2LnN0YXJ0KTsKKwkJaWYgKG4gPCAwKQorCQkJY29udGludWU7CisJCXBiZiArPSBuICsgMTsKKwkJbiA9IGhleDJ1NjQocGJmLCAmbW1hcF9ldi5sZW4pOworCQlpZiAobiA8IDApCisJCQljb250aW51ZTsKKwkJcGJmICs9IG4gKyAzOworCQlpZiAoKnBiZiA9PSAneCcpIHsgLyogdm1fZXhlYyAqLworCQkJY2hhciAqZXhlY25hbWUgPSBzdHJyY2hyKGJmLCAnICcpOworCisJCQlpZiAoZXhlY25hbWUgPT0gTlVMTCB8fCBleGVjbmFtZVsxXSAhPSAnLycpCisJCQkJY29udGludWU7CisKKwkJCWV4ZWNuYW1lICs9IDE7CisJCQlzaXplID0gc3RybGVuKGV4ZWNuYW1lKTsKKwkJCWV4ZWNuYW1lW3NpemUgLSAxXSA9ICdcMCc7IC8qIFJlbW92ZSBcbiAqLworCQkJbWVtY3B5KG1tYXBfZXYuZmlsZW5hbWUsIGV4ZWNuYW1lLCBzaXplKTsKKwkJCXNpemUgPSBBTElHTihzaXplLCBzaXplb2YoX191NjQpKTsKKwkJCW1tYXBfZXYubGVuIC09IG1tYXBfZXYuc3RhcnQ7CisJCQltbWFwX2V2LmhlYWRlci5zaXplID0gKHNpemVvZihtbWFwX2V2KSAtCisJCQkJCSAgICAgICAoc2l6ZW9mKG1tYXBfZXYuZmlsZW5hbWUpIC0gc2l6ZSkpOworCQkJbW1hcF9ldi5waWQgPSBwaWQ7CisJCQltbWFwX2V2LnRpZCA9IHBpZDsKKworCQkJaWYgKHdyaXRlKG91dHB1dCwgJm1tYXBfZXYsIG1tYXBfZXYuaGVhZGVyLnNpemUpIDwgMCkgeworCQkJCXBlcnJvcigiZmFpbGVkIHRvIHdyaXRlIik7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCX0KKwl9CisKKwlmY2xvc2UoZnApOworfQorCitzdGF0aWMgdm9pZCBzeW50aGVzaXplX3NhbXBsZXModm9pZCkKK3sKKwlESVIgKnByb2M7CisJc3RydWN0IGRpcmVudCBkaXJlbnQsICpuZXh0OworCisJcHJvYyA9IG9wZW5kaXIoIi9wcm9jIik7CisKKwl3aGlsZSAoIXJlYWRkaXJfcihwcm9jLCAmZGlyZW50LCAmbmV4dCkgJiYgbmV4dCkgeworCQljaGFyICplbmQ7CisJCXBpZF90IHBpZDsKKworCQlwaWQgPSBzdHJ0b2woZGlyZW50LmRfbmFtZSwgJmVuZCwgMTApOworCQlpZiAoKmVuZCkgLyogb25seSBpbnRlcmVzdGVkIGluIHByb3BlciBudW1lcmljYWwgZGlyZW50cyAqLworCQkJY29udGludWU7CisKKwkJcGlkX3N5bnRoZXNpemVfY29tbV9ldmVudChwaWQsIDEpOworCQlwaWRfc3ludGhlc2l6ZV9tbWFwX3NhbXBsZXMocGlkKTsKKwl9CisKKwljbG9zZWRpcihwcm9jKTsKK30KKworc3RhdGljIGludCBncm91cF9mZDsKKworc3RhdGljIHZvaWQgY3JlYXRlX2NvdW50ZXIoaW50IGNvdW50ZXIsIGludCBjcHUsIHBpZF90IHBpZCkKK3sKKwlzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgKmF0dHIgPSBhdHRycyArIGNvdW50ZXI7CisJaW50IHRyYWNrID0gMTsKKworCWF0dHItPnNhbXBsZV90eXBlCT0gUEVSRl9TQU1QTEVfSVAgfCBQRVJGX1NBTVBMRV9USUQ7CisJaWYgKGZyZXEpIHsKKwkJYXR0ci0+c2FtcGxlX3R5cGUJfD0gUEVSRl9TQU1QTEVfUEVSSU9EOworCQlhdHRyLT5mcmVxCQk9IDE7CisJCWF0dHItPnNhbXBsZV9mcmVxCT0gZnJlcTsKKwl9CisJYXR0ci0+bW1hcAkJPSB0cmFjazsKKwlhdHRyLT5jb21tCQk9IHRyYWNrOworCWF0dHItPmluaGVyaXQJCT0gKGNwdSA8IDApICYmIGluaGVyaXQ7CisJYXR0ci0+ZGlzYWJsZWQJCT0gMTsKKworCXRyYWNrID0gMDsgLyogb25seSB0aGUgZmlyc3QgY291bnRlciBuZWVkcyB0aGVzZSAqLworCit0cnlfYWdhaW46CisJZmRbbnJfY3B1XVtjb3VudGVyXSA9IHN5c19wZXJmX2NvdW50ZXJfb3BlbihhdHRyLCBwaWQsIGNwdSwgZ3JvdXBfZmQsIDApOworCisJaWYgKGZkW25yX2NwdV1bY291bnRlcl0gPCAwKSB7CisJCWludCBlcnIgPSBlcnJubzsKKworCQlpZiAoZXJyID09IEVQRVJNKQorCQkJZGllKCJQZXJtaXNzaW9uIGVycm9yIC0gYXJlIHlvdSByb290P1xuIik7CisKKwkJLyoKKwkJICogSWYgaXQncyBjeWNsZXMgdGhlbiBmYWxsIGJhY2sgdG8gaHJ0aW1lcgorCQkgKiBiYXNlZCBjcHUtY2xvY2stdGljayBzdyBjb3VudGVyLCB3aGljaAorCQkgKiBpcyBhbHdheXMgYXZhaWxhYmxlIGV2ZW4gaWYgbm8gUE1VIHN1cHBvcnQ6CisJCSAqLworCQlpZiAoYXR0ci0+dHlwZSA9PSBQRVJGX1RZUEVfSEFSRFdBUkUKKwkJCSYmIGF0dHItPmNvbmZpZyA9PSBQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMpIHsKKworCQkJaWYgKHZlcmJvc2UpCisJCQkJd2FybmluZygiIC4uLiB0cnlpbmcgdG8gZmFsbCBiYWNrIHRvIGNwdS1jbG9jay10aWNrc1xuIik7CisJCQlhdHRyLT50eXBlID0gUEVSRl9UWVBFX1NPRlRXQVJFOworCQkJYXR0ci0+Y29uZmlnID0gUEVSRl9DT1VOVF9TV19DUFVfQ0xPQ0s7CisJCQlnb3RvIHRyeV9hZ2FpbjsKKwkJfQorCQlwcmludGYoIlxuIik7CisJCWVycm9yKCJwZXJmY291bnRlciBzeXNjYWxsIHJldHVybmVkIHdpdGggJWQgKCVzKVxuIiwKKwkJCWZkW25yX2NwdV1bY291bnRlcl0sIHN0cmVycm9yKGVycikpOworCQlkaWUoIk5vIENPTkZJR19QRVJGX0NPVU5URVJTPXkga2VybmVsIHN1cHBvcnQgY29uZmlndXJlZD9cbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlhc3NlcnQoZmRbbnJfY3B1XVtjb3VudGVyXSA+PSAwKTsKKwlmY250bChmZFtucl9jcHVdW2NvdW50ZXJdLCBGX1NFVEZMLCBPX05PTkJMT0NLKTsKKworCS8qCisJICogRmlyc3QgY291bnRlciBhY3RzIGFzIHRoZSBncm91cCBsZWFkZXI6CisJICovCisJaWYgKGdyb3VwICYmIGdyb3VwX2ZkID09IC0xKQorCQlncm91cF9mZCA9IGZkW25yX2NwdV1bY291bnRlcl07CisKKwlldmVudF9hcnJheVtucl9wb2xsXS5mZCA9IGZkW25yX2NwdV1bY291bnRlcl07CisJZXZlbnRfYXJyYXlbbnJfcG9sbF0uZXZlbnRzID0gUE9MTElOOworCW5yX3BvbGwrKzsKKworCW1tYXBfYXJyYXlbbnJfY3B1XVtjb3VudGVyXS5jb3VudGVyID0gY291bnRlcjsKKwltbWFwX2FycmF5W25yX2NwdV1bY291bnRlcl0ucHJldiA9IDA7CisJbW1hcF9hcnJheVtucl9jcHVdW2NvdW50ZXJdLm1hc2sgPSBtbWFwX3BhZ2VzKnBhZ2Vfc2l6ZSAtIDE7CisJbW1hcF9hcnJheVtucl9jcHVdW2NvdW50ZXJdLmJhc2UgPSBtbWFwKE5VTEwsIChtbWFwX3BhZ2VzKzEpKnBhZ2Vfc2l6ZSwKKwkJCVBST1RfUkVBRCwgTUFQX1NIQVJFRCwgZmRbbnJfY3B1XVtjb3VudGVyXSwgMCk7CisJaWYgKG1tYXBfYXJyYXlbbnJfY3B1XVtjb3VudGVyXS5iYXNlID09IE1BUF9GQUlMRUQpIHsKKwkJZXJyb3IoImZhaWxlZCB0byBtbWFwIHdpdGggJWQgKCVzKVxuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7CisJCWV4aXQoLTEpOworCX0KKworCWlvY3RsKGZkW25yX2NwdV1bY291bnRlcl0sIFBFUkZfQ09VTlRFUl9JT0NfRU5BQkxFKTsKK30KKworc3RhdGljIHZvaWQgb3Blbl9jb3VudGVycyhpbnQgY3B1LCBwaWRfdCBwaWQpCit7CisJaW50IGNvdW50ZXI7CisKKwlpZiAocGlkID4gMCkgeworCQlwaWRfc3ludGhlc2l6ZV9jb21tX2V2ZW50KHBpZCwgMCk7CisJCXBpZF9zeW50aGVzaXplX21tYXBfc2FtcGxlcyhwaWQpOworCX0KKworCWdyb3VwX2ZkID0gLTE7CisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IG5yX2NvdW50ZXJzOyBjb3VudGVyKyspCisJCWNyZWF0ZV9jb3VudGVyKGNvdW50ZXIsIGNwdSwgcGlkKTsKKworCW5yX2NwdSsrOworfQorCitzdGF0aWMgaW50IF9fY21kX3JlY29yZChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCit7CisJaW50IGksIGNvdW50ZXI7CisJc3RydWN0IHN0YXQgc3Q7CisJcGlkX3QgcGlkOworCWludCBmbGFnczsKKwlpbnQgcmV0OworCisJcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRV9TSVpFKTsKKwlucl9jcHVzID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisJYXNzZXJ0KG5yX2NwdXMgPD0gTUFYX05SX0NQVVMpOworCWFzc2VydChucl9jcHVzID49IDApOworCisJaWYgKCFzdGF0KG91dHB1dF9uYW1lLCAmc3QpICYmICFmb3JjZSAmJiAhYXBwZW5kX2ZpbGUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvciwgb3V0cHV0IGZpbGUgJXMgZXhpc3RzLCB1c2UgLUEgdG8gYXBwZW5kIG9yIC1mIHRvIG92ZXJ3cml0ZS5cbiIsCisJCQkJb3V0cHV0X25hbWUpOworCQlleGl0KC0xKTsKKwl9CisKKwlmbGFncyA9IE9fQ1JFQVR8T19SRFdSOworCWlmIChhcHBlbmRfZmlsZSkKKwkJZmxhZ3MgfD0gT19BUFBFTkQ7CisJZWxzZQorCQlmbGFncyB8PSBPX1RSVU5DOworCisJb3V0cHV0ID0gb3BlbihvdXRwdXRfbmFtZSwgZmxhZ3MsIFNfSVJVU1J8U19JV1VTUik7CisJaWYgKG91dHB1dCA8IDApIHsKKwkJcGVycm9yKCJmYWlsZWQgdG8gY3JlYXRlIG91dHB1dCBmaWxlIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmICghc3lzdGVtX3dpZGUpIHsKKwkJb3Blbl9jb3VudGVycygtMSwgdGFyZ2V0X3BpZCAhPSAtMSA/IHRhcmdldF9waWQgOiBnZXRwaWQoKSk7CisJfSBlbHNlIGZvciAoaSA9IDA7IGkgPCBucl9jcHVzOyBpKyspCisJCW9wZW5fY291bnRlcnMoaSwgdGFyZ2V0X3BpZCk7CisKKwlhdGV4aXQoc2lnX2F0ZXhpdCk7CisJc2lnbmFsKFNJR0NITEQsIHNpZ19oYW5kbGVyKTsKKwlzaWduYWwoU0lHSU5ULCBzaWdfaGFuZGxlcik7CisKKwlpZiAodGFyZ2V0X3BpZCA9PSAtMSAmJiBhcmdjKSB7CisJCXBpZCA9IGZvcmsoKTsKKwkJaWYgKHBpZCA8IDApCisJCQlwZXJyb3IoImZhaWxlZCB0byBmb3JrIik7CisKKwkJaWYgKCFwaWQpIHsKKwkJCWlmIChleGVjdnAoYXJndlswXSwgKGNoYXIgKiopYXJndikpIHsKKwkJCQlwZXJyb3IoYXJndlswXSk7CisJCQkJZXhpdCgtMSk7CisJCQl9CisJCX0KKwl9CisKKwlpZiAocmVhbHRpbWVfcHJpbykgeworCQlzdHJ1Y3Qgc2NoZWRfcGFyYW0gcGFyYW07CisKKwkJcGFyYW0uc2NoZWRfcHJpb3JpdHkgPSByZWFsdGltZV9wcmlvOworCQlpZiAoc2NoZWRfc2V0c2NoZWR1bGVyKDAsIFNDSEVEX0ZJRk8sICZwYXJhbSkpIHsKKwkJCXByaW50ZigiQ291bGQgbm90IHNldCByZWFsdGltZSBwcmlvcml0eS5cbiIpOworCQkJZXhpdCgtMSk7CisJCX0KKwl9CisKKwlpZiAoc3lzdGVtX3dpZGUpCisJCXN5bnRoZXNpemVfc2FtcGxlcygpOworCisJd2hpbGUgKCFkb25lKSB7CisJCWludCBoaXRzID0gc2FtcGxlczsKKworCQlmb3IgKGkgPSAwOyBpIDwgbnJfY3B1OyBpKyspIHsKKwkJCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBucl9jb3VudGVyczsgY291bnRlcisrKQorCQkJCW1tYXBfcmVhZCgmbW1hcF9hcnJheVtpXVtjb3VudGVyXSk7CisJCX0KKworCQlpZiAoaGl0cyA9PSBzYW1wbGVzKQorCQkJcmV0ID0gcG9sbChldmVudF9hcnJheSwgbnJfcG9sbCwgMTAwKTsKKwl9CisKKwkvKgorCSAqIEFwcHJveGltYXRlIFJJUCBldmVudCBzaXplOiAyNCBieXRlcy4KKwkgKi8KKwlmcHJpbnRmKHN0ZGVyciwKKwkJIlsgcGVyZiByZWNvcmQ6IENhcHR1cmVkIGFuZCB3cm90ZSAlLjNmIE1CICVzICh+JWxsZCBzYW1wbGVzKSBdXG4iLAorCQkoZG91YmxlKWJ5dGVzX3dyaXR0ZW4gLyAxMDI0LjAgLyAxMDI0LjAsCisJCW91dHB1dF9uYW1lLAorCQlieXRlc193cml0dGVuIC8gMjQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3QgcmVjb3JkX3VzYWdlW10gPSB7CisJInBlcmYgcmVjb3JkIFs8b3B0aW9ucz5dIFs8Y29tbWFuZD5dIiwKKwkicGVyZiByZWNvcmQgWzxvcHRpb25zPl0gLS0gPGNvbW1hbmQ+IFs8b3B0aW9ucz5dIiwKKwlOVUxMCit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7CisJT1BUX0NBTExCQUNLKCdlJywgImV2ZW50IiwgTlVMTCwgImV2ZW50IiwKKwkJICAgICAiZXZlbnQgc2VsZWN0b3IuIHVzZSAncGVyZiBsaXN0JyB0byBsaXN0IGF2YWlsYWJsZSBldmVudHMiLAorCQkgICAgIHBhcnNlX2V2ZW50cyksCisJT1BUX0lOVEVHRVIoJ3AnLCAicGlkIiwgJnRhcmdldF9waWQsCisJCSAgICAicmVjb3JkIGV2ZW50cyBvbiBleGlzdGluZyBwaWQiKSwKKwlPUFRfSU5URUdFUigncicsICJyZWFsdGltZSIsICZyZWFsdGltZV9wcmlvLAorCQkgICAgImNvbGxlY3QgZGF0YSB3aXRoIHRoaXMgUlQgU0NIRURfRklGTyBwcmlvcml0eSIpLAorCU9QVF9CT09MRUFOKCdhJywgImFsbC1jcHVzIiwgJnN5c3RlbV93aWRlLAorCQkJICAgICJzeXN0ZW0td2lkZSBjb2xsZWN0aW9uIGZyb20gYWxsIENQVXMiKSwKKwlPUFRfQk9PTEVBTignQScsICJhcHBlbmQiLCAmYXBwZW5kX2ZpbGUsCisJCQkgICAgImFwcGVuZCB0byB0aGUgb3V0cHV0IGZpbGUgdG8gZG8gaW5jcmVtZW50YWwgcHJvZmlsaW5nIiksCisJT1BUX0JPT0xFQU4oJ2YnLCAiZm9yY2UiLCAmZm9yY2UsCisJCQkib3ZlcndyaXRlIGV4aXN0aW5nIGRhdGEgZmlsZSIpLAorCU9QVF9MT05HKCdjJywgImNvdW50IiwgJmRlZmF1bHRfaW50ZXJ2YWwsCisJCSAgICAiZXZlbnQgcGVyaW9kIHRvIHNhbXBsZSIpLAorCU9QVF9TVFJJTkcoJ28nLCAib3V0cHV0IiwgJm91dHB1dF9uYW1lLCAiZmlsZSIsCisJCSAgICAib3V0cHV0IGZpbGUgbmFtZSIpLAorCU9QVF9CT09MRUFOKCdpJywgImluaGVyaXQiLCAmaW5oZXJpdCwKKwkJICAgICJjaGlsZCB0YXNrcyBpbmhlcml0IGNvdW50ZXJzIiksCisJT1BUX0lOVEVHRVIoJ0YnLCAiZnJlcSIsICZmcmVxLAorCQkgICAgInByb2ZpbGUgYXQgdGhpcyBmcmVxdWVuY3kiKSwKKwlPUFRfSU5URUdFUignbScsICJtbWFwLXBhZ2VzIiwgJm1tYXBfcGFnZXMsCisJCSAgICAibnVtYmVyIG9mIG1tYXAgZGF0YSBwYWdlcyIpLAorCU9QVF9CT09MRUFOKCd2JywgInZlcmJvc2UiLCAmdmVyYm9zZSwKKwkJICAgICJiZSBtb3JlIHZlcmJvc2UgKHNob3cgY291bnRlciBvcGVuIGVycm9ycywgZXRjKSIpLAorCU9QVF9FTkQoKQorfTsKKworaW50IGNtZF9yZWNvcmQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IGNvdW50ZXI7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCByZWNvcmRfdXNhZ2UsIDApOworCWlmICghYXJnYyAmJiB0YXJnZXRfcGlkID09IC0xICYmICFzeXN0ZW1fd2lkZSkKKwkJdXNhZ2Vfd2l0aF9vcHRpb25zKHJlY29yZF91c2FnZSwgb3B0aW9ucyk7CisKKwlpZiAoIW5yX2NvdW50ZXJzKQorCQlucl9jb3VudGVycyA9IDE7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykgeworCQlpZiAoYXR0cnNbY291bnRlcl0uc2FtcGxlX3BlcmlvZCkKKwkJCWNvbnRpbnVlOworCisJCWF0dHJzW2NvdW50ZXJdLnNhbXBsZV9wZXJpb2QgPSBkZWZhdWx0X2ludGVydmFsOworCX0KKworCXJldHVybiBfX2NtZF9yZWNvcmQoYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tcmVwb3J0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmYTkzYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvYnVpbHRpbi1yZXBvcnQuYwpAQCAtMCwwICsxLDEzMTYgQEAKKy8qCisgKiBidWlsdGluLXJlcG9ydC5jCisgKgorICogQnVpbHRpbiByZXBvcnQgY29tbWFuZDogQW5hbHl6ZSB0aGUgcGVyZi5kYXRhIGlucHV0IGZpbGUsCisgKiBsb29rIHVwIGFuZCByZWFkIERTT3MgYW5kIHN5bWJvbCBpbmZvcm1hdGlvbiBhbmQgZGlzcGxheQorICogYSBoaXN0b2dyYW0gb2YgcmVzdWx0cywgYWxvbmcgdmFyaW91cyBzb3J0aW5nIGtleXMuCisgKi8KKyNpbmNsdWRlICJidWlsdGluLmgiCisKKyNpbmNsdWRlICJ1dGlsL3V0aWwuaCIKKworI2luY2x1ZGUgInV0aWwvY29sb3IuaCIKKyNpbmNsdWRlICJ1dGlsL2xpc3QuaCIKKyNpbmNsdWRlICJ1dGlsL2NhY2hlLmgiCisjaW5jbHVkZSAidXRpbC9yYnRyZWUuaCIKKyNpbmNsdWRlICJ1dGlsL3N5bWJvbC5oIgorI2luY2x1ZGUgInV0aWwvc3RyaW5nLmgiCisKKyNpbmNsdWRlICJwZXJmLmgiCisKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLWV2ZW50cy5oIgorCisjZGVmaW5lIFNIT1dfS0VSTkVMCTEKKyNkZWZpbmUgU0hPV19VU0VSCTIKKyNkZWZpbmUgU0hPV19IVgkJNAorCitzdGF0aWMgY2hhcgkJY29uc3QgKmlucHV0X25hbWUgPSAicGVyZi5kYXRhIjsKK3N0YXRpYyBjaGFyCQkqdm1saW51eCA9IE5VTEw7CisKK3N0YXRpYyBjaGFyCQlkZWZhdWx0X3NvcnRfb3JkZXJbXSA9ICJjb21tLGRzbyI7CitzdGF0aWMgY2hhcgkJKnNvcnRfb3JkZXIgPSBkZWZhdWx0X3NvcnRfb3JkZXI7CisKK3N0YXRpYyBpbnQJCWlucHV0Oworc3RhdGljIGludAkJc2hvd19tYXNrID0gU0hPV19LRVJORUwgfCBTSE9XX1VTRVIgfCBTSE9XX0hWOworCitzdGF0aWMgaW50CQlkdW1wX3RyYWNlID0gMDsKKyNkZWZpbmUgZHByaW50Zih4Li4uKQlkbyB7IGlmIChkdW1wX3RyYWNlKSBwcmludGYoeCk7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbnQJCXZlcmJvc2U7CitzdGF0aWMgaW50CQlmdWxsX3BhdGhzOworCitzdGF0aWMgdW5zaWduZWQgbG9uZwlwYWdlX3NpemU7CitzdGF0aWMgdW5zaWduZWQgbG9uZwltbWFwX3dpbmRvdyA9IDMyOworCitzdHJ1Y3QgaXBfZXZlbnQgeworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJX191NjQgaXA7CisJX191MzIgcGlkLCB0aWQ7CisJX191NjQgcGVyaW9kOworfTsKKworc3RydWN0IG1tYXBfZXZlbnQgeworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJX191MzIgcGlkLCB0aWQ7CisJX191NjQgc3RhcnQ7CisJX191NjQgbGVuOworCV9fdTY0IHBnb2ZmOworCWNoYXIgZmlsZW5hbWVbUEFUSF9NQVhdOworfTsKKworc3RydWN0IGNvbW1fZXZlbnQgeworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJX191MzIgcGlkLCB0aWQ7CisJY2hhciBjb21tWzE2XTsKK307CisKK3N0cnVjdCBmb3JrX2V2ZW50IHsKKwlzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgaGVhZGVyOworCV9fdTMyIHBpZCwgcHBpZDsKK307CisKK3N0cnVjdCBwZXJpb2RfZXZlbnQgeworCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJX191NjQgdGltZTsKKwlfX3U2NCBpZDsKKwlfX3U2NCBzYW1wbGVfcGVyaW9kOworfTsKKwordHlwZWRlZiB1bmlvbiBldmVudF91bmlvbiB7CisJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyCWhlYWRlcjsKKwlzdHJ1Y3QgaXBfZXZlbnQJCQlpcDsKKwlzdHJ1Y3QgbW1hcF9ldmVudAkJbW1hcDsKKwlzdHJ1Y3QgY29tbV9ldmVudAkJY29tbTsKKwlzdHJ1Y3QgZm9ya19ldmVudAkJZm9yazsKKwlzdHJ1Y3QgcGVyaW9kX2V2ZW50CQlwZXJpb2Q7Cit9IGV2ZW50X3Q7CisKK3N0YXRpYyBMSVNUX0hFQUQoZHNvcyk7CitzdGF0aWMgc3RydWN0IGRzbyAqa2VybmVsX2RzbzsKK3N0YXRpYyBzdHJ1Y3QgZHNvICp2ZHNvOworCitzdGF0aWMgdm9pZCBkc29zX19hZGQoc3RydWN0IGRzbyAqZHNvKQoreworCWxpc3RfYWRkX3RhaWwoJmRzby0+bm9kZSwgJmRzb3MpOworfQorCitzdGF0aWMgc3RydWN0IGRzbyAqZHNvc19fZmluZChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkc28gKnBvczsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmZHNvcywgbm9kZSkKKwkJaWYgKHN0cmNtcChwb3MtPm5hbWUsIG5hbWUpID09IDApCisJCQlyZXR1cm4gcG9zOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IGRzbyAqZHNvc19fZmluZG5ldyhjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBkc28gKmRzbyA9IGRzb3NfX2ZpbmQobmFtZSk7CisJaW50IG5yOworCisJaWYgKGRzbykKKwkJcmV0dXJuIGRzbzsKKworCWRzbyA9IGRzb19fbmV3KG5hbWUsIDApOworCWlmICghZHNvKQorCQlnb3RvIG91dF9kZWxldGVfZHNvOworCisJbnIgPSBkc29fX2xvYWQoZHNvLCBOVUxMLCB2ZXJib3NlKTsKKwlpZiAobnIgPCAwKSB7CisJCWlmICh2ZXJib3NlKQorCQkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gb3BlbjogJXNcbiIsIG5hbWUpOworCQlnb3RvIG91dF9kZWxldGVfZHNvOworCX0KKwlpZiAoIW5yICYmIHZlcmJvc2UpIHsKKwkJZnByaW50ZihzdGRlcnIsCisJCSJObyBzeW1ib2xzIGZvdW5kIGluOiAlcywgbWF5YmUgaW5zdGFsbCBhIGRlYnVnIHBhY2thZ2U/XG4iLAorCQkJCW5hbWUpOworCX0KKworCWRzb3NfX2FkZChkc28pOworCisJcmV0dXJuIGRzbzsKKworb3V0X2RlbGV0ZV9kc286CisJZHNvX19kZWxldGUoZHNvKTsKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHZvaWQgZHNvc19fZnByaW50ZihGSUxFICpmcCkKK3sKKwlzdHJ1Y3QgZHNvICpwb3M7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHBvcywgJmRzb3MsIG5vZGUpCisJCWRzb19fZnByaW50Zihwb3MsIGZwKTsKK30KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnZkc29fX2ZpbmRfc3ltYm9sKHN0cnVjdCBkc28gKmRzbywgX191NjQgaXApCit7CisJcmV0dXJuIGRzb19fZmluZF9zeW1ib2woa2VybmVsX2RzbywgaXApOworfQorCitzdGF0aWMgaW50IGxvYWRfa2VybmVsKHZvaWQpCit7CisJaW50IGVycjsKKworCWtlcm5lbF9kc28gPSBkc29fX25ldygiW2tlcm5lbF0iLCAwKTsKKwlpZiAoIWtlcm5lbF9kc28pCisJCXJldHVybiAtMTsKKworCWVyciA9IGRzb19fbG9hZF9rZXJuZWwoa2VybmVsX2Rzbywgdm1saW51eCwgTlVMTCwgdmVyYm9zZSk7CisJaWYgKGVycikgeworCQlkc29fX2RlbGV0ZShrZXJuZWxfZHNvKTsKKwkJa2VybmVsX2RzbyA9IE5VTEw7CisJfSBlbHNlCisJCWRzb3NfX2FkZChrZXJuZWxfZHNvKTsKKworCXZkc28gPSBkc29fX25ldygiW3Zkc29dIiwgMCk7CisJaWYgKCF2ZHNvKQorCQlyZXR1cm4gLTE7CisKKwl2ZHNvLT5maW5kX3N5bWJvbCA9IHZkc29fX2ZpbmRfc3ltYm9sOworCisJZHNvc19fYWRkKHZkc28pOworCisJcmV0dXJuIGVycjsKK30KKworc3RhdGljIGNoYXIgX19jd2RbUEFUSF9NQVhdOworc3RhdGljIGNoYXIgKmN3ZCA9IF9fY3dkOworc3RhdGljIGludCBjd2RsZW47CisKK3N0YXRpYyBpbnQgc3RyY29tbW9uKGNvbnN0IGNoYXIgKnBhdGhuYW1lKQoreworCWludCBuID0gMDsKKworCXdoaWxlIChwYXRobmFtZVtuXSA9PSBjd2Rbbl0gJiYgbiA8IGN3ZGxlbikKKwkJKytuOworCisJcmV0dXJuIG47Cit9CisKK3N0cnVjdCBtYXAgeworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlfX3U2NAkgc3RhcnQ7CisJX191NjQJIGVuZDsKKwlfX3U2NAkgcGdvZmY7CisJX191NjQJICgqbWFwX2lwKShzdHJ1Y3QgbWFwICosIF9fdTY0KTsKKwlzdHJ1Y3QgZHNvCSAqZHNvOworfTsKKworc3RhdGljIF9fdTY0IG1hcF9fbWFwX2lwKHN0cnVjdCBtYXAgKm1hcCwgX191NjQgaXApCit7CisJcmV0dXJuIGlwIC0gbWFwLT5zdGFydCArIG1hcC0+cGdvZmY7Cit9CisKK3N0YXRpYyBfX3U2NCB2ZHNvX19tYXBfaXAoc3RydWN0IG1hcCAqbWFwLCBfX3U2NCBpcCkKK3sKKwlyZXR1cm4gaXA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2Fub25fbWVtb3J5KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworICAgICByZXR1cm4gc3RyY21wKGZpbGVuYW1lLCAiLy9hbm9uIikgPT0gMDsKK30KKworc3RhdGljIHN0cnVjdCBtYXAgKm1hcF9fbmV3KHN0cnVjdCBtbWFwX2V2ZW50ICpldmVudCkKK3sKKwlzdHJ1Y3QgbWFwICpzZWxmID0gbWFsbG9jKHNpemVvZigqc2VsZikpOworCisJaWYgKHNlbGYgIT0gTlVMTCkgeworCQljb25zdCBjaGFyICpmaWxlbmFtZSA9IGV2ZW50LT5maWxlbmFtZTsKKwkJY2hhciBuZXdmaWxlbmFtZVtQQVRIX01BWF07CisJCWludCBhbm9uOworCisJCWlmIChjd2QpIHsKKwkJCWludCBuID0gc3RyY29tbW9uKGZpbGVuYW1lKTsKKworCQkJaWYgKG4gPT0gY3dkbGVuKSB7CisJCQkJc25wcmludGYobmV3ZmlsZW5hbWUsIHNpemVvZihuZXdmaWxlbmFtZSksCisJCQkJCSAiLiVzIiwgZmlsZW5hbWUgKyBuKTsKKwkJCQlmaWxlbmFtZSA9IG5ld2ZpbGVuYW1lOworCQkJfQorCQl9CisKKwkJYW5vbiA9IGlzX2Fub25fbWVtb3J5KGZpbGVuYW1lKTsKKworCQlpZiAoYW5vbikgeworCQkJc25wcmludGYobmV3ZmlsZW5hbWUsIHNpemVvZihuZXdmaWxlbmFtZSksICIvdG1wL3BlcmYtJWQubWFwIiwgZXZlbnQtPnBpZCk7CisJCQlmaWxlbmFtZSA9IG5ld2ZpbGVuYW1lOworCQl9CisKKwkJc2VsZi0+c3RhcnQgPSBldmVudC0+c3RhcnQ7CisJCXNlbGYtPmVuZCAgID0gZXZlbnQtPnN0YXJ0ICsgZXZlbnQtPmxlbjsKKwkJc2VsZi0+cGdvZmYgPSBldmVudC0+cGdvZmY7CisKKwkJc2VsZi0+ZHNvID0gZHNvc19fZmluZG5ldyhmaWxlbmFtZSk7CisJCWlmIChzZWxmLT5kc28gPT0gTlVMTCkKKwkJCWdvdG8gb3V0X2RlbGV0ZTsKKworCQlpZiAoc2VsZi0+ZHNvID09IHZkc28gfHwgYW5vbikKKwkJCXNlbGYtPm1hcF9pcCA9IHZkc29fX21hcF9pcDsKKwkJZWxzZQorCQkJc2VsZi0+bWFwX2lwID0gbWFwX19tYXBfaXA7CisJfQorCXJldHVybiBzZWxmOworb3V0X2RlbGV0ZToKKwlmcmVlKHNlbGYpOworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgc3RydWN0IG1hcCAqbWFwX19jbG9uZShzdHJ1Y3QgbWFwICpzZWxmKQoreworCXN0cnVjdCBtYXAgKm1hcCA9IG1hbGxvYyhzaXplb2YoKnNlbGYpKTsKKworCWlmICghbWFwKQorCQlyZXR1cm4gTlVMTDsKKworCW1lbWNweShtYXAsIHNlbGYsIHNpemVvZigqc2VsZikpOworCisJcmV0dXJuIG1hcDsKK30KKworc3RhdGljIGludCBtYXBfX292ZXJsYXAoc3RydWN0IG1hcCAqbCwgc3RydWN0IG1hcCAqcikKK3sKKwlpZiAobC0+c3RhcnQgPiByLT5zdGFydCkgeworCQlzdHJ1Y3QgbWFwICp0ID0gbDsKKwkJbCA9IHI7CisJCXIgPSB0OworCX0KKworCWlmIChsLT5lbmQgPiByLT5zdGFydCkKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHNpemVfdCBtYXBfX2ZwcmludGYoc3RydWN0IG1hcCAqc2VsZiwgRklMRSAqZnApCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIgJUx4LSVMeCAlTHggJXNcbiIsCisJCSAgICAgICBzZWxmLT5zdGFydCwgc2VsZi0+ZW5kLCBzZWxmLT5wZ29mZiwgc2VsZi0+ZHNvLT5uYW1lKTsKK30KKworCitzdHJ1Y3QgdGhyZWFkIHsKKwlzdHJ1Y3QgcmJfbm9kZQkgcmJfbm9kZTsKKwlzdHJ1Y3QgbGlzdF9oZWFkIG1hcHM7CisJcGlkX3QJCSBwaWQ7CisJY2hhcgkJICpjb21tOworfTsKKworc3RhdGljIHN0cnVjdCB0aHJlYWQgKnRocmVhZF9fbmV3KHBpZF90IHBpZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkICpzZWxmID0gbWFsbG9jKHNpemVvZigqc2VsZikpOworCisJaWYgKHNlbGYgIT0gTlVMTCkgeworCQlzZWxmLT5waWQgPSBwaWQ7CisJCXNlbGYtPmNvbW0gPSBtYWxsb2MoMzIpOworCQlpZiAoc2VsZi0+Y29tbSkKKwkJCXNucHJpbnRmKHNlbGYtPmNvbW0sIDMyLCAiOiVkIiwgc2VsZi0+cGlkKTsKKwkJSU5JVF9MSVNUX0hFQUQoJnNlbGYtPm1hcHMpOworCX0KKworCXJldHVybiBzZWxmOworfQorCitzdGF0aWMgaW50IHRocmVhZF9fc2V0X2NvbW0oc3RydWN0IHRocmVhZCAqc2VsZiwgY29uc3QgY2hhciAqY29tbSkKK3sKKwlpZiAoc2VsZi0+Y29tbSkKKwkJZnJlZShzZWxmLT5jb21tKTsKKwlzZWxmLT5jb21tID0gc3RyZHVwKGNvbW0pOworCXJldHVybiBzZWxmLT5jb21tID8gMCA6IC1FTk9NRU07Cit9CisKK3N0YXRpYyBzaXplX3QgdGhyZWFkX19mcHJpbnRmKHN0cnVjdCB0aHJlYWQgKnNlbGYsIEZJTEUgKmZwKQoreworCXN0cnVjdCBtYXAgKnBvczsKKwlzaXplX3QgcmV0ID0gZnByaW50ZihmcCwgIlRocmVhZCAlZCAlc1xuIiwgc2VsZi0+cGlkLCBzZWxmLT5jb21tKTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCAmc2VsZi0+bWFwcywgbm9kZSkKKwkJcmV0ICs9IG1hcF9fZnByaW50Zihwb3MsIGZwKTsKKworCXJldHVybiByZXQ7Cit9CisKKworc3RhdGljIHN0cnVjdCByYl9yb290IHRocmVhZHM7CitzdGF0aWMgc3RydWN0IHRocmVhZCAqbGFzdF9tYXRjaDsKKworc3RhdGljIHN0cnVjdCB0aHJlYWQgKnRocmVhZHNfX2ZpbmRuZXcocGlkX3QgcGlkKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZ0aHJlYWRzLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IHRocmVhZCAqdGg7CisKKwkvKgorCSAqIEZvbnQtZW5kIGNhY2hlIC0gUElEIGxvb2t1cHMgY29tZSBpbiBibG9ja3MsCisJICogc28gbW9zdCBvZiB0aGUgdGltZSB3ZSBkb250IGhhdmUgdG8gbG9vayB1cAorCSAqIHRoZSBmdWxsIHJidHJlZToKKwkgKi8KKwlpZiAobGFzdF9tYXRjaCAmJiBsYXN0X21hdGNoLT5waWQgPT0gcGlkKQorCQlyZXR1cm4gbGFzdF9tYXRjaDsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQl0aCA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHRocmVhZCwgcmJfbm9kZSk7CisKKwkJaWYgKHRoLT5waWQgPT0gcGlkKSB7CisJCQlsYXN0X21hdGNoID0gdGg7CisJCQlyZXR1cm4gdGg7CisJCX0KKworCQlpZiAocGlkIDwgdGgtPnBpZCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwl0aCA9IHRocmVhZF9fbmV3KHBpZCk7CisJaWYgKHRoICE9IE5VTEwpIHsKKwkJcmJfbGlua19ub2RlKCZ0aC0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwkJcmJfaW5zZXJ0X2NvbG9yKCZ0aC0+cmJfbm9kZSwgJnRocmVhZHMpOworCQlsYXN0X21hdGNoID0gdGg7CisJfQorCisJcmV0dXJuIHRoOworfQorCitzdGF0aWMgdm9pZCB0aHJlYWRfX2luc2VydF9tYXAoc3RydWN0IHRocmVhZCAqc2VsZiwgc3RydWN0IG1hcCAqbWFwKQoreworCXN0cnVjdCBtYXAgKnBvcywgKnRtcDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIHRtcCwgJnNlbGYtPm1hcHMsIG5vZGUpIHsKKwkJaWYgKG1hcF9fb3ZlcmxhcChwb3MsIG1hcCkpIHsKKwkJCWxpc3RfZGVsX2luaXQoJnBvcy0+bm9kZSk7CisJCQkvKiBYWFggbGVha3MgZHNvcyAqLworCQkJZnJlZShwb3MpOworCQl9CisJfQorCisJbGlzdF9hZGRfdGFpbCgmbWFwLT5ub2RlLCAmc2VsZi0+bWFwcyk7Cit9CisKK3N0YXRpYyBpbnQgdGhyZWFkX19mb3JrKHN0cnVjdCB0aHJlYWQgKnNlbGYsIHN0cnVjdCB0aHJlYWQgKnBhcmVudCkKK3sKKwlzdHJ1Y3QgbWFwICptYXA7CisKKwlpZiAoc2VsZi0+Y29tbSkKKwkJZnJlZShzZWxmLT5jb21tKTsKKwlzZWxmLT5jb21tID0gc3RyZHVwKHBhcmVudC0+Y29tbSk7CisJaWYgKCFzZWxmLT5jb21tKQorCQlyZXR1cm4gLUVOT01FTTsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkobWFwLCAmcGFyZW50LT5tYXBzLCBub2RlKSB7CisJCXN0cnVjdCBtYXAgKm5ldyA9IG1hcF9fY2xvbmUobWFwKTsKKwkJaWYgKCFuZXcpCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJdGhyZWFkX19pbnNlcnRfbWFwKHNlbGYsIG5ldyk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbWFwICp0aHJlYWRfX2ZpbmRfbWFwKHN0cnVjdCB0aHJlYWQgKnNlbGYsIF9fdTY0IGlwKQoreworCXN0cnVjdCBtYXAgKnBvczsKKworCWlmIChzZWxmID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShwb3MsICZzZWxmLT5tYXBzLCBub2RlKQorCQlpZiAoaXAgPj0gcG9zLT5zdGFydCAmJiBpcCA8PSBwb3MtPmVuZCkKKwkJCXJldHVybiBwb3M7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHNpemVfdCB0aHJlYWRzX19mcHJpbnRmKEZJTEUgKmZwKQoreworCXNpemVfdCByZXQgPSAwOworCXN0cnVjdCByYl9ub2RlICpuZDsKKworCWZvciAobmQgPSByYl9maXJzdCgmdGhyZWFkcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCB0aHJlYWQgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3QgdGhyZWFkLCByYl9ub2RlKTsKKworCQlyZXQgKz0gdGhyZWFkX19mcHJpbnRmKHBvcywgZnApOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiBoaXN0b2dyYW0sIHNvcnRlZCBvbiBpdGVtLCBjb2xsZWN0cyBjb3VudHMKKyAqLworCitzdGF0aWMgc3RydWN0IHJiX3Jvb3QgaGlzdDsKKworc3RydWN0IGhpc3RfZW50cnkgeworCXN0cnVjdCByYl9ub2RlCSByYl9ub2RlOworCisJc3RydWN0IHRocmVhZAkgKnRocmVhZDsKKwlzdHJ1Y3QgbWFwCSAqbWFwOworCXN0cnVjdCBkc28JICpkc287CisJc3RydWN0IHN5bWJvbAkgKnN5bTsKKwlfX3U2NAkJIGlwOworCWNoYXIJCSBsZXZlbDsKKworCV9fdTY0CQkgY291bnQ7Cit9OworCisvKgorICogY29uZmlndXJhYmxlIHNvcnRpbmcgYml0cworICovCisKK3N0cnVjdCBzb3J0X2VudHJ5IHsKKwlzdHJ1Y3QgbGlzdF9oZWFkIGxpc3Q7CisKKwljaGFyICpoZWFkZXI7CisKKwlpbnQ2NF90ICgqY21wKShzdHJ1Y3QgaGlzdF9lbnRyeSAqLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqKTsKKwlpbnQ2NF90ICgqY29sbGFwc2UpKHN0cnVjdCBoaXN0X2VudHJ5ICosIHN0cnVjdCBoaXN0X2VudHJ5ICopOworCXNpemVfdAkoKnByaW50KShGSUxFICpmcCwgc3RydWN0IGhpc3RfZW50cnkgKik7Cit9OworCisvKiAtLXNvcnQgcGlkICovCisKK3N0YXRpYyBpbnQ2NF90Citzb3J0X190aHJlYWRfY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJcmV0dXJuIHJpZ2h0LT50aHJlYWQtPnBpZCAtIGxlZnQtPnRocmVhZC0+cGlkOworfQorCitzdGF0aWMgc2l6ZV90Citzb3J0X190aHJlYWRfcHJpbnQoRklMRSAqZnAsIHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmKQoreworCXJldHVybiBmcHJpbnRmKGZwLCAiJTE2czolNWQiLCBzZWxmLT50aHJlYWQtPmNvbW0gPzogIiIsIHNlbGYtPnRocmVhZC0+cGlkKTsKK30KKworc3RhdGljIHN0cnVjdCBzb3J0X2VudHJ5IHNvcnRfdGhyZWFkID0geworCS5oZWFkZXIgPSAiICAgICAgICAgQ29tbWFuZDogIFBpZCIsCisJLmNtcAk9IHNvcnRfX3RocmVhZF9jbXAsCisJLnByaW50CT0gc29ydF9fdGhyZWFkX3ByaW50LAorfTsKKworLyogLS1zb3J0IGNvbW0gKi8KKworc3RhdGljIGludDY0X3QKK3NvcnRfX2NvbW1fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJcmV0dXJuIHJpZ2h0LT50aHJlYWQtPnBpZCAtIGxlZnQtPnRocmVhZC0+cGlkOworfQorCitzdGF0aWMgaW50NjRfdAorc29ydF9fY29tbV9jb2xsYXBzZShzdHJ1Y3QgaGlzdF9lbnRyeSAqbGVmdCwgc3RydWN0IGhpc3RfZW50cnkgKnJpZ2h0KQoreworCWNoYXIgKmNvbW1fbCA9IGxlZnQtPnRocmVhZC0+Y29tbTsKKwljaGFyICpjb21tX3IgPSByaWdodC0+dGhyZWFkLT5jb21tOworCisJaWYgKCFjb21tX2wgfHwgIWNvbW1fcikgeworCQlpZiAoIWNvbW1fbCAmJiAhY29tbV9yKQorCQkJcmV0dXJuIDA7CisJCWVsc2UgaWYgKCFjb21tX2wpCisJCQlyZXR1cm4gLTE7CisJCWVsc2UKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiBzdHJjbXAoY29tbV9sLCBjb21tX3IpOworfQorCitzdGF0aWMgc2l6ZV90Citzb3J0X19jb21tX3ByaW50KEZJTEUgKmZwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZikKK3sKKwlyZXR1cm4gZnByaW50ZihmcCwgIiUxNnMiLCBzZWxmLT50aHJlYWQtPmNvbW0pOworfQorCitzdGF0aWMgc3RydWN0IHNvcnRfZW50cnkgc29ydF9jb21tID0geworCS5oZWFkZXIJCT0gIiAgICAgICAgIENvbW1hbmQiLAorCS5jbXAJCT0gc29ydF9fY29tbV9jbXAsCisJLmNvbGxhcHNlCT0gc29ydF9fY29tbV9jb2xsYXBzZSwKKwkucHJpbnQJCT0gc29ydF9fY29tbV9wcmludCwKK307CisKKy8qIC0tc29ydCBkc28gKi8KKworc3RhdGljIGludDY0X3QKK3NvcnRfX2Rzb19jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwlzdHJ1Y3QgZHNvICpkc29fbCA9IGxlZnQtPmRzbzsKKwlzdHJ1Y3QgZHNvICpkc29fciA9IHJpZ2h0LT5kc287CisKKwlpZiAoIWRzb19sIHx8ICFkc29fcikgeworCQlpZiAoIWRzb19sICYmICFkc29fcikKKwkJCXJldHVybiAwOworCQllbHNlIGlmICghZHNvX2wpCisJCQlyZXR1cm4gLTE7CisJCWVsc2UKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiBzdHJjbXAoZHNvX2wtPm5hbWUsIGRzb19yLT5uYW1lKTsKK30KKworc3RhdGljIHNpemVfdAorc29ydF9fZHNvX3ByaW50KEZJTEUgKmZwLCBzdHJ1Y3QgaGlzdF9lbnRyeSAqc2VsZikKK3sKKwlpZiAoc2VsZi0+ZHNvKQorCQlyZXR1cm4gZnByaW50ZihmcCwgIiUtMjVzIiwgc2VsZi0+ZHNvLT5uYW1lKTsKKworCXJldHVybiBmcHJpbnRmKGZwLCAiJTAxNmxseCAgICAgICAgICIsIChfX3U2NClzZWxmLT5pcCk7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9lbnRyeSBzb3J0X2RzbyA9IHsKKwkuaGVhZGVyID0gIlNoYXJlZCBPYmplY3QgICAgICAgICAgICAiLAorCS5jbXAJPSBzb3J0X19kc29fY21wLAorCS5wcmludAk9IHNvcnRfX2Rzb19wcmludCwKK307CisKKy8qIC0tc29ydCBzeW1ib2wgKi8KKworc3RhdGljIGludDY0X3QKK3NvcnRfX3N5bV9jbXAoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwlfX3U2NCBpcF9sLCBpcF9yOworCisJaWYgKGxlZnQtPnN5bSA9PSByaWdodC0+c3ltKQorCQlyZXR1cm4gMDsKKworCWlwX2wgPSBsZWZ0LT5zeW0gPyBsZWZ0LT5zeW0tPnN0YXJ0IDogbGVmdC0+aXA7CisJaXBfciA9IHJpZ2h0LT5zeW0gPyByaWdodC0+c3ltLT5zdGFydCA6IHJpZ2h0LT5pcDsKKworCXJldHVybiAoaW50NjRfdCkoaXBfciAtIGlwX2wpOworfQorCitzdGF0aWMgc2l6ZV90Citzb3J0X19zeW1fcHJpbnQoRklMRSAqZnAsIHN0cnVjdCBoaXN0X2VudHJ5ICpzZWxmKQoreworCXNpemVfdCByZXQgPSAwOworCisJaWYgKHZlcmJvc2UpCisJCXJldCArPSBmcHJpbnRmKGZwLCAiJSMwMThsbHggICIsIChfX3U2NClzZWxmLT5pcCk7CisKKwlpZiAoc2VsZi0+c3ltKSB7CisJCXJldCArPSBmcHJpbnRmKGZwLCAiWyVjXSAlcyIsCisJCQlzZWxmLT5kc28gPT0ga2VybmVsX2RzbyA/ICdrJyA6ICcuJywgc2VsZi0+c3ltLT5uYW1lKTsKKwl9IGVsc2UgeworCQlyZXQgKz0gZnByaW50ZihmcCwgIiUjMDE2bGx4IiwgKF9fdTY0KXNlbGYtPmlwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgc3RydWN0IHNvcnRfZW50cnkgc29ydF9zeW0gPSB7CisJLmhlYWRlciA9ICJTeW1ib2wiLAorCS5jbXAJPSBzb3J0X19zeW1fY21wLAorCS5wcmludAk9IHNvcnRfX3N5bV9wcmludCwKK307CisKK3N0YXRpYyBpbnQgc29ydF9fbmVlZF9jb2xsYXBzZSA9IDA7CisKK3N0cnVjdCBzb3J0X2RpbWVuc2lvbiB7CisJY2hhcgkJCSpuYW1lOworCXN0cnVjdCBzb3J0X2VudHJ5CSplbnRyeTsKKwlpbnQJCQl0YWtlbjsKK307CisKK3N0YXRpYyBzdHJ1Y3Qgc29ydF9kaW1lbnNpb24gc29ydF9kaW1lbnNpb25zW10gPSB7CisJeyAubmFtZSA9ICJwaWQiLAkuZW50cnkgPSAmc29ydF90aHJlYWQsCX0sCisJeyAubmFtZSA9ICJjb21tIiwJLmVudHJ5ID0gJnNvcnRfY29tbSwJfSwKKwl7IC5uYW1lID0gImRzbyIsCS5lbnRyeSA9ICZzb3J0X2RzbywJfSwKKwl7IC5uYW1lID0gInN5bWJvbCIsCS5lbnRyeSA9ICZzb3J0X3N5bSwJfSwKK307CisKK3N0YXRpYyBMSVNUX0hFQUQoaGlzdF9lbnRyeV9fc29ydF9saXN0KTsKKworc3RhdGljIGludCBzb3J0X2RpbWVuc2lvbl9fYWRkKGNoYXIgKnRvaykKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNvcnRfZGltZW5zaW9ucyk7IGkrKykgeworCQlzdHJ1Y3Qgc29ydF9kaW1lbnNpb24gKnNkID0gJnNvcnRfZGltZW5zaW9uc1tpXTsKKworCQlpZiAoc2QtPnRha2VuKQorCQkJY29udGludWU7CisKKwkJaWYgKHN0cm5jYXNlY21wKHRvaywgc2QtPm5hbWUsIHN0cmxlbih0b2spKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzZC0+ZW50cnktPmNvbGxhcHNlKQorCQkJc29ydF9fbmVlZF9jb2xsYXBzZSA9IDE7CisKKwkJbGlzdF9hZGRfdGFpbCgmc2QtPmVudHJ5LT5saXN0LCAmaGlzdF9lbnRyeV9fc29ydF9saXN0KTsKKwkJc2QtPnRha2VuID0gMTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlyZXR1cm4gLUVTUkNIOworfQorCitzdGF0aWMgaW50NjRfdAoraGlzdF9lbnRyeV9fY21wKHN0cnVjdCBoaXN0X2VudHJ5ICpsZWZ0LCBzdHJ1Y3QgaGlzdF9lbnRyeSAqcmlnaHQpCit7CisJc3RydWN0IHNvcnRfZW50cnkgKnNlOworCWludDY0X3QgY21wID0gMDsKKworCWxpc3RfZm9yX2VhY2hfZW50cnkoc2UsICZoaXN0X2VudHJ5X19zb3J0X2xpc3QsIGxpc3QpIHsKKwkJY21wID0gc2UtPmNtcChsZWZ0LCByaWdodCk7CisJCWlmIChjbXApCisJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gY21wOworfQorCitzdGF0aWMgaW50NjRfdAoraGlzdF9lbnRyeV9fY29sbGFwc2Uoc3RydWN0IGhpc3RfZW50cnkgKmxlZnQsIHN0cnVjdCBoaXN0X2VudHJ5ICpyaWdodCkKK3sKKwlzdHJ1Y3Qgc29ydF9lbnRyeSAqc2U7CisJaW50NjRfdCBjbXAgPSAwOworCisJbGlzdF9mb3JfZWFjaF9lbnRyeShzZSwgJmhpc3RfZW50cnlfX3NvcnRfbGlzdCwgbGlzdCkgeworCQlpbnQ2NF90ICgqZikoc3RydWN0IGhpc3RfZW50cnkgKiwgc3RydWN0IGhpc3RfZW50cnkgKik7CisKKwkJZiA9IHNlLT5jb2xsYXBzZSA/OiBzZS0+Y21wOworCisJCWNtcCA9IGYobGVmdCwgcmlnaHQpOworCQlpZiAoY21wKQorCQkJYnJlYWs7CisJfQorCisJcmV0dXJuIGNtcDsKK30KKworc3RhdGljIHNpemVfdAoraGlzdF9lbnRyeV9fZnByaW50ZihGSUxFICpmcCwgc3RydWN0IGhpc3RfZW50cnkgKnNlbGYsIF9fdTY0IHRvdGFsX3NhbXBsZXMpCit7CisJc3RydWN0IHNvcnRfZW50cnkgKnNlOworCXNpemVfdCByZXQ7CisKKwlpZiAodG90YWxfc2FtcGxlcykgeworCQlkb3VibGUgcGVyY2VudCA9IHNlbGYtPmNvdW50ICogMTAwLjAgLyB0b3RhbF9zYW1wbGVzOworCQljaGFyICpjb2xvciA9IFBFUkZfQ09MT1JfTk9STUFMOworCisJCS8qCisJCSAqIFdlIGNvbG9yIGhpZ2gtb3ZlcmhlYWQgZW50cmllcyBpbiByZWQsIG1pZC1vdmVyaGVhZAorCQkgKiBlbnRyaWVzIGluIGdyZWVuIC0gYW5kIGtlZXAgdGhlIGxvdyBvdmVyaGVhZCBwbGFjZXMKKwkJICogbm9ybWFsOgorCQkgKi8KKwkJaWYgKHBlcmNlbnQgPj0gNS4wKSB7CisJCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOworCQl9IGVsc2UgeworCQkJaWYgKHBlcmNlbnQgPj0gMC41KQorCQkJCWNvbG9yID0gUEVSRl9DT0xPUl9HUkVFTjsKKwkJfQorCisJCXJldCA9IGNvbG9yX2ZwcmludGYoZnAsIGNvbG9yLCAiICAgJTYuMmYlJSIsCisJCQkJKHNlbGYtPmNvdW50ICogMTAwLjApIC8gdG90YWxfc2FtcGxlcyk7CisJfSBlbHNlCisJCXJldCA9IGZwcmludGYoZnAsICIlMTJMZCAiLCBzZWxmLT5jb3VudCk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmaGlzdF9lbnRyeV9fc29ydF9saXN0LCBsaXN0KSB7CisJCWZwcmludGYoZnAsICIgICIpOworCQlyZXQgKz0gc2UtPnByaW50KGZwLCBzZWxmKTsKKwl9CisKKwlyZXQgKz0gZnByaW50ZihmcCwgIlxuIik7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogY29sbGVjdCBoaXN0b2dyYW0gY291bnRzCisgKi8KKworc3RhdGljIGludAoraGlzdF9lbnRyeV9fYWRkKHN0cnVjdCB0aHJlYWQgKnRocmVhZCwgc3RydWN0IG1hcCAqbWFwLCBzdHJ1Y3QgZHNvICpkc28sCisJCXN0cnVjdCBzeW1ib2wgKnN5bSwgX191NjQgaXAsIGNoYXIgbGV2ZWwsIF9fdTY0IGNvdW50KQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZoaXN0LnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJc3RydWN0IGhpc3RfZW50cnkgKmhlOworCXN0cnVjdCBoaXN0X2VudHJ5IGVudHJ5ID0geworCQkudGhyZWFkCT0gdGhyZWFkLAorCQkubWFwCT0gbWFwLAorCQkuZHNvCT0gZHNvLAorCQkuc3ltCT0gc3ltLAorCQkuaXAJPSBpcCwKKwkJLmxldmVsCT0gbGV2ZWwsCisJCS5jb3VudAk9IGNvdW50LAorCX07CisJaW50IGNtcDsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQloZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCisJCWNtcCA9IGhpc3RfZW50cnlfX2NtcCgmZW50cnksIGhlKTsKKworCQlpZiAoIWNtcCkgeworCQkJaGUtPmNvdW50ICs9IGNvdW50OworCQkJcmV0dXJuIDA7CisJCX0KKworCQlpZiAoY21wIDwgMCkKKwkJCXAgPSAmKCpwKS0+cmJfbGVmdDsKKwkJZWxzZQorCQkJcCA9ICYoKnApLT5yYl9yaWdodDsKKwl9CisKKwloZSA9IG1hbGxvYyhzaXplb2YoKmhlKSk7CisJaWYgKCFoZSkKKwkJcmV0dXJuIC1FTk9NRU07CisJKmhlID0gZW50cnk7CisJcmJfbGlua19ub2RlKCZoZS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmhlLT5yYl9ub2RlLCAmaGlzdCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGlzdF9lbnRyeV9fZnJlZShzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCit7CisJZnJlZShoZSk7Cit9CisKKy8qCisgKiBjb2xsYXBzZSB0aGUgaGlzdG9ncmFtCisgKi8KKworc3RhdGljIHN0cnVjdCByYl9yb290IGNvbGxhcHNlX2hpc3RzOworCitzdGF0aWMgdm9pZCBjb2xsYXBzZV9faW5zZXJ0X2VudHJ5KHN0cnVjdCBoaXN0X2VudHJ5ICpoZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqKnAgPSAmY29sbGFwc2VfaGlzdHMucmJfbm9kZTsKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqaXRlcjsKKwlpbnQ2NF90IGNtcDsKKworCXdoaWxlICgqcCAhPSBOVUxMKSB7CisJCXBhcmVudCA9ICpwOworCQlpdGVyID0gcmJfZW50cnkocGFyZW50LCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisKKwkJY21wID0gaGlzdF9lbnRyeV9fY29sbGFwc2UoaXRlciwgaGUpOworCisJCWlmICghY21wKSB7CisJCQlpdGVyLT5jb3VudCArPSBoZS0+Y291bnQ7CisJCQloaXN0X2VudHJ5X19mcmVlKGhlKTsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjbXAgPCAwKQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCX0KKworCXJiX2xpbmtfbm9kZSgmaGUtPnJiX25vZGUsIHBhcmVudCwgcCk7CisJcmJfaW5zZXJ0X2NvbG9yKCZoZS0+cmJfbm9kZSwgJmNvbGxhcHNlX2hpc3RzKTsKK30KKworc3RhdGljIHZvaWQgY29sbGFwc2VfX3Jlc29ydCh2b2lkKQoreworCXN0cnVjdCByYl9ub2RlICpuZXh0OworCXN0cnVjdCBoaXN0X2VudHJ5ICpuOworCisJaWYgKCFzb3J0X19uZWVkX2NvbGxhcHNlKQorCQlyZXR1cm47CisKKwluZXh0ID0gcmJfZmlyc3QoJmhpc3QpOworCXdoaWxlIChuZXh0KSB7CisJCW4gPSByYl9lbnRyeShuZXh0LCBzdHJ1Y3QgaGlzdF9lbnRyeSwgcmJfbm9kZSk7CisJCW5leHQgPSByYl9uZXh0KCZuLT5yYl9ub2RlKTsKKworCQlyYl9lcmFzZSgmbi0+cmJfbm9kZSwgJmhpc3QpOworCQljb2xsYXBzZV9faW5zZXJ0X2VudHJ5KG4pOworCX0KK30KKworLyoKKyAqIHJldmVyc2UgdGhlIG1hcCwgc29ydCBvbiBjb3VudC4KKyAqLworCitzdGF0aWMgc3RydWN0IHJiX3Jvb3Qgb3V0cHV0X2hpc3RzOworCitzdGF0aWMgdm9pZCBvdXRwdXRfX2luc2VydF9lbnRyeShzdHJ1Y3QgaGlzdF9lbnRyeSAqaGUpCit7CisJc3RydWN0IHJiX25vZGUgKipwID0gJm91dHB1dF9oaXN0cy5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBoaXN0X2VudHJ5ICppdGVyOworCisJd2hpbGUgKCpwICE9IE5VTEwpIHsKKwkJcGFyZW50ID0gKnA7CisJCWl0ZXIgPSByYl9lbnRyeShwYXJlbnQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKworCQlpZiAoaGUtPmNvdW50ID4gaXRlci0+Y291bnQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJcmJfbGlua19ub2RlKCZoZS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJmhlLT5yYl9ub2RlLCAmb3V0cHV0X2hpc3RzKTsKK30KKworc3RhdGljIHZvaWQgb3V0cHV0X19yZXNvcnQodm9pZCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmV4dDsKKwlzdHJ1Y3QgaGlzdF9lbnRyeSAqbjsKKwlzdHJ1Y3QgcmJfcm9vdCAqdHJlZSA9ICZoaXN0OworCisJaWYgKHNvcnRfX25lZWRfY29sbGFwc2UpCisJCXRyZWUgPSAmY29sbGFwc2VfaGlzdHM7CisKKwluZXh0ID0gcmJfZmlyc3QodHJlZSk7CisKKwl3aGlsZSAobmV4dCkgeworCQluID0gcmJfZW50cnkobmV4dCwgc3RydWN0IGhpc3RfZW50cnksIHJiX25vZGUpOworCQluZXh0ID0gcmJfbmV4dCgmbi0+cmJfbm9kZSk7CisKKwkJcmJfZXJhc2UoJm4tPnJiX25vZGUsIHRyZWUpOworCQlvdXRwdXRfX2luc2VydF9lbnRyeShuKTsKKwl9Cit9CisKK3N0YXRpYyBzaXplX3Qgb3V0cHV0X19mcHJpbnRmKEZJTEUgKmZwLCBfX3U2NCB0b3RhbF9zYW1wbGVzKQoreworCXN0cnVjdCBoaXN0X2VudHJ5ICpwb3M7CisJc3RydWN0IHNvcnRfZW50cnkgKnNlOworCXN0cnVjdCByYl9ub2RlICpuZDsKKwlzaXplX3QgcmV0ID0gMDsKKworCWZwcmludGYoZnAsICJcbiIpOworCWZwcmludGYoZnAsICIjXG4iKTsKKwlmcHJpbnRmKGZwLCAiIyAoJUxkIHNhbXBsZXMpXG4iLCAoX191NjQpdG90YWxfc2FtcGxlcyk7CisJZnByaW50ZihmcCwgIiNcbiIpOworCisJZnByaW50ZihmcCwgIiMgT3ZlcmhlYWQiKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmaGlzdF9lbnRyeV9fc29ydF9saXN0LCBsaXN0KQorCQlmcHJpbnRmKGZwLCAiICAlcyIsIHNlLT5oZWFkZXIpOworCWZwcmludGYoZnAsICJcbiIpOworCisJZnByaW50ZihmcCwgIiMgLi4uLi4uLi4iKTsKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5KHNlLCAmaGlzdF9lbnRyeV9fc29ydF9saXN0LCBsaXN0KSB7CisJCWludCBpOworCisJCWZwcmludGYoZnAsICIgICIpOworCQlmb3IgKGkgPSAwOyBpIDwgc3RybGVuKHNlLT5oZWFkZXIpOyBpKyspCisJCQlmcHJpbnRmKGZwLCAiLiIpOworCX0KKwlmcHJpbnRmKGZwLCAiXG4iKTsKKworCWZwcmludGYoZnAsICIjXG4iKTsKKworCWZvciAobmQgPSByYl9maXJzdCgmb3V0cHV0X2hpc3RzKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJcG9zID0gcmJfZW50cnkobmQsIHN0cnVjdCBoaXN0X2VudHJ5LCByYl9ub2RlKTsKKwkJcmV0ICs9IGhpc3RfZW50cnlfX2ZwcmludGYoZnAsIHBvcywgdG90YWxfc2FtcGxlcyk7CisJfQorCisJaWYgKCFzdHJjbXAoc29ydF9vcmRlciwgZGVmYXVsdF9zb3J0X29yZGVyKSkgeworCQlmcHJpbnRmKGZwLCAiI1xuIik7CisJCWZwcmludGYoZnAsICIjIChGb3IgbW9yZSBkZXRhaWxzLCB0cnk6IHBlcmYgcmVwb3J0IC0tc29ydCBjb21tLGRzbyxzeW1ib2wpXG4iKTsKKwkJZnByaW50ZihmcCwgIiNcbiIpOworCX0KKwlmcHJpbnRmKGZwLCAiXG4iKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX2lkbGVfdGhyZWFkKHZvaWQpCit7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldygwKTsKKworCWlmICh0aHJlYWQgPT0gTlVMTCB8fAorCQkJdGhyZWFkX19zZXRfY29tbSh0aHJlYWQsICJbaWRsZV0iKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgInByb2JsZW0gaW5zZXJ0aW5nIGlkbGUgdGFzay5cbiIpOworCQlleGl0KC0xKTsKKwl9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHRvdGFsID0gMCwKKwkJICAgICB0b3RhbF9tbWFwID0gMCwKKwkJICAgICB0b3RhbF9jb21tID0gMCwKKwkJICAgICB0b3RhbF9mb3JrID0gMCwKKwkJICAgICB0b3RhbF91bmtub3duID0gMDsKKworc3RhdGljIGludAorcHJvY2Vzc19vdmVyZmxvd19ldmVudChldmVudF90ICpldmVudCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwljaGFyIGxldmVsOworCWludCBzaG93ID0gMDsKKwlzdHJ1Y3QgZHNvICpkc28gPSBOVUxMOworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmlwLnBpZCk7CisJX191NjQgaXAgPSBldmVudC0+aXAuaXA7CisJX191NjQgcGVyaW9kID0gMTsKKwlzdHJ1Y3QgbWFwICptYXAgPSBOVUxMOworCisJaWYgKGV2ZW50LT5oZWFkZXIudHlwZSAmIFBFUkZfU0FNUExFX1BFUklPRCkKKwkJcGVyaW9kID0gZXZlbnQtPmlwLnBlcmlvZDsKKworCWRwcmludGYoIiVwIFslcF06IFBFUkZfRVZFTlQgKElQLCAlZCk6ICVkOiAlcCBwZXJpb2Q6ICVMZFxuIiwKKwkJKHZvaWQgKikob2Zmc2V0ICsgaGVhZCksCisJCSh2b2lkICopKGxvbmcpKGV2ZW50LT5oZWFkZXIuc2l6ZSksCisJCWV2ZW50LT5oZWFkZXIubWlzYywKKwkJZXZlbnQtPmlwLnBpZCwKKwkJKHZvaWQgKikobG9uZylpcCwKKwkJKGxvbmcgbG9uZylwZXJpb2QpOworCisJZHByaW50ZigiIC4uLiB0aHJlYWQ6ICVzOiVkXG4iLCB0aHJlYWQtPmNvbW0sIHRocmVhZC0+cGlkKTsKKworCWlmICh0aHJlYWQgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInByb2JsZW0gcHJvY2Vzc2luZyAlZCBldmVudCwgc2tpcHBpbmcgaXQuXG4iLAorCQkJZXZlbnQtPmhlYWRlci50eXBlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChldmVudC0+aGVhZGVyLm1pc2MgJiBQRVJGX0VWRU5UX01JU0NfS0VSTkVMKSB7CisJCXNob3cgPSBTSE9XX0tFUk5FTDsKKwkJbGV2ZWwgPSAnayc7CisKKwkJZHNvID0ga2VybmVsX2RzbzsKKworCQlkcHJpbnRmKCIgLi4uLi4uIGRzbzogJXNcbiIsIGRzby0+bmFtZSk7CisKKwl9IGVsc2UgaWYgKGV2ZW50LT5oZWFkZXIubWlzYyAmIFBFUkZfRVZFTlRfTUlTQ19VU0VSKSB7CisKKwkJc2hvdyA9IFNIT1dfVVNFUjsKKwkJbGV2ZWwgPSAnLic7CisKKwkJbWFwID0gdGhyZWFkX19maW5kX21hcCh0aHJlYWQsIGlwKTsKKwkJaWYgKG1hcCAhPSBOVUxMKSB7CisJCQlpcCA9IG1hcC0+bWFwX2lwKG1hcCwgaXApOworCQkJZHNvID0gbWFwLT5kc287CisJCX0gZWxzZSB7CisJCQkvKgorCQkJICogSWYgdGhpcyBpcyBvdXRzaWRlIG9mIGFsbCBrbm93biBtYXBzLAorCQkJICogYW5kIGlzIGEgbmVnYXRpdmUgYWRkcmVzcywgdHJ5IHRvIGxvb2sgaXQKKwkJCSAqIHVwIGluIHRoZSBrZXJuZWwgZHNvLCBhcyBpdCBtaWdodCBiZSBhCisJCQkgKiB2c3lzY2FsbCAod2hpY2ggZXhlY3V0ZXMgaW4gdXNlci1tb2RlKToKKwkJCSAqLworCQkJaWYgKChsb25nIGxvbmcpaXAgPCAwKQorCQkJCWRzbyA9IGtlcm5lbF9kc287CisJCX0KKwkJZHByaW50ZigiIC4uLi4uLiBkc286ICVzXG4iLCBkc28gPyBkc28tPm5hbWUgOiAiPG5vdCBmb3VuZD4iKTsKKworCX0gZWxzZSB7CisJCXNob3cgPSBTSE9XX0hWOworCQlsZXZlbCA9ICdIJzsKKwkJZHByaW50ZigiIC4uLi4uLiBkc286IFtoeXBlcnZpc29yXVxuIik7CisJfQorCisJaWYgKHNob3cgJiBzaG93X21hc2spIHsKKwkJc3RydWN0IHN5bWJvbCAqc3ltID0gTlVMTDsKKworCQlpZiAoZHNvKQorCQkJc3ltID0gZHNvLT5maW5kX3N5bWJvbChkc28sIGlwKTsKKworCQlpZiAoaGlzdF9lbnRyeV9fYWRkKHRocmVhZCwgbWFwLCBkc28sIHN5bSwgaXAsIGxldmVsLCBwZXJpb2QpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJInByb2JsZW0gaW5jcmVtZW50aW5nIHN5bWJvbCBjb3VudCwgc2tpcHBpbmcgZXZlbnRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCXRvdGFsICs9IHBlcmlvZDsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50Citwcm9jZXNzX21tYXBfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJc3RydWN0IHRocmVhZCAqdGhyZWFkID0gdGhyZWFkc19fZmluZG5ldyhldmVudC0+bW1hcC5waWQpOworCXN0cnVjdCBtYXAgKm1hcCA9IG1hcF9fbmV3KCZldmVudC0+bW1hcCk7CisKKwlkcHJpbnRmKCIlcCBbJXBdOiBQRVJGX0VWRU5UX01NQVAgJWQ6IFslcCglcCkgQCAlcF06ICVzXG4iLAorCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJZXZlbnQtPm1tYXAucGlkLAorCQkodm9pZCAqKShsb25nKWV2ZW50LT5tbWFwLnN0YXJ0LAorCQkodm9pZCAqKShsb25nKWV2ZW50LT5tbWFwLmxlbiwKKwkJKHZvaWQgKikobG9uZylldmVudC0+bW1hcC5wZ29mZiwKKwkJZXZlbnQtPm1tYXAuZmlsZW5hbWUpOworCisJaWYgKHRocmVhZCA9PSBOVUxMIHx8IG1hcCA9PSBOVUxMKSB7CisJCWRwcmludGYoInByb2JsZW0gcHJvY2Vzc2luZyBQRVJGX0VWRU5UX01NQVAsIHNraXBwaW5nIGV2ZW50LlxuIik7CisJCXJldHVybiAwOworCX0KKworCXRocmVhZF9faW5zZXJ0X21hcCh0aHJlYWQsIG1hcCk7CisJdG90YWxfbW1hcCsrOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK3Byb2Nlc3NfY29tbV9ldmVudChldmVudF90ICpldmVudCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlzdHJ1Y3QgdGhyZWFkICp0aHJlYWQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5jb21tLnBpZCk7CisKKwlkcHJpbnRmKCIlcCBbJXBdOiBQRVJGX0VWRU5UX0NPTU06ICVzOiVkXG4iLAorCQkodm9pZCAqKShvZmZzZXQgKyBoZWFkKSwKKwkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJZXZlbnQtPmNvbW0uY29tbSwgZXZlbnQtPmNvbW0ucGlkKTsKKworCWlmICh0aHJlYWQgPT0gTlVMTCB8fAorCSAgICB0aHJlYWRfX3NldF9jb21tKHRocmVhZCwgZXZlbnQtPmNvbW0uY29tbSkpIHsKKwkJZHByaW50ZigicHJvYmxlbSBwcm9jZXNzaW5nIFBFUkZfRVZFTlRfQ09NTSwgc2tpcHBpbmcgZXZlbnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0b3RhbF9jb21tKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19mb3JrX2V2ZW50KGV2ZW50X3QgKmV2ZW50LCB1bnNpZ25lZCBsb25nIG9mZnNldCwgdW5zaWduZWQgbG9uZyBoZWFkKQoreworCXN0cnVjdCB0aHJlYWQgKnRocmVhZCA9IHRocmVhZHNfX2ZpbmRuZXcoZXZlbnQtPmZvcmsucGlkKTsKKwlzdHJ1Y3QgdGhyZWFkICpwYXJlbnQgPSB0aHJlYWRzX19maW5kbmV3KGV2ZW50LT5mb3JrLnBwaWQpOworCisJZHByaW50ZigiJXAgWyVwXTogUEVSRl9FVkVOVF9GT1JLOiAlZDolZFxuIiwKKwkJKHZvaWQgKikob2Zmc2V0ICsgaGVhZCksCisJCSh2b2lkICopKGxvbmcpKGV2ZW50LT5oZWFkZXIuc2l6ZSksCisJCWV2ZW50LT5mb3JrLnBpZCwgZXZlbnQtPmZvcmsucHBpZCk7CisKKwlpZiAoIXRocmVhZCB8fCAhcGFyZW50IHx8IHRocmVhZF9fZm9yayh0aHJlYWQsIHBhcmVudCkpIHsKKwkJZHByaW50ZigicHJvYmxlbSBwcm9jZXNzaW5nIFBFUkZfRVZFTlRfRk9SSywgc2tpcHBpbmcgZXZlbnQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwl0b3RhbF9mb3JrKys7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19wZXJpb2RfZXZlbnQoZXZlbnRfdCAqZXZlbnQsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCB1bnNpZ25lZCBsb25nIGhlYWQpCit7CisJZHByaW50ZigiJXAgWyVwXTogUEVSRl9FVkVOVF9QRVJJT0Q6IHRpbWU6JUxkLCBpZDolTGQ6IHBlcmlvZDolTGRcbiIsCisJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkodm9pZCAqKShsb25nKShldmVudC0+aGVhZGVyLnNpemUpLAorCQlldmVudC0+cGVyaW9kLnRpbWUsCisJCWV2ZW50LT5wZXJpb2QuaWQsCisJCWV2ZW50LT5wZXJpb2Quc2FtcGxlX3BlcmlvZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorcHJvY2Vzc19ldmVudChldmVudF90ICpldmVudCwgdW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkIGxvbmcgaGVhZCkKK3sKKwlpZiAoZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XKQorCQlyZXR1cm4gcHJvY2Vzc19vdmVyZmxvd19ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKTsKKworCXN3aXRjaCAoZXZlbnQtPmhlYWRlci50eXBlKSB7CisJY2FzZSBQRVJGX0VWRU5UX01NQVA6CisJCXJldHVybiBwcm9jZXNzX21tYXBfZXZlbnQoZXZlbnQsIG9mZnNldCwgaGVhZCk7CisKKwljYXNlIFBFUkZfRVZFTlRfQ09NTToKKwkJcmV0dXJuIHByb2Nlc3NfY29tbV9ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKTsKKworCWNhc2UgUEVSRl9FVkVOVF9GT1JLOgorCQlyZXR1cm4gcHJvY2Vzc19mb3JrX2V2ZW50KGV2ZW50LCBvZmZzZXQsIGhlYWQpOworCisJY2FzZSBQRVJGX0VWRU5UX1BFUklPRDoKKwkJcmV0dXJuIHByb2Nlc3NfcGVyaW9kX2V2ZW50KGV2ZW50LCBvZmZzZXQsIGhlYWQpOworCS8qCisJICogV2UgZG9udCBwcm9jZXNzIHRoZW0gcmlnaHQgbm93IGJ1dCB0aGV5IGFyZSBmaW5lOgorCSAqLworCisJY2FzZSBQRVJGX0VWRU5UX1RIUk9UVExFOgorCWNhc2UgUEVSRl9FVkVOVF9VTlRIUk9UVExFOgorCQlyZXR1cm4gMDsKKworCWRlZmF1bHQ6CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfX2NtZF9yZXBvcnQodm9pZCkKK3sKKwlpbnQgcmV0LCByYyA9IEVYSVRfRkFJTFVSRTsKKwl1bnNpZ25lZCBsb25nIG9mZnNldCA9IDA7CisJdW5zaWduZWQgbG9uZyBoZWFkID0gMDsKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCWV2ZW50X3QgKmV2ZW50OworCXVpbnQzMl90IHNpemU7CisJY2hhciAqYnVmOworCisJcmVnaXN0ZXJfaWRsZV90aHJlYWQoKTsKKworCWlucHV0ID0gb3BlbihpbnB1dF9uYW1lLCBPX1JET05MWSk7CisJaWYgKGlucHV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiBmYWlsZWQgdG8gb3BlbiBmaWxlOiAlcyIsIGlucHV0X25hbWUpOworCQlpZiAoIXN0cmNtcChpbnB1dF9uYW1lLCAicGVyZi5kYXRhIikpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiAgKHRyeSAncGVyZiByZWNvcmQnIGZpcnN0KSIpOworCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCXJldCA9IGZzdGF0KGlucHV0LCAmc3RhdCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJmYWlsZWQgdG8gc3RhdCBmaWxlIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmICghc3RhdC5zdF9zaXplKSB7CisJCWZwcmludGYoc3RkZXJyLCAiemVyby1zaXplZCBmaWxlLCBub3RoaW5nIHRvIGRvIVxuIik7CisJCWV4aXQoMCk7CisJfQorCisJaWYgKGxvYWRfa2VybmVsKCkgPCAwKSB7CisJCXBlcnJvcigiZmFpbGVkIHRvIGxvYWQga2VybmVsIHN5bWJvbHMiKTsKKwkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwl9CisKKwlpZiAoIWZ1bGxfcGF0aHMpIHsKKwkJaWYgKGdldGN3ZChfX2N3ZCwgc2l6ZW9mKF9fY3dkKSkgPT0gTlVMTCkgeworCQkJcGVycm9yKCJmYWlsZWQgdG8gZ2V0IHRoZSBjdXJyZW50IGRpcmVjdG9yeSIpOworCQkJcmV0dXJuIEVYSVRfRkFJTFVSRTsKKwkJfQorCQljd2RsZW4gPSBzdHJsZW4oY3dkKTsKKwl9IGVsc2UgeworCQljd2QgPSBOVUxMOworCQljd2RsZW4gPSAwOworCX0KK3JlbWFwOgorCWJ1ZiA9IChjaGFyICopbW1hcChOVUxMLCBwYWdlX3NpemUgKiBtbWFwX3dpbmRvdywgUFJPVF9SRUFELAorCQkJICAgTUFQX1NIQVJFRCwgaW5wdXQsIG9mZnNldCk7CisJaWYgKGJ1ZiA9PSBNQVBfRkFJTEVEKSB7CisJCXBlcnJvcigiZmFpbGVkIHRvIG1tYXAgZmlsZSIpOworCQlleGl0KC0xKTsKKwl9CisKK21vcmU6CisJZXZlbnQgPSAoZXZlbnRfdCAqKShidWYgKyBoZWFkKTsKKworCXNpemUgPSBldmVudC0+aGVhZGVyLnNpemU7CisJaWYgKCFzaXplKQorCQlzaXplID0gODsKKworCWlmIChoZWFkICsgZXZlbnQtPmhlYWRlci5zaXplID49IHBhZ2Vfc2l6ZSAqIG1tYXBfd2luZG93KSB7CisJCXVuc2lnbmVkIGxvbmcgc2hpZnQgPSBwYWdlX3NpemUgKiAoaGVhZCAvIHBhZ2Vfc2l6ZSk7CisJCWludCByZXQ7CisKKwkJcmV0ID0gbXVubWFwKGJ1ZiwgcGFnZV9zaXplICogbW1hcF93aW5kb3cpOworCQlhc3NlcnQocmV0ID09IDApOworCisJCW9mZnNldCArPSBzaGlmdDsKKwkJaGVhZCAtPSBzaGlmdDsKKwkJZ290byByZW1hcDsKKwl9CisKKwlzaXplID0gZXZlbnQtPmhlYWRlci5zaXplOworCisJZHByaW50ZigiJXAgWyVwXTogZXZlbnQ6ICVkXG4iLAorCQkJKHZvaWQgKikob2Zmc2V0ICsgaGVhZCksCisJCQkodm9pZCAqKShsb25nKWV2ZW50LT5oZWFkZXIuc2l6ZSwKKwkJCWV2ZW50LT5oZWFkZXIudHlwZSk7CisKKwlpZiAoIXNpemUgfHwgcHJvY2Vzc19ldmVudChldmVudCwgb2Zmc2V0LCBoZWFkKSA8IDApIHsKKworCQlkcHJpbnRmKCIlcCBbJXBdOiBza2lwcGluZyB1bmtub3duIGhlYWRlciB0eXBlOiAlZFxuIiwKKwkJCSh2b2lkICopKG9mZnNldCArIGhlYWQpLAorCQkJKHZvaWQgKikobG9uZykoZXZlbnQtPmhlYWRlci5zaXplKSwKKwkJCWV2ZW50LT5oZWFkZXIudHlwZSk7CisKKwkJdG90YWxfdW5rbm93bisrOworCisJCS8qCisJCSAqIGFzc3VtZSB3ZSBsb3N0IHRyYWNrIG9mIHRoZSBzdHJlYW0sIGNoZWNrIGFsaWdubWVudCwgYW5kCisJCSAqIGluY3JlbWVudCBhIHNpbmdsZSB1NjQgaW4gdGhlIGhvcGUgdG8gY2F0Y2ggb24gYWdhaW4gJ3Nvb24nLgorCQkgKi8KKworCQlpZiAodW5saWtlbHkoaGVhZCAmIDcpKQorCQkJaGVhZCAmPSB+N1VMTDsKKworCQlzaXplID0gODsKKwl9CisKKwloZWFkICs9IHNpemU7CisKKwlpZiAob2Zmc2V0ICsgaGVhZCA8IHN0YXQuc3Rfc2l6ZSkKKwkJZ290byBtb3JlOworCisJcmMgPSBFWElUX1NVQ0NFU1M7CisJY2xvc2UoaW5wdXQpOworCisJZHByaW50ZigiICAgICAgSVAgZXZlbnRzOiAlMTBsZFxuIiwgdG90YWwpOworCWRwcmludGYoIiAgICBtbWFwIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsX21tYXApOworCWRwcmludGYoIiAgICBjb21tIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsX2NvbW0pOworCWRwcmludGYoIiAgICBmb3JrIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsX2ZvcmspOworCWRwcmludGYoIiB1bmtub3duIGV2ZW50czogJTEwbGRcbiIsIHRvdGFsX3Vua25vd24pOworCisJaWYgKGR1bXBfdHJhY2UpCisJCXJldHVybiAwOworCisJaWYgKHZlcmJvc2UgPj0gMykKKwkJdGhyZWFkc19fZnByaW50ZihzdGRvdXQpOworCisJaWYgKHZlcmJvc2UgPj0gMikKKwkJZHNvc19fZnByaW50ZihzdGRvdXQpOworCisJY29sbGFwc2VfX3Jlc29ydCgpOworCW91dHB1dF9fcmVzb3J0KCk7CisJb3V0cHV0X19mcHJpbnRmKHN0ZG91dCwgdG90YWwpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHJlcG9ydF91c2FnZVtdID0geworCSJwZXJmIHJlcG9ydCBbPG9wdGlvbnM+XSA8Y29tbWFuZD4iLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwlPUFRfU1RSSU5HKCdpJywgImlucHV0IiwgJmlucHV0X25hbWUsICJmaWxlIiwKKwkJICAgICJpbnB1dCBmaWxlIG5hbWUiKSwKKwlPUFRfQk9PTEVBTigndicsICJ2ZXJib3NlIiwgJnZlcmJvc2UsCisJCSAgICAiYmUgbW9yZSB2ZXJib3NlIChzaG93IHN5bWJvbCBhZGRyZXNzLCBldGMpIiksCisJT1BUX0JPT0xFQU4oJ0QnLCAiZHVtcC1yYXctdHJhY2UiLCAmZHVtcF90cmFjZSwKKwkJICAgICJkdW1wIHJhdyB0cmFjZSBpbiBBU0NJSSIpLAorCU9QVF9TVFJJTkcoJ2snLCAidm1saW51eCIsICZ2bWxpbnV4LCAiZmlsZSIsICJ2bWxpbnV4IHBhdGhuYW1lIiksCisJT1BUX1NUUklORygncycsICJzb3J0IiwgJnNvcnRfb3JkZXIsICJrZXlbLGtleTIuLi5dIiwKKwkJICAgInNvcnQgYnkga2V5KHMpOiBwaWQsIGNvbW0sIGRzbywgc3ltYm9sLiBEZWZhdWx0OiBwaWQsc3ltYm9sIiksCisJT1BUX0JPT0xFQU4oJ1AnLCAiZnVsbC1wYXRocyIsICZmdWxsX3BhdGhzLAorCQkgICAgIkRvbid0IHNob3J0ZW4gdGhlIHBhdGhuYW1lcyB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBjd2QiKSwKKwlPUFRfRU5EKCkKK307CisKK3N0YXRpYyB2b2lkIHNldHVwX3NvcnRpbmcodm9pZCkKK3sKKwljaGFyICp0bXAsICp0b2ssICpzdHIgPSBzdHJkdXAoc29ydF9vcmRlcik7CisKKwlmb3IgKHRvayA9IHN0cnRva19yKHN0ciwgIiwgIiwgJnRtcCk7CisJCQl0b2s7IHRvayA9IHN0cnRva19yKE5VTEwsICIsICIsICZ0bXApKSB7CisJCWlmIChzb3J0X2RpbWVuc2lvbl9fYWRkKHRvaykgPCAwKSB7CisJCQllcnJvcigiVW5rbm93biAtLXNvcnQga2V5OiBgJXMnIiwgdG9rKTsKKwkJCXVzYWdlX3dpdGhfb3B0aW9ucyhyZXBvcnRfdXNhZ2UsIG9wdGlvbnMpOworCQl9CisJfQorCisJZnJlZShzdHIpOworfQorCitpbnQgY21kX3JlcG9ydChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzeW1ib2xfX2luaXQoKTsKKworCXBhZ2Vfc2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCByZXBvcnRfdXNhZ2UsIDApOworCisJc2V0dXBfc29ydGluZygpOworCisJLyoKKwkgKiBBbnkgKHVucmVjb2duaXplZCkgYXJndW1lbnRzIGxlZnQ/CisJICovCisJaWYgKGFyZ2MpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhyZXBvcnRfdXNhZ2UsIG9wdGlvbnMpOworCisJc2V0dXBfcGFnZXIoKTsKKworCXJldHVybiBfX2NtZF9yZXBvcnQoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYnVpbHRpbi1zdGF0LmMgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0M2U0YTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4tc3RhdC5jCkBAIC0wLDAgKzEsMzY3IEBACisvKgorICogYnVpbHRpbi1zdGF0LmMKKyAqCisgKiBCdWlsdGluIHN0YXQgY29tbWFuZDogR2l2ZSBhIHByZWNpc2UgcGVyZm9ybWFuY2UgY291bnRlcnMgc3VtbWFyeQorICogb3ZlcnZpZXcgYWJvdXQgYW55IHdvcmtsb2FkLCBDUFUgb3Igc3BlY2lmaWMgUElELgorICoKKyAqIFNhbXBsZSBvdXRwdXQ6CisKKyAgICQgcGVyZiBzdGF0IH4vaGFja2JlbmNoIDEwCisgICBUaW1lOiAwLjEwNAorCisgICAgUGVyZm9ybWFuY2UgY291bnRlciBzdGF0cyBmb3IgJy9ob21lL21pbmdvL2hhY2tiZW5jaCc6CisKKyAgICAgICAxMjU1LjUzODYxMSAgdGFzayBjbG9jayB0aWNrcyAgICAgIyAgICAgIDEwLjE0MyBDUFUgdXRpbGl6YXRpb24gZmFjdG9yCisgICAgICAgICAgICAgNTQwMTEgIGNvbnRleHQgc3dpdGNoZXMgICAgICMgICAgICAgMC4wNDMgTS9zZWMKKyAgICAgICAgICAgICAgIDM4NSAgQ1BVIG1pZ3JhdGlvbnMgICAgICAgIyAgICAgICAwLjAwMCBNL3NlYworICAgICAgICAgICAgIDE3NzU1ICBwYWdlZmF1bHRzICAgICAgICAgICAjICAgICAgIDAuMDE0IE0vc2VjCisgICAgICAgIDM4MDgzMjMxODUgIENQVSBjeWNsZXMgICAgICAgICAgICMgICAgMzAzMy4yMTkgTS9zZWMKKyAgICAgICAgMTU3NTExMTE5MCAgaW5zdHJ1Y3Rpb25zICAgICAgICAgIyAgICAxMjU0LjUzMCBNL3NlYworICAgICAgICAgIDE3MzY3ODk1ICBjYWNoZSByZWZlcmVuY2VzICAgICAjICAgICAgMTMuODMzIE0vc2VjCisgICAgICAgICAgIDc2NzQ0MjEgIGNhY2hlIG1pc3NlcyAgICAgICAgICMgICAgICAgNi4xMTIgTS9zZWMKKworICAgIFdhbGwtY2xvY2sgdGltZSBlbGFwc2VkOiAgIDEyMy43ODY2MjAgbXNlY3MKKworICoKKyAqIENvcHlyaWdodCAoQykgMjAwOCwgUmVkIEhhdCBJbmMsIEluZ28gTW9sbmFyIDxtaW5nb0ByZWRoYXQuY29tPgorICoKKyAqIEltcHJvdmVtZW50cyBhbmQgZml4ZXMgYnk6CisgKgorICogICBBcmphbiB2YW4gZGUgVmVuIDxhcmphbkBsaW51eC5pbnRlbC5jb20+CisgKiAgIFlhbm1pbiBaaGFuZyA8eWFubWluLnpoYW5nQGludGVsLmNvbT4KKyAqICAgV3UgRmVuZ2d1YW5nIDxmZW5nZ3Vhbmcud3VAaW50ZWwuY29tPgorICogICBNaWtlIEdhbGJyYWl0aCA8ZWZhdWx0QGdteC5kZT4KKyAqICAgUGF1bCBNYWNrZXJyYXMgPHBhdWx1c0BzYW1iYS5vcmc+CisgKgorICogUmVsZWFzZWQgdW5kZXIgdGhlIEdQTCB2Mi4gKGFuZCBvbmx5IHYyLCBub3QgYW55IGxhdGVyIHZlcnNpb24pCisgKi8KKworI2luY2x1ZGUgInBlcmYuaCIKKyNpbmNsdWRlICJidWlsdGluLmgiCisjaW5jbHVkZSAidXRpbC91dGlsLmgiCisjaW5jbHVkZSAidXRpbC9wYXJzZS1vcHRpb25zLmgiCisjaW5jbHVkZSAidXRpbC9wYXJzZS1ldmVudHMuaCIKKworI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorCitzdGF0aWMgc3RydWN0IHBlcmZfY291bnRlcl9hdHRyIGRlZmF1bHRfYXR0cnNbTUFYX0NPVU5URVJTXSA9IHsKKworICB7IC50eXBlID0gUEVSRl9UWVBFX1NPRlRXQVJFLCAuY29uZmlnID0gUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLCX0sCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfU09GVFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX1NXX0NPTlRFWFRfU1dJVENIRVN9LAorICB7IC50eXBlID0gUEVSRl9UWVBFX1NPRlRXQVJFLCAuY29uZmlnID0gUEVSRl9DT1VOVF9TV19DUFVfTUlHUkFUSU9OUwl9LAorICB7IC50eXBlID0gUEVSRl9UWVBFX1NPRlRXQVJFLCAuY29uZmlnID0gUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUwl9LAorCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX0hXX0NQVV9DWUNMRVMJfSwKKyAgeyAudHlwZSA9IFBFUkZfVFlQRV9IQVJEV0FSRSwgLmNvbmZpZyA9IFBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TCX0sCisgIHsgLnR5cGUgPSBQRVJGX1RZUEVfSEFSRFdBUkUsIC5jb25maWcgPSBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVN9LAorICB7IC50eXBlID0gUEVSRl9UWVBFX0hBUkRXQVJFLCAuY29uZmlnID0gUEVSRl9DT1VOVF9IV19DQUNIRV9NSVNTRVMJfSwKKworfTsKKworc3RhdGljIGludAkJCXN5c3RlbV93aWRlCQkJPSAgMDsKK3N0YXRpYyBpbnQJCQlpbmhlcml0CQkJCT0gIDE7CitzdGF0aWMgaW50CQkJdmVyYm9zZQkJCQk9ICAwOworCitzdGF0aWMgaW50CQkJZmRbTUFYX05SX0NQVVNdW01BWF9DT1VOVEVSU107CisKK3N0YXRpYyBpbnQJCQl0YXJnZXRfcGlkCQkJPSAtMTsKK3N0YXRpYyBpbnQJCQlucl9jcHVzCQkJCT0gIDA7CitzdGF0aWMgdW5zaWduZWQgaW50CQlwYWdlX3NpemU7CisKK3N0YXRpYyBpbnQJCQlzY2FsZQkJCQk9ICAxOworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGRlZmF1bHRfY291bnRbXSA9IHsKKwkxMDAwMDAwLAorCTEwMDAwMDAsCisJICAxMDAwMCwKKwkgIDEwMDAwLAorCTEwMDAwMDAsCisJICAxMDAwMCwKK307CisKK3N0YXRpYyBfX3U2NAkJCWV2ZW50X3Jlc1tNQVhfQ09VTlRFUlNdWzNdOworc3RhdGljIF9fdTY0CQkJZXZlbnRfc2NhbGVkW01BWF9DT1VOVEVSU107CisKK3N0YXRpYyBfX3U2NAkJCXJ1bnRpbWVfbnNlY3M7CitzdGF0aWMgX191NjQJCQl3YWxsdGltZV9uc2VjczsKK3N0YXRpYyBfX3U2NAkJCXJ1bnRpbWVfY3ljbGVzOworCitzdGF0aWMgdm9pZCBjcmVhdGVfcGVyZl9zdGF0X2NvdW50ZXIoaW50IGNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyID0gYXR0cnMgKyBjb3VudGVyOworCisJaWYgKHNjYWxlKQorCQlhdHRyLT5yZWFkX2Zvcm1hdCA9IFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfRU5BQkxFRCB8CisJCQkJICAgIFBFUkZfRk9STUFUX1RPVEFMX1RJTUVfUlVOTklORzsKKworCWlmIChzeXN0ZW1fd2lkZSkgeworCQlpbnQgY3B1OworCQlmb3IgKGNwdSA9IDA7IGNwdSA8IG5yX2NwdXM7IGNwdSArKykgeworCQkJZmRbY3B1XVtjb3VudGVyXSA9IHN5c19wZXJmX2NvdW50ZXJfb3BlbihhdHRyLCAtMSwgY3B1LCAtMSwgMCk7CisJCQlpZiAoZmRbY3B1XVtjb3VudGVyXSA8IDAgJiYgdmVyYm9zZSkgeworCQkJCXByaW50ZigiRXJyb3I6IGNvdW50ZXIgJWQsIHN5c19wZXJmX2NvdW50ZXJfb3BlbigpIHN5c2NhbGwgcmV0dXJuZWQgd2l0aCAlZCAoJXMpXG4iLCBjb3VudGVyLCBmZFtjcHVdW2NvdW50ZXJdLCBzdHJlcnJvcihlcnJubykpOworCQkJfQorCQl9CisJfSBlbHNlIHsKKwkJYXR0ci0+aW5oZXJpdAk9IGluaGVyaXQ7CisJCWF0dHItPmRpc2FibGVkCT0gMTsKKworCQlmZFswXVtjb3VudGVyXSA9IHN5c19wZXJmX2NvdW50ZXJfb3BlbihhdHRyLCAwLCAtMSwgLTEsIDApOworCQlpZiAoZmRbMF1bY291bnRlcl0gPCAwICYmIHZlcmJvc2UpIHsKKwkJCXByaW50ZigiRXJyb3I6IGNvdW50ZXIgJWQsIHN5c19wZXJmX2NvdW50ZXJfb3BlbigpIHN5c2NhbGwgcmV0dXJuZWQgd2l0aCAlZCAoJXMpXG4iLCBjb3VudGVyLCBmZFswXVtjb3VudGVyXSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJfQorCX0KK30KKworLyoKKyAqIERvZXMgdGhlIGNvdW50ZXIgaGF2ZSBuc2VjcyBhcyBhIHVuaXQ/CisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IG5zZWNfY291bnRlcihpbnQgY291bnRlcikKK3sKKwlpZiAoYXR0cnNbY291bnRlcl0udHlwZSAhPSBQRVJGX1RZUEVfU09GVFdBUkUpCisJCXJldHVybiAwOworCisJaWYgKGF0dHJzW2NvdW50ZXJdLmNvbmZpZyA9PSBQRVJGX0NPVU5UX1NXX0NQVV9DTE9DSykKKwkJcmV0dXJuIDE7CisKKwlpZiAoYXR0cnNbY291bnRlcl0uY29uZmlnID09IFBFUkZfQ09VTlRfU1dfVEFTS19DTE9DSykKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIFJlYWQgb3V0IHRoZSByZXN1bHRzIG9mIGEgc2luZ2xlIGNvdW50ZXI6CisgKi8KK3N0YXRpYyB2b2lkIHJlYWRfY291bnRlcihpbnQgY291bnRlcikKK3sKKwlfX3U2NCAqY291bnQsIHNpbmdsZV9jb3VudFszXTsKKwlzc2l6ZV90IHJlczsKKwlpbnQgY3B1LCBudjsKKwlpbnQgc2NhbGVkOworCisJY291bnQgPSBldmVudF9yZXNbY291bnRlcl07CisKKwljb3VudFswXSA9IGNvdW50WzFdID0gY291bnRbMl0gPSAwOworCisJbnYgPSBzY2FsZSA/IDMgOiAxOworCWZvciAoY3B1ID0gMDsgY3B1IDwgbnJfY3B1czsgY3B1ICsrKSB7CisJCWlmIChmZFtjcHVdW2NvdW50ZXJdIDwgMCkKKwkJCWNvbnRpbnVlOworCisJCXJlcyA9IHJlYWQoZmRbY3B1XVtjb3VudGVyXSwgc2luZ2xlX2NvdW50LCBudiAqIHNpemVvZihfX3U2NCkpOworCQlhc3NlcnQocmVzID09IG52ICogc2l6ZW9mKF9fdTY0KSk7CisKKwkJY291bnRbMF0gKz0gc2luZ2xlX2NvdW50WzBdOworCQlpZiAoc2NhbGUpIHsKKwkJCWNvdW50WzFdICs9IHNpbmdsZV9jb3VudFsxXTsKKwkJCWNvdW50WzJdICs9IHNpbmdsZV9jb3VudFsyXTsKKwkJfQorCX0KKworCXNjYWxlZCA9IDA7CisJaWYgKHNjYWxlKSB7CisJCWlmIChjb3VudFsyXSA9PSAwKSB7CisJCQlldmVudF9zY2FsZWRbY291bnRlcl0gPSAtMTsKKwkJCWNvdW50WzBdID0gMDsKKwkJCXJldHVybjsKKwkJfQorCisJCWlmIChjb3VudFsyXSA8IGNvdW50WzFdKSB7CisJCQlldmVudF9zY2FsZWRbY291bnRlcl0gPSAxOworCQkJY291bnRbMF0gPSAodW5zaWduZWQgbG9uZyBsb25nKQorCQkJCSgoZG91YmxlKWNvdW50WzBdICogY291bnRbMV0gLyBjb3VudFsyXSArIDAuNSk7CisJCX0KKwl9CisJLyoKKwkgKiBTYXZlIHRoZSBmdWxsIHJ1bnRpbWUgLSB0byBhbGxvdyBub3JtYWxpemF0aW9uIGR1cmluZyBwcmludG91dDoKKwkgKi8KKwlpZiAoYXR0cnNbY291bnRlcl0udHlwZSA9PSBQRVJGX1RZUEVfU09GVFdBUkUgJiYKKwkJYXR0cnNbY291bnRlcl0uY29uZmlnID09IFBFUkZfQ09VTlRfU1dfVEFTS19DTE9DSykKKwkJcnVudGltZV9uc2VjcyA9IGNvdW50WzBdOworCWlmIChhdHRyc1tjb3VudGVyXS50eXBlID09IFBFUkZfVFlQRV9IQVJEV0FSRSAmJgorCQlhdHRyc1tjb3VudGVyXS5jb25maWcgPT0gUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTKQorCQlydW50aW1lX2N5Y2xlcyA9IGNvdW50WzBdOworfQorCisvKgorICogUHJpbnQgb3V0IHRoZSByZXN1bHRzIG9mIGEgc2luZ2xlIGNvdW50ZXI6CisgKi8KK3N0YXRpYyB2b2lkIHByaW50X2NvdW50ZXIoaW50IGNvdW50ZXIpCit7CisJX191NjQgKmNvdW50OworCWludCBzY2FsZWQ7CisKKwljb3VudCA9IGV2ZW50X3Jlc1tjb3VudGVyXTsKKwlzY2FsZWQgPSBldmVudF9zY2FsZWRbY291bnRlcl07CisKKwlpZiAoc2NhbGVkID09IC0xKSB7CisJCWZwcmludGYoc3RkZXJyLCAiICUxNHMgICUtMjBzXG4iLAorCQkJIjxub3QgY291bnRlZD4iLCBldmVudF9uYW1lKGNvdW50ZXIpKTsKKwkJcmV0dXJuOworCX0KKworCWlmIChuc2VjX2NvdW50ZXIoY291bnRlcikpIHsKKwkJZG91YmxlIG1zZWNzID0gKGRvdWJsZSljb3VudFswXSAvIDEwMDAwMDA7CisKKwkJZnByaW50ZihzdGRlcnIsICIgJTE0LjZmICAlLTIwcyIsCisJCQltc2VjcywgZXZlbnRfbmFtZShjb3VudGVyKSk7CisJCWlmIChhdHRyc1tjb3VudGVyXS50eXBlID09IFBFUkZfVFlQRV9TT0ZUV0FSRSAmJgorCQkJYXR0cnNbY291bnRlcl0uY29uZmlnID09IFBFUkZfQ09VTlRfU1dfVEFTS19DTE9DSykgeworCisJCQlpZiAod2FsbHRpbWVfbnNlY3MpCisJCQkJZnByaW50ZihzdGRlcnIsICIgIyAlMTEuM2YgQ1BVIHV0aWxpemF0aW9uIGZhY3RvciIsCisJCQkJCShkb3VibGUpY291bnRbMF0gLyAoZG91YmxlKXdhbGx0aW1lX25zZWNzKTsKKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiICUxNExkICAlLTIwcyIsCisJCQljb3VudFswXSwgZXZlbnRfbmFtZShjb3VudGVyKSk7CisJCWlmIChydW50aW1lX25zZWNzKQorCQkJZnByaW50ZihzdGRlcnIsICIgIyAlMTEuM2YgTS9zZWMiLAorCQkJCShkb3VibGUpY291bnRbMF0vcnVudGltZV9uc2VjcyoxMDAwLjApOworCQlpZiAocnVudGltZV9jeWNsZXMgJiYKKwkJCWF0dHJzW2NvdW50ZXJdLnR5cGUgPT0gUEVSRl9UWVBFX0hBUkRXQVJFICYmCisJCQkJYXR0cnNbY291bnRlcl0uY29uZmlnID09IFBFUkZfQ09VTlRfSFdfSU5TVFJVQ1RJT05TKSB7CisKKwkJCWZwcmludGYoc3RkZXJyLCAiICMgJTEuM2YgcGVyIGN5Y2xlIiwKKwkJCQkoZG91YmxlKWNvdW50WzBdIC8gKGRvdWJsZSlydW50aW1lX2N5Y2xlcyk7CisJCX0KKwl9CisJaWYgKHNjYWxlZCkKKwkJZnByaW50ZihzdGRlcnIsICIgIChzY2FsZWQgZnJvbSAlLjJmJSUpIiwKKwkJCShkb3VibGUpIGNvdW50WzJdIC8gY291bnRbMV0gKiAxMDApOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKK30KKworc3RhdGljIGludCBkb19wZXJmX3N0YXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCXVuc2lnbmVkIGxvbmcgbG9uZyB0MCwgdDE7CisJaW50IGNvdW50ZXI7CisJaW50IHN0YXR1czsKKwlpbnQgcGlkOworCWludCBpOworCisJaWYgKCFzeXN0ZW1fd2lkZSkKKwkJbnJfY3B1cyA9IDE7CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykKKwkJY3JlYXRlX3BlcmZfc3RhdF9jb3VudGVyKGNvdW50ZXIpOworCisJLyoKKwkgKiBFbmFibGUgY291bnRlcnMgYW5kIGV4ZWMgdGhlIGNvbW1hbmQ6CisJICovCisJdDAgPSByZGNsb2NrKCk7CisJcHJjdGwoUFJfVEFTS19QRVJGX0NPVU5URVJTX0VOQUJMRSk7CisKKwlpZiAoKHBpZCA9IGZvcmsoKSkgPCAwKQorCQlwZXJyb3IoImZhaWxlZCB0byBmb3JrIik7CisKKwlpZiAoIXBpZCkgeworCQlpZiAoZXhlY3ZwKGFyZ3ZbMF0sIChjaGFyICoqKWFyZ3YpKSB7CisJCQlwZXJyb3IoYXJndlswXSk7CisJCQlleGl0KC0xKTsKKwkJfQorCX0KKworCXdoaWxlICh3YWl0KCZzdGF0dXMpID49IDApCisJCTsKKworCXByY3RsKFBSX1RBU0tfUEVSRl9DT1VOVEVSU19ESVNBQkxFKTsKKwl0MSA9IHJkY2xvY2soKTsKKworCXdhbGx0aW1lX25zZWNzID0gdDEgLSB0MDsKKworCWZmbHVzaChzdGRvdXQpOworCisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiIFBlcmZvcm1hbmNlIGNvdW50ZXIgc3RhdHMgZm9yIFwnJXMiLCBhcmd2WzBdKTsKKworCWZvciAoaSA9IDE7IGkgPCBhcmdjOyBpKyspCisJCWZwcmludGYoc3RkZXJyLCAiICVzIiwgYXJndltpXSk7CisKKwlmcHJpbnRmKHN0ZGVyciwgIlwnOlxuIik7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCisJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IG5yX2NvdW50ZXJzOyBjb3VudGVyKyspCisJCXJlYWRfY291bnRlcihjb3VudGVyKTsKKworCWZvciAoY291bnRlciA9IDA7IGNvdW50ZXIgPCBucl9jb3VudGVyczsgY291bnRlcisrKQorCQlwcmludF9jb3VudGVyKGNvdW50ZXIpOworCisKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJZnByaW50ZihzdGRlcnIsICIgV2FsbC1jbG9jayB0aW1lIGVsYXBzZWQ6ICUxMi42ZiBtc2Vjc1xuIiwKKwkJCShkb3VibGUpKHQxLXQwKS8xZTYpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9sYXRpbGUgaW50IHNpZ25yID0gLTE7CisKK3N0YXRpYyB2b2lkIHNraXBfc2lnbmFsKGludCBzaWdubykKK3sKKwlzaWduciA9IHNpZ25vOworfQorCitzdGF0aWMgdm9pZCBzaWdfYXRleGl0KHZvaWQpCit7CisJaWYgKHNpZ25yID09IC0xKQorCQlyZXR1cm47CisKKwlzaWduYWwoc2lnbnIsIFNJR19ERkwpOworCWtpbGwoZ2V0cGlkKCksIHNpZ25yKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBzdGF0X3VzYWdlW10gPSB7CisJInBlcmYgc3RhdCBbPG9wdGlvbnM+XSA8Y29tbWFuZD4iLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwlPUFRfQ0FMTEJBQ0soJ2UnLCAiZXZlbnQiLCBOVUxMLCAiZXZlbnQiLAorCQkgICAgICJldmVudCBzZWxlY3Rvci4gdXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYXZhaWxhYmxlIGV2ZW50cyIsCisJCSAgICAgcGFyc2VfZXZlbnRzKSwKKwlPUFRfQk9PTEVBTignaScsICJpbmhlcml0IiwgJmluaGVyaXQsCisJCSAgICAiY2hpbGQgdGFza3MgaW5oZXJpdCBjb3VudGVycyIpLAorCU9QVF9JTlRFR0VSKCdwJywgInBpZCIsICZ0YXJnZXRfcGlkLAorCQkgICAgInN0YXQgZXZlbnRzIG9uIGV4aXN0aW5nIHBpZCIpLAorCU9QVF9CT09MRUFOKCdhJywgImFsbC1jcHVzIiwgJnN5c3RlbV93aWRlLAorCQkJICAgICJzeXN0ZW0td2lkZSBjb2xsZWN0aW9uIGZyb20gYWxsIENQVXMiKSwKKwlPUFRfQk9PTEVBTignUycsICJzY2FsZSIsICZzY2FsZSwKKwkJCSAgICAic2NhbGUvbm9ybWFsaXplIGNvdW50ZXJzIiksCisJT1BUX0JPT0xFQU4oJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLAorCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBjb3VudGVyIG9wZW4gZXJyb3JzLCBldGMpIiksCisJT1BUX0VORCgpCit9OworCitpbnQgY21kX3N0YXQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJcGFnZV9zaXplID0gc3lzY29uZihfU0NfUEFHRV9TSVpFKTsKKworCW1lbWNweShhdHRycywgZGVmYXVsdF9hdHRycywgc2l6ZW9mKGF0dHJzKSk7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCBzdGF0X3VzYWdlLCAwKTsKKwlpZiAoIWFyZ2MpCisJCXVzYWdlX3dpdGhfb3B0aW9ucyhzdGF0X3VzYWdlLCBvcHRpb25zKTsKKworCWlmICghbnJfY291bnRlcnMpCisJCW5yX2NvdW50ZXJzID0gODsKKworCW5yX2NwdXMgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKwlhc3NlcnQobnJfY3B1cyA8PSBNQVhfTlJfQ1BVUyk7CisJYXNzZXJ0KG5yX2NwdXMgPj0gMCk7CisKKwkvKgorCSAqIFdlIGRvbnQgd2FudCB0byBibG9jayB0aGUgc2lnbmFscyAtIHRoYXQgd291bGQgY2F1c2UKKwkgKiBjaGlsZCB0YXNrcyB0byBpbmhlcml0IHRoYXQgYW5kIEN0cmwtQyB3b3VsZCBub3Qgd29yay4KKwkgKiBXaGF0IHdlIHdhbnQgaXMgZm9yIEN0cmwtQyB0byB3b3JrIGluIHRoZSBleGVjKCktZWQKKwkgKiB0YXNrLCBidXQgYmVpbmcgaWdub3JlZCBieSBwZXJmIHN0YXQgaXRzZWxmOgorCSAqLworCWF0ZXhpdChzaWdfYXRleGl0KTsKKwlzaWduYWwoU0lHSU5ULCAgc2tpcF9zaWduYWwpOworCXNpZ25hbChTSUdBTFJNLCBza2lwX3NpZ25hbCk7CisJc2lnbmFsKFNJR0FCUlQsIHNraXBfc2lnbmFsKTsKKworCXJldHVybiBkb19wZXJmX3N0YXQoYXJnYywgYXJndik7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUzMzhkM2MKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4tdG9wLmMKQEAgLTAsMCArMSw3MzYgQEAKKy8qCisgKiBidWlsdGluLXRvcC5jCisgKgorICogQnVpbHRpbiB0b3AgY29tbWFuZDogRGlzcGxheSBhIGNvbnRpbnVvdXNseSB1cGRhdGVkIHByb2ZpbGUgb2YKKyAqIGFueSB3b3JrbG9hZCwgQ1BVIG9yIHNwZWNpZmljIFBJRC4KKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgsIFJlZCBIYXQgSW5jLCBJbmdvIE1vbG5hciA8bWluZ29AcmVkaGF0LmNvbT4KKyAqCisgKiBJbXByb3ZlbWVudHMgYW5kIGZpeGVzIGJ5OgorICoKKyAqICAgQXJqYW4gdmFuIGRlIFZlbiA8YXJqYW5AbGludXguaW50ZWwuY29tPgorICogICBZYW5taW4gWmhhbmcgPHlhbm1pbi56aGFuZ0BpbnRlbC5jb20+CisgKiAgIFd1IEZlbmdndWFuZyA8ZmVuZ2d1YW5nLnd1QGludGVsLmNvbT4KKyAqICAgTWlrZSBHYWxicmFpdGggPGVmYXVsdEBnbXguZGU+CisgKiAgIFBhdWwgTWFja2VycmFzIDxwYXVsdXNAc2FtYmEub3JnPgorICoKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBHUEwgdjIuIChhbmQgb25seSB2Miwgbm90IGFueSBsYXRlciB2ZXJzaW9uKQorICovCisjaW5jbHVkZSAiYnVpbHRpbi5oIgorCisjaW5jbHVkZSAicGVyZi5oIgorCisjaW5jbHVkZSAidXRpbC9zeW1ib2wuaCIKKyNpbmNsdWRlICJ1dGlsL2NvbG9yLmgiCisjaW5jbHVkZSAidXRpbC91dGlsLmgiCisjaW5jbHVkZSAidXRpbC9yYnRyZWUuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJ1dGlsL3BhcnNlLWV2ZW50cy5oIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzY2hlZC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKworI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8c3lzL3BvbGwuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy91aW8uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjaW5jbHVkZSA8bGludXgvdW5pc3RkLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKworc3RhdGljIGludAkJCWZkW01BWF9OUl9DUFVTXVtNQVhfQ09VTlRFUlNdOworCitzdGF0aWMgaW50CQkJc3lzdGVtX3dpZGUJCQk9ICAwOworCitzdGF0aWMgaW50CQkJZGVmYXVsdF9pbnRlcnZhbAkJPSAxMDAwMDA7CisKK3N0YXRpYyBfX3U2NAkJCWNvdW50X2ZpbHRlcgkJCT0gIDU7CitzdGF0aWMgaW50CQkJcHJpbnRfZW50cmllcwkJCT0gMTU7CisKK3N0YXRpYyBpbnQJCQl0YXJnZXRfcGlkCQkJPSAtMTsKK3N0YXRpYyBpbnQJCQlwcm9maWxlX2NwdQkJCT0gLTE7CitzdGF0aWMgaW50CQkJbnJfY3B1cwkJCQk9ICAwOworc3RhdGljIHVuc2lnbmVkIGludAkJcmVhbHRpbWVfcHJpbwkJCT0gIDA7CitzdGF0aWMgaW50CQkJZ3JvdXAJCQkJPSAgMDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJCXBhZ2Vfc2l6ZTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQJCW1tYXBfcGFnZXMJCQk9IDE2Oworc3RhdGljIGludAkJCWZyZXEJCQkJPSAgMDsKK3N0YXRpYyBpbnQJCQl2ZXJib3NlCQkJCT0gIDA7CisKK3N0YXRpYyBjaGFyCQkJKnN5bV9maWx0ZXI7CitzdGF0aWMgdW5zaWduZWQgbG9uZwkJZmlsdGVyX3N0YXJ0Oworc3RhdGljIHVuc2lnbmVkIGxvbmcJCWZpbHRlcl9lbmQ7CisKK3N0YXRpYyBpbnQJCQlkZWxheV9zZWNzCQkJPSAgMjsKK3N0YXRpYyBpbnQJCQl6ZXJvOworc3RhdGljIGludAkJCWR1bXBfc3ltdGFiOworCisvKgorICogU3ltYm9scworICovCisKK3N0YXRpYyBfX3U2NAkJCW1pbl9pcDsKK3N0YXRpYyBfX3U2NAkJCW1heF9pcCA9IC0xbGw7CisKK3N0cnVjdCBzeW1fZW50cnkgeworCXN0cnVjdCByYl9ub2RlCQlyYl9ub2RlOworCXN0cnVjdCBsaXN0X2hlYWQJbm9kZTsKKwl1bnNpZ25lZCBsb25nCQljb3VudFtNQVhfQ09VTlRFUlNdOworCXVuc2lnbmVkIGxvbmcJCXNuYXBfY291bnQ7CisJZG91YmxlCQkJd2VpZ2h0OworCWludAkJCXNraXA7Cit9OworCitzdHJ1Y3Qgc3ltX2VudHJ5CQkqc3ltX2ZpbHRlcl9lbnRyeTsKKworc3RydWN0IGRzbwkJCSprZXJuZWxfZHNvOworCisvKgorICogU3ltYm9scyB3aWxsIGJlIGFkZGVkIGhlcmUgaW4gcmVjb3JkX2lwIGFuZCB3aWxsIGdldCBvdXQKKyAqIGFmdGVyIGRlY2F5ZWQuCisgKi8KK3N0YXRpYyBMSVNUX0hFQUQoYWN0aXZlX3N5bWJvbHMpOworc3RhdGljIHB0aHJlYWRfbXV0ZXhfdCBhY3RpdmVfc3ltYm9sc19sb2NrID0gUFRIUkVBRF9NVVRFWF9JTklUSUFMSVpFUjsKKworLyoKKyAqIE9yZGVyaW5nIHdlaWdodDogY291bnQtMSAqIGNvdW50LTIgKiAuLi4gLyBjb3VudC1uCisgKi8KK3N0YXRpYyBkb3VibGUgc3ltX3dlaWdodChjb25zdCBzdHJ1Y3Qgc3ltX2VudHJ5ICpzeW0pCit7CisJZG91YmxlIHdlaWdodCA9IHN5bS0+c25hcF9jb3VudDsKKwlpbnQgY291bnRlcjsKKworCWZvciAoY291bnRlciA9IDE7IGNvdW50ZXIgPCBucl9jb3VudGVycy0xOyBjb3VudGVyKyspCisJCXdlaWdodCAqPSBzeW0tPmNvdW50W2NvdW50ZXJdOworCisJd2VpZ2h0IC89IChzeW0tPmNvdW50W2NvdW50ZXJdICsgMSk7CisKKwlyZXR1cm4gd2VpZ2h0OworfQorCitzdGF0aWMgbG9uZwkJCXNhbXBsZXM7CitzdGF0aWMgbG9uZwkJCXVzZXJzcGFjZV9zYW1wbGVzOworc3RhdGljIGNvbnN0IGNoYXIJCUNPTlNPTEVfQ0xFQVJbXSA9ICIbW0gbWzJKIjsKKworc3RhdGljIHZvaWQgX19saXN0X2luc2VydF9hY3RpdmVfc3ltKHN0cnVjdCBzeW1fZW50cnkgKnN5bWUpCit7CisJbGlzdF9hZGQoJnN5bWUtPm5vZGUsICZhY3RpdmVfc3ltYm9scyk7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfcmVtb3ZlX2FjdGl2ZV9zeW0oc3RydWN0IHN5bV9lbnRyeSAqc3ltZSkKK3sKKwlwdGhyZWFkX211dGV4X2xvY2soJmFjdGl2ZV9zeW1ib2xzX2xvY2spOworCWxpc3RfZGVsX2luaXQoJnN5bWUtPm5vZGUpOworCXB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZhY3RpdmVfc3ltYm9sc19sb2NrKTsKK30KKworc3RhdGljIHZvaWQgcmJfaW5zZXJ0X2FjdGl2ZV9zeW0oc3RydWN0IHJiX3Jvb3QgKnRyZWUsIHN0cnVjdCBzeW1fZW50cnkgKnNlKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZ0cmVlLT5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQgPSBOVUxMOworCXN0cnVjdCBzeW1fZW50cnkgKml0ZXI7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJaXRlciA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHN5bV9lbnRyeSwgcmJfbm9kZSk7CisKKwkJaWYgKHNlLT53ZWlnaHQgPiBpdGVyLT53ZWlnaHQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJfQorCisJcmJfbGlua19ub2RlKCZzZS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnNlLT5yYl9ub2RlLCB0cmVlKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfc3ltX3RhYmxlKHZvaWQpCit7CisJaW50IHByaW50ZWQgPSAwLCBqOworCWludCBjb3VudGVyOworCWZsb2F0IHNhbXBsZXNfcGVyX3NlYyA9IHNhbXBsZXMvZGVsYXlfc2VjczsKKwlmbG9hdCBrc2FtcGxlc19wZXJfc2VjID0gKHNhbXBsZXMtdXNlcnNwYWNlX3NhbXBsZXMpL2RlbGF5X3NlY3M7CisJZmxvYXQgc3VtX2tzYW1wbGVzID0gMC4wOworCXN0cnVjdCBzeW1fZW50cnkgKnN5bWUsICpuOworCXN0cnVjdCByYl9yb290IHRtcCA9IFJCX1JPT1Q7CisJc3RydWN0IHJiX25vZGUgKm5kOworCisJc2FtcGxlcyA9IHVzZXJzcGFjZV9zYW1wbGVzID0gMDsKKworCS8qIFNvcnQgdGhlIGFjdGl2ZSBzeW1ib2xzICovCisJcHRocmVhZF9tdXRleF9sb2NrKCZhY3RpdmVfc3ltYm9sc19sb2NrKTsKKwlzeW1lID0gbGlzdF9lbnRyeShhY3RpdmVfc3ltYm9scy5uZXh0LCBzdHJ1Y3Qgc3ltX2VudHJ5LCBub2RlKTsKKwlwdGhyZWFkX211dGV4X3VubG9jaygmYWN0aXZlX3N5bWJvbHNfbG9jayk7CisKKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShzeW1lLCBuLCAmYWN0aXZlX3N5bWJvbHMsIG5vZGUpIHsKKwkJc3ltZS0+c25hcF9jb3VudCA9IHN5bWUtPmNvdW50WzBdOworCQlpZiAoc3ltZS0+c25hcF9jb3VudCAhPSAwKSB7CisJCQlzeW1lLT53ZWlnaHQgPSBzeW1fd2VpZ2h0KHN5bWUpOworCQkJcmJfaW5zZXJ0X2FjdGl2ZV9zeW0oJnRtcCwgc3ltZSk7CisJCQlzdW1fa3NhbXBsZXMgKz0gc3ltZS0+c25hcF9jb3VudDsKKworCQkJZm9yIChqID0gMDsgaiA8IG5yX2NvdW50ZXJzOyBqKyspCisJCQkJc3ltZS0+Y291bnRbal0gPSB6ZXJvID8gMCA6IHN5bWUtPmNvdW50W2pdICogNyAvIDg7CisJCX0gZWxzZQorCQkJbGlzdF9yZW1vdmVfYWN0aXZlX3N5bShzeW1lKTsKKwl9CisKKwlwdXRzKENPTlNPTEVfQ0xFQVIpOworCisJcHJpbnRmKAorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CisJcHJpbnRmKCAiICAgUGVyZlRvcDolOC4wZiBpcnFzL3NlYyAga2VybmVsOiU0LjFmJSUgWyIsCisJCXNhbXBsZXNfcGVyX3NlYywKKwkJMTAwLjAgLSAoMTAwLjAqKChzYW1wbGVzX3Blcl9zZWMta3NhbXBsZXNfcGVyX3NlYykvc2FtcGxlc19wZXJfc2VjKSkpOworCisJaWYgKG5yX2NvdW50ZXJzID09IDEpIHsKKwkJcHJpbnRmKCIlTGQiLCBhdHRyc1swXS5zYW1wbGVfcGVyaW9kKTsKKwkJaWYgKGZyZXEpCisJCQlwcmludGYoIkh6ICIpOworCQllbHNlCisJCQlwcmludGYoIiAiKTsKKwl9CisKKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykgeworCQlpZiAoY291bnRlcikKKwkJCXByaW50ZigiLyIpOworCisJCXByaW50ZigiJXMiLCBldmVudF9uYW1lKGNvdW50ZXIpKTsKKwl9CisKKwlwcmludGYoICJdLCAiKTsKKworCWlmICh0YXJnZXRfcGlkICE9IC0xKQorCQlwcmludGYoIiAodGFyZ2V0X3BpZDogJWQiLCB0YXJnZXRfcGlkKTsKKwllbHNlCisJCXByaW50ZigiIChhbGwiKTsKKworCWlmIChwcm9maWxlX2NwdSAhPSAtMSkKKwkJcHJpbnRmKCIsIGNwdTogJWQpXG4iLCBwcm9maWxlX2NwdSk7CisJZWxzZSB7CisJCWlmICh0YXJnZXRfcGlkICE9IC0xKQorCQkJcHJpbnRmKCIpXG4iKTsKKwkJZWxzZQorCQkJcHJpbnRmKCIsICVkIENQVXMpXG4iLCBucl9jcHVzKTsKKwl9CisKKwlwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4iKTsKKworCWlmIChucl9jb3VudGVycyA9PSAxKQorCQlwcmludGYoIiAgICAgICAgICAgICBzYW1wbGVzICAgIHBjbnQiKTsKKwllbHNlCisJCXByaW50ZigiICB3ZWlnaHQgICAgIHNhbXBsZXMgICAgcGNudCIpOworCisJcHJpbnRmKCIgICAgICAgICBSSVAgICAgICAgICAga2VybmVsIGZ1bmN0aW9uXG4iCisJICAgICAgIAkgICAgICAgIiAgX19fX19fICAgICBfX19fX19fICAgX19fX18gICBfX19fX19fX19fX19fX19fICAgX19fX19fX19fX19fX19fXG5cbiIKKwkpOworCisJZm9yIChuZCA9IHJiX2ZpcnN0KCZ0bXApOyBuZDsgbmQgPSByYl9uZXh0KG5kKSkgeworCQlzdHJ1Y3Qgc3ltX2VudHJ5ICpzeW1lID0gcmJfZW50cnkobmQsIHN0cnVjdCBzeW1fZW50cnksIHJiX25vZGUpOworCQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSAoc3RydWN0IHN5bWJvbCAqKShzeW1lICsgMSk7CisJCWNoYXIgKmNvbG9yID0gUEVSRl9DT0xPUl9OT1JNQUw7CisJCWRvdWJsZSBwY250OworCisJCWlmICgrK3ByaW50ZWQgPiBwcmludF9lbnRyaWVzIHx8IHN5bWUtPnNuYXBfY291bnQgPCBjb3VudF9maWx0ZXIpCisJCQljb250aW51ZTsKKworCQlwY250ID0gMTAwLjAgLSAoMTAwLjAgKiAoKHN1bV9rc2FtcGxlcyAtIHN5bWUtPnNuYXBfY291bnQpIC8KKwkJCQkJIHN1bV9rc2FtcGxlcykpOworCisJCS8qCisJCSAqIFdlIGNvbG9yIGhpZ2gtb3ZlcmhlYWQgZW50cmllcyBpbiByZWQsIG1pZC1vdmVyaGVhZAorCQkgKiBlbnRyaWVzIGluIGdyZWVuIC0gYW5kIGtlZXAgdGhlIGxvdyBvdmVyaGVhZCBwbGFjZXMKKwkJICogbm9ybWFsOgorCQkgKi8KKwkJaWYgKHBjbnQgPj0gNS4wKSB7CisJCQljb2xvciA9IFBFUkZfQ09MT1JfUkVEOworCQl9IGVsc2UgeworCQkJaWYgKHBjbnQgPj0gMC41KQorCQkJCWNvbG9yID0gUEVSRl9DT0xPUl9HUkVFTjsKKwkJfQorCisJCWlmIChucl9jb3VudGVycyA9PSAxKQorCQkJcHJpbnRmKCIlMjAuMmYgLSAiLCBzeW1lLT53ZWlnaHQpOworCQllbHNlCisJCQlwcmludGYoIiU5LjFmICUxMGxkIC0gIiwgc3ltZS0+d2VpZ2h0LCBzeW1lLT5zbmFwX2NvdW50KTsKKworCQljb2xvcl9mcHJpbnRmKHN0ZG91dCwgY29sb3IsICIlNC4xZiUlIiwgcGNudCk7CisJCXByaW50ZigiIC0gJTAxNmxseCA6ICVzXG4iLCBzeW0tPnN0YXJ0LCBzeW0tPm5hbWUpOworCX0KK30KKworc3RhdGljIHZvaWQgKmRpc3BsYXlfdGhyZWFkKHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgcG9sbGZkIHN0ZGluX3BvbGwgPSB7IC5mZCA9IDAsIC5ldmVudHMgPSBQT0xMSU4gfTsKKwlpbnQgZGVsYXlfbXNlY3MgPSBkZWxheV9zZWNzICogMTAwMDsKKworCXByaW50ZigiUGVyZlRvcCByZWZyZXNoIHBlcmlvZDogJWQgc2Vjb25kc1xuIiwgZGVsYXlfc2Vjcyk7CisKKwlkbyB7CisJCXByaW50X3N5bV90YWJsZSgpOworCX0gd2hpbGUgKCFwb2xsKCZzdGRpbl9wb2xsLCAxLCBkZWxheV9tc2VjcykgPT0gMSk7CisKKwlwcmludGYoImtleSBwcmVzc2VkIC0gZXhpdGluZy5cbiIpOworCWV4aXQoMCk7CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGludCBzeW1ib2xfZmlsdGVyKHN0cnVjdCBkc28gKnNlbGYsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdGF0aWMgaW50IGZpbHRlcl9tYXRjaDsKKwlzdHJ1Y3Qgc3ltX2VudHJ5ICpzeW1lOworCWNvbnN0IGNoYXIgKm5hbWUgPSBzeW0tPm5hbWU7CisKKwlpZiAoIXN0cmNtcChuYW1lLCAiX3RleHQiKSB8fAorCSAgICAhc3RyY21wKG5hbWUsICJfZXRleHQiKSB8fAorCSAgICAhc3RyY21wKG5hbWUsICJfc2luaXR0ZXh0IikgfHwKKwkgICAgIXN0cm5jbXAoImluaXRfbW9kdWxlIiwgbmFtZSwgMTEpIHx8CisJICAgICFzdHJuY21wKCJjbGVhbnVwX21vZHVsZSIsIG5hbWUsIDE0KSB8fAorCSAgICBzdHJzdHIobmFtZSwgIl90ZXh0X3N0YXJ0IikgfHwKKwkgICAgc3Ryc3RyKG5hbWUsICJfdGV4dF9lbmQiKSkKKwkJcmV0dXJuIDE7CisKKwlzeW1lID0gZHNvX19zeW1fcHJpdihzZWxmLCBzeW0pOworCS8qIFRhZyBzYW1wbGVzIHRvIGJlIHNraXBwZWQuICovCisJaWYgKCFzdHJjbXAoImRlZmF1bHRfaWRsZSIsIG5hbWUpIHx8CisJICAgICFzdHJjbXAoImNwdV9pZGxlIiwgbmFtZSkgfHwKKwkgICAgIXN0cmNtcCgiZW50ZXJfaWRsZSIsIG5hbWUpIHx8CisJICAgICFzdHJjbXAoImV4aXRfaWRsZSIsIG5hbWUpIHx8CisJICAgICFzdHJjbXAoIm13YWl0X2lkbGUiLCBuYW1lKSkKKwkJc3ltZS0+c2tpcCA9IDE7CisKKwlpZiAoZmlsdGVyX21hdGNoID09IDEpIHsKKwkJZmlsdGVyX2VuZCA9IHN5bS0+c3RhcnQ7CisJCWZpbHRlcl9tYXRjaCA9IC0xOworCQlpZiAoZmlsdGVyX2VuZCAtIGZpbHRlcl9zdGFydCA+IDEwMDAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwKKwkJCQkiaG0sIHRvbyBsYXJnZSBmaWx0ZXIgc3ltYm9sIDwlcz4gLSBza2lwcGluZy5cbiIsCisJCQkJc3ltX2ZpbHRlcik7CisJCQlmcHJpbnRmKHN0ZGVyciwgInN5bWJvbCBmaWx0ZXIgc3RhcnQ6ICUwMTZseFxuIiwKKwkJCQlmaWx0ZXJfc3RhcnQpOworCQkJZnByaW50ZihzdGRlcnIsICIgICAgICAgICAgICAgICAgZW5kOiAlMDE2bHhcbiIsCisJCQkJZmlsdGVyX2VuZCk7CisJCQlmaWx0ZXJfZW5kID0gZmlsdGVyX3N0YXJ0ID0gMDsKKwkJCXN5bV9maWx0ZXIgPSBOVUxMOworCQkJc2xlZXAoMSk7CisJCX0KKwl9CisKKwlpZiAoZmlsdGVyX21hdGNoID09IDAgJiYgc3ltX2ZpbHRlciAmJiAhc3RyY21wKG5hbWUsIHN5bV9maWx0ZXIpKSB7CisJCWZpbHRlcl9tYXRjaCA9IDE7CisJCWZpbHRlcl9zdGFydCA9IHN5bS0+c3RhcnQ7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwYXJzZV9zeW1ib2xzKHZvaWQpCit7CisJc3RydWN0IHJiX25vZGUgKm5vZGU7CisJc3RydWN0IHN5bWJvbCAgKnN5bTsKKworCWtlcm5lbF9kc28gPSBkc29fX25ldygiW2tlcm5lbF0iLCBzaXplb2Yoc3RydWN0IHN5bV9lbnRyeSkpOworCWlmIChrZXJuZWxfZHNvID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCWlmIChkc29fX2xvYWRfa2VybmVsKGtlcm5lbF9kc28sIE5VTEwsIHN5bWJvbF9maWx0ZXIsIDEpICE9IDApCisJCWdvdG8gb3V0X2RlbGV0ZV9kc287CisKKwlub2RlID0gcmJfZmlyc3QoJmtlcm5lbF9kc28tPnN5bXMpOworCXN5bSA9IHJiX2VudHJ5KG5vZGUsIHN0cnVjdCBzeW1ib2wsIHJiX25vZGUpOworCW1pbl9pcCA9IHN5bS0+c3RhcnQ7CisKKwlub2RlID0gcmJfbGFzdCgma2VybmVsX2Rzby0+c3ltcyk7CisJc3ltID0gcmJfZW50cnkobm9kZSwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSk7CisJbWF4X2lwID0gc3ltLT5lbmQ7CisKKwlpZiAoZHVtcF9zeW10YWIpCisJCWRzb19fZnByaW50ZihrZXJuZWxfZHNvLCBzdGRlcnIpOworCisJcmV0dXJuIDA7CisKK291dF9kZWxldGVfZHNvOgorCWRzb19fZGVsZXRlKGtlcm5lbF9kc28pOworCWtlcm5lbF9kc28gPSBOVUxMOworCXJldHVybiAtMTsKK30KKworI2RlZmluZSBUUkFDRV9DT1VOVCAgICAgMworCisvKgorICogQmluYXJ5IHNlYXJjaCBpbiB0aGUgaGlzdG9ncmFtIHRhYmxlIGFuZCByZWNvcmQgdGhlIGhpdDoKKyAqLworc3RhdGljIHZvaWQgcmVjb3JkX2lwKF9fdTY0IGlwLCBpbnQgY291bnRlcikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBkc29fX2ZpbmRfc3ltYm9sKGtlcm5lbF9kc28sIGlwKTsKKworCWlmIChzeW0gIT0gTlVMTCkgeworCQlzdHJ1Y3Qgc3ltX2VudHJ5ICpzeW1lID0gZHNvX19zeW1fcHJpdihrZXJuZWxfZHNvLCBzeW0pOworCisJCWlmICghc3ltZS0+c2tpcCkgeworCQkJc3ltZS0+Y291bnRbY291bnRlcl0rKzsKKwkJCXB0aHJlYWRfbXV0ZXhfbG9jaygmYWN0aXZlX3N5bWJvbHNfbG9jayk7CisJCQlpZiAobGlzdF9lbXB0eSgmc3ltZS0+bm9kZSkgfHwgIXN5bWUtPm5vZGUubmV4dCkKKwkJCQlfX2xpc3RfaW5zZXJ0X2FjdGl2ZV9zeW0oc3ltZSk7CisJCQlwdGhyZWFkX211dGV4X3VubG9jaygmYWN0aXZlX3N5bWJvbHNfbG9jayk7CisJCQlyZXR1cm47CisJCX0KKwl9CisKKwlzYW1wbGVzLS07Cit9CisKK3N0YXRpYyB2b2lkIHByb2Nlc3NfZXZlbnQoX191NjQgaXAsIGludCBjb3VudGVyKQoreworCXNhbXBsZXMrKzsKKworCWlmIChpcCA8IG1pbl9pcCB8fCBpcCA+IG1heF9pcCkgeworCQl1c2Vyc3BhY2Vfc2FtcGxlcysrOworCQlyZXR1cm47CisJfQorCisJcmVjb3JkX2lwKGlwLCBjb3VudGVyKTsKK30KKworc3RydWN0IG1tYXBfZGF0YSB7CisJaW50CQkJY291bnRlcjsKKwl2b2lkCQkJKmJhc2U7CisJdW5zaWduZWQgaW50CQltYXNrOworCXVuc2lnbmVkIGludAkJcHJldjsKK307CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbW1hcF9yZWFkX2hlYWQoc3RydWN0IG1tYXBfZGF0YSAqbWQpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9tbWFwX3BhZ2UgKnBjID0gbWQtPmJhc2U7CisJaW50IGhlYWQ7CisKKwloZWFkID0gcGMtPmRhdGFfaGVhZDsKKwlybWIoKTsKKworCXJldHVybiBoZWFkOworfQorCitzdHJ1Y3QgdGltZXZhbCBsYXN0X3JlYWQsIHRoaXNfcmVhZDsKKworc3RhdGljIHZvaWQgbW1hcF9yZWFkX2NvdW50ZXIoc3RydWN0IG1tYXBfZGF0YSAqbWQpCit7CisJdW5zaWduZWQgaW50IGhlYWQgPSBtbWFwX3JlYWRfaGVhZChtZCk7CisJdW5zaWduZWQgaW50IG9sZCA9IG1kLT5wcmV2OworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBtZC0+YmFzZSArIHBhZ2Vfc2l6ZTsKKwlpbnQgZGlmZjsKKworCWdldHRpbWVvZmRheSgmdGhpc19yZWFkLCBOVUxMKTsKKworCS8qCisJICogSWYgd2UncmUgZnVydGhlciBiZWhpbmQgdGhhbiBoYWxmIHRoZSBidWZmZXIsIHRoZXJlJ3MgYSBjaGFuY2UKKwkgKiB0aGUgd3JpdGVyIHdpbGwgYml0ZSBvdXIgdGFpbCBhbmQgbWVzcyB1cCB0aGUgc2FtcGxlcyB1bmRlciB1cy4KKwkgKgorCSAqIElmIHdlIHNvbWVob3cgZW5kZWQgdXAgYWhlYWQgb2YgdGhlIGhlYWQsIHdlIGdvdCBtZXNzZWQgdXAuCisJICoKKwkgKiBJbiBlaXRoZXIgY2FzZSwgdHJ1bmNhdGUgYW5kIHJlc3RhcnQgYXQgaGVhZC4KKwkgKi8KKwlkaWZmID0gaGVhZCAtIG9sZDsKKwlpZiAoZGlmZiA+IG1kLT5tYXNrIC8gMiB8fCBkaWZmIDwgMCkgeworCQlzdHJ1Y3QgdGltZXZhbCBpdjsKKwkJdW5zaWduZWQgbG9uZyBtc2VjczsKKworCQl0aW1lcnN1YigmdGhpc19yZWFkLCAmbGFzdF9yZWFkLCAmaXYpOworCQltc2VjcyA9IGl2LnR2X3NlYyoxMDAwICsgaXYudHZfdXNlYy8xMDAwOworCisJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogZmFpbGVkIHRvIGtlZXAgdXAgd2l0aCBtbWFwIGRhdGEuIgorCQkJCSIgIExhc3QgcmVhZCAlbHUgbXNlY3MgYWdvLlxuIiwgbXNlY3MpOworCisJCS8qCisJCSAqIGhlYWQgcG9pbnRzIHRvIGEga25vd24gZ29vZCBlbnRyeSwgc3RhcnQgdGhlcmUuCisJCSAqLworCQlvbGQgPSBoZWFkOworCX0KKworCWxhc3RfcmVhZCA9IHRoaXNfcmVhZDsKKworCWZvciAoOyBvbGQgIT0gaGVhZDspIHsKKwkJc3RydWN0IGlwX2V2ZW50IHsKKwkJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJCQlfX3U2NCBpcDsKKwkJCV9fdTMyIHBpZCwgdGFyZ2V0X3BpZDsKKwkJfTsKKwkJc3RydWN0IG1tYXBfZXZlbnQgeworCQkJc3RydWN0IHBlcmZfZXZlbnRfaGVhZGVyIGhlYWRlcjsKKwkJCV9fdTMyIHBpZCwgdGFyZ2V0X3BpZDsKKwkJCV9fdTY0IHN0YXJ0OworCQkJX191NjQgbGVuOworCQkJX191NjQgcGdvZmY7CisJCQljaGFyIGZpbGVuYW1lW1BBVEhfTUFYXTsKKwkJfTsKKworCQl0eXBlZGVmIHVuaW9uIGV2ZW50X3VuaW9uIHsKKwkJCXN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciBoZWFkZXI7CisJCQlzdHJ1Y3QgaXBfZXZlbnQgaXA7CisJCQlzdHJ1Y3QgbW1hcF9ldmVudCBtbWFwOworCQl9IGV2ZW50X3Q7CisKKwkJZXZlbnRfdCAqZXZlbnQgPSAoZXZlbnRfdCAqKSZkYXRhW29sZCAmIG1kLT5tYXNrXTsKKworCQlldmVudF90IGV2ZW50X2NvcHk7CisKKwkJc2l6ZV90IHNpemUgPSBldmVudC0+aGVhZGVyLnNpemU7CisKKwkJLyoKKwkJICogRXZlbnQgc3RyYWRkbGVzIHRoZSBtbWFwIGJvdW5kYXJ5IC0tIGhlYWRlciBzaG91bGQgYWx3YXlzCisJCSAqIGJlIGluc2lkZSBkdWUgdG8gdTY0IGFsaWdubWVudCBvZiBvdXRwdXQuCisJCSAqLworCQlpZiAoKG9sZCAmIG1kLT5tYXNrKSArIHNpemUgIT0gKChvbGQgKyBzaXplKSAmIG1kLT5tYXNrKSkgeworCQkJdW5zaWduZWQgaW50IG9mZnNldCA9IG9sZDsKKwkJCXVuc2lnbmVkIGludCBsZW4gPSBtaW4oc2l6ZW9mKCpldmVudCksIHNpemUpLCBjcHk7CisJCQl2b2lkICpkc3QgPSAmZXZlbnRfY29weTsKKworCQkJZG8geworCQkJCWNweSA9IG1pbihtZC0+bWFzayArIDEgLSAob2Zmc2V0ICYgbWQtPm1hc2spLCBsZW4pOworCQkJCW1lbWNweShkc3QsICZkYXRhW29mZnNldCAmIG1kLT5tYXNrXSwgY3B5KTsKKwkJCQlvZmZzZXQgKz0gY3B5OworCQkJCWRzdCArPSBjcHk7CisJCQkJbGVuIC09IGNweTsKKwkJCX0gd2hpbGUgKGxlbik7CisKKwkJCWV2ZW50ID0gJmV2ZW50X2NvcHk7CisJCX0KKworCQlvbGQgKz0gc2l6ZTsKKworCQlpZiAoZXZlbnQtPmhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XKSB7CisJCQlpZiAoZXZlbnQtPmhlYWRlci50eXBlICYgUEVSRl9TQU1QTEVfSVApCisJCQkJcHJvY2Vzc19ldmVudChldmVudC0+aXAuaXAsIG1kLT5jb3VudGVyKTsKKwkJfQorCX0KKworCW1kLT5wcmV2ID0gb2xkOworfQorCitzdGF0aWMgc3RydWN0IHBvbGxmZCBldmVudF9hcnJheVtNQVhfTlJfQ1BVUyAqIE1BWF9DT1VOVEVSU107CitzdGF0aWMgc3RydWN0IG1tYXBfZGF0YSBtbWFwX2FycmF5W01BWF9OUl9DUFVTXVtNQVhfQ09VTlRFUlNdOworCitzdGF0aWMgdm9pZCBtbWFwX3JlYWQodm9pZCkKK3sKKwlpbnQgaSwgY291bnRlcjsKKworCWZvciAoaSA9IDA7IGkgPCBucl9jcHVzOyBpKyspIHsKKwkJZm9yIChjb3VudGVyID0gMDsgY291bnRlciA8IG5yX2NvdW50ZXJzOyBjb3VudGVyKyspCisJCQltbWFwX3JlYWRfY291bnRlcigmbW1hcF9hcnJheVtpXVtjb3VudGVyXSk7CisJfQorfQorCitpbnQgbnJfcG9sbDsKK2ludCBncm91cF9mZDsKKworc3RhdGljIHZvaWQgc3RhcnRfY291bnRlcihpbnQgaSwgaW50IGNvdW50ZXIpCit7CisJc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyOworCXVuc2lnbmVkIGludCBjcHU7CisKKwljcHUgPSBwcm9maWxlX2NwdTsKKwlpZiAodGFyZ2V0X3BpZCA9PSAtMSAmJiBwcm9maWxlX2NwdSA9PSAtMSkKKwkJY3B1ID0gaTsKKworCWF0dHIgPSBhdHRycyArIGNvdW50ZXI7CisKKwlhdHRyLT5zYW1wbGVfdHlwZQk9IFBFUkZfU0FNUExFX0lQIHwgUEVSRl9TQU1QTEVfVElEOworCWF0dHItPmZyZXEJCT0gZnJlcTsKKwordHJ5X2FnYWluOgorCWZkW2ldW2NvdW50ZXJdID0gc3lzX3BlcmZfY291bnRlcl9vcGVuKGF0dHIsIHRhcmdldF9waWQsIGNwdSwgZ3JvdXBfZmQsIDApOworCisJaWYgKGZkW2ldW2NvdW50ZXJdIDwgMCkgeworCQlpbnQgZXJyID0gZXJybm87CisKKwkJaWYgKGVyciA9PSBFUEVSTSkKKwkJCWRpZSgiTm8gcGVybWlzc2lvbiAtIGFyZSB5b3Ugcm9vdD9cbiIpOworCQkvKgorCQkgKiBJZiBpdCdzIGN5Y2xlcyB0aGVuIGZhbGwgYmFjayB0byBocnRpbWVyCisJCSAqIGJhc2VkIGNwdS1jbG9jay10aWNrIHN3IGNvdW50ZXIsIHdoaWNoCisJCSAqIGlzIGFsd2F5cyBhdmFpbGFibGUgZXZlbiBpZiBubyBQTVUgc3VwcG9ydDoKKwkJICovCisJCWlmIChhdHRyLT50eXBlID09IFBFUkZfVFlQRV9IQVJEV0FSRQorCQkJJiYgYXR0ci0+Y29uZmlnID09IFBFUkZfQ09VTlRfSFdfQ1BVX0NZQ0xFUykgeworCisJCQlpZiAodmVyYm9zZSkKKwkJCQl3YXJuaW5nKCIgLi4uIHRyeWluZyB0byBmYWxsIGJhY2sgdG8gY3B1LWNsb2NrLXRpY2tzXG4iKTsKKworCQkJYXR0ci0+dHlwZSA9IFBFUkZfVFlQRV9TT0ZUV0FSRTsKKwkJCWF0dHItPmNvbmZpZyA9IFBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLOworCQkJZ290byB0cnlfYWdhaW47CisJCX0KKwkJcHJpbnRmKCJcbiIpOworCQllcnJvcigicGVyZmNvdW50ZXIgc3lzY2FsbCByZXR1cm5lZCB3aXRoICVkICglcylcbiIsCisJCQlmZFtpXVtjb3VudGVyXSwgc3RyZXJyb3IoZXJyKSk7CisJCWRpZSgiTm8gQ09ORklHX1BFUkZfQ09VTlRFUlM9eSBrZXJuZWwgc3VwcG9ydCBjb25maWd1cmVkP1xuIik7CisJCWV4aXQoLTEpOworCX0KKwlhc3NlcnQoZmRbaV1bY291bnRlcl0gPj0gMCk7CisJZmNudGwoZmRbaV1bY291bnRlcl0sIEZfU0VURkwsIE9fTk9OQkxPQ0spOworCisJLyoKKwkgKiBGaXJzdCBjb3VudGVyIGFjdHMgYXMgdGhlIGdyb3VwIGxlYWRlcjoKKwkgKi8KKwlpZiAoZ3JvdXAgJiYgZ3JvdXBfZmQgPT0gLTEpCisJCWdyb3VwX2ZkID0gZmRbaV1bY291bnRlcl07CisKKwlldmVudF9hcnJheVtucl9wb2xsXS5mZCA9IGZkW2ldW2NvdW50ZXJdOworCWV2ZW50X2FycmF5W25yX3BvbGxdLmV2ZW50cyA9IFBPTExJTjsKKwlucl9wb2xsKys7CisKKwltbWFwX2FycmF5W2ldW2NvdW50ZXJdLmNvdW50ZXIgPSBjb3VudGVyOworCW1tYXBfYXJyYXlbaV1bY291bnRlcl0ucHJldiA9IDA7CisJbW1hcF9hcnJheVtpXVtjb3VudGVyXS5tYXNrID0gbW1hcF9wYWdlcypwYWdlX3NpemUgLSAxOworCW1tYXBfYXJyYXlbaV1bY291bnRlcl0uYmFzZSA9IG1tYXAoTlVMTCwgKG1tYXBfcGFnZXMrMSkqcGFnZV9zaXplLAorCQkJUFJPVF9SRUFELCBNQVBfU0hBUkVELCBmZFtpXVtjb3VudGVyXSwgMCk7CisJaWYgKG1tYXBfYXJyYXlbaV1bY291bnRlcl0uYmFzZSA9PSBNQVBfRkFJTEVEKQorCQlkaWUoImZhaWxlZCB0byBtbWFwIHdpdGggJWQgKCVzKVxuIiwgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Cit9CisKK3N0YXRpYyBpbnQgX19jbWRfdG9wKHZvaWQpCit7CisJcHRocmVhZF90IHRocmVhZDsKKwlpbnQgaSwgY291bnRlcjsKKwlpbnQgcmV0OworCisJZm9yIChpID0gMDsgaSA8IG5yX2NwdXM7IGkrKykgeworCQlncm91cF9mZCA9IC0xOworCQlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykKKwkJCXN0YXJ0X2NvdW50ZXIoaSwgY291bnRlcik7CisJfQorCisJLyogV2FpdCBmb3IgYSBtaW5pbWFsIHNldCBvZiBldmVudHMgYmVmb3JlIHN0YXJ0aW5nIHRoZSBzbmFwc2hvdCAqLworCXBvbGwoZXZlbnRfYXJyYXksIG5yX3BvbGwsIDEwMCk7CisKKwltbWFwX3JlYWQoKTsKKworCWlmIChwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkLCBOVUxMLCBkaXNwbGF5X3RocmVhZCwgTlVMTCkpIHsKKwkJcHJpbnRmKCJDb3VsZCBub3QgY3JlYXRlIGRpc3BsYXkgdGhyZWFkLlxuIik7CisJCWV4aXQoLTEpOworCX0KKworCWlmIChyZWFsdGltZV9wcmlvKSB7CisJCXN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKworCQlwYXJhbS5zY2hlZF9wcmlvcml0eSA9IHJlYWx0aW1lX3ByaW87CisJCWlmIChzY2hlZF9zZXRzY2hlZHVsZXIoMCwgU0NIRURfRklGTywgJnBhcmFtKSkgeworCQkJcHJpbnRmKCJDb3VsZCBub3Qgc2V0IHJlYWx0aW1lIHByaW9yaXR5LlxuIik7CisJCQlleGl0KC0xKTsKKwkJfQorCX0KKworCXdoaWxlICgxKSB7CisJCWludCBoaXRzID0gc2FtcGxlczsKKworCQltbWFwX3JlYWQoKTsKKworCQlpZiAoaGl0cyA9PSBzYW1wbGVzKQorCQkJcmV0ID0gcG9sbChldmVudF9hcnJheSwgbnJfcG9sbCwgMTAwKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB0b3BfdXNhZ2VbXSA9IHsKKwkicGVyZiB0b3AgWzxvcHRpb25zPl0iLAorCU5VTEwKK307CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKwlPUFRfQ0FMTEJBQ0soJ2UnLCAiZXZlbnQiLCBOVUxMLCAiZXZlbnQiLAorCQkgICAgICJldmVudCBzZWxlY3Rvci4gdXNlICdwZXJmIGxpc3QnIHRvIGxpc3QgYXZhaWxhYmxlIGV2ZW50cyIsCisJCSAgICAgcGFyc2VfZXZlbnRzKSwKKwlPUFRfSU5URUdFUignYycsICJjb3VudCIsICZkZWZhdWx0X2ludGVydmFsLAorCQkgICAgImV2ZW50IHBlcmlvZCB0byBzYW1wbGUiKSwKKwlPUFRfSU5URUdFUigncCcsICJwaWQiLCAmdGFyZ2V0X3BpZCwKKwkJICAgICJwcm9maWxlIGV2ZW50cyBvbiBleGlzdGluZyBwaWQiKSwKKwlPUFRfQk9PTEVBTignYScsICJhbGwtY3B1cyIsICZzeXN0ZW1fd2lkZSwKKwkJCSAgICAic3lzdGVtLXdpZGUgY29sbGVjdGlvbiBmcm9tIGFsbCBDUFVzIiksCisJT1BUX0lOVEVHRVIoJ0MnLCAiQ1BVIiwgJnByb2ZpbGVfY3B1LAorCQkgICAgIkNQVSB0byBwcm9maWxlIG9uIiksCisJT1BUX0lOVEVHRVIoJ20nLCAibW1hcC1wYWdlcyIsICZtbWFwX3BhZ2VzLAorCQkgICAgIm51bWJlciBvZiBtbWFwIGRhdGEgcGFnZXMiKSwKKwlPUFRfSU5URUdFUigncicsICJyZWFsdGltZSIsICZyZWFsdGltZV9wcmlvLAorCQkgICAgImNvbGxlY3QgZGF0YSB3aXRoIHRoaXMgUlQgU0NIRURfRklGTyBwcmlvcml0eSIpLAorCU9QVF9JTlRFR0VSKCdkJywgImRlbGF5IiwgJmRlbGF5X3NlY3MsCisJCSAgICAibnVtYmVyIG9mIHNlY29uZHMgdG8gZGVsYXkgYmV0d2VlbiByZWZyZXNoZXMiKSwKKwlPUFRfQk9PTEVBTignRCcsICJkdW1wLXN5bXRhYiIsICZkdW1wX3N5bXRhYiwKKwkJCSAgICAiZHVtcCB0aGUgc3ltYm9sIHRhYmxlIHVzZWQgZm9yIHByb2ZpbGluZyIpLAorCU9QVF9JTlRFR0VSKCdmJywgImNvdW50LWZpbHRlciIsICZjb3VudF9maWx0ZXIsCisJCSAgICAib25seSBkaXNwbGF5IGZ1bmN0aW9ucyB3aXRoIG1vcmUgZXZlbnRzIHRoYW4gdGhpcyIpLAorCU9QVF9CT09MRUFOKCdnJywgImdyb3VwIiwgJmdyb3VwLAorCQkJICAgICJwdXQgdGhlIGNvdW50ZXJzIGludG8gYSBjb3VudGVyIGdyb3VwIiksCisJT1BUX1NUUklORygncycsICJzeW0tZmlsdGVyIiwgJnN5bV9maWx0ZXIsICJwYXR0ZXJuIiwKKwkJICAgICJvbmx5IGRpc3BsYXkgc3ltYm9scyBtYXRjaGlnIHRoaXMgcGF0dGVybiIpLAorCU9QVF9CT09MRUFOKCd6JywgInplcm8iLCAmZ3JvdXAsCisJCSAgICAiemVybyBoaXN0b3J5IGFjcm9zcyB1cGRhdGVzIiksCisJT1BUX0lOVEVHRVIoJ0YnLCAiZnJlcSIsICZmcmVxLAorCQkgICAgInByb2ZpbGUgYXQgdGhpcyBmcmVxdWVuY3kiKSwKKwlPUFRfSU5URUdFUignRScsICJlbnRyaWVzIiwgJnByaW50X2VudHJpZXMsCisJCSAgICAiZGlzcGxheSB0aGlzIG1hbnkgZnVuY3Rpb25zIiksCisJT1BUX0JPT0xFQU4oJ3YnLCAidmVyYm9zZSIsICZ2ZXJib3NlLAorCQkgICAgImJlIG1vcmUgdmVyYm9zZSAoc2hvdyBjb3VudGVyIG9wZW4gZXJyb3JzLCBldGMpIiksCisJT1BUX0VORCgpCit9OworCitpbnQgY21kX3RvcChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgY291bnRlcjsKKworCXBhZ2Vfc2l6ZSA9IHN5c2NvbmYoX1NDX1BBR0VfU0laRSk7CisKKwlhcmdjID0gcGFyc2Vfb3B0aW9ucyhhcmdjLCBhcmd2LCBvcHRpb25zLCB0b3BfdXNhZ2UsIDApOworCWlmIChhcmdjKQorCQl1c2FnZV93aXRoX29wdGlvbnModG9wX3VzYWdlLCBvcHRpb25zKTsKKworCWlmIChmcmVxKSB7CisJCWRlZmF1bHRfaW50ZXJ2YWwgPSBmcmVxOworCQlmcmVxID0gMTsKKwl9CisKKwkvKiBDUFUgYW5kIFBJRCBhcmUgbXV0dWFsbHkgZXhjbHVzaXZlICovCisJaWYgKHRhcmdldF9waWQgIT0gLTEgJiYgcHJvZmlsZV9jcHUgIT0gLTEpIHsKKwkJcHJpbnRmKCJXQVJOSU5HOiBQSUQgc3dpdGNoIG92ZXJyaWRpbmcgQ1BVXG4iKTsKKwkJc2xlZXAoMSk7CisJCXByb2ZpbGVfY3B1ID0gLTE7CisJfQorCisJaWYgKCFucl9jb3VudGVycykKKwkJbnJfY291bnRlcnMgPSAxOworCisJaWYgKGRlbGF5X3NlY3MgPCAxKQorCQlkZWxheV9zZWNzID0gMTsKKworCXBhcnNlX3N5bWJvbHMoKTsKKworCS8qCisJICogRmlsbCBpbiB0aGUgb25lcyBub3Qgc3BlY2lmaWNhbGx5IGluaXRpYWxpemVkIHZpYSAtYzoKKwkgKi8KKwlmb3IgKGNvdW50ZXIgPSAwOyBjb3VudGVyIDwgbnJfY291bnRlcnM7IGNvdW50ZXIrKykgeworCQlpZiAoYXR0cnNbY291bnRlcl0uc2FtcGxlX3BlcmlvZCkKKwkJCWNvbnRpbnVlOworCisJCWF0dHJzW2NvdW50ZXJdLnNhbXBsZV9wZXJpb2QgPSBkZWZhdWx0X2ludGVydmFsOworCX0KKworCW5yX2NwdXMgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKwlhc3NlcnQobnJfY3B1cyA8PSBNQVhfTlJfQ1BVUyk7CisJYXNzZXJ0KG5yX2NwdXMgPj0gMCk7CisKKwlpZiAodGFyZ2V0X3BpZCAhPSAtMSB8fCBwcm9maWxlX2NwdSAhPSAtMSkKKwkJbnJfY3B1cyA9IDE7CisKKwlyZXR1cm4gX19jbWRfdG9wKCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL2J1aWx0aW4uaCBiL3Rvb2xzL3BlcmYvYnVpbHRpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDE2ODIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL2J1aWx0aW4uaApAQCAtMCwwICsxLDI2IEBACisjaWZuZGVmIEJVSUxUSU5fSAorI2RlZmluZSBCVUlMVElOX0gKKworI2luY2x1ZGUgInV0aWwvdXRpbC5oIgorI2luY2x1ZGUgInV0aWwvc3RyYnVmLmgiCisKK2V4dGVybiBjb25zdCBjaGFyIHBlcmZfdmVyc2lvbl9zdHJpbmdbXTsKK2V4dGVybiBjb25zdCBjaGFyIHBlcmZfdXNhZ2Vfc3RyaW5nW107CitleHRlcm4gY29uc3QgY2hhciBwZXJmX21vcmVfaW5mb19zdHJpbmdbXTsKKworZXh0ZXJuIHZvaWQgbGlzdF9jb21tb25fY21kc19oZWxwKHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKmhlbHBfdW5rbm93bl9jbWQoY29uc3QgY2hhciAqY21kKTsKK2V4dGVybiB2b2lkIHBydW5lX3BhY2tlZF9vYmplY3RzKGludCk7CitleHRlcm4gaW50IHJlYWRfbGluZV93aXRoX251bChjaGFyICpidWYsIGludCBzaXplLCBGSUxFICpmaWxlKTsKK2V4dGVybiBpbnQgY2hlY2tfcGFnZXJfY29uZmlnKGNvbnN0IGNoYXIgKmNtZCk7CisKK2V4dGVybiBpbnQgY21kX2Fubm90YXRlKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2hlbHAoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworZXh0ZXJuIGludCBjbWRfcmVjb3JkKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3JlcG9ydChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF9zdGF0KGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX3RvcChpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gaW50IGNtZF92ZXJzaW9uKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3QgY2hhciAqcHJlZml4KTsKK2V4dGVybiBpbnQgY21kX2xpc3QoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBjb25zdCBjaGFyICpwcmVmaXgpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvY29tbWFuZC1saXN0LnR4dCBiL3Rvb2xzL3BlcmYvY29tbWFuZC1saXN0LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWJjZTMwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9jb21tYW5kLWxpc3QudHh0CkBAIC0wLDAgKzEsMTAgQEAKKyMKKyMgTGlzdCBvZiBrbm93biBwZXJmIGNvbW1hbmRzLgorIyBjb21tYW5kIG5hbWUJCQljYXRlZ29yeSBbZGVwcmVjYXRlZF0gW2NvbW1vbl0KKyMKK3BlcmYtYW5ub3RhdGUJCQltYWlucG9yY2VsYWluIGNvbW1vbgorcGVyZi1saXN0CQkJbWFpbnBvcmNlbGFpbiBjb21tb24KK3BlcmYtcmVjb3JkCQkJbWFpbnBvcmNlbGFpbiBjb21tb24KK3BlcmYtcmVwb3J0CQkJbWFpbnBvcmNlbGFpbiBjb21tb24KK3BlcmYtc3RhdAkJCW1haW5wb3JjZWxhaW4gY29tbW9uCitwZXJmLXRvcAkJCW1haW5wb3JjZWxhaW4gY29tbW9uCmRpZmYgLS1naXQgYS90b29scy9wZXJmL2Rlc2lnbi50eHQgYi90b29scy9wZXJmL2Rlc2lnbi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODYwZTExNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvZGVzaWduLnR4dApAQCAtMCwwICsxLDQ0MiBAQAorCitQZXJmb3JtYW5jZSBDb3VudGVycyBmb3IgTGludXgKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitQZXJmb3JtYW5jZSBjb3VudGVycyBhcmUgc3BlY2lhbCBoYXJkd2FyZSByZWdpc3RlcnMgYXZhaWxhYmxlIG9uIG1vc3QgbW9kZXJuCitDUFVzLiBUaGVzZSByZWdpc3RlcnMgY291bnQgdGhlIG51bWJlciBvZiBjZXJ0YWluIHR5cGVzIG9mIGh3IGV2ZW50czogc3VjaAorYXMgaW5zdHJ1Y3Rpb25zIGV4ZWN1dGVkLCBjYWNoZW1pc3NlcyBzdWZmZXJlZCwgb3IgYnJhbmNoZXMgbWlzLXByZWRpY3RlZCAtCit3aXRob3V0IHNsb3dpbmcgZG93biB0aGUga2VybmVsIG9yIGFwcGxpY2F0aW9ucy4gVGhlc2UgcmVnaXN0ZXJzIGNhbiBhbHNvCit0cmlnZ2VyIGludGVycnVwdHMgd2hlbiBhIHRocmVzaG9sZCBudW1iZXIgb2YgZXZlbnRzIGhhdmUgcGFzc2VkIC0gYW5kIGNhbgordGh1cyBiZSB1c2VkIHRvIHByb2ZpbGUgdGhlIGNvZGUgdGhhdCBydW5zIG9uIHRoYXQgQ1BVLgorCitUaGUgTGludXggUGVyZm9ybWFuY2UgQ291bnRlciBzdWJzeXN0ZW0gcHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gb2YgdGhlc2UKK2hhcmR3YXJlIGNhcGFiaWxpdGllcy4gSXQgcHJvdmlkZXMgcGVyIHRhc2sgYW5kIHBlciBDUFUgY291bnRlcnMsIGNvdW50ZXIKK2dyb3VwcywgYW5kIGl0IHByb3ZpZGVzIGV2ZW50IGNhcGFiaWxpdGllcyBvbiB0b3Agb2YgdGhvc2UuICBJdAorcHJvdmlkZXMgInZpcnR1YWwiIDY0LWJpdCBjb3VudGVycywgcmVnYXJkbGVzcyBvZiB0aGUgd2lkdGggb2YgdGhlCit1bmRlcmx5aW5nIGhhcmR3YXJlIGNvdW50ZXJzLgorCitQZXJmb3JtYW5jZSBjb3VudGVycyBhcmUgYWNjZXNzZWQgdmlhIHNwZWNpYWwgZmlsZSBkZXNjcmlwdG9ycy4KK1RoZXJlJ3Mgb25lIGZpbGUgZGVzY3JpcHRvciBwZXIgdmlydHVhbCBjb3VudGVyIHVzZWQuCisKK1RoZSBzcGVjaWFsIGZpbGUgZGVzY3JpcHRvciBpcyBvcGVuZWQgdmlhIHRoZSBwZXJmX2NvdW50ZXJfb3BlbigpCitzeXN0ZW0gY2FsbDoKKworICAgaW50IHN5c19wZXJmX2NvdW50ZXJfb3BlbihzdHJ1Y3QgcGVyZl9jb3VudGVyX2h3X2V2ZW50ICpod19ldmVudF91cHRyLAorCQkJICAgICBwaWRfdCBwaWQsIGludCBjcHUsIGludCBncm91cF9mZCwKKwkJCSAgICAgdW5zaWduZWQgbG9uZyBmbGFncyk7CisKK1RoZSBzeXNjYWxsIHJldHVybnMgdGhlIG5ldyBmZC4gVGhlIGZkIGNhbiBiZSB1c2VkIHZpYSB0aGUgbm9ybWFsCitWRlMgc3lzdGVtIGNhbGxzOiByZWFkKCkgY2FuIGJlIHVzZWQgdG8gcmVhZCB0aGUgY291bnRlciwgZmNudGwoKQorY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBibG9ja2luZyBtb2RlLCBldGMuCisKK011bHRpcGxlIGNvdW50ZXJzIGNhbiBiZSBrZXB0IG9wZW4gYXQgYSB0aW1lLCBhbmQgdGhlIGNvdW50ZXJzCitjYW4gYmUgcG9sbCgpZWQuCisKK1doZW4gY3JlYXRpbmcgYSBuZXcgY291bnRlciBmZCwgJ3BlcmZfY291bnRlcl9od19ldmVudCcgaXM6CisKK3N0cnVjdCBwZXJmX2NvdW50ZXJfaHdfZXZlbnQgeworICAgICAgICAvKgorICAgICAgICAgKiBUaGUgTVNCIG9mIHRoZSBjb25maWcgd29yZCBzaWduaWZpZXMgaWYgdGhlIHJlc3QgY29udGFpbnMgY3B1CisgICAgICAgICAqIHNwZWNpZmljIChyYXcpIGNvdW50ZXIgY29uZmlndXJhdGlvbiBkYXRhLCBpZiB1bnNldCwgdGhlIG5leHQKKyAgICAgICAgICogNyBiaXRzIGFyZSBhbiBldmVudCB0eXBlIGFuZCB0aGUgcmVzdCBvZiB0aGUgYml0cyBhcmUgdGhlIGV2ZW50CisgICAgICAgICAqIGlkZW50aWZpZXIuCisgICAgICAgICAqLworICAgICAgICBfX3U2NCAgICAgICAgICAgICAgICAgICBjb25maWc7CisKKyAgICAgICAgX191NjQgICAgICAgICAgICAgICAgICAgaXJxX3BlcmlvZDsKKyAgICAgICAgX191MzIgICAgICAgICAgICAgICAgICAgcmVjb3JkX3R5cGU7CisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHJlYWRfZm9ybWF0OworCisgICAgICAgIF9fdTY0ICAgICAgICAgICAgICAgICAgIGRpc2FibGVkICAgICAgIDogIDEsIC8qIG9mZiBieSBkZWZhdWx0ICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmhlcml0ICAgICAgICA6ICAxLCAvKiBjaGlsZHJlbiBpbmhlcml0IGl0ICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlubmVkICAgICAgICAgOiAgMSwgLyogbXVzdCBhbHdheXMgYmUgb24gUE1VICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1c2l2ZSAgICAgIDogIDEsIC8qIG9ubHkgZ3JvdXAgb24gUE1VICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlX3VzZXIgICA6ICAxLCAvKiBkb24ndCBjb3VudCB1c2VyICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjbHVkZV9rZXJuZWwgOiAgMSwgLyogZGl0dG8ga2VybmVsICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVfaHYgICAgIDogIDEsIC8qIGRpdHRvIGh5cGVydmlzb3IgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNsdWRlX2lkbGUgICA6ICAxLCAvKiBkb24ndCBjb3VudCB3aGVuIGlkbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW1hcCAgICAgICAgICAgOiAgMSwgLyogaW5jbHVkZSBtbWFwIGRhdGEgICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bm1hcCAgICAgICAgIDogIDEsIC8qIGluY2x1ZGUgbXVubWFwIGRhdGEgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tICAgICAgICAgICA6ICAxLCAvKiBpbmNsdWRlIGNvbW0gZGF0YSAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jlc2VydmVkXzEgICA6IDUyOworCisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIGV4dHJhX2NvbmZpZ19sZW47CisgICAgICAgIF9fdTMyICAgICAgICAgICAgICAgICAgIHdha2V1cF9ldmVudHM7ICAvKiB3YWtldXAgZXZlcnkgbiBldmVudHMgKi8KKworICAgICAgICBfX3U2NCAgICAgICAgICAgICAgICAgICBfX3Jlc2VydmVkXzI7CisgICAgICAgIF9fdTY0ICAgICAgICAgICAgICAgICAgIF9fcmVzZXJ2ZWRfMzsKK307CisKK1RoZSAnY29uZmlnJyBmaWVsZCBzcGVjaWZpZXMgd2hhdCB0aGUgY291bnRlciBzaG91bGQgY291bnQuICBJdAoraXMgZGl2aWRlZCBpbnRvIDMgYml0LWZpZWxkczoKKworcmF3X3R5cGU6IDEgYml0ICAgKG1vc3Qgc2lnbmlmaWNhbnQgYml0KQkweDgwMDBfMDAwMF8wMDAwXzAwMDAKK3R5cGU6CSAgNyBiaXRzICAobmV4dCBtb3N0IHNpZ25pZmljYW50KQkweDdmMDBfMDAwMF8wMDAwXzAwMDAKK2V2ZW50X2lkOiA1NiBiaXRzIChsZWFzdCBzaWduaWZpY2FudCkJCTB4MDBmZl9mZmZmX2ZmZmZfZmZmZgorCitJZiAncmF3X3R5cGUnIGlzIDEsIHRoZW4gdGhlIGNvdW50ZXIgd2lsbCBjb3VudCBhIGhhcmR3YXJlIGV2ZW50CitzcGVjaWZpZWQgYnkgdGhlIHJlbWFpbmluZyA2MyBiaXRzIG9mIGV2ZW50X2NvbmZpZy4gIFRoZSBlbmNvZGluZyBpcworbWFjaGluZS1zcGVjaWZpYy4KKworSWYgJ3Jhd190eXBlJyBpcyAwLCB0aGVuIHRoZSAndHlwZScgZmllbGQgc2F5cyB3aGF0IGtpbmQgb2YgY291bnRlcgordGhpcyBpcywgd2l0aCB0aGUgZm9sbG93aW5nIGVuY29kaW5nOgorCitlbnVtIHBlcmZfZXZlbnRfdHlwZXMgeworCVBFUkZfVFlQRV9IQVJEV0FSRQkJPSAwLAorCVBFUkZfVFlQRV9TT0ZUV0FSRQkJPSAxLAorCVBFUkZfVFlQRV9UUkFDRVBPSU5UCQk9IDIsCit9OworCitBIGNvdW50ZXIgb2YgUEVSRl9UWVBFX0hBUkRXQVJFIHdpbGwgY291bnQgdGhlIGhhcmR3YXJlIGV2ZW50CitzcGVjaWZpZWQgYnkgJ2V2ZW50X2lkJzoKKworLyoKKyAqIEdlbmVyYWxpemVkIHBlcmZvcm1hbmNlIGNvdW50ZXIgZXZlbnQgdHlwZXMsIHVzZWQgYnkgdGhlIGh3X2V2ZW50LmV2ZW50X2lkCisgKiBwYXJhbWV0ZXIgb2YgdGhlIHN5c19wZXJmX2NvdW50ZXJfb3BlbigpIHN5c2NhbGw6CisgKi8KK2VudW0gaHdfZXZlbnRfaWRzIHsKKwkvKgorCSAqIENvbW1vbiBoYXJkd2FyZSBldmVudHMsIGdlbmVyYWxpemVkIGJ5IHRoZSBrZXJuZWw6CisJICovCisJUEVSRl9DT1VOVF9IV19DUFVfQ1lDTEVTCQk9IDAsCisJUEVSRl9DT1VOVF9IV19JTlNUUlVDVElPTlMJCT0gMSwKKwlQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFRkVSRU5DRVMJPSAyLAorCVBFUkZfQ09VTlRfSFdfQ0FDSEVfTUlTU0VTCQk9IDMsCisJUEVSRl9DT1VOVF9IV19CUkFOQ0hfSU5TVFJVQ1RJT05TCT0gNCwKKwlQRVJGX0NPVU5UX0hXX0JSQU5DSF9NSVNTRVMJPSA1LAorCVBFUkZfQ09VTlRfSFdfQlVTX0NZQ0xFUwkJPSA2LAorfTsKKworVGhlc2UgYXJlIHN0YW5kYXJkaXplZCB0eXBlcyBvZiBldmVudHMgdGhhdCB3b3JrIHJlbGF0aXZlbHkgdW5pZm9ybWx5CitvbiBhbGwgQ1BVcyB0aGF0IGltcGxlbWVudCBQZXJmb3JtYW5jZSBDb3VudGVycyBzdXBwb3J0IHVuZGVyIExpbnV4LAorYWx0aG91Z2ggdGhlcmUgbWF5IGJlIHZhcmlhdGlvbnMgKGUuZy4sIGRpZmZlcmVudCBDUFVzIG1pZ2h0IGNvdW50CitjYWNoZSByZWZlcmVuY2VzIGFuZCBtaXNzZXMgYXQgZGlmZmVyZW50IGxldmVscyBvZiB0aGUgY2FjaGUgaGllcmFyY2h5KS4KK0lmIGEgQ1BVIGlzIG5vdCBhYmxlIHRvIGNvdW50IHRoZSBzZWxlY3RlZCBldmVudCwgdGhlbiB0aGUgc3lzdGVtIGNhbGwKK3dpbGwgcmV0dXJuIC1FSU5WQUwuCisKK01vcmUgaHdfZXZlbnRfdHlwZXMgYXJlIHN1cHBvcnRlZCBhcyB3ZWxsLCBidXQgdGhleSBhcmUgQ1BVLXNwZWNpZmljCithbmQgYWNjZXNzZWQgYXMgcmF3IGV2ZW50cy4gIEZvciBleGFtcGxlLCB0byBjb3VudCAiRXh0ZXJuYWwgYnVzCitjeWNsZXMgd2hpbGUgYnVzIGxvY2sgc2lnbmFsIGFzc2VydGVkIiBldmVudHMgb24gSW50ZWwgQ29yZSBDUFVzLCBwYXNzCitpbiBhIDB4NDA2NCBldmVudF9pZCB2YWx1ZSBhbmQgc2V0IGh3X2V2ZW50LnJhd190eXBlIHRvIDEuCisKK0EgY291bnRlciBvZiB0eXBlIFBFUkZfVFlQRV9TT0ZUV0FSRSB3aWxsIGNvdW50IG9uZSBvZiB0aGUgYXZhaWxhYmxlCitzb2Z0d2FyZSBldmVudHMsIHNlbGVjdGVkIGJ5ICdldmVudF9pZCc6CisKKy8qCisgKiBTcGVjaWFsICJzb2Z0d2FyZSIgY291bnRlcnMgcHJvdmlkZWQgYnkgdGhlIGtlcm5lbCwgZXZlbiBpZiB0aGUgaGFyZHdhcmUKKyAqIGRvZXMgbm90IHN1cHBvcnQgcGVyZm9ybWFuY2UgY291bnRlcnMuIFRoZXNlIGNvdW50ZXJzIG1lYXN1cmUgdmFyaW91cworICogcGh5c2ljYWwgYW5kIHN3IGV2ZW50cyBvZiB0aGUga2VybmVsIChhbmQgYWxsb3cgdGhlIHByb2ZpbGluZyBvZiB0aGVtIGFzCisgKiB3ZWxsKToKKyAqLworZW51bSBzd19ldmVudF9pZHMgeworCVBFUkZfQ09VTlRfU1dfQ1BVX0NMT0NLCQk9IDAsCisJUEVSRl9DT1VOVF9TV19UQVNLX0NMT0NLCQk9IDEsCisJUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUUwkJPSAyLAorCVBFUkZfQ09VTlRfU1dfQ09OVEVYVF9TV0lUQ0hFUwk9IDMsCisJUEVSRl9DT1VOVF9TV19DUFVfTUlHUkFUSU9OUwk9IDQsCisJUEVSRl9DT1VOVF9TV19QQUdFX0ZBVUxUU19NSU4JPSA1LAorCVBFUkZfQ09VTlRfU1dfUEFHRV9GQVVMVFNfTUFKCT0gNiwKK307CisKK0NvdW50ZXJzIG9mIHRoZSB0eXBlIFBFUkZfVFlQRV9UUkFDRVBPSU5UIGFyZSBhdmFpbGFibGUgd2hlbiB0aGUgZnRyYWNlIGV2ZW50Cit0cmFjZXIgaXMgYXZhaWxhYmxlLCBhbmQgZXZlbnRfaWQgdmFsdWVzIGNhbiBiZSBvYnRhaW5lZCBmcm9tCisvZGVidWcvdHJhY2luZy9ldmVudHMvKi8qL2lkCisKKworQ291bnRlcnMgY29tZSBpbiB0d28gZmxhdm91cnM6IGNvdW50aW5nIGNvdW50ZXJzIGFuZCBzYW1wbGluZworY291bnRlcnMuICBBICJjb3VudGluZyIgY291bnRlciBpcyBvbmUgdGhhdCBpcyB1c2VkIGZvciBjb3VudGluZyB0aGUKK251bWJlciBvZiBldmVudHMgdGhhdCBvY2N1ciwgYW5kIGlzIGNoYXJhY3RlcmlzZWQgYnkgaGF2aW5nCitpcnFfcGVyaW9kID0gMC4KKworCitBIHJlYWQoKSBvbiBhIGNvdW50ZXIgcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlciBhbmQgcG9zc2libGUKK2FkZGl0aW9uYWwgdmFsdWVzIGFzIHNwZWNpZmllZCBieSAncmVhZF9mb3JtYXQnLCBlYWNoIHZhbHVlIGlzIGEgdTY0ICg4IGJ5dGVzKQoraW4gc2l6ZS4KKworLyoKKyAqIEJpdHMgdGhhdCBjYW4gYmUgc2V0IGluIGh3X2V2ZW50LnJlYWRfZm9ybWF0IHRvIHJlcXVlc3QgdGhhdAorICogcmVhZHMgb24gdGhlIGNvdW50ZXIgc2hvdWxkIHJldHVybiB0aGUgaW5kaWNhdGVkIHF1YW50aXRpZXMsCisgKiBpbiBpbmNyZWFzaW5nIG9yZGVyIG9mIGJpdCB2YWx1ZSwgYWZ0ZXIgdGhlIGNvdW50ZXIgdmFsdWUuCisgKi8KK2VudW0gcGVyZl9jb3VudGVyX3JlYWRfZm9ybWF0IHsKKyAgICAgICAgUEVSRl9GT1JNQVRfVE9UQUxfVElNRV9FTkFCTEVEICA9ICAxLAorICAgICAgICBQRVJGX0ZPUk1BVF9UT1RBTF9USU1FX1JVTk5JTkcgID0gIDIsCit9OworCitVc2luZyB0aGVzZSBhZGRpdGlvbmFsIHZhbHVlcyBvbmUgY2FuIGVzdGFibGlzaCB0aGUgb3ZlcmNvbW1pdCByYXRpbyBmb3IgYQorcGFydGljdWxhciBjb3VudGVyIGFsbG93aW5nIG9uZSB0byB0YWtlIHRoZSByb3VuZC1yb2JpbiBzY2hlZHVsaW5nIGVmZmVjdAoraW50byBhY2NvdW50LgorCisKK0EgInNhbXBsaW5nIiBjb3VudGVyIGlzIG9uZSB0aGF0IGlzIHNldCB1cCB0byBnZW5lcmF0ZSBhbiBpbnRlcnJ1cHQKK2V2ZXJ5IE4gZXZlbnRzLCB3aGVyZSBOIGlzIGdpdmVuIGJ5ICdpcnFfcGVyaW9kJy4gIEEgc2FtcGxpbmcgY291bnRlcgoraGFzIGlycV9wZXJpb2QgPiAwLiBUaGUgcmVjb3JkX3R5cGUgY29udHJvbHMgd2hhdCBkYXRhIGlzIHJlY29yZGVkIG9uIGVhY2gKK2ludGVycnVwdDoKKworLyoKKyAqIEJpdHMgdGhhdCBjYW4gYmUgc2V0IGluIGh3X2V2ZW50LnJlY29yZF90eXBlIHRvIHJlcXVlc3QgaW5mb3JtYXRpb24KKyAqIGluIHRoZSBvdmVyZmxvdyBwYWNrZXRzLgorICovCitlbnVtIHBlcmZfY291bnRlcl9yZWNvcmRfZm9ybWF0IHsKKyAgICAgICAgUEVSRl9SRUNPUkRfSVAgICAgICAgICAgPSAxVSA8PCAwLAorICAgICAgICBQRVJGX1JFQ09SRF9USUQgICAgICAgICA9IDFVIDw8IDEsCisgICAgICAgIFBFUkZfUkVDT1JEX1RJTUUgICAgICAgID0gMVUgPDwgMiwKKyAgICAgICAgUEVSRl9SRUNPUkRfQUREUiAgICAgICAgPSAxVSA8PCAzLAorICAgICAgICBQRVJGX1JFQ09SRF9HUk9VUCAgICAgICA9IDFVIDw8IDQsCisgICAgICAgIFBFUkZfUkVDT1JEX0NBTExDSEFJTiAgID0gMVUgPDwgNSwKK307CisKK1N1Y2ggKGFuZCBvdGhlcikgZXZlbnRzIHdpbGwgYmUgcmVjb3JkZWQgaW4gYSByaW5nLWJ1ZmZlciwgd2hpY2ggaXMKK2F2YWlsYWJsZSB0byB1c2VyLXNwYWNlIHVzaW5nIG1tYXAoKSAoc2VlIGJlbG93KS4KKworVGhlICdkaXNhYmxlZCcgYml0IHNwZWNpZmllcyB3aGV0aGVyIHRoZSBjb3VudGVyIHN0YXJ0cyBvdXQgZGlzYWJsZWQKK29yIGVuYWJsZWQuICBJZiBpdCBpcyBpbml0aWFsbHkgZGlzYWJsZWQsIGl0IGNhbiBiZSBlbmFibGVkIGJ5IGlvY3RsCitvciBwcmN0bCAoc2VlIGJlbG93KS4KKworVGhlICdpbmhlcml0JyBiaXQsIGlmIHNldCwgc3BlY2lmaWVzIHRoYXQgdGhpcyBjb3VudGVyIHNob3VsZCBjb3VudAorZXZlbnRzIG9uIGRlc2NlbmRhbnQgdGFza3MgYXMgd2VsbCBhcyB0aGUgdGFzayBzcGVjaWZpZWQuICBUaGlzIG9ubHkKK2FwcGxpZXMgdG8gbmV3IGRlc2NlbmRlbnRzLCBub3QgdG8gYW55IGV4aXN0aW5nIGRlc2NlbmRlbnRzIGF0IHRoZQordGltZSB0aGUgY291bnRlciBpcyBjcmVhdGVkIChub3IgdG8gYW55IG5ldyBkZXNjZW5kZW50cyBvZiBleGlzdGluZworZGVzY2VuZGVudHMpLgorCitUaGUgJ3Bpbm5lZCcgYml0LCBpZiBzZXQsIHNwZWNpZmllcyB0aGF0IHRoZSBjb3VudGVyIHNob3VsZCBhbHdheXMgYmUKK29uIHRoZSBDUFUgaWYgYXQgYWxsIHBvc3NpYmxlLiAgSXQgb25seSBhcHBsaWVzIHRvIGhhcmR3YXJlIGNvdW50ZXJzCithbmQgb25seSB0byBncm91cCBsZWFkZXJzLiAgSWYgYSBwaW5uZWQgY291bnRlciBjYW5ub3QgYmUgcHV0IG9udG8gdGhlCitDUFUgKGUuZy4gYmVjYXVzZSB0aGVyZSBhcmUgbm90IGVub3VnaCBoYXJkd2FyZSBjb3VudGVycyBvciBiZWNhdXNlIG9mCithIGNvbmZsaWN0IHdpdGggc29tZSBvdGhlciBldmVudCksIHRoZW4gdGhlIGNvdW50ZXIgZ29lcyBpbnRvIGFuCisnZXJyb3InIHN0YXRlLCB3aGVyZSByZWFkcyByZXR1cm4gZW5kLW9mLWZpbGUgKGkuZS4gcmVhZCgpIHJldHVybnMgMCkKK3VudGlsIHRoZSBjb3VudGVyIGlzIHN1YnNlcXVlbnRseSBlbmFibGVkIG9yIGRpc2FibGVkLgorCitUaGUgJ2V4Y2x1c2l2ZScgYml0LCBpZiBzZXQsIHNwZWNpZmllcyB0aGF0IHdoZW4gdGhpcyBjb3VudGVyJ3MgZ3JvdXAKK2lzIG9uIHRoZSBDUFUsIGl0IHNob3VsZCBiZSB0aGUgb25seSBncm91cCB1c2luZyB0aGUgQ1BVJ3MgY291bnRlcnMuCitJbiBmdXR1cmUsIHRoaXMgd2lsbCBhbGxvdyBzb3BoaXN0aWNhdGVkIG1vbml0b3JpbmcgcHJvZ3JhbXMgdG8gc3VwcGx5CitleHRyYSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIHZpYSAnZXh0cmFfY29uZmlnX2xlbicgdG8gZXhwbG9pdAorYWR2YW5jZWQgZmVhdHVyZXMgb2YgdGhlIENQVSdzIFBlcmZvcm1hbmNlIE1vbml0b3IgVW5pdCAoUE1VKSB0aGF0IGFyZQorbm90IG90aGVyd2lzZSBhY2Nlc3NpYmxlIGFuZCB0aGF0IG1pZ2h0IGRpc3J1cHQgb3RoZXIgaGFyZHdhcmUKK2NvdW50ZXJzLgorCitUaGUgJ2V4Y2x1ZGVfdXNlcicsICdleGNsdWRlX2tlcm5lbCcgYW5kICdleGNsdWRlX2h2JyBiaXRzIHByb3ZpZGUgYQord2F5IHRvIHJlcXVlc3QgdGhhdCBjb3VudGluZyBvZiBldmVudHMgYmUgcmVzdHJpY3RlZCB0byB0aW1lcyB3aGVuIHRoZQorQ1BVIGlzIGluIHVzZXIsIGtlcm5lbCBhbmQvb3IgaHlwZXJ2aXNvciBtb2RlLgorCitUaGUgJ21tYXAnIGFuZCAnbXVubWFwJyBiaXRzIGFsbG93IHJlY29yZGluZyBvZiBQUk9UX0VYRUMgbW1hcC9tdW5tYXAKK29wZXJhdGlvbnMsIHRoZXNlIGNhbiBiZSB1c2VkIHRvIHJlbGF0ZSB1c2Vyc3BhY2UgSVAgYWRkcmVzc2VzIHRvIGFjdHVhbAorY29kZSwgZXZlbiBhZnRlciB0aGUgbWFwcGluZyAob3IgZXZlbiB0aGUgd2hvbGUgcHJvY2VzcykgaXMgZ29uZSwKK3RoZXNlIGV2ZW50cyBhcmUgcmVjb3JkZWQgaW4gdGhlIHJpbmctYnVmZmVyIChzZWUgYmVsb3cpLgorCitUaGUgJ2NvbW0nIGJpdCBhbGxvd3MgdHJhY2tpbmcgb2YgcHJvY2VzcyBjb21tIGRhdGEgb24gcHJvY2VzcyBjcmVhdGlvbi4KK1RoaXMgdG9vIGlzIHJlY29yZGVkIGluIHRoZSByaW5nLWJ1ZmZlciAoc2VlIGJlbG93KS4KKworVGhlICdwaWQnIHBhcmFtZXRlciB0byB0aGUgcGVyZl9jb3VudGVyX29wZW4oKSBzeXN0ZW0gY2FsbCBhbGxvd3MgdGhlCitjb3VudGVyIHRvIGJlIHNwZWNpZmljIHRvIGEgdGFzazoKKworIHBpZCA9PSAwOiBpZiB0aGUgcGlkIHBhcmFtZXRlciBpcyB6ZXJvLCB0aGUgY291bnRlciBpcyBhdHRhY2hlZCB0byB0aGUKKyBjdXJyZW50IHRhc2suCisKKyBwaWQgPiAwOiB0aGUgY291bnRlciBpcyBhdHRhY2hlZCB0byBhIHNwZWNpZmljIHRhc2sgKGlmIHRoZSBjdXJyZW50IHRhc2sKKyBoYXMgc3VmZmljaWVudCBwcml2aWxlZ2UgdG8gZG8gc28pCisKKyBwaWQgPCAwOiBhbGwgdGFza3MgYXJlIGNvdW50ZWQgKHBlciBjcHUgY291bnRlcnMpCisKK1RoZSAnY3B1JyBwYXJhbWV0ZXIgYWxsb3dzIGEgY291bnRlciB0byBiZSBtYWRlIHNwZWNpZmljIHRvIGEgQ1BVOgorCisgY3B1ID49IDA6IHRoZSBjb3VudGVyIGlzIHJlc3RyaWN0ZWQgdG8gYSBzcGVjaWZpYyBDUFUKKyBjcHUgPT0gLTE6IHRoZSBjb3VudGVyIGNvdW50cyBvbiBhbGwgQ1BVcworCisoTm90ZTogdGhlIGNvbWJpbmF0aW9uIG9mICdwaWQgPT0gLTEnIGFuZCAnY3B1ID09IC0xJyBpcyBub3QgdmFsaWQuKQorCitBICdwaWQgPiAwJyBhbmQgJ2NwdSA9PSAtMScgY291bnRlciBpcyBhIHBlciB0YXNrIGNvdW50ZXIgdGhhdCBjb3VudHMKK2V2ZW50cyBvZiB0aGF0IHRhc2sgYW5kICdmb2xsb3dzJyB0aGF0IHRhc2sgdG8gd2hhdGV2ZXIgQ1BVIHRoZSB0YXNrCitnZXRzIHNjaGVkdWxlIHRvLiBQZXIgdGFzayBjb3VudGVycyBjYW4gYmUgY3JlYXRlZCBieSBhbnkgdXNlciwgZm9yCit0aGVpciBvd24gdGFza3MuCisKK0EgJ3BpZCA9PSAtMScgYW5kICdjcHUgPT0geCcgY291bnRlciBpcyBhIHBlciBDUFUgY291bnRlciB0aGF0IGNvdW50cworYWxsIGV2ZW50cyBvbiBDUFUteC4gUGVyIENQVSBjb3VudGVycyBuZWVkIENBUF9TWVNfQURNSU4gcHJpdmlsZWdlLgorCitUaGUgJ2ZsYWdzJyBwYXJhbWV0ZXIgaXMgY3VycmVudGx5IHVudXNlZCBhbmQgbXVzdCBiZSB6ZXJvLgorCitUaGUgJ2dyb3VwX2ZkJyBwYXJhbWV0ZXIgYWxsb3dzIGNvdW50ZXIgImdyb3VwcyIgdG8gYmUgc2V0IHVwLiAgQQorY291bnRlciBncm91cCBoYXMgb25lIGNvdW50ZXIgd2hpY2ggaXMgdGhlIGdyb3VwICJsZWFkZXIiLiAgVGhlIGxlYWRlcgoraXMgY3JlYXRlZCBmaXJzdCwgd2l0aCBncm91cF9mZCA9IC0xIGluIHRoZSBwZXJmX2NvdW50ZXJfb3BlbiBjYWxsCit0aGF0IGNyZWF0ZXMgaXQuICBUaGUgcmVzdCBvZiB0aGUgZ3JvdXAgbWVtYmVycyBhcmUgY3JlYXRlZAorc3Vic2VxdWVudGx5LCB3aXRoIGdyb3VwX2ZkIGdpdmluZyB0aGUgZmQgb2YgdGhlIGdyb3VwIGxlYWRlci4KKyhBIHNpbmdsZSBjb3VudGVyIG9uIGl0cyBvd24gaXMgY3JlYXRlZCB3aXRoIGdyb3VwX2ZkID0gLTEgYW5kIGlzCitjb25zaWRlcmVkIHRvIGJlIGEgZ3JvdXAgd2l0aCBvbmx5IDEgbWVtYmVyLikKKworQSBjb3VudGVyIGdyb3VwIGlzIHNjaGVkdWxlZCBvbnRvIHRoZSBDUFUgYXMgYSB1bml0LCB0aGF0IGlzLCBpdCB3aWxsCitvbmx5IGJlIHB1dCBvbnRvIHRoZSBDUFUgaWYgYWxsIG9mIHRoZSBjb3VudGVycyBpbiB0aGUgZ3JvdXAgY2FuIGJlCitwdXQgb250byB0aGUgQ1BVLiAgVGhpcyBtZWFucyB0aGF0IHRoZSB2YWx1ZXMgb2YgdGhlIG1lbWJlciBjb3VudGVycworY2FuIGJlIG1lYW5pbmdmdWxseSBjb21wYXJlZCwgYWRkZWQsIGRpdmlkZWQgKHRvIGdldCByYXRpb3MpLCBldGMuLAord2l0aCBlYWNoIG90aGVyLCBzaW5jZSB0aGV5IGhhdmUgY291bnRlZCBldmVudHMgZm9yIHRoZSBzYW1lIHNldCBvZgorZXhlY3V0ZWQgaW5zdHJ1Y3Rpb25zLgorCisKK0xpa2Ugc3RhdGVkLCBhc3luY2hyb25vdXMgZXZlbnRzLCBsaWtlIGNvdW50ZXIgb3ZlcmZsb3cgb3IgUFJPVF9FWEVDIG1tYXAKK3RyYWNraW5nIGFyZSBsb2dnZWQgaW50byBhIHJpbmctYnVmZmVyLiBUaGlzIHJpbmctYnVmZmVyIGlzIGNyZWF0ZWQgYW5kCithY2Nlc3NlZCB0aHJvdWdoIG1tYXAoKS4KKworVGhlIG1tYXAgc2l6ZSBzaG91bGQgYmUgMSsyXm4gcGFnZXMsIHdoZXJlIHRoZSBmaXJzdCBwYWdlIGlzIGEgbWV0YS1kYXRhIHBhZ2UKKyhzdHJ1Y3QgcGVyZl9jb3VudGVyX21tYXBfcGFnZSkgdGhhdCBjb250YWlucyB2YXJpb3VzIGJpdHMgb2YgaW5mb3JtYXRpb24gc3VjaAorYXMgd2hlcmUgdGhlIHJpbmctYnVmZmVyIGhlYWQgaXMuCisKKy8qCisgKiBTdHJ1Y3R1cmUgb2YgdGhlIHBhZ2UgdGhhdCBjYW4gYmUgbWFwcGVkIHZpYSBtbWFwCisgKi8KK3N0cnVjdCBwZXJmX2NvdW50ZXJfbW1hcF9wYWdlIHsKKyAgICAgICAgX191MzIgICB2ZXJzaW9uOyAgICAgICAgICAgICAgICAvKiB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdHVyZSAqLworICAgICAgICBfX3UzMiAgIGNvbXBhdF92ZXJzaW9uOyAgICAgICAgIC8qIGxvd2VzdCB2ZXJzaW9uIHRoaXMgaXMgY29tcGF0IHdpdGggKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBCaXRzIG5lZWRlZCB0byByZWFkIHRoZSBodyBjb3VudGVycyBpbiB1c2VyLXNwYWNlLgorICAgICAgICAgKgorICAgICAgICAgKiAgIHUzMiBzZXE7CisgICAgICAgICAqICAgczY0IGNvdW50OworICAgICAgICAgKgorICAgICAgICAgKiAgIGRvIHsKKyAgICAgICAgICogICAgIHNlcSA9IHBjLT5sb2NrOworICAgICAgICAgKgorICAgICAgICAgKiAgICAgYmFycmllcigpCisgICAgICAgICAqICAgICBpZiAocGMtPmluZGV4KSB7CisgICAgICAgICAqICAgICAgIGNvdW50ID0gcG1jX3JlYWQocGMtPmluZGV4IC0gMSk7CisgICAgICAgICAqICAgICAgIGNvdW50ICs9IHBjLT5vZmZzZXQ7CisgICAgICAgICAqICAgICB9IGVsc2UKKyAgICAgICAgICogICAgICAgZ290byByZWd1bGFyX3JlYWQ7CisgICAgICAgICAqCisgICAgICAgICAqICAgICBiYXJyaWVyKCk7CisgICAgICAgICAqICAgfSB3aGlsZSAocGMtPmxvY2sgIT0gc2VxKTsKKyAgICAgICAgICoKKyAgICAgICAgICogTk9URTogZm9yIG9idmlvdXMgcmVhc29uIHRoaXMgb25seSB3b3JrcyBvbiBzZWxmLW1vbml0b3JpbmcKKyAgICAgICAgICogICAgICAgcHJvY2Vzc2VzLgorICAgICAgICAgKi8KKyAgICAgICAgX191MzIgICBsb2NrOyAgICAgICAgICAgICAgICAgICAvKiBzZXFsb2NrIGZvciBzeW5jaHJvbml6YXRpb24gKi8KKyAgICAgICAgX191MzIgICBpbmRleDsgICAgICAgICAgICAgICAgICAvKiBoYXJkd2FyZSBjb3VudGVyIGlkZW50aWZpZXIgKi8KKyAgICAgICAgX19zNjQgICBvZmZzZXQ7ICAgICAgICAgICAgICAgICAvKiBhZGQgdG8gaGFyZHdhcmUgY291bnRlciB2YWx1ZSAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnRyb2wgZGF0YSBmb3IgdGhlIG1tYXAoKSBkYXRhIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogVXNlci1zcGFjZSByZWFkaW5nIHRoaXMgdmFsdWUgc2hvdWxkIGlzc3VlIGFuIHJtYigpLCBvbiBTTVAgY2FwYWJsZQorICAgICAgICAgKiBwbGF0Zm9ybXMsIGFmdGVyIHJlYWRpbmcgdGhpcyB2YWx1ZSAtLSBzZWUgcGVyZl9jb3VudGVyX3dha2V1cCgpLgorICAgICAgICAgKi8KKyAgICAgICAgX191MzIgICBkYXRhX2hlYWQ7ICAgICAgICAgICAgICAvKiBoZWFkIGluIHRoZSBkYXRhIHNlY3Rpb24gKi8KK307CisKK05PVEU6IHRoZSBody1jb3VudGVyIHVzZXJzcGFjZSBiaXRzIGFyZSBhcmNoIHNwZWNpZmljIGFuZCBhcmUgY3VycmVudGx5IG9ubHkKKyAgICAgIGltcGxlbWVudGVkIG9uIHBvd2VycGMuCisKK1RoZSBmb2xsb3dpbmcgMl5uIHBhZ2VzIGFyZSB0aGUgcmluZy1idWZmZXIgd2hpY2ggY29udGFpbnMgZXZlbnRzIG9mIHRoZSBmb3JtOgorCisjZGVmaW5lIFBFUkZfRVZFTlRfTUlTQ19LRVJORUwgICAgICAgICAgKDEgPDwgMCkKKyNkZWZpbmUgUEVSRl9FVkVOVF9NSVNDX1VTRVIgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBQRVJGX0VWRU5UX01JU0NfT1ZFUkZMT1cgICAgICAgICgxIDw8IDIpCisKK3N0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciB7CisgICAgICAgIF9fdTMyICAgdHlwZTsKKyAgICAgICAgX191MTYgICBtaXNjOworICAgICAgICBfX3UxNiAgIHNpemU7Cit9OworCitlbnVtIHBlcmZfZXZlbnRfdHlwZSB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVGhlIE1NQVAgZXZlbnRzIHJlY29yZCB0aGUgUFJPVF9FWEVDIG1hcHBpbmdzIHNvIHRoYXQgd2UgY2FuCisgICAgICAgICAqIGNvcnJlbGF0ZSB1c2Vyc3BhY2UgSVBzIHRvIGNvZGUuIFRoZXkgaGF2ZSB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKyAgICAgICAgICoKKyAgICAgICAgICogc3RydWN0IHsKKyAgICAgICAgICogICAgICBzdHJ1Y3QgcGVyZl9ldmVudF9oZWFkZXIgICAgICAgIGhlYWRlcjsKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICB1MzIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCwgdGlkOworICAgICAgICAgKiAgICAgIHU2NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcjsKKyAgICAgICAgICogICAgICB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbjsKKyAgICAgICAgICogICAgICB1NjQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBnb2ZmOworICAgICAgICAgKiAgICAgIGNoYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWVbXTsKKyAgICAgICAgICogfTsKKyAgICAgICAgICovCisgICAgICAgIFBFUkZfRVZFTlRfTU1BUCAgICAgICAgICAgICAgICAgPSAxLAorICAgICAgICBQRVJGX0VWRU5UX01VTk1BUCAgICAgICAgICAgICAgID0gMiwKKworICAgICAgICAvKgorICAgICAgICAgKiBzdHJ1Y3QgeworICAgICAgICAgKiAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAgICAgICAgaGVhZGVyOworICAgICAgICAgKgorICAgICAgICAgKiAgICAgIHUzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkLCB0aWQ7CisgICAgICAgICAqICAgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tW107CisgICAgICAgICAqIH07CisgICAgICAgICAqLworICAgICAgICBQRVJGX0VWRU5UX0NPTU0gICAgICAgICAgICAgICAgID0gMywKKworICAgICAgICAvKgorICAgICAgICAgKiBXaGVuIGhlYWRlci5taXNjICYgUEVSRl9FVkVOVF9NSVNDX09WRVJGTE9XIHRoZSBldmVudF90eXBlIGZpZWxkCisgICAgICAgICAqIHdpbGwgYmUgUEVSRl9SRUNPUkRfKgorICAgICAgICAgKgorICAgICAgICAgKiBzdHJ1Y3QgeworICAgICAgICAgKiAgICAgIHN0cnVjdCBwZXJmX2V2ZW50X2hlYWRlciAgICAgICAgaGVhZGVyOworICAgICAgICAgKgorICAgICAgICAgKiAgICAgIHsgdTY0ICAgICAgICAgICAgICAgICAgIGlwOyAgICAgICB9ICYmIFBFUkZfUkVDT1JEX0lQCisgICAgICAgICAqICAgICAgeyB1MzIgICAgICAgICAgICAgICAgICAgcGlkLCB0aWQ7IH0gJiYgUEVSRl9SRUNPUkRfVElECisgICAgICAgICAqICAgICAgeyB1NjQgICAgICAgICAgICAgICAgICAgdGltZTsgICAgIH0gJiYgUEVSRl9SRUNPUkRfVElNRQorICAgICAgICAgKiAgICAgIHsgdTY0ICAgICAgICAgICAgICAgICAgIGFkZHI7ICAgICB9ICYmIFBFUkZfUkVDT1JEX0FERFIKKyAgICAgICAgICoKKyAgICAgICAgICogICAgICB7IHU2NCAgICAgICAgICAgICAgICAgICBucjsKKyAgICAgICAgICogICAgICAgIHsgdTY0IGV2ZW50LCB2YWw7IH0gICBjbnRbbnJdOyAgfSAmJiBQRVJGX1JFQ09SRF9HUk9VUAorICAgICAgICAgKgorICAgICAgICAgKiAgICAgIHsgdTE2ICAgICAgICAgICAgICAgICAgIG5yLAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh2LAorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlcm5lbCwKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VyOworICAgICAgICAgKiAgICAgICAgdTY0ICAgICAgICAgICAgICAgICAgIGlwc1tucl07ICB9ICYmIFBFUkZfUkVDT1JEX0NBTExDSEFJTgorICAgICAgICAgKiB9OworICAgICAgICAgKi8KK307CisKK05PVEU6IFBFUkZfUkVDT1JEX0NBTExDSEFJTiBpcyBhcmNoIHNwZWNpZmljIGFuZCBjdXJyZW50bHkgb25seSBpbXBsZW1lbnRlZAorICAgICAgb24geDg2LgorCitOb3RpZmljYXRpb24gb2YgbmV3IGV2ZW50cyBpcyBwb3NzaWJsZSB0aHJvdWdoIHBvbGwoKS9zZWxlY3QoKS9lcG9sbCgpIGFuZAorZmNudGwoKSBtYW5hZ2luZyBzaWduYWxzLgorCitOb3JtYWxseSBhIG5vdGlmaWNhdGlvbiBpcyBnZW5lcmF0ZWQgZm9yIGV2ZXJ5IHBhZ2UgZmlsbGVkLCBob3dldmVyIG9uZSBjYW4KK2FkZGl0aW9uYWxseSBzZXQgcGVyZl9jb3VudGVyX2h3X2V2ZW50Lndha2V1cF9ldmVudHMgdG8gZ2VuZXJhdGUgb25lIGV2ZXJ5CitzbyBtYW55IGNvdW50ZXIgb3ZlcmZsb3cgZXZlbnRzLgorCitGdXR1cmUgd29yayB3aWxsIGluY2x1ZGUgYSBzcGxpY2UoKSBpbnRlcmZhY2UgdG8gdGhlIHJpbmctYnVmZmVyLgorCisKK0NvdW50ZXJzIGNhbiBiZSBlbmFibGVkIGFuZCBkaXNhYmxlZCBpbiB0d28gd2F5czogdmlhIGlvY3RsIGFuZCB2aWEKK3ByY3RsLiAgV2hlbiBhIGNvdW50ZXIgaXMgZGlzYWJsZWQsIGl0IGRvZXNuJ3QgY291bnQgb3IgZ2VuZXJhdGUKK2V2ZW50cyBidXQgZG9lcyBjb250aW51ZSB0byBleGlzdCBhbmQgbWFpbnRhaW4gaXRzIGNvdW50IHZhbHVlLgorCitBbiBpbmRpdmlkdWFsIGNvdW50ZXIgb3IgY291bnRlciBncm91cCBjYW4gYmUgZW5hYmxlZCB3aXRoCisKKwlpb2N0bChmZCwgUEVSRl9DT1VOVEVSX0lPQ19FTkFCTEUpOworCitvciBkaXNhYmxlZCB3aXRoCisKKwlpb2N0bChmZCwgUEVSRl9DT1VOVEVSX0lPQ19ESVNBQkxFKTsKKworRW5hYmxpbmcgb3IgZGlzYWJsaW5nIHRoZSBsZWFkZXIgb2YgYSBncm91cCBlbmFibGVzIG9yIGRpc2FibGVzIHRoZQord2hvbGUgZ3JvdXA7IHRoYXQgaXMsIHdoaWxlIHRoZSBncm91cCBsZWFkZXIgaXMgZGlzYWJsZWQsIG5vbmUgb2YgdGhlCitjb3VudGVycyBpbiB0aGUgZ3JvdXAgd2lsbCBjb3VudC4gIEVuYWJsaW5nIG9yIGRpc2FibGluZyBhIG1lbWJlciBvZiBhCitncm91cCBvdGhlciB0aGFuIHRoZSBsZWFkZXIgb25seSBhZmZlY3RzIHRoYXQgY291bnRlciAtIGRpc2FibGluZyBhbgorbm9uLWxlYWRlciBzdG9wcyB0aGF0IGNvdW50ZXIgZnJvbSBjb3VudGluZyBidXQgZG9lc24ndCBhZmZlY3QgYW55CitvdGhlciBjb3VudGVyLgorCitBZGRpdGlvbmFsbHksIG5vbi1pbmhlcml0ZWQgb3ZlcmZsb3cgY291bnRlcnMgY2FuIHVzZQorCisJaW9jdGwoZmQsIFBFUkZfQ09VTlRFUl9JT0NfUkVGUkVTSCwgbnIpOworCit0byBlbmFibGUgYSBjb3VudGVyIGZvciAnbnInIGV2ZW50cywgYWZ0ZXIgd2hpY2ggaXQgZ2V0cyBkaXNhYmxlZCBhZ2Fpbi4KKworQSBwcm9jZXNzIGNhbiBlbmFibGUgb3IgZGlzYWJsZSBhbGwgdGhlIGNvdW50ZXIgZ3JvdXBzIHRoYXQgYXJlCithdHRhY2hlZCB0byBpdCwgdXNpbmcgcHJjdGw6CisKKwlwcmN0bChQUl9UQVNLX1BFUkZfQ09VTlRFUlNfRU5BQkxFKTsKKworCXByY3RsKFBSX1RBU0tfUEVSRl9DT1VOVEVSU19ESVNBQkxFKTsKKworVGhpcyBhcHBsaWVzIHRvIGFsbCBjb3VudGVycyBvbiB0aGUgY3VycmVudCBwcm9jZXNzLCB3aGV0aGVyIGNyZWF0ZWQKK2J5IHRoaXMgcHJvY2VzcyBvciBieSBhbm90aGVyLCBhbmQgZG9lc24ndCBhZmZlY3QgYW55IGNvdW50ZXJzIHRoYXQKK3RoaXMgcHJvY2VzcyBoYXMgY3JlYXRlZCBvbiBvdGhlciBwcm9jZXNzZXMuICBJdCBvbmx5IGVuYWJsZXMgb3IKK2Rpc2FibGVzIHRoZSBncm91cCBsZWFkZXJzLCBub3QgYW55IG90aGVyIG1lbWJlcnMgaW4gdGhlIGdyb3Vwcy4KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi9wZXJmLmMgYi90b29scy9wZXJmL3BlcmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWI3MjU5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi9wZXJmLmMKQEAgLTAsMCArMSw0MjggQEAKKy8qCisgKiBwZXJmLmMKKyAqCisgKiBQZXJmb3JtYW5jZSBhbmFseXNpcyB1dGlsaXR5LgorICoKKyAqIFRoaXMgaXMgdGhlIG1haW4gaHViIGZyb20gd2hpY2ggdGhlIHN1Yi1jb21tYW5kcyAocGVyZiBzdGF0LAorICogcGVyZiB0b3AsIHBlcmYgcmVjb3JkLCBwZXJmIHJlcG9ydCwgZXRjLikgYXJlIHN0YXJ0ZWQuCisgKi8KKyNpbmNsdWRlICJidWlsdGluLmgiCisKKyNpbmNsdWRlICJ1dGlsL2V4ZWNfY21kLmgiCisjaW5jbHVkZSAidXRpbC9jYWNoZS5oIgorI2luY2x1ZGUgInV0aWwvcXVvdGUuaCIKKyNpbmNsdWRlICJ1dGlsL3J1bi1jb21tYW5kLmgiCisKK2NvbnN0IGNoYXIgcGVyZl91c2FnZV9zdHJpbmdbXSA9CisJInBlcmYgWy0tdmVyc2lvbl0gWy0taGVscF0gQ09NTUFORCBbQVJHU10iOworCitjb25zdCBjaGFyIHBlcmZfbW9yZV9pbmZvX3N0cmluZ1tdID0KKwkiU2VlICdwZXJmIGhlbHAgQ09NTUFORCcgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gYSBzcGVjaWZpYyBjb21tYW5kLiI7CisKK3N0YXRpYyBpbnQgdXNlX3BhZ2VyID0gLTE7CitzdHJ1Y3QgcGFnZXJfY29uZmlnIHsKKwljb25zdCBjaGFyICpjbWQ7CisJaW50IHZhbDsKK307CisKK3N0YXRpYyBpbnQgcGFnZXJfY29tbWFuZF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgcGFnZXJfY29uZmlnICpjID0gZGF0YTsKKwlpZiAoIXByZWZpeGNtcCh2YXIsICJwYWdlci4iKSAmJiAhc3RyY21wKHZhciArIDYsIGMtPmNtZCkpCisJCWMtPnZhbCA9IHBlcmZfY29uZmlnX2Jvb2wodmFyLCB2YWx1ZSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJldHVybnMgMCBmb3IgIm5vIHBhZ2VyIiwgMSBmb3IgInVzZSBwYWdlciIsIGFuZCAtMSBmb3IgIm5vdCBzcGVjaWZpZWQiICovCitpbnQgY2hlY2tfcGFnZXJfY29uZmlnKGNvbnN0IGNoYXIgKmNtZCkKK3sKKwlzdHJ1Y3QgcGFnZXJfY29uZmlnIGM7CisJYy5jbWQgPSBjbWQ7CisJYy52YWwgPSAtMTsKKwlwZXJmX2NvbmZpZyhwYWdlcl9jb21tYW5kX2NvbmZpZywgJmMpOworCXJldHVybiBjLnZhbDsKK30KKworc3RhdGljIHZvaWQgY29tbWl0X3BhZ2VyX2Nob2ljZSh2b2lkKSB7CisJc3dpdGNoICh1c2VfcGFnZXIpIHsKKwljYXNlIDA6CisJCXNldGVudigiUEVSRl9QQUdFUiIsICJjYXQiLCAxKTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBzZXR1cF9wYWdlcigpOyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX29wdGlvbnMoY29uc3QgY2hhcioqKiBhcmd2LCBpbnQqIGFyZ2MsIGludCogZW52Y2hhbmdlZCkKK3sKKwlpbnQgaGFuZGxlZCA9IDA7CisKKwl3aGlsZSAoKmFyZ2MgPiAwKSB7CisJCWNvbnN0IGNoYXIgKmNtZCA9ICgqYXJndilbMF07CisJCWlmIChjbWRbMF0gIT0gJy0nKQorCQkJYnJlYWs7CisKKwkJLyoKKwkJICogRm9yIGxlZ2FjeSByZWFzb25zLCB0aGUgInZlcnNpb24iIGFuZCAiaGVscCIKKwkJICogY29tbWFuZHMgY2FuIGJlIHdyaXR0ZW4gd2l0aCAiLS0iIHByZXBlbmRlZAorCQkgKiB0byBtYWtlIHRoZW0gbG9vayBsaWtlIGZsYWdzLgorCQkgKi8KKwkJaWYgKCFzdHJjbXAoY21kLCAiLS1oZWxwIikgfHwgIXN0cmNtcChjbWQsICItLXZlcnNpb24iKSkKKwkJCWJyZWFrOworCisJCS8qCisJCSAqIENoZWNrIHJlbWFpbmluZyBmbGFncy4KKwkJICovCisJCWlmICghcHJlZml4Y21wKGNtZCwgIi0tZXhlYy1wYXRoIikpIHsKKwkJCWNtZCArPSAxMTsKKwkJCWlmICgqY21kID09ICc9JykKKwkJCQlwZXJmX3NldF9hcmd2X2V4ZWNfcGF0aChjbWQgKyAxKTsKKwkJCWVsc2UgeworCQkJCXB1dHMocGVyZl9leGVjX3BhdGgoKSk7CisJCQkJZXhpdCgwKTsKKwkJCX0KKwkJfSBlbHNlIGlmICghc3RyY21wKGNtZCwgIi0taHRtbC1wYXRoIikpIHsKKwkJCXB1dHMoc3lzdGVtX3BhdGgoUEVSRl9IVE1MX1BBVEgpKTsKKwkJCWV4aXQoMCk7CisJCX0gZWxzZSBpZiAoIXN0cmNtcChjbWQsICItcCIpIHx8ICFzdHJjbXAoY21kLCAiLS1wYWdpbmF0ZSIpKSB7CisJCQl1c2VfcGFnZXIgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiLS1uby1wYWdlciIpKSB7CisJCQl1c2VfcGFnZXIgPSAwOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiLS1wZXJmLWRpciIpKSB7CisJCQlpZiAoKmFyZ2MgPCAyKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJObyBkaXJlY3RvcnkgZ2l2ZW4gZm9yIC0tcGVyZi1kaXIuXG4iICk7CisJCQkJdXNhZ2UocGVyZl91c2FnZV9zdHJpbmcpOworCQkJfQorCQkJc2V0ZW52KFBFUkZfRElSX0VOVklST05NRU5ULCAoKmFyZ3YpWzFdLCAxKTsKKwkJCWlmIChlbnZjaGFuZ2VkKQorCQkJCSplbnZjaGFuZ2VkID0gMTsKKwkJCSgqYXJndikrKzsKKwkJCSgqYXJnYyktLTsKKwkJCWhhbmRsZWQrKzsKKwkJfSBlbHNlIGlmICghcHJlZml4Y21wKGNtZCwgIi0tcGVyZi1kaXI9IikpIHsKKwkJCXNldGVudihQRVJGX0RJUl9FTlZJUk9OTUVOVCwgY21kICsgMTAsIDEpOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQl9IGVsc2UgaWYgKCFzdHJjbXAoY21kLCAiLS13b3JrLXRyZWUiKSkgeworCQkJaWYgKCphcmdjIDwgMikgeworCQkJCWZwcmludGYoc3RkZXJyLCAiTm8gZGlyZWN0b3J5IGdpdmVuIGZvciAtLXdvcmstdHJlZS5cbiIgKTsKKwkJCQl1c2FnZShwZXJmX3VzYWdlX3N0cmluZyk7CisJCQl9CisJCQlzZXRlbnYoUEVSRl9XT1JLX1RSRUVfRU5WSVJPTk1FTlQsICgqYXJndilbMV0sIDEpOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQkJKCphcmd2KSsrOworCQkJKCphcmdjKS0tOworCQl9IGVsc2UgaWYgKCFwcmVmaXhjbXAoY21kLCAiLS13b3JrLXRyZWU9IikpIHsKKwkJCXNldGVudihQRVJGX1dPUktfVFJFRV9FTlZJUk9OTUVOVCwgY21kICsgMTIsIDEpOworCQkJaWYgKGVudmNoYW5nZWQpCisJCQkJKmVudmNoYW5nZWQgPSAxOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJVbmtub3duIG9wdGlvbjogJXNcbiIsIGNtZCk7CisJCQl1c2FnZShwZXJmX3VzYWdlX3N0cmluZyk7CisJCX0KKworCQkoKmFyZ3YpKys7CisJCSgqYXJnYyktLTsKKwkJaGFuZGxlZCsrOworCX0KKwlyZXR1cm4gaGFuZGxlZDsKK30KKworc3RhdGljIGludCBoYW5kbGVfYWxpYXMoaW50ICphcmdjcCwgY29uc3QgY2hhciAqKiphcmd2KQoreworCWludCBlbnZjaGFuZ2VkID0gMCwgcmV0ID0gMCwgc2F2ZWRfZXJybm8gPSBlcnJubzsKKwlpbnQgY291bnQsIG9wdGlvbl9jb3VudDsKKwljb25zdCBjaGFyKiogbmV3X2FyZ3Y7CisJY29uc3QgY2hhciAqYWxpYXNfY29tbWFuZDsKKwljaGFyICphbGlhc19zdHJpbmc7CisKKwlhbGlhc19jb21tYW5kID0gKCphcmd2KVswXTsKKwlhbGlhc19zdHJpbmcgPSBhbGlhc19sb29rdXAoYWxpYXNfY29tbWFuZCk7CisJaWYgKGFsaWFzX3N0cmluZykgeworCQlpZiAoYWxpYXNfc3RyaW5nWzBdID09ICchJykgeworCQkJaWYgKCphcmdjcCA+IDEpIHsKKwkJCQlzdHJ1Y3Qgc3RyYnVmIGJ1ZjsKKworCQkJCXN0cmJ1Zl9pbml0KCZidWYsIFBBVEhfTUFYKTsKKwkJCQlzdHJidWZfYWRkc3RyKCZidWYsIGFsaWFzX3N0cmluZyk7CisJCQkJc3FfcXVvdGVfYXJndigmYnVmLCAoKmFyZ3YpICsgMSwgUEFUSF9NQVgpOworCQkJCWZyZWUoYWxpYXNfc3RyaW5nKTsKKwkJCQlhbGlhc19zdHJpbmcgPSBidWYuYnVmOworCQkJfQorCQkJcmV0ID0gc3lzdGVtKGFsaWFzX3N0cmluZyArIDEpOworCQkJaWYgKHJldCA+PSAwICYmIFdJRkVYSVRFRChyZXQpICYmCisJCQkgICAgV0VYSVRTVEFUVVMocmV0KSAhPSAxMjcpCisJCQkJZXhpdChXRVhJVFNUQVRVUyhyZXQpKTsKKwkJCWRpZSgiRmFpbGVkIHRvIHJ1biAnJXMnIHdoZW4gZXhwYW5kaW5nIGFsaWFzICclcyciLAorCQkJICAgIGFsaWFzX3N0cmluZyArIDEsIGFsaWFzX2NvbW1hbmQpOworCQl9CisJCWNvdW50ID0gc3BsaXRfY21kbGluZShhbGlhc19zdHJpbmcsICZuZXdfYXJndik7CisJCWlmIChjb3VudCA8IDApCisJCQlkaWUoIkJhZCBhbGlhcy4lcyBzdHJpbmciLCBhbGlhc19jb21tYW5kKTsKKwkJb3B0aW9uX2NvdW50ID0gaGFuZGxlX29wdGlvbnMoJm5ld19hcmd2LCAmY291bnQsICZlbnZjaGFuZ2VkKTsKKwkJaWYgKGVudmNoYW5nZWQpCisJCQlkaWUoImFsaWFzICclcycgY2hhbmdlcyBlbnZpcm9ubWVudCB2YXJpYWJsZXNcbiIKKwkJCQkgIllvdSBjYW4gdXNlICchcGVyZicgaW4gdGhlIGFsaWFzIHRvIGRvIHRoaXMuIiwKKwkJCQkgYWxpYXNfY29tbWFuZCk7CisJCW1lbW1vdmUobmV3X2FyZ3YgLSBvcHRpb25fY291bnQsIG5ld19hcmd2LAorCQkJCWNvdW50ICogc2l6ZW9mKGNoYXIgKikpOworCQluZXdfYXJndiAtPSBvcHRpb25fY291bnQ7CisKKwkJaWYgKGNvdW50IDwgMSkKKwkJCWRpZSgiZW1wdHkgYWxpYXMgZm9yICVzIiwgYWxpYXNfY29tbWFuZCk7CisKKwkJaWYgKCFzdHJjbXAoYWxpYXNfY29tbWFuZCwgbmV3X2FyZ3ZbMF0pKQorCQkJZGllKCJyZWN1cnNpdmUgYWxpYXM6ICVzIiwgYWxpYXNfY29tbWFuZCk7CisKKwkJbmV3X2FyZ3YgPSByZWFsbG9jKG5ld19hcmd2LCBzaXplb2YoY2hhciopICoKKwkJCQkgICAgKGNvdW50ICsgKmFyZ2NwICsgMSkpOworCQkvKiBpbnNlcnQgYWZ0ZXIgY29tbWFuZCBuYW1lICovCisJCW1lbWNweShuZXdfYXJndiArIGNvdW50LCAqYXJndiArIDEsIHNpemVvZihjaGFyKikgKiAqYXJnY3ApOworCQluZXdfYXJndltjb3VudCsqYXJnY3BdID0gTlVMTDsKKworCQkqYXJndiA9IG5ld19hcmd2OworCQkqYXJnY3AgKz0gY291bnQgLSAxOworCisJCXJldCA9IDE7CisJfQorCisJZXJybm8gPSBzYXZlZF9lcnJubzsKKworCXJldHVybiByZXQ7Cit9CisKK2NvbnN0IGNoYXIgcGVyZl92ZXJzaW9uX3N0cmluZ1tdID0gUEVSRl9WRVJTSU9OOworCisjZGVmaW5lIFJVTl9TRVRVUAkoMTw8MCkKKyNkZWZpbmUgVVNFX1BBR0VSCSgxPDwxKQorLyoKKyAqIHJlcXVpcmUgd29ya2luZyB0cmVlIHRvIGJlIHByZXNlbnQgLS0gYW55dGhpbmcgdXNlcyB0aGlzIG5lZWRzCisgKiBSVU5fU0VUVVAgZm9yIHJlYWRpbmcgZnJvbSB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgorICovCisjZGVmaW5lIE5FRURfV09SS19UUkVFCSgxPDwyKQorCitzdHJ1Y3QgY21kX3N0cnVjdCB7CisJY29uc3QgY2hhciAqY21kOworCWludCAoKmZuKShpbnQsIGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKik7CisJaW50IG9wdGlvbjsKK307CisKK3N0YXRpYyBpbnQgcnVuX2J1aWx0aW4oc3RydWN0IGNtZF9zdHJ1Y3QgKnAsIGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwlpbnQgc3RhdHVzOworCXN0cnVjdCBzdGF0IHN0OworCWNvbnN0IGNoYXIgKnByZWZpeDsKKworCXByZWZpeCA9IE5VTEw7CisJaWYgKHAtPm9wdGlvbiAmIFJVTl9TRVRVUCkKKwkJcHJlZml4ID0gTlVMTDsgLyogc2V0dXBfcGVyZl9kaXJlY3RvcnkoKTsgKi8KKworCWlmICh1c2VfcGFnZXIgPT0gLTEgJiYgcC0+b3B0aW9uICYgUlVOX1NFVFVQKQorCQl1c2VfcGFnZXIgPSBjaGVja19wYWdlcl9jb25maWcocC0+Y21kKTsKKwlpZiAodXNlX3BhZ2VyID09IC0xICYmIHAtPm9wdGlvbiAmIFVTRV9QQUdFUikKKwkJdXNlX3BhZ2VyID0gMTsKKwljb21taXRfcGFnZXJfY2hvaWNlKCk7CisKKwlpZiAocC0+b3B0aW9uICYgTkVFRF9XT1JLX1RSRUUpCisJCS8qIHNldHVwX3dvcmtfdHJlZSgpICovOworCisJc3RhdHVzID0gcC0+Zm4oYXJnYywgYXJndiwgcHJlZml4KTsKKwlpZiAoc3RhdHVzKQorCQlyZXR1cm4gc3RhdHVzICYgMHhmZjsKKworCS8qIFNvbWVib2R5IGNsb3NlZCBzdGRvdXQ/ICovCisJaWYgKGZzdGF0KGZpbGVubyhzdGRvdXQpLCAmc3QpKQorCQlyZXR1cm4gMDsKKwkvKiBJZ25vcmUgd3JpdGUgZXJyb3JzIGZvciBwaXBlcyBhbmQgc29ja2V0cy4uICovCisJaWYgKFNfSVNGSUZPKHN0LnN0X21vZGUpIHx8IFNfSVNTT0NLKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKworCS8qIENoZWNrIGZvciBFTk9TUEMgYW5kIEVJTyBlcnJvcnMuLiAqLworCWlmIChmZmx1c2goc3Rkb3V0KSkKKwkJZGllKCJ3cml0ZSBmYWlsdXJlIG9uIHN0YW5kYXJkIG91dHB1dDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCWlmIChmZXJyb3Ioc3Rkb3V0KSkKKwkJZGllKCJ1bmtub3duIHdyaXRlIGZhaWx1cmUgb24gc3RhbmRhcmQgb3V0cHV0Iik7CisJaWYgKGZjbG9zZShzdGRvdXQpKQorCQlkaWUoImNsb3NlIGZhaWxlZCBvbiBzdGFuZGFyZCBvdXRwdXQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2KQoreworCWNvbnN0IGNoYXIgKmNtZCA9IGFyZ3ZbMF07CisJc3RhdGljIHN0cnVjdCBjbWRfc3RydWN0IGNvbW1hbmRzW10gPSB7CisJCXsgImhlbHAiLCBjbWRfaGVscCwgMCB9LAorCQl7ICJsaXN0IiwgY21kX2xpc3QsIDAgfSwKKwkJeyAicmVjb3JkIiwgY21kX3JlY29yZCwgMCB9LAorCQl7ICJyZXBvcnQiLCBjbWRfcmVwb3J0LCAwIH0sCisJCXsgInN0YXQiLCBjbWRfc3RhdCwgMCB9LAorCQl7ICJ0b3AiLCBjbWRfdG9wLCAwIH0sCisJCXsgImFubm90YXRlIiwgY21kX2Fubm90YXRlLCAwIH0sCisJCXsgInZlcnNpb24iLCBjbWRfdmVyc2lvbiwgMCB9LAorCX07CisJaW50IGk7CisJc3RhdGljIGNvbnN0IGNoYXIgZXh0W10gPSBTVFJJUF9FWFRFTlNJT047CisKKwlpZiAoc2l6ZW9mKGV4dCkgPiAxKSB7CisJCWkgPSBzdHJsZW4oYXJndlswXSkgLSBzdHJsZW4oZXh0KTsKKwkJaWYgKGkgPiAwICYmICFzdHJjbXAoYXJndlswXSArIGksIGV4dCkpIHsKKwkJCWNoYXIgKmFyZ3YwID0gc3RyZHVwKGFyZ3ZbMF0pOworCQkJYXJndlswXSA9IGNtZCA9IGFyZ3YwOworCQkJYXJndjBbaV0gPSAnXDAnOworCQl9CisJfQorCisJLyogVHVybiAicGVyZiBjbWQgLS1oZWxwIiBpbnRvICJwZXJmIGhlbHAgY21kIiAqLworCWlmIChhcmdjID4gMSAmJiAhc3RyY21wKGFyZ3ZbMV0sICItLWhlbHAiKSkgeworCQlhcmd2WzFdID0gYXJndlswXTsKKwkJYXJndlswXSA9IGNtZCA9ICJoZWxwIjsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjb21tYW5kcyk7IGkrKykgeworCQlzdHJ1Y3QgY21kX3N0cnVjdCAqcCA9IGNvbW1hbmRzK2k7CisJCWlmIChzdHJjbXAocC0+Y21kLCBjbWQpKQorCQkJY29udGludWU7CisJCWV4aXQocnVuX2J1aWx0aW4ocCwgYXJnYywgYXJndikpOworCX0KK30KKworc3RhdGljIHZvaWQgZXhlY3ZfZGFzaGVkX2V4dGVybmFsKGNvbnN0IGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBzdHJidWYgY21kID0gU1RSQlVGX0lOSVQ7CisJY29uc3QgY2hhciAqdG1wOworCWludCBzdGF0dXM7CisKKwlzdHJidWZfYWRkZigmY21kLCAicGVyZi0lcyIsIGFyZ3ZbMF0pOworCisJLyoKKwkgKiBhcmd2WzBdIG11c3QgYmUgdGhlIHBlcmYgY29tbWFuZCwgYnV0IHRoZSBhcmd2IGFycmF5CisJICogYmVsb25ncyB0byB0aGUgY2FsbGVyLCBhbmQgbWF5IGJlIHJldXNlZCBpbgorCSAqIHN1YnNlcXVlbnQgbG9vcCBpdGVyYXRpb25zLiBTYXZlIGFyZ3ZbMF0gYW5kCisJICogcmVzdG9yZSBpdCBvbiBlcnJvci4KKwkgKi8KKwl0bXAgPSBhcmd2WzBdOworCWFyZ3ZbMF0gPSBjbWQuYnVmOworCisJLyoKKwkgKiBpZiB3ZSBmYWlsIGJlY2F1c2UgdGhlIGNvbW1hbmQgaXMgbm90IGZvdW5kLCBpdCBpcworCSAqIE9LIHRvIHJldHVybi4gT3RoZXJ3aXNlLCB3ZSBqdXN0IHBhc3MgYWxvbmcgdGhlIHN0YXR1cyBjb2RlLgorCSAqLworCXN0YXR1cyA9IHJ1bl9jb21tYW5kX3Zfb3B0KGFyZ3YsIDApOworCWlmIChzdGF0dXMgIT0gLUVSUl9SVU5fQ09NTUFORF9FWEVDKSB7CisJCWlmIChJU19SVU5fQ09NTUFORF9FUlIoc3RhdHVzKSkKKwkJCWRpZSgidW5hYmxlIHRvIHJ1biAnJXMnIiwgYXJndlswXSk7CisJCWV4aXQoLXN0YXR1cyk7CisJfQorCWVycm5vID0gRU5PRU5UOyAvKiBhcyBpZiB3ZSBjYWxsZWQgZXhlY3ZwICovCisKKwlhcmd2WzBdID0gdG1wOworCisJc3RyYnVmX3JlbGVhc2UoJmNtZCk7Cit9CisKK3N0YXRpYyBpbnQgcnVuX2FyZ3YoaW50ICphcmdjcCwgY29uc3QgY2hhciAqKiphcmd2KQoreworCWludCBkb25lX2FsaWFzID0gMDsKKworCXdoaWxlICgxKSB7CisJCS8qIFNlZSBpZiBpdCdzIGFuIGludGVybmFsIGNvbW1hbmQgKi8KKwkJaGFuZGxlX2ludGVybmFsX2NvbW1hbmQoKmFyZ2NwLCAqYXJndik7CisKKwkJLyogLi4gdGhlbiB0cnkgdGhlIGV4dGVybmFsIG9uZXMgKi8KKwkJZXhlY3ZfZGFzaGVkX2V4dGVybmFsKCphcmd2KTsKKworCQkvKiBJdCBjb3VsZCBiZSBhbiBhbGlhcyAtLSB0aGlzIHdvcmtzIGFyb3VuZCB0aGUgaW5zYW5pdHkKKwkJICogb2Ygb3ZlcnJpZGluZyAicGVyZiBsb2ciIHdpdGggInBlcmYgc2hvdyIgYnkgaGF2aW5nCisJCSAqIGFsaWFzLmxvZyA9IHNob3cKKwkJICovCisJCWlmIChkb25lX2FsaWFzIHx8ICFoYW5kbGVfYWxpYXMoYXJnY3AsIGFyZ3YpKQorCQkJYnJlYWs7CisJCWRvbmVfYWxpYXMgPSAxOworCX0KKworCXJldHVybiBkb25lX2FsaWFzOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKK3sKKwljb25zdCBjaGFyICpjbWQ7CisKKwljbWQgPSBwZXJmX2V4dHJhY3RfYXJndjBfcGF0aChhcmd2WzBdKTsKKwlpZiAoIWNtZCkKKwkJY21kID0gInBlcmYtaGVscCI7CisKKwkvKgorCSAqICJwZXJmLXh4eHgiIGlzIHRoZSBzYW1lIGFzICJwZXJmIHh4eHgiLCBidXQgd2Ugb2J2aW91c2x5OgorCSAqCisJICogIC0gY2Fubm90IHRha2UgZmxhZ3MgaW4gYmV0d2VlbiB0aGUgInBlcmYiIGFuZCB0aGUgInh4eHgiLgorCSAqICAtIGNhbm5vdCBleGVjdXRlIGl0IGV4dGVybmFsbHkgKHNpbmNlIGl0IHdvdWxkIGp1c3QgZG8KKwkgKiAgICB0aGUgc2FtZSB0aGluZyBvdmVyIGFnYWluKQorCSAqCisJICogU28gd2UganVzdCBkaXJlY3RseSBjYWxsIHRoZSBpbnRlcm5hbCBjb21tYW5kIGhhbmRsZXIsIGFuZAorCSAqIGRpZSBpZiB0aGF0IG9uZSBjYW5ub3QgaGFuZGxlIGl0LgorCSAqLworCWlmICghcHJlZml4Y21wKGNtZCwgInBlcmYtIikpIHsKKwkJY21kICs9IDU7CisJCWFyZ3ZbMF0gPSBjbWQ7CisJCWhhbmRsZV9pbnRlcm5hbF9jb21tYW5kKGFyZ2MsIGFyZ3YpOworCQlkaWUoImNhbm5vdCBoYW5kbGUgJXMgaW50ZXJuYWxseSIsIGNtZCk7CisJfQorCisJLyogTG9vayBmb3IgZmxhZ3MuLiAqLworCWFyZ3YrKzsKKwlhcmdjLS07CisJaGFuZGxlX29wdGlvbnMoJmFyZ3YsICZhcmdjLCBOVUxMKTsKKwljb21taXRfcGFnZXJfY2hvaWNlKCk7CisJaWYgKGFyZ2MgPiAwKSB7CisJCWlmICghcHJlZml4Y21wKGFyZ3ZbMF0sICItLSIpKQorCQkJYXJndlswXSArPSAyOworCX0gZWxzZSB7CisJCS8qIFRoZSB1c2VyIGRpZG4ndCBzcGVjaWZ5IGEgY29tbWFuZDsgZ2l2ZSB0aGVtIGhlbHAgKi8KKwkJcHJpbnRmKCJcbiB1c2FnZTogJXNcblxuIiwgcGVyZl91c2FnZV9zdHJpbmcpOworCQlsaXN0X2NvbW1vbl9jbWRzX2hlbHAoKTsKKwkJcHJpbnRmKCJcbiAlc1xuXG4iLCBwZXJmX21vcmVfaW5mb19zdHJpbmcpOworCQlleGl0KDEpOworCX0KKwljbWQgPSBhcmd2WzBdOworCisJLyoKKwkgKiBXZSB1c2UgUEFUSCB0byBmaW5kIHBlcmYgY29tbWFuZHMsIGJ1dCB3ZSBwcmVwZW5kIHNvbWUgaGlnaGVyCisJICogcHJlY2lkZW5jZSBwYXRoczogdGhlICItLWV4ZWMtcGF0aCIgb3B0aW9uLCB0aGUgUEVSRl9FWEVDX1BBVEgKKwkgKiBlbnZpcm9ubWVudCwgYW5kIHRoZSAkKHBlcmZleGVjZGlyKSBmcm9tIHRoZSBNYWtlZmlsZSBhdCBidWlsZAorCSAqIHRpbWUuCisJICovCisJc2V0dXBfcGF0aCgpOworCisJd2hpbGUgKDEpIHsKKwkJc3RhdGljIGludCBkb25lX2hlbHAgPSAwOworCQlzdGF0aWMgaW50IHdhc19hbGlhcyA9IDA7CisKKwkJd2FzX2FsaWFzID0gcnVuX2FyZ3YoJmFyZ2MsICZhcmd2KTsKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkKKwkJCWJyZWFrOworCisJCWlmICh3YXNfYWxpYXMpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRXhwYW5zaW9uIG9mIGFsaWFzICclcycgZmFpbGVkOyAiCisJCQkJIiclcycgaXMgbm90IGEgcGVyZi1jb21tYW5kXG4iLAorCQkJCWNtZCwgYXJndlswXSk7CisJCQlleGl0KDEpOworCQl9CisJCWlmICghZG9uZV9oZWxwKSB7CisJCQljbWQgPSBhcmd2WzBdID0gaGVscF91bmtub3duX2NtZChjbWQpOworCQkJZG9uZV9oZWxwID0gMTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBydW4gY29tbWFuZCAnJXMnOiAlc1xuIiwKKwkJY21kLCBzdHJlcnJvcihlcnJubykpOworCisJcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3BlcmYuaCBiL3Rvb2xzL3BlcmYvcGVyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmMGE1MDQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3BlcmYuaApAQCAtMCwwICsxLDY3IEBACisjaWZuZGVmIF9QRVJGX1BFUkZfSAorI2RlZmluZSBfUEVSRl9QRVJGX0gKKworI2lmIGRlZmluZWQoX194ODZfNjRfXykgfHwgZGVmaW5lZChfX2kzODZfXykKKyNpbmNsdWRlICIuLi8uLi9hcmNoL3g4Ni9pbmNsdWRlL2FzbS91bmlzdGQuaCIKKyNkZWZpbmUgcm1iKCkJCWFzbSB2b2xhdGlsZSgibGZlbmNlIiA6OjogIm1lbW9yeSIpCisjZGVmaW5lIGNwdV9yZWxheCgpCWFzbSB2b2xhdGlsZSgicmVwOyBub3AiIDo6OiAibWVtb3J5Iik7CisjZW5kaWYKKworI2lmZGVmIF9fcG93ZXJwY19fCisjaW5jbHVkZSAiLi4vLi4vYXJjaC9wb3dlcnBjL2luY2x1ZGUvYXNtL3VuaXN0ZC5oIgorI2RlZmluZSBybWIoKQkJYXNtIHZvbGF0aWxlICgic3luYyIgOjo6ICJtZW1vcnkiKQorI2RlZmluZSBjcHVfcmVsYXgoKQlhc20gdm9sYXRpbGUgKCIiIDo6OiAibWVtb3J5Iik7CisjZW5kaWYKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaW5jbHVkZSAiLi4vLi4vaW5jbHVkZS9saW51eC9wZXJmX2NvdW50ZXIuaCIKKworLyoKKyAqIHByY3RsKFBSX1RBU0tfUEVSRl9DT1VOVEVSU19ESVNBQkxFKSB3aWxsIChjaGVhcGx5KSBkaXNhYmxlIGFsbAorICogY291bnRlcnMgaW4gdGhlIGN1cnJlbnQgdGFzay4KKyAqLworI2RlZmluZSBQUl9UQVNLX1BFUkZfQ09VTlRFUlNfRElTQUJMRSAgIDMxCisjZGVmaW5lIFBSX1RBU0tfUEVSRl9DT1VOVEVSU19FTkFCTEUgICAgMzIKKworI2lmbmRlZiBOU0VDX1BFUl9TRUMKKyMgZGVmaW5lIE5TRUNfUEVSX1NFQwkJCTEwMDAwMDAwMDBVTEwKKyNlbmRpZgorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyByZGNsb2NrKHZvaWQpCit7CisJc3RydWN0IHRpbWVzcGVjIHRzOworCisJY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisJcmV0dXJuIHRzLnR2X3NlYyAqIDEwMDAwMDAwMDBVTEwgKyB0cy50dl9uc2VjOworfQorCisvKgorICogUGljayB1cCBzb21lIGtlcm5lbCB0eXBlIGNvbnZlbnRpb25zOgorICovCisjZGVmaW5lIF9fdXNlcgorI2RlZmluZSBhc21saW5rYWdlCisKKyNkZWZpbmUgdW5saWtlbHkoeCkJX19idWlsdGluX2V4cGVjdCghISh4KSwgMCkKKyNkZWZpbmUgbWluKHgsIHkpICh7CQkJCVwKKwl0eXBlb2YoeCkgX21pbjEgPSAoeCk7CQkJXAorCXR5cGVvZih5KSBfbWluMiA9ICh5KTsJCQlcCisJKHZvaWQpICgmX21pbjEgPT0gJl9taW4yKTsJCVwKKwlfbWluMSA8IF9taW4yID8gX21pbjEgOiBfbWluMjsgfSkKKworc3RhdGljIGlubGluZSBpbnQKK3N5c19wZXJmX2NvdW50ZXJfb3BlbihzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgKmF0dHJfdXB0ciwKKwkJICAgICAgcGlkX3QgcGlkLCBpbnQgY3B1LCBpbnQgZ3JvdXBfZmQsCisJCSAgICAgIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCit7CisJcmV0dXJuIHN5c2NhbGwoX19OUl9wZXJmX2NvdW50ZXJfb3BlbiwgYXR0cl91cHRyLCBwaWQsIGNwdSwKKwkJICAgICAgIGdyb3VwX2ZkLCBmbGFncyk7Cit9CisKKyNkZWZpbmUgTUFYX0NPVU5URVJTCQkJMjU2CisjZGVmaW5lIE1BWF9OUl9DUFVTCQkJMjU2CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL1BFUkYtVkVSU0lPTi1HRU4gYi90b29scy9wZXJmL3V0aWwvUEVSRi1WRVJTSU9OLUdFTgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5jNTYxZDE1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL1BFUkYtVkVSU0lPTi1HRU4KQEAgLTAsMCArMSw0MiBAQAorIyEvYmluL3NoCisKK0dWRj1QRVJGLVZFUlNJT04tRklMRQorREVGX1ZFUj12MC4wLjEuUEVSRgorCitMRj0nCisnCisKKyMgRmlyc3Qgc2VlIGlmIHRoZXJlIGlzIGEgdmVyc2lvbiBmaWxlIChpbmNsdWRlZCBpbiByZWxlYXNlIHRhcmJhbGxzKSwKKyMgdGhlbiB0cnkgZ2l0LWRlc2NyaWJlLCB0aGVuIGRlZmF1bHQuCitpZiB0ZXN0IC1mIHZlcnNpb24KK3RoZW4KKwlWTj0kKGNhdCB2ZXJzaW9uKSB8fCBWTj0iJERFRl9WRVIiCitlbGlmIHRlc3QgLWQgLmdpdCAtbyAtZiAuZ2l0ICYmCisJVk49JChnaXQgZGVzY3JpYmUgLS1hYmJyZXY9NCBIRUFEIDI+L2Rldi9udWxsKSAmJgorCWNhc2UgIiRWTiIgaW4KKwkqJExGKikgKGV4aXQgMSkgOzsKKwl2WzAtOV0qKQorCQlnaXQgdXBkYXRlLWluZGV4IC1xIC0tcmVmcmVzaAorCQl0ZXN0IC16ICIkKGdpdCBkaWZmLWluZGV4IC0tbmFtZS1vbmx5IEhFQUQgLS0pIiB8fAorCQlWTj0iJFZOLWRpcnR5IiA7OworCWVzYWMKK3RoZW4KKwlWTj0kKGVjaG8gIiRWTiIgfCBzZWQgLWUgJ3MvLS8uL2cnKTsKK2Vsc2UKKwlWTj0iJERFRl9WRVIiCitmaQorCitWTj0kKGV4cHIgIiRWTiIgOiB2KidcKC4qXCknKQorCitpZiB0ZXN0IC1yICRHVkYKK3RoZW4KKwlWQz0kKHNlZCAtZSAncy9eUEVSRl9WRVJTSU9OID0gLy8nIDwkR1ZGKQorZWxzZQorCVZDPXVuc2V0CitmaQordGVzdCAiJFZOIiA9ICIkVkMiIHx8IHsKKwllY2hvID4mMiAiUEVSRl9WRVJTSU9OID0gJFZOIgorCWVjaG8gIlBFUkZfVkVSU0lPTiA9ICRWTiIgPiRHVkYKK30KKworCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvYWJzcGF0aC5jIGIvdG9vbHMvcGVyZi91dGlsL2Fic3BhdGguYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWQzM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2Fic3BhdGguYwpAQCAtMCwwICsxLDExNyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKKy8qCisgKiBEbyBub3QgdXNlIHRoaXMgZm9yIGluc3BlY3RpbmcgKnRyYWNrZWQqIGNvbnRlbnQuICBXaGVuIHBhdGggaXMgYQorICogc3ltbGluayB0byBhIGRpcmVjdG9yeSwgd2UgZG8gbm90IHdhbnQgdG8gc2F5IGl0IGlzIGEgZGlyZWN0b3J5IHdoZW4KKyAqIGRlYWxpbmcgd2l0aCB0cmFja2VkIGNvbnRlbnQgaW4gdGhlIHdvcmtpbmcgdHJlZS4KKyAqLworc3RhdGljIGludCBpc19kaXJlY3RvcnkoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwlyZXR1cm4gKCFzdGF0KHBhdGgsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSk7Cit9CisKKy8qIFdlIGFsbG93ICJyZWN1cnNpdmUiIHN5bWJvbGljIGxpbmtzLiBPbmx5IHdpdGhpbiByZWFzb24sIHRob3VnaC4gKi8KKyNkZWZpbmUgTUFYREVQVEggNQorCitjb25zdCBjaGFyICptYWtlX2Fic29sdXRlX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdGF0aWMgY2hhciBidWZzWzJdW1BBVEhfTUFYICsgMV0sICpidWYgPSBidWZzWzBdLCAqbmV4dF9idWYgPSBidWZzWzFdOworCWNoYXIgY3dkWzEwMjRdID0gIiI7CisJaW50IGJ1Zl9pbmRleCA9IDEsIGxlbjsKKworCWludCBkZXB0aCA9IE1BWERFUFRIOworCWNoYXIgKmxhc3RfZWxlbSA9IE5VTEw7CisJc3RydWN0IHN0YXQgc3Q7CisKKwlpZiAoc3RybGNweShidWYsIHBhdGgsIFBBVEhfTUFYKSA+PSBQQVRIX01BWCkKKwkJZGllICgiVG9vIGxvbmcgcGF0aDogJS4qcyIsIDYwLCBwYXRoKTsKKworCXdoaWxlIChkZXB0aC0tKSB7CisJCWlmICghaXNfZGlyZWN0b3J5KGJ1ZikpIHsKKwkJCWNoYXIgKmxhc3Rfc2xhc2ggPSBzdHJyY2hyKGJ1ZiwgJy8nKTsKKwkJCWlmIChsYXN0X3NsYXNoKSB7CisJCQkJKmxhc3Rfc2xhc2ggPSAnXDAnOworCQkJCWxhc3RfZWxlbSA9IHhzdHJkdXAobGFzdF9zbGFzaCArIDEpOworCQkJfSBlbHNlIHsKKwkJCQlsYXN0X2VsZW0gPSB4c3RyZHVwKGJ1Zik7CisJCQkJKmJ1ZiA9ICdcMCc7CisJCQl9CisJCX0KKworCQlpZiAoKmJ1ZikgeworCQkJaWYgKCEqY3dkICYmICFnZXRjd2QoY3dkLCBzaXplb2YoY3dkKSkpCisJCQkJZGllICgiQ291bGQgbm90IGdldCBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisKKwkJCWlmIChjaGRpcihidWYpKQorCQkJCWRpZSAoIkNvdWxkIG5vdCBzd2l0Y2ggdG8gJyVzJyIsIGJ1Zik7CisJCX0KKwkJaWYgKCFnZXRjd2QoYnVmLCBQQVRIX01BWCkpCisJCQlkaWUgKCJDb3VsZCBub3QgZ2V0IGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkiKTsKKworCQlpZiAobGFzdF9lbGVtKSB7CisJCQlpbnQgbGVuID0gc3RybGVuKGJ1Zik7CisJCQlpZiAobGVuICsgc3RybGVuKGxhc3RfZWxlbSkgKyAyID4gUEFUSF9NQVgpCisJCQkJZGllICgiVG9vIGxvbmcgcGF0aCBuYW1lOiAnJXMvJXMnIiwKKwkJCQkJCWJ1ZiwgbGFzdF9lbGVtKTsKKwkJCWJ1ZltsZW5dID0gJy8nOworCQkJc3RyY3B5KGJ1ZiArIGxlbiArIDEsIGxhc3RfZWxlbSk7CisJCQlmcmVlKGxhc3RfZWxlbSk7CisJCQlsYXN0X2VsZW0gPSBOVUxMOworCQl9CisKKwkJaWYgKCFsc3RhdChidWYsICZzdCkgJiYgU19JU0xOSyhzdC5zdF9tb2RlKSkgeworCQkJbGVuID0gcmVhZGxpbmsoYnVmLCBuZXh0X2J1ZiwgUEFUSF9NQVgpOworCQkJaWYgKGxlbiA8IDApCisJCQkJZGllICgiSW52YWxpZCBzeW1saW5rOiAlcyIsIGJ1Zik7CisJCQlpZiAoUEFUSF9NQVggPD0gbGVuKQorCQkJCWRpZSgic3ltYm9saWMgbGluayB0b28gbG9uZzogJXMiLCBidWYpOworCQkJbmV4dF9idWZbbGVuXSA9ICdcMCc7CisJCQlidWYgPSBuZXh0X2J1ZjsKKwkJCWJ1Zl9pbmRleCA9IDEgLSBidWZfaW5kZXg7CisJCQluZXh0X2J1ZiA9IGJ1ZnNbYnVmX2luZGV4XTsKKwkJfSBlbHNlCisJCQlicmVhazsKKwl9CisKKwlpZiAoKmN3ZCAmJiBjaGRpcihjd2QpKQorCQlkaWUgKCJDb3VsZCBub3QgY2hhbmdlIGJhY2sgdG8gJyVzJyIsIGN3ZCk7CisKKwlyZXR1cm4gYnVmOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3B3ZF9jd2Qodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBjd2RbUEFUSF9NQVggKyAxXTsKKwljaGFyICpwd2Q7CisJc3RydWN0IHN0YXQgY3dkX3N0YXQsIHB3ZF9zdGF0OworCWlmIChnZXRjd2QoY3dkLCBQQVRIX01BWCkgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisJcHdkID0gZ2V0ZW52KCJQV0QiKTsKKwlpZiAocHdkICYmIHN0cmNtcChwd2QsIGN3ZCkpIHsKKwkJc3RhdChjd2QsICZjd2Rfc3RhdCk7CisJCWlmICghc3RhdChwd2QsICZwd2Rfc3RhdCkgJiYKKwkJICAgIHB3ZF9zdGF0LnN0X2RldiA9PSBjd2Rfc3RhdC5zdF9kZXYgJiYKKwkJICAgIHB3ZF9zdGF0LnN0X2lubyA9PSBjd2Rfc3RhdC5zdF9pbm8pIHsKKwkJCXN0cmxjcHkoY3dkLCBwd2QsIFBBVEhfTUFYKTsKKwkJfQorCX0KKwlyZXR1cm4gY3dkOworfQorCitjb25zdCBjaGFyICptYWtlX25vbnJlbGF0aXZlX3BhdGgoY29uc3QgY2hhciAqcGF0aCkKK3sKKwlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVggKyAxXTsKKworCWlmIChpc19hYnNvbHV0ZV9wYXRoKHBhdGgpKSB7CisJCWlmIChzdHJsY3B5KGJ1ZiwgcGF0aCwgUEFUSF9NQVgpID49IFBBVEhfTUFYKQorCQkJZGllKCJUb28gbG9uZyBwYXRoOiAlLipzIiwgNjAsIHBhdGgpOworCX0gZWxzZSB7CisJCWNvbnN0IGNoYXIgKmN3ZCA9IGdldF9wd2RfY3dkKCk7CisJCWlmICghY3dkKQorCQkJZGllKCJDYW5ub3QgZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5Iik7CisJCWlmIChzbnByaW50ZihidWYsIFBBVEhfTUFYLCAiJXMvJXMiLCBjd2QsIHBhdGgpID49IFBBVEhfTUFYKQorCQkJZGllKCJUb28gbG9uZyBwYXRoOiAlLipzIiwgNjAsIHBhdGgpOworCX0KKwlyZXR1cm4gYnVmOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2FsaWFzLmMgYi90b29scy9wZXJmL3V0aWwvYWxpYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjNkZDJiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2FsaWFzLmMKQEAgLTAsMCArMSw3NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK3N0YXRpYyBjb25zdCBjaGFyICphbGlhc19rZXk7CitzdGF0aWMgY2hhciAqYWxpYXNfdmFsOworCitzdGF0aWMgaW50IGFsaWFzX2xvb2t1cF9jYihjb25zdCBjaGFyICprLCBjb25zdCBjaGFyICp2LCB2b2lkICpjYikKK3sKKwlpZiAoIXByZWZpeGNtcChrLCAiYWxpYXMuIikgJiYgIXN0cmNtcChrKzYsIGFsaWFzX2tleSkpIHsKKwkJaWYgKCF2KQorCQkJcmV0dXJuIGNvbmZpZ19lcnJvcl9ub25ib29sKGspOworCQlhbGlhc192YWwgPSBzdHJkdXAodik7CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKworY2hhciAqYWxpYXNfbG9va3VwKGNvbnN0IGNoYXIgKmFsaWFzKQoreworCWFsaWFzX2tleSA9IGFsaWFzOworCWFsaWFzX3ZhbCA9IE5VTEw7CisJcGVyZl9jb25maWcoYWxpYXNfbG9va3VwX2NiLCBOVUxMKTsKKwlyZXR1cm4gYWxpYXNfdmFsOworfQorCitpbnQgc3BsaXRfY21kbGluZShjaGFyICpjbWRsaW5lLCBjb25zdCBjaGFyICoqKmFyZ3YpCit7CisJaW50IHNyYywgZHN0LCBjb3VudCA9IDAsIHNpemUgPSAxNjsKKwljaGFyIHF1b3RlZCA9IDA7CisKKwkqYXJndiA9IG1hbGxvYyhzaXplb2YoY2hhciopICogc2l6ZSk7CisKKwkvKiBzcGxpdCBhbGlhc19zdHJpbmcgKi8KKwkoKmFyZ3YpW2NvdW50KytdID0gY21kbGluZTsKKwlmb3IgKHNyYyA9IGRzdCA9IDA7IGNtZGxpbmVbc3JjXTspIHsKKwkJY2hhciBjID0gY21kbGluZVtzcmNdOworCQlpZiAoIXF1b3RlZCAmJiBpc3NwYWNlKGMpKSB7CisJCQljbWRsaW5lW2RzdCsrXSA9IDA7CisJCQl3aGlsZSAoY21kbGluZVsrK3NyY10KKwkJCQkJJiYgaXNzcGFjZShjbWRsaW5lW3NyY10pKQorCQkJCTsgLyogc2tpcCAqLworCQkJaWYgKGNvdW50ID49IHNpemUpIHsKKwkJCQlzaXplICs9IDE2OworCQkJCSphcmd2ID0gcmVhbGxvYygqYXJndiwgc2l6ZW9mKGNoYXIqKSAqIHNpemUpOworCQkJfQorCQkJKCphcmd2KVtjb3VudCsrXSA9IGNtZGxpbmUgKyBkc3Q7CisJCX0gZWxzZSBpZiAoIXF1b3RlZCAmJiAoYyA9PSAnXCcnIHx8IGMgPT0gJyInKSkgeworCQkJcXVvdGVkID0gYzsKKwkJCXNyYysrOworCQl9IGVsc2UgaWYgKGMgPT0gcXVvdGVkKSB7CisJCQlxdW90ZWQgPSAwOworCQkJc3JjKys7CisJCX0gZWxzZSB7CisJCQlpZiAoYyA9PSAnXFwnICYmIHF1b3RlZCAhPSAnXCcnKSB7CisJCQkJc3JjKys7CisJCQkJYyA9IGNtZGxpbmVbc3JjXTsKKwkJCQlpZiAoIWMpIHsKKwkJCQkJZnJlZSgqYXJndik7CisJCQkJCSphcmd2ID0gTlVMTDsKKwkJCQkJcmV0dXJuIGVycm9yKCJjbWRsaW5lIGVuZHMgd2l0aCBcXCIpOworCQkJCX0KKwkJCX0KKwkJCWNtZGxpbmVbZHN0KytdID0gYzsKKwkJCXNyYysrOworCQl9CisJfQorCisJY21kbGluZVtkc3RdID0gMDsKKworCWlmIChxdW90ZWQpIHsKKwkJZnJlZSgqYXJndik7CisJCSphcmd2ID0gTlVMTDsKKwkJcmV0dXJuIGVycm9yKCJ1bmNsb3NlZCBxdW90ZSIpOworCX0KKworCXJldHVybiBjb3VudDsKK30KKwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2NhY2hlLmggYi90b29scy9wZXJmL3V0aWwvY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTNkNjE0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NhY2hlLmgKQEAgLTAsMCArMSwxMTkgQEAKKyNpZm5kZWYgQ0FDSEVfSAorI2RlZmluZSBDQUNIRV9ICisKKyNpbmNsdWRlICJ1dGlsLmgiCisjaW5jbHVkZSAic3RyYnVmLmgiCisKKyNkZWZpbmUgUEVSRl9ESVJfRU5WSVJPTk1FTlQgIlBFUkZfRElSIgorI2RlZmluZSBQRVJGX1dPUktfVFJFRV9FTlZJUk9OTUVOVCAiUEVSRl9XT1JLX1RSRUUiCisjZGVmaW5lIERFRkFVTFRfUEVSRl9ESVJfRU5WSVJPTk1FTlQgIi5wZXJmIgorI2RlZmluZSBEQl9FTlZJUk9OTUVOVCAiUEVSRl9PQkpFQ1RfRElSRUNUT1JZIgorI2RlZmluZSBJTkRFWF9FTlZJUk9OTUVOVCAiUEVSRl9JTkRFWF9GSUxFIgorI2RlZmluZSBHUkFGVF9FTlZJUk9OTUVOVCAiUEVSRl9HUkFGVF9GSUxFIgorI2RlZmluZSBURU1QTEFURV9ESVJfRU5WSVJPTk1FTlQgIlBFUkZfVEVNUExBVEVfRElSIgorI2RlZmluZSBDT05GSUdfRU5WSVJPTk1FTlQgIlBFUkZfQ09ORklHIgorI2RlZmluZSBFWEVDX1BBVEhfRU5WSVJPTk1FTlQgIlBFUkZfRVhFQ19QQVRIIgorI2RlZmluZSBDRUlMSU5HX0RJUkVDVE9SSUVTX0VOVklST05NRU5UICJQRVJGX0NFSUxJTkdfRElSRUNUT1JJRVMiCisjZGVmaW5lIFBFUkZBVFRSSUJVVEVTX0ZJTEUgIi5wZXJmYXR0cmlidXRlcyIKKyNkZWZpbmUgSU5GT0FUVFJJQlVURVNfRklMRSAiaW5mby9hdHRyaWJ1dGVzIgorI2RlZmluZSBBVFRSSUJVVEVfTUFDUk9fUFJFRklYICJbYXR0cl0iCisKK3R5cGVkZWYgaW50ICgqY29uZmlnX2ZuX3QpKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2b2lkICopOworZXh0ZXJuIGludCBwZXJmX2RlZmF1bHRfY29uZmlnKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCB2b2lkICopOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19mcm9tX2ZpbGUoY29uZmlnX2ZuX3QgZm4sIGNvbnN0IGNoYXIgKiwgdm9pZCAqKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWcoY29uZmlnX2ZuX3QgZm4sIHZvaWQgKik7CitleHRlcm4gaW50IHBlcmZfcGFyc2VfdWxvbmcoY29uc3QgY2hhciAqLCB1bnNpZ25lZCBsb25nICopOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19pbnQoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGVyZl9jb25maWdfdWxvbmcoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICopOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19ib29sX29yX2ludChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50ICopOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19ib29sKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWdfc3RyaW5nKGNvbnN0IGNoYXIgKiosIGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWdfc2V0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWdfc2V0X211bHRpdmFyKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gaW50IHBlcmZfY29uZmlnX3JlbmFtZV9zZWN0aW9uKGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBjb25zdCBjaGFyICpwZXJmX2V0Y19wZXJmY29uZmlnKHZvaWQpOworZXh0ZXJuIGludCBjaGVja19yZXBvc2l0b3J5X2Zvcm1hdF92ZXJzaW9uKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmNiKTsKK2V4dGVybiBpbnQgcGVyZl9jb25maWdfc3lzdGVtKHZvaWQpOworZXh0ZXJuIGludCBwZXJmX2NvbmZpZ19nbG9iYWwodm9pZCk7CitleHRlcm4gaW50IGNvbmZpZ19lcnJvcl9ub25ib29sKGNvbnN0IGNoYXIgKik7CitleHRlcm4gY29uc3QgY2hhciAqY29uZmlnX2V4Y2x1c2l2ZV9maWxlbmFtZTsKKworI2RlZmluZSBNQVhfUEVSRk5BTUUgKDEwMDApCitleHRlcm4gY2hhciBwZXJmX2RlZmF1bHRfZW1haWxbTUFYX1BFUkZOQU1FXTsKK2V4dGVybiBjaGFyIHBlcmZfZGVmYXVsdF9uYW1lW01BWF9QRVJGTkFNRV07CitleHRlcm4gaW50IHVzZXJfaWRlbnRfZXhwbGljaXRseV9naXZlbjsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKnBlcmZfbG9nX291dHB1dF9lbmNvZGluZzsKK2V4dGVybiBjb25zdCBjaGFyICpwZXJmX21haWxtYXBfZmlsZTsKKworLyogSU8gaGVscGVyIGZ1bmN0aW9ucyAqLworZXh0ZXJuIHZvaWQgbWF5YmVfZmx1c2hfb3JfZGllKEZJTEUgKiwgY29uc3QgY2hhciAqKTsKK2V4dGVybiBpbnQgY29weV9mZChpbnQgaWZkLCBpbnQgb2ZkKTsKK2V4dGVybiBpbnQgY29weV9maWxlKGNvbnN0IGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBpbnQgbW9kZSk7CitleHRlcm4gc3NpemVfdCByZWFkX2luX2Z1bGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CitleHRlcm4gc3NpemVfdCB3cml0ZV9pbl9mdWxsKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOworZXh0ZXJuIHZvaWQgd3JpdGVfb3JfZGllKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQpOworZXh0ZXJuIGludCB3cml0ZV9vcl93aGluZShpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50LCBjb25zdCBjaGFyICptc2cpOworZXh0ZXJuIGludCB3cml0ZV9vcl93aGluZV9waXBlKGludCBmZCwgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKm1zZyk7CitleHRlcm4gdm9pZCBmc3luY19vcl9kaWUoaW50IGZkLCBjb25zdCBjaGFyICopOworCisvKiBwYWdlci5jICovCitleHRlcm4gdm9pZCBzZXR1cF9wYWdlcih2b2lkKTsKK2V4dGVybiBjb25zdCBjaGFyICpwYWdlcl9wcm9ncmFtOworZXh0ZXJuIGludCBwYWdlcl9pbl91c2Uodm9pZCk7CitleHRlcm4gaW50IHBhZ2VyX3VzZV9jb2xvcjsKKworZXh0ZXJuIGNvbnN0IGNoYXIgKmVkaXRvcl9wcm9ncmFtOworZXh0ZXJuIGNvbnN0IGNoYXIgKmV4Y2x1ZGVzX2ZpbGU7CisKK2NoYXIgKmFsaWFzX2xvb2t1cChjb25zdCBjaGFyICphbGlhcyk7CitpbnQgc3BsaXRfY21kbGluZShjaGFyICpjbWRsaW5lLCBjb25zdCBjaGFyICoqKmFyZ3YpOworCisjZGVmaW5lIGFsbG9jX25yKHgpICgoKHgpKzE2KSozLzIpCisKKy8qCisgKiBSZWFsbG9jIHRoZSBidWZmZXIgcG9pbnRlZCBhdCBieSB2YXJpYWJsZSAneCcgc28gdGhhdCBpdCBjYW4gaG9sZAorICogYXQgbGVhc3QgJ25yJyBlbnRyaWVzOyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgY3VycmVudGx5IGFsbG9jYXRlZAorICogaXMgJ2FsbG9jJywgdXNpbmcgdGhlIHN0YW5kYXJkIGdyb3dpbmcgZmFjdG9yIGFsbG9jX25yKCkgbWFjcm8uCisgKgorICogRE8gTk9UIFVTRSBhbnkgZXhwcmVzc2lvbiB3aXRoIHNpZGUtZWZmZWN0IGZvciAneCcgb3IgJ2FsbG9jJy4KKyAqLworI2RlZmluZSBBTExPQ19HUk9XKHgsIG5yLCBhbGxvYykgXAorCWRvIHsgXAorCQlpZiAoKG5yKSA+IGFsbG9jKSB7IFwKKwkJCWlmIChhbGxvY19ucihhbGxvYykgPCAobnIpKSBcCisJCQkJYWxsb2MgPSAobnIpOyBcCisJCQllbHNlIFwKKwkJCQlhbGxvYyA9IGFsbG9jX25yKGFsbG9jKTsgXAorCQkJeCA9IHhyZWFsbG9jKCh4KSwgYWxsb2MgKiBzaXplb2YoKih4KSkpOyBcCisJCX0gXAorCX0gd2hpbGUoMCkKKworCitzdGF0aWMgaW5saW5lIGludCBpc19hYnNvbHV0ZV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpCit7CisJcmV0dXJuIHBhdGhbMF0gPT0gJy8nOworfQorCitjb25zdCBjaGFyICptYWtlX2Fic29sdXRlX3BhdGgoY29uc3QgY2hhciAqcGF0aCk7Citjb25zdCBjaGFyICptYWtlX25vbnJlbGF0aXZlX3BhdGgoY29uc3QgY2hhciAqcGF0aCk7Citjb25zdCBjaGFyICptYWtlX3JlbGF0aXZlX3BhdGgoY29uc3QgY2hhciAqYWJzLCBjb25zdCBjaGFyICpiYXNlKTsKK2ludCBub3JtYWxpemVfcGF0aF9jb3B5KGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjKTsKK2ludCBsb25nZXN0X2FuY2VzdG9yX2xlbmd0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpwcmVmaXhfbGlzdCk7CitjaGFyICpzdHJpcF9wYXRoX3N1ZmZpeChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpzdWZmaXgpOworCitleHRlcm4gY2hhciAqbWtwYXRoKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiBjaGFyICpwZXJmX3BhdGgoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworLyogcGVyZl9ta3N0ZW1wKCkgLSBjcmVhdGUgdG1wIGZpbGUgaG9ub3JpbmcgVE1QRElSIHZhcmlhYmxlICovCitleHRlcm4gaW50IHBlcmZfbWtzdGVtcChjaGFyICpwYXRoLCBzaXplX3QgbGVuLCBjb25zdCBjaGFyICp0ZW1wbGF0ZSk7CisKK2V4dGVybiBjaGFyICpta3NucGF0aChjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBjaGFyICpwZXJmX3NucGF0aChjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmbXQsIC4uLikKKwlfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMywgNCkpKTsKK2V4dGVybiBjaGFyICpwZXJmX3BhdGhkdXAoY29uc3QgY2hhciAqZm10LCAuLi4pCisJX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK2V4dGVybiBzaXplX3Qgc3RybGNweShjaGFyICpkZXN0LCBjb25zdCBjaGFyICpzcmMsIHNpemVfdCBzaXplKTsKKworI2VuZGlmIC8qIENBQ0hFX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jb2xvci5jIGIvdG9vbHMvcGVyZi91dGlsL2NvbG9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE4YzIwYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9jb2xvci5jCkBAIC0wLDAgKzEsMjQxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJjb2xvci5oIgorCitpbnQgcGVyZl91c2VfY29sb3JfZGVmYXVsdCA9IC0xOworCitzdGF0aWMgaW50IHBhcnNlX2NvbG9yKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBjb2xvcl9uYW1lc1tdID0geworCQkibm9ybWFsIiwgImJsYWNrIiwgInJlZCIsICJncmVlbiIsICJ5ZWxsb3ciLAorCQkiYmx1ZSIsICJtYWdlbnRhIiwgImN5YW4iLCAid2hpdGUiCisJfTsKKwljaGFyICplbmQ7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoY29sb3JfbmFtZXMpOyBpKyspIHsKKwkJY29uc3QgY2hhciAqc3RyID0gY29sb3JfbmFtZXNbaV07CisJCWlmICghc3RybmNhc2VjbXAobmFtZSwgc3RyLCBsZW4pICYmICFzdHJbbGVuXSkKKwkJCXJldHVybiBpIC0gMTsKKwl9CisJaSA9IHN0cnRvbChuYW1lLCAmZW5kLCAxMCk7CisJaWYgKGVuZCAtIG5hbWUgPT0gbGVuICYmIGkgPj0gLTEgJiYgaSA8PSAyNTUpCisJCXJldHVybiBpOworCXJldHVybiAtMjsKK30KKworc3RhdGljIGludCBwYXJzZV9hdHRyKGNvbnN0IGNoYXIgKm5hbWUsIGludCBsZW4pCit7CisJc3RhdGljIGNvbnN0IGludCBhdHRyX3ZhbHVlc1tdID0geyAxLCAyLCA0LCA1LCA3IH07CisJc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdHRyX25hbWVzW10gPSB7CisJCSJib2xkIiwgImRpbSIsICJ1bCIsICJibGluayIsICJyZXZlcnNlIgorCX07CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYXR0cl9uYW1lcyk7IGkrKykgeworCQljb25zdCBjaGFyICpzdHIgPSBhdHRyX25hbWVzW2ldOworCQlpZiAoIXN0cm5jYXNlY21wKG5hbWUsIHN0ciwgbGVuKSAmJiAhc3RyW2xlbl0pCisJCQlyZXR1cm4gYXR0cl92YWx1ZXNbaV07CisJfQorCXJldHVybiAtMTsKK30KKwordm9pZCBjb2xvcl9wYXJzZShjb25zdCBjaGFyICp2YWx1ZSwgY29uc3QgY2hhciAqdmFyLCBjaGFyICpkc3QpCit7CisJY29sb3JfcGFyc2VfbWVtKHZhbHVlLCBzdHJsZW4odmFsdWUpLCB2YXIsIGRzdCk7Cit9CisKK3ZvaWQgY29sb3JfcGFyc2VfbWVtKGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgdmFsdWVfbGVuLCBjb25zdCBjaGFyICp2YXIsCisJCWNoYXIgKmRzdCkKK3sKKwljb25zdCBjaGFyICpwdHIgPSB2YWx1ZTsKKwlpbnQgbGVuID0gdmFsdWVfbGVuOworCWludCBhdHRyID0gLTE7CisJaW50IGZnID0gLTI7CisJaW50IGJnID0gLTI7CisKKwlpZiAoIXN0cm5jYXNlY21wKHZhbHVlLCAicmVzZXQiLCBsZW4pKSB7CisJCXN0cmNweShkc3QsIFBFUkZfQ09MT1JfUkVTRVQpOworCQlyZXR1cm47CisJfQorCisJLyogW2ZnIFtiZ11dIFthdHRyXSAqLworCXdoaWxlIChsZW4gPiAwKSB7CisJCWNvbnN0IGNoYXIgKndvcmQgPSBwdHI7CisJCWludCB2YWwsIHdvcmRsZW4gPSAwOworCisJCXdoaWxlIChsZW4gPiAwICYmICFpc3NwYWNlKHdvcmRbd29yZGxlbl0pKSB7CisJCQl3b3JkbGVuKys7CisJCQlsZW4tLTsKKwkJfQorCisJCXB0ciA9IHdvcmQgKyB3b3JkbGVuOworCQl3aGlsZSAobGVuID4gMCAmJiBpc3NwYWNlKCpwdHIpKSB7CisJCQlwdHIrKzsKKwkJCWxlbi0tOworCQl9CisKKwkJdmFsID0gcGFyc2VfY29sb3Iod29yZCwgd29yZGxlbik7CisJCWlmICh2YWwgPj0gLTEpIHsKKwkJCWlmIChmZyA9PSAtMikgeworCQkJCWZnID0gdmFsOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJaWYgKGJnID09IC0yKSB7CisJCQkJYmcgPSB2YWw7CisJCQkJY29udGludWU7CisJCQl9CisJCQlnb3RvIGJhZDsKKwkJfQorCQl2YWwgPSBwYXJzZV9hdHRyKHdvcmQsIHdvcmRsZW4pOworCQlpZiAodmFsIDwgMCB8fCBhdHRyICE9IC0xKQorCQkJZ290byBiYWQ7CisJCWF0dHIgPSB2YWw7CisJfQorCisJaWYgKGF0dHIgPj0gMCB8fCBmZyA+PSAwIHx8IGJnID49IDApIHsKKwkJaW50IHNlcCA9IDA7CisKKwkJKmRzdCsrID0gJ1wwMzMnOworCQkqZHN0KysgPSAnWyc7CisJCWlmIChhdHRyID49IDApIHsKKwkJCSpkc3QrKyA9ICcwJyArIGF0dHI7CisJCQlzZXArKzsKKwkJfQorCQlpZiAoZmcgPj0gMCkgeworCQkJaWYgKHNlcCsrKQorCQkJCSpkc3QrKyA9ICc7JzsKKwkJCWlmIChmZyA8IDgpIHsKKwkJCQkqZHN0KysgPSAnMyc7CisJCQkJKmRzdCsrID0gJzAnICsgZmc7CisJCQl9IGVsc2UgeworCQkJCWRzdCArPSBzcHJpbnRmKGRzdCwgIjM4OzU7JWQiLCBmZyk7CisJCQl9CisJCX0KKwkJaWYgKGJnID49IDApIHsKKwkJCWlmIChzZXArKykKKwkJCQkqZHN0KysgPSAnOyc7CisJCQlpZiAoYmcgPCA4KSB7CisJCQkJKmRzdCsrID0gJzQnOworCQkJCSpkc3QrKyA9ICcwJyArIGJnOworCQkJfSBlbHNlIHsKKwkJCQlkc3QgKz0gc3ByaW50Zihkc3QsICI0ODs1OyVkIiwgYmcpOworCQkJfQorCQl9CisJCSpkc3QrKyA9ICdtJzsKKwl9CisJKmRzdCA9IDA7CisJcmV0dXJuOworYmFkOgorCWRpZSgiYmFkIGNvbG9yIHZhbHVlICclLipzJyBmb3IgdmFyaWFibGUgJyVzJyIsIHZhbHVlX2xlbiwgdmFsdWUsIHZhcik7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19jb2xvcmJvb2woY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgaW50IHN0ZG91dF9pc190dHkpCit7CisJaWYgKHZhbHVlKSB7CisJCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgIm5ldmVyIikpCisJCQlyZXR1cm4gMDsKKwkJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiYWx3YXlzIikpCisJCQlyZXR1cm4gMTsKKwkJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiYXV0byIpKQorCQkJZ290byBhdXRvX2NvbG9yOworCX0KKworCS8qIE1pc3Npbmcgb3IgZXhwbGljaXQgZmFsc2UgdG8gdHVybiBvZmYgY29sb3JpemF0aW9uICovCisJaWYgKCFwZXJmX2NvbmZpZ19ib29sKHZhciwgdmFsdWUpKQorCQlyZXR1cm4gMDsKKworCS8qIGFueSBub3JtYWwgdHJ1dGggdmFsdWUgZGVmYXVsdHMgdG8gJ2F1dG8nICovCisgYXV0b19jb2xvcjoKKwlpZiAoc3Rkb3V0X2lzX3R0eSA8IDApCisJCXN0ZG91dF9pc190dHkgPSBpc2F0dHkoMSk7CisJaWYgKHN0ZG91dF9pc190dHkgfHwgKHBhZ2VyX2luX3VzZSgpICYmIHBhZ2VyX3VzZV9jb2xvcikpIHsKKwkJY2hhciAqdGVybSA9IGdldGVudigiVEVSTSIpOworCQlpZiAodGVybSAmJiBzdHJjbXAodGVybSwgImR1bWIiKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHBlcmZfY29sb3JfZGVmYXVsdF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqY2IpCit7CisJaWYgKCFzdHJjbXAodmFyLCAiY29sb3IudWkiKSkgeworCQlwZXJmX3VzZV9jb2xvcl9kZWZhdWx0ID0gcGVyZl9jb25maWdfY29sb3Jib29sKHZhciwgdmFsdWUsIC0xKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIHBlcmZfZGVmYXVsdF9jb25maWcodmFyLCB2YWx1ZSwgY2IpOworfQorCitzdGF0aWMgaW50IGNvbG9yX3ZmcHJpbnRmKEZJTEUgKmZwLCBjb25zdCBjaGFyICpjb2xvciwgY29uc3QgY2hhciAqZm10LAorCQl2YV9saXN0IGFyZ3MsIGNvbnN0IGNoYXIgKnRyYWlsKQoreworCWludCByID0gMDsKKworCS8qCisJICogQXV0by1kZXRlY3Q6CisJICovCisJaWYgKHBlcmZfdXNlX2NvbG9yX2RlZmF1bHQgPCAwKSB7CisJCWlmIChpc2F0dHkoMSkgfHwgcGFnZXJfaW5fdXNlKCkpCisJCQlwZXJmX3VzZV9jb2xvcl9kZWZhdWx0ID0gMTsKKwkJZWxzZQorCQkJcGVyZl91c2VfY29sb3JfZGVmYXVsdCA9IDA7CisJfQorCisJaWYgKHBlcmZfdXNlX2NvbG9yX2RlZmF1bHQgJiYgKmNvbG9yKQorCQlyICs9IGZwcmludGYoZnAsICIlcyIsIGNvbG9yKTsKKwlyICs9IHZmcHJpbnRmKGZwLCBmbXQsIGFyZ3MpOworCWlmIChwZXJmX3VzZV9jb2xvcl9kZWZhdWx0ICYmICpjb2xvcikKKwkJciArPSBmcHJpbnRmKGZwLCAiJXMiLCBQRVJGX0NPTE9SX1JFU0VUKTsKKwlpZiAodHJhaWwpCisJCXIgKz0gZnByaW50ZihmcCwgIiVzIiwgdHJhaWwpOworCXJldHVybiByOworfQorCisKKworaW50IGNvbG9yX2ZwcmludGYoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmNvbG9yLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJaW50IHI7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXIgPSBjb2xvcl92ZnByaW50ZihmcCwgY29sb3IsIGZtdCwgYXJncywgTlVMTCk7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByOworfQorCitpbnQgY29sb3JfZnByaW50Zl9sbihGSUxFICpmcCwgY29uc3QgY2hhciAqY29sb3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgcjsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCXIgPSBjb2xvcl92ZnByaW50ZihmcCwgY29sb3IsIGZtdCwgYXJncywgIlxuIik7CisJdmFfZW5kKGFyZ3MpOworCXJldHVybiByOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiBzcGxpdHMgdGhlIGJ1ZmZlciBieSBuZXdsaW5lcyBhbmQgY29sb3JzIHRoZSBsaW5lcyBpbmRpdmlkdWFsbHkuCisgKgorICogUmV0dXJucyAwIG9uIHN1Y2Nlc3MuCisgKi8KK2ludCBjb2xvcl9md3JpdGVfbGluZXMoRklMRSAqZnAsIGNvbnN0IGNoYXIgKmNvbG9yLAorCQlzaXplX3QgY291bnQsIGNvbnN0IGNoYXIgKmJ1ZikKK3sKKwlpZiAoISpjb2xvcikKKwkJcmV0dXJuIGZ3cml0ZShidWYsIGNvdW50LCAxLCBmcCkgIT0gMTsKKwl3aGlsZSAoY291bnQpIHsKKwkJY2hhciAqcCA9IG1lbWNocihidWYsICdcbicsIGNvdW50KTsKKwkJaWYgKHAgIT0gYnVmICYmIChmcHV0cyhjb2xvciwgZnApIDwgMCB8fAorCQkJCWZ3cml0ZShidWYsIHAgPyBwIC0gYnVmIDogY291bnQsIDEsIGZwKSAhPSAxIHx8CisJCQkJZnB1dHMoUEVSRl9DT0xPUl9SRVNFVCwgZnApIDwgMCkpCisJCQlyZXR1cm4gLTE7CisJCWlmICghcCkKKwkJCXJldHVybiAwOworCQlpZiAoZnB1dGMoJ1xuJywgZnApIDwgMCkKKwkJCXJldHVybiAtMTsKKwkJY291bnQgLT0gcCArIDEgLSBidWY7CisJCWJ1ZiA9IHAgKyAxOworCX0KKwlyZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY29sb3IuaCBiL3Rvb2xzL3BlcmYvdXRpbC9jb2xvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhYmZkMzcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvY29sb3IuaApAQCAtMCwwICsxLDM2IEBACisjaWZuZGVmIENPTE9SX0gKKyNkZWZpbmUgQ09MT1JfSAorCisvKiAiXDAzM1sxOzM4OzU7Mnh4OzQ4OzU7Mnh4bVwwIiBpcyAyMyBieXRlcyAqLworI2RlZmluZSBDT0xPUl9NQVhMRU4gMjQKKworI2RlZmluZSBQRVJGX0NPTE9SX05PUk1BTAkiIgorI2RlZmluZSBQRVJGX0NPTE9SX1JFU0VUCSJcMDMzW20iCisjZGVmaW5lIFBFUkZfQ09MT1JfQk9MRAkJIlwwMzNbMW0iCisjZGVmaW5lIFBFUkZfQ09MT1JfUkVECQkiXDAzM1szMW0iCisjZGVmaW5lIFBFUkZfQ09MT1JfR1JFRU4JIlwwMzNbMzJtIgorI2RlZmluZSBQRVJGX0NPTE9SX1lFTExPVwkiXDAzM1szM20iCisjZGVmaW5lIFBFUkZfQ09MT1JfQkxVRQkJIlwwMzNbMzRtIgorI2RlZmluZSBQRVJGX0NPTE9SX01BR0VOVEEJIlwwMzNbMzVtIgorI2RlZmluZSBQRVJGX0NPTE9SX0NZQU4JCSJcMDMzWzM2bSIKKyNkZWZpbmUgUEVSRl9DT0xPUl9CR19SRUQJIlwwMzNbNDFtIgorCisvKgorICogVGhpcyB2YXJpYWJsZSBzdG9yZXMgdGhlIHZhbHVlIG9mIGNvbG9yLnVpCisgKi8KK2V4dGVybiBpbnQgcGVyZl91c2VfY29sb3JfZGVmYXVsdDsKKworCisvKgorICogVXNlIHRoaXMgaW5zdGVhZCBvZiBwZXJmX2RlZmF1bHRfY29uZmlnIGlmIHlvdSBuZWVkIHRoZSB2YWx1ZSBvZiBjb2xvci51aS4KKyAqLworaW50IHBlcmZfY29sb3JfZGVmYXVsdF9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqY2IpOworCitpbnQgcGVyZl9jb25maWdfY29sb3Jib29sKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIGludCBzdGRvdXRfaXNfdHR5KTsKK3ZvaWQgY29sb3JfcGFyc2UoY29uc3QgY2hhciAqdmFsdWUsIGNvbnN0IGNoYXIgKnZhciwgY2hhciAqZHN0KTsKK3ZvaWQgY29sb3JfcGFyc2VfbWVtKGNvbnN0IGNoYXIgKnZhbHVlLCBpbnQgbGVuLCBjb25zdCBjaGFyICp2YXIsIGNoYXIgKmRzdCk7CitpbnQgY29sb3JfZnByaW50ZihGSUxFICpmcCwgY29uc3QgY2hhciAqY29sb3IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2ludCBjb2xvcl9mcHJpbnRmX2xuKEZJTEUgKmZwLCBjb25zdCBjaGFyICpjb2xvciwgY29uc3QgY2hhciAqZm10LCAuLi4pOworaW50IGNvbG9yX2Z3cml0ZV9saW5lcyhGSUxFICpmcCwgY29uc3QgY2hhciAqY29sb3IsIHNpemVfdCBjb3VudCwgY29uc3QgY2hhciAqYnVmKTsKKworI2VuZGlmIC8qIENPTE9SX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9jb25maWcuYyBiL3Rvb2xzL3BlcmYvdXRpbC9jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGQxM2ZhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2NvbmZpZy5jCkBAIC0wLDAgKzEsODczIEBACisvKgorICogR0lUIC0gVGhlIGluZm9ybWF0aW9uIG1hbmFnZXIgZnJvbSBoZWxsCisgKgorICogQ29weXJpZ2h0IChDKSBMaW51cyBUb3J2YWxkcywgMjAwNQorICogQ29weXJpZ2h0IChDKSBKb2hhbm5lcyBTY2hpbmRlbGluLCAyMDA1CisgKgorICovCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiZXhlY19jbWQuaCIKKworI2RlZmluZSBNQVhOQU1FICgyNTYpCisKK3N0YXRpYyBGSUxFICpjb25maWdfZmlsZTsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25maWdfZmlsZV9uYW1lOworc3RhdGljIGludCBjb25maWdfbGluZW5yOworc3RhdGljIGludCBjb25maWdfZmlsZV9lb2Y7CisKK2NvbnN0IGNoYXIgKmNvbmZpZ19leGNsdXNpdmVfZmlsZW5hbWUgPSBOVUxMOworCitzdGF0aWMgaW50IGdldF9uZXh0X2NoYXIodm9pZCkKK3sKKwlpbnQgYzsKKwlGSUxFICpmOworCisJYyA9ICdcbic7CisJaWYgKChmID0gY29uZmlnX2ZpbGUpICE9IE5VTEwpIHsKKwkJYyA9IGZnZXRjKGYpOworCQlpZiAoYyA9PSAnXHInKSB7CisJCQkvKiBET1MgbGlrZSBzeXN0ZW1zICovCisJCQljID0gZmdldGMoZik7CisJCQlpZiAoYyAhPSAnXG4nKSB7CisJCQkJdW5nZXRjKGMsIGYpOworCQkJCWMgPSAnXHInOworCQkJfQorCQl9CisJCWlmIChjID09ICdcbicpCisJCQljb25maWdfbGluZW5yKys7CisJCWlmIChjID09IEVPRikgeworCQkJY29uZmlnX2ZpbGVfZW9mID0gMTsKKwkJCWMgPSAnXG4nOworCQl9CisJfQorCXJldHVybiBjOworfQorCitzdGF0aWMgY2hhciAqcGFyc2VfdmFsdWUodm9pZCkKK3sKKwlzdGF0aWMgY2hhciB2YWx1ZVsxMDI0XTsKKwlpbnQgcXVvdGUgPSAwLCBjb21tZW50ID0gMCwgbGVuID0gMCwgc3BhY2UgPSAwOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGxlbiA+PSBzaXplb2YodmFsdWUpIC0gMSkKKwkJCXJldHVybiBOVUxMOworCQlpZiAoYyA9PSAnXG4nKSB7CisJCQlpZiAocXVvdGUpCisJCQkJcmV0dXJuIE5VTEw7CisJCQl2YWx1ZVtsZW5dID0gMDsKKwkJCXJldHVybiB2YWx1ZTsKKwkJfQorCQlpZiAoY29tbWVudCkKKwkJCWNvbnRpbnVlOworCQlpZiAoaXNzcGFjZShjKSAmJiAhcXVvdGUpIHsKKwkJCXNwYWNlID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghcXVvdGUpIHsKKwkJCWlmIChjID09ICc7JyB8fCBjID09ICcjJykgeworCQkJCWNvbW1lbnQgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisJCWlmIChzcGFjZSkgeworCQkJaWYgKGxlbikKKwkJCQl2YWx1ZVtsZW4rK10gPSAnICc7CisJCQlzcGFjZSA9IDA7CisJCX0KKwkJaWYgKGMgPT0gJ1xcJykgeworCQkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJCXN3aXRjaCAoYykgeworCQkJY2FzZSAnXG4nOgorCQkJCWNvbnRpbnVlOworCQkJY2FzZSAndCc6CisJCQkJYyA9ICdcdCc7CisJCQkJYnJlYWs7CisJCQljYXNlICdiJzoKKwkJCQljID0gJ1xiJzsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ24nOgorCQkJCWMgPSAnXG4nOworCQkJCWJyZWFrOworCQkJLyogU29tZSBjaGFyYWN0ZXJzIGVzY2FwZSBhcyB0aGVtc2VsdmVzICovCisJCQljYXNlICdcXCc6IGNhc2UgJyInOgorCQkJCWJyZWFrOworCQkJLyogUmVqZWN0IHVua25vd24gZXNjYXBlIHNlcXVlbmNlcyAqLworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCXZhbHVlW2xlbisrXSA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSAnIicpIHsKKwkJCXF1b3RlID0gMS1xdW90ZTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXZhbHVlW2xlbisrXSA9IGM7CisJfQorfQorCitzdGF0aWMgaW5saW5lIGludCBpc2tleWNoYXIoaW50IGMpCit7CisJcmV0dXJuIGlzYWxudW0oYykgfHwgYyA9PSAnLSc7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X3ZhbHVlKGNvbmZpZ19mbl90IGZuLCB2b2lkICpkYXRhLCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWludCBjOworCWNoYXIgKnZhbHVlOworCisJLyogR2V0IHRoZSBmdWxsIG5hbWUgKi8KKwlmb3IgKDs7KSB7CisJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCWlmIChjb25maWdfZmlsZV9lb2YpCisJCQlicmVhazsKKwkJaWYgKCFpc2tleWNoYXIoYykpCisJCQlicmVhazsKKwkJbmFtZVtsZW4rK10gPSB0b2xvd2VyKGMpOworCQlpZiAobGVuID49IE1BWE5BTUUpCisJCQlyZXR1cm4gLTE7CisJfQorCW5hbWVbbGVuXSA9IDA7CisJd2hpbGUgKGMgPT0gJyAnIHx8IGMgPT0gJ1x0JykKKwkJYyA9IGdldF9uZXh0X2NoYXIoKTsKKworCXZhbHVlID0gTlVMTDsKKwlpZiAoYyAhPSAnXG4nKSB7CisJCWlmIChjICE9ICc9JykKKwkJCXJldHVybiAtMTsKKwkJdmFsdWUgPSBwYXJzZV92YWx1ZSgpOworCQlpZiAoIXZhbHVlKQorCQkJcmV0dXJuIC0xOworCX0KKwlyZXR1cm4gZm4obmFtZSwgdmFsdWUsIGRhdGEpOworfQorCitzdGF0aWMgaW50IGdldF9leHRlbmRlZF9iYXNlX3ZhcihjaGFyICpuYW1lLCBpbnQgYmFzZWxlbiwgaW50IGMpCit7CisJZG8geworCQlpZiAoYyA9PSAnXG4nKQorCQkJcmV0dXJuIC0xOworCQljID0gZ2V0X25leHRfY2hhcigpOworCX0gd2hpbGUgKGlzc3BhY2UoYykpOworCisJLyogV2UgcmVxdWlyZSB0aGUgZm9ybWF0IHRvIGJlICdbYmFzZSAiZXh0ZW5zaW9uIl0nICovCisJaWYgKGMgIT0gJyInKQorCQlyZXR1cm4gLTE7CisJbmFtZVtiYXNlbGVuKytdID0gJy4nOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGMgPT0gJ1xuJykKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMgPT0gJyInKQorCQkJYnJlYWs7CisJCWlmIChjID09ICdcXCcpIHsKKwkJCWMgPSBnZXRfbmV4dF9jaGFyKCk7CisJCQlpZiAoYyA9PSAnXG4nKQorCQkJCXJldHVybiAtMTsKKwkJfQorCQluYW1lW2Jhc2VsZW4rK10gPSBjOworCQlpZiAoYmFzZWxlbiA+IE1BWE5BTUUgLyAyKQorCQkJcmV0dXJuIC0xOworCX0KKworCS8qIEZpbmFsICddJyAqLworCWlmIChnZXRfbmV4dF9jaGFyKCkgIT0gJ10nKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIGJhc2VsZW47Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2Jhc2VfdmFyKGNoYXIgKm5hbWUpCit7CisJaW50IGJhc2VsZW4gPSAwOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGNvbmZpZ19maWxlX2VvZikKKwkJCXJldHVybiAtMTsKKwkJaWYgKGMgPT0gJ10nKQorCQkJcmV0dXJuIGJhc2VsZW47CisJCWlmIChpc3NwYWNlKGMpKQorCQkJcmV0dXJuIGdldF9leHRlbmRlZF9iYXNlX3ZhcihuYW1lLCBiYXNlbGVuLCBjKTsKKwkJaWYgKCFpc2tleWNoYXIoYykgJiYgYyAhPSAnLicpCisJCQlyZXR1cm4gLTE7CisJCWlmIChiYXNlbGVuID4gTUFYTkFNRSAvIDIpCisJCQlyZXR1cm4gLTE7CisJCW5hbWVbYmFzZWxlbisrXSA9IHRvbG93ZXIoYyk7CisJfQorfQorCitzdGF0aWMgaW50IHBlcmZfcGFyc2VfZmlsZShjb25maWdfZm5fdCBmbiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgY29tbWVudCA9IDA7CisJaW50IGJhc2VsZW4gPSAwOworCXN0YXRpYyBjaGFyIHZhcltNQVhOQU1FXTsKKworCS8qIFUrRkVGRiBCeXRlIE9yZGVyIE1hcmsgaW4gVVRGOCAqLworCXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyICp1dGY4X2JvbSA9ICh1bnNpZ25lZCBjaGFyICopICJceGVmXHhiYlx4YmYiOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmJvbXB0ciA9IHV0ZjhfYm9tOworCisJZm9yICg7OykgeworCQlpbnQgYyA9IGdldF9uZXh0X2NoYXIoKTsKKwkJaWYgKGJvbXB0ciAmJiAqYm9tcHRyKSB7CisJCQkvKiBXZSBhcmUgYXQgdGhlIGZpbGUgYmVnaW5uaW5nOyBza2lwIFVURjgtZW5jb2RlZCBCT00KKwkJCSAqIGlmIHByZXNlbnQuIFNhbmUgZWRpdG9ycyB3b24ndCBwdXQgdGhpcyBpbiBvbiB0aGVpcgorCQkJICogb3duLCBidXQgZS5nLiBXaW5kb3dzIE5vdGVwYWQgd2lsbCBkbyBpdCBoYXBwaWx5LiAqLworCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSBjID09ICpib21wdHIpIHsKKwkJCQlib21wdHIrKzsKKwkJCQljb250aW51ZTsKKwkJCX0gZWxzZSB7CisJCQkJLyogRG8gbm90IHRvbGVyYXRlIHBhcnRpYWwgQk9NLiAqLworCQkJCWlmIChib21wdHIgIT0gdXRmOF9ib20pCisJCQkJCWJyZWFrOworCQkJCS8qIE5vIEJPTSBhdCBmaWxlIGJlZ2lubmluZy4gQ29vbC4gKi8KKwkJCQlib21wdHIgPSBOVUxMOworCQkJfQorCQl9CisJCWlmIChjID09ICdcbicpIHsKKwkJCWlmIChjb25maWdfZmlsZV9lb2YpCisJCQkJcmV0dXJuIDA7CisJCQljb21tZW50ID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjb21tZW50IHx8IGlzc3BhY2UoYykpCisJCQljb250aW51ZTsKKwkJaWYgKGMgPT0gJyMnIHx8IGMgPT0gJzsnKSB7CisJCQljb21tZW50ID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChjID09ICdbJykgeworCQkJYmFzZWxlbiA9IGdldF9iYXNlX3Zhcih2YXIpOworCQkJaWYgKGJhc2VsZW4gPD0gMCkKKwkJCQlicmVhazsKKwkJCXZhcltiYXNlbGVuKytdID0gJy4nOworCQkJdmFyW2Jhc2VsZW5dID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghaXNhbHBoYShjKSkKKwkJCWJyZWFrOworCQl2YXJbYmFzZWxlbl0gPSB0b2xvd2VyKGMpOworCQlpZiAoZ2V0X3ZhbHVlKGZuLCBkYXRhLCB2YXIsIGJhc2VsZW4rMSkgPCAwKQorCQkJYnJlYWs7CisJfQorCWRpZSgiYmFkIGNvbmZpZyBmaWxlIGxpbmUgJWQgaW4gJXMiLCBjb25maWdfbGluZW5yLCBjb25maWdfZmlsZV9uYW1lKTsKK30KKworc3RhdGljIGludCBwYXJzZV91bml0X2ZhY3Rvcihjb25zdCBjaGFyICplbmQsIHVuc2lnbmVkIGxvbmcgKnZhbCkKK3sKKwlpZiAoISplbmQpCisJCXJldHVybiAxOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKGVuZCwgImsiKSkgeworCQkqdmFsICo9IDEwMjQ7CisJCXJldHVybiAxOworCX0KKwllbHNlIGlmICghc3RyY2FzZWNtcChlbmQsICJtIikpIHsKKwkJKnZhbCAqPSAxMDI0ICogMTAyNDsKKwkJcmV0dXJuIDE7CisJfQorCWVsc2UgaWYgKCFzdHJjYXNlY21wKGVuZCwgImciKSkgeworCQkqdmFsICo9IDEwMjQgKiAxMDI0ICogMTAyNDsKKwkJcmV0dXJuIDE7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHBlcmZfcGFyc2VfbG9uZyhjb25zdCBjaGFyICp2YWx1ZSwgbG9uZyAqcmV0KQoreworCWlmICh2YWx1ZSAmJiAqdmFsdWUpIHsKKwkJY2hhciAqZW5kOworCQlsb25nIHZhbCA9IHN0cnRvbCh2YWx1ZSwgJmVuZCwgMCk7CisJCXVuc2lnbmVkIGxvbmcgZmFjdG9yID0gMTsKKwkJaWYgKCFwYXJzZV91bml0X2ZhY3RvcihlbmQsICZmYWN0b3IpKQorCQkJcmV0dXJuIDA7CisJCSpyZXQgPSB2YWwgKiBmYWN0b3I7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IHBlcmZfcGFyc2VfdWxvbmcoY29uc3QgY2hhciAqdmFsdWUsIHVuc2lnbmVkIGxvbmcgKnJldCkKK3sKKwlpZiAodmFsdWUgJiYgKnZhbHVlKSB7CisJCWNoYXIgKmVuZDsKKwkJdW5zaWduZWQgbG9uZyB2YWwgPSBzdHJ0b3VsKHZhbHVlLCAmZW5kLCAwKTsKKwkJaWYgKCFwYXJzZV91bml0X2ZhY3RvcihlbmQsICZ2YWwpKQorCQkJcmV0dXJuIDA7CisJCSpyZXQgPSB2YWw7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZGllX2JhZF9jb25maWcoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpZiAoY29uZmlnX2ZpbGVfbmFtZSkKKwkJZGllKCJiYWQgY29uZmlnIHZhbHVlIGZvciAnJXMnIGluICVzIiwgbmFtZSwgY29uZmlnX2ZpbGVfbmFtZSk7CisJZGllKCJiYWQgY29uZmlnIHZhbHVlIGZvciAnJXMnIiwgbmFtZSk7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19pbnQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUpCit7CisJbG9uZyByZXQgPSAwOworCWlmICghcGVyZl9wYXJzZV9sb25nKHZhbHVlLCAmcmV0KSkKKwkJZGllX2JhZF9jb25maWcobmFtZSk7CisJcmV0dXJuIHJldDsKK30KKwordW5zaWduZWQgbG9uZyBwZXJmX2NvbmZpZ191bG9uZyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwl1bnNpZ25lZCBsb25nIHJldDsKKwlpZiAoIXBlcmZfcGFyc2VfdWxvbmcodmFsdWUsICZyZXQpKQorCQlkaWVfYmFkX2NvbmZpZyhuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitpbnQgcGVyZl9jb25maWdfYm9vbF9vcl9pbnQoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmFsdWUsIGludCAqaXNfYm9vbCkKK3sKKwkqaXNfYm9vbCA9IDE7CisJaWYgKCF2YWx1ZSkKKwkJcmV0dXJuIDE7CisJaWYgKCEqdmFsdWUpCisJCXJldHVybiAwOworCWlmICghc3RyY2FzZWNtcCh2YWx1ZSwgInRydWUiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgInllcyIpIHx8ICFzdHJjYXNlY21wKHZhbHVlLCAib24iKSkKKwkJcmV0dXJuIDE7CisJaWYgKCFzdHJjYXNlY21wKHZhbHVlLCAiZmFsc2UiKSB8fCAhc3RyY2FzZWNtcCh2YWx1ZSwgIm5vIikgfHwgIXN0cmNhc2VjbXAodmFsdWUsICJvZmYiKSkKKwkJcmV0dXJuIDA7CisJKmlzX2Jvb2wgPSAwOworCXJldHVybiBwZXJmX2NvbmZpZ19pbnQobmFtZSwgdmFsdWUpOworfQorCitpbnQgcGVyZl9jb25maWdfYm9vbChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwlpbnQgZGlzY2FyZDsKKwlyZXR1cm4gISFwZXJmX2NvbmZpZ19ib29sX29yX2ludChuYW1lLCB2YWx1ZSwgJmRpc2NhcmQpOworfQorCitpbnQgcGVyZl9jb25maWdfc3RyaW5nKGNvbnN0IGNoYXIgKipkZXN0LCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKnZhbHVlKQoreworCWlmICghdmFsdWUpCisJCXJldHVybiBjb25maWdfZXJyb3Jfbm9uYm9vbCh2YXIpOworCSpkZXN0ID0gc3RyZHVwKHZhbHVlKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBwZXJmX2RlZmF1bHRfY29yZV9jb25maWcoY29uc3QgY2hhciAqdmFyLCBjb25zdCBjaGFyICp2YWx1ZSkKK3sKKwkvKiBBZGQgb3RoZXIgY29uZmlnIHZhcmlhYmxlcyBoZXJlIGFuZCB0byBEb2N1bWVudGF0aW9uL2NvbmZpZy50eHQuICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBwZXJmX2RlZmF1bHRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmR1bW15KQoreworCWlmICghcHJlZml4Y21wKHZhciwgImNvcmUuIikpCisJCXJldHVybiBwZXJmX2RlZmF1bHRfY29yZV9jb25maWcodmFyLCB2YWx1ZSk7CisKKwkvKiBBZGQgb3RoZXIgY29uZmlnIHZhcmlhYmxlcyBoZXJlIGFuZCB0byBEb2N1bWVudGF0aW9uL2NvbmZpZy50eHQuICovCisJcmV0dXJuIDA7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19mcm9tX2ZpbGUoY29uZmlnX2ZuX3QgZm4sIGNvbnN0IGNoYXIgKmZpbGVuYW1lLCB2b2lkICpkYXRhKQoreworCWludCByZXQ7CisJRklMRSAqZiA9IGZvcGVuKGZpbGVuYW1lLCAiciIpOworCisJcmV0ID0gLTE7CisJaWYgKGYpIHsKKwkJY29uZmlnX2ZpbGUgPSBmOworCQljb25maWdfZmlsZV9uYW1lID0gZmlsZW5hbWU7CisJCWNvbmZpZ19saW5lbnIgPSAxOworCQljb25maWdfZmlsZV9lb2YgPSAwOworCQlyZXQgPSBwZXJmX3BhcnNlX2ZpbGUoZm4sIGRhdGEpOworCQlmY2xvc2UoZik7CisJCWNvbmZpZ19maWxlX25hbWUgPSBOVUxMOworCX0KKwlyZXR1cm4gcmV0OworfQorCitjb25zdCBjaGFyICpwZXJmX2V0Y19wZXJmY29uZmlnKHZvaWQpCit7CisJc3RhdGljIGNvbnN0IGNoYXIgKnN5c3RlbV93aWRlOworCWlmICghc3lzdGVtX3dpZGUpCisJCXN5c3RlbV93aWRlID0gc3lzdGVtX3BhdGgoRVRDX1BFUkZDT05GSUcpOworCXJldHVybiBzeXN0ZW1fd2lkZTsKK30KKworc3RhdGljIGludCBwZXJmX2Vudl9ib29sKGNvbnN0IGNoYXIgKmssIGludCBkZWYpCit7CisJY29uc3QgY2hhciAqdiA9IGdldGVudihrKTsKKwlyZXR1cm4gdiA/IHBlcmZfY29uZmlnX2Jvb2woaywgdikgOiBkZWY7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19zeXN0ZW0odm9pZCkKK3sKKwlyZXR1cm4gIXBlcmZfZW52X2Jvb2woIlBFUkZfQ09ORklHX05PU1lTVEVNIiwgMCk7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19nbG9iYWwodm9pZCkKK3sKKwlyZXR1cm4gIXBlcmZfZW52X2Jvb2woIlBFUkZfQ09ORklHX05PR0xPQkFMIiwgMCk7Cit9CisKK2ludCBwZXJmX2NvbmZpZyhjb25maWdfZm5fdCBmbiwgdm9pZCAqZGF0YSkKK3sKKwlpbnQgcmV0ID0gMCwgZm91bmQgPSAwOworCWNoYXIgKnJlcG9fY29uZmlnID0gTlVMTDsKKwljb25zdCBjaGFyICpob21lID0gTlVMTDsKKworCS8qIFNldHRpbmcgJFBFUkZfQ09ORklHIG1ha2VzIHBlcmYgcmVhZCBfb25seV8gdGhlIGdpdmVuIGNvbmZpZyBmaWxlLiAqLworCWlmIChjb25maWdfZXhjbHVzaXZlX2ZpbGVuYW1lKQorCQlyZXR1cm4gcGVyZl9jb25maWdfZnJvbV9maWxlKGZuLCBjb25maWdfZXhjbHVzaXZlX2ZpbGVuYW1lLCBkYXRhKTsKKwlpZiAocGVyZl9jb25maWdfc3lzdGVtKCkgJiYgIWFjY2VzcyhwZXJmX2V0Y19wZXJmY29uZmlnKCksIFJfT0spKSB7CisJCXJldCArPSBwZXJmX2NvbmZpZ19mcm9tX2ZpbGUoZm4sIHBlcmZfZXRjX3BlcmZjb25maWcoKSwKKwkJCQkJICAgIGRhdGEpOworCQlmb3VuZCArPSAxOworCX0KKworCWhvbWUgPSBnZXRlbnYoIkhPTUUiKTsKKwlpZiAocGVyZl9jb25maWdfZ2xvYmFsKCkgJiYgaG9tZSkgeworCQljaGFyICp1c2VyX2NvbmZpZyA9IHN0cmR1cChta3BhdGgoIiVzLy5wZXJmY29uZmlnIiwgaG9tZSkpOworCQlpZiAoIWFjY2Vzcyh1c2VyX2NvbmZpZywgUl9PSykpIHsKKwkJCXJldCArPSBwZXJmX2NvbmZpZ19mcm9tX2ZpbGUoZm4sIHVzZXJfY29uZmlnLCBkYXRhKTsKKwkJCWZvdW5kICs9IDE7CisJCX0KKwkJZnJlZSh1c2VyX2NvbmZpZyk7CisJfQorCisJcmVwb19jb25maWcgPSBwZXJmX3BhdGhkdXAoImNvbmZpZyIpOworCWlmICghYWNjZXNzKHJlcG9fY29uZmlnLCBSX09LKSkgeworCQlyZXQgKz0gcGVyZl9jb25maWdfZnJvbV9maWxlKGZuLCByZXBvX2NvbmZpZywgZGF0YSk7CisJCWZvdW5kICs9IDE7CisJfQorCWZyZWUocmVwb19jb25maWcpOworCWlmIChmb3VuZCA9PSAwKQorCQlyZXR1cm4gLTE7CisJcmV0dXJuIHJldDsKK30KKworLyoKKyAqIEZpbmQgYWxsIHRoZSBzdHVmZiBmb3IgcGVyZl9jb25maWdfc2V0KCkgYmVsb3cuCisgKi8KKworI2RlZmluZSBNQVhfTUFUQ0hFUyA1MTIKKworc3RhdGljIHN0cnVjdCB7CisJaW50IGJhc2VsZW47CisJY2hhcioga2V5OworCWludCBkb19ub3RfbWF0Y2g7CisJcmVnZXhfdCogdmFsdWVfcmVnZXg7CisJaW50IG11bHRpX3JlcGxhY2U7CisJc2l6ZV90IG9mZnNldFtNQVhfTUFUQ0hFU107CisJZW51bSB7IFNUQVJULCBTRUNUSU9OX1NFRU4sIFNFQ1RJT05fRU5EX1NFRU4sIEtFWV9TRUVOIH0gc3RhdGU7CisJaW50IHNlZW47Cit9IHN0b3JlOworCitzdGF0aWMgaW50IG1hdGNoZXMoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlyZXR1cm4gIXN0cmNtcChrZXksIHN0b3JlLmtleSkgJiYKKwkJKHN0b3JlLnZhbHVlX3JlZ2V4ID09IE5VTEwgfHwKKwkJIChzdG9yZS5kb19ub3RfbWF0Y2ggXgorCQkgICFyZWdleGVjKHN0b3JlLnZhbHVlX3JlZ2V4LCB2YWx1ZSwgMCwgTlVMTCwgMCkpKTsKK30KKworc3RhdGljIGludCBzdG9yZV9hdXgoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSwgdm9pZCAqY2IpCit7CisJY29uc3QgY2hhciAqZXA7CisJc2l6ZV90IHNlY3Rpb25fbGVuOworCisJc3dpdGNoIChzdG9yZS5zdGF0ZSkgeworCWNhc2UgS0VZX1NFRU46CisJCWlmIChtYXRjaGVzKGtleSwgdmFsdWUpKSB7CisJCQlpZiAoc3RvcmUuc2VlbiA9PSAxICYmIHN0b3JlLm11bHRpX3JlcGxhY2UgPT0gMCkgeworCQkJCXdhcm5pbmcoIiVzIGhhcyBtdWx0aXBsZSB2YWx1ZXMiLCBrZXkpOworCQkJfSBlbHNlIGlmIChzdG9yZS5zZWVuID49IE1BWF9NQVRDSEVTKSB7CisJCQkJZXJyb3IoInRvbyBtYW55IG1hdGNoZXMgZm9yICVzIiwga2V5KTsKKwkJCQlyZXR1cm4gMTsKKwkJCX0KKworCQkJc3RvcmUub2Zmc2V0W3N0b3JlLnNlZW5dID0gZnRlbGwoY29uZmlnX2ZpbGUpOworCQkJc3RvcmUuc2VlbisrOworCQl9CisJCWJyZWFrOworCWNhc2UgU0VDVElPTl9TRUVOOgorCQkvKgorCQkgKiBXaGF0IHdlIGFyZSBsb29raW5nIGZvciBpcyBpbiBzdG9yZS5rZXkgKGJvdGgKKwkJICogc2VjdGlvbiBhbmQgdmFyKSwgYW5kIGl0cyBzZWN0aW9uIHBhcnQgaXMgYmFzZWxlbgorCQkgKiBsb25nLiAgV2UgZm91bmQga2V5IChhZ2FpbiwgYm90aCBzZWN0aW9uIGFuZCB2YXIpLgorCQkgKiBXZSB3b3VsZCB3YW50IHRvIGtub3cgaWYgdGhpcyBrZXkgaXMgaW4gdGhlIHNhbWUKKwkJICogc2VjdGlvbiBhcyB3aGF0IHdlIGFyZSBsb29raW5nIGZvci4gIFdlIGFscmVhZHkKKwkJICoga25vdyB3ZSBhcmUgaW4gdGhlIHNhbWUgc2VjdGlvbiBhcyB3aGF0IHNob3VsZAorCQkgKiBob2xkIHN0b3JlLmtleS4KKwkJICovCisJCWVwID0gc3RycmNocihrZXksICcuJyk7CisJCXNlY3Rpb25fbGVuID0gZXAgLSBrZXk7CisKKwkJaWYgKChzZWN0aW9uX2xlbiAhPSBzdG9yZS5iYXNlbGVuKSB8fAorCQkgICAgbWVtY21wKGtleSwgc3RvcmUua2V5LCBzZWN0aW9uX2xlbisxKSkgeworCQkJc3RvcmUuc3RhdGUgPSBTRUNUSU9OX0VORF9TRUVOOworCQkJYnJlYWs7CisJCX0KKworCQkvKgorCQkgKiBEbyBub3QgaW5jcmVtZW50IG1hdGNoZXM6IHRoaXMgaXMgbm8gbWF0Y2gsIGJ1dCB3ZQorCQkgKiBqdXN0IG1hZGUgc3VyZSB3ZSBhcmUgaW4gdGhlIGRlc2lyZWQgc2VjdGlvbi4KKwkJICovCisJCXN0b3JlLm9mZnNldFtzdG9yZS5zZWVuXSA9IGZ0ZWxsKGNvbmZpZ19maWxlKTsKKwkJLyogZmFsbHRocnUgKi8KKwljYXNlIFNFQ1RJT05fRU5EX1NFRU46CisJY2FzZSBTVEFSVDoKKwkJaWYgKG1hdGNoZXMoa2V5LCB2YWx1ZSkpIHsKKwkJCXN0b3JlLm9mZnNldFtzdG9yZS5zZWVuXSA9IGZ0ZWxsKGNvbmZpZ19maWxlKTsKKwkJCXN0b3JlLnN0YXRlID0gS0VZX1NFRU47CisJCQlzdG9yZS5zZWVuKys7CisJCX0gZWxzZSB7CisJCQlpZiAoc3RycmNocihrZXksICcuJykgLSBrZXkgPT0gc3RvcmUuYmFzZWxlbiAmJgorCQkJICAgICAgIXN0cm5jbXAoa2V5LCBzdG9yZS5rZXksIHN0b3JlLmJhc2VsZW4pKSB7CisJCQkJCXN0b3JlLnN0YXRlID0gU0VDVElPTl9TRUVOOworCQkJCQlzdG9yZS5vZmZzZXRbc3RvcmUuc2Vlbl0gPSBmdGVsbChjb25maWdfZmlsZSk7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfd3JpdGVfc2VjdGlvbihpbnQgZmQsIGNvbnN0IGNoYXIqIGtleSkKK3sKKwljb25zdCBjaGFyICpkb3Q7CisJaW50IGksIHN1Y2Nlc3M7CisJc3RydWN0IHN0cmJ1ZiBzYiA9IFNUUkJVRl9JTklUOworCisJZG90ID0gbWVtY2hyKGtleSwgJy4nLCBzdG9yZS5iYXNlbGVuKTsKKwlpZiAoZG90KSB7CisJCXN0cmJ1Zl9hZGRmKCZzYiwgIlslLipzIFwiIiwgKGludCkoZG90IC0ga2V5KSwga2V5KTsKKwkJZm9yIChpID0gZG90IC0ga2V5ICsgMTsgaSA8IHN0b3JlLmJhc2VsZW47IGkrKykgeworCQkJaWYgKGtleVtpXSA9PSAnIicgfHwga2V5W2ldID09ICdcXCcpCisJCQkJc3RyYnVmX2FkZGNoKCZzYiwgJ1xcJyk7CisJCQlzdHJidWZfYWRkY2goJnNiLCBrZXlbaV0pOworCQl9CisJCXN0cmJ1Zl9hZGRzdHIoJnNiLCAiXCJdXG4iKTsKKwl9IGVsc2UgeworCQlzdHJidWZfYWRkZigmc2IsICJbJS4qc11cbiIsIHN0b3JlLmJhc2VsZW4sIGtleSk7CisJfQorCisJc3VjY2VzcyA9IHdyaXRlX2luX2Z1bGwoZmQsIHNiLmJ1Ziwgc2IubGVuKSA9PSBzYi5sZW47CisJc3RyYnVmX3JlbGVhc2UoJnNiKTsKKworCXJldHVybiBzdWNjZXNzOworfQorCitzdGF0aWMgaW50IHN0b3JlX3dyaXRlX3BhaXIoaW50IGZkLCBjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlKQoreworCWludCBpLCBzdWNjZXNzOworCWludCBsZW5ndGggPSBzdHJsZW4oa2V5ICsgc3RvcmUuYmFzZWxlbiArIDEpOworCWNvbnN0IGNoYXIgKnF1b3RlID0gIiI7CisJc3RydWN0IHN0cmJ1ZiBzYiA9IFNUUkJVRl9JTklUOworCisJLyoKKwkgKiBDaGVjayB0byBzZWUgaWYgdGhlIHZhbHVlIG5lZWRzIHRvIGJlIHN1cnJvdW5kZWQgd2l0aCBhIGRxIHBhaXIuCisJICogTm90ZSB0aGF0IHByb2JsZW1hdGljIGNoYXJhY3RlcnMgYXJlIGFsd2F5cyBiYWNrc2xhc2gtcXVvdGVkOyB0aGlzCisJICogY2hlY2sgaXMgYWJvdXQgbm90IGxvc2luZyBsZWFkaW5nIG9yIHRyYWlsaW5nIFNQIGFuZCBzdHJpbmdzIHRoYXQKKwkgKiBmb2xsb3cgYmVnaW5uaW5nLW9mLWNvbW1lbnQgY2hhcmFjdGVycyAoaS5lLiAnOycgYW5kICcjJykgYnkgdGhlCisJICogY29uZmlndXJhdGlvbiBwYXJzZXIuCisJICovCisJaWYgKHZhbHVlWzBdID09ICcgJykKKwkJcXVvdGUgPSAiXCIiOworCWZvciAoaSA9IDA7IHZhbHVlW2ldOyBpKyspCisJCWlmICh2YWx1ZVtpXSA9PSAnOycgfHwgdmFsdWVbaV0gPT0gJyMnKQorCQkJcXVvdGUgPSAiXCIiOworCWlmIChpICYmIHZhbHVlW2kgLSAxXSA9PSAnICcpCisJCXF1b3RlID0gIlwiIjsKKworCXN0cmJ1Zl9hZGRmKCZzYiwgIlx0JS4qcyA9ICVzIiwKKwkJICAgIGxlbmd0aCwga2V5ICsgc3RvcmUuYmFzZWxlbiArIDEsIHF1b3RlKTsKKworCWZvciAoaSA9IDA7IHZhbHVlW2ldOyBpKyspCisJCXN3aXRjaCAodmFsdWVbaV0pIHsKKwkJY2FzZSAnXG4nOgorCQkJc3RyYnVmX2FkZHN0cigmc2IsICJcXG4iKTsKKwkJCWJyZWFrOworCQljYXNlICdcdCc6CisJCQlzdHJidWZfYWRkc3RyKCZzYiwgIlxcdCIpOworCQkJYnJlYWs7CisJCWNhc2UgJyInOgorCQljYXNlICdcXCc6CisJCQlzdHJidWZfYWRkY2goJnNiLCAnXFwnKTsKKwkJZGVmYXVsdDoKKwkJCXN0cmJ1Zl9hZGRjaCgmc2IsIHZhbHVlW2ldKTsKKwkJCWJyZWFrOworCQl9CisJc3RyYnVmX2FkZGYoJnNiLCAiJXNcbiIsIHF1b3RlKTsKKworCXN1Y2Nlc3MgPSB3cml0ZV9pbl9mdWxsKGZkLCBzYi5idWYsIHNiLmxlbikgPT0gc2IubGVuOworCXN0cmJ1Zl9yZWxlYXNlKCZzYik7CisKKwlyZXR1cm4gc3VjY2VzczsKK30KKworc3RhdGljIHNzaXplX3QgZmluZF9iZWdpbm5pbmdfb2ZfbGluZShjb25zdCBjaGFyKiBjb250ZW50cywgc2l6ZV90IHNpemUsCisJc2l6ZV90IG9mZnNldF8sIGludCogZm91bmRfYnJhY2tldCkKK3sKKwlzaXplX3QgZXF1YWxfb2Zmc2V0ID0gc2l6ZSwgYnJhY2tldF9vZmZzZXQgPSBzaXplOworCXNzaXplX3Qgb2Zmc2V0OworCitjb250bGluZToKKwlmb3IgKG9mZnNldCA9IG9mZnNldF8tMjsgb2Zmc2V0ID4gMAorCQkJJiYgY29udGVudHNbb2Zmc2V0XSAhPSAnXG4nOyBvZmZzZXQtLSkKKwkJc3dpdGNoIChjb250ZW50c1tvZmZzZXRdKSB7CisJCQljYXNlICc9JzogZXF1YWxfb2Zmc2V0ID0gb2Zmc2V0OyBicmVhazsKKwkJCWNhc2UgJ10nOiBicmFja2V0X29mZnNldCA9IG9mZnNldDsgYnJlYWs7CisJCX0KKwlpZiAob2Zmc2V0ID4gMCAmJiBjb250ZW50c1tvZmZzZXQtMV0gPT0gJ1xcJykgeworCQlvZmZzZXRfID0gb2Zmc2V0OworCQlnb3RvIGNvbnRsaW5lOworCX0KKwlpZiAoYnJhY2tldF9vZmZzZXQgPCBlcXVhbF9vZmZzZXQpIHsKKwkJKmZvdW5kX2JyYWNrZXQgPSAxOworCQlvZmZzZXQgPSBicmFja2V0X29mZnNldCsxOworCX0gZWxzZQorCQlvZmZzZXQrKzsKKworCXJldHVybiBvZmZzZXQ7Cit9CisKK2ludCBwZXJmX2NvbmZpZ19zZXQoY29uc3QgY2hhcioga2V5LCBjb25zdCBjaGFyKiB2YWx1ZSkKK3sKKwlyZXR1cm4gcGVyZl9jb25maWdfc2V0X211bHRpdmFyKGtleSwgdmFsdWUsIE5VTEwsIDApOworfQorCisvKgorICogSWYgdmFsdWU9PU5VTEwsIHVuc2V0IGluIChyZW1vdmUgZnJvbSkgY29uZmlnLAorICogaWYgdmFsdWVfcmVnZXghPU5VTEwsIGRpc3JlZ2FyZCBrZXkvdmFsdWUgcGFpcnMgd2hlcmUgdmFsdWUgZG9lcyBub3QgbWF0Y2guCisgKiBpZiBtdWx0aV9yZXBsYWNlPT0wLCBub3RoaW5nLCBvciBvbmx5IG9uZSBtYXRjaGluZyBrZXkvdmFsdWUgaXMgcmVwbGFjZWQsCisgKiAgICAgZWxzZSBhbGwgbWF0Y2hpbmcga2V5L3ZhbHVlcyAocmVnYXJkbGVzcyBob3cgbWFueSkgYXJlIHJlbW92ZWQsCisgKiAgICAgYmVmb3JlIHRoZSBuZXcgcGFpciBpcyB3cml0dGVuLgorICoKKyAqIFJldHVybnMgMCBvbiBzdWNjZXNzLgorICoKKyAqIFRoaXMgZnVuY3Rpb24gZG9lcyB0aGlzOgorICoKKyAqIC0gaXQgbG9ja3MgdGhlIGNvbmZpZyBmaWxlIGJ5IGNyZWF0aW5nICIucGVyZi9jb25maWcubG9jayIKKyAqCisgKiAtIGl0IHRoZW4gcGFyc2VzIHRoZSBjb25maWcgdXNpbmcgc3RvcmVfYXV4KCkgYXMgdmFsaWRhdG9yIHRvIGZpbmQKKyAqICAgdGhlIHBvc2l0aW9uIG9uIHRoZSBrZXkvdmFsdWUgcGFpciB0byByZXBsYWNlLiBJZiBpdCBpcyB0byBiZSB1bnNldCwKKyAqICAgaXQgbXVzdCBiZSBmb3VuZCBleGFjdGx5IG9uY2UuCisgKgorICogLSB0aGUgY29uZmlnIGZpbGUgaXMgbW1hcCgpZWQgYW5kIHRoZSBwYXJ0IGJlZm9yZSB0aGUgbWF0Y2ggKGlmIGFueSkgaXMKKyAqICAgd3JpdHRlbiB0byB0aGUgbG9jayBmaWxlLCB0aGVuIHRoZSBjaGFuZ2VkIHBhcnQgYW5kIHRoZSByZXN0LgorICoKKyAqIC0gdGhlIGNvbmZpZyBmaWxlIGlzIHJlbW92ZWQgYW5kIHRoZSBsb2NrIGZpbGUgcmVuYW1lKClkIHRvIGl0LgorICoKKyAqLworaW50IHBlcmZfY29uZmlnX3NldF9tdWx0aXZhcihjb25zdCBjaGFyKiBrZXksIGNvbnN0IGNoYXIqIHZhbHVlLAorCWNvbnN0IGNoYXIqIHZhbHVlX3JlZ2V4LCBpbnQgbXVsdGlfcmVwbGFjZSkKK3sKKwlpbnQgaSwgZG90OworCWludCBmZCA9IC0xLCBpbl9mZDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyKiBjb25maWdfZmlsZW5hbWU7CisJY29uc3QgY2hhciogbGFzdF9kb3QgPSBzdHJyY2hyKGtleSwgJy4nKTsKKworCWlmIChjb25maWdfZXhjbHVzaXZlX2ZpbGVuYW1lKQorCQljb25maWdfZmlsZW5hbWUgPSBzdHJkdXAoY29uZmlnX2V4Y2x1c2l2ZV9maWxlbmFtZSk7CisJZWxzZQorCQljb25maWdfZmlsZW5hbWUgPSBwZXJmX3BhdGhkdXAoImNvbmZpZyIpOworCisJLyoKKwkgKiBTaW5jZSAia2V5IiBhY3R1YWxseSBjb250YWlucyB0aGUgc2VjdGlvbiBuYW1lIGFuZCB0aGUgcmVhbAorCSAqIGtleSBuYW1lIHNlcGFyYXRlZCBieSBhIGRvdCwgd2UgaGF2ZSB0byBrbm93IHdoZXJlIHRoZSBkb3QgaXMuCisJICovCisKKwlpZiAobGFzdF9kb3QgPT0gTlVMTCkgeworCQllcnJvcigia2V5IGRvZXMgbm90IGNvbnRhaW4gYSBzZWN0aW9uOiAlcyIsIGtleSk7CisJCXJldCA9IDI7CisJCWdvdG8gb3V0X2ZyZWU7CisJfQorCXN0b3JlLmJhc2VsZW4gPSBsYXN0X2RvdCAtIGtleTsKKworCXN0b3JlLm11bHRpX3JlcGxhY2UgPSBtdWx0aV9yZXBsYWNlOworCisJLyoKKwkgKiBWYWxpZGF0ZSB0aGUga2V5IGFuZCB3aGlsZSBhdCBpdCwgbG93ZXIgY2FzZSBpdCBmb3IgbWF0Y2hpbmcuCisJICovCisJc3RvcmUua2V5ID0gbWFsbG9jKHN0cmxlbihrZXkpICsgMSk7CisJZG90ID0gMDsKKwlmb3IgKGkgPSAwOyBrZXlbaV07IGkrKykgeworCQl1bnNpZ25lZCBjaGFyIGMgPSBrZXlbaV07CisJCWlmIChjID09ICcuJykKKwkJCWRvdCA9IDE7CisJCS8qIExlYXZlIHRoZSBleHRlbmRlZCBiYXNlbmFtZSB1bnRvdWNoZWQuLiAqLworCQlpZiAoIWRvdCB8fCBpID4gc3RvcmUuYmFzZWxlbikgeworCQkJaWYgKCFpc2tleWNoYXIoYykgfHwgKGkgPT0gc3RvcmUuYmFzZWxlbisxICYmICFpc2FscGhhKGMpKSkgeworCQkJCWVycm9yKCJpbnZhbGlkIGtleTogJXMiLCBrZXkpOworCQkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCQlyZXQgPSAxOworCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQl9CisJCQljID0gdG9sb3dlcihjKTsKKwkJfSBlbHNlIGlmIChjID09ICdcbicpIHsKKwkJCWVycm9yKCJpbnZhbGlkIGtleSAobmV3bGluZSk6ICVzIiwga2V5KTsKKwkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCXJldCA9IDE7CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCXN0b3JlLmtleVtpXSA9IGM7CisJfQorCXN0b3JlLmtleVtpXSA9IDA7CisKKwkvKgorCSAqIElmIC5wZXJmL2NvbmZpZyBkb2VzIG5vdCBleGlzdCB5ZXQsIHdyaXRlIGEgbWluaW1hbCB2ZXJzaW9uLgorCSAqLworCWluX2ZkID0gb3Blbihjb25maWdfZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoIGluX2ZkIDwgMCApIHsKKwkJZnJlZShzdG9yZS5rZXkpOworCisJCWlmICggRU5PRU5UICE9IGVycm5vICkgeworCQkJZXJyb3IoIm9wZW5pbmcgJXM6ICVzIiwgY29uZmlnX2ZpbGVuYW1lLAorCQkJICAgICAgc3RyZXJyb3IoZXJybm8pKTsKKwkJCXJldCA9IDM7IC8qIHNhbWUgYXMgImludmFsaWQgY29uZmlnIGZpbGUiICovCisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCS8qIGlmIG5vdGhpbmcgdG8gdW5zZXQsIGVycm9yIG91dCAqLworCQlpZiAodmFsdWUgPT0gTlVMTCkgeworCQkJcmV0ID0gNTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKworCQlzdG9yZS5rZXkgPSAoY2hhciopa2V5OworCQlpZiAoIXN0b3JlX3dyaXRlX3NlY3Rpb24oZmQsIGtleSkgfHwKKwkJICAgICFzdG9yZV93cml0ZV9wYWlyKGZkLCBrZXksIHZhbHVlKSkKKwkJCWdvdG8gd3JpdGVfZXJyX291dDsKKwl9IGVsc2UgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciogY29udGVudHM7CisJCXNpemVfdCBjb250ZW50c19zeiwgY29weV9iZWdpbiwgY29weV9lbmQ7CisJCWludCBpLCBuZXdfbGluZSA9IDA7CisKKwkJaWYgKHZhbHVlX3JlZ2V4ID09IE5VTEwpCisJCQlzdG9yZS52YWx1ZV9yZWdleCA9IE5VTEw7CisJCWVsc2UgeworCQkJaWYgKHZhbHVlX3JlZ2V4WzBdID09ICchJykgeworCQkJCXN0b3JlLmRvX25vdF9tYXRjaCA9IDE7CisJCQkJdmFsdWVfcmVnZXgrKzsKKwkJCX0gZWxzZQorCQkJCXN0b3JlLmRvX25vdF9tYXRjaCA9IDA7CisKKwkJCXN0b3JlLnZhbHVlX3JlZ2V4ID0gKHJlZ2V4X3QqKW1hbGxvYyhzaXplb2YocmVnZXhfdCkpOworCQkJaWYgKHJlZ2NvbXAoc3RvcmUudmFsdWVfcmVnZXgsIHZhbHVlX3JlZ2V4LAorCQkJCQlSRUdfRVhURU5ERUQpKSB7CisJCQkJZXJyb3IoImludmFsaWQgcGF0dGVybjogJXMiLCB2YWx1ZV9yZWdleCk7CisJCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQkJcmV0ID0gNjsKKwkJCQlnb3RvIG91dF9mcmVlOworCQkJfQorCQl9CisKKwkJc3RvcmUub2Zmc2V0WzBdID0gMDsKKwkJc3RvcmUuc3RhdGUgPSBTVEFSVDsKKwkJc3RvcmUuc2VlbiA9IDA7CisKKwkJLyoKKwkJICogQWZ0ZXIgdGhpcywgc3RvcmUub2Zmc2V0IHdpbGwgY29udGFpbiB0aGUgKmVuZCogb2Zmc2V0CisJCSAqIG9mIHRoZSBsYXN0IG1hdGNoLCBvciByZW1haW4gYXQgMCBpZiBubyBtYXRjaCB3YXMgZm91bmQuCisJCSAqIEFzIGEgc2lkZSBlZmZlY3QsIHdlIG1ha2Ugc3VyZSB0byB0cmFuc2Zvcm0gb25seSBhIHZhbGlkCisJCSAqIGV4aXN0aW5nIGNvbmZpZyBmaWxlLgorCQkgKi8KKwkJaWYgKHBlcmZfY29uZmlnX2Zyb21fZmlsZShzdG9yZV9hdXgsIGNvbmZpZ19maWxlbmFtZSwgTlVMTCkpIHsKKwkJCWVycm9yKCJpbnZhbGlkIGNvbmZpZyBmaWxlICVzIiwgY29uZmlnX2ZpbGVuYW1lKTsKKwkJCWZyZWUoc3RvcmUua2V5KTsKKwkJCWlmIChzdG9yZS52YWx1ZV9yZWdleCAhPSBOVUxMKSB7CisJCQkJcmVnZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCQl9CisJCQlyZXQgPSAzOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCisJCWZyZWUoc3RvcmUua2V5KTsKKwkJaWYgKHN0b3JlLnZhbHVlX3JlZ2V4ICE9IE5VTEwpIHsKKwkJCXJlZ2ZyZWUoc3RvcmUudmFsdWVfcmVnZXgpOworCQkJZnJlZShzdG9yZS52YWx1ZV9yZWdleCk7CisJCX0KKworCQkvKiBpZiBub3RoaW5nIHRvIHVuc2V0LCBvciB0b28gbWFueSBtYXRjaGVzLCBlcnJvciBvdXQgKi8KKwkJaWYgKChzdG9yZS5zZWVuID09IDAgJiYgdmFsdWUgPT0gTlVMTCkgfHwKKwkJCQkoc3RvcmUuc2VlbiA+IDEgJiYgbXVsdGlfcmVwbGFjZSA9PSAwKSkgeworCQkJcmV0ID0gNTsKKwkJCWdvdG8gb3V0X2ZyZWU7CisJCX0KKworCQlmc3RhdChpbl9mZCwgJnN0KTsKKwkJY29udGVudHNfc3ogPSB4c2l6ZV90KHN0LnN0X3NpemUpOworCQljb250ZW50cyA9IG1tYXAoTlVMTCwgY29udGVudHNfc3osIFBST1RfUkVBRCwKKwkJCU1BUF9QUklWQVRFLCBpbl9mZCwgMCk7CisJCWNsb3NlKGluX2ZkKTsKKworCQlpZiAoc3RvcmUuc2VlbiA9PSAwKQorCQkJc3RvcmUuc2VlbiA9IDE7CisKKwkJZm9yIChpID0gMCwgY29weV9iZWdpbiA9IDA7IGkgPCBzdG9yZS5zZWVuOyBpKyspIHsKKwkJCWlmIChzdG9yZS5vZmZzZXRbaV0gPT0gMCkgeworCQkJCXN0b3JlLm9mZnNldFtpXSA9IGNvcHlfZW5kID0gY29udGVudHNfc3o7CisJCQl9IGVsc2UgaWYgKHN0b3JlLnN0YXRlICE9IEtFWV9TRUVOKSB7CisJCQkJY29weV9lbmQgPSBzdG9yZS5vZmZzZXRbaV07CisJCQl9IGVsc2UKKwkJCQljb3B5X2VuZCA9IGZpbmRfYmVnaW5uaW5nX29mX2xpbmUoCisJCQkJCWNvbnRlbnRzLCBjb250ZW50c19zeiwKKwkJCQkJc3RvcmUub2Zmc2V0W2ldLTIsICZuZXdfbGluZSk7CisKKwkJCWlmIChjb3B5X2VuZCA+IDAgJiYgY29udGVudHNbY29weV9lbmQtMV0gIT0gJ1xuJykKKwkJCQluZXdfbGluZSA9IDE7CisKKwkJCS8qIHdyaXRlIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBjb25maWcgKi8KKwkJCWlmIChjb3B5X2VuZCA+IGNvcHlfYmVnaW4pIHsKKwkJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCQkJICBjb3B5X2VuZCAtIGNvcHlfYmVnaW4pIDwKKwkJCQkgICAgY29weV9lbmQgLSBjb3B5X2JlZ2luKQorCQkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJCQkJaWYgKG5ld19saW5lICYmCisJCQkJICAgIHdyaXRlX2luX2Z1bGwoZmQsICJcbiIsIDEpICE9IDEpCisJCQkJCWdvdG8gd3JpdGVfZXJyX291dDsKKwkJCX0KKwkJCWNvcHlfYmVnaW4gPSBzdG9yZS5vZmZzZXRbaV07CisJCX0KKworCQkvKiB3cml0ZSB0aGUgcGFpciAodmFsdWUgPT0gTlVMTCBtZWFucyB1bnNldCkgKi8KKwkJaWYgKHZhbHVlICE9IE5VTEwpIHsKKwkJCWlmIChzdG9yZS5zdGF0ZSA9PSBTVEFSVCkgeworCQkJCWlmICghc3RvcmVfd3JpdGVfc2VjdGlvbihmZCwga2V5KSkKKwkJCQkJZ290byB3cml0ZV9lcnJfb3V0OworCQkJfQorCQkJaWYgKCFzdG9yZV93cml0ZV9wYWlyKGZkLCBrZXksIHZhbHVlKSkKKwkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisJCX0KKworCQkvKiB3cml0ZSB0aGUgcmVzdCBvZiB0aGUgY29uZmlnICovCisJCWlmIChjb3B5X2JlZ2luIDwgY29udGVudHNfc3opCisJCQlpZiAod3JpdGVfaW5fZnVsbChmZCwgY29udGVudHMgKyBjb3B5X2JlZ2luLAorCQkJCQkgIGNvbnRlbnRzX3N6IC0gY29weV9iZWdpbikgPAorCQkJICAgIGNvbnRlbnRzX3N6IC0gY29weV9iZWdpbikKKwkJCQlnb3RvIHdyaXRlX2Vycl9vdXQ7CisKKwkJbXVubWFwKGNvbnRlbnRzLCBjb250ZW50c19zeik7CisJfQorCisJcmV0ID0gMDsKKworb3V0X2ZyZWU6CisJZnJlZShjb25maWdfZmlsZW5hbWUpOworCXJldHVybiByZXQ7CisKK3dyaXRlX2Vycl9vdXQ6CisJZ290byBvdXRfZnJlZTsKKworfQorCisvKgorICogQ2FsbCB0aGlzIHRvIHJlcG9ydCBlcnJvciBmb3IgeW91ciB2YXJpYWJsZSB0aGF0IHNob3VsZCBub3QKKyAqIGdldCBhIGJvb2xlYW4gdmFsdWUgKGkuZS4gIltteV0gdmFyIiBtZWFucyAidHJ1ZSIpLgorICovCitpbnQgY29uZmlnX2Vycm9yX25vbmJvb2woY29uc3QgY2hhciAqdmFyKQoreworCXJldHVybiBlcnJvcigiTWlzc2luZyB2YWx1ZSBmb3IgJyVzJyIsIHZhcik7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvY3R5cGUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9jdHlwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MGVjMDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvY3R5cGUuYwpAQCAtMCwwICsxLDI2IEBACisvKgorICogU2FuZSBsb2NhbGUtaW5kZXBlbmRlbnQsIEFTQ0lJIGN0eXBlLgorICoKKyAqIE5vIHN1cnByaXNlcywgYW5kIHdvcmtzIHdpdGggc2lnbmVkIGFuZCB1bnNpZ25lZCBjaGFycy4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisKK2VudW0geworCVMgPSBHSVRfU1BBQ0UsCisJQSA9IEdJVF9BTFBIQSwKKwlEID0gR0lUX0RJR0lULAorCUcgPSBHSVRfR0xPQl9TUEVDSUFMLAkvKiAqLCA/LCBbLCBcXCAqLworCVIgPSBHSVRfUkVHRVhfU1BFQ0lBTCwJLyogJCwgKCwgKSwgKywgLiwgXiwgeywgfCAqICovCit9OworCit1bnNpZ25lZCBjaGFyIHNhbmVfY3R5cGVbMjU2XSA9IHsKKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCBTLCBTLCAwLCAwLCBTLCAwLCAwLAkJLyogICAwLi4gMTUgKi8KKwkwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAkJLyogIDE2Li4gMzEgKi8KKwlTLCAwLCAwLCAwLCBSLCAwLCAwLCAwLCBSLCBSLCBHLCBSLCAwLCAwLCBSLCAwLAkJLyogIDMyLi4gNDcgKi8KKwlELCBELCBELCBELCBELCBELCBELCBELCBELCBELCAwLCAwLCAwLCAwLCAwLCBHLAkJLyogIDQ4Li4gNjMgKi8KKwkwLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLAkJLyogIDY0Li4gNzkgKi8KKwlBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBHLCBHLCAwLCBSLCAwLAkJLyogIDgwLi4gOTUgKi8KKwkwLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLAkJLyogIDk2Li4xMTEgKi8KKwlBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBBLCBSLCBSLCAwLCAwLCAwLAkJLyogMTEyLi4xMjcgKi8KKwkvKiBOb3RoaW5nIGluIHRoZSAxMjguLiByYW5nZSAqLworfTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9lbnZpcm9ubWVudC5jIGIvdG9vbHMvcGVyZi91dGlsL2Vudmlyb25tZW50LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc1YjBlZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9lbnZpcm9ubWVudC5jCkBAIC0wLDAgKzEsOSBAQAorLyoKKyAqIFdlIHB1dCBhbGwgdGhlIHBlcmYgY29uZmlnIHZhcmlhYmxlcyBpbiB0aGlzIHNhbWUgb2JqZWN0CisgKiBmaWxlLCBzbyB0aGF0IHByb2dyYW1zIGNhbiBsaW5rIGFnYWluc3QgdGhlIGNvbmZpZyBwYXJzZXIKKyAqIHdpdGhvdXQgaGF2aW5nIHRvIGxpbmsgYWdhaW5zdCBhbGwgdGhlIHJlc3Qgb2YgcGVyZi4KKyAqLworI2luY2x1ZGUgImNhY2hlLmgiCisKK2NvbnN0IGNoYXIgKnBhZ2VyX3Byb2dyYW07CitpbnQgcGFnZXJfdXNlX2NvbG9yID0gMTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9leGVjX2NtZC5jIGIvdG9vbHMvcGVyZi91dGlsL2V4ZWNfY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDM5MjkyMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9leGVjX2NtZC5jCkBAIC0wLDAgKzEsMTY1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInF1b3RlLmgiCisjZGVmaW5lIE1BWF9BUkdTCTMyCisKK2V4dGVybiBjaGFyICoqZW52aXJvbjsKK3N0YXRpYyBjb25zdCBjaGFyICphcmd2X2V4ZWNfcGF0aDsKK3N0YXRpYyBjb25zdCBjaGFyICphcmd2MF9wYXRoOworCitjb25zdCBjaGFyICpzeXN0ZW1fcGF0aChjb25zdCBjaGFyICpwYXRoKQoreworI2lmZGVmIFJVTlRJTUVfUFJFRklYCisJc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeDsKKyNlbHNlCisJc3RhdGljIGNvbnN0IGNoYXIgKnByZWZpeCA9IFBSRUZJWDsKKyNlbmRpZgorCXN0cnVjdCBzdHJidWYgZCA9IFNUUkJVRl9JTklUOworCisJaWYgKGlzX2Fic29sdXRlX3BhdGgocGF0aCkpCisJCXJldHVybiBwYXRoOworCisjaWZkZWYgUlVOVElNRV9QUkVGSVgKKwlhc3NlcnQoYXJndjBfcGF0aCk7CisJYXNzZXJ0KGlzX2Fic29sdXRlX3BhdGgoYXJndjBfcGF0aCkpOworCisJaWYgKCFwcmVmaXggJiYKKwkgICAgIShwcmVmaXggPSBzdHJpcF9wYXRoX3N1ZmZpeChhcmd2MF9wYXRoLCBQRVJGX0VYRUNfUEFUSCkpICYmCisJICAgICEocHJlZml4ID0gc3RyaXBfcGF0aF9zdWZmaXgoYXJndjBfcGF0aCwgQklORElSKSkgJiYKKwkgICAgIShwcmVmaXggPSBzdHJpcF9wYXRoX3N1ZmZpeChhcmd2MF9wYXRoLCAicGVyZiIpKSkgeworCQlwcmVmaXggPSBQUkVGSVg7CisJCWZwcmludGYoc3RkZXJyLCAiUlVOVElNRV9QUkVGSVggcmVxdWVzdGVkLCAiCisJCQkJImJ1dCBwcmVmaXggY29tcHV0YXRpb24gZmFpbGVkLiAgIgorCQkJCSJVc2luZyBzdGF0aWMgZmFsbGJhY2sgJyVzJy5cbiIsIHByZWZpeCk7CisJfQorI2VuZGlmCisKKwlzdHJidWZfYWRkZigmZCwgIiVzLyVzIiwgcHJlZml4LCBwYXRoKTsKKwlwYXRoID0gc3RyYnVmX2RldGFjaCgmZCwgTlVMTCk7CisJcmV0dXJuIHBhdGg7Cit9CisKK2NvbnN0IGNoYXIgKnBlcmZfZXh0cmFjdF9hcmd2MF9wYXRoKGNvbnN0IGNoYXIgKmFyZ3YwKQoreworCWNvbnN0IGNoYXIgKnNsYXNoOworCisJaWYgKCFhcmd2MCB8fCAhKmFyZ3YwKQorCQlyZXR1cm4gTlVMTDsKKwlzbGFzaCA9IGFyZ3YwICsgc3RybGVuKGFyZ3YwKTsKKworCXdoaWxlIChhcmd2MCA8PSBzbGFzaCAmJiAhaXNfZGlyX3NlcCgqc2xhc2gpKQorCQlzbGFzaC0tOworCisJaWYgKHNsYXNoID49IGFyZ3YwKSB7CisJCWFyZ3YwX3BhdGggPSBzdHJuZHVwKGFyZ3YwLCBzbGFzaCAtIGFyZ3YwKTsKKwkJcmV0dXJuIHNsYXNoICsgMTsKKwl9CisKKwlyZXR1cm4gYXJndjA7Cit9CisKK3ZvaWQgcGVyZl9zZXRfYXJndl9leGVjX3BhdGgoY29uc3QgY2hhciAqZXhlY19wYXRoKQoreworCWFyZ3ZfZXhlY19wYXRoID0gZXhlY19wYXRoOworCS8qCisJICogUHJvcGFnYXRlIHRoaXMgc2V0dGluZyB0byBleHRlcm5hbCBwcm9ncmFtcy4KKwkgKi8KKwlzZXRlbnYoRVhFQ19QQVRIX0VOVklST05NRU5ULCBleGVjX3BhdGgsIDEpOworfQorCisKKy8qIFJldHVybnMgdGhlIGhpZ2hlc3QtcHJpb3JpdHksIGxvY2F0aW9uIHRvIGxvb2sgZm9yIHBlcmYgcHJvZ3JhbXMuICovCitjb25zdCBjaGFyICpwZXJmX2V4ZWNfcGF0aCh2b2lkKQoreworCWNvbnN0IGNoYXIgKmVudjsKKworCWlmIChhcmd2X2V4ZWNfcGF0aCkKKwkJcmV0dXJuIGFyZ3ZfZXhlY19wYXRoOworCisJZW52ID0gZ2V0ZW52KEVYRUNfUEFUSF9FTlZJUk9OTUVOVCk7CisJaWYgKGVudiAmJiAqZW52KSB7CisJCXJldHVybiBlbnY7CisJfQorCisJcmV0dXJuIHN5c3RlbV9wYXRoKFBFUkZfRVhFQ19QQVRIKTsKK30KKworc3RhdGljIHZvaWQgYWRkX3BhdGgoc3RydWN0IHN0cmJ1ZiAqb3V0LCBjb25zdCBjaGFyICpwYXRoKQoreworCWlmIChwYXRoICYmICpwYXRoKSB7CisJCWlmIChpc19hYnNvbHV0ZV9wYXRoKHBhdGgpKQorCQkJc3RyYnVmX2FkZHN0cihvdXQsIHBhdGgpOworCQllbHNlCisJCQlzdHJidWZfYWRkc3RyKG91dCwgbWFrZV9ub25yZWxhdGl2ZV9wYXRoKHBhdGgpKTsKKworCQlzdHJidWZfYWRkY2gob3V0LCBQQVRIX1NFUCk7CisJfQorfQorCit2b2lkIHNldHVwX3BhdGgodm9pZCkKK3sKKwljb25zdCBjaGFyICpvbGRfcGF0aCA9IGdldGVudigiUEFUSCIpOworCXN0cnVjdCBzdHJidWYgbmV3X3BhdGggPSBTVFJCVUZfSU5JVDsKKworCWFkZF9wYXRoKCZuZXdfcGF0aCwgcGVyZl9leGVjX3BhdGgoKSk7CisJYWRkX3BhdGgoJm5ld19wYXRoLCBhcmd2MF9wYXRoKTsKKworCWlmIChvbGRfcGF0aCkKKwkJc3RyYnVmX2FkZHN0cigmbmV3X3BhdGgsIG9sZF9wYXRoKTsKKwllbHNlCisJCXN0cmJ1Zl9hZGRzdHIoJm5ld19wYXRoLCAiL3Vzci9sb2NhbC9iaW46L3Vzci9iaW46L2JpbiIpOworCisJc2V0ZW52KCJQQVRIIiwgbmV3X3BhdGguYnVmLCAxKTsKKworCXN0cmJ1Zl9yZWxlYXNlKCZuZXdfcGF0aCk7Cit9CisKK2NvbnN0IGNoYXIgKipwcmVwYXJlX3BlcmZfY21kKGNvbnN0IGNoYXIgKiphcmd2KQoreworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKipuYXJndjsKKworCWZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY107IGFyZ2MrKykKKwkJOyAvKiBqdXN0IGNvdW50aW5nICovCisJbmFyZ3YgPSBtYWxsb2Moc2l6ZW9mKCpuYXJndikgKiAoYXJnYyArIDIpKTsKKworCW5hcmd2WzBdID0gInBlcmYiOworCWZvciAoYXJnYyA9IDA7IGFyZ3ZbYXJnY107IGFyZ2MrKykKKwkJbmFyZ3ZbYXJnYyArIDFdID0gYXJndlthcmdjXTsKKwluYXJndlthcmdjICsgMV0gPSBOVUxMOworCXJldHVybiBuYXJndjsKK30KKworaW50IGV4ZWN2X3BlcmZfY21kKGNvbnN0IGNoYXIgKiphcmd2KSB7CisJY29uc3QgY2hhciAqKm5hcmd2ID0gcHJlcGFyZV9wZXJmX2NtZChhcmd2KTsKKworCS8qIGV4ZWN2cCgpIGNhbiBvbmx5IGV2ZXIgcmV0dXJuIGlmIGl0IGZhaWxzICovCisJZXhlY3ZwKCJwZXJmIiwgKGNoYXIgKiopbmFyZ3YpOworCisJZnJlZShuYXJndik7CisJcmV0dXJuIC0xOworfQorCisKK2ludCBleGVjbF9wZXJmX2NtZChjb25zdCBjaGFyICpjbWQsLi4uKQoreworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbTUFYX0FSR1MgKyAxXTsKKwljb25zdCBjaGFyICphcmc7CisJdmFfbGlzdCBwYXJhbTsKKworCXZhX3N0YXJ0KHBhcmFtLCBjbWQpOworCWFyZ3ZbMF0gPSBjbWQ7CisJYXJnYyA9IDE7CisJd2hpbGUgKGFyZ2MgPCBNQVhfQVJHUykgeworCQlhcmcgPSBhcmd2W2FyZ2MrK10gPSB2YV9hcmcocGFyYW0sIGNoYXIgKik7CisJCWlmICghYXJnKQorCQkJYnJlYWs7CisJfQorCXZhX2VuZChwYXJhbSk7CisJaWYgKE1BWF9BUkdTIDw9IGFyZ2MpCisJCXJldHVybiBlcnJvcigidG9vIG1hbnkgYXJncyB0byBydW4gJXMiLCBjbWQpOworCisJYXJndlthcmdjXSA9IE5VTEw7CisJcmV0dXJuIGV4ZWN2X3BlcmZfY21kKGFyZ3YpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2V4ZWNfY21kLmggYi90b29scy9wZXJmL3V0aWwvZXhlY19jbWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmZlMjVlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2V4ZWNfY21kLmgKQEAgLTAsMCArMSwxMyBAQAorI2lmbmRlZiBQRVJGX0VYRUNfQ01EX0gKKyNkZWZpbmUgUEVSRl9FWEVDX0NNRF9ICisKK2V4dGVybiB2b2lkIHBlcmZfc2V0X2FyZ3ZfZXhlY19wYXRoKGNvbnN0IGNoYXIgKmV4ZWNfcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciAqcGVyZl9leHRyYWN0X2FyZ3YwX3BhdGgoY29uc3QgY2hhciAqcGF0aCk7CitleHRlcm4gY29uc3QgY2hhciAqcGVyZl9leGVjX3BhdGgodm9pZCk7CitleHRlcm4gdm9pZCBzZXR1cF9wYXRoKHZvaWQpOworZXh0ZXJuIGNvbnN0IGNoYXIgKipwcmVwYXJlX3BlcmZfY21kKGNvbnN0IGNoYXIgKiphcmd2KTsKK2V4dGVybiBpbnQgZXhlY3ZfcGVyZl9jbWQoY29uc3QgY2hhciAqKmFyZ3YpOyAvKiBOVUxMIHRlcm1pbmF0ZWQgKi8KK2V4dGVybiBpbnQgZXhlY2xfcGVyZl9jbWQoY29uc3QgY2hhciAqY21kLCAuLi4pOworZXh0ZXJuIGNvbnN0IGNoYXIgKnN5c3RlbV9wYXRoKGNvbnN0IGNoYXIgKnBhdGgpOworCisjZW5kaWYgLyogUEVSRl9FWEVDX0NNRF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaCBiL3Rvb2xzL3BlcmYvdXRpbC9nZW5lcmF0ZS1jbWRsaXN0LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmYwNmY2ZmQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvZ2VuZXJhdGUtY21kbGlzdC5zaApAQCAtMCwwICsxLDI0IEBACisjIS9iaW4vc2gKKworZWNobyAiLyogQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgJDAgKi8KK3N0cnVjdCBjbWRuYW1lX2hlbHAKK3sKKyAgICBjaGFyIG5hbWVbMTZdOworICAgIGNoYXIgaGVscFs4MF07Cit9OworCitzdGF0aWMgc3RydWN0IGNtZG5hbWVfaGVscCBjb21tb25fY21kc1tdID0geyIKKworc2VkIC1uIC1lICdzL15wZXJmLVwoW14gCV0qXClbIAldLiogY29tbW9uLiovXDEvcCcgY29tbWFuZC1saXN0LnR4dCB8Citzb3J0IHwKK3doaWxlIHJlYWQgY21kCitkbworICAgICBzZWQgLW4gJworICAgICAvXk5BTUUvLC9wZXJmLSciJGNtZCInL0gKKyAgICAgJHsKKyAgICAgICAgICAgIHgKKyAgICAgICAgICAgIHMvLipwZXJmLSciJGNtZCInIC0gXCguKlwpLyAgeyInIiRjbWQiJyIsICJcMSJ9LC8KKwkgICAgcAorICAgICB9JyAiRG9jdW1lbnRhdGlvbi9wZXJmLSRjbWQudHh0IgorZG9uZQorZWNobyAifTsiCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGVscC5jIGIvdG9vbHMvcGVyZi91dGlsL2hlbHAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjUzZjdkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlbHAuYwpAQCAtMCwwICsxLDM2NyBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAiLi4vYnVpbHRpbi5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisjaW5jbHVkZSAibGV2ZW5zaHRlaW4uaCIKKyNpbmNsdWRlICJoZWxwLmgiCisKKy8qIG1vc3QgR1VJIHRlcm1pbmFscyBzZXQgQ09MVU1OUyAoYWx0aG91Z2ggc29tZSBkb24ndCBleHBvcnQgaXQpICovCitzdGF0aWMgaW50IHRlcm1fY29sdW1ucyh2b2lkKQoreworCWNoYXIgKmNvbF9zdHJpbmcgPSBnZXRlbnYoIkNPTFVNTlMiKTsKKwlpbnQgbl9jb2xzOworCisJaWYgKGNvbF9zdHJpbmcgJiYgKG5fY29scyA9IGF0b2koY29sX3N0cmluZykpID4gMCkKKwkJcmV0dXJuIG5fY29sczsKKworI2lmZGVmIFRJT0NHV0lOU1oKKwl7CisJCXN0cnVjdCB3aW5zaXplIHdzOworCQlpZiAoIWlvY3RsKDEsIFRJT0NHV0lOU1osICZ3cykpIHsKKwkJCWlmICh3cy53c19jb2wpCisJCQkJcmV0dXJuIHdzLndzX2NvbDsKKwkJfQorCX0KKyNlbmRpZgorCisJcmV0dXJuIDgwOworfQorCit2b2lkIGFkZF9jbWRuYW1lKHN0cnVjdCBjbWRuYW1lcyAqY21kcywgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgY21kbmFtZSAqZW50ID0gbWFsbG9jKHNpemVvZigqZW50KSArIGxlbiArIDEpOworCisJZW50LT5sZW4gPSBsZW47CisJbWVtY3B5KGVudC0+bmFtZSwgbmFtZSwgbGVuKTsKKwllbnQtPm5hbWVbbGVuXSA9IDA7CisKKwlBTExPQ19HUk9XKGNtZHMtPm5hbWVzLCBjbWRzLT5jbnQgKyAxLCBjbWRzLT5hbGxvYyk7CisJY21kcy0+bmFtZXNbY21kcy0+Y250KytdID0gZW50OworfQorCitzdGF0aWMgdm9pZCBjbGVhbl9jbWRuYW1lcyhzdHJ1Y3QgY21kbmFtZXMgKmNtZHMpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IGNtZHMtPmNudDsgKytpKQorCQlmcmVlKGNtZHMtPm5hbWVzW2ldKTsKKwlmcmVlKGNtZHMtPm5hbWVzKTsKKwljbWRzLT5jbnQgPSAwOworCWNtZHMtPmFsbG9jID0gMDsKK30KKworc3RhdGljIGludCBjbWRuYW1lX2NvbXBhcmUoY29uc3Qgdm9pZCAqYV8sIGNvbnN0IHZvaWQgKmJfKQoreworCXN0cnVjdCBjbWRuYW1lICphID0gKihzdHJ1Y3QgY21kbmFtZSAqKilhXzsKKwlzdHJ1Y3QgY21kbmFtZSAqYiA9ICooc3RydWN0IGNtZG5hbWUgKiopYl87CisJcmV0dXJuIHN0cmNtcChhLT5uYW1lLCBiLT5uYW1lKTsKK30KKworc3RhdGljIHZvaWQgdW5pcShzdHJ1Y3QgY21kbmFtZXMgKmNtZHMpCit7CisJaW50IGksIGo7CisKKwlpZiAoIWNtZHMtPmNudCkKKwkJcmV0dXJuOworCisJZm9yIChpID0gaiA9IDE7IGkgPCBjbWRzLT5jbnQ7IGkrKykKKwkJaWYgKHN0cmNtcChjbWRzLT5uYW1lc1tpXS0+bmFtZSwgY21kcy0+bmFtZXNbaS0xXS0+bmFtZSkpCisJCQljbWRzLT5uYW1lc1tqKytdID0gY21kcy0+bmFtZXNbaV07CisKKwljbWRzLT5jbnQgPSBqOworfQorCit2b2lkIGV4Y2x1ZGVfY21kcyhzdHJ1Y3QgY21kbmFtZXMgKmNtZHMsIHN0cnVjdCBjbWRuYW1lcyAqZXhjbHVkZXMpCit7CisJaW50IGNpLCBjaiwgZWk7CisJaW50IGNtcDsKKworCWNpID0gY2ogPSBlaSA9IDA7CisJd2hpbGUgKGNpIDwgY21kcy0+Y250ICYmIGVpIDwgZXhjbHVkZXMtPmNudCkgeworCQljbXAgPSBzdHJjbXAoY21kcy0+bmFtZXNbY2ldLT5uYW1lLCBleGNsdWRlcy0+bmFtZXNbZWldLT5uYW1lKTsKKwkJaWYgKGNtcCA8IDApCisJCQljbWRzLT5uYW1lc1tjaisrXSA9IGNtZHMtPm5hbWVzW2NpKytdOworCQllbHNlIGlmIChjbXAgPT0gMCkKKwkJCWNpKyssIGVpKys7CisJCWVsc2UgaWYgKGNtcCA+IDApCisJCQllaSsrOworCX0KKworCXdoaWxlIChjaSA8IGNtZHMtPmNudCkKKwkJY21kcy0+bmFtZXNbY2orK10gPSBjbWRzLT5uYW1lc1tjaSsrXTsKKworCWNtZHMtPmNudCA9IGNqOworfQorCitzdGF0aWMgdm9pZCBwcmV0dHlfcHJpbnRfc3RyaW5nX2xpc3Qoc3RydWN0IGNtZG5hbWVzICpjbWRzLCBpbnQgbG9uZ2VzdCkKK3sKKwlpbnQgY29scyA9IDEsIHJvd3M7CisJaW50IHNwYWNlID0gbG9uZ2VzdCArIDE7IC8qIG1pbiAxIFNQIGJldHdlZW4gd29yZHMgKi8KKwlpbnQgbWF4X2NvbHMgPSB0ZXJtX2NvbHVtbnMoKSAtIDE7IC8qIGRvbid0IHByaW50ICpvbiogdGhlIGVkZ2UgKi8KKwlpbnQgaSwgajsKKworCWlmIChzcGFjZSA8IG1heF9jb2xzKQorCQljb2xzID0gbWF4X2NvbHMgLyBzcGFjZTsKKwlyb3dzID0gKGNtZHMtPmNudCArIGNvbHMgLSAxKSAvIGNvbHM7CisKKwlmb3IgKGkgPSAwOyBpIDwgcm93czsgaSsrKSB7CisJCXByaW50ZigiICAiKTsKKworCQlmb3IgKGogPSAwOyBqIDwgY29sczsgaisrKSB7CisJCQlpbnQgbiA9IGogKiByb3dzICsgaTsKKwkJCWludCBzaXplID0gc3BhY2U7CisJCQlpZiAobiA+PSBjbWRzLT5jbnQpCisJCQkJYnJlYWs7CisJCQlpZiAoaiA9PSBjb2xzLTEgfHwgbiArIHJvd3MgPj0gY21kcy0+Y250KQorCQkJCXNpemUgPSAxOworCQkJcHJpbnRmKCIlLSpzIiwgc2l6ZSwgY21kcy0+bmFtZXNbbl0tPm5hbWUpOworCQl9CisJCXB1dGNoYXIoJ1xuJyk7CisJfQorfQorCitzdGF0aWMgaW50IGlzX2V4ZWN1dGFibGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWlmIChzdGF0KG5hbWUsICZzdCkgfHwgLyogc3RhdCwgbm90IGxzdGF0ICovCisJICAgICFTX0lTUkVHKHN0LnN0X21vZGUpKQorCQlyZXR1cm4gMDsKKworI2lmZGVmIF9fTUlOR1czMl9fCisJLyogY2Fubm90IHRydXN0IHRoZSBleGVjdXRhYmxlIGJpdCwgcGVlayBpbnRvIHRoZSBmaWxlIGluc3RlYWQgKi8KKwljaGFyIGJ1ZlszXSA9IHsgMCB9OworCWludCBuOworCWludCBmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOworCXN0LnN0X21vZGUgJj0gflNfSVhVU1I7CisJaWYgKGZkID49IDApIHsKKwkJbiA9IHJlYWQoZmQsIGJ1ZiwgMik7CisJCWlmIChuID09IDIpCisJCQkvKiBET1MgZXhlY3V0YWJsZXMgc3RhcnQgd2l0aCAiTVoiICovCisJCQlpZiAoIXN0cmNtcChidWYsICIjISIpIHx8ICFzdHJjbXAoYnVmLCAiTVoiKSkKKwkJCQlzdC5zdF9tb2RlIHw9IFNfSVhVU1I7CisJCWNsb3NlKGZkKTsKKwl9CisjZW5kaWYKKwlyZXR1cm4gc3Quc3RfbW9kZSAmIFNfSVhVU1I7Cit9CisKK3N0YXRpYyB2b2lkIGxpc3RfY29tbWFuZHNfaW5fZGlyKHN0cnVjdCBjbWRuYW1lcyAqY21kcywKKwkJCQkJIGNvbnN0IGNoYXIgKnBhdGgsCisJCQkJCSBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJaW50IHByZWZpeF9sZW47CisJRElSICpkaXIgPSBvcGVuZGlyKHBhdGgpOworCXN0cnVjdCBkaXJlbnQgKmRlOworCXN0cnVjdCBzdHJidWYgYnVmID0gU1RSQlVGX0lOSVQ7CisJaW50IGxlbjsKKworCWlmICghZGlyKQorCQlyZXR1cm47CisJaWYgKCFwcmVmaXgpCisJCXByZWZpeCA9ICJwZXJmLSI7CisJcHJlZml4X2xlbiA9IHN0cmxlbihwcmVmaXgpOworCisJc3RyYnVmX2FkZGYoJmJ1ZiwgIiVzLyIsIHBhdGgpOworCWxlbiA9IGJ1Zi5sZW47CisKKwl3aGlsZSAoKGRlID0gcmVhZGRpcihkaXIpKSAhPSBOVUxMKSB7CisJCWludCBlbnRsZW47CisKKwkJaWYgKHByZWZpeGNtcChkZS0+ZF9uYW1lLCBwcmVmaXgpKQorCQkJY29udGludWU7CisKKwkJc3RyYnVmX3NldGxlbigmYnVmLCBsZW4pOworCQlzdHJidWZfYWRkc3RyKCZidWYsIGRlLT5kX25hbWUpOworCQlpZiAoIWlzX2V4ZWN1dGFibGUoYnVmLmJ1ZikpCisJCQljb250aW51ZTsKKworCQllbnRsZW4gPSBzdHJsZW4oZGUtPmRfbmFtZSkgLSBwcmVmaXhfbGVuOworCQlpZiAoaGFzX2V4dGVuc2lvbihkZS0+ZF9uYW1lLCAiLmV4ZSIpKQorCQkJZW50bGVuIC09IDQ7CisKKwkJYWRkX2NtZG5hbWUoY21kcywgZGUtPmRfbmFtZSArIHByZWZpeF9sZW4sIGVudGxlbik7CisJfQorCWNsb3NlZGlyKGRpcik7CisJc3RyYnVmX3JlbGVhc2UoJmJ1Zik7Cit9CisKK3ZvaWQgbG9hZF9jb21tYW5kX2xpc3QoY29uc3QgY2hhciAqcHJlZml4LAorCQlzdHJ1Y3QgY21kbmFtZXMgKm1haW5fY21kcywKKwkJc3RydWN0IGNtZG5hbWVzICpvdGhlcl9jbWRzKQoreworCWNvbnN0IGNoYXIgKmVudl9wYXRoID0gZ2V0ZW52KCJQQVRIIik7CisJY29uc3QgY2hhciAqZXhlY19wYXRoID0gcGVyZl9leGVjX3BhdGgoKTsKKworCWlmIChleGVjX3BhdGgpIHsKKwkJbGlzdF9jb21tYW5kc19pbl9kaXIobWFpbl9jbWRzLCBleGVjX3BhdGgsIHByZWZpeCk7CisJCXFzb3J0KG1haW5fY21kcy0+bmFtZXMsIG1haW5fY21kcy0+Y250LAorCQkgICAgICBzaXplb2YoKm1haW5fY21kcy0+bmFtZXMpLCBjbWRuYW1lX2NvbXBhcmUpOworCQl1bmlxKG1haW5fY21kcyk7CisJfQorCisJaWYgKGVudl9wYXRoKSB7CisJCWNoYXIgKnBhdGhzLCAqcGF0aCwgKmNvbG9uOworCQlwYXRoID0gcGF0aHMgPSBzdHJkdXAoZW52X3BhdGgpOworCQl3aGlsZSAoMSkgeworCQkJaWYgKChjb2xvbiA9IHN0cmNocihwYXRoLCBQQVRIX1NFUCkpKQorCQkJCSpjb2xvbiA9IDA7CisJCQlpZiAoIWV4ZWNfcGF0aCB8fCBzdHJjbXAocGF0aCwgZXhlY19wYXRoKSkKKwkJCQlsaXN0X2NvbW1hbmRzX2luX2RpcihvdGhlcl9jbWRzLCBwYXRoLCBwcmVmaXgpOworCisJCQlpZiAoIWNvbG9uKQorCQkJCWJyZWFrOworCQkJcGF0aCA9IGNvbG9uICsgMTsKKwkJfQorCQlmcmVlKHBhdGhzKTsKKworCQlxc29ydChvdGhlcl9jbWRzLT5uYW1lcywgb3RoZXJfY21kcy0+Y250LAorCQkgICAgICBzaXplb2YoKm90aGVyX2NtZHMtPm5hbWVzKSwgY21kbmFtZV9jb21wYXJlKTsKKwkJdW5pcShvdGhlcl9jbWRzKTsKKwl9CisJZXhjbHVkZV9jbWRzKG90aGVyX2NtZHMsIG1haW5fY21kcyk7Cit9CisKK3ZvaWQgbGlzdF9jb21tYW5kcyhjb25zdCBjaGFyICp0aXRsZSwgc3RydWN0IGNtZG5hbWVzICptYWluX2NtZHMsCisJCSAgIHN0cnVjdCBjbWRuYW1lcyAqb3RoZXJfY21kcykKK3sKKwlpbnQgaSwgbG9uZ2VzdCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgbWFpbl9jbWRzLT5jbnQ7IGkrKykKKwkJaWYgKGxvbmdlc3QgPCBtYWluX2NtZHMtPm5hbWVzW2ldLT5sZW4pCisJCQlsb25nZXN0ID0gbWFpbl9jbWRzLT5uYW1lc1tpXS0+bGVuOworCWZvciAoaSA9IDA7IGkgPCBvdGhlcl9jbWRzLT5jbnQ7IGkrKykKKwkJaWYgKGxvbmdlc3QgPCBvdGhlcl9jbWRzLT5uYW1lc1tpXS0+bGVuKQorCQkJbG9uZ2VzdCA9IG90aGVyX2NtZHMtPm5hbWVzW2ldLT5sZW47CisKKwlpZiAobWFpbl9jbWRzLT5jbnQpIHsKKwkJY29uc3QgY2hhciAqZXhlY19wYXRoID0gcGVyZl9leGVjX3BhdGgoKTsKKwkJcHJpbnRmKCJhdmFpbGFibGUgJXMgaW4gJyVzJ1xuIiwgdGl0bGUsIGV4ZWNfcGF0aCk7CisJCXByaW50ZigiLS0tLS0tLS0tLS0tLS0tLSIpOworCQltcHV0X2NoYXIoJy0nLCBzdHJsZW4odGl0bGUpICsgc3RybGVuKGV4ZWNfcGF0aCkpOworCQlwdXRjaGFyKCdcbicpOworCQlwcmV0dHlfcHJpbnRfc3RyaW5nX2xpc3QobWFpbl9jbWRzLCBsb25nZXN0KTsKKwkJcHV0Y2hhcignXG4nKTsKKwl9CisKKwlpZiAob3RoZXJfY21kcy0+Y250KSB7CisJCXByaW50ZigiJXMgYXZhaWxhYmxlIGZyb20gZWxzZXdoZXJlIG9uIHlvdXIgJFBBVEhcbiIsIHRpdGxlKTsKKwkJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwkJbXB1dF9jaGFyKCctJywgc3RybGVuKHRpdGxlKSk7CisJCXB1dGNoYXIoJ1xuJyk7CisJCXByZXR0eV9wcmludF9zdHJpbmdfbGlzdChvdGhlcl9jbWRzLCBsb25nZXN0KTsKKwkJcHV0Y2hhcignXG4nKTsKKwl9Cit9CisKK2ludCBpc19pbl9jbWRsaXN0KHN0cnVjdCBjbWRuYW1lcyAqYywgY29uc3QgY2hhciAqcykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgYy0+Y250OyBpKyspCisJCWlmICghc3RyY21wKHMsIGMtPm5hbWVzW2ldLT5uYW1lKSkKKwkJCXJldHVybiAxOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGF1dG9jb3JyZWN0Oworc3RhdGljIHN0cnVjdCBjbWRuYW1lcyBhbGlhc2VzOworCitzdGF0aWMgaW50IHBlcmZfdW5rbm93bl9jbWRfY29uZmlnKGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqdmFsdWUsIHZvaWQgKmNiKQoreworCWlmICghc3RyY21wKHZhciwgImhlbHAuYXV0b2NvcnJlY3QiKSkKKwkJYXV0b2NvcnJlY3QgPSBwZXJmX2NvbmZpZ19pbnQodmFyLHZhbHVlKTsKKwkvKiBBbHNvIHVzZSBhbGlhc2VzIGZvciBjb21tYW5kIGxvb2t1cCAqLworCWlmICghcHJlZml4Y21wKHZhciwgImFsaWFzLiIpKQorCQlhZGRfY21kbmFtZSgmYWxpYXNlcywgdmFyICsgNiwgc3RybGVuKHZhciArIDYpKTsKKworCXJldHVybiBwZXJmX2RlZmF1bHRfY29uZmlnKHZhciwgdmFsdWUsIGNiKTsKK30KKworc3RhdGljIGludCBsZXZlbnNodGVpbl9jb21wYXJlKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikKK3sKKwljb25zdCBzdHJ1Y3QgY21kbmFtZSAqY29uc3QgKmMxID0gcDEsICpjb25zdCAqYzIgPSBwMjsKKwljb25zdCBjaGFyICpzMSA9ICgqYzEpLT5uYW1lLCAqczIgPSAoKmMyKS0+bmFtZTsKKwlpbnQgbDEgPSAoKmMxKS0+bGVuOworCWludCBsMiA9ICgqYzIpLT5sZW47CisJcmV0dXJuIGwxICE9IGwyID8gbDEgLSBsMiA6IHN0cmNtcChzMSwgczIpOworfQorCitzdGF0aWMgdm9pZCBhZGRfY21kX2xpc3Qoc3RydWN0IGNtZG5hbWVzICpjbWRzLCBzdHJ1Y3QgY21kbmFtZXMgKm9sZCkKK3sKKwlpbnQgaTsKKwlBTExPQ19HUk9XKGNtZHMtPm5hbWVzLCBjbWRzLT5jbnQgKyBvbGQtPmNudCwgY21kcy0+YWxsb2MpOworCisJZm9yIChpID0gMDsgaSA8IG9sZC0+Y250OyBpKyspCisJCWNtZHMtPm5hbWVzW2NtZHMtPmNudCsrXSA9IG9sZC0+bmFtZXNbaV07CisJZnJlZShvbGQtPm5hbWVzKTsKKwlvbGQtPmNudCA9IDA7CisJb2xkLT5uYW1lcyA9IE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKmhlbHBfdW5rbm93bl9jbWQoY29uc3QgY2hhciAqY21kKQoreworCWludCBpLCBuID0gMCwgYmVzdF9zaW1pbGFyaXR5ID0gMDsKKwlzdHJ1Y3QgY21kbmFtZXMgbWFpbl9jbWRzLCBvdGhlcl9jbWRzOworCisJbWVtc2V0KCZtYWluX2NtZHMsIDAsIHNpemVvZihtYWluX2NtZHMpKTsKKwltZW1zZXQoJm90aGVyX2NtZHMsIDAsIHNpemVvZihtYWluX2NtZHMpKTsKKwltZW1zZXQoJmFsaWFzZXMsIDAsIHNpemVvZihhbGlhc2VzKSk7CisKKwlwZXJmX2NvbmZpZyhwZXJmX3Vua25vd25fY21kX2NvbmZpZywgTlVMTCk7CisKKwlsb2FkX2NvbW1hbmRfbGlzdCgicGVyZi0iLCAmbWFpbl9jbWRzLCAmb3RoZXJfY21kcyk7CisKKwlhZGRfY21kX2xpc3QoJm1haW5fY21kcywgJmFsaWFzZXMpOworCWFkZF9jbWRfbGlzdCgmbWFpbl9jbWRzLCAmb3RoZXJfY21kcyk7CisJcXNvcnQobWFpbl9jbWRzLm5hbWVzLCBtYWluX2NtZHMuY250LAorCSAgICAgIHNpemVvZihtYWluX2NtZHMubmFtZXMpLCBjbWRuYW1lX2NvbXBhcmUpOworCXVuaXEoJm1haW5fY21kcyk7CisKKwlpZiAobWFpbl9jbWRzLmNudCkgeworCQkvKiBUaGlzIHJldXNlcyBjbWRuYW1lLT5sZW4gZm9yIHNpbWlsYXJpdHkgaW5kZXggKi8KKwkJZm9yIChpID0gMDsgaSA8IG1haW5fY21kcy5jbnQ7ICsraSkKKwkJCW1haW5fY21kcy5uYW1lc1tpXS0+bGVuID0KKwkJCQlsZXZlbnNodGVpbihjbWQsIG1haW5fY21kcy5uYW1lc1tpXS0+bmFtZSwgMCwgMiwgMSwgNCk7CisKKwkJcXNvcnQobWFpbl9jbWRzLm5hbWVzLCBtYWluX2NtZHMuY250LAorCQkgICAgICBzaXplb2YoKm1haW5fY21kcy5uYW1lcyksIGxldmVuc2h0ZWluX2NvbXBhcmUpOworCisJCWJlc3Rfc2ltaWxhcml0eSA9IG1haW5fY21kcy5uYW1lc1swXS0+bGVuOworCQluID0gMTsKKwkJd2hpbGUgKG4gPCBtYWluX2NtZHMuY250ICYmIGJlc3Rfc2ltaWxhcml0eSA9PSBtYWluX2NtZHMubmFtZXNbbl0tPmxlbikKKwkJCSsrbjsKKwl9CisKKwlpZiAoYXV0b2NvcnJlY3QgJiYgbiA9PSAxKSB7CisJCWNvbnN0IGNoYXIgKmFzc3VtZWQgPSBtYWluX2NtZHMubmFtZXNbMF0tPm5hbWU7CisKKwkJbWFpbl9jbWRzLm5hbWVzWzBdID0gTlVMTDsKKwkJY2xlYW5fY21kbmFtZXMoJm1haW5fY21kcyk7CisJCWZwcmludGYoc3RkZXJyLCAiV0FSTklORzogWW91IGNhbGxlZCBhIEdpdCBwcm9ncmFtIG5hbWVkICclcycsICIKKwkJCSJ3aGljaCBkb2VzIG5vdCBleGlzdC5cbiIKKwkJCSJDb250aW51aW5nIHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgeW91IG1lYW50ICclcydcbiIsCisJCQljbWQsIGFzc3VtZWQpOworCQlpZiAoYXV0b2NvcnJlY3QgPiAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImluICUwLjFmIHNlY29uZHMgYXV0b21hdGljYWxseS4uLlxuIiwKKwkJCQkoZmxvYXQpYXV0b2NvcnJlY3QvMTAuMCk7CisJCQlwb2xsKE5VTEwsIDAsIGF1dG9jb3JyZWN0ICogMTAwKTsKKwkJfQorCQlyZXR1cm4gYXNzdW1lZDsKKwl9CisKKwlmcHJpbnRmKHN0ZGVyciwgInBlcmY6ICclcycgaXMgbm90IGEgcGVyZi1jb21tYW5kLiBTZWUgJ3BlcmYgLS1oZWxwJy5cbiIsIGNtZCk7CisKKwlpZiAobWFpbl9jbWRzLmNudCAmJiBiZXN0X3NpbWlsYXJpdHkgPCA2KSB7CisJCWZwcmludGYoc3RkZXJyLCAiXG5EaWQgeW91IG1lYW4gJXM/XG4iLAorCQkJbiA8IDIgPyAidGhpcyI6ICJvbmUgb2YgdGhlc2UiKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorCQkJZnByaW50ZihzdGRlcnIsICJcdCVzXG4iLCBtYWluX2NtZHMubmFtZXNbaV0tPm5hbWUpOworCX0KKworCWV4aXQoMSk7Cit9CisKK2ludCBjbWRfdmVyc2lvbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlwcmludGYoInBlcmYgdmVyc2lvbiAlc1xuIiwgcGVyZl92ZXJzaW9uX3N0cmluZyk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvaGVscC5oIGIvdG9vbHMvcGVyZi91dGlsL2hlbHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmJjMTU0Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL2hlbHAuaApAQCAtMCwwICsxLDI5IEBACisjaWZuZGVmIEhFTFBfSAorI2RlZmluZSBIRUxQX0gKKworc3RydWN0IGNtZG5hbWVzIHsKKwlpbnQgYWxsb2M7CisJaW50IGNudDsKKwlzdHJ1Y3QgY21kbmFtZSB7CisJCXNpemVfdCBsZW47IC8qIGFsc28gdXNlZCBmb3Igc2ltaWxhcml0eSBpbmRleCBpbiBoZWxwLmMgKi8KKwkJY2hhciBuYW1lW0ZMRVhfQVJSQVldOworCX0gKipuYW1lczsKK307CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtcHV0X2NoYXIoY2hhciBjLCB1bnNpZ25lZCBpbnQgbnVtKQoreworCXdoaWxlKG51bS0tKQorCQlwdXRjaGFyKGMpOworfQorCit2b2lkIGxvYWRfY29tbWFuZF9saXN0KGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJc3RydWN0IGNtZG5hbWVzICptYWluX2NtZHMsCisJCXN0cnVjdCBjbWRuYW1lcyAqb3RoZXJfY21kcyk7Cit2b2lkIGFkZF9jbWRuYW1lKHN0cnVjdCBjbWRuYW1lcyAqY21kcywgY29uc3QgY2hhciAqbmFtZSwgaW50IGxlbik7CisvKiBIZXJlIHdlIHJlcXVpcmUgdGhhdCBleGNsdWRlcyBpcyBhIHNvcnRlZCBsaXN0LiAqLwordm9pZCBleGNsdWRlX2NtZHMoc3RydWN0IGNtZG5hbWVzICpjbWRzLCBzdHJ1Y3QgY21kbmFtZXMgKmV4Y2x1ZGVzKTsKK2ludCBpc19pbl9jbWRsaXN0KHN0cnVjdCBjbWRuYW1lcyAqYywgY29uc3QgY2hhciAqcyk7Cit2b2lkIGxpc3RfY29tbWFuZHMoY29uc3QgY2hhciAqdGl0bGUsIHN0cnVjdCBjbWRuYW1lcyAqbWFpbl9jbWRzLAorCQkgICBzdHJ1Y3QgY21kbmFtZXMgKm90aGVyX2NtZHMpOworCisjZW5kaWYgLyogSEVMUF9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbGV2ZW5zaHRlaW4uYyBiL3Rvb2xzL3BlcmYvdXRpbC9sZXZlbnNodGVpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MjFkMTUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvbGV2ZW5zaHRlaW4uYwpAQCAtMCwwICsxLDg0IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJsZXZlbnNodGVpbi5oIgorCisvKgorICogVGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIHRoZSBEYW1lcmF1LUxldmVuc2h0ZWluIGFsZ29yaXRobSB0bworICogY2FsY3VsYXRlIGEgZGlzdGFuY2UgYmV0d2VlbiBzdHJpbmdzLgorICoKKyAqIEJhc2ljYWxseSwgaXQgc2F5cyBob3cgbWFueSBsZXR0ZXJzIG5lZWQgdG8gYmUgc3dhcHBlZCwgc3Vic3RpdHV0ZWQsCisgKiBkZWxldGVkIGZyb20sIG9yIGFkZGVkIHRvIHN0cmluZzEsIGF0IGxlYXN0LCB0byBnZXQgc3RyaW5nMi4KKyAqCisgKiBUaGUgaWRlYSBpcyB0byBidWlsZCBhIGRpc3RhbmNlIG1hdHJpeCBmb3IgdGhlIHN1YnN0cmluZ3Mgb2YgYm90aAorICogc3RyaW5ncy4gIFRvIGF2b2lkIGEgbGFyZ2Ugc3BhY2UgY29tcGxleGl0eSwgb25seSB0aGUgbGFzdCB0aHJlZSByb3dzCisgKiBhcmUga2VwdCBpbiBtZW1vcnkgKGlmIHN3YXBzIGhhZCB0aGUgc2FtZSBvciBoaWdoZXIgY29zdCBhcyBvbmUgZGVsZXRpb24KKyAqIHBsdXMgb25lIGluc2VydGlvbiwgb25seSB0d28gcm93cyB3b3VsZCBiZSBuZWVkZWQpLgorICoKKyAqIEF0IGFueSBzdGFnZSwgImkgKyAxIiBkZW5vdGVzIHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgc3Vic3RyaW5nIG9mCisgKiBzdHJpbmcxIHRoYXQgdGhlIGRpc3RhbmNlIGlzIGNhbGN1bGF0ZWQgZm9yLgorICoKKyAqIHJvdzIgaG9sZHMgdGhlIGN1cnJlbnQgcm93LCByb3cxIHRoZSBwcmV2aW91cyByb3cgKGkuZS4gZm9yIHRoZSBzdWJzdHJpbmcKKyAqIG9mIHN0cmluZzEgb2YgbGVuZ3RoICJpIiksIGFuZCByb3cwIHRoZSByb3cgYmVmb3JlIHRoYXQuCisgKgorICogSW4gb3RoZXIgd29yZHMsIGF0IHRoZSBzdGFydCBvZiB0aGUgYmlnIGxvb3AsIHJvdzJbaiArIDFdIGNvbnRhaW5zIHRoZQorICogRGFtZXJhdS1MZXZlbnNodGVpbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBzdWJzdHJpbmcgb2Ygc3RyaW5nMSBvZiBsZW5ndGgKKyAqICJpIiBhbmQgdGhlIHN1YnN0cmluZyBvZiBzdHJpbmcyIG9mIGxlbmd0aCAiaiArIDEiLgorICoKKyAqIEFsbCB0aGUgYmlnIGxvb3AgZG9lcyBpcyBkZXRlcm1pbmUgdGhlIHBhcnRpYWwgbWluaW11bS1jb3N0IHBhdGhzLgorICoKKyAqIEl0IGRvZXMgc28gYnkgY2FsY3VsYXRpbmcgdGhlIGNvc3RzIG9mIHRoZSBwYXRoIGVuZGluZyBpbiBjaGFyYWN0ZXJzCisgKiBpIChpbiBzdHJpbmcxKSBhbmQgaiAoaW4gc3RyaW5nMiksIHJlc3BlY3RpdmVseSwgZ2l2ZW4gdGhhdCB0aGUgbGFzdAorICogb3BlcmF0aW9uIGlzIGEgc3Vic3RpdGlvbiwgYSBzd2FwLCBhIGRlbGV0aW9uLCBvciBhbiBpbnNlcnRpb24uCisgKgorICogVGhpcyBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgdGhlIGNvc3RzIHRvIGJlIHdlaWdodGVkOgorICoKKyAqIC0gdyAoYXMgaW4gInNXYXAiKQorICogLSBzIChhcyBpbiAiU3Vic3RpdHV0aW9uIikKKyAqIC0gYSAoZm9yIGluc2VydGlvbiwgQUtBICJBZGQiKQorICogLSBkIChhcyBpbiAiRGVsZXRpb24iKQorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGFsZ29yaXRobSBjYWxjdWxhdGVzIGEgZGlzdGFuY2UgX2lmZl8gZCA9PSBhLgorICovCitpbnQgbGV2ZW5zaHRlaW4oY29uc3QgY2hhciAqc3RyaW5nMSwgY29uc3QgY2hhciAqc3RyaW5nMiwKKwkJaW50IHcsIGludCBzLCBpbnQgYSwgaW50IGQpCit7CisJaW50IGxlbjEgPSBzdHJsZW4oc3RyaW5nMSksIGxlbjIgPSBzdHJsZW4oc3RyaW5nMik7CisJaW50ICpyb3cwID0gbWFsbG9jKHNpemVvZihpbnQpICogKGxlbjIgKyAxKSk7CisJaW50ICpyb3cxID0gbWFsbG9jKHNpemVvZihpbnQpICogKGxlbjIgKyAxKSk7CisJaW50ICpyb3cyID0gbWFsbG9jKHNpemVvZihpbnQpICogKGxlbjIgKyAxKSk7CisJaW50IGksIGo7CisKKwlmb3IgKGogPSAwOyBqIDw9IGxlbjI7IGorKykKKwkJcm93MVtqXSA9IGogKiBhOworCWZvciAoaSA9IDA7IGkgPCBsZW4xOyBpKyspIHsKKwkJaW50ICpkdW1teTsKKworCQlyb3cyWzBdID0gKGkgKyAxKSAqIGQ7CisJCWZvciAoaiA9IDA7IGogPCBsZW4yOyBqKyspIHsKKwkJCS8qIHN1YnN0aXR1dGlvbiAqLworCQkJcm93MltqICsgMV0gPSByb3cxW2pdICsgcyAqIChzdHJpbmcxW2ldICE9IHN0cmluZzJbal0pOworCQkJLyogc3dhcCAqLworCQkJaWYgKGkgPiAwICYmIGogPiAwICYmIHN0cmluZzFbaSAtIDFdID09IHN0cmluZzJbal0gJiYKKwkJCQkJc3RyaW5nMVtpXSA9PSBzdHJpbmcyW2ogLSAxXSAmJgorCQkJCQlyb3cyW2ogKyAxXSA+IHJvdzBbaiAtIDFdICsgdykKKwkJCQlyb3cyW2ogKyAxXSA9IHJvdzBbaiAtIDFdICsgdzsKKwkJCS8qIGRlbGV0aW9uICovCisJCQlpZiAocm93MltqICsgMV0gPiByb3cxW2ogKyAxXSArIGQpCisJCQkJcm93MltqICsgMV0gPSByb3cxW2ogKyAxXSArIGQ7CisJCQkvKiBpbnNlcnRpb24gKi8KKwkJCWlmIChyb3cyW2ogKyAxXSA+IHJvdzJbal0gKyBhKQorCQkJCXJvdzJbaiArIDFdID0gcm93MltqXSArIGE7CisJCX0KKworCQlkdW1teSA9IHJvdzA7CisJCXJvdzAgPSByb3cxOworCQlyb3cxID0gcm93MjsKKwkJcm93MiA9IGR1bW15OworCX0KKworCWkgPSByb3cxW2xlbjJdOworCWZyZWUocm93MCk7CisJZnJlZShyb3cxKTsKKwlmcmVlKHJvdzIpOworCisJcmV0dXJuIGk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvbGV2ZW5zaHRlaW4uaCBiL3Rvb2xzL3BlcmYvdXRpbC9sZXZlbnNodGVpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNzNhYmUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvbGV2ZW5zaHRlaW4uaApAQCAtMCwwICsxLDggQEAKKyNpZm5kZWYgTEVWRU5TSFRFSU5fSAorI2RlZmluZSBMRVZFTlNIVEVJTl9ICisKK2ludCBsZXZlbnNodGVpbihjb25zdCBjaGFyICpzdHJpbmcxLCBjb25zdCBjaGFyICpzdHJpbmcyLAorCWludCBzd2FwX3BlbmFsdHksIGludCBzdWJzdGl0aW9uX3BlbmFsdHksCisJaW50IGluc2VydGlvbl9wZW5hbHR5LCBpbnQgZGVsZXRpb25fcGVuYWx0eSk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL2xpc3QuaCBiL3Rvb2xzL3BlcmYvdXRpbC9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1NDhlOAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9saXN0LmgKQEAgLTAsMCArMSw2MDMgQEAKKyNpZm5kZWYgX0xJTlVYX0xJU1RfSAorI2RlZmluZSBfTElOVVhfTElTVF9ICisvKgorICBDb3B5cmlnaHQgKEMpIENhc3Qgb2YgZG96ZW5zLCBjb21lcyBmcm9tIHRoZSBMaW51eCBrZXJuZWwKKworICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICB1bmRlciB0aGUgdGVybXMgb2YgdmVyc2lvbiAyIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcworICBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbi4KKyovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworLyoKKyAqIFRoZXNlIGFyZSBub24tTlVMTCBwb2ludGVycyB0aGF0IHdpbGwgcmVzdWx0IGluIHBhZ2UgZmF1bHRzCisgKiB1bmRlciBub3JtYWwgY2lyY3Vtc3RhbmNlcywgdXNlZCB0byB2ZXJpZnkgdGhhdCBub2JvZHkgdXNlcworICogbm9uLWluaXRpYWxpemVkIGxpc3QgZW50cmllcy4KKyAqLworI2RlZmluZSBMSVNUX1BPSVNPTjEgKCh2b2lkICopMHgwMDEwMDEwMCkKKyNkZWZpbmUgTElTVF9QT0lTT04yICgodm9pZCAqKTB4MDAyMDAyMDApCisKKy8qKgorICogY29udGFpbmVyX29mIC0gY2FzdCBhIG1lbWJlciBvZiBhIHN0cnVjdHVyZSBvdXQgdG8gdGhlIGNvbnRhaW5pbmcgc3RydWN0dXJlCisgKiBAcHRyOgl0aGUgcG9pbnRlciB0byB0aGUgbWVtYmVyLgorICogQHR5cGU6CXRoZSB0eXBlIG9mIHRoZSBjb250YWluZXIgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbWVtYmVyIHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqLworI2RlZmluZSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpICh7CQkJXAorICAgICAgICBjb25zdCB0eXBlb2YoICgodHlwZSAqKTApLT5tZW1iZXIgKSAqX19tcHRyID0gKHB0cik7CVwKKyAgICAgICAgKHR5cGUgKikoIChjaGFyICopX19tcHRyIC0gb2Zmc2V0b2YodHlwZSxtZW1iZXIpICk7fSkKKworLyoKKyAqIFNpbXBsZSBkb3VibHkgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24uCisgKgorICogU29tZSBvZiB0aGUgaW50ZXJuYWwgZnVuY3Rpb25zICgiX194eHgiKSBhcmUgdXNlZnVsIHdoZW4KKyAqIG1hbmlwdWxhdGluZyB3aG9sZSBsaXN0cyByYXRoZXIgdGhhbiBzaW5nbGUgZW50cmllcywgYXMKKyAqIHNvbWV0aW1lcyB3ZSBhbHJlYWR5IGtub3cgdGhlIG5leHQvcHJldiBlbnRyaWVzIGFuZCB3ZSBjYW4KKyAqIGdlbmVyYXRlIGJldHRlciBjb2RlIGJ5IHVzaW5nIHRoZW0gZGlyZWN0bHkgcmF0aGVyIHRoYW4KKyAqIHVzaW5nIHRoZSBnZW5lcmljIHNpbmdsZS1lbnRyeSByb3V0aW5lcy4KKyAqLworCitzdHJ1Y3QgbGlzdF9oZWFkIHsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpuZXh0LCAqcHJldjsKK307CisKKyNkZWZpbmUgTElTVF9IRUFEX0lOSVQobmFtZSkgeyAmKG5hbWUpLCAmKG5hbWUpIH0KKworI2RlZmluZSBMSVNUX0hFQUQobmFtZSkgXAorCXN0cnVjdCBsaXN0X2hlYWQgbmFtZSA9IExJU1RfSEVBRF9JTklUKG5hbWUpCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBJTklUX0xJU1RfSEVBRChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0KQoreworCWxpc3QtPm5leHQgPSBsaXN0OworCWxpc3QtPnByZXYgPSBsaXN0OworfQorCisvKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJldHdlZW4gdHdvIGtub3duIGNvbnNlY3V0aXZlIGVudHJpZXMuCisgKgorICogVGhpcyBpcyBvbmx5IGZvciBpbnRlcm5hbCBsaXN0IG1hbmlwdWxhdGlvbiB3aGVyZSB3ZSBrbm93CisgKiB0aGUgcHJldi9uZXh0IGVudHJpZXMgYWxyZWFkeSEKKyAqLworc3RhdGljIGlubGluZSB2b2lkIF9fbGlzdF9hZGQoc3RydWN0IGxpc3RfaGVhZCAqbmV3LAorCQkJICAgICAgc3RydWN0IGxpc3RfaGVhZCAqcHJldiwKKwkJCSAgICAgIHN0cnVjdCBsaXN0X2hlYWQgKm5leHQpCit7CisJbmV4dC0+cHJldiA9IG5ldzsKKwluZXctPm5leHQgPSBuZXh0OworCW5ldy0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5ldzsKK30KKworLyoqCisgKiBsaXN0X2FkZCAtIGFkZCBhIG5ldyBlbnRyeQorICogQG5ldzogbmV3IGVudHJ5IHRvIGJlIGFkZGVkCisgKiBAaGVhZDogbGlzdCBoZWFkIHRvIGFkZCBpdCBhZnRlcgorICoKKyAqIEluc2VydCBhIG5ldyBlbnRyeSBhZnRlciB0aGUgc3BlY2lmaWVkIGhlYWQuCisgKiBUaGlzIGlzIGdvb2QgZm9yIGltcGxlbWVudGluZyBzdGFja3MuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2FkZChzdHJ1Y3QgbGlzdF9oZWFkICpuZXcsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJX19saXN0X2FkZChuZXcsIGhlYWQsIGhlYWQtPm5leHQpOworfQorCisvKioKKyAqIGxpc3RfYWRkX3RhaWwgLSBhZGQgYSBuZXcgZW50cnkKKyAqIEBuZXc6IG5ldyBlbnRyeSB0byBiZSBhZGRlZAorICogQGhlYWQ6IGxpc3QgaGVhZCB0byBhZGQgaXQgYmVmb3JlCisgKgorICogSW5zZXJ0IGEgbmV3IGVudHJ5IGJlZm9yZSB0aGUgc3BlY2lmaWVkIGhlYWQuCisgKiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHF1ZXVlcy4KKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfYWRkX3RhaWwoc3RydWN0IGxpc3RfaGVhZCAqbmV3LCBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCV9fbGlzdF9hZGQobmV3LCBoZWFkLT5wcmV2LCBoZWFkKTsKK30KKworLyoKKyAqIERlbGV0ZSBhIGxpc3QgZW50cnkgYnkgbWFraW5nIHRoZSBwcmV2L25leHQgZW50cmllcworICogcG9pbnQgdG8gZWFjaCBvdGhlci4KKyAqCisgKiBUaGlzIGlzIG9ubHkgZm9yIGludGVybmFsIGxpc3QgbWFuaXB1bGF0aW9uIHdoZXJlIHdlIGtub3cKKyAqIHRoZSBwcmV2L25leHQgZW50cmllcyBhbHJlYWR5IQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X2RlbChzdHJ1Y3QgbGlzdF9oZWFkICogcHJldiwgc3RydWN0IGxpc3RfaGVhZCAqIG5leHQpCit7CisJbmV4dC0+cHJldiA9IHByZXY7CisJcHJldi0+bmV4dCA9IG5leHQ7Cit9CisKKy8qKgorICogbGlzdF9kZWwgLSBkZWxldGVzIGVudHJ5IGZyb20gbGlzdC4KKyAqIEBlbnRyeTogdGhlIGVsZW1lbnQgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKiBOb3RlOiBsaXN0X2VtcHR5IG9uIGVudHJ5IGRvZXMgbm90IHJldHVybiB0cnVlIGFmdGVyIHRoaXMsIHRoZSBlbnRyeSBpcworICogaW4gYW4gdW5kZWZpbmVkIHN0YXRlLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9kZWwoc3RydWN0IGxpc3RfaGVhZCAqZW50cnkpCit7CisJX19saXN0X2RlbChlbnRyeS0+cHJldiwgZW50cnktPm5leHQpOworCWVudHJ5LT5uZXh0ID0gTElTVF9QT0lTT04xOworCWVudHJ5LT5wcmV2ID0gTElTVF9QT0lTT04yOworfQorCisvKioKKyAqIGxpc3RfZGVsX3JhbmdlIC0gZGVsZXRlcyByYW5nZSBvZiBlbnRyaWVzIGZyb20gbGlzdC4KKyAqIEBiZWdpbmc6IGZpcnN0IGVsZW1lbnQgaW4gdGhlIHJhbmdlIHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0LgorICogQGJlZ2luZzogZmlyc3QgZWxlbWVudCBpbiB0aGUgcmFuZ2UgdG8gZGVsZXRlIGZyb20gdGhlIGxpc3QuCisgKiBOb3RlOiBsaXN0X2VtcHR5IG9uIHRoZSByYW5nZSBvZiBlbnRyaWVzIGRvZXMgbm90IHJldHVybiB0cnVlIGFmdGVyIHRoaXMsCisgKiB0aGUgZW50cmllcyBpcyBpbiBhbiB1bmRlZmluZWQgc3RhdGUuCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X2RlbF9yYW5nZShzdHJ1Y3QgbGlzdF9oZWFkICpiZWdpbiwKKwkJCQkgIHN0cnVjdCBsaXN0X2hlYWQgKmVuZCkKK3sKKwliZWdpbi0+cHJldi0+bmV4dCA9IGVuZC0+bmV4dDsKKwllbmQtPm5leHQtPnByZXYgPSBiZWdpbi0+cHJldjsKK30KKworLyoqCisgKiBsaXN0X3JlcGxhY2UgLSByZXBsYWNlIG9sZCBlbnRyeSBieSBuZXcgb25lCisgKiBAb2xkIDogdGhlIGVsZW1lbnQgdG8gYmUgcmVwbGFjZWQKKyAqIEBuZXcgOiB0aGUgbmV3IGVsZW1lbnQgdG8gaW5zZXJ0CisgKiBOb3RlOiBpZiAnb2xkJyB3YXMgZW1wdHksIGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X3JlcGxhY2Uoc3RydWN0IGxpc3RfaGVhZCAqb2xkLAorCQkJCXN0cnVjdCBsaXN0X2hlYWQgKm5ldykKK3sKKwluZXctPm5leHQgPSBvbGQtPm5leHQ7CisJbmV3LT5uZXh0LT5wcmV2ID0gbmV3OworCW5ldy0+cHJldiA9IG9sZC0+cHJldjsKKwluZXctPnByZXYtPm5leHQgPSBuZXc7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBsaXN0X3JlcGxhY2VfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpvbGQsCisJCQkJCXN0cnVjdCBsaXN0X2hlYWQgKm5ldykKK3sKKwlsaXN0X3JlcGxhY2Uob2xkLCBuZXcpOworCUlOSVRfTElTVF9IRUFEKG9sZCk7Cit9CisKKy8qKgorICogbGlzdF9kZWxfaW5pdCAtIGRlbGV0ZXMgZW50cnkgZnJvbSBsaXN0IGFuZCByZWluaXRpYWxpemUgaXQuCisgKiBAZW50cnk6IHRoZSBlbGVtZW50IHRvIGRlbGV0ZSBmcm9tIHRoZSBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9kZWxfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICplbnRyeSkKK3sKKwlfX2xpc3RfZGVsKGVudHJ5LT5wcmV2LCBlbnRyeS0+bmV4dCk7CisJSU5JVF9MSVNUX0hFQUQoZW50cnkpOworfQorCisvKioKKyAqIGxpc3RfbW92ZSAtIGRlbGV0ZSBmcm9tIG9uZSBsaXN0IGFuZCBhZGQgYXMgYW5vdGhlcidzIGhlYWQKKyAqIEBsaXN0OiB0aGUgZW50cnkgdG8gbW92ZQorICogQGhlYWQ6IHRoZSBoZWFkIHRoYXQgd2lsbCBwcmVjZWRlIG91ciBlbnRyeQorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9tb3ZlKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsIHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisgICAgICAgIF9fbGlzdF9kZWwobGlzdC0+cHJldiwgbGlzdC0+bmV4dCk7CisgICAgICAgIGxpc3RfYWRkKGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxpc3RfbW92ZV90YWlsIC0gZGVsZXRlIGZyb20gb25lIGxpc3QgYW5kIGFkZCBhcyBhbm90aGVyJ3MgdGFpbAorICogQGxpc3Q6IHRoZSBlbnRyeSB0byBtb3ZlCisgKiBAaGVhZDogdGhlIGhlYWQgdGhhdCB3aWxsIGZvbGxvdyBvdXIgZW50cnkKKyAqLworc3RhdGljIGlubGluZSB2b2lkIGxpc3RfbW92ZV90YWlsKHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworICAgICAgICBfX2xpc3RfZGVsKGxpc3QtPnByZXYsIGxpc3QtPm5leHQpOworICAgICAgICBsaXN0X2FkZF90YWlsKGxpc3QsIGhlYWQpOworfQorCisvKioKKyAqIGxpc3RfaXNfbGFzdCAtIHRlc3RzIHdoZXRoZXIgQGxpc3QgaXMgdGhlIGxhc3QgZW50cnkgaW4gbGlzdCBAaGVhZAorICogQGxpc3Q6IHRoZSBlbnRyeSB0byB0ZXN0CisgKiBAaGVhZDogdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqLworc3RhdGljIGlubGluZSBpbnQgbGlzdF9pc19sYXN0KGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmxpc3QsCisJCQkJY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gbGlzdC0+bmV4dCA9PSBoZWFkOworfQorCisvKioKKyAqIGxpc3RfZW1wdHkgLSB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eQorICogQGhlYWQ6IHRoZSBsaXN0IHRvIHRlc3QuCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IGxpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlyZXR1cm4gaGVhZC0+bmV4dCA9PSBoZWFkOworfQorCisvKioKKyAqIGxpc3RfZW1wdHlfY2FyZWZ1bCAtIHRlc3RzIHdoZXRoZXIgYSBsaXN0IGlzIGVtcHR5IGFuZCBub3QgYmVpbmcgbW9kaWZpZWQKKyAqIEBoZWFkOiB0aGUgbGlzdCB0byB0ZXN0CisgKgorICogRGVzY3JpcHRpb246CisgKiB0ZXN0cyB3aGV0aGVyIGEgbGlzdCBpcyBlbXB0eSBfYW5kXyBjaGVja3MgdGhhdCBubyBvdGhlciBDUFUgbWlnaHQgYmUKKyAqIGluIHRoZSBwcm9jZXNzIG9mIG1vZGlmeWluZyBlaXRoZXIgbWVtYmVyIChuZXh0IG9yIHByZXYpCisgKgorICogTk9URTogdXNpbmcgbGlzdF9lbXB0eV9jYXJlZnVsKCkgd2l0aG91dCBzeW5jaHJvbml6YXRpb24KKyAqIGNhbiBvbmx5IGJlIHNhZmUgaWYgdGhlIG9ubHkgYWN0aXZpdHkgdGhhdCBjYW4gaGFwcGVuCisgKiB0byB0aGUgbGlzdCBlbnRyeSBpcyBsaXN0X2RlbF9pbml0KCkuIEVnLiBpdCBjYW5ub3QgYmUgdXNlZAorICogaWYgYW5vdGhlciBDUFUgY291bGQgcmUtbGlzdF9hZGQoKSBpdC4KKyAqLworc3RhdGljIGlubGluZSBpbnQgbGlzdF9lbXB0eV9jYXJlZnVsKGNvbnN0IHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQpCit7CisJc3RydWN0IGxpc3RfaGVhZCAqbmV4dCA9IGhlYWQtPm5leHQ7CisJcmV0dXJuIChuZXh0ID09IGhlYWQpICYmIChuZXh0ID09IGhlYWQtPnByZXYpOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgX19saXN0X3NwbGljZShzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsaXN0X2hlYWQgKmZpcnN0ID0gbGlzdC0+bmV4dDsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpsYXN0ID0gbGlzdC0+cHJldjsKKwlzdHJ1Y3QgbGlzdF9oZWFkICphdCA9IGhlYWQtPm5leHQ7CisKKwlmaXJzdC0+cHJldiA9IGhlYWQ7CisJaGVhZC0+bmV4dCA9IGZpcnN0OworCisJbGFzdC0+bmV4dCA9IGF0OworCWF0LT5wcmV2ID0gbGFzdDsKK30KKworLyoqCisgKiBsaXN0X3NwbGljZSAtIGpvaW4gdHdvIGxpc3RzCisgKiBAbGlzdDogdGhlIG5ldyBsaXN0IHRvIGFkZC4KKyAqIEBoZWFkOiB0aGUgcGxhY2UgdG8gYWRkIGl0IGluIHRoZSBmaXJzdCBsaXN0LgorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2Uoc3RydWN0IGxpc3RfaGVhZCAqbGlzdCwgc3RydWN0IGxpc3RfaGVhZCAqaGVhZCkKK3sKKwlpZiAoIWxpc3RfZW1wdHkobGlzdCkpCisJCV9fbGlzdF9zcGxpY2UobGlzdCwgaGVhZCk7Cit9CisKKy8qKgorICogbGlzdF9zcGxpY2VfaW5pdCAtIGpvaW4gdHdvIGxpc3RzIGFuZCByZWluaXRpYWxpc2UgdGhlIGVtcHRpZWQgbGlzdC4KKyAqIEBsaXN0OiB0aGUgbmV3IGxpc3QgdG8gYWRkLgorICogQGhlYWQ6IHRoZSBwbGFjZSB0byBhZGQgaXQgaW4gdGhlIGZpcnN0IGxpc3QuCisgKgorICogVGhlIGxpc3QgYXQgQGxpc3QgaXMgcmVpbml0aWFsaXNlZAorICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGlzdF9zcGxpY2VfaW5pdChzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0LAorCQkJCSAgICBzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkKQoreworCWlmICghbGlzdF9lbXB0eShsaXN0KSkgeworCQlfX2xpc3Rfc3BsaWNlKGxpc3QsIGhlYWQpOworCQlJTklUX0xJU1RfSEVBRChsaXN0KTsKKwl9Cit9CisKKy8qKgorICogbGlzdF9lbnRyeSAtIGdldCB0aGUgc3RydWN0IGZvciB0aGlzIGVudHJ5CisgKiBAcHRyOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgcG9pbnRlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgc3RydWN0IHRoaXMgaXMgZW1iZWRkZWQgaW4uCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgbGlzdF9lbnRyeShwdHIsIHR5cGUsIG1lbWJlcikgXAorCWNvbnRhaW5lcl9vZihwdHIsIHR5cGUsIG1lbWJlcikKKworLyoqCisgKiBsaXN0X2ZpcnN0X2VudHJ5IC0gZ2V0IHRoZSBmaXJzdCBlbGVtZW50IGZyb20gYSBsaXN0CisgKiBAcHRyOiAgICAgICB0aGUgbGlzdCBoZWFkIHRvIHRha2UgdGhlIGVsZW1lbnQgZnJvbS4KKyAqIEB0eXBlOiAgICAgIHRoZSB0eXBlIG9mIHRoZSBzdHJ1Y3QgdGhpcyBpcyBlbWJlZGRlZCBpbi4KKyAqIEBtZW1iZXI6ICAgIHRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBOb3RlLCB0aGF0IGxpc3QgaXMgZXhwZWN0ZWQgdG8gYmUgbm90IGVtcHR5LgorICovCisjZGVmaW5lIGxpc3RfZmlyc3RfZW50cnkocHRyLCB0eXBlLCBtZW1iZXIpIFwKKwlsaXN0X2VudHJ5KChwdHIpLT5uZXh0LCB0eXBlLCBtZW1iZXIpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaAktCWl0ZXJhdGUgb3ZlciBhIGxpc3QKKyAqIEBwb3M6CXRoZSAmc3RydWN0IGxpc3RfaGVhZCB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKKyAgICAgICAgCXBvcyA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBfX2xpc3RfZm9yX2VhY2gJLQlpdGVyYXRlIG92ZXIgYSBsaXN0CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqCisgKiBUaGlzIHZhcmlhbnQgZGlmZmVycyBmcm9tIGxpc3RfZm9yX2VhY2goKSBpbiB0aGF0IGl0J3MgdGhlCisgKiBzaW1wbGVzdCBwb3NzaWJsZSBsaXN0IGl0ZXJhdGlvbiBjb2RlLCBubyBwcmVmZXRjaGluZyBpcyBkb25lLgorICogVXNlIHRoaXMgZm9yIGNvZGUgdGhhdCBrbm93cyB0aGUgbGlzdCB0byBiZSB2ZXJ5IHNob3J0IChlbXB0eQorICogb3IgMSBlbnRyeSkgbW9zdCBvZiB0aGUgdGltZS4KKyAqLworI2RlZmluZSBfX2xpc3RfZm9yX2VhY2gocG9zLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQ7IHBvcyAhPSAoaGVhZCk7IHBvcyA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX3ByZXYJLQlpdGVyYXRlIG92ZXIgYSBsaXN0IGJhY2t3YXJkcworICogQHBvczoJdGhlICZzdHJ1Y3QgbGlzdF9oZWFkIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9wcmV2KHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5wcmV2OyBwb3MgIT0gKGhlYWQpOyBcCisgICAgICAgIAlwb3MgPSBwb3MtPnByZXYpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9zYWZlIC0gaXRlcmF0ZSBvdmVyIGEgbGlzdCBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbjoJCWFub3RoZXIgJnN0cnVjdCBsaXN0X2hlYWQgdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX3NhZmUocG9zLCBuLCBoZWFkKSBcCisJZm9yIChwb3MgPSAoaGVhZCktPm5leHQsIG4gPSBwb3MtPm5leHQ7IHBvcyAhPSAoaGVhZCk7IFwKKwkJcG9zID0gbiwgbiA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5CS0JaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpCQkJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkoKGhlYWQpLT5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CVwKKwkgICAgICZwb3MtPm1lbWJlciAhPSAoaGVhZCk7IAlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UgLSBpdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZS4KKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3JldmVyc2UocG9zLCBoZWFkLCBtZW1iZXIpCQkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeSgoaGVhZCktPnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCVwKKwkgICAgIHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIucHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQorCisvKioKKyAqIGxpc3RfcHJlcGFyZV9lbnRyeSAtIHByZXBhcmUgYSBwb3MgZW50cnkgZm9yIHVzZSBpbiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIHN0YXJ0IHBvaW50CisgKiBAaGVhZDoJdGhlIGhlYWQgb2YgdGhlIGxpc3QKKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBQcmVwYXJlcyBhIHBvcyBlbnRyeSBmb3IgdXNlIGFzIGEgc3RhcnQgcG9pbnQgaW4gbGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZS4KKyAqLworI2RlZmluZSBsaXN0X3ByZXBhcmVfZW50cnkocG9zLCBoZWFkLCBtZW1iZXIpIFwKKwkoKHBvcykgPyA6IGxpc3RfZW50cnkoaGVhZCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUgLSBjb250aW51ZSBpdGVyYXRpb24gb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBDb250aW51ZSB0byBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLCBjb250aW51aW5nIGFmdGVyCisgKiB0aGUgY3VycmVudCBwb3NpdGlvbi4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2NvbnRpbnVlKHBvcywgaGVhZCwgbWVtYmVyKSAJCVwKKwlmb3IgKHBvcyA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOwlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwlcCisJICAgICBwb3MgPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20gLSBpdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlIGZyb20gdGhlIGN1cnJlbnQgcG9pbnQKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBJdGVyYXRlIG92ZXIgbGlzdCBvZiBnaXZlbiB0eXBlLCBjb250aW51aW5nIGZyb20gY3VycmVudCBwb3NpdGlvbi4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X2Zyb20ocG9zLCBoZWFkLCBtZW1iZXIpIAkJCVwKKwlmb3IgKDsgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJXAorCSAgICAgcG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcikpCisKKy8qKgorICogbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlIC0gaXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSBzYWZlIGFnYWluc3QgcmVtb3ZhbCBvZiBsaXN0IGVudHJ5CisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICovCisjZGVmaW5lIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShwb3MsIG4sIGhlYWQsIG1lbWJlcikJCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+bmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLm5leHQsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUKKyAqIEBwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbjoJCWFub3RoZXIgdHlwZSAqIHRvIHVzZSBhcyB0ZW1wb3Jhcnkgc3RvcmFnZQorICogQGhlYWQ6CXRoZSBoZWFkIGZvciB5b3VyIGxpc3QuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgbGlzdF9zdHJ1Y3Qgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKgorICogSXRlcmF0ZSBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgY29udGludWluZyBhZnRlciBjdXJyZW50IHBvaW50LAorICogc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfY29udGludWUocG9zLCBuLCBoZWFkLCBtZW1iZXIpIAkJXAorCWZvciAocG9zID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlciksIAkJXAorCQluID0gbGlzdF9lbnRyeShwb3MtPm1lbWJlci5uZXh0LCB0eXBlb2YoKnBvcyksIG1lbWJlcik7CQlcCisJICAgICAmcG9zLT5tZW1iZXIgIT0gKGhlYWQpOwkJCQkJCVwKKwkgICAgIHBvcyA9IG4sIG4gPSBsaXN0X2VudHJ5KG4tPm1lbWJlci5uZXh0LCB0eXBlb2YoKm4pLCBtZW1iZXIpKQorCisvKioKKyAqIGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZV9mcm9tCisgKiBAcG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyIHR5cGUgKiB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGxpc3Rfc3RydWN0IHdpdGhpbiB0aGUgc3RydWN0LgorICoKKyAqIEl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgZnJvbSBjdXJyZW50IHBvaW50LCBzYWZlIGFnYWluc3QKKyAqIHJlbW92YWwgb2YgbGlzdCBlbnRyeS4KKyAqLworI2RlZmluZSBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfZnJvbShwb3MsIG4sIGhlYWQsIG1lbWJlcikgCQkJXAorCWZvciAobiA9IGxpc3RfZW50cnkocG9zLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpOwkJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsJCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIubmV4dCwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoqCisgKiBsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmVfcmV2ZXJzZQorICogQHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBuOgkJYW5vdGhlciB0eXBlICogdG8gdXNlIGFzIHRlbXBvcmFyeSBzdG9yYWdlCisgKiBAaGVhZDoJdGhlIGhlYWQgZm9yIHlvdXIgbGlzdC4KKyAqIEBtZW1iZXI6CXRoZSBuYW1lIG9mIHRoZSBsaXN0X3N0cnVjdCB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKiBJdGVyYXRlIGJhY2t3YXJkcyBvdmVyIGxpc3Qgb2YgZ2l2ZW4gdHlwZSwgc2FmZSBhZ2FpbnN0IHJlbW92YWwKKyAqIG9mIGxpc3QgZW50cnkuCisgKi8KKyNkZWZpbmUgbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlX3JldmVyc2UocG9zLCBuLCBoZWFkLCBtZW1iZXIpCQlcCisJZm9yIChwb3MgPSBsaXN0X2VudHJ5KChoZWFkKS0+cHJldiwgdHlwZW9mKCpwb3MpLCBtZW1iZXIpLAlcCisJCW4gPSBsaXN0X2VudHJ5KHBvcy0+bWVtYmVyLnByZXYsIHR5cGVvZigqcG9zKSwgbWVtYmVyKTsJXAorCSAgICAgJnBvcy0+bWVtYmVyICE9IChoZWFkKTsgCQkJCQlcCisJICAgICBwb3MgPSBuLCBuID0gbGlzdF9lbnRyeShuLT5tZW1iZXIucHJldiwgdHlwZW9mKCpuKSwgbWVtYmVyKSkKKworLyoKKyAqIERvdWJsZSBsaW5rZWQgbGlzdHMgd2l0aCBhIHNpbmdsZSBwb2ludGVyIGxpc3QgaGVhZC4KKyAqIE1vc3RseSB1c2VmdWwgZm9yIGhhc2ggdGFibGVzIHdoZXJlIHRoZSB0d28gcG9pbnRlciBsaXN0IGhlYWQgaXMKKyAqIHRvbyB3YXN0ZWZ1bC4KKyAqIFlvdSBsb3NlIHRoZSBhYmlsaXR5IHRvIGFjY2VzcyB0aGUgdGFpbCBpbiBPKDEpLgorICovCisKK3N0cnVjdCBobGlzdF9oZWFkIHsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqZmlyc3Q7Cit9OworCitzdHJ1Y3QgaGxpc3Rfbm9kZSB7CisJc3RydWN0IGhsaXN0X25vZGUgKm5leHQsICoqcHByZXY7Cit9OworCisjZGVmaW5lIEhMSVNUX0hFQURfSU5JVCB7IC5maXJzdCA9IE5VTEwgfQorI2RlZmluZSBITElTVF9IRUFEKG5hbWUpIHN0cnVjdCBobGlzdF9oZWFkIG5hbWUgPSB7ICAuZmlyc3QgPSBOVUxMIH0KKyNkZWZpbmUgSU5JVF9ITElTVF9IRUFEKHB0cikgKChwdHIpLT5maXJzdCA9IE5VTEwpCitzdGF0aWMgaW5saW5lIHZvaWQgSU5JVF9ITElTVF9OT0RFKHN0cnVjdCBobGlzdF9ub2RlICpoKQoreworCWgtPm5leHQgPSBOVUxMOworCWgtPnBwcmV2ID0gTlVMTDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGxpc3RfdW5oYXNoZWQoY29uc3Qgc3RydWN0IGhsaXN0X25vZGUgKmgpCit7CisJcmV0dXJuICFoLT5wcHJldjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGxpc3RfZW1wdHkoY29uc3Qgc3RydWN0IGhsaXN0X2hlYWQgKmgpCit7CisJcmV0dXJuICFoLT5maXJzdDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIF9faGxpc3RfZGVsKHN0cnVjdCBobGlzdF9ub2RlICpuKQoreworCXN0cnVjdCBobGlzdF9ub2RlICpuZXh0ID0gbi0+bmV4dDsKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqKnBwcmV2ID0gbi0+cHByZXY7CisJKnBwcmV2ID0gbmV4dDsKKwlpZiAobmV4dCkKKwkJbmV4dC0+cHByZXYgPSBwcHJldjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhsaXN0X2RlbChzdHJ1Y3QgaGxpc3Rfbm9kZSAqbikKK3sKKwlfX2hsaXN0X2RlbChuKTsKKwluLT5uZXh0ID0gTElTVF9QT0lTT04xOworCW4tPnBwcmV2ID0gTElTVF9QT0lTT04yOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaGxpc3RfZGVsX2luaXQoc3RydWN0IGhsaXN0X25vZGUgKm4pCit7CisJaWYgKCFobGlzdF91bmhhc2hlZChuKSkgeworCQlfX2hsaXN0X2RlbChuKTsKKwkJSU5JVF9ITElTVF9OT0RFKG4pOworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIGhsaXN0X2FkZF9oZWFkKHN0cnVjdCBobGlzdF9ub2RlICpuLCBzdHJ1Y3QgaGxpc3RfaGVhZCAqaCkKK3sKKwlzdHJ1Y3QgaGxpc3Rfbm9kZSAqZmlyc3QgPSBoLT5maXJzdDsKKwluLT5uZXh0ID0gZmlyc3Q7CisJaWYgKGZpcnN0KQorCQlmaXJzdC0+cHByZXYgPSAmbi0+bmV4dDsKKwloLT5maXJzdCA9IG47CisJbi0+cHByZXYgPSAmaC0+Zmlyc3Q7Cit9CisKKy8qIG5leHQgbXVzdCBiZSAhPSBOVUxMICovCitzdGF0aWMgaW5saW5lIHZvaWQgaGxpc3RfYWRkX2JlZm9yZShzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwKKwkJCQkJc3RydWN0IGhsaXN0X25vZGUgKm5leHQpCit7CisJbi0+cHByZXYgPSBuZXh0LT5wcHJldjsKKwluLT5uZXh0ID0gbmV4dDsKKwluZXh0LT5wcHJldiA9ICZuLT5uZXh0OworCSoobi0+cHByZXYpID0gbjsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGhsaXN0X2FkZF9hZnRlcihzdHJ1Y3QgaGxpc3Rfbm9kZSAqbiwKKwkJCQkJc3RydWN0IGhsaXN0X25vZGUgKm5leHQpCit7CisJbmV4dC0+bmV4dCA9IG4tPm5leHQ7CisJbi0+bmV4dCA9IG5leHQ7CisJbmV4dC0+cHByZXYgPSAmbi0+bmV4dDsKKworCWlmKG5leHQtPm5leHQpCisJCW5leHQtPm5leHQtPnBwcmV2ICA9ICZuZXh0LT5uZXh0OworfQorCisjZGVmaW5lIGhsaXN0X2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBjb250YWluZXJfb2YocHRyLHR5cGUsbWVtYmVyKQorCisjZGVmaW5lIGhsaXN0X2Zvcl9lYWNoKHBvcywgaGVhZCkgXAorCWZvciAocG9zID0gKGhlYWQpLT5maXJzdDsgcG9zOyBcCisJICAgICBwb3MgPSBwb3MtPm5leHQpCisKKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfc2FmZShwb3MsIG4sIGhlYWQpIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+Zmlyc3Q7IHBvcyAmJiAoeyBuID0gcG9zLT5uZXh0OyAxOyB9KTsgXAorCSAgICAgcG9zID0gbikKKworLyoqCisgKiBobGlzdF9mb3JfZWFjaF9lbnRyeQktIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUKKyAqIEB0cG9zOgl0aGUgdHlwZSAqIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQHBvczoJdGhlICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnkodHBvcywgcG9zLCBoZWFkLCBtZW1iZXIpCQkJIFwKKwlmb3IgKHBvcyA9IChoZWFkKS0+Zmlyc3Q7CQkJCQkgXAorCSAgICAgcG9zICYmIAkJCSBcCisJCSh7IHRwb3MgPSBobGlzdF9lbnRyeShwb3MsIHR5cGVvZigqdHBvcyksIG1lbWJlcik7IDE7fSk7IFwKKwkgICAgIHBvcyA9IHBvcy0+bmV4dCkKKworLyoqCisgKiBobGlzdF9mb3JfZWFjaF9lbnRyeV9jb250aW51ZSAtIGl0ZXJhdGUgb3ZlciBhIGhsaXN0IGNvbnRpbnVpbmcgYWZ0ZXIgY3VycmVudCBwb2ludAorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnlfY29udGludWUodHBvcywgcG9zLCBtZW1iZXIpCQkgXAorCWZvciAocG9zID0gKHBvcyktPm5leHQ7CQkJCQkJIFwKKwkgICAgIHBvcyAmJiAJCQkgXAorCQkoeyB0cG9zID0gaGxpc3RfZW50cnkocG9zLCB0eXBlb2YoKnRwb3MpLCBtZW1iZXIpOyAxO30pOyBcCisJICAgICBwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogaGxpc3RfZm9yX2VhY2hfZW50cnlfZnJvbSAtIGl0ZXJhdGUgb3ZlciBhIGhsaXN0IGNvbnRpbnVpbmcgZnJvbSBjdXJyZW50IHBvaW50CisgKiBAdHBvczoJdGhlIHR5cGUgKiB0byB1c2UgYXMgYSBsb29wIGN1cnNvci4KKyAqIEBwb3M6CXRoZSAmc3RydWN0IGhsaXN0X25vZGUgdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAbWVtYmVyOgl0aGUgbmFtZSBvZiB0aGUgaGxpc3Rfbm9kZSB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqLworI2RlZmluZSBobGlzdF9mb3JfZWFjaF9lbnRyeV9mcm9tKHRwb3MsIHBvcywgbWVtYmVyKQkJCSBcCisJZm9yICg7IHBvcyAmJiAJCQkgXAorCQkoeyB0cG9zID0gaGxpc3RfZW50cnkocG9zLCB0eXBlb2YoKnRwb3MpLCBtZW1iZXIpOyAxO30pOyBcCisJICAgICBwb3MgPSBwb3MtPm5leHQpCisKKy8qKgorICogaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSAtIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIGdpdmVuIHR5cGUgc2FmZSBhZ2FpbnN0IHJlbW92YWwgb2YgbGlzdCBlbnRyeQorICogQHRwb3M6CXRoZSB0eXBlICogdG8gdXNlIGFzIGEgbG9vcCBjdXJzb3IuCisgKiBAcG9zOgl0aGUgJnN0cnVjdCBobGlzdF9ub2RlIHRvIHVzZSBhcyBhIGxvb3AgY3Vyc29yLgorICogQG46CQlhbm90aGVyICZzdHJ1Y3QgaGxpc3Rfbm9kZSB0byB1c2UgYXMgdGVtcG9yYXJ5IHN0b3JhZ2UKKyAqIEBoZWFkOgl0aGUgaGVhZCBmb3IgeW91ciBsaXN0LgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIGhsaXN0X25vZGUgd2l0aGluIHRoZSBzdHJ1Y3QuCisgKi8KKyNkZWZpbmUgaGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cG9zLCBwb3MsIG4sIGhlYWQsIG1lbWJlcikgCQkgXAorCWZvciAocG9zID0gKGhlYWQpLT5maXJzdDsJCQkJCSBcCisJICAgICBwb3MgJiYgKHsgbiA9IHBvcy0+bmV4dDsgMTsgfSkgJiYgCQkJCSBcCisJCSh7IHRwb3MgPSBobGlzdF9lbnRyeShwb3MsIHR5cGVvZigqdHBvcyksIG1lbWJlcik7IDE7fSk7IFwKKwkgICAgIHBvcyA9IG4pCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3BhZ2VyLmMgYi90b29scy9wZXJmL3V0aWwvcGFnZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjhiY2NhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhZ2VyLmMKQEAgLTAsMCArMSw5OSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisjaW5jbHVkZSAicnVuLWNvbW1hbmQuaCIKKyNpbmNsdWRlICJzaWdjaGFpbi5oIgorCisvKgorICogVGhpcyBpcyBzcGxpdCB1cCBmcm9tIHRoZSByZXN0IG9mIGdpdCBzbyB0aGF0IHdlIGNhbiBkbworICogc29tZXRoaW5nIGRpZmZlcmVudCBvbiBXaW5kb3dzLgorICovCisKK3N0YXRpYyBpbnQgc3Bhd25lZF9wYWdlcjsKKworI2lmbmRlZiBfX01JTkdXMzJfXworc3RhdGljIHZvaWQgcGFnZXJfcHJlZXhlYyh2b2lkKQoreworCS8qCisJICogV29yayBhcm91bmQgYnVnIGluICJsZXNzIiBieSBub3Qgc3RhcnRpbmcgaXQgdW50aWwgd2UKKwkgKiBoYXZlIHJlYWwgaW5wdXQKKwkgKi8KKwlmZF9zZXQgaW47CisKKwlGRF9aRVJPKCZpbik7CisJRkRfU0VUKDAsICZpbik7CisJc2VsZWN0KDEsICZpbiwgTlVMTCwgJmluLCBOVUxMKTsKKworCXNldGVudigiTEVTUyIsICJGUlNYIiwgMCk7Cit9CisjZW5kaWYKKworc3RhdGljIGNvbnN0IGNoYXIgKnBhZ2VyX2FyZ3ZbXSA9IHsgInNoIiwgIi1jIiwgTlVMTCwgTlVMTCB9Oworc3RhdGljIHN0cnVjdCBjaGlsZF9wcm9jZXNzIHBhZ2VyX3Byb2Nlc3M7CisKK3N0YXRpYyB2b2lkIHdhaXRfZm9yX3BhZ2VyKHZvaWQpCit7CisJZmZsdXNoKHN0ZG91dCk7CisJZmZsdXNoKHN0ZGVycik7CisJLyogc2lnbmFsIEVPRiB0byBwYWdlciAqLworCWNsb3NlKDEpOworCWNsb3NlKDIpOworCWZpbmlzaF9jb21tYW5kKCZwYWdlcl9wcm9jZXNzKTsKK30KKworc3RhdGljIHZvaWQgd2FpdF9mb3JfcGFnZXJfc2lnbmFsKGludCBzaWdubykKK3sKKwl3YWl0X2Zvcl9wYWdlcigpOworCXNpZ2NoYWluX3BvcChzaWdubyk7CisJcmFpc2Uoc2lnbm8pOworfQorCit2b2lkIHNldHVwX3BhZ2VyKHZvaWQpCit7CisJY29uc3QgY2hhciAqcGFnZXIgPSBnZXRlbnYoIlBFUkZfUEFHRVIiKTsKKworCWlmICghaXNhdHR5KDEpKQorCQlyZXR1cm47CisJaWYgKCFwYWdlcikgeworCQlpZiAoIXBhZ2VyX3Byb2dyYW0pCisJCQlwZXJmX2NvbmZpZyhwZXJmX2RlZmF1bHRfY29uZmlnLCBOVUxMKTsKKwkJcGFnZXIgPSBwYWdlcl9wcm9ncmFtOworCX0KKwlpZiAoIXBhZ2VyKQorCQlwYWdlciA9IGdldGVudigiUEFHRVIiKTsKKwlpZiAoIXBhZ2VyKQorCQlwYWdlciA9ICJsZXNzIjsKKwllbHNlIGlmICghKnBhZ2VyIHx8ICFzdHJjbXAocGFnZXIsICJjYXQiKSkKKwkJcmV0dXJuOworCisJc3Bhd25lZF9wYWdlciA9IDE7IC8qIG1lYW5zIHdlIGFyZSBlbWl0dGluZyB0byB0ZXJtaW5hbCAqLworCisJLyogc3Bhd24gdGhlIHBhZ2VyICovCisJcGFnZXJfYXJndlsyXSA9IHBhZ2VyOworCXBhZ2VyX3Byb2Nlc3MuYXJndiA9IHBhZ2VyX2FyZ3Y7CisJcGFnZXJfcHJvY2Vzcy5pbiA9IC0xOworI2lmbmRlZiBfX01JTkdXMzJfXworCXBhZ2VyX3Byb2Nlc3MucHJlZXhlY19jYiA9IHBhZ2VyX3ByZWV4ZWM7CisjZW5kaWYKKwlpZiAoc3RhcnRfY29tbWFuZCgmcGFnZXJfcHJvY2VzcykpCisJCXJldHVybjsKKworCS8qIG9yaWdpbmFsIHByb2Nlc3MgY29udGludWVzLCBidXQgd3JpdGVzIHRvIHRoZSBwaXBlICovCisJZHVwMihwYWdlcl9wcm9jZXNzLmluLCAxKTsKKwlpZiAoaXNhdHR5KDIpKQorCQlkdXAyKHBhZ2VyX3Byb2Nlc3MuaW4sIDIpOworCWNsb3NlKHBhZ2VyX3Byb2Nlc3MuaW4pOworCisJLyogdGhpcyBtYWtlcyBzdXJlIHRoYXQgdGhlIHBhcmVudCB0ZXJtaW5hdGVzIGFmdGVyIHRoZSBwYWdlciAqLworCXNpZ2NoYWluX3B1c2hfY29tbW9uKHdhaXRfZm9yX3BhZ2VyX3NpZ25hbCk7CisJYXRleGl0KHdhaXRfZm9yX3BhZ2VyKTsKK30KKworaW50IHBhZ2VyX2luX3VzZSh2b2lkKQoreworCWNvbnN0IGNoYXIgKmVudjsKKworCWlmIChzcGF3bmVkX3BhZ2VyKQorCQlyZXR1cm4gMTsKKworCWVudiA9IGdldGVudigiUEVSRl9QQUdFUl9JTl9VU0UiKTsKKwlyZXR1cm4gZW52ID8gcGVyZl9jb25maWdfYm9vbCgiUEVSRl9QQUdFUl9JTl9VU0UiLCBlbnYpIDogMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYyBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDVmMWNhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5jCkBAIC0wLDAgKzEsMzE2IEBACisKKyNpbmNsdWRlICIuLi9wZXJmLmgiCisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJwYXJzZS1ldmVudHMuaCIKKyNpbmNsdWRlICJleGVjX2NtZC5oIgorI2luY2x1ZGUgInN0cmluZy5oIgorCitleHRlcm4gY2hhciAqc3RyY2FzZXN0cihjb25zdCBjaGFyICpoYXlzdGFjaywgY29uc3QgY2hhciAqbmVlZGxlKTsKKworaW50CQkJCQlucl9jb3VudGVyczsKKworc3RydWN0IHBlcmZfY291bnRlcl9hdHRyCQlhdHRyc1tNQVhfQ09VTlRFUlNdOworCitzdHJ1Y3QgZXZlbnRfc3ltYm9sIHsKKwlfX3U4CXR5cGU7CisJX191NjQJY29uZmlnOworCWNoYXIJKnN5bWJvbDsKK307CisKKyNkZWZpbmUgQyh4LCB5KSAudHlwZSA9IFBFUkZfVFlQRV8jI3gsIC5jb25maWcgPSBQRVJGX0NPVU5UXyMjeQorI2RlZmluZSBDUih4LCB5KSAudHlwZSA9IFBFUkZfVFlQRV8jI3gsIC5jb25maWcgPSB5CisKK3N0YXRpYyBzdHJ1Y3QgZXZlbnRfc3ltYm9sIGV2ZW50X3N5bWJvbHNbXSA9IHsKKyAgeyBDKEhBUkRXQVJFLCBIV19DUFVfQ1lDTEVTKSwJCSJjcHUtY3ljbGVzIiwJCX0sCisgIHsgQyhIQVJEV0FSRSwgSFdfQ1BVX0NZQ0xFUyksCQkiY3ljbGVzIiwJCX0sCisgIHsgQyhIQVJEV0FSRSwgSFdfSU5TVFJVQ1RJT05TKSwJImluc3RydWN0aW9ucyIsCQl9LAorICB7IEMoSEFSRFdBUkUsIEhXX0NBQ0hFX1JFRkVSRU5DRVMpLAkiY2FjaGUtcmVmZXJlbmNlcyIsCX0sCisgIHsgQyhIQVJEV0FSRSwgSFdfQ0FDSEVfTUlTU0VTKSwJImNhY2hlLW1pc3NlcyIsCQl9LAorICB7IEMoSEFSRFdBUkUsIEhXX0JSQU5DSF9JTlNUUlVDVElPTlMpLCJicmFuY2gtaW5zdHJ1Y3Rpb25zIiwJfSwKKyAgeyBDKEhBUkRXQVJFLCBIV19CUkFOQ0hfSU5TVFJVQ1RJT05TKSwiYnJhbmNoZXMiLAkJfSwKKyAgeyBDKEhBUkRXQVJFLCBIV19CUkFOQ0hfTUlTU0VTKSwJImJyYW5jaC1taXNzZXMiLAl9LAorICB7IEMoSEFSRFdBUkUsIEhXX0JVU19DWUNMRVMpLAkJImJ1cy1jeWNsZXMiLAkJfSwKKworICB7IEMoU09GVFdBUkUsIFNXX0NQVV9DTE9DSyksCQkiY3B1LWNsb2NrIiwJCX0sCisgIHsgQyhTT0ZUV0FSRSwgU1dfVEFTS19DTE9DSyksCQkidGFzay1jbG9jayIsCQl9LAorICB7IEMoU09GVFdBUkUsIFNXX1BBR0VfRkFVTFRTKSwJInBhZ2UtZmF1bHRzIiwJCX0sCisgIHsgQyhTT0ZUV0FSRSwgU1dfUEFHRV9GQVVMVFMpLAkiZmF1bHRzIiwJCX0sCisgIHsgQyhTT0ZUV0FSRSwgU1dfUEFHRV9GQVVMVFNfTUlOKSwJIm1pbm9yLWZhdWx0cyIsCQl9LAorICB7IEMoU09GVFdBUkUsIFNXX1BBR0VfRkFVTFRTX01BSiksCSJtYWpvci1mYXVsdHMiLAkJfSwKKyAgeyBDKFNPRlRXQVJFLCBTV19DT05URVhUX1NXSVRDSEVTKSwJImNvbnRleHQtc3dpdGNoZXMiLAl9LAorICB7IEMoU09GVFdBUkUsIFNXX0NPTlRFWFRfU1dJVENIRVMpLAkiY3MiLAkJCX0sCisgIHsgQyhTT0ZUV0FSRSwgU1dfQ1BVX01JR1JBVElPTlMpLAkiY3B1LW1pZ3JhdGlvbnMiLAl9LAorICB7IEMoU09GVFdBUkUsIFNXX0NQVV9NSUdSQVRJT05TKSwJIm1pZ3JhdGlvbnMiLAkJfSwKK307CisKKyNkZWZpbmUgX19QRVJGX0NPVU5URVJfRklFTEQoY29uZmlnLCBuYW1lKSBcCisJKChjb25maWcgJiBQRVJGX0NPVU5URVJfIyNuYW1lIyNfTUFTSykgPj4gUEVSRl9DT1VOVEVSXyMjbmFtZSMjX1NISUZUKQorCisjZGVmaW5lIFBFUkZfQ09VTlRFUl9SQVcoY29uZmlnKQlfX1BFUkZfQ09VTlRFUl9GSUVMRChjb25maWcsIFJBVykKKyNkZWZpbmUgUEVSRl9DT1VOVEVSX0NPTkZJRyhjb25maWcpCV9fUEVSRl9DT1VOVEVSX0ZJRUxEKGNvbmZpZywgQ09ORklHKQorI2RlZmluZSBQRVJGX0NPVU5URVJfVFlQRShjb25maWcpCV9fUEVSRl9DT1VOVEVSX0ZJRUxEKGNvbmZpZywgVFlQRSkKKyNkZWZpbmUgUEVSRl9DT1VOVEVSX0lEKGNvbmZpZykJCV9fUEVSRl9DT1VOVEVSX0ZJRUxEKGNvbmZpZywgRVZFTlQpCisKK3N0YXRpYyBjaGFyICpod19ldmVudF9uYW1lc1tdID0geworCSJjeWNsZXMiLAorCSJpbnN0cnVjdGlvbnMiLAorCSJjYWNoZS1yZWZlcmVuY2VzIiwKKwkiY2FjaGUtbWlzc2VzIiwKKwkiYnJhbmNoZXMiLAorCSJicmFuY2gtbWlzc2VzIiwKKwkiYnVzLWN5Y2xlcyIsCit9OworCitzdGF0aWMgY2hhciAqc3dfZXZlbnRfbmFtZXNbXSA9IHsKKwkiY3B1LWNsb2NrLXRpY2tzIiwKKwkidGFzay1jbG9jay10aWNrcyIsCisJInBhZ2UtZmF1bHRzIiwKKwkiY29udGV4dC1zd2l0Y2hlcyIsCisJIkNQVS1taWdyYXRpb25zIiwKKwkibWlub3ItZmF1bHRzIiwKKwkibWFqb3ItZmF1bHRzIiwKK307CisKKyNkZWZpbmUgTUFYX0FMSUFTRVMgOAorCitzdGF0aWMgY2hhciAqaHdfY2FjaGUgW11bTUFYX0FMSUFTRVNdID0geworCXsgIkwxLWRhdGEiCQksICJsMS1kIiwgImwxZCIsICJsMSIJCQkJfSwKKwl7ICJMMS1pbnN0cnVjdGlvbiIJLCAibDEtaSIsICJsMWkiCQkJCQl9LAorCXsgIkwyIgkJCSwgImwyIgkJCQkJCX0sCisJeyAiRGF0YS1UTEIiCQksICJkdGxiIiwgImQtdGxiIgkJCQl9LAorCXsgIkluc3RydWN0aW9uLVRMQiIJLCAiaXRsYiIsICJpLXRsYiIJCQkJfSwKKwl7ICJCcmFuY2giCQksICJicHUiICwgImJ0YiIsICJicGMiCQkJCX0sCit9OworCitzdGF0aWMgY2hhciAqaHdfY2FjaGVfb3AgW11bTUFYX0FMSUFTRVNdID0geworCXsgIkxvYWQiCQksICJyZWFkIgkJCQkJfSwKKwl7ICJTdG9yZSIJCSwgIndyaXRlIgkJCQkJfSwKKwl7ICJQcmVmZXRjaCIJCSwgInNwZWN1bGF0aXZlLXJlYWQiLCAic3BlY3VsYXRpdmUtbG9hZCIJfSwKK307CisKK3N0YXRpYyBjaGFyICpod19jYWNoZV9yZXN1bHQgW11bTUFYX0FMSUFTRVNdID0geworCXsgIlJlZmVyZW5jZSIJCSwgIm9wcyIsICJhY2Nlc3MiCQkJCX0sCisJeyAiTWlzcyIJCQkJCQkJCX0sCit9OworCitjaGFyICpldmVudF9uYW1lKGludCBjb3VudGVyKQoreworCV9fdTY0IGNvbmZpZyA9IGF0dHJzW2NvdW50ZXJdLmNvbmZpZzsKKwlpbnQgdHlwZSA9IGF0dHJzW2NvdW50ZXJdLnR5cGU7CisJc3RhdGljIGNoYXIgYnVmWzMyXTsKKworCWlmIChhdHRyc1tjb3VudGVyXS50eXBlID09IFBFUkZfVFlQRV9SQVcpIHsKKwkJc3ByaW50ZihidWYsICJyYXcgMHglbGx4IiwgY29uZmlnKTsKKwkJcmV0dXJuIGJ1ZjsKKwl9CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFBFUkZfVFlQRV9IQVJEV0FSRToKKwkJaWYgKGNvbmZpZyA8IFBFUkZfQ09VTlRfSFdfTUFYKQorCQkJcmV0dXJuIGh3X2V2ZW50X25hbWVzW2NvbmZpZ107CisJCXJldHVybiAidW5rbm93bi1oYXJkd2FyZSI7CisKKwljYXNlIFBFUkZfVFlQRV9IV19DQUNIRTogeworCQlfX3U4IGNhY2hlX3R5cGUsIGNhY2hlX29wLCBjYWNoZV9yZXN1bHQ7CisJCXN0YXRpYyBjaGFyIG5hbWVbMTAwXTsKKworCQljYWNoZV90eXBlICAgPSAoY29uZmlnID4+ICAwKSAmIDB4ZmY7CisJCWlmIChjYWNoZV90eXBlID4gUEVSRl9DT1VOVF9IV19DQUNIRV9NQVgpCisJCQlyZXR1cm4gInVua25vd24tZXh0LWhhcmR3YXJlLWNhY2hlLXR5cGUiOworCisJCWNhY2hlX29wICAgICA9IChjb25maWcgPj4gIDgpICYgMHhmZjsKKwkJaWYgKGNhY2hlX29wID4gUEVSRl9DT1VOVF9IV19DQUNIRV9PUF9NQVgpCisJCQlyZXR1cm4gInVua25vd24tZXh0LWhhcmR3YXJlLWNhY2hlLW9wIjsKKworCQljYWNoZV9yZXN1bHQgPSAoY29uZmlnID4+IDE2KSAmIDB4ZmY7CisJCWlmIChjYWNoZV9yZXN1bHQgPiBQRVJGX0NPVU5UX0hXX0NBQ0hFX1JFU1VMVF9NQVgpCisJCQlyZXR1cm4gInVua25vd24tZXh0LWhhcmR3YXJlLWNhY2hlLXJlc3VsdCI7CisKKwkJc3ByaW50ZihuYW1lLCAiJXMtQ2FjaGUtJXMtJXNlcyIsCisJCQlod19jYWNoZVtjYWNoZV90eXBlXVswXSwKKwkJCWh3X2NhY2hlX29wW2NhY2hlX29wXVswXSwKKwkJCWh3X2NhY2hlX3Jlc3VsdFtjYWNoZV9yZXN1bHRdWzBdKTsKKworCQlyZXR1cm4gbmFtZTsKKwl9CisKKwljYXNlIFBFUkZfVFlQRV9TT0ZUV0FSRToKKwkJaWYgKGNvbmZpZyA8IFBFUkZfQ09VTlRfU1dfTUFYKQorCQkJcmV0dXJuIHN3X2V2ZW50X25hbWVzW2NvbmZpZ107CisJCXJldHVybiAidW5rbm93bi1zb2Z0d2FyZSI7CisKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gInVua25vd24iOworfQorCitzdGF0aWMgaW50IHBhcnNlX2FsaWFzZXMoY29uc3QgY2hhciAqc3RyLCBjaGFyICpuYW1lc1tdW01BWF9BTElBU0VTXSwgaW50IHNpemUpCit7CisJaW50IGksIGo7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWZvciAoaiA9IDA7IGogPCBNQVhfQUxJQVNFUzsgaisrKSB7CisJCQlpZiAoIW5hbWVzW2ldW2pdKQorCQkJCWJyZWFrOworCQkJaWYgKHN0cmNhc2VzdHIoc3RyLCBuYW1lc1tpXVtqXSkpCisJCQkJcmV0dXJuIGk7CisJCX0KKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfZ2VuZXJpY19od19zeW1ib2xzKGNvbnN0IGNoYXIgKnN0ciwgc3RydWN0IHBlcmZfY291bnRlcl9hdHRyICphdHRyKQoreworCWludCBjYWNoZV90eXBlID0gLTEsIGNhY2hlX29wID0gMCwgY2FjaGVfcmVzdWx0ID0gMDsKKworCWNhY2hlX3R5cGUgPSBwYXJzZV9hbGlhc2VzKHN0ciwgaHdfY2FjaGUsIFBFUkZfQ09VTlRfSFdfQ0FDSEVfTUFYKTsKKwkvKgorCSAqIE5vIGZhbGxiYWNrIC0gaWYgd2UgY2Fubm90IGdldCBhIGNsZWFyIGNhY2hlIHR5cGUKKwkgKiB0aGVuIGJhaWwgb3V0OgorCSAqLworCWlmIChjYWNoZV90eXBlID09IC0xKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWNhY2hlX29wID0gcGFyc2VfYWxpYXNlcyhzdHIsIGh3X2NhY2hlX29wLCBQRVJGX0NPVU5UX0hXX0NBQ0hFX09QX01BWCk7CisJLyoKKwkgKiBGYWxsIGJhY2sgdG8gcmVhZHM6CisJICovCisJaWYgKGNhY2hlX29wID09IC0xKQorCQljYWNoZV9vcCA9IFBFUkZfQ09VTlRfSFdfQ0FDSEVfT1BfUkVBRDsKKworCWNhY2hlX3Jlc3VsdCA9IHBhcnNlX2FsaWFzZXMoc3RyLCBod19jYWNoZV9yZXN1bHQsCisJCQkJCVBFUkZfQ09VTlRfSFdfQ0FDSEVfUkVTVUxUX01BWCk7CisJLyoKKwkgKiBGYWxsIGJhY2sgdG8gYWNjZXNzZXM6CisJICovCisJaWYgKGNhY2hlX3Jlc3VsdCA9PSAtMSkKKwkJY2FjaGVfcmVzdWx0ID0gUEVSRl9DT1VOVF9IV19DQUNIRV9SRVNVTFRfQUNDRVNTOworCisJYXR0ci0+Y29uZmlnID0gY2FjaGVfdHlwZSB8IChjYWNoZV9vcCA8PCA4KSB8IChjYWNoZV9yZXN1bHQgPDwgMTYpOworCWF0dHItPnR5cGUgPSBQRVJGX1RZUEVfSFdfQ0FDSEU7CisKKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEVhY2ggZXZlbnQgY2FuIGhhdmUgbXVsdGlwbGUgc3ltYm9saWMgbmFtZXMuCisgKiBTeW1ib2xpYyBuYW1lcyBhcmUgKGFsbW9zdCkgZXhhY3RseSBtYXRjaGVkLgorICovCitzdGF0aWMgaW50IHBhcnNlX2V2ZW50X3N5bWJvbHMoY29uc3QgY2hhciAqc3RyLCBzdHJ1Y3QgcGVyZl9jb3VudGVyX2F0dHIgKmF0dHIpCit7CisJX191NjQgY29uZmlnLCBpZDsKKwlpbnQgdHlwZTsKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpzZXAsICpwc3RyOworCisJaWYgKHN0clswXSA9PSAncicgJiYgaGV4MnU2NChzdHIgKyAxLCAmY29uZmlnKSA+IDApIHsKKwkJYXR0ci0+dHlwZSA9IFBFUkZfVFlQRV9SQVc7CisJCWF0dHItPmNvbmZpZyA9IGNvbmZpZzsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlwc3RyID0gc3RyOworCXNlcCA9IHN0cmNocihwc3RyLCAnOicpOworCWlmIChzZXApIHsKKwkJdHlwZSA9IGF0b2kocHN0cik7CisJCXBzdHIgPSBzZXAgKyAxOworCQlpZCA9IGF0b2kocHN0cik7CisJCXNlcCA9IHN0cmNocihwc3RyLCAnOicpOworCQlpZiAoc2VwKSB7CisJCQlwc3RyID0gc2VwICsgMTsKKwkJCWlmIChzdHJjaHIocHN0ciwgJ2snKSkKKwkJCQlhdHRyLT5leGNsdWRlX3VzZXIgPSAxOworCQkJaWYgKHN0cmNocihwc3RyLCAndScpKQorCQkJCWF0dHItPmV4Y2x1ZGVfa2VybmVsID0gMTsKKwkJfQorCQlhdHRyLT50eXBlID0gdHlwZTsKKwkJYXR0ci0+Y29uZmlnID0gaWQ7CisKKwkJcmV0dXJuIDA7CisJfQorCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZXZlbnRfc3ltYm9scyk7IGkrKykgeworCQlpZiAoIXN0cm5jbXAoc3RyLCBldmVudF9zeW1ib2xzW2ldLnN5bWJvbCwKKwkJCSAgICAgc3RybGVuKGV2ZW50X3N5bWJvbHNbaV0uc3ltYm9sKSkpIHsKKworCQkJYXR0ci0+dHlwZSA9IGV2ZW50X3N5bWJvbHNbaV0udHlwZTsKKwkJCWF0dHItPmNvbmZpZyA9IGV2ZW50X3N5bWJvbHNbaV0uY29uZmlnOworCisJCQlyZXR1cm4gMDsKKwkJfQorCX0KKworCXJldHVybiBwYXJzZV9nZW5lcmljX2h3X3N5bWJvbHMoc3RyLCBhdHRyKTsKK30KKworaW50IHBhcnNlX2V2ZW50cyhjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHVuc2V0KQoreworCXN0cnVjdCBwZXJmX2NvdW50ZXJfYXR0ciBhdHRyOworCWludCByZXQ7CisKKwltZW1zZXQoJmF0dHIsIDAsIHNpemVvZihhdHRyKSk7CithZ2FpbjoKKwlpZiAobnJfY291bnRlcnMgPT0gTUFYX0NPVU5URVJTKQorCQlyZXR1cm4gLTE7CisKKwlyZXQgPSBwYXJzZV9ldmVudF9zeW1ib2xzKHN0ciwgJmF0dHIpOworCWlmIChyZXQgPCAwKQorCQlyZXR1cm4gcmV0OworCisJYXR0cnNbbnJfY291bnRlcnNdID0gYXR0cjsKKwlucl9jb3VudGVycysrOworCisJc3RyID0gc3Ryc3RyKHN0ciwgIiwiKTsKKwlpZiAoc3RyKSB7CisJCXN0cisrOworCQlnb3RvIGFnYWluOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbXSA9IHsKKwkiIiwKKwkiSGFyZHdhcmUgZXZlbnQiLAorCSJTb2Z0d2FyZSBldmVudCIsCisJIlRyYWNlcG9pbnQgZXZlbnQiLAorCSJIYXJkd2FyZSBjYWNoZSBldmVudCIsCit9OworCisvKgorICogUHJpbnQgdGhlIGhlbHAgdGV4dCBmb3IgdGhlIGV2ZW50IHN5bWJvbHM6CisgKi8KK3ZvaWQgcHJpbnRfZXZlbnRzKHZvaWQpCit7CisJc3RydWN0IGV2ZW50X3N5bWJvbCAqc3ltcyA9IGV2ZW50X3N5bWJvbHM7CisJdW5zaWduZWQgaW50IGksIHR5cGUsIHByZXZfdHlwZSA9IC0xOworCisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiTGlzdCBvZiBwcmUtZGVmaW5lZCBldmVudHMgKHRvIGJlIHVzZWQgaW4gLWUpOlxuIik7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShldmVudF9zeW1ib2xzKTsgaSsrLCBzeW1zKyspIHsKKwkJdHlwZSA9IHN5bXMtPnR5cGUgKyAxOworCQlpZiAodHlwZSA+IEFSUkFZX1NJWkUoZXZlbnRfdHlwZV9kZXNjcmlwdG9ycykpCisJCQl0eXBlID0gMDsKKworCQlpZiAodHlwZSAhPSBwcmV2X3R5cGUpCisJCQlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisKKwkJZnByaW50ZihzdGRlcnIsICIgICUtMzBzIFslc11cbiIsIHN5bXMtPnN5bWJvbCwKKwkJCWV2ZW50X3R5cGVfZGVzY3JpcHRvcnNbdHlwZV0pOworCisJCXByZXZfdHlwZSA9IHR5cGU7CisJfQorCisJZnByaW50ZihzdGRlcnIsICJcbiIpOworCWZwcmludGYoc3RkZXJyLCAiICAlLTMwcyBbcmF3IGhhcmR3YXJlIGV2ZW50IGRlc2NyaXB0b3JdXG4iLAorCQkick5OTiIpOworCWZwcmludGYoc3RkZXJyLCAiXG4iKTsKKworCWV4aXQoMTI5KTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaCBiL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1ldmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Q1NTI5Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3BhcnNlLWV2ZW50cy5oCkBAIC0wLDAgKzEsMTcgQEAKKworLyoKKyAqIFBhcnNlIHN5bWJvbGljIGV2ZW50cy9jb3VudHMgcGFzc2VkIGluIGFzIG9wdGlvbnM6CisgKi8KKworZXh0ZXJuIGludAkJCW5yX2NvdW50ZXJzOworCitleHRlcm4gc3RydWN0IHBlcmZfY291bnRlcl9hdHRyIGF0dHJzW01BWF9DT1VOVEVSU107CisKK2V4dGVybiBjaGFyICpldmVudF9uYW1lKGludCBjdHIpOworCitleHRlcm4gaW50IHBhcnNlX2V2ZW50cyhjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGNvbnN0IGNoYXIgKnN0ciwgaW50IHVuc2V0KTsKKworI2RlZmluZSBFVkVOVFNfSEVMUF9NQVggKDEyOCoxMDI0KQorCitleHRlcm4gdm9pZCBwcmludF9ldmVudHModm9pZCk7CisKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmMgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYWZmYjEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5jCkBAIC0wLDAgKzEsNTA4IEBACisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgInBhcnNlLW9wdGlvbnMuaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIE9QVF9TSE9SVCAxCisjZGVmaW5lIE9QVF9VTlNFVCAyCisKK3N0YXRpYyBpbnQgb3B0ZXJyb3IoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICpyZWFzb24sIGludCBmbGFncykKK3sKKwlpZiAoZmxhZ3MgJiBPUFRfU0hPUlQpCisJCXJldHVybiBlcnJvcigic3dpdGNoIGAlYycgJXMiLCBvcHQtPnNob3J0X25hbWUsIHJlYXNvbik7CisJaWYgKGZsYWdzICYgT1BUX1VOU0VUKQorCQlyZXR1cm4gZXJyb3IoIm9wdGlvbiBgbm8tJXMnICVzIiwgb3B0LT5sb25nX25hbWUsIHJlYXNvbik7CisJcmV0dXJuIGVycm9yKCJvcHRpb24gYCVzJyAlcyIsIG9wdC0+bG9uZ19uYW1lLCByZWFzb24pOworfQorCitzdGF0aWMgaW50IGdldF9hcmcoc3RydWN0IHBhcnNlX29wdF9jdHhfdCAqcCwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LAorCQkgICBpbnQgZmxhZ3MsIGNvbnN0IGNoYXIgKiphcmcpCit7CisJaWYgKHAtPm9wdCkgeworCQkqYXJnID0gcC0+b3B0OworCQlwLT5vcHQgPSBOVUxMOworCX0gZWxzZSBpZiAocC0+YXJnYyA9PSAxICYmIChvcHQtPmZsYWdzICYgUEFSU0VfT1BUX0xBU1RBUkdfREVGQVVMVCkpIHsKKwkJKmFyZyA9IChjb25zdCBjaGFyICopb3B0LT5kZWZ2YWw7CisJfSBlbHNlIGlmIChwLT5hcmdjID4gMSkgeworCQlwLT5hcmdjLS07CisJCSphcmcgPSAqKytwLT5hcmd2OworCX0gZWxzZQorCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAicmVxdWlyZXMgYSB2YWx1ZSIsIGZsYWdzKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnZXRfdmFsdWUoc3RydWN0IHBhcnNlX29wdF9jdHhfdCAqcCwKKwkJICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHQsIGludCBmbGFncykKK3sKKwljb25zdCBjaGFyICpzLCAqYXJnID0gTlVMTDsKKwljb25zdCBpbnQgdW5zZXQgPSBmbGFncyAmIE9QVF9VTlNFVDsKKworCWlmICh1bnNldCAmJiBwLT5vcHQpCisJCXJldHVybiBvcHRlcnJvcihvcHQsICJ0YWtlcyBubyB2YWx1ZSIsIGZsYWdzKTsKKwlpZiAodW5zZXQgJiYgKG9wdC0+ZmxhZ3MgJiBQQVJTRV9PUFRfTk9ORUcpKQorCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAiaXNuJ3QgYXZhaWxhYmxlIiwgZmxhZ3MpOworCisJaWYgKCEoZmxhZ3MgJiBPUFRfU0hPUlQpICYmIHAtPm9wdCkgeworCQlzd2l0Y2ggKG9wdC0+dHlwZSkgeworCQljYXNlIE9QVElPTl9DQUxMQkFDSzoKKwkJCWlmICghKG9wdC0+ZmxhZ3MgJiBQQVJTRV9PUFRfTk9BUkcpKQorCQkJCWJyZWFrOworCQkJLyogRkFMTFRIUk9VR0ggKi8KKwkJY2FzZSBPUFRJT05fQk9PTEVBTjoKKwkJY2FzZSBPUFRJT05fQklUOgorCQljYXNlIE9QVElPTl9TRVRfSU5UOgorCQljYXNlIE9QVElPTl9TRVRfUFRSOgorCQkJcmV0dXJuIG9wdGVycm9yKG9wdCwgInRha2VzIG5vIHZhbHVlIiwgZmxhZ3MpOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlzd2l0Y2ggKG9wdC0+dHlwZSkgeworCWNhc2UgT1BUSU9OX0JJVDoKKwkJaWYgKHVuc2V0KQorCQkJKihpbnQgKilvcHQtPnZhbHVlICY9IH5vcHQtPmRlZnZhbDsKKwkJZWxzZQorCQkJKihpbnQgKilvcHQtPnZhbHVlIHw9IG9wdC0+ZGVmdmFsOworCQlyZXR1cm4gMDsKKworCWNhc2UgT1BUSU9OX0JPT0xFQU46CisJCSooaW50ICopb3B0LT52YWx1ZSA9IHVuc2V0ID8gMCA6ICooaW50ICopb3B0LT52YWx1ZSArIDE7CisJCXJldHVybiAwOworCisJY2FzZSBPUFRJT05fU0VUX0lOVDoKKwkJKihpbnQgKilvcHQtPnZhbHVlID0gdW5zZXQgPyAwIDogb3B0LT5kZWZ2YWw7CisJCXJldHVybiAwOworCisJY2FzZSBPUFRJT05fU0VUX1BUUjoKKwkJKih2b2lkICoqKW9wdC0+dmFsdWUgPSB1bnNldCA/IE5VTEwgOiAodm9pZCAqKW9wdC0+ZGVmdmFsOworCQlyZXR1cm4gMDsKKworCWNhc2UgT1BUSU9OX1NUUklORzoKKwkJaWYgKHVuc2V0KQorCQkJKihjb25zdCBjaGFyICoqKW9wdC0+dmFsdWUgPSBOVUxMOworCQllbHNlIGlmIChvcHQtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRyAmJiAhcC0+b3B0KQorCQkJKihjb25zdCBjaGFyICoqKW9wdC0+dmFsdWUgPSAoY29uc3QgY2hhciAqKW9wdC0+ZGVmdmFsOworCQllbHNlCisJCQlyZXR1cm4gZ2V0X2FyZyhwLCBvcHQsIGZsYWdzLCAoY29uc3QgY2hhciAqKilvcHQtPnZhbHVlKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE9QVElPTl9DQUxMQkFDSzoKKwkJaWYgKHVuc2V0KQorCQkJcmV0dXJuICgqb3B0LT5jYWxsYmFjaykob3B0LCBOVUxMLCAxKSA/ICgtMSkgOiAwOworCQlpZiAob3B0LT5mbGFncyAmIFBBUlNFX09QVF9OT0FSRykKKwkJCXJldHVybiAoKm9wdC0+Y2FsbGJhY2spKG9wdCwgTlVMTCwgMCkgPyAoLTEpIDogMDsKKwkJaWYgKG9wdC0+ZmxhZ3MgJiBQQVJTRV9PUFRfT1BUQVJHICYmICFwLT5vcHQpCisJCQlyZXR1cm4gKCpvcHQtPmNhbGxiYWNrKShvcHQsIE5VTEwsIDApID8gKC0xKSA6IDA7CisJCWlmIChnZXRfYXJnKHAsIG9wdCwgZmxhZ3MsICZhcmcpKQorCQkJcmV0dXJuIC0xOworCQlyZXR1cm4gKCpvcHQtPmNhbGxiYWNrKShvcHQsIGFyZywgMCkgPyAoLTEpIDogMDsKKworCWNhc2UgT1BUSU9OX0lOVEVHRVI6CisJCWlmICh1bnNldCkgeworCQkJKihpbnQgKilvcHQtPnZhbHVlID0gMDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChvcHQtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRyAmJiAhcC0+b3B0KSB7CisJCQkqKGludCAqKW9wdC0+dmFsdWUgPSBvcHQtPmRlZnZhbDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChnZXRfYXJnKHAsIG9wdCwgZmxhZ3MsICZhcmcpKQorCQkJcmV0dXJuIC0xOworCQkqKGludCAqKW9wdC0+dmFsdWUgPSBzdHJ0b2woYXJnLCAoY2hhciAqKikmcywgMTApOworCQlpZiAoKnMpCisJCQlyZXR1cm4gb3B0ZXJyb3Iob3B0LCAiZXhwZWN0cyBhIG51bWVyaWNhbCB2YWx1ZSIsIGZsYWdzKTsKKwkJcmV0dXJuIDA7CisKKwljYXNlIE9QVElPTl9MT05HOgorCQlpZiAodW5zZXQpIHsKKwkJCSoobG9uZyAqKW9wdC0+dmFsdWUgPSAwOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKG9wdC0+ZmxhZ3MgJiBQQVJTRV9PUFRfT1BUQVJHICYmICFwLT5vcHQpIHsKKwkJCSoobG9uZyAqKW9wdC0+dmFsdWUgPSBvcHQtPmRlZnZhbDsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChnZXRfYXJnKHAsIG9wdCwgZmxhZ3MsICZhcmcpKQorCQkJcmV0dXJuIC0xOworCQkqKGxvbmcgKilvcHQtPnZhbHVlID0gc3RydG9sKGFyZywgKGNoYXIgKiopJnMsIDEwKTsKKwkJaWYgKCpzKQorCQkJcmV0dXJuIG9wdGVycm9yKG9wdCwgImV4cGVjdHMgYSBudW1lcmljYWwgdmFsdWUiLCBmbGFncyk7CisJCXJldHVybiAwOworCisJZGVmYXVsdDoKKwkJZGllKCJzaG91bGQgbm90IGhhcHBlbiwgc29tZW9uZSBtdXN0IGJlIGhpdCBvbiB0aGUgZm9yZWhlYWQiKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc2hvcnRfb3B0KHN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgKnAsIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7CisJZm9yICg7IG9wdGlvbnMtPnR5cGUgIT0gT1BUSU9OX0VORDsgb3B0aW9ucysrKSB7CisJCWlmIChvcHRpb25zLT5zaG9ydF9uYW1lID09ICpwLT5vcHQpIHsKKwkJCXAtPm9wdCA9IHAtPm9wdFsxXSA/IHAtPm9wdCArIDEgOiBOVUxMOworCQkJcmV0dXJuIGdldF92YWx1ZShwLCBvcHRpb25zLCBPUFRfU0hPUlQpOworCQl9CisJfQorCXJldHVybiAtMjsKK30KKworc3RhdGljIGludCBwYXJzZV9sb25nX29wdChzdHJ1Y3QgcGFyc2Vfb3B0X2N0eF90ICpwLCBjb25zdCBjaGFyICphcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpCit7CisJY29uc3QgY2hhciAqYXJnX2VuZCA9IHN0cmNocihhcmcsICc9Jyk7CisJY29uc3Qgc3RydWN0IG9wdGlvbiAqYWJicmV2X29wdGlvbiA9IE5VTEwsICphbWJpZ3VvdXNfb3B0aW9uID0gTlVMTDsKKwlpbnQgYWJicmV2X2ZsYWdzID0gMCwgYW1iaWd1b3VzX2ZsYWdzID0gMDsKKworCWlmICghYXJnX2VuZCkKKwkJYXJnX2VuZCA9IGFyZyArIHN0cmxlbihhcmcpOworCisJZm9yICg7IG9wdGlvbnMtPnR5cGUgIT0gT1BUSU9OX0VORDsgb3B0aW9ucysrKSB7CisJCWNvbnN0IGNoYXIgKnJlc3Q7CisJCWludCBmbGFncyA9IDA7CisKKwkJaWYgKCFvcHRpb25zLT5sb25nX25hbWUpCisJCQljb250aW51ZTsKKworCQlyZXN0ID0gc2tpcF9wcmVmaXgoYXJnLCBvcHRpb25zLT5sb25nX25hbWUpOworCQlpZiAob3B0aW9ucy0+dHlwZSA9PSBPUFRJT05fQVJHVU1FTlQpIHsKKwkJCWlmICghcmVzdCkKKwkJCQljb250aW51ZTsKKwkJCWlmICgqcmVzdCA9PSAnPScpCisJCQkJcmV0dXJuIG9wdGVycm9yKG9wdGlvbnMsICJ0YWtlcyBubyB2YWx1ZSIsIGZsYWdzKTsKKwkJCWlmICgqcmVzdCkKKwkJCQljb250aW51ZTsKKwkJCXAtPm91dFtwLT5jcGlkeCsrXSA9IGFyZyAtIDI7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlpZiAoIXJlc3QpIHsKKwkJCS8qIGFiYnJldmlhdGVkPyAqLworCQkJaWYgKCFzdHJuY21wKG9wdGlvbnMtPmxvbmdfbmFtZSwgYXJnLCBhcmdfZW5kIC0gYXJnKSkgeworaXNfYWJicmV2aWF0ZWQ6CisJCQkJaWYgKGFiYnJldl9vcHRpb24pIHsKKwkJCQkJLyoKKwkJCQkJICogSWYgdGhpcyBpcyBhYmJyZXZpYXRlZCwgaXQgaXMKKwkJCQkJICogYW1iaWd1b3VzLiBTbyB3aGVuIHRoZXJlIGlzIG5vCisJCQkJCSAqIGV4YWN0IG1hdGNoIGxhdGVyLCB3ZSBuZWVkIHRvCisJCQkJCSAqIGVycm9yIG91dC4KKwkJCQkJICovCisJCQkJCWFtYmlndW91c19vcHRpb24gPSBhYmJyZXZfb3B0aW9uOworCQkJCQlhbWJpZ3VvdXNfZmxhZ3MgPSBhYmJyZXZfZmxhZ3M7CisJCQkJfQorCQkJCWlmICghKGZsYWdzICYgT1BUX1VOU0VUKSAmJiAqYXJnX2VuZCkKKwkJCQkJcC0+b3B0ID0gYXJnX2VuZCArIDE7CisJCQkJYWJicmV2X29wdGlvbiA9IG9wdGlvbnM7CisJCQkJYWJicmV2X2ZsYWdzID0gZmxhZ3M7CisJCQkJY29udGludWU7CisJCQl9CisJCQkvKiBuZWdhdGVkIGFuZCBhYmJyZXZpYXRlZCB2ZXJ5IG11Y2g/ICovCisJCQlpZiAoIXByZWZpeGNtcCgibm8tIiwgYXJnKSkgeworCQkJCWZsYWdzIHw9IE9QVF9VTlNFVDsKKwkJCQlnb3RvIGlzX2FiYnJldmlhdGVkOworCQkJfQorCQkJLyogbmVnYXRlZD8gKi8KKwkJCWlmIChzdHJuY21wKGFyZywgIm5vLSIsIDMpKQorCQkJCWNvbnRpbnVlOworCQkJZmxhZ3MgfD0gT1BUX1VOU0VUOworCQkJcmVzdCA9IHNraXBfcHJlZml4KGFyZyArIDMsIG9wdGlvbnMtPmxvbmdfbmFtZSk7CisJCQkvKiBhYmJyZXZpYXRlZCBhbmQgbmVnYXRlZD8gKi8KKwkJCWlmICghcmVzdCAmJiAhcHJlZml4Y21wKG9wdGlvbnMtPmxvbmdfbmFtZSwgYXJnICsgMykpCisJCQkJZ290byBpc19hYmJyZXZpYXRlZDsKKwkJCWlmICghcmVzdCkKKwkJCQljb250aW51ZTsKKwkJfQorCQlpZiAoKnJlc3QpIHsKKwkJCWlmICgqcmVzdCAhPSAnPScpCisJCQkJY29udGludWU7CisJCQlwLT5vcHQgPSByZXN0ICsgMTsKKwkJfQorCQlyZXR1cm4gZ2V0X3ZhbHVlKHAsIG9wdGlvbnMsIGZsYWdzKTsKKwl9CisKKwlpZiAoYW1iaWd1b3VzX29wdGlvbikKKwkJcmV0dXJuIGVycm9yKCJBbWJpZ3VvdXMgb3B0aW9uOiAlcyAiCisJCQkiKGNvdWxkIGJlIC0tJXMlcyBvciAtLSVzJXMpIiwKKwkJCWFyZywKKwkJCShhbWJpZ3VvdXNfZmxhZ3MgJiBPUFRfVU5TRVQpID8gICJuby0iIDogIiIsCisJCQlhbWJpZ3VvdXNfb3B0aW9uLT5sb25nX25hbWUsCisJCQkoYWJicmV2X2ZsYWdzICYgT1BUX1VOU0VUKSA/ICAibm8tIiA6ICIiLAorCQkJYWJicmV2X29wdGlvbi0+bG9uZ19uYW1lKTsKKwlpZiAoYWJicmV2X29wdGlvbikKKwkJcmV0dXJuIGdldF92YWx1ZShwLCBhYmJyZXZfb3B0aW9uLCBhYmJyZXZfZmxhZ3MpOworCXJldHVybiAtMjsKK30KKworc3RhdGljIHZvaWQgY2hlY2tfdHlwb3MoY29uc3QgY2hhciAqYXJnLCBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zKQoreworCWlmIChzdHJsZW4oYXJnKSA8IDMpCisJCXJldHVybjsKKworCWlmICghcHJlZml4Y21wKGFyZywgIm5vLSIpKSB7CisJCWVycm9yICgiZGlkIHlvdSBtZWFuIGAtLSVzYCAod2l0aCB0d28gZGFzaGVzID8pIiwgYXJnKTsKKwkJZXhpdCgxMjkpOworCX0KKworCWZvciAoOyBvcHRpb25zLT50eXBlICE9IE9QVElPTl9FTkQ7IG9wdGlvbnMrKykgeworCQlpZiAoIW9wdGlvbnMtPmxvbmdfbmFtZSkKKwkJCWNvbnRpbnVlOworCQlpZiAoIXByZWZpeGNtcChvcHRpb25zLT5sb25nX25hbWUsIGFyZykpIHsKKwkJCWVycm9yICgiZGlkIHlvdSBtZWFuIGAtLSVzYCAod2l0aCB0d28gZGFzaGVzID8pIiwgYXJnKTsKKwkJCWV4aXQoMTI5KTsKKwkJfQorCX0KK30KKwordm9pZCBwYXJzZV9vcHRpb25zX3N0YXJ0KHN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgKmN0eCwKKwkJCSBpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YsIGludCBmbGFncykKK3sKKwltZW1zZXQoY3R4LCAwLCBzaXplb2YoKmN0eCkpOworCWN0eC0+YXJnYyA9IGFyZ2MgLSAxOworCWN0eC0+YXJndiA9IGFyZ3YgKyAxOworCWN0eC0+b3V0ICA9IGFyZ3Y7CisJY3R4LT5jcGlkeCA9ICgoZmxhZ3MgJiBQQVJTRV9PUFRfS0VFUF9BUkdWMCkgIT0gMCk7CisJY3R4LT5mbGFncyA9IGZsYWdzOworCWlmICgoZmxhZ3MgJiBQQVJTRV9PUFRfS0VFUF9VTktOT1dOKSAmJgorCSAgICAoZmxhZ3MgJiBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKSkKKwkJZGllKCJTVE9QX0FUX05PTl9PUFRJT04gYW5kIEtFRVBfVU5LTk9XTiBkb24ndCBnbyB0b2dldGhlciIpOworfQorCitzdGF0aWMgaW50IHVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbChjb25zdCBjaGFyICogY29uc3QgKiwKKwkJCQkgICAgICAgY29uc3Qgc3RydWN0IG9wdGlvbiAqLCBpbnQpOworCitpbnQgcGFyc2Vfb3B0aW9uc19zdGVwKHN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgKmN0eCwKKwkJICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMsCisJCSAgICAgICBjb25zdCBjaGFyICogY29uc3QgdXNhZ2VzdHJbXSkKK3sKKwlpbnQgaW50ZXJuYWxfaGVscCA9ICEoY3R4LT5mbGFncyAmIFBBUlNFX09QVF9OT19JTlRFUk5BTF9IRUxQKTsKKworCS8qIHdlIG11c3QgcmVzZXQgLT5vcHQsIHVua25vd24gc2hvcnQgb3B0aW9uIGxlYXZlIGl0IGRhbmdsaW5nICovCisJY3R4LT5vcHQgPSBOVUxMOworCisJZm9yICg7IGN0eC0+YXJnYzsgY3R4LT5hcmdjLS0sIGN0eC0+YXJndisrKSB7CisJCWNvbnN0IGNoYXIgKmFyZyA9IGN0eC0+YXJndlswXTsKKworCQlpZiAoKmFyZyAhPSAnLScgfHwgIWFyZ1sxXSkgeworCQkJaWYgKGN0eC0+ZmxhZ3MgJiBQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OKQorCQkJCWJyZWFrOworCQkJY3R4LT5vdXRbY3R4LT5jcGlkeCsrXSA9IGN0eC0+YXJndlswXTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGFyZ1sxXSAhPSAnLScpIHsKKwkJCWN0eC0+b3B0ID0gYXJnICsgMTsKKwkJCWlmIChpbnRlcm5hbF9oZWxwICYmICpjdHgtPm9wdCA9PSAnaCcpCisJCQkJcmV0dXJuIHBhcnNlX29wdGlvbnNfdXNhZ2UodXNhZ2VzdHIsIG9wdGlvbnMpOworCQkJc3dpdGNoIChwYXJzZV9zaG9ydF9vcHQoY3R4LCBvcHRpb25zKSkgeworCQkJY2FzZSAtMToKKwkJCQlyZXR1cm4gcGFyc2Vfb3B0aW9uc191c2FnZSh1c2FnZXN0ciwgb3B0aW9ucyk7CisJCQljYXNlIC0yOgorCQkJCWdvdG8gdW5rbm93bjsKKwkJCX0KKwkJCWlmIChjdHgtPm9wdCkKKwkJCQljaGVja190eXBvcyhhcmcgKyAxLCBvcHRpb25zKTsKKwkJCXdoaWxlIChjdHgtPm9wdCkgeworCQkJCWlmIChpbnRlcm5hbF9oZWxwICYmICpjdHgtPm9wdCA9PSAnaCcpCisJCQkJCXJldHVybiBwYXJzZV9vcHRpb25zX3VzYWdlKHVzYWdlc3RyLCBvcHRpb25zKTsKKwkJCQlzd2l0Y2ggKHBhcnNlX3Nob3J0X29wdChjdHgsIG9wdGlvbnMpKSB7CisJCQkJY2FzZSAtMToKKwkJCQkJcmV0dXJuIHBhcnNlX29wdGlvbnNfdXNhZ2UodXNhZ2VzdHIsIG9wdGlvbnMpOworCQkJCWNhc2UgLTI6CisJCQkJCS8qIGZha2UgYSBzaG9ydCBvcHRpb24gdGhpbmcgdG8gaGlkZSB0aGUgZmFjdCB0aGF0IHdlIG1heSBoYXZlCisJCQkJCSAqIHN0YXJ0ZWQgdG8gcGFyc2UgYWdncmVnYXRlZCBzdHVmZgorCQkJCQkgKgorCQkJCQkgKiBUaGlzIGlzIGxlYWt5LCB0b28gYmFkLgorCQkJCQkgKi8KKwkJCQkJY3R4LT5hcmd2WzBdID0gc3RyZHVwKGN0eC0+b3B0IC0gMSk7CisJCQkJCSooY2hhciAqKWN0eC0+YXJndlswXSA9ICctJzsKKwkJCQkJZ290byB1bmtub3duOworCQkJCX0KKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKCFhcmdbMl0pIHsgLyogIi0tIiAqLworCQkJaWYgKCEoY3R4LT5mbGFncyAmIFBBUlNFX09QVF9LRUVQX0RBU0hEQVNIKSkgeworCQkJCWN0eC0+YXJnYy0tOworCQkJCWN0eC0+YXJndisrOworCQkJfQorCQkJYnJlYWs7CisJCX0KKworCQlpZiAoaW50ZXJuYWxfaGVscCAmJiAhc3RyY21wKGFyZyArIDIsICJoZWxwLWFsbCIpKQorCQkJcmV0dXJuIHVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbCh1c2FnZXN0ciwgb3B0aW9ucywgMSk7CisJCWlmIChpbnRlcm5hbF9oZWxwICYmICFzdHJjbXAoYXJnICsgMiwgImhlbHAiKSkKKwkJCXJldHVybiBwYXJzZV9vcHRpb25zX3VzYWdlKHVzYWdlc3RyLCBvcHRpb25zKTsKKwkJc3dpdGNoIChwYXJzZV9sb25nX29wdChjdHgsIGFyZyArIDIsIG9wdGlvbnMpKSB7CisJCWNhc2UgLTE6CisJCQlyZXR1cm4gcGFyc2Vfb3B0aW9uc191c2FnZSh1c2FnZXN0ciwgb3B0aW9ucyk7CisJCWNhc2UgLTI6CisJCQlnb3RvIHVua25vd247CisJCX0KKwkJY29udGludWU7Cit1bmtub3duOgorCQlpZiAoIShjdHgtPmZsYWdzICYgUEFSU0VfT1BUX0tFRVBfVU5LTk9XTikpCisJCQlyZXR1cm4gUEFSU0VfT1BUX1VOS05PV047CisJCWN0eC0+b3V0W2N0eC0+Y3BpZHgrK10gPSBjdHgtPmFyZ3ZbMF07CisJCWN0eC0+b3B0ID0gTlVMTDsKKwl9CisJcmV0dXJuIFBBUlNFX09QVF9ET05FOworfQorCitpbnQgcGFyc2Vfb3B0aW9uc19lbmQoc3RydWN0IHBhcnNlX29wdF9jdHhfdCAqY3R4KQoreworCW1lbW1vdmUoY3R4LT5vdXQgKyBjdHgtPmNwaWR4LCBjdHgtPmFyZ3YsIGN0eC0+YXJnYyAqIHNpemVvZigqY3R4LT5vdXQpKTsKKwljdHgtPm91dFtjdHgtPmNwaWR4ICsgY3R4LT5hcmdjXSA9IE5VTEw7CisJcmV0dXJuIGN0eC0+Y3BpZHggKyBjdHgtPmFyZ2M7Cit9CisKK2ludCBwYXJzZV9vcHRpb25zKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndiwgY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0aW9ucywKKwkJICBjb25zdCBjaGFyICogY29uc3QgdXNhZ2VzdHJbXSwgaW50IGZsYWdzKQoreworCXN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgY3R4OworCisJcGFyc2Vfb3B0aW9uc19zdGFydCgmY3R4LCBhcmdjLCBhcmd2LCBmbGFncyk7CisJc3dpdGNoIChwYXJzZV9vcHRpb25zX3N0ZXAoJmN0eCwgb3B0aW9ucywgdXNhZ2VzdHIpKSB7CisJY2FzZSBQQVJTRV9PUFRfSEVMUDoKKwkJZXhpdCgxMjkpOworCWNhc2UgUEFSU0VfT1BUX0RPTkU6CisJCWJyZWFrOworCWRlZmF1bHQ6IC8qIFBBUlNFX09QVF9VTktOT1dOICovCisJCWlmIChjdHguYXJndlswXVsxXSA9PSAnLScpIHsKKwkJCWVycm9yKCJ1bmtub3duIG9wdGlvbiBgJXMnIiwgY3R4LmFyZ3ZbMF0gKyAyKTsKKwkJfSBlbHNlIHsKKwkJCWVycm9yKCJ1bmtub3duIHN3aXRjaCBgJWMnIiwgKmN0eC5vcHQpOworCQl9CisJCXVzYWdlX3dpdGhfb3B0aW9ucyh1c2FnZXN0ciwgb3B0aW9ucyk7CisJfQorCisJcmV0dXJuIHBhcnNlX29wdGlvbnNfZW5kKCZjdHgpOworfQorCisjZGVmaW5lIFVTQUdFX09QVFNfV0lEVEggMjQKKyNkZWZpbmUgVVNBR0VfR0FQICAgICAgICAgMgorCitpbnQgdXNhZ2Vfd2l0aF9vcHRpb25zX2ludGVybmFsKGNvbnN0IGNoYXIgKiBjb25zdCAqdXNhZ2VzdHIsCisJCQkJY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0cywgaW50IGZ1bGwpCit7CisJaWYgKCF1c2FnZXN0cikKKwkJcmV0dXJuIFBBUlNFX09QVF9IRUxQOworCisJZnByaW50ZihzdGRlcnIsICJcbiB1c2FnZTogJXNcbiIsICp1c2FnZXN0cisrKTsKKwl3aGlsZSAoKnVzYWdlc3RyICYmICoqdXNhZ2VzdHIpCisJCWZwcmludGYoc3RkZXJyLCAiICAgIG9yOiAlc1xuIiwgKnVzYWdlc3RyKyspOworCXdoaWxlICgqdXNhZ2VzdHIpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyVzXG4iLAorCQkJCSoqdXNhZ2VzdHIgPyAiICAgICIgOiAiIiwKKwkJCQkqdXNhZ2VzdHIpOworCQl1c2FnZXN0cisrOworCX0KKworCWlmIChvcHRzLT50eXBlICE9IE9QVElPTl9HUk9VUCkKKwkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKworCWZvciAoOyBvcHRzLT50eXBlICE9IE9QVElPTl9FTkQ7IG9wdHMrKykgeworCQlzaXplX3QgcG9zOworCQlpbnQgcGFkOworCisJCWlmIChvcHRzLT50eXBlID09IE9QVElPTl9HUk9VUCkgeworCQkJZnB1dGMoJ1xuJywgc3RkZXJyKTsKKwkJCWlmICgqb3B0cy0+aGVscCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBvcHRzLT5oZWxwKTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZnVsbCAmJiAob3B0cy0+ZmxhZ3MgJiBQQVJTRV9PUFRfSElEREVOKSkKKwkJCWNvbnRpbnVlOworCisJCXBvcyA9IGZwcmludGYoc3RkZXJyLCAiICAgICIpOworCQlpZiAob3B0cy0+c2hvcnRfbmFtZSkKKwkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIi0lYyIsIG9wdHMtPnNob3J0X25hbWUpOworCQlpZiAob3B0cy0+bG9uZ19uYW1lICYmIG9wdHMtPnNob3J0X25hbWUpCisJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICIsICIpOworCQlpZiAob3B0cy0+bG9uZ19uYW1lKQorCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiLS0lcyIsIG9wdHMtPmxvbmdfbmFtZSk7CisKKwkJc3dpdGNoIChvcHRzLT50eXBlKSB7CisJCWNhc2UgT1BUSU9OX0FSR1VNRU5UOgorCQkJYnJlYWs7CisJCWNhc2UgT1BUSU9OX0lOVEVHRVI6CisJCQlpZiAob3B0cy0+ZmxhZ3MgJiBQQVJTRV9PUFRfT1BUQVJHKQorCQkJCWlmIChvcHRzLT5sb25nX25hbWUpCisJCQkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIls9PG4+XSIpOworCQkJCWVsc2UKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiWzxuPl0iKTsKKwkJCWVsc2UKKwkJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICIgPG4+Iik7CisJCQlicmVhazsKKwkJY2FzZSBPUFRJT05fQ0FMTEJBQ0s6CisJCQlpZiAob3B0cy0+ZmxhZ3MgJiBQQVJTRV9PUFRfTk9BUkcpCisJCQkJYnJlYWs7CisJCQkvKiBGQUxMVEhST1VHSCAqLworCQljYXNlIE9QVElPTl9TVFJJTkc6CisJCQlpZiAob3B0cy0+YXJnaCkgeworCQkJCWlmIChvcHRzLT5mbGFncyAmIFBBUlNFX09QVF9PUFRBUkcpCisJCQkJCWlmIChvcHRzLT5sb25nX25hbWUpCisJCQkJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICJbPTwlcz5dIiwgb3B0cy0+YXJnaCk7CisJCQkJCWVsc2UKKwkJCQkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIls8JXM+XSIsIG9wdHMtPmFyZ2gpOworCQkJCWVsc2UKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiIDwlcz4iLCBvcHRzLT5hcmdoKTsKKwkJCX0gZWxzZSB7CisJCQkJaWYgKG9wdHMtPmZsYWdzICYgUEFSU0VfT1BUX09QVEFSRykKKwkJCQkJaWYgKG9wdHMtPmxvbmdfbmFtZSkKKwkJCQkJCXBvcyArPSBmcHJpbnRmKHN0ZGVyciwgIls9Li4uXSIpOworCQkJCQllbHNlCisJCQkJCQlwb3MgKz0gZnByaW50ZihzdGRlcnIsICJbLi4uXSIpOworCQkJCWVsc2UKKwkJCQkJcG9zICs9IGZwcmludGYoc3RkZXJyLCAiIC4uLiIpOworCQkJfQorCQkJYnJlYWs7CisJCWRlZmF1bHQ6IC8qIE9QVElPTl97QklULEJPT0xFQU4sU0VUX0lOVCxTRVRfUFRSfSAqLworCQkJYnJlYWs7CisJCX0KKworCQlpZiAocG9zIDw9IFVTQUdFX09QVFNfV0lEVEgpCisJCQlwYWQgPSBVU0FHRV9PUFRTX1dJRFRIIC0gcG9zOworCQllbHNlIHsKKwkJCWZwdXRjKCdcbicsIHN0ZGVycik7CisJCQlwYWQgPSBVU0FHRV9PUFRTX1dJRFRIOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiJSpzJXNcbiIsIHBhZCArIFVTQUdFX0dBUCwgIiIsIG9wdHMtPmhlbHApOworCX0KKwlmcHV0YygnXG4nLCBzdGRlcnIpOworCisJcmV0dXJuIFBBUlNFX09QVF9IRUxQOworfQorCit2b2lkIHVzYWdlX3dpdGhfb3B0aW9ucyhjb25zdCBjaGFyICogY29uc3QgKnVzYWdlc3RyLAorCQkJY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0cykKK3sKKwl1c2FnZV93aXRoX29wdGlvbnNfaW50ZXJuYWwodXNhZ2VzdHIsIG9wdHMsIDApOworCWV4aXQoMTI5KTsKK30KKworaW50IHBhcnNlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwKKwkJCWNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdHMpCit7CisJcmV0dXJuIHVzYWdlX3dpdGhfb3B0aW9uc19pbnRlcm5hbCh1c2FnZXN0ciwgb3B0cywgMCk7Cit9CisKKworaW50IHBhcnNlX29wdF92ZXJib3NpdHlfY2IoY29uc3Qgc3RydWN0IG9wdGlvbiAqb3B0LCBjb25zdCBjaGFyICphcmcsCisJCQkgICBpbnQgdW5zZXQpCit7CisJaW50ICp0YXJnZXQgPSBvcHQtPnZhbHVlOworCisJaWYgKHVuc2V0KQorCQkvKiAtLW5vLXF1aWV0LCAtLW5vLXZlcmJvc2UgKi8KKwkJKnRhcmdldCA9IDA7CisJZWxzZSBpZiAob3B0LT5zaG9ydF9uYW1lID09ICd2JykgeworCQlpZiAoKnRhcmdldCA+PSAwKQorCQkJKCp0YXJnZXQpKys7CisJCWVsc2UKKwkJCSp0YXJnZXQgPSAxOworCX0gZWxzZSB7CisJCWlmICgqdGFyZ2V0IDw9IDApCisJCQkoKnRhcmdldCktLTsKKwkJZWxzZQorCQkJKnRhcmdldCA9IC0xOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXJzZS1vcHRpb25zLmggYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExMDM5YTYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcGFyc2Utb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTc0IEBACisjaWZuZGVmIFBBUlNFX09QVElPTlNfSAorI2RlZmluZSBQQVJTRV9PUFRJT05TX0gKKworZW51bSBwYXJzZV9vcHRfdHlwZSB7CisJLyogc3BlY2lhbCB0eXBlcyAqLworCU9QVElPTl9FTkQsCisJT1BUSU9OX0FSR1VNRU5ULAorCU9QVElPTl9HUk9VUCwKKwkvKiBvcHRpb25zIHdpdGggbm8gYXJndW1lbnRzICovCisJT1BUSU9OX0JJVCwKKwlPUFRJT05fQk9PTEVBTiwgLyogX0lOQ1Igd291bGQgaGF2ZSBiZWVuIGEgYmV0dGVyIG5hbWUgKi8KKwlPUFRJT05fU0VUX0lOVCwKKwlPUFRJT05fU0VUX1BUUiwKKwkvKiBvcHRpb25zIHdpdGggYXJndW1lbnRzICh1c3VhbGx5KSAqLworCU9QVElPTl9TVFJJTkcsCisJT1BUSU9OX0lOVEVHRVIsCisJT1BUSU9OX0xPTkcsCisJT1BUSU9OX0NBTExCQUNLLAorfTsKKworZW51bSBwYXJzZV9vcHRfZmxhZ3MgeworCVBBUlNFX09QVF9LRUVQX0RBU0hEQVNIID0gMSwKKwlQQVJTRV9PUFRfU1RPUF9BVF9OT05fT1BUSU9OID0gMiwKKwlQQVJTRV9PUFRfS0VFUF9BUkdWMCA9IDQsCisJUEFSU0VfT1BUX0tFRVBfVU5LTk9XTiA9IDgsCisJUEFSU0VfT1BUX05PX0lOVEVSTkFMX0hFTFAgPSAxNiwKK307CisKK2VudW0gcGFyc2Vfb3B0X29wdGlvbl9mbGFncyB7CisJUEFSU0VfT1BUX09QVEFSRyAgPSAxLAorCVBBUlNFX09QVF9OT0FSRyAgID0gMiwKKwlQQVJTRV9PUFRfTk9ORUcgICA9IDQsCisJUEFSU0VfT1BUX0hJRERFTiAgPSA4LAorCVBBUlNFX09QVF9MQVNUQVJHX0RFRkFVTFQgPSAxNiwKK307CisKK3N0cnVjdCBvcHRpb247Cit0eXBlZGVmIGludCBwYXJzZV9vcHRfY2IoY29uc3Qgc3RydWN0IG9wdGlvbiAqLCBjb25zdCBjaGFyICphcmcsIGludCB1bnNldCk7CisKKy8qCisgKiBgdHlwZWA6OgorICogICBob2xkcyB0aGUgdHlwZSBvZiB0aGUgb3B0aW9uLCB5b3UgbXVzdCBoYXZlIGFuIE9QVElPTl9FTkQgbGFzdCBpbiB5b3VyCisgKiAgIGFycmF5LgorICoKKyAqIGBzaG9ydF9uYW1lYDo6CisgKiAgIHRoZSBjaGFyYWN0ZXIgdG8gdXNlIGFzIGEgc2hvcnQgb3B0aW9uIG5hbWUsICdcMCcgaWYgbm9uZS4KKyAqCisgKiBgbG9uZ19uYW1lYDo6CisgKiAgIHRoZSBsb25nIG9wdGlvbiBuYW1lLCB3aXRob3V0IHRoZSBsZWFkaW5nIGRhc2hlcywgTlVMTCBpZiBub25lLgorICoKKyAqIGB2YWx1ZWA6OgorICogICBzdG9yZXMgcG9pbnRlcnMgdG8gdGhlIHZhbHVlcyB0byBiZSBmaWxsZWQuCisgKgorICogYGFyZ2hgOjoKKyAqICAgdG9rZW4gdG8gZXhwbGFpbiB0aGUga2luZCBvZiBhcmd1bWVudCB0aGlzIG9wdGlvbiB3YW50cy4gS2VlcCBpdAorICogICBob21vZ2Vub3VzIGFjcm9zcyB0aGUgcmVwb3NpdG9yeS4KKyAqCisgKiBgaGVscGA6OgorICogICB0aGUgc2hvcnQgaGVscCBhc3NvY2lhdGVkIHRvIHdoYXQgdGhlIG9wdGlvbiBkb2VzLgorICogICBNdXN0IG5ldmVyIGJlIE5VTEwgKGV4Y2VwdCBmb3IgT1BUSU9OX0VORCkuCisgKiAgIE9QVElPTl9HUk9VUCB1c2VzIHRoaXMgcG9pbnRlciB0byBzdG9yZSB0aGUgZ3JvdXAgaGVhZGVyLgorICoKKyAqIGBmbGFnc2A6OgorICogICBtYXNrIG9mIHBhcnNlX29wdF9vcHRpb25fZmxhZ3MuCisgKiAgIFBBUlNFX09QVF9PUFRBUkc6IHNheXMgdGhhdCB0aGUgYXJndW1lbnQgaXMgb3B0aW9ubmFsIChub3QgZm9yIEJPT0xFQU5zKQorICogICBQQVJTRV9PUFRfTk9BUkc6IHNheXMgdGhhdCB0aGlzIG9wdGlvbiB0YWtlcyBubyBhcmd1bWVudCwgZm9yIENBTExCQUNLcworICogICBQQVJTRV9PUFRfTk9ORUc6IHNheXMgdGhhdCB0aGlzIG9wdGlvbiBjYW5ub3QgYmUgbmVnYXRlZAorICogICBQQVJTRV9PUFRfSElEREVOIHRoaXMgb3B0aW9uIGlzIHNraXBwZWQgaW4gdGhlIGRlZmF1bHQgdXNhZ2UsIHNob3dlZCBpbgorICogICAgICAgICAgICAgICAgICAgIHRoZSBsb25nIG9uZS4KKyAqCisgKiBgY2FsbGJhY2tgOjoKKyAqICAgcG9pbnRlciB0byB0aGUgY2FsbGJhY2sgdG8gdXNlIGZvciBPUFRJT05fQ0FMTEJBQ0suCisgKgorICogYGRlZnZhbGA6OgorICogICBkZWZhdWx0IHZhbHVlIHRvIGZpbGwgKCotPnZhbHVlKSB3aXRoIGZvciBQQVJTRV9PUFRfT1BUQVJHLgorICogICBPUFRJT05fe0JJVCxTRVRfSU5ULFNFVF9QVFJ9IHN0b3JlIHRoZSB7bWFzayxpbnRlZ2VyLHBvaW50ZXJ9IHRvIHB1dCBpbgorICogICB0aGUgdmFsdWUgd2hlbiBtZXQuCisgKiAgIENBTExCQUNLUyBjYW4gdXNlIGl0IGxpa2UgdGhleSB3YW50LgorICovCitzdHJ1Y3Qgb3B0aW9uIHsKKwllbnVtIHBhcnNlX29wdF90eXBlIHR5cGU7CisJaW50IHNob3J0X25hbWU7CisJY29uc3QgY2hhciAqbG9uZ19uYW1lOworCXZvaWQgKnZhbHVlOworCWNvbnN0IGNoYXIgKmFyZ2g7CisJY29uc3QgY2hhciAqaGVscDsKKworCWludCBmbGFnczsKKwlwYXJzZV9vcHRfY2IgKmNhbGxiYWNrOworCWludHB0cl90IGRlZnZhbDsKK307CisKKyNkZWZpbmUgT1BUX0VORCgpICAgICAgICAgICAgICAgICAgIHsgT1BUSU9OX0VORCB9CisjZGVmaW5lIE9QVF9BUkdVTUVOVChsLCBoKSAgICAgICAgICB7IE9QVElPTl9BUkdVTUVOVCwgMCwgKGwpLCBOVUxMLCBOVUxMLCAoaCkgfQorI2RlZmluZSBPUFRfR1JPVVAoaCkgICAgICAgICAgICAgICAgeyBPUFRJT05fR1JPVVAsIDAsIE5VTEwsIE5VTEwsIE5VTEwsIChoKSB9CisjZGVmaW5lIE9QVF9CSVQocywgbCwgdiwgaCwgYikgICAgICB7IE9QVElPTl9CSVQsIChzKSwgKGwpLCAodiksIE5VTEwsIChoKSwgMCwgTlVMTCwgKGIpIH0KKyNkZWZpbmUgT1BUX0JPT0xFQU4ocywgbCwgdiwgaCkgICAgIHsgT1BUSU9OX0JPT0xFQU4sIChzKSwgKGwpLCAodiksIE5VTEwsIChoKSB9CisjZGVmaW5lIE9QVF9TRVRfSU5UKHMsIGwsIHYsIGgsIGkpICB7IE9QVElPTl9TRVRfSU5ULCAocyksIChsKSwgKHYpLCBOVUxMLCAoaCksIDAsIE5VTEwsIChpKSB9CisjZGVmaW5lIE9QVF9TRVRfUFRSKHMsIGwsIHYsIGgsIHApICB7IE9QVElPTl9TRVRfUFRSLCAocyksIChsKSwgKHYpLCBOVUxMLCAoaCksIDAsIE5VTEwsIChwKSB9CisjZGVmaW5lIE9QVF9JTlRFR0VSKHMsIGwsIHYsIGgpICAgICB7IE9QVElPTl9JTlRFR0VSLCAocyksIChsKSwgKHYpLCBOVUxMLCAoaCkgfQorI2RlZmluZSBPUFRfTE9ORyhzLCBsLCB2LCBoKSAgICAgICAgeyBPUFRJT05fTE9ORywgKHMpLCAobCksICh2KSwgTlVMTCwgKGgpIH0KKyNkZWZpbmUgT1BUX1NUUklORyhzLCBsLCB2LCBhLCBoKSAgIHsgT1BUSU9OX1NUUklORywgIChzKSwgKGwpLCAodiksIChhKSwgKGgpIH0KKyNkZWZpbmUgT1BUX0RBVEUocywgbCwgdiwgaCkgXAorCXsgT1BUSU9OX0NBTExCQUNLLCAocyksIChsKSwgKHYpLCAidGltZSIsKGgpLCAwLCBcCisJICBwYXJzZV9vcHRfYXBwcm94aWRhdGVfY2IgfQorI2RlZmluZSBPUFRfQ0FMTEJBQ0socywgbCwgdiwgYSwgaCwgZikgXAorCXsgT1BUSU9OX0NBTExCQUNLLCAocyksIChsKSwgKHYpLCAoYSksIChoKSwgMCwgKGYpIH0KKworLyogcGFyc2Vfb3B0aW9ucygpIHdpbGwgZmlsdGVyIG91dCB0aGUgcHJvY2Vzc2VkIG9wdGlvbnMgYW5kIGxlYXZlIHRoZQorICogbm9uLW9wdGlvbiBhcmdtZW50cyBpbiBhcmd2W10uCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzIGxlZnQgaW4gYXJndltdLgorICovCitleHRlcm4gaW50IHBhcnNlX29wdGlvbnMoaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHVzYWdlc3RyW10sIGludCBmbGFncyk7CisKK2V4dGVybiBOT1JFVFVSTiB2b2lkIHVzYWdlX3dpdGhfb3B0aW9ucyhjb25zdCBjaGFyICogY29uc3QgKnVzYWdlc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBvcHRpb24gKm9wdGlvbnMpOworCisvKi0tLS0tIGluY3JlbWFudGFsIGFkdmFuY2VkIEFQSXMgLS0tLS0qLworCitlbnVtIHsKKwlQQVJTRV9PUFRfSEVMUCA9IC0xLAorCVBBUlNFX09QVF9ET05FLAorCVBBUlNFX09QVF9VTktOT1dOLAorfTsKKworLyoKKyAqIEl0J3Mgb2theSBmb3IgdGhlIGNhbGxlciB0byBjb25zdW1lIGFyZ3YvYXJnYyBpbiB0aGUgdXN1YWwgd2F5LgorICogT3RoZXIgZmllbGRzIG9mIHRoYXQgc3RydWN0dXJlIGFyZSBwcml2YXRlIHRvIHBhcnNlLW9wdGlvbnMgYW5kIHNob3VsZCBub3QKKyAqIGJlIG1vZGlmaWVkIGluIGFueSB3YXkuCisgKi8KK3N0cnVjdCBwYXJzZV9vcHRfY3R4X3QgeworCWNvbnN0IGNoYXIgKiphcmd2OworCWNvbnN0IGNoYXIgKipvdXQ7CisJaW50IGFyZ2MsIGNwaWR4OworCWNvbnN0IGNoYXIgKm9wdDsKKwlpbnQgZmxhZ3M7Cit9OworCitleHRlcm4gaW50IHBhcnNlX29wdGlvbnNfdXNhZ2UoY29uc3QgY2hhciAqIGNvbnN0ICp1c2FnZXN0ciwKKwkJCSAgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRzKTsKKworZXh0ZXJuIHZvaWQgcGFyc2Vfb3B0aW9uc19zdGFydChzdHJ1Y3QgcGFyc2Vfb3B0X2N0eF90ICpjdHgsCisJCQkJaW50IGFyZ2MsIGNvbnN0IGNoYXIgKiphcmd2LCBpbnQgZmxhZ3MpOworCitleHRlcm4gaW50IHBhcnNlX29wdGlvbnNfc3RlcChzdHJ1Y3QgcGFyc2Vfb3B0X2N0eF90ICpjdHgsCisJCQkgICAgICBjb25zdCBzdHJ1Y3Qgb3B0aW9uICpvcHRpb25zLAorCQkJICAgICAgY29uc3QgY2hhciAqIGNvbnN0IHVzYWdlc3RyW10pOworCitleHRlcm4gaW50IHBhcnNlX29wdGlvbnNfZW5kKHN0cnVjdCBwYXJzZV9vcHRfY3R4X3QgKmN0eCk7CisKKworLyotLS0tLSBzb21lIG9mdGVuIHVzZWQgb3B0aW9ucyAtLS0tLSovCitleHRlcm4gaW50IHBhcnNlX29wdF9hYmJyZXZfY2IoY29uc3Qgc3RydWN0IG9wdGlvbiAqLCBjb25zdCBjaGFyICosIGludCk7CitleHRlcm4gaW50IHBhcnNlX29wdF9hcHByb3hpZGF0ZV9jYihjb25zdCBzdHJ1Y3Qgb3B0aW9uICosIGNvbnN0IGNoYXIgKiwgaW50KTsKK2V4dGVybiBpbnQgcGFyc2Vfb3B0X3ZlcmJvc2l0eV9jYihjb25zdCBzdHJ1Y3Qgb3B0aW9uICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworI2RlZmluZSBPUFRfX1ZFUkJPU0UodmFyKSAgT1BUX0JPT0xFQU4oJ3YnLCAidmVyYm9zZSIsICh2YXIpLCAiYmUgdmVyYm9zZSIpCisjZGVmaW5lIE9QVF9fUVVJRVQodmFyKSAgICBPUFRfQk9PTEVBTigncScsICJxdWlldCIsICAgKHZhciksICJiZSBxdWlldCIpCisjZGVmaW5lIE9QVF9fVkVSQk9TSVRZKHZhcikgXAorCXsgT1BUSU9OX0NBTExCQUNLLCAndicsICJ2ZXJib3NlIiwgKHZhciksIE5VTEwsICJiZSBtb3JlIHZlcmJvc2UiLCBcCisJICBQQVJTRV9PUFRfTk9BUkcsICZwYXJzZV9vcHRfdmVyYm9zaXR5X2NiLCAwIH0sIFwKKwl7IE9QVElPTl9DQUxMQkFDSywgJ3EnLCAicXVpZXQiLCAodmFyKSwgTlVMTCwgImJlIG1vcmUgcXVpZXQiLCBcCisJICBQQVJTRV9PUFRfTk9BUkcsICZwYXJzZV9vcHRfdmVyYm9zaXR5X2NiLCAwIH0KKyNkZWZpbmUgT1BUX19EUllfUlVOKHZhcikgIE9QVF9CT09MRUFOKCduJywgImRyeS1ydW4iLCAodmFyKSwgImRyeSBydW4iKQorI2RlZmluZSBPUFRfX0FCQlJFVih2YXIpICBcCisJeyBPUFRJT05fQ0FMTEJBQ0ssIDAsICJhYmJyZXYiLCAodmFyKSwgIm4iLCBcCisJICAidXNlIDxuPiBkaWdpdHMgdG8gZGlzcGxheSBTSEEtMXMiLCBcCisJICBQQVJTRV9PUFRfT1BUQVJHLCAmcGFyc2Vfb3B0X2FiYnJldl9jYiwgMCB9CisKK2V4dGVybiBjb25zdCBjaGFyICpwYXJzZV9vcHRpb25zX2ZpeF9maWxlbmFtZShjb25zdCBjaGFyICpwcmVmaXgsIGNvbnN0IGNoYXIgKmZpbGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9wYXRoLmMgYi90b29scy9wZXJmL3V0aWwvcGF0aC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MDFhNDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcGF0aC5jCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogSSdtIHRpcmVkIG9mIGRvaW5nICJ2c25wcmludGYoKSIgZXRjIGp1c3QgdG8gb3BlbiBhCisgKiBmaWxlLCBzbyBoZXJlJ3MgYSAicmV0dXJuIHN0YXRpYyBidWZmZXIgd2l0aCBwcmludGYiCisgKiBpbnRlcmZhY2UgZm9yIHBhdGhzLgorICoKKyAqIEl0J3Mgb2J2aW91c2x5IG5vdCB0aHJlYWQtc2FmZS4gU3VlIG1lLiBCdXQgaXQncyBxdWl0ZQorICogdXNlZnVsIGZvciBkb2luZyB0aGluZ3MgbGlrZQorICoKKyAqICAgZiA9IG9wZW4obWtwYXRoKCIlcy8lcy5wZXJmIiwgYmFzZSwgbmFtZSksIE9fUkRPTkxZKTsKKyAqCisgKiB3aGljaCBpcyB3aGF0IGl0J3MgZGVzaWduZWQgZm9yLgorICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworc3RhdGljIGNoYXIgYmFkX3BhdGhbXSA9ICIvYmFkLXBhdGgvIjsKKy8qCisgKiBUd28gaGFja3M6CisgKi8KKworc3RhdGljIGNoYXIgKmdldF9wZXJmX2Rpcih2b2lkKQoreworCXJldHVybiAiLiI7Cit9CisKK3NpemVfdCBzdHJsY3B5KGNoYXIgKmRlc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpCit7CisJc2l6ZV90IHJldCA9IHN0cmxlbihzcmMpOworCisJaWYgKHNpemUpIHsKKwkJc2l6ZV90IGxlbiA9IChyZXQgPj0gc2l6ZSkgPyBzaXplIC0gMSA6IHJldDsKKwkJbWVtY3B5KGRlc3QsIHNyYywgbGVuKTsKKwkJZGVzdFtsZW5dID0gJ1wwJzsKKwl9CisJcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgY2hhciAqZ2V0X3BhdGhuYW1lKHZvaWQpCit7CisJc3RhdGljIGNoYXIgcGF0aG5hbWVfYXJyYXlbNF1bUEFUSF9NQVhdOworCXN0YXRpYyBpbnQgaW5kZXg7CisJcmV0dXJuIHBhdGhuYW1lX2FycmF5WzMgJiArK2luZGV4XTsKK30KKworc3RhdGljIGNoYXIgKmNsZWFudXBfcGF0aChjaGFyICpwYXRoKQoreworCS8qIENsZWFuIGl0IHVwICovCisJaWYgKCFtZW1jbXAocGF0aCwgIi4vIiwgMikpIHsKKwkJcGF0aCArPSAyOworCQl3aGlsZSAoKnBhdGggPT0gJy8nKQorCQkJcGF0aCsrOworCX0KKwlyZXR1cm4gcGF0aDsKK30KKworY2hhciAqbWtzbnBhdGgoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXVuc2lnbmVkIGxlbjsKKworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKGJ1ZiwgbiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJaWYgKGxlbiA+PSBuKSB7CisJCXN0cmxjcHkoYnVmLCBiYWRfcGF0aCwgbik7CisJCXJldHVybiBidWY7CisJfQorCXJldHVybiBjbGVhbnVwX3BhdGgoYnVmKTsKK30KKworc3RhdGljIGNoYXIgKnBlcmZfdnNucGF0aChjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykKK3sKKwljb25zdCBjaGFyICpwZXJmX2RpciA9IGdldF9wZXJmX2RpcigpOworCXNpemVfdCBsZW47CisKKwlsZW4gPSBzdHJsZW4ocGVyZl9kaXIpOworCWlmIChuIDwgbGVuICsgMSkKKwkJZ290byBiYWQ7CisJbWVtY3B5KGJ1ZiwgcGVyZl9kaXIsIGxlbik7CisJaWYgKGxlbiAmJiAhaXNfZGlyX3NlcChwZXJmX2RpcltsZW4tMV0pKQorCQlidWZbbGVuKytdID0gJy8nOworCWxlbiArPSB2c25wcmludGYoYnVmICsgbGVuLCBuIC0gbGVuLCBmbXQsIGFyZ3MpOworCWlmIChsZW4gPj0gbikKKwkJZ290byBiYWQ7CisJcmV0dXJuIGNsZWFudXBfcGF0aChidWYpOworYmFkOgorCXN0cmxjcHkoYnVmLCBiYWRfcGF0aCwgbik7CisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqcGVyZl9zbnBhdGgoY2hhciAqYnVmLCBzaXplX3QgbiwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdzOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJKHZvaWQpcGVyZl92c25wYXRoKGJ1ZiwgbiwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuIGJ1ZjsKK30KKworY2hhciAqcGVyZl9wYXRoZHVwKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIgcGF0aFtQQVRIX01BWF07CisJdmFfbGlzdCBhcmdzOworCXZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisJKHZvaWQpcGVyZl92c25wYXRoKHBhdGgsIHNpemVvZihwYXRoKSwgZm10LCBhcmdzKTsKKwl2YV9lbmQoYXJncyk7CisJcmV0dXJuIHhzdHJkdXAocGF0aCk7Cit9CisKK2NoYXIgKm1rcGF0aChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgbGVuOworCWNoYXIgKnBhdGhuYW1lID0gZ2V0X3BhdGhuYW1lKCk7CisKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiA9IHZzbnByaW50ZihwYXRobmFtZSwgUEFUSF9NQVgsIGZtdCwgYXJncyk7CisJdmFfZW5kKGFyZ3MpOworCWlmIChsZW4gPj0gUEFUSF9NQVgpCisJCXJldHVybiBiYWRfcGF0aDsKKwlyZXR1cm4gY2xlYW51cF9wYXRoKHBhdGhuYW1lKTsKK30KKworY2hhciAqcGVyZl9wYXRoKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNvbnN0IGNoYXIgKnBlcmZfZGlyID0gZ2V0X3BlcmZfZGlyKCk7CisJY2hhciAqcGF0aG5hbWUgPSBnZXRfcGF0aG5hbWUoKTsKKwl2YV9saXN0IGFyZ3M7CisJdW5zaWduZWQgbGVuOworCisJbGVuID0gc3RybGVuKHBlcmZfZGlyKTsKKwlpZiAobGVuID4gUEFUSF9NQVgtMTAwKQorCQlyZXR1cm4gYmFkX3BhdGg7CisJbWVtY3B5KHBhdGhuYW1lLCBwZXJmX2RpciwgbGVuKTsKKwlpZiAobGVuICYmIHBlcmZfZGlyW2xlbi0xXSAhPSAnLycpCisJCXBhdGhuYW1lW2xlbisrXSA9ICcvJzsKKwl2YV9zdGFydChhcmdzLCBmbXQpOworCWxlbiArPSB2c25wcmludGYocGF0aG5hbWUgKyBsZW4sIFBBVEhfTUFYIC0gbGVuLCBmbXQsIGFyZ3MpOworCXZhX2VuZChhcmdzKTsKKwlpZiAobGVuID49IFBBVEhfTUFYKQorCQlyZXR1cm4gYmFkX3BhdGg7CisJcmV0dXJuIGNsZWFudXBfcGF0aChwYXRobmFtZSk7Cit9CisKKworLyogcGVyZl9ta3N0ZW1wKCkgLSBjcmVhdGUgdG1wIGZpbGUgaG9ub3JpbmcgVE1QRElSIHZhcmlhYmxlICovCitpbnQgcGVyZl9ta3N0ZW1wKGNoYXIgKnBhdGgsIHNpemVfdCBsZW4sIGNvbnN0IGNoYXIgKnRlbXBsYXRlKQoreworCWNvbnN0IGNoYXIgKnRtcDsKKwlzaXplX3QgbjsKKworCXRtcCA9IGdldGVudigiVE1QRElSIik7CisJaWYgKCF0bXApCisJCXRtcCA9ICIvdG1wIjsKKwluID0gc25wcmludGYocGF0aCwgbGVuLCAiJXMvJXMiLCB0bXAsIHRlbXBsYXRlKTsKKwlpZiAobGVuIDw9IG4pIHsKKwkJZXJybm8gPSBFTkFNRVRPT0xPTkc7CisJCXJldHVybiAtMTsKKwl9CisJcmV0dXJuIG1rc3RlbXAocGF0aCk7Cit9CisKKworY29uc3QgY2hhciAqbWFrZV9yZWxhdGl2ZV9wYXRoKGNvbnN0IGNoYXIgKmFicywgY29uc3QgY2hhciAqYmFzZSkKK3sKKwlzdGF0aWMgY2hhciBidWZbUEFUSF9NQVggKyAxXTsKKwlpbnQgYmFzZWxlbjsKKwlpZiAoIWJhc2UpCisJCXJldHVybiBhYnM7CisJYmFzZWxlbiA9IHN0cmxlbihiYXNlKTsKKwlpZiAocHJlZml4Y21wKGFicywgYmFzZSkpCisJCXJldHVybiBhYnM7CisJaWYgKGFic1tiYXNlbGVuXSA9PSAnLycpCisJCWJhc2VsZW4rKzsKKwllbHNlIGlmIChiYXNlW2Jhc2VsZW4gLSAxXSAhPSAnLycpCisJCXJldHVybiBhYnM7CisJc3RyY3B5KGJ1ZiwgYWJzICsgYmFzZWxlbik7CisJcmV0dXJuIGJ1ZjsKK30KKworLyoKKyAqIEl0IGlzIG9rYXkgaWYgZHN0ID09IHNyYywgYnV0IHRoZXkgc2hvdWxkIG5vdCBvdmVybGFwIG90aGVyd2lzZS4KKyAqCisgKiBQZXJmb3JtcyB0aGUgZm9sbG93aW5nIG5vcm1hbGl6YXRpb25zIG9uIHNyYywgc3RvcmluZyB0aGUgcmVzdWx0IGluIGRzdDoKKyAqIC0gRW5zdXJlcyB0aGF0IGNvbXBvbmVudHMgYXJlIHNlcGFyYXRlZCBieSAnLycgKFdpbmRvd3Mgb25seSkKKyAqIC0gU3F1YXNoZXMgc2VxdWVuY2VzIG9mICcvJy4KKyAqIC0gUmVtb3ZlcyAiLiIgY29tcG9uZW50cy4KKyAqIC0gUmVtb3ZlcyAiLi4iIGNvbXBvbmVudHMsIGFuZCB0aGUgY29tcG9uZW50cyB0aGUgcHJlY2VkZSB0aGVtLgorICogUmV0dXJucyBmYWlsdXJlIChub24temVybykgaWYgYSAiLi4iIGNvbXBvbmVudCBhcHBlYXJzIGFzIGZpcnN0IHBhdGgKKyAqIGNvbXBvbmVudCBhbnl0aW1lIGR1cmluZyB0aGUgbm9ybWFsaXphdGlvbi4gT3RoZXJ3aXNlLCByZXR1cm5zIHN1Y2Nlc3MgKDApLgorICoKKyAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIHB1cmVseSB0ZXh0dWFsLiAgSXQgZG9lcyBub3QgZm9sbG93IHN5bWxpbmtzLAorICogdmVyaWZ5IHRoZSBleGlzdGVuY2Ugb2YgdGhlIHBhdGgsIG9yIG1ha2UgYW55IHN5c3RlbSBjYWxscy4KKyAqLworaW50IG5vcm1hbGl6ZV9wYXRoX2NvcHkoY2hhciAqZHN0LCBjb25zdCBjaGFyICpzcmMpCit7CisJY2hhciAqZHN0MDsKKworCWlmIChoYXNfZG9zX2RyaXZlX3ByZWZpeChzcmMpKSB7CisJCSpkc3QrKyA9ICpzcmMrKzsKKwkJKmRzdCsrID0gKnNyYysrOworCX0KKwlkc3QwID0gZHN0OworCisJaWYgKGlzX2Rpcl9zZXAoKnNyYykpIHsKKwkJKmRzdCsrID0gJy8nOworCQl3aGlsZSAoaXNfZGlyX3NlcCgqc3JjKSkKKwkJCXNyYysrOworCX0KKworCWZvciAoOzspIHsKKwkJY2hhciBjID0gKnNyYzsKKworCQkvKgorCQkgKiBBIHBhdGggY29tcG9uZW50IHRoYXQgYmVnaW5zIHdpdGggLiBjb3VsZCBiZQorCQkgKiBzcGVjaWFsOgorCQkgKiAoMSkgIi4iIGFuZCBlbmRzICAgLS0gaWdub3JlIGFuZCB0ZXJtaW5hdGUuCisJCSAqICgyKSAiLi8iICAgICAgICAgICAtLSBpZ25vcmUgdGhlbSwgZWF0IHNsYXNoIGFuZCBjb250aW51ZS4KKwkJICogKDMpICIuLiIgYW5kIGVuZHMgIC0tIHN0cmlwIG9uZSBhbmQgdGVybWluYXRlLgorCQkgKiAoNCkgIi4uLyIgICAgICAgICAgLS0gc3RyaXAgb25lLCBlYXQgc2xhc2ggYW5kIGNvbnRpbnVlLgorCQkgKi8KKwkJaWYgKGMgPT0gJy4nKSB7CisJCQlpZiAoIXNyY1sxXSkgeworCQkJCS8qICgxKSAqLworCQkJCXNyYysrOworCQkJfSBlbHNlIGlmIChpc19kaXJfc2VwKHNyY1sxXSkpIHsKKwkJCQkvKiAoMikgKi8KKwkJCQlzcmMgKz0gMjsKKwkJCQl3aGlsZSAoaXNfZGlyX3NlcCgqc3JjKSkKKwkJCQkJc3JjKys7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgaWYgKHNyY1sxXSA9PSAnLicpIHsKKwkJCQlpZiAoIXNyY1syXSkgeworCQkJCQkvKiAoMykgKi8KKwkJCQkJc3JjICs9IDI7CisJCQkJCWdvdG8gdXBfb25lOworCQkJCX0gZWxzZSBpZiAoaXNfZGlyX3NlcChzcmNbMl0pKSB7CisJCQkJCS8qICg0KSAqLworCQkJCQlzcmMgKz0gMzsKKwkJCQkJd2hpbGUgKGlzX2Rpcl9zZXAoKnNyYykpCisJCQkJCQlzcmMrKzsKKwkJCQkJZ290byB1cF9vbmU7CisJCQkJfQorCQkJfQorCQl9CisKKwkJLyogY29weSB1cCB0byB0aGUgbmV4dCAnLycsIGFuZCBlYXQgYWxsICcvJyAqLworCQl3aGlsZSAoKGMgPSAqc3JjKyspICE9ICdcMCcgJiYgIWlzX2Rpcl9zZXAoYykpCisJCQkqZHN0KysgPSBjOworCQlpZiAoaXNfZGlyX3NlcChjKSkgeworCQkJKmRzdCsrID0gJy8nOworCQkJd2hpbGUgKGlzX2Rpcl9zZXAoYykpCisJCQkJYyA9ICpzcmMrKzsKKwkJCXNyYy0tOworCQl9IGVsc2UgaWYgKCFjKQorCQkJYnJlYWs7CisJCWNvbnRpbnVlOworCisJdXBfb25lOgorCQkvKgorCQkgKiBkc3QwLi5kc3QgaXMgcHJlZml4IHBvcnRpb24sIGFuZCBkc3RbLTFdIGlzICcvJzsKKwkJICogZ28gdXAgb25lIGxldmVsLgorCQkgKi8KKwkJZHN0LS07CS8qIGdvIHRvIHRyYWlsaW5nICcvJyAqLworCQlpZiAoZHN0IDw9IGRzdDApCisJCQlyZXR1cm4gLTE7CisJCS8qIFdpbmRvd3M6IGRzdFstMV0gY2Fubm90IGJlIGJhY2tzbGFzaCBhbnltb3JlICovCisJCXdoaWxlIChkc3QwIDwgZHN0ICYmIGRzdFstMV0gIT0gJy8nKQorCQkJZHN0LS07CisJfQorCSpkc3QgPSAnXDAnOworCXJldHVybiAwOworfQorCisvKgorICogcGF0aCA9IENhbm9uaWNhbCBhYnNvbHV0ZSBwYXRoCisgKiBwcmVmaXhfbGlzdCA9IENvbG9uLXNlcGFyYXRlZCBsaXN0IG9mIGFic29sdXRlIHBhdGhzCisgKgorICogRGV0ZXJtaW5lcywgZm9yIGVhY2ggcGF0aCBpbiBwcmVmaXhfbGlzdCwgd2hldGhlciB0aGUgInByZWZpeCIgcmVhbGx5CisgKiBpcyBhbiBhbmNlc3RvciBkaXJlY3Rvcnkgb2YgcGF0aC4gIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdAorICogYW5jZXN0b3IgZGlyZWN0b3J5LCBleGNsdWRpbmcgYW55IHRyYWlsaW5nIHNsYXNoZXMsIG9yIC0xIGlmIG5vIHByZWZpeAorICogaXMgYW4gYW5jZXN0b3IuICAoTm90ZSB0aGF0IHRoaXMgbWVhbnMgMCBpcyByZXR1cm5lZCBpZiBwcmVmaXhfbGlzdCBpcworICogIi8iLikgIi9mb28iIGlzIG5vdCBjb25zaWRlcmVkIGFuIGFuY2VzdG9yIG9mICIvZm9vYmFyIi4gIERpcmVjdG9yaWVzCisgKiBhcmUgbm90IGNvbnNpZGVyZWQgdG8gYmUgdGhlaXIgb3duIGFuY2VzdG9ycy4gIHBhdGggbXVzdCBiZSBpbiBhCisgKiBjYW5vbmljYWwgZm9ybTogZW1wdHkgY29tcG9uZW50cywgb3IgIi4iIG9yICIuLiIgY29tcG9uZW50cyBhcmUgbm90CisgKiBhbGxvd2VkLiAgcHJlZml4X2xpc3QgbWF5IGJlIG51bGwsIHdoaWNoIGlzIGxpa2UgIiIuCisgKi8KK2ludCBsb25nZXN0X2FuY2VzdG9yX2xlbmd0aChjb25zdCBjaGFyICpwYXRoLCBjb25zdCBjaGFyICpwcmVmaXhfbGlzdCkKK3sKKwljaGFyIGJ1ZltQQVRIX01BWCsxXTsKKwljb25zdCBjaGFyICpjZWlsLCAqY29sb247CisJaW50IGxlbiwgbWF4X2xlbiA9IC0xOworCisJaWYgKHByZWZpeF9saXN0ID09IE5VTEwgfHwgIXN0cmNtcChwYXRoLCAiLyIpKQorCQlyZXR1cm4gLTE7CisKKwlmb3IgKGNvbG9uID0gY2VpbCA9IHByZWZpeF9saXN0OyAqY29sb247IGNlaWwgPSBjb2xvbisxKSB7CisJCWZvciAoY29sb24gPSBjZWlsOyAqY29sb24gJiYgKmNvbG9uICE9IFBBVEhfU0VQOyBjb2xvbisrKTsKKwkJbGVuID0gY29sb24gLSBjZWlsOworCQlpZiAobGVuID09IDAgfHwgbGVuID4gUEFUSF9NQVggfHwgIWlzX2Fic29sdXRlX3BhdGgoY2VpbCkpCisJCQljb250aW51ZTsKKwkJc3RybGNweShidWYsIGNlaWwsIGxlbisxKTsKKwkJaWYgKG5vcm1hbGl6ZV9wYXRoX2NvcHkoYnVmLCBidWYpIDwgMCkKKwkJCWNvbnRpbnVlOworCQlsZW4gPSBzdHJsZW4oYnVmKTsKKwkJaWYgKGxlbiA+IDAgJiYgYnVmW2xlbi0xXSA9PSAnLycpCisJCQlidWZbLS1sZW5dID0gJ1wwJzsKKworCQlpZiAoIXN0cm5jbXAocGF0aCwgYnVmLCBsZW4pICYmCisJCSAgICBwYXRoW2xlbl0gPT0gJy8nICYmCisJCSAgICBsZW4gPiBtYXhfbGVuKSB7CisJCQltYXhfbGVuID0gbGVuOworCQl9CisJfQorCisJcmV0dXJuIG1heF9sZW47Cit9CisKKy8qIHN0cmlwIGFyYml0cmFyeSBhbW91bnQgb2YgZGlyZWN0b3J5IHNlcGFyYXRvcnMgYXQgZW5kIG9mIHBhdGggKi8KK3N0YXRpYyBpbmxpbmUgaW50IGNob21wX3RyYWlsaW5nX2Rpcl9zZXAoY29uc3QgY2hhciAqcGF0aCwgaW50IGxlbikKK3sKKwl3aGlsZSAobGVuICYmIGlzX2Rpcl9zZXAocGF0aFtsZW4gLSAxXSkpCisJCWxlbi0tOworCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBJZiBwYXRoIGVuZHMgd2l0aCBzdWZmaXggKGNvbXBsZXRlIHBhdGggY29tcG9uZW50cyksIHJldHVybnMgdGhlCisgKiBwYXJ0IGJlZm9yZSBzdWZmaXggKHNhbnMgdHJhaWxpbmcgZGlyZWN0b3J5IHNlcGFyYXRvcnMpLgorICogT3RoZXJ3aXNlIHJldHVybnMgTlVMTC4KKyAqLworY2hhciAqc3RyaXBfcGF0aF9zdWZmaXgoY29uc3QgY2hhciAqcGF0aCwgY29uc3QgY2hhciAqc3VmZml4KQoreworCWludCBwYXRoX2xlbiA9IHN0cmxlbihwYXRoKSwgc3VmZml4X2xlbiA9IHN0cmxlbihzdWZmaXgpOworCisJd2hpbGUgKHN1ZmZpeF9sZW4pIHsKKwkJaWYgKCFwYXRoX2xlbikKKwkJCXJldHVybiBOVUxMOworCisJCWlmIChpc19kaXJfc2VwKHBhdGhbcGF0aF9sZW4gLSAxXSkpIHsKKwkJCWlmICghaXNfZGlyX3NlcChzdWZmaXhbc3VmZml4X2xlbiAtIDFdKSkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXBhdGhfbGVuID0gY2hvbXBfdHJhaWxpbmdfZGlyX3NlcChwYXRoLCBwYXRoX2xlbik7CisJCQlzdWZmaXhfbGVuID0gY2hvbXBfdHJhaWxpbmdfZGlyX3NlcChzdWZmaXgsIHN1ZmZpeF9sZW4pOworCQl9CisJCWVsc2UgaWYgKHBhdGhbLS1wYXRoX2xlbl0gIT0gc3VmZml4Wy0tc3VmZml4X2xlbl0pCisJCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAocGF0aF9sZW4gJiYgIWlzX2Rpcl9zZXAocGF0aFtwYXRoX2xlbiAtIDFdKSkKKwkJcmV0dXJuIE5VTEw7CisJcmV0dXJuIHhzdHJuZHVwKHBhdGgsIGNob21wX3RyYWlsaW5nX2Rpcl9zZXAocGF0aCwgcGF0aF9sZW4pKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9xdW90ZS5jIGIvdG9vbHMvcGVyZi91dGlsL3F1b3RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE4YzUyMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9xdW90ZS5jCkBAIC0wLDAgKzEsNDgxIEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJxdW90ZS5oIgorCitpbnQgcXVvdGVfcGF0aF9mdWxseSA9IDE7CisKKy8qIEhlbHAgdG8gY29weSB0aGUgdGhpbmcgcHJvcGVybHkgcXVvdGVkIGZvciB0aGUgc2hlbGwgc2FmZXR5LgorICogYW55IHNpbmdsZSBxdW90ZSBpcyByZXBsYWNlZCB3aXRoICdcJycsIGFueSBleGNsYW1hdGlvbiBwb2ludAorICogaXMgcmVwbGFjZWQgd2l0aCAnXCEnLCBhbmQgdGhlIHdob2xlIHRoaW5nIGlzIGVuY2xvc2VkIGluIGEKKyAqCisgKiBFLmcuCisgKiAgb3JpZ2luYWwgICAgIHNxX3F1b3RlICAgICByZXN1bHQKKyAqICBuYW1lICAgICA9PT4gbmFtZSAgICAgID09PiAnbmFtZScKKyAqICBhIGIgICAgICA9PT4gYSBiICAgICAgID09PiAnYSBiJworICogIGEnYiAgICAgID09PiBhJ1wnJ2IgICAgPT0+ICdhJ1wnJ2InCisgKiAgYSFiICAgICAgPT0+IGEnXCEnYiAgICA9PT4gJ2EnXCEnYicKKyAqLworc3RhdGljIGlubGluZSBpbnQgbmVlZF9ic19xdW90ZShjaGFyIGMpCit7CisJcmV0dXJuIChjID09ICdcJycgfHwgYyA9PSAnIScpOworfQorCit2b2lkIHNxX3F1b3RlX2J1ZihzdHJ1Y3Qgc3RyYnVmICpkc3QsIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyICp0b19mcmVlID0gTlVMTDsKKworCWlmIChkc3QtPmJ1ZiA9PSBzcmMpCisJCXRvX2ZyZWUgPSBzdHJidWZfZGV0YWNoKGRzdCwgTlVMTCk7CisKKwlzdHJidWZfYWRkY2goZHN0LCAnXCcnKTsKKwl3aGlsZSAoKnNyYykgeworCQlzaXplX3QgbGVuID0gc3RyY3NwbihzcmMsICInISIpOworCQlzdHJidWZfYWRkKGRzdCwgc3JjLCBsZW4pOworCQlzcmMgKz0gbGVuOworCQl3aGlsZSAobmVlZF9ic19xdW90ZSgqc3JjKSkgeworCQkJc3RyYnVmX2FkZHN0cihkc3QsICInXFwiKTsKKwkJCXN0cmJ1Zl9hZGRjaChkc3QsICpzcmMrKyk7CisJCQlzdHJidWZfYWRkY2goZHN0LCAnXCcnKTsKKwkJfQorCX0KKwlzdHJidWZfYWRkY2goZHN0LCAnXCcnKTsKKwlmcmVlKHRvX2ZyZWUpOworfQorCit2b2lkIHNxX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKQoreworCWNoYXIgYzsKKworCWZwdXRjKCdcJycsIHN0cmVhbSk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlpZiAobmVlZF9ic19xdW90ZShjKSkgeworCQkJZnB1dHMoIidcXCIsIHN0cmVhbSk7CisJCQlmcHV0YyhjLCBzdHJlYW0pOworCQkJZnB1dGMoJ1wnJywgc3RyZWFtKTsKKwkJfSBlbHNlIHsKKwkJCWZwdXRjKGMsIHN0cmVhbSk7CisJCX0KKwl9CisJZnB1dGMoJ1wnJywgc3RyZWFtKTsKK30KKwordm9pZCBzcV9xdW90ZV9hcmd2KHN0cnVjdCBzdHJidWYgKmRzdCwgY29uc3QgY2hhcioqIGFyZ3YsIHNpemVfdCBtYXhsZW4pCit7CisJaW50IGk7CisKKwkvKiBDb3B5IGludG8gZGVzdGluYXRpb24gYnVmZmVyLiAqLworCXN0cmJ1Zl9ncm93KGRzdCwgMjU1KTsKKwlmb3IgKGkgPSAwOyBhcmd2W2ldOyArK2kpIHsKKwkJc3RyYnVmX2FkZGNoKGRzdCwgJyAnKTsKKwkJc3FfcXVvdGVfYnVmKGRzdCwgYXJndltpXSk7CisJCWlmIChtYXhsZW4gJiYgZHN0LT5sZW4gPiBtYXhsZW4pCisJCQlkaWUoIlRvbyBtYW55IG9yIGxvbmcgYXJndW1lbnRzIik7CisJfQorfQorCitjaGFyICpzcV9kZXF1b3RlX3N0ZXAoY2hhciAqYXJnLCBjaGFyICoqbmV4dCkKK3sKKwljaGFyICpkc3QgPSBhcmc7CisJY2hhciAqc3JjID0gYXJnOworCWNoYXIgYzsKKworCWlmICgqc3JjICE9ICdcJycpCisJCXJldHVybiBOVUxMOworCWZvciAoOzspIHsKKwkJYyA9ICorK3NyYzsKKwkJaWYgKCFjKQorCQkJcmV0dXJuIE5VTEw7CisJCWlmIChjICE9ICdcJycpIHsKKwkJCSpkc3QrKyA9IGM7CisJCQljb250aW51ZTsKKwkJfQorCQkvKiBXZSBzdGVwcGVkIG91dCBvZiBzcSAqLworCQlzd2l0Y2ggKCorK3NyYykgeworCQljYXNlICdcMCc6CisJCQkqZHN0ID0gMDsKKwkJCWlmIChuZXh0KQorCQkJCSpuZXh0ID0gTlVMTDsKKwkJCXJldHVybiBhcmc7CisJCWNhc2UgJ1xcJzoKKwkJCWMgPSAqKytzcmM7CisJCQlpZiAobmVlZF9ic19xdW90ZShjKSAmJiAqKytzcmMgPT0gJ1wnJykgeworCQkJCSpkc3QrKyA9IGM7CisJCQkJY29udGludWU7CisJCQl9CisJCS8qIEZhbGx0aHJvdWdoICovCisJCWRlZmF1bHQ6CisJCQlpZiAoIW5leHQgfHwgIWlzc3BhY2UoKnNyYykpCisJCQkJcmV0dXJuIE5VTEw7CisJCQlkbyB7CisJCQkJYyA9ICorK3NyYzsKKwkJCX0gd2hpbGUgKGlzc3BhY2UoYykpOworCQkJKmRzdCA9IDA7CisJCQkqbmV4dCA9IHNyYzsKKwkJCXJldHVybiBhcmc7CisJCX0KKwl9Cit9CisKK2NoYXIgKnNxX2RlcXVvdGUoY2hhciAqYXJnKQoreworCXJldHVybiBzcV9kZXF1b3RlX3N0ZXAoYXJnLCBOVUxMKTsKK30KKworaW50IHNxX2RlcXVvdGVfdG9fYXJndihjaGFyICphcmcsIGNvbnN0IGNoYXIgKioqYXJndiwgaW50ICpuciwgaW50ICphbGxvYykKK3sKKwljaGFyICpuZXh0ID0gYXJnOworCisJaWYgKCEqYXJnKQorCQlyZXR1cm4gMDsKKwlkbyB7CisJCWNoYXIgKmRlcXVvdGVkID0gc3FfZGVxdW90ZV9zdGVwKG5leHQsICZuZXh0KTsKKwkJaWYgKCFkZXF1b3RlZCkKKwkJCXJldHVybiAtMTsKKwkJQUxMT0NfR1JPVygqYXJndiwgKm5yICsgMSwgKmFsbG9jKTsKKwkJKCphcmd2KVsoKm5yKSsrXSA9IGRlcXVvdGVkOworCX0gd2hpbGUgKG5leHQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIDEgbWVhbnM6IHF1b3RlIGFzIG9jdGFsCisgKiAwIG1lYW5zOiBxdW90ZSBhcyBvY3RhbCBpZiAocXVvdGVfcGF0aF9mdWxseSkKKyAqIC0xIG1lYW5zOiBuZXZlciBxdW90ZQorICogYzogcXVvdGUgYXMgIlxcYyIKKyAqLworI2RlZmluZSBYOCh4KSAgIHgsIHgsIHgsIHgsIHgsIHgsIHgsIHgKKyNkZWZpbmUgWDE2KHgpICBYOCh4KSwgWDgoeCkKK3N0YXRpYyBzaWduZWQgY2hhciBjb25zdCBzcV9sb29rdXBbMjU2XSA9IHsKKwkvKiAgICAgICAgICAgMCAgICAxICAgIDIgICAgMyAgICA0ICAgIDUgICAgNiAgICA3ICovCisJLyogMHgwMCAqLyAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICdhJywKKwkvKiAweDA4ICovICdiJywgJ3QnLCAnbicsICd2JywgJ2YnLCAncicsICAgMSwgICAxLAorCS8qIDB4MTAgKi8gWDE2KDEpLAorCS8qIDB4MjAgKi8gIC0xLCAgLTEsICciJywgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsCisJLyogMHgyOCAqLyBYMTYoLTEpLCBYMTYoLTEpLCBYMTYoLTEpLAorCS8qIDB4NTggKi8gIC0xLCAgLTEsICAtMSwgIC0xLCdcXCcsICAtMSwgIC0xLCAgLTEsCisJLyogMHg2MCAqLyBYMTYoLTEpLCBYOCgtMSksCisJLyogMHg3OCAqLyAgLTEsICAtMSwgIC0xLCAgLTEsICAtMSwgIC0xLCAgLTEsICAgMSwKKwkvKiAweDgwICovIC8qIHNldCB0byAwICovCit9OworCitzdGF0aWMgaW5saW5lIGludCBzcV9tdXN0X3F1b3RlKGNoYXIgYykKK3sKKwlyZXR1cm4gc3FfbG9va3VwWyh1bnNpZ25lZCBjaGFyKWNdICsgcXVvdGVfcGF0aF9mdWxseSA+IDA7Cit9CisKKy8qIHJldHVybnMgdGhlIGxvbmdlc3QgcHJlZml4IG5vdCBuZWVkaW5nIGEgcXVvdGUgdXAgdG8gbWF4bGVuIGlmIHBvc2l0aXZlLgorICAgVGhpcyBzdG9wcyBhdCB0aGUgZmlyc3QgXDAgYmVjYXVzZSBpdCdzIG1hcmtlZCBhcyBhIGNoYXJhY3RlciBuZWVkaW5nIGFuCisgICBlc2NhcGUgKi8KK3N0YXRpYyBzaXplX3QgbmV4dF9xdW90ZV9wb3MoY29uc3QgY2hhciAqcywgc3NpemVfdCBtYXhsZW4pCit7CisJc2l6ZV90IGxlbjsKKwlpZiAobWF4bGVuIDwgMCkgeworCQlmb3IgKGxlbiA9IDA7ICFzcV9tdXN0X3F1b3RlKHNbbGVuXSk7IGxlbisrKTsKKwl9IGVsc2UgeworCQlmb3IgKGxlbiA9IDA7IGxlbiA8IG1heGxlbiAmJiAhc3FfbXVzdF9xdW90ZShzW2xlbl0pOyBsZW4rKyk7CisJfQorCXJldHVybiBsZW47Cit9CisKKy8qCisgKiBDLXN0eWxlIG5hbWUgcXVvdGluZy4KKyAqCisgKiAoMSkgaWYgc2IgYW5kIGZwIGFyZSBib3RoIE5VTEwsIGluc3BlY3QgdGhlIGlucHV0IG5hbWUgYW5kIGNvdW50cyB0aGUKKyAqICAgICBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgbmVlZGVkIHRvIGhvbGQgY19zdHlsZSBxdW90ZWQgdmVyc2lvbiBvZiBuYW1lLAorICogICAgIGNvdW50aW5nIHRoZSBkb3VibGUgcXVvdGVzIGFyb3VuZCBpdCBidXQgbm90IHRlcm1pbmF0aW5nIE5VTCwgYW5kCisgKiAgICAgcmV0dXJucyBpdC4KKyAqICAgICBIb3dldmVyLCBpZiBuYW1lIGRvZXMgbm90IG5lZWQgY19zdHlsZSBxdW90aW5nLCBpdCByZXR1cm5zIDAuCisgKgorICogKDIpIGlmIHNiIG9yIGZwIGFyZSBub3QgTlVMTCwgaXQgZW1pdHMgdGhlIGNfc3R5bGUgcXVvdGVkIHZlcnNpb24KKyAqICAgICBvZiBuYW1lLCBlbmNsb3NlZCB3aXRoIGRvdWJsZSBxdW90ZXMgaWYgYXNrZWQgYW5kIG5lZWRlZCBvbmx5LgorICogICAgIFJldHVybiB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBpbiAoMSkuCisgKi8KK3N0YXRpYyBzaXplX3QgcXVvdGVfY19zdHlsZV9jb3VudGVkKGNvbnN0IGNoYXIgKm5hbWUsIHNzaXplX3QgbWF4bGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0cmJ1ZiAqc2IsIEZJTEUgKmZwLCBpbnQgbm9fZHEpCit7CisjdW5kZWYgRU1JVAorI2RlZmluZSBFTUlUKGMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCWRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCQlpZiAoc2IpIHN0cmJ1Zl9hZGRjaChzYiwgKGMpKTsgICAgICAgICAgXAorCQlpZiAoZnApIGZwdXRjKChjKSwgZnApOyAgICAgICAgICAgICAgICAgXAorCQljb3VudCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCX0gd2hpbGUgKDApCisjZGVmaW5lIEVNSVRCVUYocywgbCkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJCWludCBfX3JldDsJCQkJXAorCQlpZiAoc2IpIHN0cmJ1Zl9hZGQoc2IsIChzKSwgKGwpKTsgICAgICAgXAorCQlpZiAoZnApIF9fcmV0ID0gZndyaXRlKChzKSwgKGwpLCAxLCBmcCk7ICAgICAgICBcCisJCWNvdW50ICs9IChsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfSB3aGlsZSAoMCkKKworCXNpemVfdCBsZW4sIGNvdW50ID0gMDsKKwljb25zdCBjaGFyICpwID0gbmFtZTsKKworCWZvciAoOzspIHsKKwkJaW50IGNoOworCisJCWxlbiA9IG5leHRfcXVvdGVfcG9zKHAsIG1heGxlbik7CisJCWlmIChsZW4gPT0gbWF4bGVuIHx8ICFwW2xlbl0pCisJCQlicmVhazsKKworCQlpZiAoIW5vX2RxICYmIHAgPT0gbmFtZSkKKwkJCUVNSVQoJyInKTsKKworCQlFTUlUQlVGKHAsIGxlbik7CisJCUVNSVQoJ1xcJyk7CisJCXAgKz0gbGVuOworCQljaCA9ICh1bnNpZ25lZCBjaGFyKSpwKys7CisJCWlmIChzcV9sb29rdXBbY2hdID49ICcgJykgeworCQkJRU1JVChzcV9sb29rdXBbY2hdKTsKKwkJfSBlbHNlIHsKKwkJCUVNSVQoKChjaCA+PiA2KSAmIDAzKSArICcwJyk7CisJCQlFTUlUKCgoY2ggPj4gMykgJiAwNykgKyAnMCcpOworCQkJRU1JVCgoKGNoID4+IDApICYgMDcpICsgJzAnKTsKKwkJfQorCX0KKworCUVNSVRCVUYocCwgbGVuKTsKKwlpZiAocCA9PSBuYW1lKSAgIC8qIG5vIGVuZGluZyBxdW90ZSBuZWVkZWQgKi8KKwkJcmV0dXJuIDA7CisKKwlpZiAoIW5vX2RxKQorCQlFTUlUKCciJyk7CisJcmV0dXJuIGNvdW50OworfQorCitzaXplX3QgcXVvdGVfY19zdHlsZShjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3Qgc3RyYnVmICpzYiwgRklMRSAqZnAsIGludCBub2RxKQoreworCXJldHVybiBxdW90ZV9jX3N0eWxlX2NvdW50ZWQobmFtZSwgLTEsIHNiLCBmcCwgbm9kcSk7Cit9CisKK3ZvaWQgcXVvdGVfdHdvX2Nfc3R5bGUoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqcGF0aCwgaW50IG5vZHEpCit7CisJaWYgKHF1b3RlX2Nfc3R5bGUocHJlZml4LCBOVUxMLCBOVUxMLCAwKSB8fAorCSAgICBxdW90ZV9jX3N0eWxlKHBhdGgsIE5VTEwsIE5VTEwsIDApKSB7CisJCWlmICghbm9kcSkKKwkJCXN0cmJ1Zl9hZGRjaChzYiwgJyInKTsKKwkJcXVvdGVfY19zdHlsZShwcmVmaXgsIHNiLCBOVUxMLCAxKTsKKwkJcXVvdGVfY19zdHlsZShwYXRoLCBzYiwgTlVMTCwgMSk7CisJCWlmICghbm9kcSkKKwkJCXN0cmJ1Zl9hZGRjaChzYiwgJyInKTsKKwl9IGVsc2UgeworCQlzdHJidWZfYWRkc3RyKHNiLCBwcmVmaXgpOworCQlzdHJidWZfYWRkc3RyKHNiLCBwYXRoKTsKKwl9Cit9CisKK3ZvaWQgd3JpdGVfbmFtZV9xdW90ZWQoY29uc3QgY2hhciAqbmFtZSwgRklMRSAqZnAsIGludCB0ZXJtaW5hdG9yKQoreworCWlmICh0ZXJtaW5hdG9yKSB7CisJCXF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgZnAsIDApOworCX0gZWxzZSB7CisJCWZwdXRzKG5hbWUsIGZwKTsKKwl9CisJZnB1dGModGVybWluYXRvciwgZnApOworfQorCitleHRlcm4gdm9pZCB3cml0ZV9uYW1lX3F1b3RlZHBmeChjb25zdCBjaGFyICpwZngsIHNpemVfdCBwZnhsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBGSUxFICpmcCwgaW50IHRlcm1pbmF0b3IpCit7CisJaW50IG5lZWRxdW90ZSA9IDA7CisKKwlpZiAodGVybWluYXRvcikgeworCQluZWVkcXVvdGUgPSBuZXh0X3F1b3RlX3BvcyhwZngsIHBmeGxlbikgPCBwZnhsZW4KKwkJCXx8IG5hbWVbbmV4dF9xdW90ZV9wb3MobmFtZSwgLTEpXTsKKwl9CisJaWYgKG5lZWRxdW90ZSkgeworCQlmcHV0YygnIicsIGZwKTsKKwkJcXVvdGVfY19zdHlsZV9jb3VudGVkKHBmeCwgcGZ4bGVuLCBOVUxMLCBmcCwgMSk7CisJCXF1b3RlX2Nfc3R5bGUobmFtZSwgTlVMTCwgZnAsIDEpOworCQlmcHV0YygnIicsIGZwKTsKKwl9IGVsc2UgeworCQlpbnQgcmV0OworCisJCXJldCA9IGZ3cml0ZShwZngsIHBmeGxlbiwgMSwgZnApOworCQlmcHV0cyhuYW1lLCBmcCk7CisJfQorCWZwdXRjKHRlcm1pbmF0b3IsIGZwKTsKK30KKworLyogcXVvdGUgcGF0aCBhcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gcHJlZml4ICovCitjaGFyICpxdW90ZV9wYXRoX3JlbGF0aXZlKGNvbnN0IGNoYXIgKmluLCBpbnQgbGVuLAorCQkJICBzdHJ1Y3Qgc3RyYnVmICpvdXQsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpbnQgbmVlZHF1b3RlOworCisJaWYgKGxlbiA8IDApCisJCWxlbiA9IHN0cmxlbihpbik7CisKKwkvKiAiLi4vIiBwcmVmaXggaXRzZWxmIGRvZXMgbm90IG5lZWQgcXVvdGluZywgYnV0ICJpbiIgbWlnaHQuICovCisJbmVlZHF1b3RlID0gbmV4dF9xdW90ZV9wb3MoaW4sIGxlbikgPCBsZW47CisJc3RyYnVmX3NldGxlbihvdXQsIDApOworCXN0cmJ1Zl9ncm93KG91dCwgbGVuKTsKKworCWlmIChuZWVkcXVvdGUpCisJCXN0cmJ1Zl9hZGRjaChvdXQsICciJyk7CisJaWYgKHByZWZpeCkgeworCQlpbnQgb2ZmID0gMDsKKwkJd2hpbGUgKHByZWZpeFtvZmZdICYmIG9mZiA8IGxlbiAmJiBwcmVmaXhbb2ZmXSA9PSBpbltvZmZdKQorCQkJaWYgKHByZWZpeFtvZmZdID09ICcvJykgeworCQkJCXByZWZpeCArPSBvZmYgKyAxOworCQkJCWluICs9IG9mZiArIDE7CisJCQkJbGVuIC09IG9mZiArIDE7CisJCQkJb2ZmID0gMDsKKwkJCX0gZWxzZQorCQkJCW9mZisrOworCisJCWZvciAoOyAqcHJlZml4OyBwcmVmaXgrKykKKwkJCWlmICgqcHJlZml4ID09ICcvJykKKwkJCQlzdHJidWZfYWRkc3RyKG91dCwgIi4uLyIpOworCX0KKworCXF1b3RlX2Nfc3R5bGVfY291bnRlZCAoaW4sIGxlbiwgb3V0LCBOVUxMLCAxKTsKKworCWlmIChuZWVkcXVvdGUpCisJCXN0cmJ1Zl9hZGRjaChvdXQsICciJyk7CisJaWYgKCFvdXQtPmxlbikKKwkJc3RyYnVmX2FkZHN0cihvdXQsICIuLyIpOworCisJcmV0dXJuIG91dC0+YnVmOworfQorCisvKgorICogQy1zdHlsZSBuYW1lIHVucXVvdGluZy4KKyAqCisgKiBRdW90ZWQgc2hvdWxkIHBvaW50IGF0IHRoZSBvcGVuaW5nIGRvdWJsZSBxdW90ZS4KKyAqICsgUmV0dXJucyAwIGlmIGl0IHdhcyBhYmxlIHRvIHVucXVvdGUgdGhlIHN0cmluZyBwcm9wZXJseSwgYW5kIGFwcGVuZHMgdGhlCisgKiAgIHJlc3VsdCBpbiB0aGUgc3RyYnVmIGBzYicuCisgKiArIFJldHVybnMgLTEgaW4gY2FzZSBvZiBlcnJvciwgYW5kIGRvZXNuJ3QgdG91Y2ggdGhlIHN0cmJ1Zi4gVGhvdWdoIG5vdGUKKyAqICAgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgYWxsb2NhdGUgbWVtb3J5IGluIHRoZSBzdHJidWYsIHNvIGNhbGxpbmcKKyAqICAgc3RyYnVmX3JlbGVhc2UgaXMgbWFuZGF0b3J5IHdoaWNoZXZlciByZXN1bHQgdW5xdW90ZV9jX3N0eWxlIHJldHVybnMuCisgKgorICogVXBkYXRlcyBlbmRwIHBvaW50ZXIgdG8gcG9pbnQgYXQgb25lIHBhc3QgdGhlIGVuZGluZyBkb3VibGUgcXVvdGUgaWYgZ2l2ZW4uCisgKi8KK2ludCB1bnF1b3RlX2Nfc3R5bGUoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnF1b3RlZCwgY29uc3QgY2hhciAqKmVuZHApCit7CisJc2l6ZV90IG9sZGxlbiA9IHNiLT5sZW4sIGxlbjsKKwlpbnQgY2gsIGFjOworCisJaWYgKCpxdW90ZWQrKyAhPSAnIicpCisJCXJldHVybiAtMTsKKworCWZvciAoOzspIHsKKwkJbGVuID0gc3RyY3NwbihxdW90ZWQsICJcIlxcIik7CisJCXN0cmJ1Zl9hZGQoc2IsIHF1b3RlZCwgbGVuKTsKKwkJcXVvdGVkICs9IGxlbjsKKworCQlzd2l0Y2ggKCpxdW90ZWQrKykgeworCQkgIGNhc2UgJyInOgorCQkJaWYgKGVuZHApCisJCQkJKmVuZHAgPSBxdW90ZWQ7CisJCQlyZXR1cm4gMDsKKwkJICBjYXNlICdcXCc6CisJCQlicmVhazsKKwkJICBkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJfQorCisJCXN3aXRjaCAoKGNoID0gKnF1b3RlZCsrKSkgeworCQljYXNlICdhJzogY2ggPSAnXGEnOyBicmVhazsKKwkJY2FzZSAnYic6IGNoID0gJ1xiJzsgYnJlYWs7CisJCWNhc2UgJ2YnOiBjaCA9ICdcZic7IGJyZWFrOworCQljYXNlICduJzogY2ggPSAnXG4nOyBicmVhazsKKwkJY2FzZSAncic6IGNoID0gJ1xyJzsgYnJlYWs7CisJCWNhc2UgJ3QnOiBjaCA9ICdcdCc7IGJyZWFrOworCQljYXNlICd2JzogY2ggPSAnXHYnOyBicmVhazsKKworCQljYXNlICdcXCc6IGNhc2UgJyInOgorCQkJYnJlYWs7IC8qIHZlcmJhdGltICovCisKKwkJLyogb2N0YWwgdmFsdWVzIHdpdGggZmlyc3QgZGlnaXQgb3ZlciA0IG92ZXJmbG93ICovCisJCWNhc2UgJzAnOiBjYXNlICcxJzogY2FzZSAnMic6IGNhc2UgJzMnOgorCQkJCQlhYyA9ICgoY2ggLSAnMCcpIDw8IDYpOworCQkJaWYgKChjaCA9ICpxdW90ZWQrKykgPCAnMCcgfHwgJzcnIDwgY2gpCisJCQkJZ290byBlcnJvcjsKKwkJCQkJYWMgfD0gKChjaCAtICcwJykgPDwgMyk7CisJCQlpZiAoKGNoID0gKnF1b3RlZCsrKSA8ICcwJyB8fCAnNycgPCBjaCkKKwkJCQlnb3RvIGVycm9yOworCQkJCQlhYyB8PSAoY2ggLSAnMCcpOworCQkJCQljaCA9IGFjOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJZ290byBlcnJvcjsKKwkJCX0KKwkJc3RyYnVmX2FkZGNoKHNiLCBjaCk7CisJCX0KKworICBlcnJvcjoKKwlzdHJidWZfc2V0bGVuKHNiLCBvbGRsZW4pOworCXJldHVybiAtMTsKK30KKworLyogcXVvdGluZyBhcyBhIHN0cmluZyBsaXRlcmFsIGZvciBvdGhlciBsYW5ndWFnZXMgKi8KKwordm9pZCBwZXJsX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKQoreworCWNvbnN0IGNoYXIgc3EgPSAnXCcnOworCWNvbnN0IGNoYXIgYnEgPSAnXFwnOworCWNoYXIgYzsKKworCWZwdXRjKHNxLCBzdHJlYW0pOworCXdoaWxlICgoYyA9ICpzcmMrKykpIHsKKwkJaWYgKGMgPT0gc3EgfHwgYyA9PSBicSkKKwkJCWZwdXRjKGJxLCBzdHJlYW0pOworCQlmcHV0YyhjLCBzdHJlYW0pOworCX0KKwlmcHV0YyhzcSwgc3RyZWFtKTsKK30KKwordm9pZCBweXRob25fcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpCit7CisJY29uc3QgY2hhciBzcSA9ICdcJyc7CisJY29uc3QgY2hhciBicSA9ICdcXCc7CisJY29uc3QgY2hhciBubCA9ICdcbic7CisJY2hhciBjOworCisJZnB1dGMoc3EsIHN0cmVhbSk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlpZiAoYyA9PSBubCkgeworCQkJZnB1dGMoYnEsIHN0cmVhbSk7CisJCQlmcHV0YygnbicsIHN0cmVhbSk7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoYyA9PSBzcSB8fCBjID09IGJxKQorCQkJZnB1dGMoYnEsIHN0cmVhbSk7CisJCWZwdXRjKGMsIHN0cmVhbSk7CisJfQorCWZwdXRjKHNxLCBzdHJlYW0pOworfQorCit2b2lkIHRjbF9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYykKK3sKKwljaGFyIGM7CisKKwlmcHV0YygnIicsIHN0cmVhbSk7CisJd2hpbGUgKChjID0gKnNyYysrKSkgeworCQlzd2l0Y2ggKGMpIHsKKwkJY2FzZSAnWyc6IGNhc2UgJ10nOgorCQljYXNlICd7JzogY2FzZSAnfSc6CisJCWNhc2UgJyQnOiBjYXNlICdcXCc6IGNhc2UgJyInOgorCQkJZnB1dGMoJ1xcJywgc3RyZWFtKTsKKwkJZGVmYXVsdDoKKwkJCWZwdXRjKGMsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXGYnOgorCQkJZnB1dHMoIlxcZiIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXHInOgorCQkJZnB1dHMoIlxcciIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXG4nOgorCQkJZnB1dHMoIlxcbiIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXHQnOgorCQkJZnB1dHMoIlxcdCIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJY2FzZSAnXHYnOgorCQkJZnB1dHMoIlxcdiIsIHN0cmVhbSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlmcHV0YygnIicsIHN0cmVhbSk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcXVvdGUuaCBiL3Rvb2xzL3BlcmYvdXRpbC9xdW90ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkZmFkODkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcXVvdGUuaApAQCAtMCwwICsxLDY4IEBACisjaWZuZGVmIFFVT1RFX0gKKyNkZWZpbmUgUVVPVEVfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworLyogSGVscCB0byBjb3B5IHRoZSB0aGluZyBwcm9wZXJseSBxdW90ZWQgZm9yIHRoZSBzaGVsbCBzYWZldHkuCisgKiBhbnkgc2luZ2xlIHF1b3RlIGlzIHJlcGxhY2VkIHdpdGggJ1wnJywgYW55IGV4Y2xhbWF0aW9uIHBvaW50CisgKiBpcyByZXBsYWNlZCB3aXRoICdcIScsIGFuZCB0aGUgd2hvbGUgdGhpbmcgaXMgZW5jbG9zZWQgaW4gYQorICogc2luZ2xlIHF1b3RlIHBhaXIuCisgKgorICogRm9yIGV4YW1wbGUsIGlmIHlvdSBhcmUgcGFzc2luZyB0aGUgcmVzdWx0IHRvIHN5c3RlbSgpIGFzIGFuCisgKiBhcmd1bWVudDoKKyAqCisgKiBzcHJpbnRmKGNtZCwgImZvb2JhciAlcyAlcyIsIHNxX3F1b3RlKGFyZzApLCBzcV9xdW90ZShhcmcxKSkKKyAqCisgKiB3b3VsZCBiZSBhcHByb3ByaWF0ZS4gIElmIHRoZSBzeXN0ZW0oKSBpcyBnb2luZyB0byBjYWxsIHNzaCB0bworICogcnVuIHRoZSBjb21tYW5kIG9uIHRoZSBvdGhlciBzaWRlOgorICoKKyAqIHNwcmludGYoY21kLCAiZ2l0LWRpZmYtdHJlZSAlcyAlcyIsIHNxX3F1b3RlKGFyZzApLCBzcV9xdW90ZShhcmcxKSk7CisgKiBzcHJpbnRmKHJjbWQsICJzc2ggJXMgJXMiLCBzcV91dGlsL3F1b3RlLmhvc3QpLCBzcV9xdW90ZShjbWQpKTsKKyAqCisgKiBOb3RlIHRoYXQgdGhlIGFib3ZlIGV4YW1wbGVzIGxlYWsgbWVtb3J5ISAgUmVtZW1iZXIgdG8gZnJlZSByZXN1bHQgZnJvbQorICogc3FfcXVvdGUoKSBpbiBhIHJlYWwgYXBwbGljYXRpb24uCisgKgorICogc3FfcXVvdGVfYnVmKCkgd3JpdGVzIHRvIGFuIGV4aXN0aW5nIGJ1ZmZlciBvZiBzcGVjaWZpZWQgc2l6ZTsgaXQKKyAqIHdpbGwgcmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0aGF0IHdvdWxkIGhhdmUgYmVlbiB3cml0dGVuCisgKiBleGNsdWRpbmcgdGhlIGZpbmFsIG51bGwgcmVnYXJkbGVzcyBvZiB0aGUgYnVmZmVyIHNpemUuCisgKi8KKworZXh0ZXJuIHZvaWQgc3FfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpOworCitleHRlcm4gdm9pZCBzcV9xdW90ZV9idWYoc3RydWN0IHN0cmJ1ZiAqLCBjb25zdCBjaGFyICpzcmMpOworZXh0ZXJuIHZvaWQgc3FfcXVvdGVfYXJndihzdHJ1Y3Qgc3RyYnVmICosIGNvbnN0IGNoYXIgKiphcmd2LCBzaXplX3QgbWF4bGVuKTsKKworLyogVGhpcyB1bndyYXBzIHdoYXQgc3FfcXVvdGUoKSBwcm9kdWNlcyBpbiBwbGFjZSwgYnV0IHJldHVybnMKKyAqIE5VTEwgaWYgdGhlIGlucHV0IGRvZXMgbm90IGxvb2sgbGlrZSB3aGF0IHNxX3F1b3RlIHdvdWxkIGhhdmUKKyAqIHByb2R1Y2VkLgorICovCitleHRlcm4gY2hhciAqc3FfZGVxdW90ZShjaGFyICopOworCisvKgorICogU2FtZSBhcyB0aGUgYWJvdmUsIGJ1dCBjYW4gYmUgdXNlZCB0byB1bndyYXAgbWFueSBhcmd1bWVudHMgaW4gdGhlCisgKiBzYW1lIHN0cmluZyBzZXBhcmF0ZWQgYnkgc3BhY2UuICJuZXh0IiBpcyBjaGFuZ2VkIHRvIHBvaW50IHRvIHRoZQorICogbmV4dCBhcmd1bWVudCB0aGF0IHNob3VsZCBiZSBwYXNzZWQgYXMgZmlyc3QgcGFyYW1ldGVyLiBXaGVuIHRoZXJlCisgKiBpcyBubyBtb3JlIGFyZ3VtZW50IHRvIGJlIGRlcXVvdGVkLCAibmV4dCIgaXMgdXBkYXRlZCB0byBwb2ludCB0byBOVUxMLgorICovCitleHRlcm4gY2hhciAqc3FfZGVxdW90ZV9zdGVwKGNoYXIgKmFyZywgY2hhciAqKm5leHQpOworZXh0ZXJuIGludCBzcV9kZXF1b3RlX3RvX2FyZ3YoY2hhciAqYXJnLCBjb25zdCBjaGFyICoqKmFyZ3YsIGludCAqbnIsIGludCAqYWxsb2MpOworCitleHRlcm4gaW50IHVucXVvdGVfY19zdHlsZShzdHJ1Y3Qgc3RyYnVmICosIGNvbnN0IGNoYXIgKnF1b3RlZCwgY29uc3QgY2hhciAqKmVuZHApOworZXh0ZXJuIHNpemVfdCBxdW90ZV9jX3N0eWxlKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBzdHJidWYgKiwgRklMRSAqLCBpbnQgbm9fZHEpOworZXh0ZXJuIHZvaWQgcXVvdGVfdHdvX2Nfc3R5bGUoc3RydWN0IHN0cmJ1ZiAqLCBjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKiwgaW50KTsKKworZXh0ZXJuIHZvaWQgd3JpdGVfbmFtZV9xdW90ZWQoY29uc3QgY2hhciAqbmFtZSwgRklMRSAqLCBpbnQgdGVybWluYXRvcik7CitleHRlcm4gdm9pZCB3cml0ZV9uYW1lX3F1b3RlZHBmeChjb25zdCBjaGFyICpwZngsIHNpemVfdCBwZnhsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBGSUxFICosIGludCB0ZXJtaW5hdG9yKTsKKworLyogcXVvdGUgcGF0aCBhcyByZWxhdGl2ZSB0byB0aGUgZ2l2ZW4gcHJlZml4ICovCitjaGFyICpxdW90ZV9wYXRoX3JlbGF0aXZlKGNvbnN0IGNoYXIgKmluLCBpbnQgbGVuLAorCQkJICBzdHJ1Y3Qgc3RyYnVmICpvdXQsIGNvbnN0IGNoYXIgKnByZWZpeCk7CisKKy8qIHF1b3RpbmcgYXMgYSBzdHJpbmcgbGl0ZXJhbCBmb3Igb3RoZXIgbGFuZ3VhZ2VzICovCitleHRlcm4gdm9pZCBwZXJsX3F1b3RlX3ByaW50KEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqc3JjKTsKK2V4dGVybiB2b2lkIHB5dGhvbl9xdW90ZV9wcmludChGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKnNyYyk7CitleHRlcm4gdm9pZCB0Y2xfcXVvdGVfcHJpbnQoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpzcmMpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9yYnRyZWUuYyBiL3Rvb2xzL3BlcmYvdXRpbC9yYnRyZWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTViYTljCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3JidHJlZS5jCkBAIC0wLDAgKzEsMzgzIEBACisvKgorICBSZWQgQmxhY2sgVHJlZXMKKyAgKEMpIDE5OTkgIEFuZHJlYSBBcmNhbmdlbGkgPGFuZHJlYUBzdXNlLmRlPgorICAoQykgMjAwMiAgRGF2aWQgV29vZGhvdXNlIDxkd213MkBpbmZyYWRlYWQub3JnPgorICAKKyAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKKworICBsaW51eC9saWIvcmJ0cmVlLmMKKyovCisKKyNpbmNsdWRlICJyYnRyZWUuaCIKKworc3RhdGljIHZvaWQgX19yYl9yb3RhdGVfbGVmdChzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKnJpZ2h0ID0gbm9kZS0+cmJfcmlnaHQ7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IHJiX3BhcmVudChub2RlKTsKKworCWlmICgobm9kZS0+cmJfcmlnaHQgPSByaWdodC0+cmJfbGVmdCkpCisJCXJiX3NldF9wYXJlbnQocmlnaHQtPnJiX2xlZnQsIG5vZGUpOworCXJpZ2h0LT5yYl9sZWZ0ID0gbm9kZTsKKworCXJiX3NldF9wYXJlbnQocmlnaHQsIHBhcmVudCk7CisKKwlpZiAocGFyZW50KQorCXsKKwkJaWYgKG5vZGUgPT0gcGFyZW50LT5yYl9sZWZ0KQorCQkJcGFyZW50LT5yYl9sZWZ0ID0gcmlnaHQ7CisJCWVsc2UKKwkJCXBhcmVudC0+cmJfcmlnaHQgPSByaWdodDsKKwl9CisJZWxzZQorCQlyb290LT5yYl9ub2RlID0gcmlnaHQ7CisJcmJfc2V0X3BhcmVudChub2RlLCByaWdodCk7Cit9CisKK3N0YXRpYyB2b2lkIF9fcmJfcm90YXRlX3JpZ2h0KHN0cnVjdCByYl9ub2RlICpub2RlLCBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbGVmdCA9IG5vZGUtPnJiX2xlZnQ7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IHJiX3BhcmVudChub2RlKTsKKworCWlmICgobm9kZS0+cmJfbGVmdCA9IGxlZnQtPnJiX3JpZ2h0KSkKKwkJcmJfc2V0X3BhcmVudChsZWZ0LT5yYl9yaWdodCwgbm9kZSk7CisJbGVmdC0+cmJfcmlnaHQgPSBub2RlOworCisJcmJfc2V0X3BhcmVudChsZWZ0LCBwYXJlbnQpOworCisJaWYgKHBhcmVudCkKKwl7CisJCWlmIChub2RlID09IHBhcmVudC0+cmJfcmlnaHQpCisJCQlwYXJlbnQtPnJiX3JpZ2h0ID0gbGVmdDsKKwkJZWxzZQorCQkJcGFyZW50LT5yYl9sZWZ0ID0gbGVmdDsKKwl9CisJZWxzZQorCQlyb290LT5yYl9ub2RlID0gbGVmdDsKKwlyYl9zZXRfcGFyZW50KG5vZGUsIGxlZnQpOworfQorCit2b2lkIHJiX2luc2VydF9jb2xvcihzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCwgKmdwYXJlbnQ7CisKKwl3aGlsZSAoKHBhcmVudCA9IHJiX3BhcmVudChub2RlKSkgJiYgcmJfaXNfcmVkKHBhcmVudCkpCisJeworCQlncGFyZW50ID0gcmJfcGFyZW50KHBhcmVudCk7CisKKwkJaWYgKHBhcmVudCA9PSBncGFyZW50LT5yYl9sZWZ0KQorCQl7CisJCQl7CisJCQkJcmVnaXN0ZXIgc3RydWN0IHJiX25vZGUgKnVuY2xlID0gZ3BhcmVudC0+cmJfcmlnaHQ7CisJCQkJaWYgKHVuY2xlICYmIHJiX2lzX3JlZCh1bmNsZSkpCisJCQkJeworCQkJCQlyYl9zZXRfYmxhY2sodW5jbGUpOworCQkJCQlyYl9zZXRfYmxhY2socGFyZW50KTsKKwkJCQkJcmJfc2V0X3JlZChncGFyZW50KTsKKwkJCQkJbm9kZSA9IGdwYXJlbnQ7CisJCQkJCWNvbnRpbnVlOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcmVudC0+cmJfcmlnaHQgPT0gbm9kZSkKKwkJCXsKKwkJCQlyZWdpc3RlciBzdHJ1Y3QgcmJfbm9kZSAqdG1wOworCQkJCV9fcmJfcm90YXRlX2xlZnQocGFyZW50LCByb290KTsKKwkJCQl0bXAgPSBwYXJlbnQ7CisJCQkJcGFyZW50ID0gbm9kZTsKKwkJCQlub2RlID0gdG1wOworCQkJfQorCisJCQlyYl9zZXRfYmxhY2socGFyZW50KTsKKwkJCXJiX3NldF9yZWQoZ3BhcmVudCk7CisJCQlfX3JiX3JvdGF0ZV9yaWdodChncGFyZW50LCByb290KTsKKwkJfSBlbHNlIHsKKwkJCXsKKwkJCQlyZWdpc3RlciBzdHJ1Y3QgcmJfbm9kZSAqdW5jbGUgPSBncGFyZW50LT5yYl9sZWZ0OworCQkJCWlmICh1bmNsZSAmJiByYl9pc19yZWQodW5jbGUpKQorCQkJCXsKKwkJCQkJcmJfc2V0X2JsYWNrKHVuY2xlKTsKKwkJCQkJcmJfc2V0X2JsYWNrKHBhcmVudCk7CisJCQkJCXJiX3NldF9yZWQoZ3BhcmVudCk7CisJCQkJCW5vZGUgPSBncGFyZW50OworCQkJCQljb250aW51ZTsKKwkJCQl9CisJCQl9CisKKwkJCWlmIChwYXJlbnQtPnJiX2xlZnQgPT0gbm9kZSkKKwkJCXsKKwkJCQlyZWdpc3RlciBzdHJ1Y3QgcmJfbm9kZSAqdG1wOworCQkJCV9fcmJfcm90YXRlX3JpZ2h0KHBhcmVudCwgcm9vdCk7CisJCQkJdG1wID0gcGFyZW50OworCQkJCXBhcmVudCA9IG5vZGU7CisJCQkJbm9kZSA9IHRtcDsKKwkJCX0KKworCQkJcmJfc2V0X2JsYWNrKHBhcmVudCk7CisJCQlyYl9zZXRfcmVkKGdwYXJlbnQpOworCQkJX19yYl9yb3RhdGVfbGVmdChncGFyZW50LCByb290KTsKKwkJfQorCX0KKworCXJiX3NldF9ibGFjayhyb290LT5yYl9ub2RlKTsKK30KKworc3RhdGljIHZvaWQgX19yYl9lcmFzZV9jb2xvcihzdHJ1Y3QgcmJfbm9kZSAqbm9kZSwgc3RydWN0IHJiX25vZGUgKnBhcmVudCwKKwkJCSAgICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QpCit7CisJc3RydWN0IHJiX25vZGUgKm90aGVyOworCisJd2hpbGUgKCghbm9kZSB8fCByYl9pc19ibGFjayhub2RlKSkgJiYgbm9kZSAhPSByb290LT5yYl9ub2RlKQorCXsKKwkJaWYgKHBhcmVudC0+cmJfbGVmdCA9PSBub2RlKQorCQl7CisJCQlvdGhlciA9IHBhcmVudC0+cmJfcmlnaHQ7CisJCQlpZiAocmJfaXNfcmVkKG90aGVyKSkKKwkJCXsKKwkJCQlyYl9zZXRfYmxhY2sob3RoZXIpOworCQkJCXJiX3NldF9yZWQocGFyZW50KTsKKwkJCQlfX3JiX3JvdGF0ZV9sZWZ0KHBhcmVudCwgcm9vdCk7CisJCQkJb3RoZXIgPSBwYXJlbnQtPnJiX3JpZ2h0OworCQkJfQorCQkJaWYgKCghb3RoZXItPnJiX2xlZnQgfHwgcmJfaXNfYmxhY2sob3RoZXItPnJiX2xlZnQpKSAmJgorCQkJICAgICghb3RoZXItPnJiX3JpZ2h0IHx8IHJiX2lzX2JsYWNrKG90aGVyLT5yYl9yaWdodCkpKQorCQkJeworCQkJCXJiX3NldF9yZWQob3RoZXIpOworCQkJCW5vZGUgPSBwYXJlbnQ7CisJCQkJcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICghb3RoZXItPnJiX3JpZ2h0IHx8IHJiX2lzX2JsYWNrKG90aGVyLT5yYl9yaWdodCkpCisJCQkJeworCQkJCQlyYl9zZXRfYmxhY2sob3RoZXItPnJiX2xlZnQpOworCQkJCQlyYl9zZXRfcmVkKG90aGVyKTsKKwkJCQkJX19yYl9yb3RhdGVfcmlnaHQob3RoZXIsIHJvb3QpOworCQkJCQlvdGhlciA9IHBhcmVudC0+cmJfcmlnaHQ7CisJCQkJfQorCQkJCXJiX3NldF9jb2xvcihvdGhlciwgcmJfY29sb3IocGFyZW50KSk7CisJCQkJcmJfc2V0X2JsYWNrKHBhcmVudCk7CisJCQkJcmJfc2V0X2JsYWNrKG90aGVyLT5yYl9yaWdodCk7CisJCQkJX19yYl9yb3RhdGVfbGVmdChwYXJlbnQsIHJvb3QpOworCQkJCW5vZGUgPSByb290LT5yYl9ub2RlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWVsc2UKKwkJeworCQkJb3RoZXIgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCQlpZiAocmJfaXNfcmVkKG90aGVyKSkKKwkJCXsKKwkJCQlyYl9zZXRfYmxhY2sob3RoZXIpOworCQkJCXJiX3NldF9yZWQocGFyZW50KTsKKwkJCQlfX3JiX3JvdGF0ZV9yaWdodChwYXJlbnQsIHJvb3QpOworCQkJCW90aGVyID0gcGFyZW50LT5yYl9sZWZ0OworCQkJfQorCQkJaWYgKCghb3RoZXItPnJiX2xlZnQgfHwgcmJfaXNfYmxhY2sob3RoZXItPnJiX2xlZnQpKSAmJgorCQkJICAgICghb3RoZXItPnJiX3JpZ2h0IHx8IHJiX2lzX2JsYWNrKG90aGVyLT5yYl9yaWdodCkpKQorCQkJeworCQkJCXJiX3NldF9yZWQob3RoZXIpOworCQkJCW5vZGUgPSBwYXJlbnQ7CisJCQkJcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCWlmICghb3RoZXItPnJiX2xlZnQgfHwgcmJfaXNfYmxhY2sob3RoZXItPnJiX2xlZnQpKQorCQkJCXsKKwkJCQkJcmJfc2V0X2JsYWNrKG90aGVyLT5yYl9yaWdodCk7CisJCQkJCXJiX3NldF9yZWQob3RoZXIpOworCQkJCQlfX3JiX3JvdGF0ZV9sZWZ0KG90aGVyLCByb290KTsKKwkJCQkJb3RoZXIgPSBwYXJlbnQtPnJiX2xlZnQ7CisJCQkJfQorCQkJCXJiX3NldF9jb2xvcihvdGhlciwgcmJfY29sb3IocGFyZW50KSk7CisJCQkJcmJfc2V0X2JsYWNrKHBhcmVudCk7CisJCQkJcmJfc2V0X2JsYWNrKG90aGVyLT5yYl9sZWZ0KTsKKwkJCQlfX3JiX3JvdGF0ZV9yaWdodChwYXJlbnQsIHJvb3QpOworCQkJCW5vZGUgPSByb290LT5yYl9ub2RlOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJfQorCWlmIChub2RlKQorCQlyYl9zZXRfYmxhY2sobm9kZSk7Cit9CisKK3ZvaWQgcmJfZXJhc2Uoc3RydWN0IHJiX25vZGUgKm5vZGUsIHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlICpjaGlsZCwgKnBhcmVudDsKKwlpbnQgY29sb3I7CisKKwlpZiAoIW5vZGUtPnJiX2xlZnQpCisJCWNoaWxkID0gbm9kZS0+cmJfcmlnaHQ7CisJZWxzZSBpZiAoIW5vZGUtPnJiX3JpZ2h0KQorCQljaGlsZCA9IG5vZGUtPnJiX2xlZnQ7CisJZWxzZQorCXsKKwkJc3RydWN0IHJiX25vZGUgKm9sZCA9IG5vZGUsICpsZWZ0OworCisJCW5vZGUgPSBub2RlLT5yYl9yaWdodDsKKwkJd2hpbGUgKChsZWZ0ID0gbm9kZS0+cmJfbGVmdCkgIT0gTlVMTCkKKwkJCW5vZGUgPSBsZWZ0OworCQljaGlsZCA9IG5vZGUtPnJiX3JpZ2h0OworCQlwYXJlbnQgPSByYl9wYXJlbnQobm9kZSk7CisJCWNvbG9yID0gcmJfY29sb3Iobm9kZSk7CisKKwkJaWYgKGNoaWxkKQorCQkJcmJfc2V0X3BhcmVudChjaGlsZCwgcGFyZW50KTsKKwkJaWYgKHBhcmVudCA9PSBvbGQpIHsKKwkJCXBhcmVudC0+cmJfcmlnaHQgPSBjaGlsZDsKKwkJCXBhcmVudCA9IG5vZGU7CisJCX0gZWxzZQorCQkJcGFyZW50LT5yYl9sZWZ0ID0gY2hpbGQ7CisKKwkJbm9kZS0+cmJfcGFyZW50X2NvbG9yID0gb2xkLT5yYl9wYXJlbnRfY29sb3I7CisJCW5vZGUtPnJiX3JpZ2h0ID0gb2xkLT5yYl9yaWdodDsKKwkJbm9kZS0+cmJfbGVmdCA9IG9sZC0+cmJfbGVmdDsKKworCQlpZiAocmJfcGFyZW50KG9sZCkpCisJCXsKKwkJCWlmIChyYl9wYXJlbnQob2xkKS0+cmJfbGVmdCA9PSBvbGQpCisJCQkJcmJfcGFyZW50KG9sZCktPnJiX2xlZnQgPSBub2RlOworCQkJZWxzZQorCQkJCXJiX3BhcmVudChvbGQpLT5yYl9yaWdodCA9IG5vZGU7CisJCX0gZWxzZQorCQkJcm9vdC0+cmJfbm9kZSA9IG5vZGU7CisKKwkJcmJfc2V0X3BhcmVudChvbGQtPnJiX2xlZnQsIG5vZGUpOworCQlpZiAob2xkLT5yYl9yaWdodCkKKwkJCXJiX3NldF9wYXJlbnQob2xkLT5yYl9yaWdodCwgbm9kZSk7CisJCWdvdG8gY29sb3I7CisJfQorCisJcGFyZW50ID0gcmJfcGFyZW50KG5vZGUpOworCWNvbG9yID0gcmJfY29sb3Iobm9kZSk7CisKKwlpZiAoY2hpbGQpCisJCXJiX3NldF9wYXJlbnQoY2hpbGQsIHBhcmVudCk7CisJaWYgKHBhcmVudCkKKwl7CisJCWlmIChwYXJlbnQtPnJiX2xlZnQgPT0gbm9kZSkKKwkJCXBhcmVudC0+cmJfbGVmdCA9IGNoaWxkOworCQllbHNlCisJCQlwYXJlbnQtPnJiX3JpZ2h0ID0gY2hpbGQ7CisJfQorCWVsc2UKKwkJcm9vdC0+cmJfbm9kZSA9IGNoaWxkOworCisgY29sb3I6CisJaWYgKGNvbG9yID09IFJCX0JMQUNLKQorCQlfX3JiX2VyYXNlX2NvbG9yKGNoaWxkLCBwYXJlbnQsIHJvb3QpOworfQorCisvKgorICogVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBmaXJzdCBub2RlIChpbiBzb3J0IG9yZGVyKSBvZiB0aGUgdHJlZS4KKyAqLworc3RydWN0IHJiX25vZGUgKnJiX2ZpcnN0KGNvbnN0IHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlCSpuOworCisJbiA9IHJvb3QtPnJiX25vZGU7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAobi0+cmJfbGVmdCkKKwkJbiA9IG4tPnJiX2xlZnQ7CisJcmV0dXJuIG47Cit9CisKK3N0cnVjdCByYl9ub2RlICpyYl9sYXN0KGNvbnN0IHN0cnVjdCByYl9yb290ICpyb290KQoreworCXN0cnVjdCByYl9ub2RlCSpuOworCisJbiA9IHJvb3QtPnJiX25vZGU7CisJaWYgKCFuKQorCQlyZXR1cm4gTlVMTDsKKwl3aGlsZSAobi0+cmJfcmlnaHQpCisJCW4gPSBuLT5yYl9yaWdodDsKKwlyZXR1cm4gbjsKK30KKworc3RydWN0IHJiX25vZGUgKnJiX25leHQoY29uc3Qgc3RydWN0IHJiX25vZGUgKm5vZGUpCit7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudDsKKworCWlmIChyYl9wYXJlbnQobm9kZSkgPT0gbm9kZSkKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBJZiB3ZSBoYXZlIGEgcmlnaHQtaGFuZCBjaGlsZCwgZ28gZG93biBhbmQgdGhlbiBsZWZ0IGFzIGZhcgorCSAgIGFzIHdlIGNhbi4gKi8KKwlpZiAobm9kZS0+cmJfcmlnaHQpIHsKKwkJbm9kZSA9IG5vZGUtPnJiX3JpZ2h0OyAKKwkJd2hpbGUgKG5vZGUtPnJiX2xlZnQpCisJCQlub2RlPW5vZGUtPnJiX2xlZnQ7CisJCXJldHVybiAoc3RydWN0IHJiX25vZGUgKilub2RlOworCX0KKworCS8qIE5vIHJpZ2h0LWhhbmQgY2hpbGRyZW4uICBFdmVyeXRoaW5nIGRvd24gYW5kIGxlZnQgaXMKKwkgICBzbWFsbGVyIHRoYW4gdXMsIHNvIGFueSAnbmV4dCcgbm9kZSBtdXN0IGJlIGluIHRoZSBnZW5lcmFsCisJICAgZGlyZWN0aW9uIG9mIG91ciBwYXJlbnQuIEdvIHVwIHRoZSB0cmVlOyBhbnkgdGltZSB0aGUKKwkgICBhbmNlc3RvciBpcyBhIHJpZ2h0LWhhbmQgY2hpbGQgb2YgaXRzIHBhcmVudCwga2VlcCBnb2luZworCSAgIHVwLiBGaXJzdCB0aW1lIGl0J3MgYSBsZWZ0LWhhbmQgY2hpbGQgb2YgaXRzIHBhcmVudCwgc2FpZAorCSAgIHBhcmVudCBpcyBvdXIgJ25leHQnIG5vZGUuICovCisJd2hpbGUgKChwYXJlbnQgPSByYl9wYXJlbnQobm9kZSkpICYmIG5vZGUgPT0gcGFyZW50LT5yYl9yaWdodCkKKwkJbm9kZSA9IHBhcmVudDsKKworCXJldHVybiBwYXJlbnQ7Cit9CisKK3N0cnVjdCByYl9ub2RlICpyYl9wcmV2KGNvbnN0IHN0cnVjdCByYl9ub2RlICpub2RlKQoreworCXN0cnVjdCByYl9ub2RlICpwYXJlbnQ7CisKKwlpZiAocmJfcGFyZW50KG5vZGUpID09IG5vZGUpCisJCXJldHVybiBOVUxMOworCisJLyogSWYgd2UgaGF2ZSBhIGxlZnQtaGFuZCBjaGlsZCwgZ28gZG93biBhbmQgdGhlbiByaWdodCBhcyBmYXIKKwkgICBhcyB3ZSBjYW4uICovCisJaWYgKG5vZGUtPnJiX2xlZnQpIHsKKwkJbm9kZSA9IG5vZGUtPnJiX2xlZnQ7IAorCQl3aGlsZSAobm9kZS0+cmJfcmlnaHQpCisJCQlub2RlPW5vZGUtPnJiX3JpZ2h0OworCQlyZXR1cm4gKHN0cnVjdCByYl9ub2RlICopbm9kZTsKKwl9CisKKwkvKiBObyBsZWZ0LWhhbmQgY2hpbGRyZW4uIEdvIHVwIHRpbGwgd2UgZmluZCBhbiBhbmNlc3RvciB3aGljaAorCSAgIGlzIGEgcmlnaHQtaGFuZCBjaGlsZCBvZiBpdHMgcGFyZW50ICovCisJd2hpbGUgKChwYXJlbnQgPSByYl9wYXJlbnQobm9kZSkpICYmIG5vZGUgPT0gcGFyZW50LT5yYl9sZWZ0KQorCQlub2RlID0gcGFyZW50OworCisJcmV0dXJuIHBhcmVudDsKK30KKwordm9pZCByYl9yZXBsYWNlX25vZGUoc3RydWN0IHJiX25vZGUgKnZpY3RpbSwgc3RydWN0IHJiX25vZGUgKm5ldywKKwkJICAgICBzdHJ1Y3QgcmJfcm9vdCAqcm9vdCkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqcGFyZW50ID0gcmJfcGFyZW50KHZpY3RpbSk7CisKKwkvKiBTZXQgdGhlIHN1cnJvdW5kaW5nIG5vZGVzIHRvIHBvaW50IHRvIHRoZSByZXBsYWNlbWVudCAqLworCWlmIChwYXJlbnQpIHsKKwkJaWYgKHZpY3RpbSA9PSBwYXJlbnQtPnJiX2xlZnQpCisJCQlwYXJlbnQtPnJiX2xlZnQgPSBuZXc7CisJCWVsc2UKKwkJCXBhcmVudC0+cmJfcmlnaHQgPSBuZXc7CisJfSBlbHNlIHsKKwkJcm9vdC0+cmJfbm9kZSA9IG5ldzsKKwl9CisJaWYgKHZpY3RpbS0+cmJfbGVmdCkKKwkJcmJfc2V0X3BhcmVudCh2aWN0aW0tPnJiX2xlZnQsIG5ldyk7CisJaWYgKHZpY3RpbS0+cmJfcmlnaHQpCisJCXJiX3NldF9wYXJlbnQodmljdGltLT5yYl9yaWdodCwgbmV3KTsKKworCS8qIENvcHkgdGhlIHBvaW50ZXJzL2NvbG91ciBmcm9tIHRoZSB2aWN0aW0gdG8gdGhlIHJlcGxhY2VtZW50ICovCisJKm5ldyA9ICp2aWN0aW07Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcmJ0cmVlLmggYi90b29scy9wZXJmL3V0aWwvcmJ0cmVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJkYzQ4OAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9yYnRyZWUuaApAQCAtMCwwICsxLDE3MSBAQAorLyoKKyAgUmVkIEJsYWNrIFRyZWVzCisgIChDKSAxOTk5ICBBbmRyZWEgQXJjYW5nZWxpIDxhbmRyZWFAc3VzZS5kZT4KKyAgCisgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCisKKyAgbGludXgvaW5jbHVkZS9saW51eC9yYnRyZWUuaAorCisgIFRvIHVzZSByYnRyZWVzIHlvdSdsbCBoYXZlIHRvIGltcGxlbWVudCB5b3VyIG93biBpbnNlcnQgYW5kIHNlYXJjaCBjb3Jlcy4KKyAgVGhpcyB3aWxsIGF2b2lkIHVzIHRvIHVzZSBjYWxsYmFja3MgYW5kIHRvIGRyb3AgZHJhbW1hdGljYWxseSBwZXJmb3JtYW5jZXMuCisgIEkga25vdyBpdCdzIG5vdCB0aGUgY2xlYW5lciB3YXksICBidXQgaW4gQyAobm90IGluIEMrKykgdG8gZ2V0CisgIHBlcmZvcm1hbmNlcyBhbmQgZ2VuZXJpY2l0eS4uLgorCisgIFNvbWUgZXhhbXBsZSBvZiBpbnNlcnQgYW5kIHNlYXJjaCBmb2xsb3dzIGhlcmUuIFRoZSBzZWFyY2ggaXMgYSBwbGFpbgorICBub3JtYWwgc2VhcmNoIG92ZXIgYW4gb3JkZXJlZCB0cmVlLiBUaGUgaW5zZXJ0IGluc3RlYWQgbXVzdCBiZSBpbXBsZW1lbnRlZAorICBpbnQgdHdvIHN0ZXBzOiBhcyBmaXJzdCB0aGluZyB0aGUgY29kZSBtdXN0IGluc2VydCB0aGUgZWxlbWVudCBpbgorICBvcmRlciBhcyBhIHJlZCBsZWFmIGluIHRoZSB0cmVlLCB0aGVuIHRoZSBzdXBwb3J0IGxpYnJhcnkgZnVuY3Rpb24KKyAgcmJfaW5zZXJ0X2NvbG9yKCkgbXVzdCBiZSBjYWxsZWQuIFN1Y2ggZnVuY3Rpb24gd2lsbCBkbyB0aGUKKyAgbm90IHRyaXZpYWwgd29yayB0byByZWJhbGFuY2UgdGhlIHJidHJlZSBpZiBuZWNlc3NhcnkuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICogcmJfc2VhcmNoX3BhZ2VfY2FjaGUoc3RydWN0IGlub2RlICogaW5vZGUsCisJCQkJCQkgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJc3RydWN0IHJiX25vZGUgKiBuID0gaW5vZGUtPmlfcmJfcGFnZV9jYWNoZS5yYl9ub2RlOworCXN0cnVjdCBwYWdlICogcGFnZTsKKworCXdoaWxlIChuKQorCXsKKwkJcGFnZSA9IHJiX2VudHJ5KG4sIHN0cnVjdCBwYWdlLCByYl9wYWdlX2NhY2hlKTsKKworCQlpZiAob2Zmc2V0IDwgcGFnZS0+b2Zmc2V0KQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG9mZnNldCA+IHBhZ2UtPm9mZnNldCkKKwkJCW4gPSBuLT5yYl9yaWdodDsKKwkJZWxzZQorCQkJcmV0dXJuIHBhZ2U7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHN0cnVjdCBwYWdlICogX19yYl9pbnNlcnRfcGFnZV9jYWNoZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCQkJCSAgIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LAorCQkJCQkJICAgc3RydWN0IHJiX25vZGUgKiBub2RlKQoreworCXN0cnVjdCByYl9ub2RlICoqIHAgPSAmaW5vZGUtPmlfcmJfcGFnZV9jYWNoZS5yYl9ub2RlOworCXN0cnVjdCByYl9ub2RlICogcGFyZW50ID0gTlVMTDsKKwlzdHJ1Y3QgcGFnZSAqIHBhZ2U7CisKKwl3aGlsZSAoKnApCisJeworCQlwYXJlbnQgPSAqcDsKKwkJcGFnZSA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHBhZ2UsIHJiX3BhZ2VfY2FjaGUpOworCisJCWlmIChvZmZzZXQgPCBwYWdlLT5vZmZzZXQpCisJCQlwID0gJigqcCktPnJiX2xlZnQ7CisJCWVsc2UgaWYgKG9mZnNldCA+IHBhZ2UtPm9mZnNldCkKKwkJCXAgPSAmKCpwKS0+cmJfcmlnaHQ7CisJCWVsc2UKKwkJCXJldHVybiBwYWdlOworCX0KKworCXJiX2xpbmtfbm9kZShub2RlLCBwYXJlbnQsIHApOworCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RydWN0IHBhZ2UgKiByYl9pbnNlcnRfcGFnZV9jYWNoZShzdHJ1Y3QgaW5vZGUgKiBpbm9kZSwKKwkJCQkJCSB1bnNpZ25lZCBsb25nIG9mZnNldCwKKwkJCQkJCSBzdHJ1Y3QgcmJfbm9kZSAqIG5vZGUpCit7CisJc3RydWN0IHBhZ2UgKiByZXQ7CisJaWYgKChyZXQgPSBfX3JiX2luc2VydF9wYWdlX2NhY2hlKGlub2RlLCBvZmZzZXQsIG5vZGUpKSkKKwkJZ290byBvdXQ7CisJcmJfaW5zZXJ0X2NvbG9yKG5vZGUsICZpbm9kZS0+aV9yYl9wYWdlX2NhY2hlKTsKKyBvdXQ6CisJcmV0dXJuIHJldDsKK30KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZuZGVmCV9MSU5VWF9SQlRSRUVfSAorI2RlZmluZQlfTElOVVhfUkJUUkVFX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKioKKyAqIGNvbnRhaW5lcl9vZiAtIGNhc3QgYSBtZW1iZXIgb2YgYSBzdHJ1Y3R1cmUgb3V0IHRvIHRoZSBjb250YWluaW5nIHN0cnVjdHVyZQorICogQHB0cjoJdGhlIHBvaW50ZXIgdG8gdGhlIG1lbWJlci4KKyAqIEB0eXBlOgl0aGUgdHlwZSBvZiB0aGUgY29udGFpbmVyIHN0cnVjdCB0aGlzIGlzIGVtYmVkZGVkIGluLgorICogQG1lbWJlcjoJdGhlIG5hbWUgb2YgdGhlIG1lbWJlciB3aXRoaW4gdGhlIHN0cnVjdC4KKyAqCisgKi8KKyNkZWZpbmUgY29udGFpbmVyX29mKHB0ciwgdHlwZSwgbWVtYmVyKSAoewkJCVwKKwljb25zdCB0eXBlb2YoICgodHlwZSAqKTApLT5tZW1iZXIgKSAqX19tcHRyID0gKHB0cik7CVwKKwkodHlwZSAqKSggKGNoYXIgKilfX21wdHIgLSBvZmZzZXRvZih0eXBlLG1lbWJlcikgKTt9KQorCitzdHJ1Y3QgcmJfbm9kZQoreworCXVuc2lnbmVkIGxvbmcgIHJiX3BhcmVudF9jb2xvcjsKKyNkZWZpbmUJUkJfUkVECQkwCisjZGVmaW5lCVJCX0JMQUNLCTEKKwlzdHJ1Y3QgcmJfbm9kZSAqcmJfcmlnaHQ7CisJc3RydWN0IHJiX25vZGUgKnJiX2xlZnQ7Cit9IF9fYXR0cmlidXRlX18oKGFsaWduZWQoc2l6ZW9mKGxvbmcpKSkpOworICAgIC8qIFRoZSBhbGlnbm1lbnQgbWlnaHQgc2VlbSBwb2ludGxlc3MsIGJ1dCBhbGxlZ2VkbHkgQ1JJUyBuZWVkcyBpdCAqLworCitzdHJ1Y3QgcmJfcm9vdAoreworCXN0cnVjdCByYl9ub2RlICpyYl9ub2RlOworfTsKKworCisjZGVmaW5lIHJiX3BhcmVudChyKSAgICgoc3RydWN0IHJiX25vZGUgKikoKHIpLT5yYl9wYXJlbnRfY29sb3IgJiB+MykpCisjZGVmaW5lIHJiX2NvbG9yKHIpICAgKChyKS0+cmJfcGFyZW50X2NvbG9yICYgMSkKKyNkZWZpbmUgcmJfaXNfcmVkKHIpICAgKCFyYl9jb2xvcihyKSkKKyNkZWZpbmUgcmJfaXNfYmxhY2socikgcmJfY29sb3IocikKKyNkZWZpbmUgcmJfc2V0X3JlZChyKSAgZG8geyAociktPnJiX3BhcmVudF9jb2xvciAmPSB+MTsgfSB3aGlsZSAoMCkKKyNkZWZpbmUgcmJfc2V0X2JsYWNrKHIpICBkbyB7IChyKS0+cmJfcGFyZW50X2NvbG9yIHw9IDE7IH0gd2hpbGUgKDApCisKK3N0YXRpYyBpbmxpbmUgdm9pZCByYl9zZXRfcGFyZW50KHN0cnVjdCByYl9ub2RlICpyYiwgc3RydWN0IHJiX25vZGUgKnApCit7CisJcmItPnJiX3BhcmVudF9jb2xvciA9IChyYi0+cmJfcGFyZW50X2NvbG9yICYgMykgfCAodW5zaWduZWQgbG9uZylwOworfQorc3RhdGljIGlubGluZSB2b2lkIHJiX3NldF9jb2xvcihzdHJ1Y3QgcmJfbm9kZSAqcmIsIGludCBjb2xvcikKK3sKKwlyYi0+cmJfcGFyZW50X2NvbG9yID0gKHJiLT5yYl9wYXJlbnRfY29sb3IgJiB+MSkgfCBjb2xvcjsKK30KKworI2RlZmluZSBSQl9ST09UCShzdHJ1Y3QgcmJfcm9vdCkgeyBOVUxMLCB9CisjZGVmaW5lCXJiX2VudHJ5KHB0ciwgdHlwZSwgbWVtYmVyKSBjb250YWluZXJfb2YocHRyLCB0eXBlLCBtZW1iZXIpCisKKyNkZWZpbmUgUkJfRU1QVFlfUk9PVChyb290KQkoKHJvb3QpLT5yYl9ub2RlID09IE5VTEwpCisjZGVmaW5lIFJCX0VNUFRZX05PREUobm9kZSkJKHJiX3BhcmVudChub2RlKSA9PSBub2RlKQorI2RlZmluZSBSQl9DTEVBUl9OT0RFKG5vZGUpCShyYl9zZXRfcGFyZW50KG5vZGUsIG5vZGUpKQorCitleHRlcm4gdm9pZCByYl9pbnNlcnRfY29sb3Ioc3RydWN0IHJiX25vZGUgKiwgc3RydWN0IHJiX3Jvb3QgKik7CitleHRlcm4gdm9pZCByYl9lcmFzZShzdHJ1Y3QgcmJfbm9kZSAqLCBzdHJ1Y3QgcmJfcm9vdCAqKTsKKworLyogRmluZCBsb2dpY2FsIG5leHQgYW5kIHByZXZpb3VzIG5vZGVzIGluIGEgdHJlZSAqLworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9uZXh0KGNvbnN0IHN0cnVjdCByYl9ub2RlICopOworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9wcmV2KGNvbnN0IHN0cnVjdCByYl9ub2RlICopOworZXh0ZXJuIHN0cnVjdCByYl9ub2RlICpyYl9maXJzdChjb25zdCBzdHJ1Y3QgcmJfcm9vdCAqKTsKK2V4dGVybiBzdHJ1Y3QgcmJfbm9kZSAqcmJfbGFzdChjb25zdCBzdHJ1Y3QgcmJfcm9vdCAqKTsKKworLyogRmFzdCByZXBsYWNlbWVudCBvZiBhIHNpbmdsZSBub2RlIHdpdGhvdXQgcmVtb3ZlL3JlYmFsYW5jZS9hZGQvcmViYWxhbmNlICovCitleHRlcm4gdm9pZCByYl9yZXBsYWNlX25vZGUoc3RydWN0IHJiX25vZGUgKnZpY3RpbSwgc3RydWN0IHJiX25vZGUgKm5ldywgCisJCQkgICAgc3RydWN0IHJiX3Jvb3QgKnJvb3QpOworCitzdGF0aWMgaW5saW5lIHZvaWQgcmJfbGlua19ub2RlKHN0cnVjdCByYl9ub2RlICogbm9kZSwgc3RydWN0IHJiX25vZGUgKiBwYXJlbnQsCisJCQkJc3RydWN0IHJiX25vZGUgKiogcmJfbGluaykKK3sKKwlub2RlLT5yYl9wYXJlbnRfY29sb3IgPSAodW5zaWduZWQgbG9uZyApcGFyZW50OworCW5vZGUtPnJiX2xlZnQgPSBub2RlLT5yYl9yaWdodCA9IE5VTEw7CisKKwkqcmJfbGluayA9IG5vZGU7Cit9CisKKyNlbmRpZgkvKiBfTElOVVhfUkJUUkVFX0ggKi8KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9ydW4tY29tbWFuZC5jIGIvdG9vbHMvcGVyZi91dGlsL3J1bi1jb21tYW5kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJmNWU4NQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9ydW4tY29tbWFuZC5jCkBAIC0wLDAgKzEsMzk1IEBACisjaW5jbHVkZSAiY2FjaGUuaCIKKyNpbmNsdWRlICJydW4tY29tbWFuZC5oIgorI2luY2x1ZGUgImV4ZWNfY21kLmgiCisKK3N0YXRpYyBpbmxpbmUgdm9pZCBjbG9zZV9wYWlyKGludCBmZFsyXSkKK3sKKwljbG9zZShmZFswXSk7CisJY2xvc2UoZmRbMV0pOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZHVwX2Rldm51bGwoaW50IHRvKQoreworCWludCBmZCA9IG9wZW4oIi9kZXYvbnVsbCIsIE9fUkRXUik7CisJZHVwMihmZCwgdG8pOworCWNsb3NlKGZkKTsKK30KKworaW50IHN0YXJ0X2NvbW1hbmQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNtZCkKK3sKKwlpbnQgbmVlZF9pbiwgbmVlZF9vdXQsIG5lZWRfZXJyOworCWludCBmZGluWzJdLCBmZG91dFsyXSwgZmRlcnJbMl07CisKKwkvKgorCSAqIEluIGNhc2Ugb2YgZXJyb3JzIHdlIG11c3Qga2VlcCB0aGUgcHJvbWlzZSB0byBjbG9zZSBGRHMKKwkgKiB0aGF0IGhhdmUgYmVlbiBwYXNzZWQgaW4gdmlhIC0+aW4gYW5kIC0+b3V0LgorCSAqLworCisJbmVlZF9pbiA9ICFjbWQtPm5vX3N0ZGluICYmIGNtZC0+aW4gPCAwOworCWlmIChuZWVkX2luKSB7CisJCWlmIChwaXBlKGZkaW4pIDwgMCkgeworCQkJaWYgKGNtZC0+b3V0ID4gMCkKKwkJCQljbG9zZShjbWQtPm91dCk7CisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9QSVBFOworCQl9CisJCWNtZC0+aW4gPSBmZGluWzFdOworCX0KKworCW5lZWRfb3V0ID0gIWNtZC0+bm9fc3Rkb3V0CisJCSYmICFjbWQtPnN0ZG91dF90b19zdGRlcnIKKwkJJiYgY21kLT5vdXQgPCAwOworCWlmIChuZWVkX291dCkgeworCQlpZiAocGlwZShmZG91dCkgPCAwKSB7CisJCQlpZiAobmVlZF9pbikKKwkJCQljbG9zZV9wYWlyKGZkaW4pOworCQkJZWxzZSBpZiAoY21kLT5pbikKKwkJCQljbG9zZShjbWQtPmluKTsKKwkJCXJldHVybiAtRVJSX1JVTl9DT01NQU5EX1BJUEU7CisJCX0KKwkJY21kLT5vdXQgPSBmZG91dFswXTsKKwl9CisKKwluZWVkX2VyciA9ICFjbWQtPm5vX3N0ZGVyciAmJiBjbWQtPmVyciA8IDA7CisJaWYgKG5lZWRfZXJyKSB7CisJCWlmIChwaXBlKGZkZXJyKSA8IDApIHsKKwkJCWlmIChuZWVkX2luKQorCQkJCWNsb3NlX3BhaXIoZmRpbik7CisJCQllbHNlIGlmIChjbWQtPmluKQorCQkJCWNsb3NlKGNtZC0+aW4pOworCQkJaWYgKG5lZWRfb3V0KQorCQkJCWNsb3NlX3BhaXIoZmRvdXQpOworCQkJZWxzZSBpZiAoY21kLT5vdXQpCisJCQkJY2xvc2UoY21kLT5vdXQpOworCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfUElQRTsKKwkJfQorCQljbWQtPmVyciA9IGZkZXJyWzBdOworCX0KKworI2lmbmRlZiBfX01JTkdXMzJfXworCWZmbHVzaChOVUxMKTsKKwljbWQtPnBpZCA9IGZvcmsoKTsKKwlpZiAoIWNtZC0+cGlkKSB7CisJCWlmIChjbWQtPm5vX3N0ZGluKQorCQkJZHVwX2Rldm51bGwoMCk7CisJCWVsc2UgaWYgKG5lZWRfaW4pIHsKKwkJCWR1cDIoZmRpblswXSwgMCk7CisJCQljbG9zZV9wYWlyKGZkaW4pOworCQl9IGVsc2UgaWYgKGNtZC0+aW4pIHsKKwkJCWR1cDIoY21kLT5pbiwgMCk7CisJCQljbG9zZShjbWQtPmluKTsKKwkJfQorCisJCWlmIChjbWQtPm5vX3N0ZGVycikKKwkJCWR1cF9kZXZudWxsKDIpOworCQllbHNlIGlmIChuZWVkX2VycikgeworCQkJZHVwMihmZGVyclsxXSwgMik7CisJCQljbG9zZV9wYWlyKGZkZXJyKTsKKwkJfQorCisJCWlmIChjbWQtPm5vX3N0ZG91dCkKKwkJCWR1cF9kZXZudWxsKDEpOworCQllbHNlIGlmIChjbWQtPnN0ZG91dF90b19zdGRlcnIpCisJCQlkdXAyKDIsIDEpOworCQllbHNlIGlmIChuZWVkX291dCkgeworCQkJZHVwMihmZG91dFsxXSwgMSk7CisJCQljbG9zZV9wYWlyKGZkb3V0KTsKKwkJfSBlbHNlIGlmIChjbWQtPm91dCA+IDEpIHsKKwkJCWR1cDIoY21kLT5vdXQsIDEpOworCQkJY2xvc2UoY21kLT5vdXQpOworCQl9CisKKwkJaWYgKGNtZC0+ZGlyICYmIGNoZGlyKGNtZC0+ZGlyKSkKKwkJCWRpZSgiZXhlYyAlczogY2QgdG8gJXMgZmFpbGVkICglcykiLCBjbWQtPmFyZ3ZbMF0sCisJCQkgICAgY21kLT5kaXIsIHN0cmVycm9yKGVycm5vKSk7CisJCWlmIChjbWQtPmVudikgeworCQkJZm9yICg7ICpjbWQtPmVudjsgY21kLT5lbnYrKykgeworCQkJCWlmIChzdHJjaHIoKmNtZC0+ZW52LCAnPScpKQorCQkJCQlwdXRlbnYoKGNoYXIqKSpjbWQtPmVudik7CisJCQkJZWxzZQorCQkJCQl1bnNldGVudigqY21kLT5lbnYpOworCQkJfQorCQl9CisJCWlmIChjbWQtPnByZWV4ZWNfY2IpCisJCQljbWQtPnByZWV4ZWNfY2IoKTsKKwkJaWYgKGNtZC0+cGVyZl9jbWQpIHsKKwkJCWV4ZWN2X3BlcmZfY21kKGNtZC0+YXJndik7CisJCX0gZWxzZSB7CisJCQlleGVjdnAoY21kLT5hcmd2WzBdLCAoY2hhciAqY29uc3QqKSBjbWQtPmFyZ3YpOworCQl9CisJCWV4aXQoMTI3KTsKKwl9CisjZWxzZQorCWludCBzMCA9IC0xLCBzMSA9IC0xLCBzMiA9IC0xOwkvKiBiYWNrdXBzIG9mIHN0ZGluLCBzdGRvdXQsIHN0ZGVyciAqLworCWNvbnN0IGNoYXIgKipzYXJndiA9IGNtZC0+YXJndjsKKwljaGFyICoqZW52ID0gZW52aXJvbjsKKworCWlmIChjbWQtPm5vX3N0ZGluKSB7CisJCXMwID0gZHVwKDApOworCQlkdXBfZGV2bnVsbCgwKTsKKwl9IGVsc2UgaWYgKG5lZWRfaW4pIHsKKwkJczAgPSBkdXAoMCk7CisJCWR1cDIoZmRpblswXSwgMCk7CisJfSBlbHNlIGlmIChjbWQtPmluKSB7CisJCXMwID0gZHVwKDApOworCQlkdXAyKGNtZC0+aW4sIDApOworCX0KKworCWlmIChjbWQtPm5vX3N0ZGVycikgeworCQlzMiA9IGR1cCgyKTsKKwkJZHVwX2Rldm51bGwoMik7CisJfSBlbHNlIGlmIChuZWVkX2VycikgeworCQlzMiA9IGR1cCgyKTsKKwkJZHVwMihmZGVyclsxXSwgMik7CisJfQorCisJaWYgKGNtZC0+bm9fc3Rkb3V0KSB7CisJCXMxID0gZHVwKDEpOworCQlkdXBfZGV2bnVsbCgxKTsKKwl9IGVsc2UgaWYgKGNtZC0+c3Rkb3V0X3RvX3N0ZGVycikgeworCQlzMSA9IGR1cCgxKTsKKwkJZHVwMigyLCAxKTsKKwl9IGVsc2UgaWYgKG5lZWRfb3V0KSB7CisJCXMxID0gZHVwKDEpOworCQlkdXAyKGZkb3V0WzFdLCAxKTsKKwl9IGVsc2UgaWYgKGNtZC0+b3V0ID4gMSkgeworCQlzMSA9IGR1cCgxKTsKKwkJZHVwMihjbWQtPm91dCwgMSk7CisJfQorCisJaWYgKGNtZC0+ZGlyKQorCQlkaWUoImNoZGlyIGluIHN0YXJ0X2NvbW1hbmQoKSBub3QgaW1wbGVtZW50ZWQiKTsKKwlpZiAoY21kLT5lbnYpIHsKKwkJZW52ID0gY29weV9lbnZpcm9uKCk7CisJCWZvciAoOyAqY21kLT5lbnY7IGNtZC0+ZW52KyspCisJCQllbnYgPSBlbnZfc2V0ZW52KGVudiwgKmNtZC0+ZW52KTsKKwl9CisKKwlpZiAoY21kLT5wZXJmX2NtZCkgeworCQljbWQtPmFyZ3YgPSBwcmVwYXJlX3BlcmZfY21kKGNtZC0+YXJndik7CisJfQorCisJY21kLT5waWQgPSBtaW5nd19zcGF3bnZwZShjbWQtPmFyZ3ZbMF0sIGNtZC0+YXJndiwgZW52KTsKKworCWlmIChjbWQtPmVudikKKwkJZnJlZV9lbnZpcm9uKGVudik7CisJaWYgKGNtZC0+cGVyZl9jbWQpCisJCWZyZWUoY21kLT5hcmd2KTsKKworCWNtZC0+YXJndiA9IHNhcmd2OworCWlmIChzMCA+PSAwKQorCQlkdXAyKHMwLCAwKSwgY2xvc2UoczApOworCWlmIChzMSA+PSAwKQorCQlkdXAyKHMxLCAxKSwgY2xvc2UoczEpOworCWlmIChzMiA+PSAwKQorCQlkdXAyKHMyLCAyKSwgY2xvc2UoczIpOworI2VuZGlmCisKKwlpZiAoY21kLT5waWQgPCAwKSB7CisJCWludCBlcnIgPSBlcnJubzsKKwkJaWYgKG5lZWRfaW4pCisJCQljbG9zZV9wYWlyKGZkaW4pOworCQllbHNlIGlmIChjbWQtPmluKQorCQkJY2xvc2UoY21kLT5pbik7CisJCWlmIChuZWVkX291dCkKKwkJCWNsb3NlX3BhaXIoZmRvdXQpOworCQllbHNlIGlmIChjbWQtPm91dCkKKwkJCWNsb3NlKGNtZC0+b3V0KTsKKwkJaWYgKG5lZWRfZXJyKQorCQkJY2xvc2VfcGFpcihmZGVycik7CisJCXJldHVybiBlcnIgPT0gRU5PRU5UID8KKwkJCS1FUlJfUlVOX0NPTU1BTkRfRVhFQyA6CisJCQktRVJSX1JVTl9DT01NQU5EX0ZPUks7CisJfQorCisJaWYgKG5lZWRfaW4pCisJCWNsb3NlKGZkaW5bMF0pOworCWVsc2UgaWYgKGNtZC0+aW4pCisJCWNsb3NlKGNtZC0+aW4pOworCisJaWYgKG5lZWRfb3V0KQorCQljbG9zZShmZG91dFsxXSk7CisJZWxzZSBpZiAoY21kLT5vdXQpCisJCWNsb3NlKGNtZC0+b3V0KTsKKworCWlmIChuZWVkX2VycikKKwkJY2xvc2UoZmRlcnJbMV0pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgd2FpdF9vcl93aGluZShwaWRfdCBwaWQpCit7CisJZm9yICg7OykgeworCQlpbnQgc3RhdHVzLCBjb2RlOworCQlwaWRfdCB3YWl0aW5nID0gd2FpdHBpZChwaWQsICZzdGF0dXMsIDApOworCisJCWlmICh3YWl0aW5nIDwgMCkgeworCQkJaWYgKGVycm5vID09IEVJTlRSKQorCQkJCWNvbnRpbnVlOworCQkJZXJyb3IoIndhaXRwaWQgZmFpbGVkICglcykiLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRDsKKwkJfQorCQlpZiAod2FpdGluZyAhPSBwaWQpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRDsKKwkJaWYgKFdJRlNJR05BTEVEKHN0YXR1cykpCisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTDsKKworCQlpZiAoIVdJRkVYSVRFRChzdGF0dXMpKQorCQkJcmV0dXJuIC1FUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9OT0VYSVQ7CisJCWNvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOworCQlzd2l0Y2ggKGNvZGUpIHsKKwkJY2FzZSAxMjc6CisJCQlyZXR1cm4gLUVSUl9SVU5fQ09NTUFORF9FWEVDOworCQljYXNlIDA6CisJCQlyZXR1cm4gMDsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiAtY29kZTsKKwkJfQorCX0KK30KKworaW50IGZpbmlzaF9jb21tYW5kKHN0cnVjdCBjaGlsZF9wcm9jZXNzICpjbWQpCit7CisJcmV0dXJuIHdhaXRfb3Jfd2hpbmUoY21kLT5waWQpOworfQorCitpbnQgcnVuX2NvbW1hbmQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNtZCkKK3sKKwlpbnQgY29kZSA9IHN0YXJ0X2NvbW1hbmQoY21kKTsKKwlpZiAoY29kZSkKKwkJcmV0dXJuIGNvZGU7CisJcmV0dXJuIGZpbmlzaF9jb21tYW5kKGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHByZXBhcmVfcnVuX2NvbW1hbmRfdl9vcHQoc3RydWN0IGNoaWxkX3Byb2Nlc3MgKmNtZCwKKwkJCQkgICAgICBjb25zdCBjaGFyICoqYXJndiwKKwkJCQkgICAgICBpbnQgb3B0KQoreworCW1lbXNldChjbWQsIDAsIHNpemVvZigqY21kKSk7CisJY21kLT5hcmd2ID0gYXJndjsKKwljbWQtPm5vX3N0ZGluID0gb3B0ICYgUlVOX0NPTU1BTkRfTk9fU1RESU4gPyAxIDogMDsKKwljbWQtPnBlcmZfY21kID0gb3B0ICYgUlVOX1BFUkZfQ01EID8gMSA6IDA7CisJY21kLT5zdGRvdXRfdG9fc3RkZXJyID0gb3B0ICYgUlVOX0NPTU1BTkRfU1RET1VUX1RPX1NUREVSUiA/IDEgOiAwOworfQorCitpbnQgcnVuX2NvbW1hbmRfdl9vcHQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQpCit7CisJc3RydWN0IGNoaWxkX3Byb2Nlc3MgY21kOworCXByZXBhcmVfcnVuX2NvbW1hbmRfdl9vcHQoJmNtZCwgYXJndiwgb3B0KTsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmNtZCk7Cit9CisKK2ludCBydW5fY29tbWFuZF92X29wdF9jZF9lbnYoY29uc3QgY2hhciAqKmFyZ3YsIGludCBvcHQsIGNvbnN0IGNoYXIgKmRpciwgY29uc3QgY2hhciAqY29uc3QgKmVudikKK3sKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBjbWQ7CisJcHJlcGFyZV9ydW5fY29tbWFuZF92X29wdCgmY21kLCBhcmd2LCBvcHQpOworCWNtZC5kaXIgPSBkaXI7CisJY21kLmVudiA9IGVudjsKKwlyZXR1cm4gcnVuX2NvbW1hbmQoJmNtZCk7Cit9CisKKyNpZmRlZiBfX01JTkdXMzJfXworc3RhdGljIF9fc3RkY2FsbCB1bnNpZ25lZCBydW5fdGhyZWFkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGFzeW5jICphc3luYyA9IGRhdGE7CisJcmV0dXJuIGFzeW5jLT5wcm9jKGFzeW5jLT5mZF9mb3JfcHJvYywgYXN5bmMtPmRhdGEpOworfQorI2VuZGlmCisKK2ludCBzdGFydF9hc3luYyhzdHJ1Y3QgYXN5bmMgKmFzeW5jKQoreworCWludCBwaXBlX291dFsyXTsKKworCWlmIChwaXBlKHBpcGVfb3V0KSA8IDApCisJCXJldHVybiBlcnJvcigiY2Fubm90IGNyZWF0ZSBwaXBlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJYXN5bmMtPm91dCA9IHBpcGVfb3V0WzBdOworCisjaWZuZGVmIF9fTUlOR1czMl9fCisJLyogRmx1c2ggc3RkaW8gYmVmb3JlIGZvcmsoKSB0byBhdm9pZCBjbG9uaW5nIGJ1ZmZlcnMgKi8KKwlmZmx1c2goTlVMTCk7CisKKwlhc3luYy0+cGlkID0gZm9yaygpOworCWlmIChhc3luYy0+cGlkIDwgMCkgeworCQllcnJvcigiZm9yayAoYXN5bmMpIGZhaWxlZDogJXMiLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZV9wYWlyKHBpcGVfb3V0KTsKKwkJcmV0dXJuIC0xOworCX0KKwlpZiAoIWFzeW5jLT5waWQpIHsKKwkJY2xvc2UocGlwZV9vdXRbMF0pOworCQlleGl0KCEhYXN5bmMtPnByb2MocGlwZV9vdXRbMV0sIGFzeW5jLT5kYXRhKSk7CisJfQorCWNsb3NlKHBpcGVfb3V0WzFdKTsKKyNlbHNlCisJYXN5bmMtPmZkX2Zvcl9wcm9jID0gcGlwZV9vdXRbMV07CisJYXN5bmMtPnRpZCA9IChIQU5ETEUpIF9iZWdpbnRocmVhZGV4KE5VTEwsIDAsIHJ1bl90aHJlYWQsIGFzeW5jLCAwLCBOVUxMKTsKKwlpZiAoIWFzeW5jLT50aWQpIHsKKwkJZXJyb3IoImNhbm5vdCBjcmVhdGUgdGhyZWFkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJCWNsb3NlX3BhaXIocGlwZV9vdXQpOworCQlyZXR1cm4gLTE7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK2ludCBmaW5pc2hfYXN5bmMoc3RydWN0IGFzeW5jICphc3luYykKK3sKKyNpZm5kZWYgX19NSU5HVzMyX18KKwlpbnQgcmV0ID0gMDsKKworCWlmICh3YWl0X29yX3doaW5lKGFzeW5jLT5waWQpKQorCQlyZXQgPSBlcnJvcigid2FpdHBpZCAoYXN5bmMpIGZhaWxlZCIpOworI2Vsc2UKKwlEV09SRCByZXQgPSAwOworCWlmIChXYWl0Rm9yU2luZ2xlT2JqZWN0KGFzeW5jLT50aWQsIElORklOSVRFKSAhPSBXQUlUX09CSkVDVF8wKQorCQlyZXQgPSBlcnJvcigid2FpdGluZyBmb3IgdGhyZWFkIGZhaWxlZDogJWx1IiwgR2V0TGFzdEVycm9yKCkpOworCWVsc2UgaWYgKCFHZXRFeGl0Q29kZVRocmVhZChhc3luYy0+dGlkLCAmcmV0KSkKKwkJcmV0ID0gZXJyb3IoImNhbm5vdCBnZXQgdGhyZWFkIGV4aXQgY29kZTogJWx1IiwgR2V0TGFzdEVycm9yKCkpOworCUNsb3NlSGFuZGxlKGFzeW5jLT50aWQpOworI2VuZGlmCisJcmV0dXJuIHJldDsKK30KKworaW50IHJ1bl9ob29rKGNvbnN0IGNoYXIgKmluZGV4X2ZpbGUsIGNvbnN0IGNoYXIgKm5hbWUsIC4uLikKK3sKKwlzdHJ1Y3QgY2hpbGRfcHJvY2VzcyBob29rOworCWNvbnN0IGNoYXIgKiphcmd2ID0gTlVMTCwgKmVudlsyXTsKKwljaGFyIGluZGV4W1BBVEhfTUFYXTsKKwl2YV9saXN0IGFyZ3M7CisJaW50IHJldDsKKwlzaXplX3QgaSA9IDAsIGFsbG9jID0gMDsKKworCWlmIChhY2Nlc3MocGVyZl9wYXRoKCJob29rcy8lcyIsIG5hbWUpLCBYX09LKSA8IDApCisJCXJldHVybiAwOworCisJdmFfc3RhcnQoYXJncywgbmFtZSk7CisJQUxMT0NfR1JPVyhhcmd2LCBpICsgMSwgYWxsb2MpOworCWFyZ3ZbaSsrXSA9IHBlcmZfcGF0aCgiaG9va3MvJXMiLCBuYW1lKTsKKwl3aGlsZSAoYXJndltpLTFdKSB7CisJCUFMTE9DX0dST1coYXJndiwgaSArIDEsIGFsbG9jKTsKKwkJYXJndltpKytdID0gdmFfYXJnKGFyZ3MsIGNvbnN0IGNoYXIgKik7CisJfQorCXZhX2VuZChhcmdzKTsKKworCW1lbXNldCgmaG9vaywgMCwgc2l6ZW9mKGhvb2spKTsKKwlob29rLmFyZ3YgPSBhcmd2OworCWhvb2subm9fc3RkaW4gPSAxOworCWhvb2suc3Rkb3V0X3RvX3N0ZGVyciA9IDE7CisJaWYgKGluZGV4X2ZpbGUpIHsKKwkJc25wcmludGYoaW5kZXgsIHNpemVvZihpbmRleCksICJQRVJGX0lOREVYX0ZJTEU9JXMiLCBpbmRleF9maWxlKTsKKwkJZW52WzBdID0gaW5kZXg7CisJCWVudlsxXSA9IE5VTEw7CisJCWhvb2suZW52ID0gZW52OworCX0KKworCXJldCA9IHN0YXJ0X2NvbW1hbmQoJmhvb2spOworCWZyZWUoYXJndik7CisJaWYgKHJldCkgeworCQl3YXJuaW5nKCJDb3VsZCBub3Qgc3Bhd24gJXMiLCBhcmd2WzBdKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJcmV0ID0gZmluaXNoX2NvbW1hbmQoJmhvb2spOworCWlmIChyZXQgPT0gLUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1NJR05BTCkKKwkJd2FybmluZygiJXMgZXhpdGVkIGR1ZSB0byB1bmNhdWdodCBzaWduYWwiLCBhcmd2WzBdKTsKKworCXJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvcnVuLWNvbW1hbmQuaCBiL3Rvb2xzL3BlcmYvdXRpbC9ydW4tY29tbWFuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyODI4OWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvcnVuLWNvbW1hbmQuaApAQCAtMCwwICsxLDkzIEBACisjaWZuZGVmIFJVTl9DT01NQU5EX0gKKyNkZWZpbmUgUlVOX0NPTU1BTkRfSAorCitlbnVtIHsKKwlFUlJfUlVOX0NPTU1BTkRfRk9SSyA9IDEwMDAwLAorCUVSUl9SVU5fQ09NTUFORF9FWEVDLAorCUVSUl9SVU5fQ09NTUFORF9QSVBFLAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElELAorCUVSUl9SVU5fQ09NTUFORF9XQUlUUElEX1dST05HX1BJRCwKKwlFUlJfUlVOX0NPTU1BTkRfV0FJVFBJRF9TSUdOQUwsCisJRVJSX1JVTl9DT01NQU5EX1dBSVRQSURfTk9FWElULAorfTsKKyNkZWZpbmUgSVNfUlVOX0NPTU1BTkRfRVJSKHgpICgtKHgpID49IEVSUl9SVU5fQ09NTUFORF9GT1JLKQorCitzdHJ1Y3QgY2hpbGRfcHJvY2VzcyB7CisJY29uc3QgY2hhciAqKmFyZ3Y7CisJcGlkX3QgcGlkOworCS8qCisJICogVXNpbmcgLmluLCAub3V0LCAuZXJyOgorCSAqIC0gU3BlY2lmeSAwIGZvciBubyByZWRpcmVjdGlvbnMgKGNoaWxkIGluaGVyaXRzIHN0ZGluLCBzdGRvdXQsCisJICogICBzdGRlcnIgZnJvbSBwYXJlbnQpLgorCSAqIC0gU3BlY2lmeSAtMSB0byBoYXZlIGEgcGlwZSBhbGxvY2F0ZWQgYXMgZm9sbG93czoKKwkgKiAgICAgLmluOiByZXR1cm5zIHRoZSB3cml0YWJsZSBwaXBlIGVuZDsgcGFyZW50IHdyaXRlcyB0byBpdCwKKwkgKiAgICAgICAgICB0aGUgcmVhZGFibGUgcGlwZSBlbmQgYmVjb21lcyBjaGlsZCdzIHN0ZGluCisJICogICAgIC5vdXQsIC5lcnI6IHJldHVybnMgdGhlIHJlYWRhYmxlIHBpcGUgZW5kOyBwYXJlbnQgcmVhZHMgZnJvbQorCSAqICAgICAgICAgIGl0LCB0aGUgd3JpdGFibGUgcGlwZSBlbmQgYmVjb21lcyBjaGlsZCdzIHN0ZG91dC9zdGRlcnIKKwkgKiAgIFRoZSBjYWxsZXIgb2Ygc3RhcnRfY29tbWFuZCgpIG11c3QgY2xvc2UgdGhlIHJldHVybmVkIEZEcworCSAqICAgYWZ0ZXIgaXQgaGFzIGNvbXBsZXRlZCByZWFkaW5nIGZyb20vd3JpdGluZyB0byBpdCEKKwkgKiAtIFNwZWNpZnkgPiAwIHRvIHNldCBhIGNoYW5uZWwgdG8gYSBwYXJ0aWN1bGFyIEZEIGFzIGZvbGxvd3M6CisJICogICAgIC5pbjogYSByZWFkYWJsZSBGRCwgYmVjb21lcyBjaGlsZCdzIHN0ZGluCisJICogICAgIC5vdXQ6IGEgd3JpdGFibGUgRkQsIGJlY29tZXMgY2hpbGQncyBzdGRvdXQvc3RkZXJyCisJICogICAgIC5lcnIgPiAwIG5vdCBzdXBwb3J0ZWQKKwkgKiAgIFRoZSBzcGVjaWZpZWQgRkQgaXMgY2xvc2VkIGJ5IHN0YXJ0X2NvbW1hbmQoKSwgZXZlbiBpbiBjYXNlCisJICogICBvZiBlcnJvcnMhCisJICovCisJaW50IGluOworCWludCBvdXQ7CisJaW50IGVycjsKKwljb25zdCBjaGFyICpkaXI7CisJY29uc3QgY2hhciAqY29uc3QgKmVudjsKKwl1bnNpZ25lZCBub19zdGRpbjoxOworCXVuc2lnbmVkIG5vX3N0ZG91dDoxOworCXVuc2lnbmVkIG5vX3N0ZGVycjoxOworCXVuc2lnbmVkIHBlcmZfY21kOjE7IC8qIGlmIHRoaXMgaXMgdG8gYmUgcGVyZiBzdWItY29tbWFuZCAqLworCXVuc2lnbmVkIHN0ZG91dF90b19zdGRlcnI6MTsKKwl2b2lkICgqcHJlZXhlY19jYikodm9pZCk7Cit9OworCitpbnQgc3RhcnRfY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqKTsKK2ludCBmaW5pc2hfY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqKTsKK2ludCBydW5fY29tbWFuZChzdHJ1Y3QgY2hpbGRfcHJvY2VzcyAqKTsKKworZXh0ZXJuIGludCBydW5faG9vayhjb25zdCBjaGFyICppbmRleF9maWxlLCBjb25zdCBjaGFyICpuYW1lLCAuLi4pOworCisjZGVmaW5lIFJVTl9DT01NQU5EX05PX1NURElOIDEKKyNkZWZpbmUgUlVOX1BFUkZfQ01ECSAgICAgMgkvKklmIHRoaXMgaXMgdG8gYmUgcGVyZiBzdWItY29tbWFuZCAqLworI2RlZmluZSBSVU5fQ09NTUFORF9TVERPVVRfVE9fU1RERVJSIDQKK2ludCBydW5fY29tbWFuZF92X29wdChjb25zdCBjaGFyICoqYXJndiwgaW50IG9wdCk7CisKKy8qCisgKiBlbnYgKHRoZSBlbnZpcm9ubWVudCkgaXMgdG8gYmUgZm9ybWF0dGVkIGxpa2UgZW52aXJvbjogIlZBUj1WQUxVRSIuCisgKiBUbyB1bnNldCBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZSB1c2UganVzdCAiVkFSIi4KKyAqLworaW50IHJ1bl9jb21tYW5kX3Zfb3B0X2NkX2Vudihjb25zdCBjaGFyICoqYXJndiwgaW50IG9wdCwgY29uc3QgY2hhciAqZGlyLCBjb25zdCBjaGFyICpjb25zdCAqZW52KTsKKworLyoKKyAqIFRoZSBwdXJwb3NlIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGlzIHRvIGZlZWQgYSBwaXBlIGJ5IHJ1bm5pbmcKKyAqIGEgZnVuY3Rpb24gYXN5bmNocm9ub3VzbHkgYW5kIHByb3ZpZGluZyBvdXRwdXQgdGhhdCB0aGUgY2FsbGVyIHJlYWRzLgorICoKKyAqIEl0IGlzIGV4cGVjdGVkIHRoYXQgbm8gc3luY2hyb25pemF0aW9uIGFuZCBtdXR1YWwgZXhjbHVzaW9uIGJldHdlZW4KKyAqIHRoZSBjYWxsZXIgYW5kIHRoZSBmZWVkIGZ1bmN0aW9uIGlzIG5lY2Vzc2FyeSBzbyB0aGF0IHRoZSBmdW5jdGlvbgorICogY2FuIHJ1biBpbiBhIHRocmVhZCB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIGNhbGxlci4KKyAqLworc3RydWN0IGFzeW5jIHsKKwkvKgorCSAqIHByb2Mgd3JpdGVzIHRvIGZkIGFuZCBjbG9zZXMgaXQ7CisJICogcmV0dXJucyAwIG9uIHN1Y2Nlc3MsIG5vbi16ZXJvIG9uIGZhaWx1cmUKKwkgKi8KKwlpbnQgKCpwcm9jKShpbnQgZmQsIHZvaWQgKmRhdGEpOworCXZvaWQgKmRhdGE7CisJaW50IG91dDsJLyogY2FsbGVyIHJlYWRzIGZyb20gaGVyZSBhbmQgY2xvc2VzIGl0ICovCisjaWZuZGVmIF9fTUlOR1czMl9fCisJcGlkX3QgcGlkOworI2Vsc2UKKwlIQU5ETEUgdGlkOworCWludCBmZF9mb3JfcHJvYzsKKyNlbmRpZgorfTsKKworaW50IHN0YXJ0X2FzeW5jKHN0cnVjdCBhc3luYyAqYXN5bmMpOworaW50IGZpbmlzaF9hc3luYyhzdHJ1Y3QgYXN5bmMgKmFzeW5jKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc2lnY2hhaW4uYyBiL3Rvb2xzL3BlcmYvdXRpbC9zaWdjaGFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMThiOTkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvc2lnY2hhaW4uYwpAQCAtMCwwICsxLDUyIEBACisjaW5jbHVkZSAic2lnY2hhaW4uaCIKKyNpbmNsdWRlICJjYWNoZS5oIgorCisjZGVmaW5lIFNJR0NIQUlOX01BWF9TSUdOQUxTIDMyCisKK3N0cnVjdCBzaWdjaGFpbl9zaWduYWwgeworCXNpZ2NoYWluX2Z1biAqb2xkOworCWludCBuOworCWludCBhbGxvYzsKK307CitzdGF0aWMgc3RydWN0IHNpZ2NoYWluX3NpZ25hbCBzaWduYWxzW1NJR0NIQUlOX01BWF9TSUdOQUxTXTsKKworc3RhdGljIHZvaWQgY2hlY2tfc2lnbnVtKGludCBzaWcpCit7CisJaWYgKHNpZyA8IDEgfHwgc2lnID49IFNJR0NIQUlOX01BWF9TSUdOQUxTKQorCQlkaWUoIkJVRzogc2lnbmFsIG91dCBvZiByYW5nZTogJWQiLCBzaWcpOworfQorCitpbnQgc2lnY2hhaW5fcHVzaChpbnQgc2lnLCBzaWdjaGFpbl9mdW4gZikKK3sKKwlzdHJ1Y3Qgc2lnY2hhaW5fc2lnbmFsICpzID0gc2lnbmFscyArIHNpZzsKKwljaGVja19zaWdudW0oc2lnKTsKKworCUFMTE9DX0dST1cocy0+b2xkLCBzLT5uICsgMSwgcy0+YWxsb2MpOworCXMtPm9sZFtzLT5uXSA9IHNpZ25hbChzaWcsIGYpOworCWlmIChzLT5vbGRbcy0+bl0gPT0gU0lHX0VSUikKKwkJcmV0dXJuIC0xOworCXMtPm4rKzsKKwlyZXR1cm4gMDsKK30KKworaW50IHNpZ2NoYWluX3BvcChpbnQgc2lnKQoreworCXN0cnVjdCBzaWdjaGFpbl9zaWduYWwgKnMgPSBzaWduYWxzICsgc2lnOworCWNoZWNrX3NpZ251bShzaWcpOworCWlmIChzLT5uIDwgMSkKKwkJcmV0dXJuIDA7CisKKwlpZiAoc2lnbmFsKHNpZywgcy0+b2xkW3MtPm4gLSAxXSkgPT0gU0lHX0VSUikKKwkJcmV0dXJuIC0xOworCXMtPm4tLTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBzaWdjaGFpbl9wdXNoX2NvbW1vbihzaWdjaGFpbl9mdW4gZikKK3sKKwlzaWdjaGFpbl9wdXNoKFNJR0lOVCwgZik7CisJc2lnY2hhaW5fcHVzaChTSUdIVVAsIGYpOworCXNpZ2NoYWluX3B1c2goU0lHVEVSTSwgZik7CisJc2lnY2hhaW5fcHVzaChTSUdRVUlULCBmKTsKKwlzaWdjaGFpbl9wdXNoKFNJR1BJUEUsIGYpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3NpZ2NoYWluLmggYi90b29scy9wZXJmL3V0aWwvc2lnY2hhaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTgwODNiYwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zaWdjaGFpbi5oCkBAIC0wLDAgKzEsMTEgQEAKKyNpZm5kZWYgU0lHQ0hBSU5fSAorI2RlZmluZSBTSUdDSEFJTl9ICisKK3R5cGVkZWYgdm9pZCAoKnNpZ2NoYWluX2Z1bikoaW50KTsKKworaW50IHNpZ2NoYWluX3B1c2goaW50IHNpZywgc2lnY2hhaW5fZnVuIGYpOworaW50IHNpZ2NoYWluX3BvcChpbnQgc2lnKTsKKwordm9pZCBzaWdjaGFpbl9wdXNoX2NvbW1vbihzaWdjaGFpbl9mdW4gZik7CisKKyNlbmRpZiAvKiBTSUdDSEFJTl9IICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3RyYnVmLmMgYi90b29scy9wZXJmL3V0aWwvc3RyYnVmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiYTA5MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zdHJidWYuYwpAQCAtMCwwICsxLDM1OSBAQAorI2luY2x1ZGUgImNhY2hlLmgiCisKK2ludCBwcmVmaXhjbXAoY29uc3QgY2hhciAqc3RyLCBjb25zdCBjaGFyICpwcmVmaXgpCit7CisJZm9yICg7IDsgc3RyKyssIHByZWZpeCsrKQorCQlpZiAoISpwcmVmaXgpCisJCQlyZXR1cm4gMDsKKwkJZWxzZSBpZiAoKnN0ciAhPSAqcHJlZml4KQorCQkJcmV0dXJuICh1bnNpZ25lZCBjaGFyKSpwcmVmaXggLSAodW5zaWduZWQgY2hhcikqc3RyOworfQorCisvKgorICogVXNlZCBhcyB0aGUgZGVmYXVsdCAtPmJ1ZiB2YWx1ZSwgc28gdGhhdCBwZW9wbGUgY2FuIGFsd2F5cyBhc3N1bWUKKyAqIGJ1ZiBpcyBub24gTlVMTCBhbmQgLT5idWYgaXMgTlVMIHRlcm1pbmF0ZWQgZXZlbiBmb3IgYSBmcmVzaGx5CisgKiBpbml0aWFsaXplZCBzdHJidWYuCisgKi8KK2NoYXIgc3RyYnVmX3Nsb3BidWZbMV07CisKK3ZvaWQgc3RyYnVmX2luaXQoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBoaW50KQoreworCXNiLT5hbGxvYyA9IHNiLT5sZW4gPSAwOworCXNiLT5idWYgPSBzdHJidWZfc2xvcGJ1ZjsKKwlpZiAoaGludCkKKwkJc3RyYnVmX2dyb3coc2IsIGhpbnQpOworfQorCit2b2lkIHN0cmJ1Zl9yZWxlYXNlKHN0cnVjdCBzdHJidWYgKnNiKQoreworCWlmIChzYi0+YWxsb2MpIHsKKwkJZnJlZShzYi0+YnVmKTsKKwkJc3RyYnVmX2luaXQoc2IsIDApOworCX0KK30KKworY2hhciAqc3RyYnVmX2RldGFjaChzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90ICpzeikKK3sKKwljaGFyICpyZXMgPSBzYi0+YWxsb2MgPyBzYi0+YnVmIDogTlVMTDsKKwlpZiAoc3opCisJCSpzeiA9IHNiLT5sZW47CisJc3RyYnVmX2luaXQoc2IsIDApOworCXJldHVybiByZXM7Cit9CisKK3ZvaWQgc3RyYnVmX2F0dGFjaChzdHJ1Y3Qgc3RyYnVmICpzYiwgdm9pZCAqYnVmLCBzaXplX3QgbGVuLCBzaXplX3QgYWxsb2MpCit7CisJc3RyYnVmX3JlbGVhc2Uoc2IpOworCXNiLT5idWYgICA9IGJ1ZjsKKwlzYi0+bGVuICAgPSBsZW47CisJc2ItPmFsbG9jID0gYWxsb2M7CisJc3RyYnVmX2dyb3coc2IsIDApOworCXNiLT5idWZbc2ItPmxlbl0gPSAnXDAnOworfQorCit2b2lkIHN0cmJ1Zl9ncm93KHN0cnVjdCBzdHJidWYgKnNiLCBzaXplX3QgZXh0cmEpCit7CisJaWYgKHNiLT5sZW4gKyBleHRyYSArIDEgPD0gc2ItPmxlbikKKwkJZGllKCJ5b3Ugd2FudCB0byB1c2Ugd2F5IHRvbyBtdWNoIG1lbW9yeSIpOworCWlmICghc2ItPmFsbG9jKQorCQlzYi0+YnVmID0gTlVMTDsKKwlBTExPQ19HUk9XKHNiLT5idWYsIHNiLT5sZW4gKyBleHRyYSArIDEsIHNiLT5hbGxvYyk7Cit9CisKK3ZvaWQgc3RyYnVmX3RyaW0oc3RydWN0IHN0cmJ1ZiAqc2IpCit7CisJY2hhciAqYiA9IHNiLT5idWY7CisJd2hpbGUgKHNiLT5sZW4gPiAwICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpc2ItPmJ1ZltzYi0+bGVuIC0gMV0pKQorCQlzYi0+bGVuLS07CisJd2hpbGUgKHNiLT5sZW4gPiAwICYmIGlzc3BhY2UoKmIpKSB7CisJCWIrKzsKKwkJc2ItPmxlbi0tOworCX0KKwltZW1tb3ZlKHNiLT5idWYsIGIsIHNiLT5sZW4pOworCXNiLT5idWZbc2ItPmxlbl0gPSAnXDAnOworfQordm9pZCBzdHJidWZfcnRyaW0oc3RydWN0IHN0cmJ1ZiAqc2IpCit7CisJd2hpbGUgKHNiLT5sZW4gPiAwICYmIGlzc3BhY2UoKHVuc2lnbmVkIGNoYXIpc2ItPmJ1ZltzYi0+bGVuIC0gMV0pKQorCQlzYi0+bGVuLS07CisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7Cit9CisKK3ZvaWQgc3RyYnVmX2x0cmltKHN0cnVjdCBzdHJidWYgKnNiKQoreworCWNoYXIgKmIgPSBzYi0+YnVmOworCXdoaWxlIChzYi0+bGVuID4gMCAmJiBpc3NwYWNlKCpiKSkgeworCQliKys7CisJCXNiLT5sZW4tLTsKKwl9CisJbWVtbW92ZShzYi0+YnVmLCBiLCBzYi0+bGVuKTsKKwlzYi0+YnVmW3NiLT5sZW5dID0gJ1wwJzsKK30KKwordm9pZCBzdHJidWZfdG9sb3dlcihzdHJ1Y3Qgc3RyYnVmICpzYikKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgc2ItPmxlbjsgaSsrKQorCQlzYi0+YnVmW2ldID0gdG9sb3dlcihzYi0+YnVmW2ldKTsKK30KKworc3RydWN0IHN0cmJ1ZiAqKnN0cmJ1Zl9zcGxpdChjb25zdCBzdHJ1Y3Qgc3RyYnVmICpzYiwgaW50IGRlbGltKQoreworCWludCBhbGxvYyA9IDIsIHBvcyA9IDA7CisJY2hhciAqbiwgKnA7CisJc3RydWN0IHN0cmJ1ZiAqKnJldDsKKwlzdHJ1Y3Qgc3RyYnVmICp0OworCisJcmV0ID0gY2FsbG9jKGFsbG9jLCBzaXplb2Yoc3RydWN0IHN0cmJ1ZiAqKSk7CisJcCA9IG4gPSBzYi0+YnVmOworCXdoaWxlIChuIDwgc2ItPmJ1ZiArIHNiLT5sZW4pIHsKKwkJaW50IGxlbjsKKwkJbiA9IG1lbWNocihuLCBkZWxpbSwgc2ItPmxlbiAtIChuIC0gc2ItPmJ1ZikpOworCQlpZiAocG9zICsgMSA+PSBhbGxvYykgeworCQkJYWxsb2MgPSBhbGxvYyAqIDI7CisJCQlyZXQgPSByZWFsbG9jKHJldCwgc2l6ZW9mKHN0cnVjdCBzdHJidWYgKikgKiBhbGxvYyk7CisJCX0KKwkJaWYgKCFuKQorCQkJbiA9IHNiLT5idWYgKyBzYi0+bGVuIC0gMTsKKwkJbGVuID0gbiAtIHAgKyAxOworCQl0ID0gbWFsbG9jKHNpemVvZihzdHJ1Y3Qgc3RyYnVmKSk7CisJCXN0cmJ1Zl9pbml0KHQsIGxlbik7CisJCXN0cmJ1Zl9hZGQodCwgcCwgbGVuKTsKKwkJcmV0W3Bvc10gPSB0OworCQlyZXRbKytwb3NdID0gTlVMTDsKKwkJcCA9ICsrbjsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCBzdHJidWZfbGlzdF9mcmVlKHN0cnVjdCBzdHJidWYgKipzYnMpCit7CisJc3RydWN0IHN0cmJ1ZiAqKnMgPSBzYnM7CisKKwl3aGlsZSAoKnMpIHsKKwkJc3RyYnVmX3JlbGVhc2UoKnMpOworCQlmcmVlKCpzKyspOworCX0KKwlmcmVlKHNicyk7Cit9CisKK2ludCBzdHJidWZfY21wKGNvbnN0IHN0cnVjdCBzdHJidWYgKmEsIGNvbnN0IHN0cnVjdCBzdHJidWYgKmIpCit7CisJaW50IGxlbiA9IGEtPmxlbiA8IGItPmxlbiA/IGEtPmxlbjogYi0+bGVuOworCWludCBjbXAgPSBtZW1jbXAoYS0+YnVmLCBiLT5idWYsIGxlbik7CisJaWYgKGNtcCkKKwkJcmV0dXJuIGNtcDsKKwlyZXR1cm4gYS0+bGVuIDwgYi0+bGVuID8gLTE6IGEtPmxlbiAhPSBiLT5sZW47Cit9CisKK3ZvaWQgc3RyYnVmX3NwbGljZShzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90IHBvcywgc2l6ZV90IGxlbiwKKwkJCQkgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgZGxlbikKK3sKKwlpZiAocG9zICsgbGVuIDwgcG9zKQorCQlkaWUoInlvdSB3YW50IHRvIHVzZSB3YXkgdG9vIG11Y2ggbWVtb3J5Iik7CisJaWYgKHBvcyA+IHNiLT5sZW4pCisJCWRpZSgiYHBvcycgaXMgdG9vIGZhciBhZnRlciB0aGUgZW5kIG9mIHRoZSBidWZmZXIiKTsKKwlpZiAocG9zICsgbGVuID4gc2ItPmxlbikKKwkJZGllKCJgcG9zICsgbGVuJyBpcyB0b28gZmFyIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciIpOworCisJaWYgKGRsZW4gPj0gbGVuKQorCQlzdHJidWZfZ3JvdyhzYiwgZGxlbiAtIGxlbik7CisJbWVtbW92ZShzYi0+YnVmICsgcG9zICsgZGxlbiwKKwkJCXNiLT5idWYgKyBwb3MgKyBsZW4sCisJCQlzYi0+bGVuIC0gcG9zIC0gbGVuKTsKKwltZW1jcHkoc2ItPmJ1ZiArIHBvcywgZGF0YSwgZGxlbik7CisJc3RyYnVmX3NldGxlbihzYiwgc2ItPmxlbiArIGRsZW4gLSBsZW4pOworfQorCit2b2lkIHN0cmJ1Zl9pbnNlcnQoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBwb3MsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RyYnVmX3NwbGljZShzYiwgcG9zLCAwLCBkYXRhLCBsZW4pOworfQorCit2b2lkIHN0cmJ1Zl9yZW1vdmUoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBwb3MsIHNpemVfdCBsZW4pCit7CisJc3RyYnVmX3NwbGljZShzYiwgcG9zLCBsZW4sIE5VTEwsIDApOworfQorCit2b2lkIHN0cmJ1Zl9hZGQoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW4pCit7CisJc3RyYnVmX2dyb3coc2IsIGxlbik7CisJbWVtY3B5KHNiLT5idWYgKyBzYi0+bGVuLCBkYXRhLCBsZW4pOworCXN0cmJ1Zl9zZXRsZW4oc2IsIHNiLT5sZW4gKyBsZW4pOworfQorCit2b2lkIHN0cmJ1Zl9hZGRkdXAoc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBwb3MsIHNpemVfdCBsZW4pCit7CisJc3RyYnVmX2dyb3coc2IsIGxlbik7CisJbWVtY3B5KHNiLT5idWYgKyBzYi0+bGVuLCBzYi0+YnVmICsgcG9zLCBsZW4pOworCXN0cmJ1Zl9zZXRsZW4oc2IsIHNiLT5sZW4gKyBsZW4pOworfQorCit2b2lkIHN0cmJ1Zl9hZGRmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwlpbnQgbGVuOworCXZhX2xpc3QgYXA7CisKKwlpZiAoIXN0cmJ1Zl9hdmFpbChzYikpCisJCXN0cmJ1Zl9ncm93KHNiLCA2NCk7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKHNiLT5idWYgKyBzYi0+bGVuLCBzYi0+YWxsb2MgLSBzYi0+bGVuLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWlmIChsZW4gPCAwKQorCQlkaWUoInlvdXIgdnNucHJpbnRmIGlzIGJyb2tlbiIpOworCWlmIChsZW4gPiBzdHJidWZfYXZhaWwoc2IpKSB7CisJCXN0cmJ1Zl9ncm93KHNiLCBsZW4pOworCQl2YV9zdGFydChhcCwgZm10KTsKKwkJbGVuID0gdnNucHJpbnRmKHNiLT5idWYgKyBzYi0+bGVuLCBzYi0+YWxsb2MgLSBzYi0+bGVuLCBmbXQsIGFwKTsKKwkJdmFfZW5kKGFwKTsKKwkJaWYgKGxlbiA+IHN0cmJ1Zl9hdmFpbChzYikpIHsKKwkJCWRpZSgidGhpcyBzaG91bGQgbm90IGhhcHBlbiwgeW91ciBzbnByaW50ZiBpcyBicm9rZW4iKTsKKwkJfQorCX0KKwlzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgbGVuKTsKK30KKwordm9pZCBzdHJidWZfZXhwYW5kKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpmb3JtYXQsIGV4cGFuZF9mbl90IGZuLAorCQkgICB2b2lkICpjb250ZXh0KQoreworCWZvciAoOzspIHsKKwkJY29uc3QgY2hhciAqcGVyY2VudDsKKwkJc2l6ZV90IGNvbnN1bWVkOworCisJCXBlcmNlbnQgPSBzdHJjaHJudWwoZm9ybWF0LCAnJScpOworCQlzdHJidWZfYWRkKHNiLCBmb3JtYXQsIHBlcmNlbnQgLSBmb3JtYXQpOworCQlpZiAoISpwZXJjZW50KQorCQkJYnJlYWs7CisJCWZvcm1hdCA9IHBlcmNlbnQgKyAxOworCisJCWNvbnN1bWVkID0gZm4oc2IsIGZvcm1hdCwgY29udGV4dCk7CisJCWlmIChjb25zdW1lZCkKKwkJCWZvcm1hdCArPSBjb25zdW1lZDsKKwkJZWxzZQorCQkJc3RyYnVmX2FkZGNoKHNiLCAnJScpOworCX0KK30KKworc2l6ZV90IHN0cmJ1Zl9leHBhbmRfZGljdF9jYihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGxhY2Vob2xkZXIsCisJCXZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHN0cmJ1Zl9leHBhbmRfZGljdF9lbnRyeSAqZSA9IGNvbnRleHQ7CisJc2l6ZV90IGxlbjsKKworCWZvciAoOyBlLT5wbGFjZWhvbGRlciAmJiAobGVuID0gc3RybGVuKGUtPnBsYWNlaG9sZGVyKSk7IGUrKykgeworCQlpZiAoIXN0cm5jbXAocGxhY2Vob2xkZXIsIGUtPnBsYWNlaG9sZGVyLCBsZW4pKSB7CisJCQlpZiAoZS0+dmFsdWUpCisJCQkJc3RyYnVmX2FkZHN0cihzYiwgZS0+dmFsdWUpOworCQkJcmV0dXJuIGxlbjsKKwkJfQorCX0KKwlyZXR1cm4gMDsKK30KKworc2l6ZV90IHN0cmJ1Zl9mcmVhZChzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90IHNpemUsIEZJTEUgKmYpCit7CisJc2l6ZV90IHJlczsKKwlzaXplX3Qgb2xkYWxsb2MgPSBzYi0+YWxsb2M7CisKKwlzdHJidWZfZ3JvdyhzYiwgc2l6ZSk7CisJcmVzID0gZnJlYWQoc2ItPmJ1ZiArIHNiLT5sZW4sIDEsIHNpemUsIGYpOworCWlmIChyZXMgPiAwKQorCQlzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgcmVzKTsKKwllbHNlIGlmIChyZXMgPCAwICYmIG9sZGFsbG9jID09IDApCisJCXN0cmJ1Zl9yZWxlYXNlKHNiKTsKKwlyZXR1cm4gcmVzOworfQorCitzc2l6ZV90IHN0cmJ1Zl9yZWFkKHN0cnVjdCBzdHJidWYgKnNiLCBpbnQgZmQsIHNpemVfdCBoaW50KQoreworCXNpemVfdCBvbGRsZW4gPSBzYi0+bGVuOworCXNpemVfdCBvbGRhbGxvYyA9IHNiLT5hbGxvYzsKKworCXN0cmJ1Zl9ncm93KHNiLCBoaW50ID8gaGludCA6IDgxOTIpOworCWZvciAoOzspIHsKKwkJc3NpemVfdCBjbnQ7CisKKwkJY250ID0gcmVhZChmZCwgc2ItPmJ1ZiArIHNiLT5sZW4sIHNiLT5hbGxvYyAtIHNiLT5sZW4gLSAxKTsKKwkJaWYgKGNudCA8IDApIHsKKwkJCWlmIChvbGRhbGxvYyA9PSAwKQorCQkJCXN0cmJ1Zl9yZWxlYXNlKHNiKTsKKwkJCWVsc2UKKwkJCQlzdHJidWZfc2V0bGVuKHNiLCBvbGRsZW4pOworCQkJcmV0dXJuIC0xOworCQl9CisJCWlmICghY250KQorCQkJYnJlYWs7CisJCXNiLT5sZW4gKz0gY250OworCQlzdHJidWZfZ3JvdyhzYiwgODE5Mik7CisJfQorCisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7CisJcmV0dXJuIHNiLT5sZW4gLSBvbGRsZW47Cit9CisKKyNkZWZpbmUgU1RSQlVGX01BWExJTksgKDIqUEFUSF9NQVgpCisKK2ludCBzdHJidWZfcmVhZGxpbmsoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKnBhdGgsIHNpemVfdCBoaW50KQoreworCXNpemVfdCBvbGRhbGxvYyA9IHNiLT5hbGxvYzsKKworCWlmIChoaW50IDwgMzIpCisJCWhpbnQgPSAzMjsKKworCXdoaWxlIChoaW50IDwgU1RSQlVGX01BWExJTkspIHsKKwkJaW50IGxlbjsKKworCQlzdHJidWZfZ3JvdyhzYiwgaGludCk7CisJCWxlbiA9IHJlYWRsaW5rKHBhdGgsIHNiLT5idWYsIGhpbnQpOworCQlpZiAobGVuIDwgMCkgeworCQkJaWYgKGVycm5vICE9IEVSQU5HRSkKKwkJCQlicmVhazsKKwkJfSBlbHNlIGlmIChsZW4gPCBoaW50KSB7CisJCQlzdHJidWZfc2V0bGVuKHNiLCBsZW4pOworCQkJcmV0dXJuIDA7CisJCX0KKworCQkvKiAuLiB0aGUgYnVmZmVyIHdhcyB0b28gc21hbGwgLSB0cnkgYWdhaW4gKi8KKwkJaGludCAqPSAyOworCX0KKwlpZiAob2xkYWxsb2MgPT0gMCkKKwkJc3RyYnVmX3JlbGVhc2Uoc2IpOworCXJldHVybiAtMTsKK30KKworaW50IHN0cmJ1Zl9nZXRsaW5lKHN0cnVjdCBzdHJidWYgKnNiLCBGSUxFICpmcCwgaW50IHRlcm0pCit7CisJaW50IGNoOworCisJc3RyYnVmX2dyb3coc2IsIDApOworCWlmIChmZW9mKGZwKSkKKwkJcmV0dXJuIEVPRjsKKworCXN0cmJ1Zl9yZXNldChzYik7CisJd2hpbGUgKChjaCA9IGZnZXRjKGZwKSkgIT0gRU9GKSB7CisJCWlmIChjaCA9PSB0ZXJtKQorCQkJYnJlYWs7CisJCXN0cmJ1Zl9ncm93KHNiLCAxKTsKKwkJc2ItPmJ1ZltzYi0+bGVuKytdID0gY2g7CisJfQorCWlmIChjaCA9PSBFT0YgJiYgc2ItPmxlbiA9PSAwKQorCQlyZXR1cm4gRU9GOworCisJc2ItPmJ1ZltzYi0+bGVuXSA9ICdcMCc7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzdHJidWZfcmVhZF9maWxlKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgaGludCkKK3sKKwlpbnQgZmQsIGxlbjsKKworCWZkID0gb3BlbihwYXRoLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCkKKwkJcmV0dXJuIC0xOworCWxlbiA9IHN0cmJ1Zl9yZWFkKHNiLCBmZCwgaGludCk7CisJY2xvc2UoZmQpOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gbGVuOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5oIGIvdG9vbHMvcGVyZi91dGlsL3N0cmJ1Zi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZTkwOGEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvc3RyYnVmLmgKQEAgLTAsMCArMSwxMzcgQEAKKyNpZm5kZWYgU1RSQlVGX0gKKyNkZWZpbmUgU1RSQlVGX0gKKworLyoKKyAqIFN0cmJ1ZidzIGNhbiBiZSB1c2UgaW4gbWFueSB3YXlzOiBhcyBhIGJ5dGUgYXJyYXksIG9yIHRvIHN0b3JlIGFyYml0cmFyeQorICogbG9uZywgb3ZlcmZsb3cgc2FmZSBzdHJpbmdzLgorICoKKyAqIFN0cmJ1ZnMgaGFzIHNvbWUgaW52YXJpYW50cyB0aGF0IGFyZSB2ZXJ5IGltcG9ydGFudCB0byBrZWVwIGluIG1pbmQ6CisgKgorICogMS4gdGhlIC0+YnVmIG1lbWJlciBpcyBhbHdheXMgbWFsbG9jLWVkLCBoZW5jZSBzdHJidWYncyBjYW4gYmUgdXNlZCB0bworICogICAgYnVpbGQgY29tcGxleCBzdHJpbmdzL2J1ZmZlcnMgd2hvc2UgZmluYWwgc2l6ZSBpc24ndCBlYXNpbHkga25vd24uCisgKgorICogICAgSXQgaXMgTk9UIGxlZ2FsIHRvIGNvcHkgdGhlIC0+YnVmIHBvaW50ZXIgYXdheS4KKyAqICAgIGBzdHJidWZfZGV0YWNoJyBpcyB0aGUgb3BlcmF0aW9uIHRoYXQgZGV0YWNocyBhIGJ1ZmZlciBmcm9tIGl0cyBzaGVsbAorICogICAgd2hpbGUga2VlcGluZyB0aGUgc2hlbGwgdmFsaWQgd3J0IGl0cyBpbnZhcmlhbnRzLgorICoKKyAqIDIuIHRoZSAtPmJ1ZiBtZW1iZXIgaXMgYSBieXRlIGFycmF5IHRoYXQgaGFzIGF0IGxlYXN0IC0+bGVuICsgMSBieXRlcworICogICAgYWxsb2NhdGVkLiBUaGUgZXh0cmEgYnl0ZSBpcyB1c2VkIHRvIHN0b3JlIGEgJ1wwJywgYWxsb3dpbmcgdGhlIC0+YnVmCisgKiAgICBtZW1iZXIgdG8gYmUgYSB2YWxpZCBDLXN0cmluZy4gRXZlcnkgc3RyYnVmIGZ1bmN0aW9uIGVuc3VyZSB0aGlzCisgKiAgICBpbnZhcmlhbnQgaXMgcHJlc2VydmVkLgorICoKKyAqICAgIE5vdGUgdGhhdCBpdCBpcyBPSyB0byAicGxheSIgd2l0aCB0aGUgYnVmZmVyIGRpcmVjdGx5IGlmIHlvdSB3b3JrIGl0CisgKiAgICB0aGF0IHdheToKKyAqCisgKiAgICBzdHJidWZfZ3JvdyhzYiwgU09NRV9TSVpFKTsKKyAqICAgICAgIC4uLiBIZXJlLCB0aGUgbWVtb3J5IGFycmF5IHN0YXJ0aW5nIGF0IHNiLT5idWYsIGFuZCBvZiBsZW5ndGgKKyAqICAgICAgIC4uLiBzdHJidWZfYXZhaWwoc2IpIGlzIGFsbCB5b3VycywgYW5kIHlvdSBhcmUgc3VyZSB0aGF0CisgKiAgICAgICAuLi4gc3RyYnVmX2F2YWlsKHNiKSBpcyBhdCBsZWFzdCBTT01FX1NJWkUuCisgKiAgICBzdHJidWZfc2V0bGVuKHNiLCBzYi0+bGVuICsgU09NRV9PVEhFUl9TSVpFKTsKKyAqCisgKiAgICBPZiBjb3Vyc2UsIFNPTUVfT1RIRVJfU0laRSBtdXN0IGJlIHNtYWxsZXIgb3IgZXF1YWwgdG8gc3RyYnVmX2F2YWlsKHNiKS4KKyAqCisgKiAgICBEb2luZyBzbyBpcyBzYWZlLCB0aG91Z2ggaWYgaXQgaGFzIHRvIGJlIGRvbmUgaW4gbWFueSBwbGFjZXMsIGFkZGluZyB0aGUKKyAqICAgIG1pc3NpbmcgQVBJIHRvIHRoZSBzdHJidWYgbW9kdWxlIGlzIHRoZSB3YXkgdG8gZ28uCisgKgorICogICAgWFhYOiBkbyBfbm90XyBhc3N1bWUgdGhhdCB0aGUgYXJlYSB0aGF0IGlzIHlvdXJzIGlzIG9mIHNpemUgLT5hbGxvYyAtIDEKKyAqICAgICAgICAgZXZlbiBpZiBpdCdzIHRydWUgaW4gdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uIEFsbG9jIGlzIHNvbWVob3cgYQorICogICAgICAgICAicHJpdmF0ZSIgbWVtYmVyIHRoYXQgc2hvdWxkIG5vdCBiZSBtZXNzZWQgd2l0aC4KKyAqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK2V4dGVybiBjaGFyIHN0cmJ1Zl9zbG9wYnVmW107CitzdHJ1Y3Qgc3RyYnVmIHsKKwlzaXplX3QgYWxsb2M7CisJc2l6ZV90IGxlbjsKKwljaGFyICpidWY7Cit9OworCisjZGVmaW5lIFNUUkJVRl9JTklUICB7IDAsIDAsIHN0cmJ1Zl9zbG9wYnVmIH0KKworLyotLS0tLSBzdHJidWYgbGlmZSBjeWNsZSAtLS0tLSovCitleHRlcm4gdm9pZCBzdHJidWZfaW5pdChzdHJ1Y3Qgc3RyYnVmICosIHNpemVfdCk7CitleHRlcm4gdm9pZCBzdHJidWZfcmVsZWFzZShzdHJ1Y3Qgc3RyYnVmICopOworZXh0ZXJuIGNoYXIgKnN0cmJ1Zl9kZXRhY2goc3RydWN0IHN0cmJ1ZiAqLCBzaXplX3QgKik7CitleHRlcm4gdm9pZCBzdHJidWZfYXR0YWNoKHN0cnVjdCBzdHJidWYgKiwgdm9pZCAqLCBzaXplX3QsIHNpemVfdCk7CitzdGF0aWMgaW5saW5lIHZvaWQgc3RyYnVmX3N3YXAoc3RydWN0IHN0cmJ1ZiAqYSwgc3RydWN0IHN0cmJ1ZiAqYikgeworCXN0cnVjdCBzdHJidWYgdG1wID0gKmE7CisJKmEgPSAqYjsKKwkqYiA9IHRtcDsKK30KKworLyotLS0tLSBzdHJidWYgc2l6ZSByZWxhdGVkIC0tLS0tKi8KK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHN0cmJ1Zl9hdmFpbChjb25zdCBzdHJ1Y3Qgc3RyYnVmICpzYikgeworCXJldHVybiBzYi0+YWxsb2MgPyBzYi0+YWxsb2MgLSBzYi0+bGVuIC0gMSA6IDA7Cit9CisKK2V4dGVybiB2b2lkIHN0cmJ1Zl9ncm93KHN0cnVjdCBzdHJidWYgKiwgc2l6ZV90KTsKKworc3RhdGljIGlubGluZSB2b2lkIHN0cmJ1Zl9zZXRsZW4oc3RydWN0IHN0cmJ1ZiAqc2IsIHNpemVfdCBsZW4pIHsKKwlpZiAoIXNiLT5hbGxvYykKKwkJc3RyYnVmX2dyb3coc2IsIDApOworCWFzc2VydChsZW4gPCBzYi0+YWxsb2MpOworCXNiLT5sZW4gPSBsZW47CisJc2ItPmJ1ZltsZW5dID0gJ1wwJzsKK30KKyNkZWZpbmUgc3RyYnVmX3Jlc2V0KHNiKSAgc3RyYnVmX3NldGxlbihzYiwgMCkKKworLyotLS0tLSBjb250ZW50IHJlbGF0ZWQgLS0tLS0qLworZXh0ZXJuIHZvaWQgc3RyYnVmX3RyaW0oc3RydWN0IHN0cmJ1ZiAqKTsKK2V4dGVybiB2b2lkIHN0cmJ1Zl9ydHJpbShzdHJ1Y3Qgc3RyYnVmICopOworZXh0ZXJuIHZvaWQgc3RyYnVmX2x0cmltKHN0cnVjdCBzdHJidWYgKik7CitleHRlcm4gaW50IHN0cmJ1Zl9jbXAoY29uc3Qgc3RydWN0IHN0cmJ1ZiAqLCBjb25zdCBzdHJ1Y3Qgc3RyYnVmICopOworZXh0ZXJuIHZvaWQgc3RyYnVmX3RvbG93ZXIoc3RydWN0IHN0cmJ1ZiAqKTsKKworZXh0ZXJuIHN0cnVjdCBzdHJidWYgKipzdHJidWZfc3BsaXQoY29uc3Qgc3RydWN0IHN0cmJ1ZiAqLCBpbnQgZGVsaW0pOworZXh0ZXJuIHZvaWQgc3RyYnVmX2xpc3RfZnJlZShzdHJ1Y3Qgc3RyYnVmICoqKTsKKworLyotLS0tLSBhZGQgZGF0YSBpbiB5b3VyIGJ1ZmZlciAtLS0tLSovCitzdGF0aWMgaW5saW5lIHZvaWQgc3RyYnVmX2FkZGNoKHN0cnVjdCBzdHJidWYgKnNiLCBpbnQgYykgeworCXN0cmJ1Zl9ncm93KHNiLCAxKTsKKwlzYi0+YnVmW3NiLT5sZW4rK10gPSBjOworCXNiLT5idWZbc2ItPmxlbl0gPSAnXDAnOworfQorCitleHRlcm4gdm9pZCBzdHJidWZfaW5zZXJ0KHN0cnVjdCBzdHJidWYgKiwgc2l6ZV90IHBvcywgY29uc3Qgdm9pZCAqLCBzaXplX3QpOworZXh0ZXJuIHZvaWQgc3RyYnVmX3JlbW92ZShzdHJ1Y3Qgc3RyYnVmICosIHNpemVfdCBwb3MsIHNpemVfdCBsZW4pOworCisvKiBzcGxpY2UgcG9zLi5wb3MrbGVuIHdpdGggZ2l2ZW4gZGF0YSAqLworZXh0ZXJuIHZvaWQgc3RyYnVmX3NwbGljZShzdHJ1Y3Qgc3RyYnVmICosIHNpemVfdCBwb3MsIHNpemVfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKworZXh0ZXJuIHZvaWQgc3RyYnVmX2FkZChzdHJ1Y3Qgc3RyYnVmICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHJidWZfYWRkc3RyKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpzKSB7CisJc3RyYnVmX2FkZChzYiwgcywgc3RybGVuKHMpKTsKK30KK3N0YXRpYyBpbmxpbmUgdm9pZCBzdHJidWZfYWRkYnVmKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBzdHJ1Y3Qgc3RyYnVmICpzYjIpIHsKKwlzdHJidWZfYWRkKHNiLCBzYjItPmJ1Ziwgc2IyLT5sZW4pOworfQorZXh0ZXJuIHZvaWQgc3RyYnVmX2FkZGR1cChzdHJ1Y3Qgc3RyYnVmICpzYiwgc2l6ZV90IHBvcywgc2l6ZV90IGxlbik7CisKK3R5cGVkZWYgc2l6ZV90ICgqZXhwYW5kX2ZuX3QpIChzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGxhY2Vob2xkZXIsIHZvaWQgKmNvbnRleHQpOworZXh0ZXJuIHZvaWQgc3RyYnVmX2V4cGFuZChzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqZm9ybWF0LCBleHBhbmRfZm5fdCBmbiwgdm9pZCAqY29udGV4dCk7CitzdHJ1Y3Qgc3RyYnVmX2V4cGFuZF9kaWN0X2VudHJ5IHsKKwljb25zdCBjaGFyICpwbGFjZWhvbGRlcjsKKwljb25zdCBjaGFyICp2YWx1ZTsKK307CitleHRlcm4gc2l6ZV90IHN0cmJ1Zl9leHBhbmRfZGljdF9jYihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGxhY2Vob2xkZXIsIHZvaWQgKmNvbnRleHQpOworCitfX2F0dHJpYnV0ZV9fKChmb3JtYXQocHJpbnRmLDIsMykpKQorZXh0ZXJuIHZvaWQgc3RyYnVmX2FkZGYoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKworZXh0ZXJuIHNpemVfdCBzdHJidWZfZnJlYWQoc3RydWN0IHN0cmJ1ZiAqLCBzaXplX3QsIEZJTEUgKik7CisvKiBYWFg6IGlmIHJlYWQgZmFpbHMsIGFueSBwYXJ0aWFsIHJlYWQgaXMgdW5kb25lICovCitleHRlcm4gc3NpemVfdCBzdHJidWZfcmVhZChzdHJ1Y3Qgc3RyYnVmICosIGludCBmZCwgc2l6ZV90IGhpbnQpOworZXh0ZXJuIGludCBzdHJidWZfcmVhZF9maWxlKHN0cnVjdCBzdHJidWYgKnNiLCBjb25zdCBjaGFyICpwYXRoLCBzaXplX3QgaGludCk7CitleHRlcm4gaW50IHN0cmJ1Zl9yZWFkbGluayhzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqcGF0aCwgc2l6ZV90IGhpbnQpOworCitleHRlcm4gaW50IHN0cmJ1Zl9nZXRsaW5lKHN0cnVjdCBzdHJidWYgKiwgRklMRSAqLCBpbnQpOworCitleHRlcm4gdm9pZCBzdHJpcHNwYWNlKHN0cnVjdCBzdHJidWYgKmJ1ZiwgaW50IHNraXBfY29tbWVudHMpOworZXh0ZXJuIGludCBsYXVuY2hfZWRpdG9yKGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdHJidWYgKmJ1ZmZlciwgY29uc3QgY2hhciAqY29uc3QgKmVudik7CisKK2V4dGVybiBpbnQgc3RyYnVmX2JyYW5jaG5hbWUoc3RydWN0IHN0cmJ1ZiAqc2IsIGNvbnN0IGNoYXIgKm5hbWUpOworZXh0ZXJuIGludCBzdHJidWZfY2hlY2tfYnJhbmNoX3JlZihzdHJ1Y3Qgc3RyYnVmICpzYiwgY29uc3QgY2hhciAqbmFtZSk7CisKKyNlbmRpZiAvKiBTVFJCVUZfSCAqLwpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3N0cmluZy5jIGIvdG9vbHMvcGVyZi91dGlsL3N0cmluZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjMzNjMGMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9wZXJmL3V0aWwvc3RyaW5nLmMKQEAgLTAsMCArMSwzNCBAQAorI2luY2x1ZGUgInN0cmluZy5oIgorCitzdGF0aWMgaW50IGhleChjaGFyIGNoKQoreworCWlmICgoY2ggPj0gJzAnKSAmJiAoY2ggPD0gJzknKSkKKwkJcmV0dXJuIGNoIC0gJzAnOworCWlmICgoY2ggPj0gJ2EnKSAmJiAoY2ggPD0gJ2YnKSkKKwkJcmV0dXJuIGNoIC0gJ2EnICsgMTA7CisJaWYgKChjaCA+PSAnQScpICYmIChjaCA8PSAnRicpKQorCQlyZXR1cm4gY2ggLSAnQScgKyAxMDsKKwlyZXR1cm4gLTE7Cit9CisKKy8qCisgKiBXaGlsZSB3ZSBmaW5kIG5pY2UgaGV4IGNoYXJzLCBidWlsZCBhIGxvbmdfdmFsLgorICogUmV0dXJuIG51bWJlciBvZiBjaGFycyBwcm9jZXNzZWQuCisgKi8KK2ludCBoZXgydTY0KGNvbnN0IGNoYXIgKnB0ciwgX191NjQgKmxvbmdfdmFsKQoreworCWNvbnN0IGNoYXIgKnAgPSBwdHI7CisJKmxvbmdfdmFsID0gMDsKKworCXdoaWxlICgqcCkgeworCQljb25zdCBpbnQgaGV4X3ZhbCA9IGhleCgqcCk7CisKKwkJaWYgKGhleF92YWwgPCAwKQorCQkJYnJlYWs7CisKKwkJKmxvbmdfdmFsID0gKCpsb25nX3ZhbCA8PCA0KSB8IGhleF92YWw7CisJCXArKzsKKwl9CisKKwlyZXR1cm4gcCAtIHB0cjsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zdHJpbmcuaCBiL3Rvb2xzL3BlcmYvdXRpbC9zdHJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjgxMmMxCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N0cmluZy5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfUEVSRl9TVFJJTkdfSF8KKyNkZWZpbmUgX1BFUkZfU1RSSU5HX0hfCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorCitpbnQgaGV4MnU2NChjb25zdCBjaGFyICpwdHIsIF9fdTY0ICp2YWwpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWE1NWY4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3N5bWJvbC5jCkBAIC0wLDAgKzEsNjQxIEBACisjaW5jbHVkZSAidXRpbC5oIgorI2luY2x1ZGUgIi4uL3BlcmYuaCIKKyNpbmNsdWRlICJzdHJpbmcuaCIKKyNpbmNsdWRlICJzeW1ib2wuaCIKKworI2luY2x1ZGUgPGxpYmVsZi5oPgorI2luY2x1ZGUgPGdlbGYuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKworY29uc3QgY2hhciAqc3ltX2hpc3RfZmlsdGVyOworCitzdGF0aWMgc3RydWN0IHN5bWJvbCAqc3ltYm9sX19uZXcoX191NjQgc3RhcnQsIF9fdTY0IGxlbiwKKwkJCQkgIGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBwcml2X3NpemUsCisJCQkJICBfX3U2NCBvYmpfc3RhcnQsIGludCB2ZXJib3NlKQoreworCXNpemVfdCBuYW1lbGVuID0gc3RybGVuKG5hbWUpICsgMTsKKwlzdHJ1Y3Qgc3ltYm9sICpzZWxmID0gY2FsbG9jKDEsIHByaXZfc2l6ZSArIHNpemVvZigqc2VsZikgKyBuYW1lbGVuKTsKKworCWlmICghc2VsZikKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAodmVyYm9zZSA+PSAyKQorCQlwcmludGYoIm5ldyBzeW1ib2w6ICUwMTZMeCBbJTA4bHhdOiAlcywgaGlzdDogJXAsIG9ial9zdGFydDogJXBcbiIsCisJCQkoX191NjQpc3RhcnQsICh1bnNpZ25lZCBsb25nKWxlbiwgbmFtZSwgc2VsZi0+aGlzdCwgKHZvaWQgKikodW5zaWduZWQgbG9uZylvYmpfc3RhcnQpOworCisJc2VsZi0+b2JqX3N0YXJ0PSBvYmpfc3RhcnQ7CisJc2VsZi0+aGlzdCA9IE5VTEw7CisJc2VsZi0+aGlzdF9zdW0gPSAwOworCisJaWYgKHN5bV9oaXN0X2ZpbHRlciAmJiAhc3RyY21wKG5hbWUsIHN5bV9oaXN0X2ZpbHRlcikpCisJCXNlbGYtPmhpc3QgPSBjYWxsb2Moc2l6ZW9mKF9fdTY0KSwgbGVuKTsKKworCWlmIChwcml2X3NpemUpIHsKKwkJbWVtc2V0KHNlbGYsIDAsIHByaXZfc2l6ZSk7CisJCXNlbGYgPSAoKHZvaWQgKilzZWxmKSArIHByaXZfc2l6ZTsKKwl9CisJc2VsZi0+c3RhcnQgPSBzdGFydDsKKwlzZWxmLT5lbmQgICA9IHN0YXJ0ICsgbGVuIC0gMTsKKwltZW1jcHkoc2VsZi0+bmFtZSwgbmFtZSwgbmFtZWxlbik7CisKKwlyZXR1cm4gc2VsZjsKK30KKworc3RhdGljIHZvaWQgc3ltYm9sX19kZWxldGUoc3RydWN0IHN5bWJvbCAqc2VsZiwgdW5zaWduZWQgaW50IHByaXZfc2l6ZSkKK3sKKwlmcmVlKCgodm9pZCAqKXNlbGYpIC0gcHJpdl9zaXplKTsKK30KKworc3RhdGljIHNpemVfdCBzeW1ib2xfX2ZwcmludGYoc3RydWN0IHN5bWJvbCAqc2VsZiwgRklMRSAqZnApCit7CisJcmV0dXJuIGZwcmludGYoZnAsICIgJWxseC0lbGx4ICVzXG4iLAorCQkgICAgICAgc2VsZi0+c3RhcnQsIHNlbGYtPmVuZCwgc2VsZi0+bmFtZSk7Cit9CisKK3N0cnVjdCBkc28gKmRzb19fbmV3KGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCBzeW1fcHJpdl9zaXplKQoreworCXN0cnVjdCBkc28gKnNlbGYgPSBtYWxsb2Moc2l6ZW9mKCpzZWxmKSArIHN0cmxlbihuYW1lKSArIDEpOworCisJaWYgKHNlbGYgIT0gTlVMTCkgeworCQlzdHJjcHkoc2VsZi0+bmFtZSwgbmFtZSk7CisJCXNlbGYtPnN5bXMgPSBSQl9ST09UOworCQlzZWxmLT5zeW1fcHJpdl9zaXplID0gc3ltX3ByaXZfc2l6ZTsKKwkJc2VsZi0+ZmluZF9zeW1ib2wgPSBkc29fX2ZpbmRfc3ltYm9sOworCX0KKworCXJldHVybiBzZWxmOworfQorCitzdGF0aWMgdm9pZCBkc29fX2RlbGV0ZV9zeW1ib2xzKHN0cnVjdCBkc28gKnNlbGYpCit7CisJc3RydWN0IHN5bWJvbCAqcG9zOworCXN0cnVjdCByYl9ub2RlICpuZXh0ID0gcmJfZmlyc3QoJnNlbGYtPnN5bXMpOworCisJd2hpbGUgKG5leHQpIHsKKwkJcG9zID0gcmJfZW50cnkobmV4dCwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSk7CisJCW5leHQgPSByYl9uZXh0KCZwb3MtPnJiX25vZGUpOworCQlyYl9lcmFzZSgmcG9zLT5yYl9ub2RlLCAmc2VsZi0+c3ltcyk7CisJCXN5bWJvbF9fZGVsZXRlKHBvcywgc2VsZi0+c3ltX3ByaXZfc2l6ZSk7CisJfQorfQorCit2b2lkIGRzb19fZGVsZXRlKHN0cnVjdCBkc28gKnNlbGYpCit7CisJZHNvX19kZWxldGVfc3ltYm9scyhzZWxmKTsKKwlmcmVlKHNlbGYpOworfQorCitzdGF0aWMgdm9pZCBkc29fX2luc2VydF9zeW1ib2woc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCByYl9ub2RlICoqcCA9ICZzZWxmLT5zeW1zLnJiX25vZGU7CisJc3RydWN0IHJiX25vZGUgKnBhcmVudCA9IE5VTEw7CisJY29uc3QgX191NjQgaXAgPSBzeW0tPnN0YXJ0OworCXN0cnVjdCBzeW1ib2wgKnM7CisKKwl3aGlsZSAoKnAgIT0gTlVMTCkgeworCQlwYXJlbnQgPSAqcDsKKwkJcyA9IHJiX2VudHJ5KHBhcmVudCwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSk7CisJCWlmIChpcCA8IHMtPnN0YXJ0KQorCQkJcCA9ICYoKnApLT5yYl9sZWZ0OworCQllbHNlCisJCQlwID0gJigqcCktPnJiX3JpZ2h0OworCX0KKwlyYl9saW5rX25vZGUoJnN5bS0+cmJfbm9kZSwgcGFyZW50LCBwKTsKKwlyYl9pbnNlcnRfY29sb3IoJnN5bS0+cmJfbm9kZSwgJnNlbGYtPnN5bXMpOworfQorCitzdHJ1Y3Qgc3ltYm9sICpkc29fX2ZpbmRfc3ltYm9sKHN0cnVjdCBkc28gKnNlbGYsIF9fdTY0IGlwKQoreworCXN0cnVjdCByYl9ub2RlICpuOworCisJaWYgKHNlbGYgPT0gTlVMTCkKKwkJcmV0dXJuIE5VTEw7CisKKwluID0gc2VsZi0+c3ltcy5yYl9ub2RlOworCisJd2hpbGUgKG4pIHsKKwkJc3RydWN0IHN5bWJvbCAqcyA9IHJiX2VudHJ5KG4sIHN0cnVjdCBzeW1ib2wsIHJiX25vZGUpOworCisJCWlmIChpcCA8IHMtPnN0YXJ0KQorCQkJbiA9IG4tPnJiX2xlZnQ7CisJCWVsc2UgaWYgKGlwID4gcy0+ZW5kKQorCQkJbiA9IG4tPnJiX3JpZ2h0OworCQllbHNlCisJCQlyZXR1cm4gczsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc2l6ZV90IGRzb19fZnByaW50ZihzdHJ1Y3QgZHNvICpzZWxmLCBGSUxFICpmcCkKK3sKKwlzaXplX3QgcmV0ID0gZnByaW50ZihmcCwgImRzbzogJXNcbiIsIHNlbGYtPm5hbWUpOworCisJc3RydWN0IHJiX25vZGUgKm5kOworCWZvciAobmQgPSByYl9maXJzdCgmc2VsZi0+c3ltcyk7IG5kOyBuZCA9IHJiX25leHQobmQpKSB7CisJCXN0cnVjdCBzeW1ib2wgKnBvcyA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKKwkJcmV0ICs9IHN5bWJvbF9fZnByaW50Zihwb3MsIGZwKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzb19fbG9hZF9rYWxsc3ltcyhzdHJ1Y3QgZHNvICpzZWxmLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQgdmVyYm9zZSkKK3sKKwlzdHJ1Y3QgcmJfbm9kZSAqbmQsICpwcmV2bmQ7CisJY2hhciAqbGluZSA9IE5VTEw7CisJc2l6ZV90IG47CisJRklMRSAqZmlsZSA9IGZvcGVuKCIvcHJvYy9rYWxsc3ltcyIsICJyIik7CisKKwlpZiAoZmlsZSA9PSBOVUxMKQorCQlnb3RvIG91dF9mYWlsdXJlOworCisJd2hpbGUgKCFmZW9mKGZpbGUpKSB7CisJCV9fdTY0IHN0YXJ0OworCQlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJCWludCBsaW5lX2xlbiwgbGVuOworCQljaGFyIHN5bWJvbF90eXBlOworCisJCWxpbmVfbGVuID0gZ2V0bGluZSgmbGluZSwgJm4sIGZpbGUpOworCQlpZiAobGluZV9sZW4gPCAwKQorCQkJYnJlYWs7CisKKwkJaWYgKCFsaW5lKQorCQkJZ290byBvdXRfZmFpbHVyZTsKKworCQlsaW5lWy0tbGluZV9sZW5dID0gJ1wwJzsgLyogXG4gKi8KKworCQlsZW4gPSBoZXgydTY0KGxpbmUsICZzdGFydCk7CisKKwkJbGVuKys7CisJCWlmIChsZW4gKyAyID49IGxpbmVfbGVuKQorCQkJY29udGludWU7CisKKwkJc3ltYm9sX3R5cGUgPSB0b3VwcGVyKGxpbmVbbGVuXSk7CisJCS8qCisJCSAqIFdlJ3JlIGludGVyZXN0ZWQgb25seSBpbiBjb2RlICgnVCdleHQpCisJCSAqLworCQlpZiAoc3ltYm9sX3R5cGUgIT0gJ1QnICYmIHN5bWJvbF90eXBlICE9ICdXJykKKwkJCWNvbnRpbnVlOworCQkvKgorCQkgKiBXZWxsIGZpeCB1cCB0aGUgZW5kIGxhdGVyLCB3aGVuIHdlIGhhdmUgYWxsIHNvcnRlZC4KKwkJICovCisJCXN5bSA9IHN5bWJvbF9fbmV3KHN0YXJ0LCAweGRlYWQsIGxpbmUgKyBsZW4gKyAyLAorCQkJCSAgc2VsZi0+c3ltX3ByaXZfc2l6ZSwgMCwgdmVyYm9zZSk7CisKKwkJaWYgKHN5bSA9PSBOVUxMKQorCQkJZ290byBvdXRfZGVsZXRlX2xpbmU7CisKKwkJaWYgKGZpbHRlciAmJiBmaWx0ZXIoc2VsZiwgc3ltKSkKKwkJCXN5bWJvbF9fZGVsZXRlKHN5bSwgc2VsZi0+c3ltX3ByaXZfc2l6ZSk7CisJCWVsc2UKKwkJCWRzb19faW5zZXJ0X3N5bWJvbChzZWxmLCBzeW0pOworCX0KKworCS8qCisJICogTm93IHRoYXQgd2UgaGF2ZSBhbGwgc29ydGVkIG91dCwganVzdCBzZXQgdGhlIC0+ZW5kIG9mIGFsbAorCSAqIHN5bWJvbHMKKwkgKi8KKwlwcmV2bmQgPSByYl9maXJzdCgmc2VsZi0+c3ltcyk7CisKKwlpZiAocHJldm5kID09IE5VTEwpCisJCWdvdG8gb3V0X2RlbGV0ZV9saW5lOworCisJZm9yIChuZCA9IHJiX25leHQocHJldm5kKTsgbmQ7IG5kID0gcmJfbmV4dChuZCkpIHsKKwkJc3RydWN0IHN5bWJvbCAqcHJldiA9IHJiX2VudHJ5KHByZXZuZCwgc3RydWN0IHN5bWJvbCwgcmJfbm9kZSksCisJCQkgICAgICAqY3VyciA9IHJiX2VudHJ5KG5kLCBzdHJ1Y3Qgc3ltYm9sLCByYl9ub2RlKTsKKworCQlwcmV2LT5lbmQgPSBjdXJyLT5zdGFydCAtIDE7CisJCXByZXZuZCA9IG5kOworCX0KKworCWZyZWUobGluZSk7CisJZmNsb3NlKGZpbGUpOworCisJcmV0dXJuIDA7CisKK291dF9kZWxldGVfbGluZToKKwlmcmVlKGxpbmUpOworb3V0X2ZhaWx1cmU6CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgaW50IGRzb19fbG9hZF9wZXJmX21hcChzdHJ1Y3QgZHNvICpzZWxmLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQgdmVyYm9zZSkKK3sKKwljaGFyICpsaW5lID0gTlVMTDsKKwlzaXplX3QgbjsKKwlGSUxFICpmaWxlOworCWludCBucl9zeW1zID0gMDsKKworCWZpbGUgPSBmb3BlbihzZWxmLT5uYW1lLCAiciIpOworCWlmIChmaWxlID09IE5VTEwpCisJCWdvdG8gb3V0X2ZhaWx1cmU7CisKKwl3aGlsZSAoIWZlb2YoZmlsZSkpIHsKKwkJX191NjQgc3RhcnQsIHNpemU7CisJCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwkJaW50IGxpbmVfbGVuLCBsZW47CisKKwkJbGluZV9sZW4gPSBnZXRsaW5lKCZsaW5lLCAmbiwgZmlsZSk7CisJCWlmIChsaW5lX2xlbiA8IDApCisJCQlicmVhazsKKworCQlpZiAoIWxpbmUpCisJCQlnb3RvIG91dF9mYWlsdXJlOworCisJCWxpbmVbLS1saW5lX2xlbl0gPSAnXDAnOyAvKiBcbiAqLworCisJCWxlbiA9IGhleDJ1NjQobGluZSwgJnN0YXJ0KTsKKworCQlsZW4rKzsKKwkJaWYgKGxlbiArIDIgPj0gbGluZV9sZW4pCisJCQljb250aW51ZTsKKworCQlsZW4gKz0gaGV4MnU2NChsaW5lICsgbGVuLCAmc2l6ZSk7CisKKwkJbGVuKys7CisJCWlmIChsZW4gKyAyID49IGxpbmVfbGVuKQorCQkJY29udGludWU7CisKKwkJc3ltID0gc3ltYm9sX19uZXcoc3RhcnQsIHNpemUsIGxpbmUgKyBsZW4sCisJCQkJICBzZWxmLT5zeW1fcHJpdl9zaXplLCBzdGFydCwgdmVyYm9zZSk7CisKKwkJaWYgKHN5bSA9PSBOVUxMKQorCQkJZ290byBvdXRfZGVsZXRlX2xpbmU7CisKKwkJaWYgKGZpbHRlciAmJiBmaWx0ZXIoc2VsZiwgc3ltKSkKKwkJCXN5bWJvbF9fZGVsZXRlKHN5bSwgc2VsZi0+c3ltX3ByaXZfc2l6ZSk7CisJCWVsc2UgeworCQkJZHNvX19pbnNlcnRfc3ltYm9sKHNlbGYsIHN5bSk7CisJCQlucl9zeW1zKys7CisJCX0KKwl9CisKKwlmcmVlKGxpbmUpOworCWZjbG9zZShmaWxlKTsKKworCXJldHVybiBucl9zeW1zOworCitvdXRfZGVsZXRlX2xpbmU6CisJZnJlZShsaW5lKTsKK291dF9mYWlsdXJlOgorCXJldHVybiAtMTsKK30KKworLyoqCisgKiBlbGZfc3ltdGFiX19mb3JfZWFjaF9zeW1ib2wgLSBpdGVyYXRlIHRocnUgYWxsIHRoZSBzeW1ib2xzCisgKgorICogQHNlbGY6IHN0cnVjdCBlbGZfc3ltdGFiIGluc3RhbmNlIHRvIGl0ZXJhdGUKKyAqIEBpbmRleDogdWludDMyX3QgaW5kZXgKKyAqIEBzeW06IEdFbGZfU3ltIGl0ZXJhdG9yCisgKi8KKyNkZWZpbmUgZWxmX3N5bXRhYl9fZm9yX2VhY2hfc3ltYm9sKHN5bXMsIG5yX3N5bXMsIGluZGV4LCBzeW0pIFwKKwlmb3IgKGluZGV4ID0gMCwgZ2VsZl9nZXRzeW0oc3ltcywgaW5kZXgsICZzeW0pO1wKKwkgICAgIGluZGV4IDwgbnJfc3ltczsgXAorCSAgICAgaW5kZXgrKywgZ2VsZl9nZXRzeW0oc3ltcywgaW5kZXgsICZzeW0pKQorCitzdGF0aWMgaW5saW5lIHVpbnQ4X3QgZWxmX3N5bV9fdHlwZShjb25zdCBHRWxmX1N5bSAqc3ltKQoreworCXJldHVybiBHRUxGX1NUX1RZUEUoc3ltLT5zdF9pbmZvKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgZWxmX3N5bV9faXNfZnVuY3Rpb24oY29uc3QgR0VsZl9TeW0gKnN5bSkKK3sKKwlyZXR1cm4gZWxmX3N5bV9fdHlwZShzeW0pID09IFNUVF9GVU5DICYmCisJICAgICAgIHN5bS0+c3RfbmFtZSAhPSAwICYmCisJICAgICAgIHN5bS0+c3Rfc2huZHggIT0gU0hOX1VOREVGICYmCisJICAgICAgIHN5bS0+c3Rfc2l6ZSAhPSAwOworfQorCitzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKmVsZl9zeW1fX25hbWUoY29uc3QgR0VsZl9TeW0gKnN5bSwKKwkJCQkJY29uc3QgRWxmX0RhdGEgKnN5bXN0cnMpCit7CisJcmV0dXJuIHN5bXN0cnMtPmRfYnVmICsgc3ltLT5zdF9uYW1lOworfQorCitzdGF0aWMgRWxmX1NjbiAqZWxmX3NlY3Rpb25fYnlfbmFtZShFbGYgKmVsZiwgR0VsZl9FaGRyICplcCwKKwkJCQkgICAgR0VsZl9TaGRyICpzaHAsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkJICAgIHNpemVfdCAqaW5kZXgpCit7CisJRWxmX1NjbiAqc2VjID0gTlVMTDsKKwlzaXplX3QgY250ID0gMTsKKworCXdoaWxlICgoc2VjID0gZWxmX25leHRzY24oZWxmLCBzZWMpKSAhPSBOVUxMKSB7CisJCWNoYXIgKnN0cjsKKworCQlnZWxmX2dldHNoZHIoc2VjLCBzaHApOworCQlzdHIgPSBlbGZfc3RycHRyKGVsZiwgZXAtPmVfc2hzdHJuZHgsIHNocC0+c2hfbmFtZSk7CisJCWlmICghc3RyY21wKG5hbWUsIHN0cikpIHsKKwkJCWlmIChpbmRleCkKKwkJCQkqaW5kZXggPSBjbnQ7CisJCQlicmVhazsKKwkJfQorCQkrK2NudDsKKwl9CisKKwlyZXR1cm4gc2VjOworfQorCisjZGVmaW5lIGVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWwocmVsZGF0YSwgcG9zLCBwb3NfbWVtLCBpZHgsIG5yX2VudHJpZXMpIFwKKwlmb3IgKGlkeCA9IDAsIHBvcyA9IGdlbGZfZ2V0cmVsKHJlbGRhdGEsIDAsICZwb3NfbWVtKTsgXAorCSAgICAgaWR4IDwgbnJfZW50cmllczsgXAorCSAgICAgKytpZHgsIHBvcyA9IGdlbGZfZ2V0cmVsKHJlbGRhdGEsIGlkeCwgJnBvc19tZW0pKQorCisjZGVmaW5lIGVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWxhKHJlbGRhdGEsIHBvcywgcG9zX21lbSwgaWR4LCBucl9lbnRyaWVzKSBcCisJZm9yIChpZHggPSAwLCBwb3MgPSBnZWxmX2dldHJlbGEocmVsZGF0YSwgMCwgJnBvc19tZW0pOyBcCisJICAgICBpZHggPCBucl9lbnRyaWVzOyBcCisJICAgICArK2lkeCwgcG9zID0gZ2VsZl9nZXRyZWxhKHJlbGRhdGEsIGlkeCwgJnBvc19tZW0pKQorCitzdGF0aWMgaW50IGRzb19fc3ludGhlc2l6ZV9wbHRfc3ltYm9scyhzdHJ1Y3QgIGRzbyAqc2VsZiwgRWxmICplbGYsCisJCQkJICAgICAgIEdFbGZfRWhkciAqZWhkciwgRWxmX1NjbiAqc2NuX2R5bnN5bSwKKwkJCQkgICAgICAgR0VsZl9TaGRyICpzaGRyX2R5bnN5bSwKKwkJCQkgICAgICAgc2l6ZV90IGR5bnN5bV9pZHgsIGludCB2ZXJib3NlKQoreworCXVpbnQzMl90IG5yX3JlbF9lbnRyaWVzLCBpZHg7CisJR0VsZl9TeW0gc3ltOworCV9fdTY0IHBsdF9vZmZzZXQ7CisJR0VsZl9TaGRyIHNoZHJfcGx0OworCXN0cnVjdCBzeW1ib2wgKmY7CisJR0VsZl9TaGRyIHNoZHJfcmVsX3BsdDsKKwlFbGZfRGF0YSAqcmVsZGF0YSwgKnN5bXMsICpzeW1zdHJzOworCUVsZl9TY24gKnNjbl9wbHRfcmVsLCAqc2NuX3N5bXN0cnM7CisJY2hhciBzeW1wbHRuYW1lWzEwMjRdOworCWludCBuciA9IDAsIHN5bWlkeDsKKworCXNjbl9wbHRfcmVsID0gZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsIGVoZHIsICZzaGRyX3JlbF9wbHQsCisJCQkJCSAgIi5yZWxhLnBsdCIsIE5VTEwpOworCWlmIChzY25fcGx0X3JlbCA9PSBOVUxMKSB7CisJCXNjbl9wbHRfcmVsID0gZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsIGVoZHIsICZzaGRyX3JlbF9wbHQsCisJCQkJCQkgICIucmVsLnBsdCIsIE5VTEwpOworCQlpZiAoc2NuX3BsdF9yZWwgPT0gTlVMTCkKKwkJCXJldHVybiAwOworCX0KKworCWlmIChzaGRyX3JlbF9wbHQuc2hfbGluayAhPSBkeW5zeW1faWR4KQorCQlyZXR1cm4gMDsKKworCWlmIChlbGZfc2VjdGlvbl9ieV9uYW1lKGVsZiwgZWhkciwgJnNoZHJfcGx0LCAiLnBsdCIsIE5VTEwpID09IE5VTEwpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBGZXRjaCB0aGUgcmVsb2NhdGlvbiBzZWN0aW9uIHRvIGZpbmQgdGhlIGluZGV4ZXMgdG8gdGhlIEdPVAorCSAqIGFuZCB0aGUgc3ltYm9scyBpbiB0aGUgLmR5bnN5bSB0aGV5IHJlZmVyIHRvLgorCSAqLworCXJlbGRhdGEgPSBlbGZfZ2V0ZGF0YShzY25fcGx0X3JlbCwgTlVMTCk7CisJaWYgKHJlbGRhdGEgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc3ltcyA9IGVsZl9nZXRkYXRhKHNjbl9keW5zeW0sIE5VTEwpOworCWlmIChzeW1zID09IE5VTEwpCisJCXJldHVybiAtMTsKKworCXNjbl9zeW1zdHJzID0gZWxmX2dldHNjbihlbGYsIHNoZHJfZHluc3ltLT5zaF9saW5rKTsKKwlpZiAoc2NuX3N5bXN0cnMgPT0gTlVMTCkKKwkJcmV0dXJuIC0xOworCisJc3ltc3RycyA9IGVsZl9nZXRkYXRhKHNjbl9zeW1zdHJzLCBOVUxMKTsKKwlpZiAoc3ltc3RycyA9PSBOVUxMKQorCQlyZXR1cm4gLTE7CisKKwlucl9yZWxfZW50cmllcyA9IHNoZHJfcmVsX3BsdC5zaF9zaXplIC8gc2hkcl9yZWxfcGx0LnNoX2VudHNpemU7CisJcGx0X29mZnNldCA9IHNoZHJfcGx0LnNoX29mZnNldDsKKworCWlmIChzaGRyX3JlbF9wbHQuc2hfdHlwZSA9PSBTSFRfUkVMQSkgeworCQlHRWxmX1JlbGEgcG9zX21lbSwgKnBvczsKKworCQllbGZfc2VjdGlvbl9fZm9yX2VhY2hfcmVsYShyZWxkYXRhLCBwb3MsIHBvc19tZW0sIGlkeCwKKwkJCQkJICAgbnJfcmVsX2VudHJpZXMpIHsKKwkJCXN5bWlkeCA9IEdFTEZfUl9TWU0ocG9zLT5yX2luZm8pOworCQkJcGx0X29mZnNldCArPSBzaGRyX3BsdC5zaF9lbnRzaXplOworCQkJZ2VsZl9nZXRzeW0oc3ltcywgc3ltaWR4LCAmc3ltKTsKKwkJCXNucHJpbnRmKHN5bXBsdG5hbWUsIHNpemVvZihzeW1wbHRuYW1lKSwKKwkJCQkgIiVzQHBsdCIsIGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3RycykpOworCisJCQlmID0gc3ltYm9sX19uZXcocGx0X29mZnNldCwgc2hkcl9wbHQuc2hfZW50c2l6ZSwKKwkJCQkJc3ltcGx0bmFtZSwgc2VsZi0+c3ltX3ByaXZfc2l6ZSwgMCwgdmVyYm9zZSk7CisJCQlpZiAoIWYpCisJCQkJcmV0dXJuIC0xOworCisJCQlkc29fX2luc2VydF9zeW1ib2woc2VsZiwgZik7CisJCQkrK25yOworCQl9CisJfSBlbHNlIGlmIChzaGRyX3JlbF9wbHQuc2hfdHlwZSA9PSBTSFRfUkVMKSB7CisJCUdFbGZfUmVsIHBvc19tZW0sICpwb3M7CisJCWVsZl9zZWN0aW9uX19mb3JfZWFjaF9yZWwocmVsZGF0YSwgcG9zLCBwb3NfbWVtLCBpZHgsCisJCQkJCSAgbnJfcmVsX2VudHJpZXMpIHsKKwkJCXN5bWlkeCA9IEdFTEZfUl9TWU0ocG9zLT5yX2luZm8pOworCQkJcGx0X29mZnNldCArPSBzaGRyX3BsdC5zaF9lbnRzaXplOworCQkJZ2VsZl9nZXRzeW0oc3ltcywgc3ltaWR4LCAmc3ltKTsKKwkJCXNucHJpbnRmKHN5bXBsdG5hbWUsIHNpemVvZihzeW1wbHRuYW1lKSwKKwkJCQkgIiVzQHBsdCIsIGVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3RycykpOworCisJCQlmID0gc3ltYm9sX19uZXcocGx0X29mZnNldCwgc2hkcl9wbHQuc2hfZW50c2l6ZSwKKwkJCQkJc3ltcGx0bmFtZSwgc2VsZi0+c3ltX3ByaXZfc2l6ZSwgMCwgdmVyYm9zZSk7CisJCQlpZiAoIWYpCisJCQkJcmV0dXJuIC0xOworCisJCQlkc29fX2luc2VydF9zeW1ib2woc2VsZiwgZik7CisJCQkrK25yOworCQl9CisJfSBlbHNlIHsKKwkJLyoKKwkJICogVE9ETzogVGhlcmUgYXJlIHN0aWxsIG9uZSBtb3JlIHNoZHJfcmVsX3BsdC5zaF90eXBlCisJCSAqIEkgaGF2ZSB0byBpbnZlc3RpZ2F0ZSwgYnV0IHByb2JhYmx5IHNob3VsZCBiZSBpZ25vcmVkLgorCQkgKi8KKwl9CisKKwlyZXR1cm4gbnI7Cit9CisKK3N0YXRpYyBpbnQgZHNvX19sb2FkX3N5bShzdHJ1Y3QgZHNvICpzZWxmLCBpbnQgZmQsIGNvbnN0IGNoYXIgKm5hbWUsCisJCQkgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwgaW50IHZlcmJvc2UpCit7CisJRWxmX0RhdGEgKnN5bXN0cnM7CisJdWludDMyX3QgbnJfc3ltczsKKwlpbnQgZXJyID0gLTE7CisJdWludDMyX3QgaW5kZXg7CisJR0VsZl9FaGRyIGVoZHI7CisJR0VsZl9TaGRyIHNoZHI7CisJRWxmX0RhdGEgKnN5bXM7CisJR0VsZl9TeW0gc3ltOworCUVsZl9TY24gKnNlYywgKnNlY19keW5zeW07CisJRWxmICplbGY7CisJc2l6ZV90IGR5bnN5bV9pZHg7CisJaW50IG5yID0gMDsKKworCWVsZiA9IGVsZl9iZWdpbihmZCwgRUxGX0NfUkVBRF9NTUFQLCBOVUxMKTsKKwlpZiAoZWxmID09IE5VTEwpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgcmVhZCAlcyBFTEYgZmlsZS5cbiIsCisJCQkJX19mdW5jX18sIG5hbWUpOworCQlnb3RvIG91dF9jbG9zZTsKKwl9CisKKwlpZiAoZ2VsZl9nZXRlaGRyKGVsZiwgJmVoZHIpID09IE5VTEwpIHsKKwkJaWYgKHZlcmJvc2UpCisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiBjYW5ub3QgZ2V0IGVsZiBoZWFkZXIuXG4iLCBfX2Z1bmNfXyk7CisJCWdvdG8gb3V0X2VsZl9lbmQ7CisJfQorCisJLyoKKwkgKiBXZSBuZWVkIHRvIGNoZWNrIGlmIHdlIGhhdmUgYSAuZHluc3ltLCBzbyB0aGF0IHdlIGNhbiBoYW5kbGUgdGhlCisJICogLnBsdCwgc3ludGhlc2l6aW5nIGl0cyBzeW1ib2xzLCB0aGF0IGFyZW4ndCBvbiB0aGUgc3ltdGFicyAoYmUgaXQKKwkgKiAuZHluc3ltIG9yIC5zeW10YWIpCisJICovCisJc2VjX2R5bnN5bSA9IGVsZl9zZWN0aW9uX2J5X25hbWUoZWxmLCAmZWhkciwgJnNoZHIsCisJCQkJCSAiLmR5bnN5bSIsICZkeW5zeW1faWR4KTsKKwlpZiAoc2VjX2R5bnN5bSAhPSBOVUxMKSB7CisJCW5yID0gZHNvX19zeW50aGVzaXplX3BsdF9zeW1ib2xzKHNlbGYsIGVsZiwgJmVoZHIsCisJCQkJCQkgc2VjX2R5bnN5bSwgJnNoZHIsCisJCQkJCQkgZHluc3ltX2lkeCwgdmVyYm9zZSk7CisJCWlmIChuciA8IDApCisJCQlnb3RvIG91dF9lbGZfZW5kOworCX0KKworCS8qCisJICogQnV0IGlmIHdlIGhhdmUgYSBmdWxsIC5zeW10YWIgKHRoYXQgaXMgYSBzdXBlcnNldCBvZiAuZHluc3ltKSB3ZQorCSAqIHNob3VsZCBhZGQgdGhlIHN5bWJvbHMgbm90IGluIHRoZSAuZHluc3luCisJICovCisJc2VjID0gZWxmX3NlY3Rpb25fYnlfbmFtZShlbGYsICZlaGRyLCAmc2hkciwgIi5zeW10YWIiLCBOVUxMKTsKKwlpZiAoc2VjID09IE5VTEwpIHsKKwkJaWYgKHNlY19keW5zeW0gPT0gTlVMTCkKKwkJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwkJc2VjID0gc2VjX2R5bnN5bTsKKwkJZ2VsZl9nZXRzaGRyKHNlYywgJnNoZHIpOworCX0KKworCXN5bXMgPSBlbGZfZ2V0ZGF0YShzZWMsIE5VTEwpOworCWlmIChzeW1zID09IE5VTEwpCisJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwlzZWMgPSBlbGZfZ2V0c2NuKGVsZiwgc2hkci5zaF9saW5rKTsKKwlpZiAoc2VjID09IE5VTEwpCisJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwlzeW1zdHJzID0gZWxmX2dldGRhdGEoc2VjLCBOVUxMKTsKKwlpZiAoc3ltc3RycyA9PSBOVUxMKQorCQlnb3RvIG91dF9lbGZfZW5kOworCisJbnJfc3ltcyA9IHNoZHIuc2hfc2l6ZSAvIHNoZHIuc2hfZW50c2l6ZTsKKworCW1lbXNldCgmc3ltLCAwLCBzaXplb2Yoc3ltKSk7CisKKwllbGZfc3ltdGFiX19mb3JfZWFjaF9zeW1ib2woc3ltcywgbnJfc3ltcywgaW5kZXgsIHN5bSkgeworCQlzdHJ1Y3Qgc3ltYm9sICpmOworCQlfX3U2NCBvYmpfc3RhcnQ7CisKKwkJaWYgKCFlbGZfc3ltX19pc19mdW5jdGlvbigmc3ltKSkKKwkJCWNvbnRpbnVlOworCisJCXNlYyA9IGVsZl9nZXRzY24oZWxmLCBzeW0uc3Rfc2huZHgpOworCQlpZiAoIXNlYykKKwkJCWdvdG8gb3V0X2VsZl9lbmQ7CisKKwkJZ2VsZl9nZXRzaGRyKHNlYywgJnNoZHIpOworCQlvYmpfc3RhcnQgPSBzeW0uc3RfdmFsdWU7CisKKwkJc3ltLnN0X3ZhbHVlIC09IHNoZHIuc2hfYWRkciAtIHNoZHIuc2hfb2Zmc2V0OworCisJCWYgPSBzeW1ib2xfX25ldyhzeW0uc3RfdmFsdWUsIHN5bS5zdF9zaXplLAorCQkJCWVsZl9zeW1fX25hbWUoJnN5bSwgc3ltc3RycyksCisJCQkJc2VsZi0+c3ltX3ByaXZfc2l6ZSwgb2JqX3N0YXJ0LCB2ZXJib3NlKTsKKwkJaWYgKCFmKQorCQkJZ290byBvdXRfZWxmX2VuZDsKKworCQlpZiAoZmlsdGVyICYmIGZpbHRlcihzZWxmLCBmKSkKKwkJCXN5bWJvbF9fZGVsZXRlKGYsIHNlbGYtPnN5bV9wcml2X3NpemUpOworCQllbHNlIHsKKwkJCWRzb19faW5zZXJ0X3N5bWJvbChzZWxmLCBmKTsKKwkJCW5yKys7CisJCX0KKwl9CisKKwllcnIgPSBucjsKK291dF9lbGZfZW5kOgorCWVsZl9lbmQoZWxmKTsKK291dF9jbG9zZToKKwlyZXR1cm4gZXJyOworfQorCitpbnQgZHNvX19sb2FkKHN0cnVjdCBkc28gKnNlbGYsIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIsIGludCB2ZXJib3NlKQoreworCWludCBzaXplID0gc3RybGVuKHNlbGYtPm5hbWUpICsgc2l6ZW9mKCIvdXNyL2xpYi9kZWJ1ZyVzLmRlYnVnIik7CisJY2hhciAqbmFtZSA9IG1hbGxvYyhzaXplKTsKKwlpbnQgdmFyaWFudCA9IDA7CisJaW50IHJldCA9IC0xOworCWludCBmZDsKKworCWlmICghbmFtZSkKKwkJcmV0dXJuIC0xOworCisJaWYgKHN0cm5jbXAoc2VsZi0+bmFtZSwgIi90bXAvcGVyZi0iLCAxMCkgPT0gMCkKKwkJcmV0dXJuIGRzb19fbG9hZF9wZXJmX21hcChzZWxmLCBmaWx0ZXIsIHZlcmJvc2UpOworCittb3JlOgorCWRvIHsKKwkJc3dpdGNoICh2YXJpYW50KSB7CisJCWNhc2UgMDogLyogRmVkb3JhICovCisJCQlzbnByaW50ZihuYW1lLCBzaXplLCAiL3Vzci9saWIvZGVidWclcy5kZWJ1ZyIsIHNlbGYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMTogLyogVWJ1bnR1ICovCisJCQlzbnByaW50ZihuYW1lLCBzaXplLCAiL3Vzci9saWIvZGVidWclcyIsIHNlbGYtPm5hbWUpOworCQkJYnJlYWs7CisJCWNhc2UgMjogLyogU2FuZSBwZW9wbGUgKi8KKwkJCXNucHJpbnRmKG5hbWUsIHNpemUsICIlcyIsIHNlbGYtPm5hbWUpOworCQkJYnJlYWs7CisKKwkJZGVmYXVsdDoKKwkJCWdvdG8gb3V0OworCQl9CisJCXZhcmlhbnQrKzsKKworCQlmZCA9IG9wZW4obmFtZSwgT19SRE9OTFkpOworCX0gd2hpbGUgKGZkIDwgMCk7CisKKwlyZXQgPSBkc29fX2xvYWRfc3ltKHNlbGYsIGZkLCBuYW1lLCBmaWx0ZXIsIHZlcmJvc2UpOworCWNsb3NlKGZkKTsKKworCS8qCisJICogU29tZSBwZW9wbGUgc2VlbSB0byBoYXZlIGRlYnVnaW5mbyBmaWxlcyBfV0lUSE9VVF8gZGVidWcgaW5mbyE/IT8KKwkgKi8KKwlpZiAoIXJldCkKKwkJZ290byBtb3JlOworCitvdXQ6CisJZnJlZShuYW1lKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGRzb19fbG9hZF92bWxpbnV4KHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKnZtbGludXgsCisJCQkgICAgIHN5bWJvbF9maWx0ZXJfdCBmaWx0ZXIsIGludCB2ZXJib3NlKQoreworCWludCBlcnIsIGZkID0gb3Blbih2bWxpbnV4LCBPX1JET05MWSk7CisKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwllcnIgPSBkc29fX2xvYWRfc3ltKHNlbGYsIGZkLCB2bWxpbnV4LCBmaWx0ZXIsIHZlcmJvc2UpOworCWNsb3NlKGZkKTsKKworCXJldHVybiBlcnI7Cit9CisKK2ludCBkc29fX2xvYWRfa2VybmVsKHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKnZtbGludXgsCisJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwgaW50IHZlcmJvc2UpCit7CisJaW50IGVyciA9IC0xOworCisJaWYgKHZtbGludXgpCisJCWVyciA9IGRzb19fbG9hZF92bWxpbnV4KHNlbGYsIHZtbGludXgsIGZpbHRlciwgdmVyYm9zZSk7CisKKwlpZiAoZXJyKQorCQllcnIgPSBkc29fX2xvYWRfa2FsbHN5bXMoc2VsZiwgZmlsdGVyLCB2ZXJib3NlKTsKKworCXJldHVybiBlcnI7Cit9CisKK3ZvaWQgc3ltYm9sX19pbml0KHZvaWQpCit7CisJZWxmX3ZlcnNpb24oRVZfQ1VSUkVOVCk7Cit9CmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvc3ltYm9sLmggYi90b29scy9wZXJmL3V0aWwvc3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQxMjkyYgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC9zeW1ib2wuaApAQCAtMCwwICsxLDQ3IEBACisjaWZuZGVmIF9QRVJGX1NZTUJPTF8KKyNkZWZpbmUgX1BFUkZfU1lNQk9MXyAxCisKKyNpbmNsdWRlIDxsaW51eC90eXBlcy5oPgorI2luY2x1ZGUgImxpc3QuaCIKKyNpbmNsdWRlICJyYnRyZWUuaCIKKworc3RydWN0IHN5bWJvbCB7CisJc3RydWN0IHJiX25vZGUJcmJfbm9kZTsKKwlfX3U2NAkJc3RhcnQ7CisJX191NjQJCWVuZDsKKwlfX3U2NAkJb2JqX3N0YXJ0OworCV9fdTY0CQloaXN0X3N1bTsKKwlfX3U2NAkJKmhpc3Q7CisJY2hhcgkJbmFtZVswXTsKK307CisKK3N0cnVjdCBkc28geworCXN0cnVjdCBsaXN0X2hlYWQgbm9kZTsKKwlzdHJ1Y3QgcmJfcm9vdAkgc3ltczsKKwl1bnNpZ25lZCBpbnQJIHN5bV9wcml2X3NpemU7CisJc3RydWN0IHN5bWJvbCAgICAqKCpmaW5kX3N5bWJvbCkoc3RydWN0IGRzbyAqLCBfX3U2NCBpcCk7CisJY2hhcgkJIG5hbWVbMF07Cit9OworCitjb25zdCBjaGFyICpzeW1faGlzdF9maWx0ZXI7CisKK3R5cGVkZWYgaW50ICgqc3ltYm9sX2ZpbHRlcl90KShzdHJ1Y3QgZHNvICpzZWxmLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworCitzdHJ1Y3QgZHNvICpkc29fX25ldyhjb25zdCBjaGFyICpuYW1lLCB1bnNpZ25lZCBpbnQgc3ltX3ByaXZfc2l6ZSk7Cit2b2lkIGRzb19fZGVsZXRlKHN0cnVjdCBkc28gKnNlbGYpOworCitzdGF0aWMgaW5saW5lIHZvaWQgKmRzb19fc3ltX3ByaXYoc3RydWN0IGRzbyAqc2VsZiwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiAoKHZvaWQgKilzeW0pIC0gc2VsZi0+c3ltX3ByaXZfc2l6ZTsKK30KKworc3RydWN0IHN5bWJvbCAqZHNvX19maW5kX3N5bWJvbChzdHJ1Y3QgZHNvICpzZWxmLCBfX3U2NCBpcCk7CisKK2ludCBkc29fX2xvYWRfa2VybmVsKHN0cnVjdCBkc28gKnNlbGYsIGNvbnN0IGNoYXIgKnZtbGludXgsCisJCSAgICAgc3ltYm9sX2ZpbHRlcl90IGZpbHRlciwgaW50IHZlcmJvc2UpOworaW50IGRzb19fbG9hZChzdHJ1Y3QgZHNvICpzZWxmLCBzeW1ib2xfZmlsdGVyX3QgZmlsdGVyLCBpbnQgdmVyYm9zZSk7CisKK3NpemVfdCBkc29fX2ZwcmludGYoc3RydWN0IGRzbyAqc2VsZiwgRklMRSAqZnApOworCit2b2lkIHN5bWJvbF9faW5pdCh2b2lkKTsKKyNlbmRpZiAvKiBfUEVSRl9TWU1CT0xfICovCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvdXNhZ2UuYyBiL3Rvb2xzL3BlcmYvdXRpbC91c2FnZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxNmJmOWE3Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3VzYWdlLmMKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIEdJVCAtIFRoZSBpbmZvcm1hdGlvbiBtYW5hZ2VyIGZyb20gaGVsbAorICoKKyAqIENvcHlyaWdodCAoQykgTGludXMgVG9ydmFsZHMsIDIwMDUKKyAqLworI2luY2x1ZGUgInV0aWwuaCIKKworc3RhdGljIHZvaWQgcmVwb3J0KGNvbnN0IGNoYXIgKnByZWZpeCwgY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykKK3sKKwljaGFyIG1zZ1sxMDI0XTsKKwl2c25wcmludGYobXNnLCBzaXplb2YobXNnKSwgZXJyLCBwYXJhbXMpOworCWZwcmludGYoc3RkZXJyLCAiICVzJXNcbiIsIHByZWZpeCwgbXNnKTsKK30KKworc3RhdGljIE5PUkVUVVJOIHZvaWQgdXNhZ2VfYnVpbHRpbihjb25zdCBjaGFyICplcnIpCit7CisJZnByaW50ZihzdGRlcnIsICJcbiBVc2FnZTogJXNcbiIsIGVycik7CisJZXhpdCgxMjkpOworfQorCitzdGF0aWMgTk9SRVRVUk4gdm9pZCBkaWVfYnVpbHRpbihjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKQoreworCXJlcG9ydCgiIEZhdGFsOiAiLCBlcnIsIHBhcmFtcyk7CisJZXhpdCgxMjgpOworfQorCitzdGF0aWMgdm9pZCBlcnJvcl9idWlsdGluKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpCit7CisJcmVwb3J0KCIgRXJyb3I6ICIsIGVyciwgcGFyYW1zKTsKK30KKworc3RhdGljIHZvaWQgd2Fybl9idWlsdGluKGNvbnN0IGNoYXIgKndhcm4sIHZhX2xpc3QgcGFyYW1zKQoreworCXJlcG9ydCgiIFdhcm5pbmc6ICIsIHdhcm4sIHBhcmFtcyk7Cit9CisKKy8qIElmIHdlIGFyZSBpbiBhIGRsb3BlbigpZWQgLnNvIHdyaXRlIHRvIGEgZ2xvYmFsIHZhcmlhYmxlIHdvdWxkIHNlZ2ZhdWx0CisgKiAodWdoKSwgc28ga2VlcCB0aGluZ3Mgc3RhdGljLiAqLworc3RhdGljIHZvaWQgKCp1c2FnZV9yb3V0aW5lKShjb25zdCBjaGFyICplcnIpIE5PUkVUVVJOID0gdXNhZ2VfYnVpbHRpbjsKK3N0YXRpYyB2b2lkICgqZGllX3JvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpIE5PUkVUVVJOID0gZGllX2J1aWx0aW47CitzdGF0aWMgdm9pZCAoKmVycm9yX3JvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpID0gZXJyb3JfYnVpbHRpbjsKK3N0YXRpYyB2b2lkICgqd2Fybl9yb3V0aW5lKShjb25zdCBjaGFyICplcnIsIHZhX2xpc3QgcGFyYW1zKSA9IHdhcm5fYnVpbHRpbjsKKwordm9pZCBzZXRfZGllX3JvdXRpbmUodm9pZCAoKnJvdXRpbmUpKGNvbnN0IGNoYXIgKmVyciwgdmFfbGlzdCBwYXJhbXMpIE5PUkVUVVJOKQoreworCWRpZV9yb3V0aW5lID0gcm91dGluZTsKK30KKwordm9pZCB1c2FnZShjb25zdCBjaGFyICplcnIpCit7CisJdXNhZ2Vfcm91dGluZShlcnIpOworfQorCit2b2lkIGRpZShjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwlkaWVfcm91dGluZShlcnIsIHBhcmFtcyk7CisJdmFfZW5kKHBhcmFtcyk7Cit9CisKK2ludCBlcnJvcihjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IHBhcmFtczsKKworCXZhX3N0YXJ0KHBhcmFtcywgZXJyKTsKKwllcnJvcl9yb3V0aW5lKGVyciwgcGFyYW1zKTsKKwl2YV9lbmQocGFyYW1zKTsKKwlyZXR1cm4gLTE7Cit9CisKK3ZvaWQgd2FybmluZyhjb25zdCBjaGFyICp3YXJuLCAuLi4pCit7CisJdmFfbGlzdCBwYXJhbXM7CisKKwl2YV9zdGFydChwYXJhbXMsIHdhcm4pOworCXdhcm5fcm91dGluZSh3YXJuLCBwYXJhbXMpOworCXZhX2VuZChwYXJhbXMpOworfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcGVyZi91dGlsL3V0aWwuaCBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY1OTBhMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3BlcmYvdXRpbC91dGlsLmgKQEAgLTAsMCArMSw0MTAgQEAKKyNpZm5kZWYgR0lUX0NPTVBBVF9VVElMX0gKKyNkZWZpbmUgR0lUX0NPTVBBVF9VVElMX0gKKworI2RlZmluZSBfRklMRV9PRkZTRVRfQklUUyA2NAorCisjaWZuZGVmIEZMRVhfQVJSQVkKKy8qCisgKiBTZWUgaWYgb3VyIGNvbXBpbGVyIGlzIGtub3duIHRvIHN1cHBvcnQgZmxleGlibGUgYXJyYXkgbWVtYmVycy4KKyAqLworI2lmIGRlZmluZWQoX19TVERDX1ZFUlNJT05fXykgJiYgKF9fU1REQ19WRVJTSU9OX18gPj0gMTk5OTAxTCkKKyMgZGVmaW5lIEZMRVhfQVJSQVkgLyogZW1wdHkgKi8KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pCisjIGlmIChfX0dOVUNfXyA+PSAzKQorIyAgZGVmaW5lIEZMRVhfQVJSQVkgLyogZW1wdHkgKi8KKyMgZWxzZQorIyAgZGVmaW5lIEZMRVhfQVJSQVkgMCAvKiBvbGRlciBHTlUgZXh0ZW5zaW9uICovCisjIGVuZGlmCisjZW5kaWYKKworLyoKKyAqIE90aGVyd2lzZSwgZGVmYXVsdCB0byBzYWZlciBidXQgYSBiaXQgd2FzdGVmdWwgdHJhZGl0aW9uYWwgc3R5bGUKKyAqLworI2lmbmRlZiBGTEVYX0FSUkFZCisjIGRlZmluZSBGTEVYX0FSUkFZIDEKKyNlbmRpZgorI2VuZGlmCisKKyNkZWZpbmUgQVJSQVlfU0laRSh4KSAoc2l6ZW9mKHgpL3NpemVvZih4WzBdKSkKKworI2lmZGVmIF9fR05VQ19fCisjZGVmaW5lIFRZUEVPRih4KSAoX190eXBlb2ZfXyh4KSkKKyNlbHNlCisjZGVmaW5lIFRZUEVPRih4KQorI2VuZGlmCisKKyNkZWZpbmUgTVNCKHgsIGJpdHMpICgoeCkgJiBUWVBFT0YoeCkofjBVTEwgPDwgKHNpemVvZih4KSAqIDggLSAoYml0cykpKSkKKyNkZWZpbmUgSEFTX01VTFRJX0JJVFMoaSkgICgoaSkgJiAoKGkpIC0gMSkpICAvKiBjaGVja3MgaWYgYW4gaW50ZWdlciBoYXMgbW9yZSB0aGFuIDEgYml0IHNldCAqLworCisvKiBBcHByb3hpbWF0aW9uIG9mIHRoZSBsZW5ndGggb2YgdGhlIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB0eXBlLiAqLworI2RlZmluZSBkZWNpbWFsX2xlbmd0aCh4KQkoKGludCkoc2l6ZW9mKHgpICogMi41NiArIDAuNSkgKyAxKQorCisjaWYgIWRlZmluZWQoX19BUFBMRV9fKSAmJiAhZGVmaW5lZChfX0ZyZWVCU0RfXykgICYmICFkZWZpbmVkKF9fVVNMQ19fKSAmJiAhZGVmaW5lZChfTV9VTklYKQorI2RlZmluZSBfWE9QRU5fU09VUkNFIDYwMCAvKiBnbGliYzIgYW5kIEFJWCA1LjNMIG5lZWQgNTAwLCBPcGVuQlNEIG5lZWRzIDYwMCBmb3IgU19JU0xOSygpICovCisjZGVmaW5lIF9YT1BFTl9TT1VSQ0VfRVhURU5ERUQgMSAvKiBBSVggNS4zTCBuZWVkcyB0aGlzICovCisjZW5kaWYKKyNkZWZpbmUgX0FMTF9TT1VSQ0UgMQorI2RlZmluZSBfR05VX1NPVVJDRSAxCisjZGVmaW5lIF9CU0RfU09VUkNFIDEKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8Zm5tYXRjaC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8dXRpbWUuaD4KKyNpZm5kZWYgX19NSU5HVzMyX18KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHN5cy9wb2xsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2lmbmRlZiBOT19TWVNfU0VMRUNUX0gKKyNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+CisjZW5kaWYKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8bmV0aW5ldC90Y3AuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxuZXRkYi5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaWYgZGVmaW5lZChfX0NZR1dJTl9fKQorI3VuZGVmIF9YT1BFTl9TT1VSQ0UKKyNpbmNsdWRlIDxncnAuaD4KKyNkZWZpbmUgX1hPUEVOX1NPVVJDRSA2MDAKKyNpbmNsdWRlICJjb21wYXQvY3lnd2luLmgiCisjZWxzZQorI3VuZGVmIF9BTExfU09VUkNFIC8qIEFJWCA1LjNMIGRlZmluZXMgYSBzdHJ1Y3QgbGlzdCB3aXRoIF9BTExfU09VUkNFLiAqLworI2luY2x1ZGUgPGdycC5oPgorI2RlZmluZSBfQUxMX1NPVVJDRSAxCisjZW5kaWYKKyNlbHNlIAkvKiBfX01JTkdXMzJfXyAqLworLyogcHVsbCBpbiBXaW5kb3dzIGNvbXBhdGliaWxpdHkgc3R1ZmYgKi8KKyNpbmNsdWRlICJjb21wYXQvbWluZ3cuaCIKKyNlbmRpZgkvKiBfX01JTkdXMzJfXyAqLworCisjaWZuZGVmIE5PX0lDT05WCisjaW5jbHVkZSA8aWNvbnYuaD4KKyNlbmRpZgorCisjaWZuZGVmIE5PX09QRU5TU0wKKyNpbmNsdWRlIDxvcGVuc3NsL3NzbC5oPgorI2luY2x1ZGUgPG9wZW5zc2wvZXJyLmg+CisjZW5kaWYKKworLyogT24gbW9zdCBzeXN0ZW1zIDxsaW1pdHMuaD4gd291bGQgaGF2ZSBnaXZlbiB1cyB0aGlzLCBidXQKKyAqIG5vdCBvbiBzb21lIHN5c3RlbXMgKGUuZy4gR05VL0h1cmQpLgorICovCisjaWZuZGVmIFBBVEhfTUFYCisjZGVmaW5lIFBBVEhfTUFYIDQwOTYKKyNlbmRpZgorCisjaWZuZGVmIFBSSXVNQVgKKyNkZWZpbmUgUFJJdU1BWCAibGx1IgorI2VuZGlmCisKKyNpZm5kZWYgUFJJdTMyCisjZGVmaW5lIFBSSXUzMiAidSIKKyNlbmRpZgorCisjaWZuZGVmIFBSSXgzMgorI2RlZmluZSBQUkl4MzIgIngiCisjZW5kaWYKKworI2lmbmRlZiBQQVRIX1NFUAorI2RlZmluZSBQQVRIX1NFUCAnOicKKyNlbmRpZgorCisjaWZuZGVmIFNUUklQX0VYVEVOU0lPTgorI2RlZmluZSBTVFJJUF9FWFRFTlNJT04gIiIKKyNlbmRpZgorCisjaWZuZGVmIGhhc19kb3NfZHJpdmVfcHJlZml4CisjZGVmaW5lIGhhc19kb3NfZHJpdmVfcHJlZml4KHBhdGgpIDAKKyNlbmRpZgorCisjaWZuZGVmIGlzX2Rpcl9zZXAKKyNkZWZpbmUgaXNfZGlyX3NlcChjKSAoKGMpID09ICcvJykKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgTk9SRVRVUk4gX19hdHRyaWJ1dGVfXygoX19ub3JldHVybl9fKSkKKyNlbHNlCisjZGVmaW5lIE5PUkVUVVJOCisjaWZuZGVmIF9fYXR0cmlidXRlX18KKyNkZWZpbmUgX19hdHRyaWJ1dGVfXyh4KQorI2VuZGlmCisjZW5kaWYKKworLyogR2VuZXJhbCBoZWxwZXIgZnVuY3Rpb25zICovCitleHRlcm4gdm9pZCB1c2FnZShjb25zdCBjaGFyICplcnIpIE5PUkVUVVJOOworZXh0ZXJuIHZvaWQgZGllKGNvbnN0IGNoYXIgKmVyciwgLi4uKSBOT1JFVFVSTiBfX2F0dHJpYnV0ZV9fKChmb3JtYXQgKHByaW50ZiwgMSwgMikpKTsKK2V4dGVybiBpbnQgZXJyb3IoY29uc3QgY2hhciAqZXJyLCAuLi4pIF9fYXR0cmlidXRlX18oKGZvcm1hdCAocHJpbnRmLCAxLCAyKSkpOworZXh0ZXJuIHZvaWQgd2FybmluZyhjb25zdCBjaGFyICplcnIsIC4uLikgX19hdHRyaWJ1dGVfXygoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CisKK2V4dGVybiB2b2lkIHNldF9kaWVfcm91dGluZSh2b2lkICgqcm91dGluZSkoY29uc3QgY2hhciAqZXJyLCB2YV9saXN0IHBhcmFtcykgTk9SRVRVUk4pOworCitleHRlcm4gaW50IHByZWZpeGNtcChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCk7CitleHRlcm4gdGltZV90IHRtX3RvX3RpbWVfdChjb25zdCBzdHJ1Y3QgdG0gKnRtKTsKKworc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpza2lwX3ByZWZpeChjb25zdCBjaGFyICpzdHIsIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlzaXplX3QgbGVuID0gc3RybGVuKHByZWZpeCk7CisJcmV0dXJuIHN0cm5jbXAoc3RyLCBwcmVmaXgsIGxlbikgPyBOVUxMIDogc3RyICsgbGVuOworfQorCisjaWYgZGVmaW5lZChOT19NTUFQKSB8fCBkZWZpbmVkKFVTRV9XSU4zMl9NTUFQKQorCisjaWZuZGVmIFBST1RfUkVBRAorI2RlZmluZSBQUk9UX1JFQUQgMQorI2RlZmluZSBQUk9UX1dSSVRFIDIKKyNkZWZpbmUgTUFQX1BSSVZBVEUgMQorI2RlZmluZSBNQVBfRkFJTEVEICgodm9pZCopLTEpCisjZW5kaWYKKworI2RlZmluZSBtbWFwIGdpdF9tbWFwCisjZGVmaW5lIG11bm1hcCBnaXRfbXVubWFwCitleHRlcm4gdm9pZCAqZ2l0X21tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsIGludCBwcm90LCBpbnQgZmxhZ3MsIGludCBmZCwgb2ZmX3Qgb2Zmc2V0KTsKK2V4dGVybiBpbnQgZ2l0X211bm1hcCh2b2lkICpzdGFydCwgc2l6ZV90IGxlbmd0aCk7CisKKyNlbHNlIC8qIE5PX01NQVAgfHwgVVNFX1dJTjMyX01NQVAgKi8KKworI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisKKyNlbmRpZiAvKiBOT19NTUFQIHx8IFVTRV9XSU4zMl9NTUFQICovCisKKyNpZmRlZiBOT19NTUFQCisKKy8qIFRoaXMgdmFsdWUgbXVzdCBiZSBtdWx0aXBsZSBvZiAocGFnZXNpemUgKiAyKSAqLworI2RlZmluZSBERUZBVUxUX1BBQ0tFRF9HSVRfV0lORE9XX1NJWkUgKDEgKiAxMDI0ICogMTAyNCkKKworI2Vsc2UgLyogTk9fTU1BUCAqLworCisvKiBUaGlzIHZhbHVlIG11c3QgYmUgbXVsdGlwbGUgb2YgKHBhZ2VzaXplICogMikgKi8KKyNkZWZpbmUgREVGQVVMVF9QQUNLRURfR0lUX1dJTkRPV19TSVpFIFwKKwkoc2l6ZW9mKHZvaWQqKSA+PSA4IFwKKwkJPyAgMSAqIDEwMjQgKiAxMDI0ICogMTAyNCBcCisJCTogMzIgKiAxMDI0ICogMTAyNCkKKworI2VuZGlmIC8qIE5PX01NQVAgKi8KKworI2lmZGVmIE5PX1NUX0JMT0NLU19JTl9TVFJVQ1RfU1RBVAorI2RlZmluZSBvbl9kaXNrX2J5dGVzKHN0KSAoKHN0KS5zdF9zaXplKQorI2Vsc2UKKyNkZWZpbmUgb25fZGlza19ieXRlcyhzdCkgKChzdCkuc3RfYmxvY2tzICogNTEyKQorI2VuZGlmCisKKyNkZWZpbmUgREVGQVVMVF9QQUNLRURfR0lUX0xJTUlUIFwKKwkoKDEwMjRMICogMTAyNEwpICogKHNpemVvZih2b2lkKikgPj0gOCA/IDgxOTIgOiAyNTYpKQorCisjaWZkZWYgTk9fUFJFQUQKKyNkZWZpbmUgcHJlYWQgZ2l0X3ByZWFkCitleHRlcm4gc3NpemVfdCBnaXRfcHJlYWQoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCwgb2ZmX3Qgb2Zmc2V0KTsKKyNlbmRpZgorLyoKKyAqIEZvcndhcmQgZGVjbCB0aGF0IHdpbGwgcmVtaW5kIHVzIGlmIGl0cyB0d2luIGluIGNhY2hlLmggY2hhbmdlcy4KKyAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBjb21wYXQvcHJlYWQuYy4gIEJ1dCB3ZSBjYW4ndCBpbmNsdWRlCisgKiBjYWNoZS5oIHRoZXJlLgorICovCitleHRlcm4gc3NpemVfdCByZWFkX2luX2Z1bGwoaW50IGZkLCB2b2lkICpidWYsIHNpemVfdCBjb3VudCk7CisKKyNpZmRlZiBOT19TRVRFTlYKKyNkZWZpbmUgc2V0ZW52IGdpdHNldGVudgorZXh0ZXJuIGludCBnaXRzZXRlbnYoY29uc3QgY2hhciAqLCBjb25zdCBjaGFyICosIGludCk7CisjZW5kaWYKKworI2lmZGVmIE5PX01LRFRFTVAKKyNkZWZpbmUgbWtkdGVtcCBnaXRta2R0ZW1wCitleHRlcm4gY2hhciAqZ2l0bWtkdGVtcChjaGFyICopOworI2VuZGlmCisKKyNpZmRlZiBOT19VTlNFVEVOVgorI2RlZmluZSB1bnNldGVudiBnaXR1bnNldGVudgorZXh0ZXJuIHZvaWQgZ2l0dW5zZXRlbnYoY29uc3QgY2hhciAqKTsKKyNlbmRpZgorCisjaWZkZWYgTk9fU1RSQ0FTRVNUUgorI2RlZmluZSBzdHJjYXNlc3RyIGdpdHN0cmNhc2VzdHIKK2V4dGVybiBjaGFyICpnaXRzdHJjYXNlc3RyKGNvbnN0IGNoYXIgKmhheXN0YWNrLCBjb25zdCBjaGFyICpuZWVkbGUpOworI2VuZGlmCisKKyNpZmRlZiBOT19TVFJMQ1BZCisjZGVmaW5lIHN0cmxjcHkgZ2l0c3RybGNweQorZXh0ZXJuIHNpemVfdCBnaXRzdHJsY3B5KGNoYXIgKiwgY29uc3QgY2hhciAqLCBzaXplX3QpOworI2VuZGlmCisKKyNpZmRlZiBOT19TVFJUT1VNQVgKKyNkZWZpbmUgc3RydG91bWF4IGdpdHN0cnRvdW1heAorZXh0ZXJuIHVpbnRtYXhfdCBnaXRzdHJ0b3VtYXgoY29uc3QgY2hhciAqLCBjaGFyICoqLCBpbnQpOworI2VuZGlmCisKKyNpZmRlZiBOT19IU1RSRVJST1IKKyNkZWZpbmUgaHN0cmVycm9yIGdpdGhzdHJlcnJvcgorZXh0ZXJuIGNvbnN0IGNoYXIgKmdpdGhzdHJlcnJvcihpbnQgaGVycm9yKTsKKyNlbmRpZgorCisjaWZkZWYgTk9fTUVNTUVNCisjZGVmaW5lIG1lbW1lbSBnaXRtZW1tZW0KK3ZvaWQgKmdpdG1lbW1lbShjb25zdCB2b2lkICpoYXlzdGFjaywgc2l6ZV90IGhheXN0YWNrbGVuLAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm5lZWRsZSwgc2l6ZV90IG5lZWRsZWxlbik7CisjZW5kaWYKKworI2lmZGVmIEZSRUFEX1JFQURTX0RJUkVDVE9SSUVTCisjaWZkZWYgZm9wZW4KKyN1bmRlZiBmb3BlbgorI2VuZGlmCisjZGVmaW5lIGZvcGVuKGEsYikgZ2l0X2ZvcGVuKGEsYikKK2V4dGVybiBGSUxFICpnaXRfZm9wZW4oY29uc3QgY2hhciosIGNvbnN0IGNoYXIqKTsKKyNlbmRpZgorCisjaWZkZWYgU05QUklOVEZfUkVUVVJOU19CT0dVUworI2RlZmluZSBzbnByaW50ZiBnaXRfc25wcmludGYKK2V4dGVybiBpbnQgZ2l0X3NucHJpbnRmKGNoYXIgKnN0ciwgc2l6ZV90IG1heHNpemUsCisJCQljb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CisjZGVmaW5lIHZzbnByaW50ZiBnaXRfdnNucHJpbnRmCitleHRlcm4gaW50IGdpdF92c25wcmludGYoY2hhciAqc3RyLCBzaXplX3QgbWF4c2l6ZSwKKwkJCSBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworI2VuZGlmCisKKyNpZmRlZiBfX0dMSUJDX1BSRVJFUQorI2lmIF9fR0xJQkNfUFJFUkVRKDIsIDEpCisjZGVmaW5lIEhBVkVfU1RSQ0hSTlVMCisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIEhBVkVfU1RSQ0hSTlVMCisjZGVmaW5lIHN0cmNocm51bCBnaXRzdHJjaHJudWwKK3N0YXRpYyBpbmxpbmUgY2hhciAqZ2l0c3RyY2hybnVsKGNvbnN0IGNoYXIgKnMsIGludCBjKQoreworCXdoaWxlICgqcyAmJiAqcyAhPSBjKQorCQlzKys7CisJcmV0dXJuIChjaGFyICopczsKK30KKyNlbmRpZgorCisvKgorICogV3JhcHBlcnM6CisgKi8KK2V4dGVybiBjaGFyICp4c3RyZHVwKGNvbnN0IGNoYXIgKnN0cik7CitleHRlcm4gdm9pZCAqeG1hbGxvYyhzaXplX3Qgc2l6ZSk7CitleHRlcm4gdm9pZCAqeG1lbWR1cHooY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbik7CitleHRlcm4gY2hhciAqeHN0cm5kdXAoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKTsKK2V4dGVybiB2b2lkICp4cmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICp4Y2FsbG9jKHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUpOworZXh0ZXJuIHZvaWQgKnhtbWFwKHZvaWQgKnN0YXJ0LCBzaXplX3QgbGVuZ3RoLCBpbnQgcHJvdCwgaW50IGZsYWdzLCBpbnQgZmQsIG9mZl90IG9mZnNldCk7CitleHRlcm4gc3NpemVfdCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbik7CitleHRlcm4gc3NpemVfdCB4d3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pOworZXh0ZXJuIGludCB4ZHVwKGludCBmZCk7CitleHRlcm4gRklMRSAqeGZkb3BlbihpbnQgZmQsIGNvbnN0IGNoYXIgKm1vZGUpOworZXh0ZXJuIGludCB4bWtzdGVtcChjaGFyICp0ZW1wbGF0ZSk7CisKK3N0YXRpYyBpbmxpbmUgc2l6ZV90IHhzaXplX3Qob2ZmX3QgbGVuKQoreworCXJldHVybiAoc2l6ZV90KWxlbjsKK30KKworc3RhdGljIGlubGluZSBpbnQgaGFzX2V4dGVuc2lvbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqZXh0KQoreworCXNpemVfdCBsZW4gPSBzdHJsZW4oZmlsZW5hbWUpOworCXNpemVfdCBleHRsZW4gPSBzdHJsZW4oZXh0KTsKKwlyZXR1cm4gbGVuID4gZXh0bGVuICYmICFtZW1jbXAoZmlsZW5hbWUgKyBsZW4gLSBleHRsZW4sIGV4dCwgZXh0bGVuKTsKK30KKworLyogU2FuZSBjdHlwZSAtIG5vIGxvY2FsZSwgYW5kIHdvcmtzIHdpdGggc2lnbmVkIGNoYXJzICovCisjdW5kZWYgaXNhc2NpaQorI3VuZGVmIGlzc3BhY2UKKyN1bmRlZiBpc2RpZ2l0CisjdW5kZWYgaXNhbHBoYQorI3VuZGVmIGlzYWxudW0KKyN1bmRlZiB0b2xvd2VyCisjdW5kZWYgdG91cHBlcgorZXh0ZXJuIHVuc2lnbmVkIGNoYXIgc2FuZV9jdHlwZVsyNTZdOworI2RlZmluZSBHSVRfU1BBQ0UgMHgwMQorI2RlZmluZSBHSVRfRElHSVQgMHgwMgorI2RlZmluZSBHSVRfQUxQSEEgMHgwNAorI2RlZmluZSBHSVRfR0xPQl9TUEVDSUFMIDB4MDgKKyNkZWZpbmUgR0lUX1JFR0VYX1NQRUNJQUwgMHgxMAorI2RlZmluZSBzYW5lX2lzdGVzdCh4LG1hc2spICgoc2FuZV9jdHlwZVsodW5zaWduZWQgY2hhcikoeCldICYgKG1hc2spKSAhPSAwKQorI2RlZmluZSBpc2FzY2lpKHgpICgoKHgpICYgfjB4N2YpID09IDApCisjZGVmaW5lIGlzc3BhY2UoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfU1BBQ0UpCisjZGVmaW5lIGlzZGlnaXQoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfRElHSVQpCisjZGVmaW5lIGlzYWxwaGEoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfQUxQSEEpCisjZGVmaW5lIGlzYWxudW0oeCkgc2FuZV9pc3Rlc3QoeCxHSVRfQUxQSEEgfCBHSVRfRElHSVQpCisjZGVmaW5lIGlzX2dsb2Jfc3BlY2lhbCh4KSBzYW5lX2lzdGVzdCh4LEdJVF9HTE9CX1NQRUNJQUwpCisjZGVmaW5lIGlzX3JlZ2V4X3NwZWNpYWwoeCkgc2FuZV9pc3Rlc3QoeCxHSVRfR0xPQl9TUEVDSUFMIHwgR0lUX1JFR0VYX1NQRUNJQUwpCisjZGVmaW5lIHRvbG93ZXIoeCkgc2FuZV9jYXNlKCh1bnNpZ25lZCBjaGFyKSh4KSwgMHgyMCkKKyNkZWZpbmUgdG91cHBlcih4KSBzYW5lX2Nhc2UoKHVuc2lnbmVkIGNoYXIpKHgpLCAwKQorCitzdGF0aWMgaW5saW5lIGludCBzYW5lX2Nhc2UoaW50IHgsIGludCBoaWdoKQoreworCWlmIChzYW5lX2lzdGVzdCh4LCBHSVRfQUxQSEEpKQorCQl4ID0gKHggJiB+MHgyMCkgfCBoaWdoOworCXJldHVybiB4OworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJ0b3VsX3VpKGNoYXIgY29uc3QgKnMsIGludCBiYXNlLCB1bnNpZ25lZCBpbnQgKnJlc3VsdCkKK3sKKwl1bnNpZ25lZCBsb25nIHVsOworCWNoYXIgKnA7CisKKwllcnJubyA9IDA7CisJdWwgPSBzdHJ0b3VsKHMsICZwLCBiYXNlKTsKKwlpZiAoZXJybm8gfHwgKnAgfHwgcCA9PSBzIHx8ICh1bnNpZ25lZCBpbnQpIHVsICE9IHVsKQorCQlyZXR1cm4gLTE7CisJKnJlc3VsdCA9IHVsOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW5saW5lIGludCBzdHJ0b2xfaShjaGFyIGNvbnN0ICpzLCBpbnQgYmFzZSwgaW50ICpyZXN1bHQpCit7CisJbG9uZyB1bDsKKwljaGFyICpwOworCisJZXJybm8gPSAwOworCXVsID0gc3RydG9sKHMsICZwLCBiYXNlKTsKKwlpZiAoZXJybm8gfHwgKnAgfHwgcCA9PSBzIHx8IChpbnQpIHVsICE9IHVsKQorCQlyZXR1cm4gLTE7CisJKnJlc3VsdCA9IHVsOworCXJldHVybiAwOworfQorCisjaWZkZWYgSU5URVJOQUxfUVNPUlQKK3ZvaWQgZ2l0X3Fzb3J0KHZvaWQgKmJhc2UsIHNpemVfdCBubWVtYiwgc2l6ZV90IHNpemUsCisJICAgICAgIGludCgqY29tcGFyKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKikpOworI2RlZmluZSBxc29ydCBnaXRfcXNvcnQKKyNlbmRpZgorCisjaWZuZGVmIERJUl9IQVNfQlNEX0dST1VQX1NFTUFOVElDUworIyBkZWZpbmUgRk9SQ0VfRElSX1NFVF9HSUQgU19JU0dJRAorI2Vsc2UKKyMgZGVmaW5lIEZPUkNFX0RJUl9TRVRfR0lEIDAKKyNlbmRpZgorCisjaWZkZWYgTk9fTlNFQworI3VuZGVmIFVTRV9OU0VDCisjZGVmaW5lIFNUX0NUSU1FX05TRUMoc3QpIDAKKyNkZWZpbmUgU1RfTVRJTUVfTlNFQyhzdCkgMAorI2Vsc2UKKyNpZmRlZiBVU0VfU1RfVElNRVNQRUMKKyNkZWZpbmUgU1RfQ1RJTUVfTlNFQyhzdCkgKCh1bnNpZ25lZCBpbnQpKChzdCkuc3RfY3RpbWVzcGVjLnR2X25zZWMpKQorI2RlZmluZSBTVF9NVElNRV9OU0VDKHN0KSAoKHVuc2lnbmVkIGludCkoKHN0KS5zdF9tdGltZXNwZWMudHZfbnNlYykpCisjZWxzZQorI2RlZmluZSBTVF9DVElNRV9OU0VDKHN0KSAoKHVuc2lnbmVkIGludCkoKHN0KS5zdF9jdGltLnR2X25zZWMpKQorI2RlZmluZSBTVF9NVElNRV9OU0VDKHN0KSAoKHVuc2lnbmVkIGludCkoKHN0KS5zdF9tdGltLnR2X25zZWMpKQorI2VuZGlmCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS90b29scy9wZXJmL3V0aWwvd3JhcHBlci5jIGIvdG9vbHMvcGVyZi91dGlsL3dyYXBwZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzUwZDY1Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcGVyZi91dGlsL3dyYXBwZXIuYwpAQCAtMCwwICsxLDIwNiBAQAorLyoKKyAqIFZhcmlvdXMgdHJpdmlhbCBoZWxwZXIgd3JhcHBlcnMgYXJvdW5kIHN0YW5kYXJkIGZ1bmN0aW9ucworICovCisjaW5jbHVkZSAiY2FjaGUuaCIKKworLyoKKyAqIFRoZXJlJ3Mgbm8gcGFjayBtZW1vcnkgdG8gcmVsZWFzZSAtIGJ1dCBzdGF5IGNsb3NlIHRvIHRoZSBHaXQKKyAqIHZlcnNpb24gc28gd3JhcCB0aGlzIGF3YXk6CisgKi8KK3N0YXRpYyBpbmxpbmUgdm9pZCByZWxlYXNlX3BhY2tfbWVtb3J5KHNpemVfdCBzaXplLCBpbnQgZmxhZykKK3sKK30KKworY2hhciAqeHN0cmR1cChjb25zdCBjaGFyICpzdHIpCit7CisJY2hhciAqcmV0ID0gc3RyZHVwKHN0cik7CisJaWYgKCFyZXQpIHsKKwkJcmVsZWFzZV9wYWNrX21lbW9yeShzdHJsZW4oc3RyKSArIDEsIC0xKTsKKwkJcmV0ID0gc3RyZHVwKHN0cik7CisJCWlmICghcmV0KQorCQkJZGllKCJPdXQgb2YgbWVtb3J5LCBzdHJkdXAgZmFpbGVkIik7CisJfQorCXJldHVybiByZXQ7Cit9CisKK3ZvaWQgKnhtYWxsb2Moc2l6ZV90IHNpemUpCit7CisJdm9pZCAqcmV0ID0gbWFsbG9jKHNpemUpOworCWlmICghcmV0ICYmICFzaXplKQorCQlyZXQgPSBtYWxsb2MoMSk7CisJaWYgKCFyZXQpIHsKKwkJcmVsZWFzZV9wYWNrX21lbW9yeShzaXplLCAtMSk7CisJCXJldCA9IG1hbGxvYyhzaXplKTsKKwkJaWYgKCFyZXQgJiYgIXNpemUpCisJCQlyZXQgPSBtYWxsb2MoMSk7CisJCWlmICghcmV0KQorCQkJZGllKCJPdXQgb2YgbWVtb3J5LCBtYWxsb2MgZmFpbGVkIik7CisJfQorI2lmZGVmIFhNQUxMT0NfUE9JU09OCisJbWVtc2V0KHJldCwgMHhBNSwgc2l6ZSk7CisjZW5kaWYKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogeG1lbWR1cHooKSBhbGxvY2F0ZXMgKGxlbiArIDEpIGJ5dGVzIG9mIG1lbW9yeSwgZHVwbGljYXRlcyAibGVuIiBieXRlcyBvZgorICogImRhdGEiIHRvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCB6ZXJvIHRlcm1pbmF0ZXMgdGhlIGFsbG9jYXRlZCBtZW1vcnksCisgKiBhbmQgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGFsbG9jYXRlZCBtZW1vcnkuIElmIHRoZSBhbGxvY2F0aW9uIGZhaWxzLAorICogdGhlIHByb2dyYW0gZGllcy4KKyAqLwordm9pZCAqeG1lbWR1cHooY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikKK3sKKwljaGFyICpwID0geG1hbGxvYyhsZW4gKyAxKTsKKwltZW1jcHkocCwgZGF0YSwgbGVuKTsKKwlwW2xlbl0gPSAnXDAnOworCXJldHVybiBwOworfQorCitjaGFyICp4c3RybmR1cChjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4pCit7CisJY2hhciAqcCA9IG1lbWNocihzdHIsICdcMCcsIGxlbik7CisJcmV0dXJuIHhtZW1kdXB6KHN0ciwgcCA/IHAgLSBzdHIgOiBsZW4pOworfQorCit2b2lkICp4cmVhbGxvYyh2b2lkICpwdHIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldCA9IHJlYWxsb2MocHRyLCBzaXplKTsKKwlpZiAoIXJldCAmJiAhc2l6ZSkKKwkJcmV0ID0gcmVhbGxvYyhwdHIsIDEpOworCWlmICghcmV0KSB7CisJCXJlbGVhc2VfcGFja19tZW1vcnkoc2l6ZSwgLTEpOworCQlyZXQgPSByZWFsbG9jKHB0ciwgc2l6ZSk7CisJCWlmICghcmV0ICYmICFzaXplKQorCQkJcmV0ID0gcmVhbGxvYyhwdHIsIDEpOworCQlpZiAoIXJldCkKKwkJCWRpZSgiT3V0IG9mIG1lbW9yeSwgcmVhbGxvYyBmYWlsZWQiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCAqeGNhbGxvYyhzaXplX3Qgbm1lbWIsIHNpemVfdCBzaXplKQoreworCXZvaWQgKnJldCA9IGNhbGxvYyhubWVtYiwgc2l6ZSk7CisJaWYgKCFyZXQgJiYgKCFubWVtYiB8fCAhc2l6ZSkpCisJCXJldCA9IGNhbGxvYygxLCAxKTsKKwlpZiAoIXJldCkgeworCQlyZWxlYXNlX3BhY2tfbWVtb3J5KG5tZW1iICogc2l6ZSwgLTEpOworCQlyZXQgPSBjYWxsb2Mobm1lbWIsIHNpemUpOworCQlpZiAoIXJldCAmJiAoIW5tZW1iIHx8ICFzaXplKSkKKwkJCXJldCA9IGNhbGxvYygxLCAxKTsKKwkJaWYgKCFyZXQpCisJCQlkaWUoIk91dCBvZiBtZW1vcnksIGNhbGxvYyBmYWlsZWQiKTsKKwl9CisJcmV0dXJuIHJldDsKK30KKwordm9pZCAqeG1tYXAodm9pZCAqc3RhcnQsIHNpemVfdCBsZW5ndGgsCisJaW50IHByb3QsIGludCBmbGFncywgaW50IGZkLCBvZmZfdCBvZmZzZXQpCit7CisJdm9pZCAqcmV0ID0gbW1hcChzdGFydCwgbGVuZ3RoLCBwcm90LCBmbGFncywgZmQsIG9mZnNldCk7CisJaWYgKHJldCA9PSBNQVBfRkFJTEVEKSB7CisJCWlmICghbGVuZ3RoKQorCQkJcmV0dXJuIE5VTEw7CisJCXJlbGVhc2VfcGFja19tZW1vcnkobGVuZ3RoLCBmZCk7CisJCXJldCA9IG1tYXAoc3RhcnQsIGxlbmd0aCwgcHJvdCwgZmxhZ3MsIGZkLCBvZmZzZXQpOworCQlpZiAocmV0ID09IE1BUF9GQUlMRUQpCisJCQlkaWUoIk91dCBvZiBtZW1vcnk/IG1tYXAgZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJfQorCXJldHVybiByZXQ7Cit9CisKKy8qCisgKiB4cmVhZCgpIGlzIHRoZSBzYW1lIGEgcmVhZCgpLCBidXQgaXQgYXV0b21hdGljYWxseSByZXN0YXJ0cyByZWFkKCkKKyAqIG9wZXJhdGlvbnMgd2l0aCBhIHJlY292ZXJhYmxlIGVycm9yIChFQUdBSU4gYW5kIEVJTlRSKS4geHJlYWQoKQorICogRE9FUyBOT1QgR1VBUkFOVEVFIHRoYXQgImxlbiIgYnl0ZXMgaXMgcmVhZCBldmVuIGlmIHRoZSBkYXRhIGlzIGF2YWlsYWJsZS4KKyAqLworc3NpemVfdCB4cmVhZChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGxlbikKK3sKKwlzc2l6ZV90IG5yOworCXdoaWxlICgxKSB7CisJCW5yID0gcmVhZChmZCwgYnVmLCBsZW4pOworCQlpZiAoKG5yIDwgMCkgJiYgKGVycm5vID09IEVBR0FJTiB8fCBlcnJubyA9PSBFSU5UUikpCisJCQljb250aW51ZTsKKwkJcmV0dXJuIG5yOworCX0KK30KKworLyoKKyAqIHh3cml0ZSgpIGlzIHRoZSBzYW1lIGEgd3JpdGUoKSwgYnV0IGl0IGF1dG9tYXRpY2FsbHkgcmVzdGFydHMgd3JpdGUoKQorICogb3BlcmF0aW9ucyB3aXRoIGEgcmVjb3ZlcmFibGUgZXJyb3IgKEVBR0FJTiBhbmQgRUlOVFIpLiB4d3JpdGUoKSBET0VTIE5PVAorICogR1VBUkFOVEVFIHRoYXQgImxlbiIgYnl0ZXMgaXMgd3JpdHRlbiBldmVuIGlmIHRoZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bC4KKyAqLworc3NpemVfdCB4d3JpdGUoaW50IGZkLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBsZW4pCit7CisJc3NpemVfdCBucjsKKwl3aGlsZSAoMSkgeworCQluciA9IHdyaXRlKGZkLCBidWYsIGxlbik7CisJCWlmICgobnIgPCAwKSAmJiAoZXJybm8gPT0gRUFHQUlOIHx8IGVycm5vID09IEVJTlRSKSkKKwkJCWNvbnRpbnVlOworCQlyZXR1cm4gbnI7CisJfQorfQorCitzc2l6ZV90IHJlYWRfaW5fZnVsbChpbnQgZmQsIHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNoYXIgKnAgPSBidWY7CisJc3NpemVfdCB0b3RhbCA9IDA7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNzaXplX3QgbG9hZGVkID0geHJlYWQoZmQsIHAsIGNvdW50KTsKKwkJaWYgKGxvYWRlZCA8PSAwKQorCQkJcmV0dXJuIHRvdGFsID8gdG90YWwgOiBsb2FkZWQ7CisJCWNvdW50IC09IGxvYWRlZDsKKwkJcCArPSBsb2FkZWQ7CisJCXRvdGFsICs9IGxvYWRlZDsKKwl9CisKKwlyZXR1cm4gdG90YWw7Cit9CisKK3NzaXplX3Qgd3JpdGVfaW5fZnVsbChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KQoreworCWNvbnN0IGNoYXIgKnAgPSBidWY7CisJc3NpemVfdCB0b3RhbCA9IDA7CisKKwl3aGlsZSAoY291bnQgPiAwKSB7CisJCXNzaXplX3Qgd3JpdHRlbiA9IHh3cml0ZShmZCwgcCwgY291bnQpOworCQlpZiAod3JpdHRlbiA8IDApCisJCQlyZXR1cm4gLTE7CisJCWlmICghd3JpdHRlbikgeworCQkJZXJybm8gPSBFTk9TUEM7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJY291bnQgLT0gd3JpdHRlbjsKKwkJcCArPSB3cml0dGVuOworCQl0b3RhbCArPSB3cml0dGVuOworCX0KKworCXJldHVybiB0b3RhbDsKK30KKworaW50IHhkdXAoaW50IGZkKQoreworCWludCByZXQgPSBkdXAoZmQpOworCWlmIChyZXQgPCAwKQorCQlkaWUoImR1cCBmYWlsZWQ6ICVzIiwgc3RyZXJyb3IoZXJybm8pKTsKKwlyZXR1cm4gcmV0OworfQorCitGSUxFICp4ZmRvcGVuKGludCBmZCwgY29uc3QgY2hhciAqbW9kZSkKK3sKKwlGSUxFICpzdHJlYW0gPSBmZG9wZW4oZmQsIG1vZGUpOworCWlmIChzdHJlYW0gPT0gTlVMTCkKKwkJZGllKCJPdXQgb2YgbWVtb3J5PyBmZG9wZW4gZmFpbGVkOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIHN0cmVhbTsKK30KKworaW50IHhta3N0ZW1wKGNoYXIgKnRlbXBsYXRlKQoreworCWludCBmZDsKKworCWZkID0gbWtzdGVtcCh0ZW1wbGF0ZSk7CisJaWYgKGZkIDwgMCkKKwkJZGllKCJVbmFibGUgdG8gY3JlYXRlIHRlbXBvcmFyeSBmaWxlOiAlcyIsIHN0cmVycm9yKGVycm5vKSk7CisJcmV0dXJuIGZkOworfQo=